{"id":"3e12ce95-7c08-49da-92ce-e184dc0f4167","entityType":"agent","slug":"clawhub-piccolo123-url-manager","name":"url-manager","canonicalUrl":"https://www.xpersona.co/agent/clawhub-piccolo123-url-manager","canonicalPath":"/agent/clawhub-piccolo123-url-manager","generatedAt":"2026-10-10T10:43:45.505Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":null},"description":"Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users. Skill: url-manager Owner: piccolo123 Summary: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users. Tags: lat","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17baj5qv3v7x0hz8y2mqvjh3x83kndt:url-manager","sourceUrl":"https://clawhub.ai/piccolo123/url-manager","homepage":"https://clawhub.ai/piccolo123/skills/url-manager","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/piccolo123/url-manager","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/piccolo123/skills/url-manager","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organ"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":null},"stars":null,"forks":null,"downloads":1694,"packageName":null,"latestVersion":"2.6.4","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:18:15.416Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T04:18:15.640Z","lastCrawledAt":"2026-10-10T04:18:15.416Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T04:18:15.416Z","lastVerifiedAt":null,"highlights":[{"version":"2.6.4","createdAt":"2026-07-28T09:14:16.905Z","changelog":"- Updated version to 2.6.4 - Documentation improvements in SKILL.md for clarity and up-to-date metadata - Removed redundant skill-card.md file","fileCount":4,"zipByteSize":15143},{"version":"2.6.3","createdAt":"2026-07-28T07:50:51.026Z","changelog":"url-manager 2.6.3 - Added the category_set_name field to category entities for clearer category set identification. - Updated documentation (SKILL.md) to reflect new category field and provide more detailed explanations. - Removed obsolete skill-card.md file.","fileCount":4,"zipByteSize":14812},{"version":"2.6.2","createdAt":"2026-07-25T05:41:24.516Z","changelog":"- Bumped version to 2.6.2 in SKILL.md. - No functional or documentation changes beyond version metadata update.","fileCount":4,"zipByteSize":14289},{"version":"2.6.1","createdAt":"2026-07-25T05:36:40.549Z","changelog":"- Updated SKILL.md documentation to version 2.6.1 - Clarified privacy instructions, especially regarding user notification before first use - Incremented metadata version to 2.6.1 for consistency","fileCount":4,"zipByteSize":14542},{"version":"2.6.0","createdAt":"2026-07-25T05:35:56.267Z","changelog":"Version 2.6.0 - Added clear privacy and terms section describing account creation, data handling, and user rights. - Instructs to inform users about data storage and provides direct links to the service’s User Agreement and Privacy Policy. - No functional or API changes; documentation update only. - Version bump in metadata to 2.6.0.","fileCount":4,"zipByteSize":14392},{"version":"2.5.5","createdAt":"2026-07-25T05:24:09.238Z","changelog":"- Removed non-English and redundant documentation files (SKILL.zh-CN.md, skill-card.md) for a cleaner package. - Updated SKILL.md to version 2.5.5 and clarified the `content_type` field in the footprint table: now described as free text with reference to `content-types` for available values.","fileCount":4,"zipByteSize":14165},{"version":"2.5.4","createdAt":"2026-07-24T16:53:13.228Z","changelog":"- Added Chinese documentation: SKILL.zh-CN.md is now included. - Updated SKILL.md with improved feature descriptions and clarified usage. - Removed outdated documentation file: skill-card.md. - Version updated to 2.5.4.","fileCount":5,"zipByteSize":21312},{"version":"2.5.3","createdAt":"2026-07-24T16:03:58.963Z","changelog":"url-manager 2.5.3 - Updated documentation in SKILL.md to provide clearer explanations of core concepts (footprints, categories, category sets, personal vs shared categories). - Added detailed field tables and system concepts for better user understanding. - Removed the skill-card.md file. - Updated version metadata to 2.5.3 and reflected recent command options and organized workflows.","fileCount":4,"zipByteSize":13988}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17baj5qv3v7x0hz8y2mqvjh3x83kndt:url-manager","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:43:45.499Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-piccolo123-url-manager/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":null},"readme":"Skill: url-manager\n\nOwner: piccolo123\n\nSummary: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\n\nTags: latest:2.6.4\n\nVersion history:\n\nv2.6.4 | 2026-07-28T09:14:16.905Z | auto\n\n- Updated version to 2.6.4\n- Documentation improvements in SKILL.md for clarity and up-to-date metadata\n- Removed redundant skill-card.md file\n\nv2.6.3 | 2026-07-28T07:50:51.026Z | auto\n\nurl-manager 2.6.3\n\n- Added the category_set_name field to category entities for clearer category set identification.\n- Updated documentation (SKILL.md) to reflect new category field and provide more detailed explanations.\n- Removed obsolete skill-card.md file.\n\nv2.6.2 | 2026-07-25T05:41:24.516Z | auto\n\n- Bumped version to 2.6.2 in SKILL.md.\n- No functional or documentation changes beyond version metadata update.\n\nv2.6.1 | 2026-07-25T05:36:40.549Z | auto\n\n- Updated SKILL.md documentation to version 2.6.1\n- Clarified privacy instructions, especially regarding user notification before first use\n- Incremented metadata version to 2.6.1 for consistency\n\nv2.6.0 | 2026-07-25T05:35:56.267Z | auto\n\nVersion 2.6.0\n\n- Added clear privacy and terms section describing account creation, data handling, and user rights.\n- Instructs to inform users about data storage and provides direct links to the service’s User Agreement and Privacy Policy.\n- No functional or API changes; documentation update only.\n- Version bump in metadata to 2.6.0.\n\nv2.5.5 | 2026-07-25T05:24:09.238Z | auto\n\n- Removed non-English and redundant documentation files (SKILL.zh-CN.md, skill-card.md) for a cleaner package.\n- Updated SKILL.md to version 2.5.5 and clarified the `content_type` field in the footprint table: now described as free text with reference to `content-types` for available values.\n\nv2.5.4 | 2026-07-24T16:53:13.228Z | auto\n\n- Added Chinese documentation: SKILL.zh-CN.md is now included.\n- Updated SKILL.md with improved feature descriptions and clarified usage.\n- Removed outdated documentation file: skill-card.md.\n- Version updated to 2.5.4.\n\nv2.5.3 | 2026-07-24T16:03:58.963Z | auto\n\nurl-manager 2.5.3\n\n- Updated documentation in SKILL.md to provide clearer explanations of core concepts (footprints, categories, category sets, personal vs shared categories).\n- Added detailed field tables and system concepts for better user understanding.\n- Removed the skill-card.md file.\n- Updated version metadata to 2.5.3 and reflected recent command options and organized workflows.\n\nv2.5.2 | 2026-07-24T05:59:21.256Z | auto\n\nurl-manager 2.5.2\n\n- Removed the redundant skill-card.md file.\n- Made updates to the scripts/footprints.py script.\n- No changes to SKILL.md functionality or documentation content.\n\nv2.5.1 | 2026-07-24T02:34:29.081Z | auto\n\n- Documentation updated: merged and clarified skill documentation in SKILL.md.\n- The README.md, SKILL.zh-CN.md, and skill-card.md files were removed; all essential information is now in SKILL.md.\n- Usage table and command examples refined for accuracy and completeness.\n- Added explicit warning to the \"Re-authenticate\" command in Quick Reference about data loss.\n- YAML metadata for compatibility and requirements in SKILL.md has improved formatting.\n\nv2.5.0 | 2026-07-23T17:55:35.756Z | auto\n\n## url-manager 2.5.0\n\n- Added a README.md file for general user documentation.\n- Introduced a Chinese language manual (SKILL.zh-CN.md).\n- Updated SKILL.md:\n  - Version bumped to 2.5.0.\n  - Added metadata field for contact information.\n- No core functionality changes, but documentation and internationalization support improved.\n\nv2.4.1 | 2026-07-23T17:38:33.910Z | auto\n\nurl-manager 2.4.1\n\n- Removed the file skill-card.md.\n- Made changes to scripts/footprints.py.\n- No user-facing documentation changes detected.\n\nv2.4.0 | 2026-07-23T17:10:07.353Z | auto\n\nurl-manager 2.4.0\n\n- Changed all references in documentation and commands from python3 to python for broader compatibility.\n- Updated requirements to use python instead of python3 in SKILL.md metadata and examples.\n\nv2.3.4 | 2026-07-23T17:04:42.237Z | auto\n\nNo file changes detected for version 2.3.4. There are no updates in this release.\n\nv2.3.3 | 2026-07-23T17:04:20.717Z | auto\n\n- No code or documentation changes detected in this release.\n- Version number has been updated to 2.3.3.\n- All previous features, commands, and workflows remain unchanged.\n- Safe to upgrade; there is no impact on usage or compatibility.\n\nv2.3.2 | 2026-07-23T17:03:37.456Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation beyond file removal.\n\nv2.3.1 | 2026-07-23T16:52:16.019Z | auto\n\nNo file or documentation changes detected in this release.\n\n- Version bump to 2.3.1.\n- No other changes present.\n\nv2.3.0 | 2026-07-23T15:28:41.462Z | auto\n\n- Removed README.md, SKILL.zh-CN.md, and skill-card.md files.\n- Documentation is now maintained solely in SKILL.md.\n- No other functional or command changes in this version.\n\nv2.2.8 | 2026-07-23T10:28:28.943Z | auto\n\n- Removed the deprecated file `skill-card.md`.\n- Fixed a documentation typo: the `remove-from-shared` command now consistently uses `--collection-id <id>` instead of a positional argument.\n- Synced documentation updates across English and Chinese documentation files for clarity.\n- No changes to core logic or features.\n\nv2.2.7 | 2026-07-23T10:03:15.886Z | auto\n\n- Added explicit documentation for the new agent_register command, enabling users to re-authenticate and obtain a new token.\n- Updated sample commands and workflow instructions to mention agent_register and corrected add-to-shared usage examples.\n- Improved clarity and consistency in team sharing and batch reorganization examples.\n\nv2.2.6 | 2026-07-23T09:47:08.051Z | auto\n\nurl-manager 2.2.6\n\n- Updated quick reference and command documentation to clarify and unify usage (notably, add command syntax focuses on positional <url> instead of --url).\n- Corrected file references and command formatting for consistency.\n- Updated installation and setup docs to refer to {baseDir}/.token.\n- Removed obsolete file: skill-card.md.\n- Synchronized documentation in SKILL.md and SKILL.zh-CN.md.\n\nv2.2.5 | 2026-07-23T08:46:06.445Z | auto\n\n- Minor update to scripts/footprints.py.\n- Version bumped to 2.2.5.\n- No user-facing documentation or command changes.\n\nv2.2.4 | 2026-07-23T08:38:39.869Z | auto\n\n- Added installation instructions for footprints.py in SKILL.md to help users restore or obtain the script if missing.\n- Removed package installation metadata from the SKILL file.\n- Deleted the redundant skill-card.md file.\n- Minor cleanup and updates to documentation.\n\nv2.2.3 | 2026-07-23T04:24:16.393Z | auto\n\n- Added compatibility.install section in SKILL.md with explicit note: \"No external Python packages required — stdlib only.\"\n- Removed the file skill-card.md.\n- No breaking changes; documentation was streamlined and installation requirements clarified for users.\n\nv2.2.2 | 2026-07-22T17:06:13.316Z | user\n\n删除无用 install 元数据块，消除 GitHub 嵌套表格渲染\n\nv2.2.1 | 2026-07-22T16:36:53.028Z | user\n\nSKILL.md 英文/中文版加兜底下载指令：裸读文档时自动下载 footprints.py\n\nv2.2.0 | 2026-07-22T12:42:41.738Z | user\n\nv2.2.0: 零配置装完即用 — 自动token管理、--json输出、{baseDir}路径、快捷对照表\n\nv2.1.2 | 2026-07-22T09:48:26.769Z | user\n\nv2.1.2: fix duplicate 'me' command + create-category_set→create-category-set\n\nv2.1.1 | 2026-07-22T08:48:11.857Z | user\n\nv2.1.1: 同步中英文版修复（api.post() crash, timeout, token refresh, 命令名, openclaw metadata）\n\nv2.1.0 | 2026-07-22T08:44:48.258Z | user\n\nv2.1.0: Fix P0 api.post() crash, add timeout, token refresh, search --limit, openclaw metadata, fix command names\n\nv2.0.1 | 2026-07-22T08:03:18.156Z | user\n\nRemove MCP reference, update to v2.0.1 — pure skill, no MCP mention\n\nv1.0.3 | 2026-07-22T05:31:49.083Z | auto\n\n- Documentation updated with a new \"Recipes\" section providing concrete bash patterns for common tasks.\n- Version bumped from 2.0.0 to 2.0.1 in metadata.\n- Removed redundant setup and usage guidance; streamlined explanations and focused on actionable workflow examples.\n- Clarified and expanded best practices for batch operations and category management.\n\nv2.0.0 | 2026-07-22T05:16:02.996Z | auto\n\nurl-manager 2.0.0 — Major documentation and workflow update\n\n- Rewrote SKILL.md for clearer, step-by-step usage, with best practices and critical pitfalls highlighted.\n- Setup instructions now emphasize silent, agent-first auto-registration with persistent token logic.\n- Magic-link delivery is clarified as the default sharing mechanism; validity and user experience improved.\n- Tool reference sections reorganized by real user intent and mapped to command usage.\n- Added a full Chinese (zh-CN) documentation file; removed obsolete skill-card.md.\n\nv1.0.2 | 2026-07-22T01:35:47.446Z | auto\n\n- Updated skill version to 1.0.2 in SKILL.md.\n- No functional or feature changes; documentation only.\n\nv0.1.0 | 2026-07-21T13:47:39.378Z | auto\n\n- Initial public release of url-manager skill (v0.1.0)\n- Added core documentation for agent-first, cross-platform URL collection and delivery\n- Included scripts directory for command-line usage\n- Provided packaged browser extension (url-manager-extension.zip)\n- Outlined quick start guides for both MCP protocol and local/CLI usage\n\nArchive index:\n\nArchive v2.6.4: 4 files, 15143 bytes\n\nFiles: scripts/footprints.py (23873b), skill-card.md (2510b), SKILL.md (22045b), _meta.json (130b)\n\nFile v2.6.4:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.4\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill, inform the human user — especially before saving or searching for the first time:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, and delete their data at any time via https://ai.ocean94.com\n- **User Agreement**: https://ai.ocean94.com/terms.html\n- **Privacy Policy**: https://ai.ocean94.com/privacy.html\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `category_set_name` | string \\| null | The name of the category set (e.g., \"Shopping\", \"Work\") |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — grouped by category set, each set header shows its ID (e.g., `ID:44`). Each category's `mode` field distinguishes personal vs shared. Run `category-sets` to see just the set list without their categories.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>] [--offset <n>]` | List recent footprints (limit max 100). Use `--offset` to page through results. Returns `total` count. |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all categories grouped by category set (set ID shown in headers) |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Response Structure\n\n`list` and `search` return `{\"items\": [...], \"total\": <N>}`. `total` is the full match count (not just this page). Always check `total` to know if there are more results beyond the current page.\n\n`list` supports `--offset` for pagination. If `total > limit + offset`, there are more pages. Example: `total=156, limit=20, offset=0` → 8 pages total.\n\n### Pagination Strategy\n\nFor large libraries, **prefer `search` over `list`** — it's faster and returns only what the user asked for. Use `list` for browsing or when the user says \"show me everything.\" When paginating, tell the user: \"Found 156 items, showing page 1/8. Want to see more?\"\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Inform before first use** — tell the user the skill connects to ai.ocean94.com, share links to [Terms](https://ai.ocean94.com/terms.html) and [Privacy](https://ai.ocean94.com/privacy.html)\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.6.4:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.4\",\n  \"publishedAt\": 1785230056905\n}\n\nFile v2.6.4:skill-card.md\n\n## Description:\n\nURL Manager helps agents save, organize, search, and share URLs and text notes through a hosted card-based knowledge library.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[piccolo123](https://clawhub.ai/user/piccolo123)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to save web links or notes, organize them into personal or shared categories, search collections, and deliver curated collections through magic links.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The hosted service can create an agent account and store saved URLs and metadata on ai.ocean94.com.\n\nMitigation: Inform the user before first use and avoid saving sensitive URLs or notes unless they accept the hosted-service terms.\n\nRisk: The skill keeps a local bearer token for reuse across sessions.\n\nMitigation: Store the token with restricted file permissions, keep it out of logs and shared artifacts, and rotate it if exposure is suspected.\n\nRisk: Generated magic links and invite links can grant access to card-based collections or shared categories.\n\nMitigation: Treat generated links and invite codes as secrets and share them only with intended recipients.\n\nRisk: The documented recovery path clones a remote repository without a pinned revision.\n\nMitigation: Prefer the packaged artifact; if recovery is necessary, pin and verify the source before copying executable files.\n\nRisk: Plaintext HTTP endpoints appear in the allowed endpoint list for local or private-network use.\n\nMitigation: Use the default HTTPS endpoint for real data and tokens.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager)\n- [URL Manager hosted service](https://ai.ocean94.com)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown or text responses with optional JSON command output and generated links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May persist a local bearer token and create hosted URL records through ai.ocean94.com.]\n\n## Skill Version(s):\n\n2.6.4 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.6.3: 4 files, 14812 bytes\n\nFiles: scripts/footprints.py (23597b), skill-card.md (3067b), SKILL.md (21276b), _meta.json (130b)\n\nFile v2.6.3:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.3\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill, inform the human user — especially before saving or searching for the first time:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, and delete their data at any time via https://ai.ocean94.com\n- **User Agreement**: https://ai.ocean94.com/terms.html\n- **Privacy Policy**: https://ai.ocean94.com/privacy.html\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `category_set_name` | string \\| null | The name of the category set (e.g., \"Shopping\", \"Work\") |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — grouped by category set, each set header shows its ID (e.g., `ID:44`). Each category's `mode` field distinguishes personal vs shared. Run `category-sets` to see just the set list without their categories.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>]` | List footprints |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all categories grouped by category set (set ID shown in headers) |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Inform before first use** — tell the user the skill connects to ai.ocean94.com, share links to [Terms](https://ai.ocean94.com/terms.html) and [Privacy](https://ai.ocean94.com/privacy.html)\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.6.3:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.3\",\n  \"publishedAt\": 1785225051026\n}\n\nFile v2.6.3:skill-card.md\n\n## Description: <br>\nURL Manager helps agents save, organize, search, and share web links and notes through a hosted card-based collection service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[piccolo123](https://clawhub.ai/user/piccolo123) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to collect URLs or text notes, organize them into categories and tags, search saved items, and share curated collections through the hosted ai.ocean94.com service. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can automatically create an account and store saved URLs, notes, categories, tags, and sharing metadata on ai.ocean94.com. <br>\nMitigation: Inform the user before first save or search, confirm they accept the hosted data flow, and direct them to the service for data management or deletion. <br>\nRisk: The skill stores a bearer token in a local .token file and can generate login or invite links that function like credentials. <br>\nMitigation: Treat the .token file and generated links as sensitive credentials, avoid sharing them in public channels, and rotate or re-register only when the user understands that it may create a new account. <br>\nRisk: Shared category changes, invite links, and cocreate actions can affect other members' access or shared collections. <br>\nMitigation: Ask for user confirmation before creating shared categories, generating invite links, modifying cocreate categories, or removing items from shared categories. <br>\nRisk: The fallback instructions clone a repository path when the script is missing, which evidence security guidance flags as needing trust in that source. <br>\nMitigation: Prefer the bundled script from the installed skill and avoid the fallback clone path unless the user explicitly trusts the repository source. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager) <br>\n- [Hosted URL Manager service](https://ai.ocean94.com) <br>\n- [User Agreement](https://ai.ocean94.com/terms.html) <br>\n- [Privacy Policy](https://ai.ocean94.com/privacy.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown guidance with Python shell commands and optional JSON command output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires Python and network access to ai.ocean94.com; commands may create a local bearer token file and send saved URL, note, category, tag, and sharing data to the hosted service.] <br>\n\n## Skill Version(s): <br>\n2.6.3 (source: server evidence release version and skill metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.6.2: 4 files, 14289 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2320b), SKILL.md (21075b), _meta.json (130b)\n\nFile v2.6.2:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.2\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill, inform the human user — especially before saving or searching for the first time:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, and delete their data at any time via https://ai.ocean94.com\n- **User Agreement**: https://ai.ocean94.com/terms.html\n- **Privacy Policy**: https://ai.ocean94.com/privacy.html\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — personal and shared together. Each category's `mode` field distinguishes them. Run `category-sets` to see how they're grouped into workspaces.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>]` | List footprints |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all available categories |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Inform before first use** — tell the user the skill connects to ai.ocean94.com, share links to [Terms](https://ai.ocean94.com/terms.html) and [Privacy](https://ai.ocean94.com/privacy.html)\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.6.2:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.2\",\n  \"publishedAt\": 1784958084516\n}\n\nFile v2.6.2:skill-card.md\n\n## Description: <br>\nurl-manager helps agents save, organize, search, and share web links and notes in hosted URL Manager collections. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[piccolo123](https://clawhub.ai/user/piccolo123) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and end users use this skill through an agent to collect URLs or notes, organize them into categories and shared collections, search saved content, and deliver results through a card-based web interface. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can create and store account credentials for ai.ocean94.com and keep a bearer token in the skill directory. <br>\nMitigation: Install only after confirming the user accepts an agent-managed account and local token storage. <br>\nRisk: Saved URLs and notes are stored on the hosted ai.ocean94.com service. <br>\nMitigation: Inform the user before first use and avoid saving private links or notes unless the user explicitly agrees. <br>\nRisk: Generated magic links or invite links may grant access to account content or shared collections. <br>\nMitigation: Treat generated links as account-access or sharing links and share them only with intended recipients. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager) <br>\n- [URL Manager service](https://ai.ocean94.com/) <br>\n- [User Agreement](https://ai.ocean94.com/terms.html) <br>\n- [Privacy Policy](https://ai.ocean94.com/privacy.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown with command examples and generated links] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May generate hosted magic links, invite links, and JSON output when commands are run with --json.] <br>\n\n## Skill Version(s): <br>\n2.6.2 (source: server-resolved release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.6.1: 4 files, 14542 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2853b), SKILL.md (21075b), _meta.json (130b)\n\nFile v2.6.1:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.1\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill, inform the human user — especially before saving or searching for the first time:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, and delete their data at any time via https://ai.ocean94.com\n- **User Agreement**: https://ai.ocean94.com/terms.html\n- **Privacy Policy**: https://ai.ocean94.com/privacy.html\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — personal and shared together. Each category's `mode` field distinguishes them. Run `category-sets` to see how they're grouped into workspaces.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>]` | List footprints |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all available categories |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Inform before first use** — tell the user the skill connects to ai.ocean94.com, share links to [Terms](https://ai.ocean94.com/terms.html) and [Privacy](https://ai.ocean94.com/privacy.html)\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.6.1:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.1\",\n  \"publishedAt\": 1784957800549\n}\n\nFile v2.6.1:skill-card.md\n\n## Description: <br>\nURL Manager helps agents save, organize, search, and share web links or text notes in a cloud-backed, card-based library. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[piccolo123](https://clawhub.ai/user/piccolo123) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill when a user asks to save, bookmark, organize, search, or share web resources. It supports cloud-backed personal and shared URL collections, categories, tags, full-text search, and magic-link delivery. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill auto-creates an account and stores saved URLs, notes, categories, and related data on ai.ocean94.com. <br>\nMitigation: Inform the user before first use, point them to the service terms and privacy policy, and avoid saving sensitive private links unless the user agrees. <br>\nRisk: A bearer token is stored locally for reuse. <br>\nMitigation: Keep the token file private, avoid exposing it in chat or logs, and rotate or re-register only with user consent because re-registration creates a separate account. <br>\nRisk: Bulk updates, category replacement, and shared-category changes can reorganize data or affect collaborators. <br>\nMitigation: Confirm before removing category associations, clearing tags, modifying shared categories, or making bulk changes; fetch current categories before replacement updates. <br>\nRisk: Frequent API calls may hit service rate limits. <br>\nMitigation: Use batch operations where appropriate, add delay between rapid calls, and retry after a short wait when rate-limited. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager) <br>\n- [Publisher profile](https://clawhub.ai/user/piccolo123) <br>\n- [URL Manager service](https://ai.ocean94.com/) <br>\n- [User Agreement](https://ai.ocean94.com/terms.html) <br>\n- [Privacy Policy](https://ai.ocean94.com/privacy.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with Python CLI commands; command results may be human-readable text or JSON when --json is used.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [The skill can create and reuse a local token, call a remote URL-manager service, and generate magic links for the user.] <br>\n\n## Skill Version(s): <br>\n2.6.1 (source: server release, artifact metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.6.0: 4 files, 14392 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2580b), SKILL.md (21063b), _meta.json (130b)\n\nFile v2.6.0:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.0\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill (especially before your first `add` or `search`), inform the human user:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, and delete their data at any time via https://ai.ocean94.com\n- **User Agreement**: https://ai.ocean94.com/terms.html\n- **Privacy Policy**: https://ai.ocean94.com/privacy.html\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — personal and shared together. Each category's `mode` field distinguishes them. Run `category-sets` to see how they're grouped into workspaces.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>]` | List footprints |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all available categories |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Inform before first use** — tell the user the skill connects to ai.ocean94.com, share links to [Terms](https://ai.ocean94.com/terms.html) and [Privacy](https://ai.ocean94.com/privacy.html)\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.0\",\n  \"publishedAt\": 1784957756267\n}\n\nFile v2.6.0:skill-card.md\n\n## Description: <br>\nURL Manager lets agents save, search, organize, and share web resources as structured collections with categories, full-text search, collaborative sharing, and magic-link delivery. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[piccolo123](https://clawhub.ai/user/piccolo123) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to save, search, organize, and share URLs, notes, and web resources as structured collections. It is intended for bookmark and knowledge-base workflows that rely on a hosted third-party URL manager. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can auto-create an account and send saved URLs, notes, categories, and searches to ai.ocean94.com. <br>\nMitigation: Use it only after the user understands the third-party hosted service, storage behavior, terms, and privacy policy; avoid sensitive links unless those terms have been reviewed. <br>\nRisk: A bearer token is persisted locally in the skill directory. <br>\nMitigation: Protect the skill directory and token file, avoid sharing the installation, and remove or rotate the token if access should be revoked. <br>\nRisk: The runtime fallback can fetch the helper script from GitHub when the local script is missing. <br>\nMitigation: Do not rely on that fallback unless the source has been separately trusted and verified. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager) <br>\n- [Publisher profile](https://clawhub.ai/user/piccolo123) <br>\n- [Hosted URL Manager service](https://ai.ocean94.com) <br>\n- [User Agreement](https://ai.ocean94.com/terms.html) <br>\n- [Privacy Policy](https://ai.ocean94.com/privacy.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands and optional JSON command output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May generate hosted magic links and persist a local bearer token for the third-party service.] <br>\n\n## Skill Version(s): <br>\n2.6.0 (source: server release metadata and skill metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.5.5: 4 files, 14165 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2551b), SKILL.md (20368b), _meta.json (130b)\n\nFile v2.5.5:SKILL.md\n\n---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.5.5\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## System Concepts\n\n### What is a footprint?\n\nA footprint is the fundamental unit in URL Manager — a structured, searchable record. It can be a web link, a plain-text note, an idea, or anything you want to save and retrieve later.\n\nEach footprint stores:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | UUID | Permanent unique identifier — use this for all operations |\n| `url` | string (8192) | The original link. **Can be empty** for text-only footprints |\n| `title` | string (512) | A short title — you set this |\n| `description` | string (1024) | Additional context or notes — you can set this |\n| `content_type` | string (50) | Free text (e.g. `article`, `video`, `image`). Use `content-types` to see what types exist in your library |\n| `ai_summary` | text | AI-generated summary (set automatically during web UI submission) |\n| `favicon` / `og_image` | string | Site icon and preview image (auto-fetched) |\n| `price_hint` | string | AI-extracted price hint (set automatically) |\n| `price` / `address` / `custom_date` / `contact` | string | User-filled metadata fields |\n| `is_favorite` / `is_archived` | boolean | Status flags |\n| `category_ids` | list[int] | Which categories this footprint belongs to — **you assign** |\n| `tag_names` | list[str] | Keywords — **you assign** |\n\nA single footprint can belong to **multiple categories simultaneously**.\n\n### What is a category?\n\nA category is a named label for organizing footprints — like a folder, but a footprint can be in several at once.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier — always reference categories by ID |\n| `name` | string (50) | Display name (e.g., \"Shopping\", \"Fitness\") |\n| `slug` | string (50) | URL-safe identifier |\n| `color` | string (7) | Optional hex color for UI (e.g., `#FF6B6B`) |\n| `icon` | string (50) | Optional icon identifier |\n| `note` | string (500) | Optional description/notes |\n| `category_set_id` | int \\| null | Which set this category belongs to (null = unassigned) |\n| `mode` | string \\| null | `null` = personal, `\"cocreate\"` = shared co-edit, `\"subscribe\"` = shared read-only |\n| `is_default` | bool | System default category |\n| `is_ai_generated` | bool | Created by AI auto-categorization |\n| `sort_order` | int | Display ordering within a set |\n| `is_active` | bool | `false` after a shared category is disbanded |\n\nKey behaviors:\n- **Same name allowed** — multiple categories named \"Shopping\" can exist in different sets. Always use `id`, not `name`, to reference them.\n- **mode = null → personal** (visible only to owner); **mode = \"cocreate\" or \"subscribe\" → shared** (has members and invite links).\n- A category inherits its `mode` from its Category Set's `mode`.\n\n### What is a category set?\n\nA category set is a workspace — a named container that groups related categories together.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | int | Permanent numeric identifier |\n| `name` | string (50) | Display name (e.g., \"Life\", \"Work\") |\n| `mode` | string \\| null | `null` = personal set, `\"cocreate\"`/`\"subscribe\"` = shared set |\n| `is_shared` | bool | `true` = the shared-categories container (max one per user) |\n| `color` | string (7) | Optional theme color |\n| `sort_order` | int | Display ordering |\n\nEvery user starts with two default sets:\n- **\"My Categories\"** (`is_shared=false`, `mode=null`) — personal workspace\n- **\"Shared Categories\"** (`is_shared=true`) — the one container that holds all your shared categories\n\nUse `category-sets` to list them, `create-category-set` to create more. Creating a new set with `mode=null` gives you another personal workspace. Creating one with `mode=\"cocreate\"` or `\"subscribe\"` is rare — shared categories are usually created via `create-shared-category`, which places them inside the \"Shared Categories\" set.\n\n### How data is organized\n\n```\nCategory Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)\n```\n\n**Categories** are named labels — see the field table above. **Category Sets** are workspaces — also detailed above. **Tags** are free-form keywords, separate from categories. They're lightweight search helpers with no hierarchy.\n\nUse `content-types` to see which content types have been used in your library. Use `tags` to list existing tags.\n\n### Personal vs Shared categories\n\nA category's `mode` field tells you what kind it is:\n\n| | Personal | Shared |\n|---|---|---|\n| `mode` | `null` (not shown) | `\"cocreate\"` or `\"subscribe\"` |\n| Visible to | Only you | You + invited members |\n| Who can add footprints | Only you | Depends on mode |\n| Has members and invite links | No | Yes |\n\nRun `categories` to see ALL your categories — personal and shared together. Each category's `mode` field distinguishes them. Run `category-sets` to see how they're grouped into workspaces.\n\n### Shared category modes\n\n**Cocreate (共建)** — Everyone contributes:\n- Any member can add/remove footprints (`add-to-shared` / `remove-from-shared`)\n- Any member can generate invite links (`create-invite-link`)\n- Only the owner can disband or switch modes\n- Best for: team knowledge bases, group trip planning, shared research\n\n**Subscribe (订阅)** — Read-only for members:\n- Only the owner can add/remove footprints\n- Only the owner can generate invite links\n- Members can browse and search but cannot modify\n- `add-to-shared` returns 403 in subscribe mode\n- Best for: curated recommendation lists, resource collections\n\nThe owner can switch between cocreate and subscribe at any time via the web UI.\n\n### Sharing workflow\n\n1. **Create** → `create-shared-category \"Team KB\" --mode cocreate`\n2. **Generate invite** → `create-invite-link <sc_id>` → get a code\n3. **Share** the invite code with teammates\n4. **Join** → teammates run `join-shared-category <code>`\n5. **Build together** → everyone uses `add-to-shared <sc_id> --collection-id <id>`\n6. **Save locally** → anyone can `copy <id> --category-ids <ids>` to save a shared footprint to their personal collection\n\n### Roles and permissions\n\n| Action | Owner | Admin | Member |\n|--------|:-----:|:-----:|:------:|\n| Add/remove footprints (cocreate) | ✅ | ✅ | ✅ |\n| Add/remove footprints (subscribe) | ✅ | ❌ | ❌ |\n| Generate invite link (cocreate) | ✅ | ✅ | ✅ |\n| Generate invite link (subscribe) | ✅ | ❌ | ❌ |\n| Edit category name/description | ✅ | ❌ | ❌ |\n| Switch cocreate ↔ subscribe | ✅ | ❌ | ❌ |\n| Disband shared category | ✅ | ❌ | ❌ |\n| Manage members | Web UI only | — | — |\n\n### How search works\n\n1. **Keyword search** (`search <query>`) — matches against title, description, AI summary, and extracted text content. Filter by category with `--category-id`.\n\n2. **URL dedup** — searching with a URL automatically detects and matches by URL hash, bypassing text search entirely.\n\n### Agent interaction model\n\n- **Zero setup**: first run auto-registers via `POST /register`, receives a Bearer token\n- **Token persistence**: stored in `{baseDir}/.token` with `chmod 600`, reused across sessions\n- **Magic link**: `agent_magic_link` generates a clickable card-based interface URL for the human user — valid 30 days, reusable\n- **Account upgrade**: if the user later binds a phone number, the agent-created account upgrades seamlessly\n\n## Command Reference\n\nUnderstand the user's real intent, then call one or more commands to fulfill it.\n\n### Save & Search\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py add <url> --title <title> --description <desc> --content-type <type> --category-ids <ids> --tags <tags>` | Save a link or plain-text entry (url can be empty) |\n| `python {baseDir}/scripts/footprints.py get <id>` | View a footprint's full details |\n| `python {baseDir}/scripts/footprints.py search <query>` | Full-text search across title, description, AI summary |\n| `python {baseDir}/scripts/footprints.py list [--category-id <id>] [--limit <n>]` | List footprints |\n\n### Organize\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py update <id> --title <t> --description <d> --content-type <ct> --category-ids <ids> --tags <tags>` | Modify a footprint's title, categories, tags |\n| `python {baseDir}/scripts/footprints.py batch-update <updates>` | Batch reorganize footprints (max 50 per call) |\n| `python {baseDir}/scripts/footprints.py categories` | List all available categories |\n| `python {baseDir}/scripts/footprints.py create-category <name> [--category-set-id <id>]` | Create a new category |\n| `python {baseDir}/scripts/footprints.py tags` | List all used tags |\n| `python {baseDir}/scripts/footprints.py content-types` | List content types used in your library (e.g. article, video, image) |\n| `python {baseDir}/scripts/footprints.py category-sets` | List all category sets (workspaces) |\n| `python {baseDir}/scripts/footprints.py create-category-set <name>` | Create a new category set |\n\n### Share\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py create-shared-category <name> --mode cocreate\\|subscribe --description <desc>` | Create a shared category |\n| `python {baseDir}/scripts/footprints.py create-invite-link <sc_id> [--duration-hours 24]` | Generate an invite link |\n| `python {baseDir}/scripts/footprints.py join-shared-category <invite_code>` | Join a shared category via invite code |\n| `python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <id>` | Add a footprint to a shared category |\n| `python {baseDir}/scripts/footprints.py remove-from-shared <sc_id> --collection-id <id>` | Remove a footprint from a shared category |\n| `python {baseDir}/scripts/footprints.py copy <id> --category-ids <ids>` | Copy a shared footprint to your personal collection |\n\n### Utilities\n\n| Command | What it does |\n|---------|-------------|\n| `python {baseDir}/scripts/footprints.py me` | Confirm current identity |\n| `python {baseDir}/scripts/footprints.py agent_magic_link` | Generate a magic link — send to user when done |\n| `python {baseDir}/scripts/footprints.py agent_register` | Re-register / rotate credentials ⚠️ creates new account |\n\n## Core Workflows\n\n### New User — Zero Setup\n\n```\n1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\"\n```\n\n### Returning User — Daily Use\n\n```\n1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate\n```\n\n### Team Sharing\n\n``` \n1. python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with team\n3. Teammates: python {baseDir}/scripts/footprints.py join-shared-category <invite_code>\n4. Everyone: python {baseDir}/scripts/footprints.py add-to-shared <sc_id> --collection-id <collection_id> → build together\n```\n\n### Batch Reorganization\n\n```\n1. python {baseDir}/scripts/footprints.py list --limit 100 → get all bookmarks\n2. python {baseDir}/scripts/footprints.py categories → map target categories\n3. python {baseDir}/scripts/footprints.py batch-update '[\n     {\"id\":\"uuid1\",\"category_ids\":[1,3]},\n     {\"id\":\"uuid2\",\"title\":\"New Title\",\"category_ids\":[2,5]}\n   ]' → bulk edit (max 50 per call)\n```\n\n## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories\n\n```bash\npython {baseDir}/scripts/footprints.py get 42\n# → categories: [{id: 3, name: \"Reading\"}, {id: 5, name: \"AI\"}]\n\n# Keep AI, drop Reading, add Tech (7)\npython {baseDir}/scripts/footprints.py update 42 --category-ids 5,7\n```\n\n### Batch move to a new category\n\n```bash\npython {baseDir}/scripts/footprints.py create-category \"New Topic\"    # → returns new ID\npython {baseDir}/scripts/footprints.py list --limit 100\n# For each matching footprint:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<new_id>\n```\n\n### Merge two categories\n\n```bash\npython {baseDir}/scripts/footprints.py categories                      # note source and target IDs\npython {baseDir}/scripts/footprints.py list --category-id <source_id>  # list all in source\n# For each, replace source_id with target_id:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <target_id>,<other_ids>\n# Tell user: empty category \"source\" is ready to delete via the web UI\n```\n\n### Auto-categorize by domain\n\nUser says \"put all github.com links into a GitHub category\":\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 200\n# Filter in-memory: items where url contains \"github.com\"\npython {baseDir}/scripts/footprints.py create-category \"GitHub\"\n# For each match:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<github_id>\n```\n\n### Filter by tag and batch categorize\n\n```bash\npython {baseDir}/scripts/footprints.py search docker\n# Filter results where tag_names includes \"docker\"\n# For each, append target category:\npython {baseDir}/scripts/footprints.py update <id> --category-ids <existing_ids>,<target_id>\n```\n\n### Organize uncategorized footprints\n\n```bash\npython {baseDir}/scripts/footprints.py list --limit 100\n# Filter where category_ids is empty or only the default\n# Present to user, let them pick categories\n# Batch update selected items\n```\n\n### Recommend categories from tags\n\nSpot gaps between tags and categories — e.g., #docker is common but no \"Docker\" category:\n\n```bash\npython {baseDir}/scripts/footprints.py tags        # most-used tags\npython {baseDir}/scripts/footprints.py categories  # existing categories\n# Cross-reference: tag without matching category → suggest creating one\n```\n\n### Copy from shared to personal\n\n```bash\npython {baseDir}/scripts/footprints.py categories  # find target personal category ID\npython {baseDir}/scripts/footprints.py copy <footprint_id> --category-ids <personal_category_id>\n```\n\n### Cross-Agent collaboration\n\nTwo agents maintaining a shared knowledge base together:\n\n```\n1. Agent A: python {baseDir}/scripts/footprints.py create-shared-category \"Team KB\" --mode cocreate\n2. Agent A: python {baseDir}/scripts/footprints.py create-invite-link <sc_id> → share code with user\n3. User forwards code to colleague\n4. Agent B: python {baseDir}/scripts/footprints.py join-shared-category <code>\n5. Both agents now see each other's additions via python {baseDir}/scripts/footprints.py search\n```\n\n## Magic Link — The Delivery Loop\n\nAfter organizing, always deliver results via magic link:\n\n```bash\npython {baseDir}/scripts/footprints.py agent_magic_link\n```\n\nSend the link to the user: \"Done organizing — view your collection here → [link]\"\n\nUser clicks to see a card-based interface with everything categorized. **Valid for 30 days, reusable.** If the user later binds a phone number, their agent-created account upgrades seamlessly.\n\n## ⚠️ Critical Pitfalls\n\n### category_ids is REPLACEMENT, not append\n\nWhen updating, `--category-ids` sets the complete list — it does NOT add to existing categories.\n\n```bash\n# ❌ Wrong: moves bookmark to category 7, loses categories 3 and 5\npython {baseDir}/scripts/footprints.py update 42 --category-ids 7\n\n# ✅ Right: fetch current first, then merge\npython {baseDir}/scripts/footprints.py get 42  # → existing: [3, 5]\npython {baseDir}/scripts/footprints.py update 42 --category-ids 3,5,7\n```\n\n### Subscribe mode is READ-ONLY\n\nWriting to a subscribe-mode shared category returns 403. Tell the user the collection is read-only — the creator must change it to cocreate mode.\n\n### NEVER call agent_register twice\n\nEach call creates a fresh empty account. Always check for a saved token first. If unsure, run `python {baseDir}/scripts/footprints.py me` to verify the current token is valid.\n\n### Rate limiting\n\nFrequent API calls trigger HTTP 429. Use `batch-update` for bulk operations, add delays between rapid calls, retry after a few seconds on 429.\n\n### No member management via API\n\nInviting or removing members from shared categories requires the web UI at https://ai.ocean94.com. You cannot do this programmatically.\n\n## Guidelines\n\n### Always\n- **Auto-register silently** — never interrupt the user for account setup\n- **Search before listing** — use `python {baseDir}/scripts/footprints.py search` for targeted queries instead of dumping everything\n- **Discover before creating** — call `python {baseDir}/scripts/footprints.py categories` and `python {baseDir}/scripts/footprints.py tags` before adding to avoid duplicates\n- **Deliver with magic link** — after organizing, always generate and share a link\n\n### Confirm before\n- Removing bookmark-category associations (irreversible)\n- Clearing tags\n- Modifying cocreate shared categories (affects others)\n- Removing bookmarks from shared categories (other members lose access)\n\nFile v2.5.5:_meta.json\n\n{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.5.5\",\n  \"publishedAt\": 1784957049238\n}\n\nFile v2.5.5:skill-card.md\n\n## Description: <br>\nCross-platform URL collection and knowledge management for saving, organizing, searching, and sharing web resources through a third-party URL manager service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[piccolo123](https://clawhub.ai/user/piccolo123) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill to sa\n\nArchive v2.5.4: 5 files, 21312 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2480b), SKILL.md (20320b), SKILL.zh-CN.md (19442b), _meta.json (130b)\n\nArchive v2.5.3: 4 files, 13988 bytes\n\nFiles: scripts/footprints.py (23184b), skill-card.md (2426b), SKILL.md (20141b), _meta.json (130b)\n\nArchive v2.5.2: 4 files, 11065 bytes\n\nFiles: scripts/footprints.py (22338b), skill-card.md (2324b), SKILL.md (13564b), _meta.json (130b)\n\nArchive v2.5.1: 4 files, 10970 bytes\n\nFiles: scripts/footprints.py (22034b), skill-card.md (2501b), SKILL.md (13564b), _meta.json (130b)","readmeExcerpt":"Skill: url-manager Owner: piccolo123 Summary: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users. Tags: lat","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"git clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um"},{"language":"text","snippet":"Category Sets (workspaces)\n  └── Categories (labels like \"Shopping\", \"Food\", \"Learning\")\n        └── Footprints\n             └── Tags (free-form keywords)"},{"language":"text","snippet":"1. Token check → auto-register (save to {baseDir}/.token)\n2. python {baseDir}/scripts/footprints.py add \"<url>\" --title \"<title>\" → save bookmarks\n3. python {baseDir}/scripts/footprints.py categories → discover structure\n4. python {baseDir}/scripts/footprints.py create-category \"<name>\" → create categories\n5. python {baseDir}/scripts/footprints.py update <id> --category-ids <ids> → categorize\n6. python {baseDir}/scripts/footprints.py agent_magic_link → send link: \"Done! View here → [link]\""},{"language":"text","snippet":"1. python {baseDir}/scripts/footprints.py me → confirm identity\n2. python {baseDir}/scripts/footprints.py categories + python {baseDir}/scripts/footprints.py tags → understand structure\n3. python {baseDir}/scripts/footprints.py search query → find what's needed\n4. python {baseDir}/scripts/footprints.py add / python {baseDir}/scripts/footprints.py update → operate"},{"language":"text","snippet":"### Batch Reorganization"},{"language":"text","snippet":"## Recipes\n\nConcrete bash patterns for common tasks. Follow the numbered steps.\n\n### Change a footprint's categories"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: url-manager\ndescription: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and network access to https://ai.ocean94.com\nmetadata:\n  author: Piccolo123\n  version: \"2.6.4\"\n  contact: piccoloyao@ocean94.com\n  openclaw:\n    emoji: \"🔗\"\n    minGatewayVersion: \"2026.6.0\"\n    requires:\n      bins:\n        - python\n      network: true\n---\n\n# URL Manager — Deliver results as beautiful cards, not raw link dumps\n\nWhen users ask you to save, organize, or share web resources, don't paste URLs into chat. Write them into URL Manager — they become structured, searchable, card-based collections the user opens with one click.\n\n## What This Tool Gives Humans\n\nThe content human users want to save is everywhere — a YouTube workout video, an Amazon gear link, a Substack training plan — scattered across platforms with no connection.\n\n**URL Manager fixes this.** Just paste any link from any platform. AI auto-identifies the content and suggests a category — confirm and it's a footprint. All your saves flow into one platform-agnostic library, organized and always findable. Then **share it in one click** — hand your curated running knowledge base to your whole running club, and everyone stays in sync.\n\n**[足迹AI](https://ai.ocean94.com/)** isn't just a library — it has a built-in search engine, so you can search and save web content right from here. It's a great browser homepage. Every saved item becomes a beautiful card, one click to where you need to go. Send them the magic link and they're in.\n\n## How to Use\n\n**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.\n\nAll commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.\n\nIf the script is missing (e.g., you only have this document but not the full skill installation), get it from the source repo:\n\n```bash\ngit clone --depth 1 https://github.com/Piccolo123/url-manager.git /tmp/um\nmkdir -p {baseDir}/scripts\ncp /tmp/um/scripts/footprints.py {baseDir}/scripts/\nchmod +x {baseDir}/scripts/footprints.py\nrm -rf /tmp/um\n```\n\nAfter that, all commands below work as normal. The script auto-registers on first run.\n\n## Privacy & Terms\n\nThis skill connects to a hosted backend at **https://ai.ocean94.com**. Before using this skill, inform the human user — especially before saving or searching for the first time:\n\n- An account will be auto-created on first use\n- All collected URLs and data are stored on ai.ocean94.com\n- The user can view, manage, an"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn73vy01yjevpfkytfr588br3982tw01\",\n  \"slug\": \"url-manager\",\n  \"version\": \"2.6.4\",\n  \"publishedAt\": 1785230056905\n}"},{"path":"skill-card.md","content":"## Description:\n\nURL Manager helps agents save, organize, search, and share URLs and text notes through a hosted card-based knowledge library.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[piccolo123](https://clawhub.ai/user/piccolo123)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and their agents use this skill to save web links or notes, organize them into personal or shared categories, search collections, and deliver curated collections through magic links.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The hosted service can create an agent account and store saved URLs and metadata on ai.ocean94.com.\n\nMitigation: Inform the user before first use and avoid saving sensitive URLs or notes unless they accept the hosted-service terms.\n\nRisk: The skill keeps a local bearer token for reuse across sessions.\n\nMitigation: Store the token with restricted file permissions, keep it out of logs and shared artifacts, and rotate it if exposure is suspected.\n\nRisk: Generated magic links and invite links can grant access to card-based collections or shared categories.\n\nMitigation: Treat generated links and invite codes as secrets and share them only with intended recipients.\n\nRisk: The documented recovery path clones a remote repository without a pinned revision.\n\nMitigation: Prefer the packaged artifact; if recovery is necessary, pin and verify the source before copying executable files.\n\nRisk: Plaintext HTTP endpoints appear in the allowed endpoint list for local or private-network use.\n\nMitigation: Use the default HTTPS endpoint for real data and tokens.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/piccolo123/skills/url-manager)\n- [URL Manager hosted service](https://ai.ocean94.com)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown or text responses with optional JSON command output and generated links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May persist a local bearer token and create hosted URL records through ai.ocean94.com.]\n\n## Skill Version(s):\n\n2.6.4 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users. Skill: url-manager Owner: piccolo123 Summary: Cross-platform URL collection & knowledge management with agent-first auto-registration. Use when users say \"save/bookmark/collect/remember this\", need to organize links into categories, share curated collections, or build a structured knowledge base from web resources. Supports collaborative shared categories, full-text search, and magic-link delivery to users. Tags: lat","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1442,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:18:15.640Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:43:45.505Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}