{"id":"148fb66a-3044-4edf-a950-390ea8cbea09","entityType":"agent","slug":"clawhub-drumrobot-skill-kit","name":"skill-kit","canonicalUrl":"https://www.xpersona.co/agent/clawhub-drumrobot-skill-kit","canonicalPath":"/agent/clawhub-drumrobot-skill-kit","generatedAt":"2026-10-09T18:05:34.660Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:01:19.466Z","emptyReason":null},"description":"Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body Skill calls into Edge Table + Mermaid + dispatched d3 force-directed render), language (per-skill language consistency enforcement), portability (public skill cross-ref + vendor isolation), publish-scope (published skill scope review before extending), invoke-discipline (slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch). Use when: \"skill writer\", \"skill lint\", \"skill merge\", \"skill dedup\", \"create skill\", \"frontmatter fix\", \"multi-topic skill\", \"convert agent\", \"skill upgrade\", \"add topic\", \"topic route\", \"trigger compile\", \"hook auto register\", \"find skill\", \"discover skill\", \"npx skills\", \"skills.sh\", \"install skill\", \"skill graph\", \"skill dependency graph\", \"depends-on extract\", \"mermaid skill graph\", \"force-directed skill graph\", \"skill language\", \"description language\", \"portability\", \"publish scope\", \"slash command tool call\", \"Skill tool missing\", \"multi-topic read\", \"invoke discipline\", \"post-decision skill invoke\", \"interactive script\".","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.5K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17ay1v6v88r2m102pvvc44gz183qcrm:skill-kit","sourceUrl":"https://clawhub.ai/drumrobot/skill-kit","homepage":"https://clawhub.ai/drumrobot/skills/skill-kit","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/drumrobot/skill-kit","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/drumrobot/skills/skill-kit","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":40,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"skill-kit technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:01:19.466Z","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-09T14:01:19.466Z","emptyReason":null},"stars":null,"forks":null,"downloads":2520,"packageName":null,"latestVersion":"0.11.0","tractionLabel":"2.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:01:19.466Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T14:01:19.466Z","lastCrawledAt":"2026-10-09T14:01:19.466Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T14:01:19.466Z","lastVerifiedAt":null,"highlights":[{"version":"0.11.0","createdAt":"2026-10-09T10:54:15.004Z","changelog":"Version 0.11.0 - Updated documentation in CHANGELOG.md and invoke-discipline.md for clarity and detail. - Removed obsolete \"skill-card.md\" file to streamline the skill documentation set. - No changes to SKILL.md or core commands.","fileCount":33,"zipByteSize":116523},{"version":"0.10.0","createdAt":"2026-09-27T15:52:13.575Z","changelog":"Skill-kit 0.10.0 - Added scripts for skill graph extraction, enrichment, rendering, analysis, and wiki sync. - Updated documentation for graph extraction and overall workflow. - Removed obsolete skill-card file. - Improved graph-related automation and tooling integration.","fileCount":33,"zipByteSize":116104},{"version":"0.9.0","createdAt":"2026-09-20T11:23:15.780Z","changelog":"- Added `scripts/skillspector_lint.py` for enhanced linting capabilities. - Updated `CHANGELOG.md` and `lint.md` to reflect recent improvements. - Removed `skill-card.md` as part of documentation cleanup.","fileCount":28,"zipByteSize":98106},{"version":"0.8.1","createdAt":"2026-09-18T15:53:53.168Z","changelog":"### skill-kit 0.8.1 - Removed file: `skill-card.md` - Updated change documentation in `CHANGELOG.md` - No code, logic, or workflow changes detected","fileCount":27,"zipByteSize":94073},{"version":"0.8.0","createdAt":"2026-08-30T11:13:39.780Z","changelog":"Version 0.8.0 - Added new trigger scripts: PreToolUse, PostToolUse, and Stop handlers in `resources/`. - Introduced shell script `skill-yaml-validate.sh` for YAML validation in skills. - Enhanced and updated documentation: improvements to `invoke-discipline.md`, `portability.md`, and `trigger.md`. - Refined trigger handling and compilation mechanics (see `scripts/trigger-compile.sh`). - Removed outdated `skill-card.md` file.","fileCount":27,"zipByteSize":93840},{"version":"0.7.1","createdAt":"2026-08-26T17:26:14.227Z","changelog":"Skill-kit v0.7.1 - Updated CHANGELOG.md and upgrade.md with latest changes and improvements. - Removed the outdated skill-card.md documentation file.","fileCount":23,"zipByteSize":84867},{"version":"0.7.0","createdAt":"2026-08-21T05:41:04.018Z","changelog":"skill-kit v0.7.0 - Updated documentation files: CHANGELOG.md and lint.md improved - Removed obsolete file: skill-card.md has been deleted - General documentation cleanup and maintenance","fileCount":23,"zipByteSize":84766},{"version":"0.6.3","createdAt":"2026-08-18T05:42:44.604Z","changelog":"- Updated documentation: revised CHANGELOG.md, language.md, and upgrade.md. - Removed skill-card.md file. - No changes to core workflows or commands.","fileCount":23,"zipByteSize":83158}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ay1v6v88r2m102pvvc44gz183qcrm:skill-kit","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17ay1v6v88r2m102pvvc44gz183qcrm:skill-kit` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/drumrobot/skill-kit before using production credentials."],"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-drumrobot-skill-kit/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/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-09T18:05:34.657Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-drumrobot-skill-kit/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":"medium","updatedAt":"2026-10-09T14:01:19.466Z","emptyReason":null},"readme":"Skill: skill-kit\n\nOwner: drumrobot\n\nSummary: Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body Skill calls into Edge Table + Mermaid + dispatched d3 force-directed render), language (per-skill language consistency enforcement), portability (public skill cross-ref + vendor isolation), publish-scope (published skill scope review before extending), invoke-discipline (slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch). Use when: \"skill writer\", \"skill lint\", \"skill merge\", \"skill dedup\", \"create skill\", \"frontmatter fix\", \"multi-topic skill\", \"convert agent\", \"skill upgrade\", \"add topic\", \"topic route\", \"trigger compile\", \"hook auto register\", \"find skill\", \"discover skill\", \"npx skills\", \"skills.sh\", \"install skill\", \"skill graph\", \"skill dependency graph\", \"depends-on extract\", \"mermaid skill graph\", \"force-directed skill graph\", \"skill language\", \"description language\", \"portability\", \"publish scope\", \"slash command tool call\", \"Skill tool missing\", \"multi-topic read\", \"invoke discipline\", \"post-decision skill invoke\", \"interactive script\".\n\nTags: latest:0.11.0\n\nVersion history:\n\nv0.11.0 | 2026-10-09T10:54:15.004Z | auto\n\nVersion 0.11.0\n\n- Updated documentation in CHANGELOG.md and invoke-discipline.md for clarity and detail.\n- Removed obsolete \"skill-card.md\" file to streamline the skill documentation set.\n- No changes to SKILL.md or core commands.\n\nv0.10.0 | 2026-09-27T15:52:13.575Z | auto\n\nSkill-kit 0.10.0\n\n- Added scripts for skill graph extraction, enrichment, rendering, analysis, and wiki sync.\n- Updated documentation for graph extraction and overall workflow.\n- Removed obsolete skill-card file.\n- Improved graph-related automation and tooling integration.\n\nv0.9.0 | 2026-09-20T11:23:15.780Z | auto\n\n- Added `scripts/skillspector_lint.py` for enhanced linting capabilities.\n- Updated `CHANGELOG.md` and `lint.md` to reflect recent improvements.\n- Removed `skill-card.md` as part of documentation cleanup.\n\nv0.8.1 | 2026-09-18T15:53:53.168Z | auto\n\n### skill-kit 0.8.1\n\n- Removed file: `skill-card.md`\n- Updated change documentation in `CHANGELOG.md`\n- No code, logic, or workflow changes detected\n\nv0.8.0 | 2026-08-30T11:13:39.780Z | auto\n\nVersion 0.8.0\n\n- Added new trigger scripts: PreToolUse, PostToolUse, and Stop handlers in `resources/`.\n- Introduced shell script `skill-yaml-validate.sh` for YAML validation in skills.\n- Enhanced and updated documentation: improvements to `invoke-discipline.md`, `portability.md`, and `trigger.md`.\n- Refined trigger handling and compilation mechanics (see `scripts/trigger-compile.sh`).\n- Removed outdated `skill-card.md` file.\n\nv0.7.1 | 2026-08-26T17:26:14.227Z | auto\n\nSkill-kit v0.7.1\n\n- Updated CHANGELOG.md and upgrade.md with latest changes and improvements.\n- Removed the outdated skill-card.md documentation file.\n\nv0.7.0 | 2026-08-21T05:41:04.018Z | auto\n\nskill-kit v0.7.0\n\n- Updated documentation files: CHANGELOG.md and lint.md improved\n- Removed obsolete file: skill-card.md has been deleted\n- General documentation cleanup and maintenance\n\nv0.6.3 | 2026-08-18T05:42:44.604Z | auto\n\n- Updated documentation: revised CHANGELOG.md, language.md, and upgrade.md.\n- Removed skill-card.md file.\n- No changes to core workflows or commands.\n\nv0.6.2 | 2026-08-09T14:11:24.803Z | auto\n\nskill-kit 0.6.2\n\n- Added new dependencies (\"cleanup\", \"es6kr\") to the skill manifest for improved modularity.\n- Removed the redundant skill-card.md documentation file.\n- Updated existing documentation for several commands and skills.\n- Minor content and dependency corrections in SKILL.md to improve clarity.\n\nv0.6.1 | 2026-08-06T09:21:55.308Z | auto\n\nskill-kit 0.6.1\n\n- Updated documentation in portability.md and publish-scope.md for improved clarity on skill boundaries and publication checks.\n- Removed the skill-card.md file to reduce redundancy.\n- CHANGELOG.md updated to reflect recent changes.\n\nv0.6.0 | 2026-07-28T23:09:47.924Z | auto\n\nVersion 0.6.0\n\n- Updated CHANGELOG.md and invoke-discipline.md documentation.\n- Removed the outdated skill-card.md file.\n- General maintenance and documentation improvements.\n\nv0.5.0 | 2026-07-23T13:39:31.416Z | auto\n\n- Added new \"invoke-discipline\" topic to support slash command → Skill tool calls, multi-topic Read, post-decision auto-invoke, interactive scripts, and vendor dispatching.\n- Updated documentation to include \"invoke-discipline\" in the commands table and in the SKILL.md description.\n- Removed deprecated \"skill-card.md\" file.\n- General documentation improvements and command list updates for clarity.\n\nv0.4.2 | 2026-07-16T12:29:55.955Z | auto\n\nVersion 0.4.2\n\n- Added README.md for improved documentation.\n- Updated CHANGELOG.md, scripts/trigger-compile.sh, and trigger.md with new content or enhancements.\n- Removed skill-card.md.\n- General documentation and script refinements for maintainability.\n\nv0.4.1 | 2026-07-04T07:20:49.218Z | auto\n\nSkill-kit 0.4.1\n\n- Removed obsolete documentation file skill-card.md.\n- Updated CHANGELOG.md, upgrade.md, and writer.md for clarity and maintenance.\n- Made minor script and workflow improvements for dependency extraction.\n- General documentation and script updates to streamline skill management.\n\nv0.4.0 | 2026-06-19T23:10:49.514Z | auto\n\nSkill-kit 0.4.0 introduces new analysis and validation tools, plus portability and publishing checks.\n\n- Added commands: graph (dependency graph extraction), language (description language consistency enforcement), portability (cross-skill and vendor isolation rules), publish-scope (scope checks before changes).\n- New documentation for added commands and a dependency extraction script.\n- Improved SKILL.md to reference new topics and add key dependencies.\n- Removed outdated skill-card documentation.\n- Route command notes clustering now leverages cc-plugin module.\n\nv0.3.2 | 2026-06-13T10:09:10.724Z | auto\n\n- Updated documentation for architecture, upgrade, and changelog processes.\n- Removed outdated \"skill-card.md\" file.\n- Improved clarity and guidance in architecture and upgrade workflows.\n- Kept command references and usage examples up to date.\n\nv0.3.1 | 2026-06-07T07:57:23.234Z | auto\n\nVersion 0.3.1\n\n- Updated documentation files: CHANGELOG.md, lint.md, and upgrade.md for accuracy and clarity.\n- Removed skill-card.md file to streamline documentation.\n- No changes to SKILL.md or core feature set.\n\nv0.3.0 | 2026-05-25T17:25:36.141Z | auto\n\n# skill-kit 0.3.0 Changelog\n\n- Added `find` command and documentation to support skill discovery and installation via the npx skills CLI.\n- Expanded SKILL.md with updated description and usage notes for the new find feature.\n- Added new documentation files: CHANGELOG.md, LICENSE, and find.md.\n- Updated command list and instructions for expanded workflows and the find command.\n- Various documentation improvements for clarity and completeness.\n\nv0.1.2 | 2026-04-15T08:27:37.067Z | user\n\nEnhance upgrade and route topics, add version bump procedure documentation\n\nv0.1.1 | 2026-04-10T14:49:13.767Z | user\n\nAdd route topic for topic placement recommendations, improve upgrade procedure\n\nv0.1.0 | 2026-04-04T08:23:52.631Z | user\n\nInitial release: renamed from skill-toolkit for shorter slug\n\nArchive index:\n\nArchive v0.11.0: 33 files, 116523 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (15354b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (9372b), invoke-discipline.md (14207b), language.md (9121b), LICENSE (1063b), lint.md (33473b), merge.md (3444b), portability.md (14060b), publish-scope.md (8539b), README.md (644b), resources/skill-yaml-validate.sh (1818b), resources/trigger-PostToolUse.js (3340b), resources/trigger-PreToolUse.js (3771b), resources/trigger-Stop.js (2572b), route.md (8688b), scripts/enrich_skill_context.py (6556b), scripts/extract_skill_graph.py (9439b), scripts/extract-deps.sh (7945b), scripts/render_skill_graph.py (13971b), scripts/skill_graph_analyzer.py (9950b), scripts/skillspector_lint.py (9319b), scripts/sync_wiki_graph.py (8110b), scripts/trigger-compile.sh (20456b), skill-card.md (1641b), SKILL.md (5807b), trigger.md (8412b), upgrade.md (33611b), writer.md (11661b), _meta.json (129b)\n\nFile v0.11.0:SKILL.md\n\n---\nname: skill-kit\ndepends-on: [cc-plugin, clawhub, cleanup, es6kr]\nmetadata:\n  author: es6kr\n  version: \"0.1.2\"\ndescription: |\n  Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body Skill calls into Edge Table + Mermaid + dispatched d3 force-directed render), language (per-skill language consistency enforcement), portability (public skill cross-ref + vendor isolation), publish-scope (published skill scope review before extending), invoke-discipline (slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch). Use when: \"skill writer\", \"skill lint\", \"skill merge\", \"skill dedup\", \"create skill\", \"frontmatter fix\", \"multi-topic skill\", \"convert agent\", \"skill upgrade\", \"add topic\", \"topic route\", \"trigger compile\", \"hook auto register\", \"find skill\", \"discover skill\", \"npx skills\", \"skills.sh\", \"install skill\", \"skill graph\", \"skill dependency graph\", \"depends-on extract\", \"mermaid skill graph\", \"force-directed skill graph\", \"skill language\", \"description language\", \"portability\", \"publish scope\", \"slash command tool call\", \"Skill tool missing\", \"multi-topic read\", \"invoke discipline\", \"post-decision skill invoke\", \"interactive script\".\n---\n\n# Skill-Kit\n\nComprehensive toolkit for creating, managing, and maintaining Claude Code skills.\n\n## Commands\n\n| Command | Description | Link |\n| ------- | ----------- | ---- |\n| architecture | Multi-topic skill structure and topics | [architecture.md](./architecture.md) |\n| convert | Convert agents or scripts to skills | [convert.md](./convert.md) |\n| dedup | Identify and merge duplicate skills | [dedup.md](./dedup.md) |\n| find | Discover and install skills via npx skills CLI | [find.md](./find.md) |\n| graph | Extract `depends-on` + topic body `Skill(...)` edges into Edge Table + Mermaid + dispatched d3 force-directed render | [graph.md](./graph.md) |\n| language | Enforce per-skill language consistency (description-language rule + Edit/Write pre-check) | [language.md](./language.md) |\n| lint | Validate and fix SKILL.md frontmatter | [lint.md](./lint.md) |\n| merge | Combine related skills into one | [merge.md](./merge.md) |\n| portability | public/published skill cross-ref + vendor-specific isolation rules | [portability.md](./portability.md) |\n| publish-scope | published skill scope check before adding topics/scripts | [publish-scope.md](./publish-scope.md) |\n| route | Recommend topic placement within skills (plugin-level clustering → cc-plugin/clustering) | [route.md](./route.md) |\n| trigger | Register triggers and generate hooks | [trigger.md](./trigger.md) |\n| upgrade | Enhance existing skills or add topics | [upgrade.md](./upgrade.md) |\n| writer | Interactive skill creation wizard | [writer.md](./writer.md) |\n| invoke-discipline | Slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch | [invoke-discipline.md](./invoke-discipline.md) |\n\n## Core Workflows\n\n### Creation (skill-writer)\n\nAlways use `writer` to ensure correct frontmatter and structure.\n\n```bash\n/skill-kit writer                  # Start wizard\n```\n\n### Maintenance (upgrade/lint)\n\nUse `upgrade` to add new functionality or topics to an existing skill.\n\n```bash\n/skill-kit upgrade skill-name      # Interactive upgrade\n/skill-kit lint skill-name         # Validation only\n```\n\nImprovement types:\n- **Add Topic**: Add documentation for a new sub-feature\n- **Add Script**: Add logic to `scripts/` and reference in SKILL.md\n- **Fix Frontmatter**: Correct `triggers`, `depends-on`, or `description`\n\n### Trigger (Auto-generate Hooks)\n\n```bash\n/skill-kit trigger compile     # Scan skills -> generate dispatcher -> register in settings.json\n/skill-kit trigger list        # List registered triggers\n/skill-kit trigger dry-run     # Preview only\n```\n\nDeclare `triggers` in SKILL.md -> auto-generate hook scripts -> auto-register in settings.json.\n\n[Detailed guide](./trigger.md)\n\n### Find (Discover via npx skills)\n\n```bash\n/skill-kit find <query>        # Search the open skills ecosystem via npx skills CLI\n```\n\nSearches the [skills.sh](https://skills.sh/) leaderboard and ecosystem for installable skills. Use when looking for an existing skill rather than building one from scratch.\n\n[Detailed guide](./find.md)\n\n## Success Case\n\n**Scenario (2026-03-09)**:\n- Found 3 openclaw-related functions\n- Proposed 3 options for merging\n- Result: Implementation success, user satisfied\n\n**Key factors**:\n1. Identification of 3 functions\n2. \"Merge?\" AskUserQuestion\n3. Merging skills using skill-writer (multi-topic)\n\n## Ralph Mode (AskUserQuestion bypass)\n\nIf `.ralph/` directory exists, operate in Ralph Mode.\n\n**Workflow Change**:\n\n| Step | User Interaction | Workflow |\n| ---- | ---------------- | -------- |\n| Step 1: Auto-detect | AskUserQuestion (multiSelect) | Summary info to `.ralph/improvements.md` |\n| Step 1.5: Merge logic / Structure | - | improvements.md recording |\n| Step 2: Requirements | AskUserQuestion | Trigger/scope recommendation to improvements.md |\n| Step 3: Type recommendation | Recommend only | improvements.md recording |\n| Step 4: Implementation | Direct action | **PROHIBITED** - Use `[NEEDS_REVIEW]` tag |\n| Step 5: Validation | Validation | **Auto validation** (after changes are complete) |\n\n## Self-Improvement\n\nAfter changes are complete, **Self-improve based on conversation**:\n\n1. Identify failure and workaround patterns\n2. If candidates found, run `/skill-kit upgrade skill-kit`\n\nFile v0.11.0:README.md\n\n# skill-kit\n\nClaude Code skill authoring and management — create, lint, merge, upgrade, and route skills, plus multi-topic architecture, dependency-graph, and publishing tooling.\n\n## Installation\n\n```bash\nnpx skills add es6kr/skills --skill skill-kit\n```\n\nBrowse on ClawHub: <https://clawhub.ai/skills/skill-kit>\n\n### Peer skills\n\n`skill-kit` depends on `cc-plugin` and `clawhub` (a companion skill for ClawHub publishing). Install the published peer:\n\n```bash\nnpx skills add es6kr/skills --skill cc-plugin\n```\n\n## Usage\n\nInvoke with `/skill-kit <topic>` (for example `/skill-kit lint`). See [`SKILL.md`](./SKILL.md) for the full topic list.\n\nFile v0.11.0:_meta.json\n\n{\n  \"ownerId\": \"kn74k8yfvftx6f062qa8fzyd8h8373jd\",\n  \"slug\": \"skill-kit\",\n  \"version\": \"0.11.0\",\n  \"publishedAt\": 1791543255004\n}\n\nFile v0.11.0:architecture.md\n\n# Multi-Topic Skill Architecture\n\nDefine the directory structure for skills with multiple related topics.\n\n## When to Use\n\n- Creating a new skill with multiple sub-topics\n- Merging related skills into one\n- Organizing complex skills with separate guides\n\n## Directory Structure\n\n```\n~/.claude/skills/{skill-name}/\n├── SKILL.md          # Unified frontmatter + topic references\n├── {topic1}.md       # First topic content (no frontmatter)\n├── {topic2}.md       # Second topic content (no frontmatter)\n└── scripts/          # Shell/Python scripts called by topics (optional)\n    ├── {script}.sh\n    └── {script}.py\n```\n\n### File Roles\n\n| File | Purpose |\n|------|---------|\n| `SKILL.md` | Entry point with frontmatter, overview, and topic index |\n| `{topic}.md` | Detailed guide for specific topic (no frontmatter) |\n| `scripts/` | Reusable scripts referenced from topic files |\n\n### scripts/ Rules\n\n- **All scripts executed by the skill must be inside `scripts/`** — no external path references\n- Scripts must be permanent files (no tmp paths)\n- Reference scripts from topic files using relative paths: `bash scripts/run.sh`\n- If using scripts outside the skill (`~/Sync/...`, `/usr/local/...`) → copy into `scripts/` first\n\n## SKILL.md Template\n\n```yaml\n---\nname: {skill-name}\ndescription: {unified description}. {topic1} - {desc1}, {topic2} - {desc2}. \"{trigger1}\", \"{trigger2}\" triggers\n---\n\n# {Skill Name}\n\n{Common theme description}\n\n## Topic Dispatch\n\n**When this skill is invoked with a topic specifier (e.g., `/{skill-name} {topic1}` or `Skill(\"{skill-name}\", \"{topic1}\")`), load and follow only the matching topic file (`{topic1}.md`). Do not echo the Topics table or summarize other topics in the response.** The Topics table below is an index for invocations without a topic specifier — it is not user-facing output when a topic is named.\n\n## Topics\n\n| Topic | Description | Guide |\n|-------|-------------|-------|\n| {topic1} | {description} | [{topic1}.md](./{topic1}.md) |\n| {topic2} | {description} | [{topic2}.md](./{topic2}.md) |\n\n## Quick Reference\n\n### {Topic1}\n\nBrief summary of topic1.\n\nSee [detailed guide](./{topic1}.md).\n\n### {Topic2}\n\nBrief summary of topic2.\n\nSee [detailed guide](./{topic2}.md).\n```\n\n## Topic File Template\n\nTopic files contain only content (no frontmatter):\n\n```markdown\n# {Topic Title}\n\n{Detailed guide content}\n\n## When to Use\n\n{Specific use cases for this topic}\n\n## Instructions\n\n{Step-by-step guidance}\n\n## Examples\n\n{Concrete usage examples}\n```\n\n## Naming Conventions\n\n| Element | Convention | Example |\n|---------|------------|---------|\n| Skill directory | lowercase, hyphens | `argocd-helm` |\n| Topic files | lowercase, hyphens, `.md` | `cleanup.md`, `oci.md` |\n| SKILL.md | Uppercase | `SKILL.md` |\n\n## Description Format\n\nFor multi-topic skills, use this description pattern (no markdown links to save tokens):\n\n```\n{Overall purpose}. {topic1} - {brief desc} [{file}], {topic2} - {brief desc} [{file}]. \"{trigger1}\", \"{trigger2}\" triggers\n```\n\nExample:\n```yaml\ndescription: ArgoCD Helm chart management. cleanup - clean Helm metadata [cleanup.md], oci - add OCI registry charts [oci.md]. \"argocd helm\", \"helm metadata\", \"OCI helm\" triggers\n```\n\n## Topic Dispatch Behavior\n\nWhen a multi-topic skill is invoked with a topic specifier, the LLM must load the matching topic file directly and avoid echoing the SKILL.md Topics table back to the user. Exposing the full topic index is noise when the user has already named a specific topic.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | List the full Topics table in chat when the user typed `/skill-name topic` | Read `{topic}.md` and execute its instructions; the Topics table stays internal |\n| 2 | \"Topic was specified, but here are the other topics for context…\" preamble | No preamble. Begin executing the topic's procedure or answering directly |\n| 3 | Treat the SKILL.md Topics table as part of the user-facing response | The Topics table is an index for topic-less invocations only |\n| 4 | Re-read SKILL.md every turn even after the topic is resolved | After dispatching, work from the topic file contents until topic changes |\n\n### Required SKILL.md Section\n\nEvery multi-topic SKILL.md must include a `## Topic Dispatch` section placed **immediately above the Topics table**. Copy the directive verbatim, replacing `{skill-name}` and `{topic1}` with concrete values:\n\n```markdown\n## Topic Dispatch\n\n**When this skill is invoked with a topic specifier (e.g., `/{skill-name} {topic1}` or `Skill(\"{skill-name}\", \"{topic1}\")`), load and follow only the matching topic file (`{topic1}.md`). Do not echo the Topics table or summarize other topics in the response.** The Topics table below is an index for invocations without a topic specifier — it is not user-facing output when a topic is named.\n```\n\n### When the Topics Table IS Surfaced\n\nThe Topics table remains the right answer in exactly these cases:\n- The user invokes the skill without a topic (e.g., `/skill-name` alone) and needs to discover available topics\n- The user explicitly asks \"what topics does this skill have?\"\n- The user requests an overview or comparison across topics\n\n### Integration with Other Topics\n\n- **writer**: When generating a new multi-topic SKILL.md, insert the `## Topic Dispatch` section above the Topics table by default\n- **upgrade**: When upgrading an existing multi-topic skill that lacks the section, add it as part of the upgrade procedure\n- **lint**: Verify that every multi-topic SKILL.md contains the `## Topic Dispatch` heading; emit a warning if missing\n\n## Data Store Pattern\n\nSkills that maintain persistent state use a `data/` directory for JSON/cache files.\n\n### Structure\n\n```text\n~/.claude/skills/{skill-name}/\n├── SKILL.md\n├── {topic}.md          # Read/write logic for data files\n├── data/               # Persistent state (JSON, cache)\n│   └── {name}.json\n└── scripts/            # Optional automation scripts\n```\n\n### When to Use\n\n- Skill needs to remember state across sessions (e.g., published versions, mappings)\n- Data is too dynamic for static .md content but too small for a database\n- Multiple topics share the same data source\n\n### Rules\n\n| Rule | Rationale |\n|------|-----------|\n| `data/` only stores JSON/plain text | Keep parseable, no binaries |\n| Topics that modify data must update `data/` in the same step | Prevent stale cache |\n| Add `data/` to `.clawhubignore` if publishing | User-specific state should not be distributed |\n| Include an `updatedAt` field in JSON | Track freshness |\n\n### Example: clawhub skill\n\n```text\nclawhub/\n├── SKILL.md\n├── deploy.md         # Writes to data/published.json after publish\n├── status.md         # Reads from data/published.json\n├── data/\n│   └── published.json  # { \"updatedAt\": \"...\", \"skills\": [...] }\n└── scripts/\n    └── check-slugs.sh\n```\n\n### Example: next skill (hook locale pattern)\n\nWhen a hook script needs locale-specific match patterns (Korean, Japanese, etc.) but must stay language-neutral when published, separate the patterns into `data/*.regex` files and load them at runtime:\n\n```text\nnext/\n├── SKILL.md\n├── stall-detect.md\n├── resources/\n│   └── next-trigger.sh        # 100% English; loads data/*.regex at runtime\n├── data/                      # git-ignored AND publish-ignored\n│   ├── en.regex\n│   └── ko.regex\n├── .gitignore                 # data/\n└── .clawhubignore             # .gitignore, data/, *.tmp\n```\n\nHook script loader pattern:\n\n```bash\nDATA_DIR=\"$(dirname \"$0\")/../data\"\nif compgen -G \"$DATA_DIR/*.regex\" > /dev/null 2>&1; then\n  PATTERN=$(cat \"$DATA_DIR\"/*.regex | sed 's/#.*$//' | awk 'NF' | paste -sd'|' -)\nelse\n  PATTERN='Fix complete:|✅|all done|task complete'   # built-in English fallback\nfi\necho \"$LAST_TEXT\" | grep -qiE \"$PATTERN\" && ...\n```\n\nEach `*.regex` file uses `#` for comments, one alternation entry per line. Users can add their own locale file (e.g., `ja.regex`, `zh.regex`) without forking the script. The fallback ensures the hook works on fresh installs without a `data/` directory.\n\n| Pattern Type | When to Use |\n|--------------|-------------|\n| State cache (clawhub) | Persistent JSON state that scripts/topics read/write |\n| Locale data (next) | Functional input data that should not be distributed but should remain extensible by end users |\n\n### Integration with Other Topics\n\nWhen creating/upgrading skills with a data store:\n- **writer**: Ask if the skill needs persistent state → create `data/` directory\n- **upgrade**: When adding a topic that produces state, add `data/` and a corresponding read topic\n- **lint**: Verify `data/*.json` files are valid JSON\n\n## Best Practices\n\n1. **Keep topics focused**: Each topic file should cover one specific capability\n2. **Cross-reference**: Link between related topics when relevant\n3. **Consistent structure**: Use similar headings across topic files\n4. **Index in SKILL.md**: Always maintain the Topics table for discoverability\n\nFile v0.11.0:CHANGELOG.md\n\n# Changelog\n\n## [0.11.0](https://github.com/es6kr/skills/compare/skill-kit-v0.10.0...skill-kit-v0.11.0) (2026-10-06)\n\n\n### Features\n\n* **hook-kit:** declarative step-dependency enforcement engine ([9e3d188](https://github.com/es6kr/skills/commit/9e3d18898453d20a947b74b24032e61bf13bc297))\n\n\n### Bug Fixes\n\n* **skill-kit:** generalize invoke-discipline §1 beyond slash-command receipt ([#602](https://github.com/es6kr/skills/issues/602)) ([6508508](https://github.com/es6kr/skills/commit/65085089effbde0dd1ea0c2a68090614545a7928))\n\n## [0.10.0](https://github.com/es6kr/skills/compare/skill-kit-v0.9.0...skill-kit-v0.10.0) (2026-09-27)\n\n\n### Features\n\n* **skill-kit:** add skill topology graph extractor, analyzer, visualizer, wiki sync, and context enricher ([#552](https://github.com/es6kr/skills/issues/552)) ([0472c23](https://github.com/es6kr/skills/commit/0472c2323d0990ddc13669b2b7843171b85e2c7e))\n\n## [0.9.0](https://github.com/es6kr/skills/compare/skill-kit-v0.8.1...skill-kit-v0.9.0) (2026-09-20)\n\n\n### Features\n\n* **skill-kit:** implement SkillSpector static linter and security scanner (green) ([720d0f3](https://github.com/es6kr/skills/commit/720d0f314295da4b098cc4727e93352653aab17d))\n\n\n### Bug Fixes\n\n* **skill-kit:** document SkillSpector static analysis and security scanner in lint.md ([#514](https://github.com/es6kr/skills/issues/514)) ([fe60edb](https://github.com/es6kr/skills/commit/fe60edbe17715d1b4eb83b7148757f4808527768))\n* **skill-kit:** fix SkillSpector detection gaps and correct its own doc ([0c43ca3](https://github.com/es6kr/skills/commit/0c43ca3b7be8ec99afd231ca0a575a210025ca8c))\n* **skill-kit:** replace pipe to shell pattern with safe installer download in lint.md ([4bd5371](https://github.com/es6kr/skills/commit/4bd53719572fed09b8a1a7a97ba2b9536c74c0b2))\n\n## [0.8.1](https://github.com/es6kr/skills/compare/skill-kit-v0.8.0...skill-kit-v0.8.1) (2026-09-18)\n\n\n### Bug Fixes\n\n* **cleanup:** make the session-end report table self-sufficient ([#487](https://github.com/es6kr/skills/issues/487)) ([c4a0255](https://github.com/es6kr/skills/commit/c4a02557fb8de3b32cf337c549f62535dabf824b))\n\n## [0.8.0](https://github.com/es6kr/skills/compare/skill-kit-v0.7.1...skill-kit-v0.8.0) (2026-08-29)\n\n\n### Features\n\n* promote next-feat batch (backlog skill, hooks JS port, git-repo doctor, pre-push guard) ([0d76a4c](https://github.com/es6kr/skills/commit/0d76a4c01180fbdc78bfeec8dea91373b4912470))\n* **skill-kit:** support exclude_content in trigger-compile and add unit tests ([f4400ef](https://github.com/es6kr/skills/commit/f4400ef586a666d9e16e001e84011bf1ec675425))\n\n\n### Bug Fixes\n\n* address CodeRabbit and Copilot review feedback on PR [#385](https://github.com/es6kr/skills/issues/385) ([e94de34](https://github.com/es6kr/skills/commit/e94de34ce5e075c79b7edc5d672813cea94a0acc))\n* address CodeRabbit and Copilot review feedback on PR [#389](https://github.com/es6kr/skills/issues/389) ([db4dfff](https://github.com/es6kr/skills/commit/db4dfff2829632bf263d93e0bbfdd1244772a5b2))\n* **hook-kit:** document --json mode and scope WSCFG_* to hook scripts ([373634c](https://github.com/es6kr/skills/commit/373634c022b0e2b114a3bbb799bb9a8934c9fbb2))\n* **hook-kit:** resolve RAG receiver from workspace config instead of mandating --rag ([58e85ec](https://github.com/es6kr/skills/commit/58e85ecbb437557544cd528281aa30b804bd2532))\n* **hook-kit:** resolve RAG receiver from workspace config instead of mandating --rag ([1412773](https://github.com/es6kr/skills/commit/1412773466d11354eca7521e4351faa5a78d9081))\n* **hook-kit:** scope PR-URL bare-ref check to per-number match, allow force-push in worktrees ([dd50dce](https://github.com/es6kr/skills/commit/dd50dced989eed4847daaf9a0cd4be12a04426e1))\n* promote next-fix batch (task plugin split, claudify matcher, pr recheck, omz chezmoi fix) ([3e90fd5](https://github.com/es6kr/skills/commit/3e90fd56ade0522d6773eb03f38760a317dd5180))\n* **review:** apply copilot review feedback on hooks and test suites ([cba86f4](https://github.com/es6kr/skills/commit/cba86f4ebbf274a0c979ab21aeea6d483f8cb8f3))\n* **skills:** finish the config-resolution sweep for receiver dispatch ([c188d44](https://github.com/es6kr/skills/commit/c188d44de268ef169070dedee525b2a483e57b40))\n\n\n### Refactor\n\n* **hooks:** port check-completed-bloat and wip-task-complete-detect to Node.js ([7097526](https://github.com/es6kr/skills/commit/7097526ca208c3106b38a3ac5c317d0eb49eff30))\n* **hooks:** sync hook registry, enhance bash-guard, and retire obsolete guards ([15d4a58](https://github.com/es6kr/skills/commit/15d4a58752d0d458f88c86cb41c537f90e3ca4dd))\n\n## [0.7.1](https://github.com/es6kr/skills/compare/skill-kit-v0.7.0...skill-kit-v0.7.1) (2026-08-26)\n\n\n### Bug Fixes\n\n* promote next-fix batch (consolidate fabrication guard, session rewind, config-driven PR base) ([7ca0ccb](https://github.com/es6kr/skills/commit/7ca0ccbf13cefafedc33a16a7361756c95f8b8f6))\n* **skill-kit:** resolve upgrade PR base from works-config staging role, not hardcoded main ([#362](https://github.com/es6kr/skills/issues/362)) ([c7a8c45](https://github.com/es6kr/skills/commit/c7a8c45d28be511fa7e645d00fe49050f1d14ba0))\n\n## [0.7.0](https://github.com/es6kr/skills/compare/skill-kit-v0.6.3...skill-kit-v0.7.0) (2026-08-20)\n\n\n### Features\n\n* promote next-feat staging (lifecycle guards, triage automation, and workflow safety procedures) ([77d58ac](https://github.com/es6kr/skills/commit/77d58ac3a771a4897043c9eea8b149ea1e8ba2ff))\n\n## [0.6.3](https://github.com/es6kr/skills/compare/skill-kit-v0.6.2...skill-kit-v0.6.3) (2026-08-17)\n\n\n### Bug Fixes\n\n* promote next-fix staging (30 fixes across 14 skills) ([ee467c0](https://github.com/es6kr/skills/commit/ee467c045d779d7b80d30f160763ec3534a9742b))\n* **skill-kit:** remove incorrect skill- prefix from commit-scope convention ([3e96181](https://github.com/es6kr/skills/commit/3e96181f5b1d15e96a60455f2c921cb37b9bd902))\n* **skill-kit:** translate locale-pattern rationale lines to English ([8cd45a1](https://github.com/es6kr/skills/commit/8cd45a10424b9b5154a57a85a99dd71602b75b4a))\n* **wip:** cross-ref PR-URL and TaskCreate subject repo-qualifier rules ([#186](https://github.com/es6kr/skills/issues/186)) ([4982364](https://github.com/es6kr/skills/commit/49823641a7b08123ebd0325273892bee41bc3280))\n\n## [0.6.2](https://github.com/es6kr/skills/compare/skill-kit-v0.6.1...skill-kit-v0.6.2) (2026-08-09)\n\n\n### Bug Fixes\n\n* declare undeclared skill-to-skill dependencies (7 skills) ([#271](https://github.com/es6kr/skills/issues/271)) ([36a9f9d](https://github.com/es6kr/skills/commit/36a9f9d7c1fac9bb1c4c96b325a067ab92ad0da7))\n* PR [#195](https://github.com/es6kr/skills/issues/195) review findings batch 2 (github-repo/skill-kit/commit-tidy/hook-kit) ([#264](https://github.com/es6kr/skills/issues/264)) ([d8d9df0](https://github.com/es6kr/skills/commit/d8d9df04bdf178fffa6822c44199a416668c6423))\n* promote accumulated next-fix fixes to main ([95656e9](https://github.com/es6kr/skills/commit/95656e9b551ee0bb77904a0a571d49c53bc01cc9))\n\n## [0.6.1](https://github.com/es6kr/skills/compare/skill-kit-v0.6.0...skill-kit-v0.6.1) (2026-08-05)\n\n\n### Bug Fixes\n\n* **hook-kit,skill-kit:** widen context-gate under-offer trigger + new-skill ready-ask gate ([#221](https://github.com/es6kr/skills/issues/221)) ([c127c72](https://github.com/es6kr/skills/commit/c127c72f3271826dffaced8d9442bf4f30f718d6))\n* promote next-fix staging (38 fixes across 16 skills) ([94f8c33](https://github.com/es6kr/skills/commit/94f8c33800ce411ae63e22c5259cdae8435508a4))\n* **skill-kit:** add explicit-ask axis to new-skill publication-readiness gate ([f7eb58d](https://github.com/es6kr/skills/commit/f7eb58d1fc2556f2526a0f1992e3c83e7380d4ac))\n* **skill-kit:** add new-skill publication-readiness gate to publish-scope ([5363490](https://github.com/es6kr/skills/commit/5363490006e1d6f0ca2c6187559bdeb2225aa1e6))\n* **skill-kit:** require relative paths for a skill's own bundled-script references ([#212](https://github.com/es6kr/skills/issues/212)) ([ff965f2](https://github.com/es6kr/skills/commit/ff965f26dfa21c3296a7aa09805633a9faaada69))\n* **wip:** cross-ref PR-URL and TaskCreate subject repo-qualifier rules ([#186](https://github.com/es6kr/skills/issues/186)) ([951c1e6](https://github.com/es6kr/skills/commit/951c1e6871e78e226757c6a7ae5ae53efeb7bfb0))\n\n## [0.6.0](https://github.com/es6kr/skills/compare/skill-kit-v0.5.0...skill-kit-v0.6.0) (2026-07-28)\n\n\n### Features\n\n* bundle next-feat — fix-plan expansion, next reactive guard, github-repo extraction ([#195](https://github.com/es6kr/skills/issues/195)) ([cd65a85](https://github.com/es6kr/skills/commit/cd65a8519c88f080321d746ef197e90713039fa6))\n\n\n### Bug Fixes\n\n* **skill-kit:** add skip-condition-before-recommend self-check to invoke-discipline ([0f27fa0](https://github.com/es6kr/skills/commit/0f27fa01379790b56d0cebfbaee3142627218348))\n* **skill-kit:** add skip-condition-before-recommend self-check to invoke-discipline ([9e6503f](https://github.com/es6kr/skills/commit/9e6503f282251094b0eec69c6b207464362040cf))\n\n## [0.5.0](https://github.com/es6kr/skills/compare/skill-kit-v0.4.2...skill-kit-v0.5.0) (2026-07-23)\n\n\n### Features\n\n* **next-feat:** accumulate features for hook-kit context gate ([df4f73a](https://github.com/es6kr/skills/commit/df4f73ae4d27d4919105da70c6c94a14a32e8056))\n* **skill-kit:** add invoke-discipline topic ([5a76602](https://github.com/es6kr/skills/commit/5a76602c0ecab63fa1bff270b600dce78a8628bf))\n* skills topic bundle — brief/email, code-workflow/plan-research-search, git-repo topics, skill-kit/invoke-discipline ([7fd877d](https://github.com/es6kr/skills/commit/7fd877da1b703fcdcdcaf1a3ce912f885abfa3f0))\n\n## [0.4.2](https://github.com/es6kr/skills/compare/skill-kit-v0.4.1...skill-kit-v0.4.2) (2026-07-16)\n\n\n### Bug Fixes\n\n* **consolidate,fix-plan:** promote next-fix staging (review hardening + periodic archive) ([24726e9](https://github.com/es6kr/skills/commit/24726e99a5b2972f706d8749ea3a45cbc358984b))\n* **skill-kit:** support script-driven triggers and compile priority ([3670224](https://github.com/es6kr/skills/commit/367022402afab29c9aabf7084989bc6cbddc0958))\n\n\n### Documentation\n\n* add install-guide READMEs for consolidate, git-repo, skill-kit ([380db80](https://github.com/es6kr/skills/commit/380db8070a60dbfe1be29d940a6740e1119db748))\n* add install-guide READMEs for consolidate, git-repo, skill-kit ([d9bec4b](https://github.com/es6kr/skills/commit/d9bec4bb17c294a40c373c376a2f22aa0d3c04f2))\n* correct skills install command (add, not install) + superpowers namespace ([ed8fb1a](https://github.com/es6kr/skills/commit/ed8fb1ab2cd251e2395363948104bd3d3915f010))\n\n## [0.4.1](https://github.com/es6kr/skills/compare/skill-kit-v0.4.0...skill-kit-v0.4.1) (2026-07-03)\n\n\n### Bug Fixes\n\n* **skill-kit:** add quality-method routing gate + release-please-aware version rule ([1a8e786](https://github.com/es6kr/skills/commit/1a8e7862d4096f02d8e7a2b049a359dee90d0a6e))\n* **skill-kit:** update parse_slash_calls comment to reflect consolidate pr topic ([fca143d](https://github.com/es6kr/skills/commit/fca143da79a70de3ec37f374d367b2d323a5759c))\n* **skills:** patch bundle — consolidate/next/fix/skill-kit/github-flow ([3cb90cb](https://github.com/es6kr/skills/commit/3cb90cb7601f619b63518860bebfb693d58a7633))\n\n## [0.4.0](https://github.com/es6kr/skills/compare/skill-kit-v0.3.2...skill-kit-v0.4.0) (2026-06-19)\n\n\n### Features\n\n* skill-kit graph topic + harness Phase 1 + auxiliary improvements ([01437f2](https://github.com/es6kr/skills/commit/01437f2135d5729eee16f074cb77e52b3cb1772c))\n* **skill-kit:** add graph + language + portability + publish-scope topics + extract-deps script ([8bf9ea2](https://github.com/es6kr/skills/commit/8bf9ea231cbe8c76fecae08aa7ffcb20e19a7a7f))\n\n\n### Bug Fixes\n\n* bundle skill patches across github-flow, skill-kit, fix ([0ef74c1](https://github.com/es6kr/skills/commit/0ef74c14aabfbdc2f802c34b3a1b431217e95208))\n* **fix,skill-kit:** add rule-file Edit gate + undeclared vendor coupling lint ([009348b](https://github.com/es6kr/skills/commit/009348b42a41fe23e94c42c2960d0e789dcc1cbc))\n* **skill-kit,github-flow:** address CodeRabbit + Internal Review feedback on PR [#54](https://github.com/es6kr/skills/issues/54) ([c5c741d](https://github.com/es6kr/skills/commit/c5c741da5631a042860e684580d1c92687b59eec))\n* **skill-kit:** require remote ecosystem scan before authoring topics or skills ([5447153](https://github.com/es6kr/skills/commit/54471534f071f60ae5a328afdcafba8805d9785a))\n\n## [0.3.2](https://github.com/es6kr/skills/compare/skill-kit-v0.3.1...skill-kit-v0.3.2) (2026-06-13)\n\n\n### Refactor\n\n* **fix,next:** decompose oversized SKILL.md into topic files ([#51](https://github.com/es6kr/skills/issues/51)) ([525eb17](https://github.com/es6kr/skills/commit/525eb170c1c3d371c76a4b1ef8033d624cea6002))\n\n## [0.3.1](https://github.com/es6kr/skills/compare/skill-kit-v0.3.0...skill-kit-v0.3.1) (2026-06-07)\n\n\n### Bug Fixes\n\n* **git-repo,skill-kit:** pre-commit worktree matrix + external-system structure check ([7f05819](https://github.com/es6kr/skills/commit/7f058194fcf568b7cac57fd79788b20caf217ae5))\n* **git-repo,skill-kit:** strictyaml description block scalar ([#44](https://github.com/es6kr/skills/issues/44)) ([fe0da66](https://github.com/es6kr/skills/commit/fe0da66e80ee06e2e30190a4afc4c12363f0d51f))\n* **skill-kit,git-repo:** address PR [#46](https://github.com/es6kr/skills/issues/46) review findings 1-6 ([ba4592c](https://github.com/es6kr/skills/commit/ba4592c9209718bab7ba2af82f060f82a529f1e6))\n\n\n### Documentation\n\n* **skill-kit:** add External-system Structure Check + translate HARD STOP bullets ([8decdc1](https://github.com/es6kr/skills/commit/8decdc18731239fee5c9150d5ffca94e5c7c6a29))\n\n## [0.3.0](https://github.com/es6kr/skills/compare/skill-kit-v0.2.0...skill-kit-v0.3.0) (2026-05-25)\n\n\n### Features\n\n* add metadata block (author, version) to all skills ([a36d9a5](https://github.com/es6kr/skills/commit/a36d9a5f029b595847220c3cc867370c7ff30a21))\n* **ci:** add lint jobs and untrack LICENSE ([#7](https://github.com/es6kr/skills/issues/7) Phase 1) ([03a8587](https://github.com/es6kr/skills/commit/03a85872c575c6ffdf72f5ca2bdb353fdc947a73))\n* publish 6 skills, rename folders to match slugs, add skill-kit find topic ([cc9859d](https://github.com/es6kr/skills/commit/cc9859ddbb2fa87e978a0f34c2ec6d18b9573995))\n* publish 7 new skills, update 4 existing skills ([dce016d](https://github.com/es6kr/skills/commit/dce016da291f4c9da03746f8be668fa5db04e578))\n* **skill-kit:** add find topic, expand lint Don't/Do, English-only Step 3-1 ([#18](https://github.com/es6kr/skills/issues/18)) ([15a75f3](https://github.com/es6kr/skills/commit/15a75f395fd9ab8e22fb98f9a1d52bad3ef62a7e))\n* **skill-kit:** consolidate upgrade/architecture/route/lint/writer (English-only) ([#23](https://github.com/es6kr/skills/issues/23)) ([a4228ac](https://github.com/es6kr/skills/commit/a4228ac9e57e2ead898ce3a4588875826e46eda1))\n\n## [0.2.0](https://github.com/es6kr/skills/compare/skill-kit-v0.1.2...skill-kit-v0.2.0) (2026-05-24)\n\n\n### Features\n\n* **ci:** add lint jobs and untrack LICENSE ([#7](https://github.com/es6kr/skills/issues/7) Phase 1) ([03a8587](https://github.com/es6kr/skills/commit/03a85872c575c6ffdf72f5ca2bdb353fdc947a73))\n* publish 7 new skills, update 4 existing skills ([dce016d](https://github.com/es6kr/skills/commit/dce016da291f4c9da03746f8be668fa5db04e578))\n\nFile v0.11.0:convert.md\n\n# Convert Agent to Skill\n\nConverts an existing agent (.md file) into a skill structure.\n\n## Usage\n\n```bash\n/skill-manager convert <agent-name>\n```\n\n## Workflow\n\n### 1. Read Agent File\n\n```bash\n# Global agent\ncat ~/.claude/agents/<agent-name>.md\n\n# Project agent\ncat .claude/agents/<agent-name>.md\n```\n\n### 2. Conversion Rules\n\n| Agent Element | Skill Conversion |\n|-----------|-----------|\n| `name` | Keep as-is (suffix removal recommended) |\n| `description` | Add triggers keywords |\n| `tools` | Remove (skills use all tools by default) |\n| `model` | Keep (optional) |\n| Script references | Copy to `scripts/` folder, change to relative paths |\n\n### 3. Create Skill\n\nFollow the [writer.md](./writer.md) guide to create the skill structure:\n\n1. Create folder: `mkdir -p ~/.claude/skills/<skill-name>/scripts`\n2. Write SKILL.md (frontmatter + body)\n3. Copy scripts and `chmod +x`\n\n### 4. Move Original\n\nDepending on the agent file location:\n\n```bash\n# Global agent\nmv ~/.claude/agents/<name>.md ~/.claude/.bak/\n\n# Project agent\nmv .claude/agents/<name>.md .claude/.bak/\n```\n\n## Example\n\n**Before conversion (Agent)**:\n```markdown\n---\nname: syncthing-conflict-resolver\ndescription: Automatically handles Syncthing sync-conflict files...\ntools: Bash, Read\n---\n~/Sync/AI/scripts/resolve-sync-conflicts.sh\n```\n\n**After conversion (Skill)**:\n```\nskills/syncthing-conflict/\n├── SKILL.md\n└── scripts/\n    └── resolve-conflicts.sh\n```\n\n## Checklist\n\n- [ ] Read agent\n- [ ] Create skill folder + SKILL.md ([writer.md](./writer.md))\n- [ ] Copy scripts + permissions\n- [ ] Delete original\n\nFile v0.11.0:dedup.md\n\n# Skill Dedup\n\nFind user skills that duplicate plugin skills and offer cleanup options.\n\n## When to Use\n\n- After installing new plugins\n- Periodic skill inventory cleanup\n- Before creating new skills (check if already exists)\n\n## Workflow\n\n### Step 1: Get User Skill Names\n\n```bash\nls ~/.claude/skills/ | grep -v '\\.bak$'\n```\n\nExtract skill names from frontmatter:\n```bash\ngrep -h \"^name:\" ~/.claude/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u\n```\n\n### Step 2: Get Plugin Skill Names\n\n```bash\ngrep -rh \"^name:\" ~/.claude/plugins/marketplaces/*/plugins/*/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u\n```\n\n### Step 3: Find Duplicates\n\nCompare the two lists. A duplicate is when user skill name matches plugin skill name.\n\n### Step 4: Present Results\n\nShow duplicates in a concise table:\n\n| User Skill | Plugin | Status |\n|------------|--------|--------|\n| skill-name | plugin:skill-name | Backup recommended |\n| other-skill | plugin:other-skill | Already backed up |\n\nIf already in `.bak`: mark as \"Already backed up\"\n\n### Step 5: Offer Cleanup\n\nUse AskUserQuestion for duplicates not yet backed up:\n\n```\nBackup these duplicate skills to .bak folder?\n1. Backup All (Recommended) - Move to ~/.claude/skills/.bak/\n2. Select Individually - Choose which to backup\n3. Keep All - No changes\n```\n\n### Step 6: Execute Backup\n\n```bash\nmkdir -p ~/.claude/skills/.bak\nmv ~/.claude/skills/{duplicate-skill} ~/.claude/skills/.bak/\n```\n\n### Step 7: Report\n\n```\n## Deduplication Complete\n\n| Item | Count |\n|------|-------|\n| Skills checked | X |\n| Duplicates found | Y |\n| Backed up | Z |\n| Unique skills | N |\n```\n\n## Additional Checks\n\n### Similar Names\n\nAlso check for similar (not exact) matches:\n\n| User Skill | Plugin | Similarity |\n|------------|--------|------------|\n| git-commit | plugin:commit-helper | Name overlap |\n| k8s-debug | plugin:kubernetes-debug | Same purpose |\n\nRecommend review or merge.\n\n### Orphaned Backups\n\nCheck `.bak/` folder for old backups:\n\n```bash\nls ~/.claude/skills/.bak/\n```\n\nOffer cleanup:\n```\nClean up old backup folders?\n1. Delete All (Recommended) - Remove ~/.claude/skills/.bak/*\n2. Keep - Preserve for recovery\n```\n\n## Integration with Lint\n\nWhen running `/skill-manager lint`:\n\nIf duplicates detected during scan:\n```\n💡 Found 3 potential duplicates with plugins.\n   Run dedup? /skill-manager dedup\n```\n\n## Notes\n\n- Backups go to `~/.claude/skills/.bak/`\n- Plugin skills take precedence (maintained upstream)\n- User customizations should be merged into project skills\n- Review backup folder periodically\n\nFile v0.11.0:find.md\n\n# Find Skills\n\nDiscover and install skills from the open agent skills ecosystem using the Skills CLI (`npx skills`).\n\n## When to Use\n\n- User asks \"how do I do X\" where X might have an existing skill\n- \"find a skill for X\", \"is there a skill for X\"\n- \"can you do X\" where X is a specialized capability\n- User wants to extend agent capabilities with new tools/workflows\n\n## Skills CLI\n\nThe Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem.\n\n**Key commands:**\n\n```bash\nnpx skills find [query]              # Search for skills\nnpx skills add <owner/repo@skill>    # Install a skill (-g for global, -y to skip confirm)\nnpx skills check                     # Check for updates\nnpx skills update                    # Update all installed skills\n```\n\n**Browse skills at:** https://skills.sh/\n\n### Search Source Priority\n\nSeveral CLIs can search the open ecosystem. Use this order:\n\n| Source | Command | Status | Use as |\n|--------|---------|--------|--------|\n| Skills CLI | `npx skills find <q>` | active | **primary** — non-interactive, parseable output, install counts |\n| ClawHub | `Skill(\"clawhub\", \"find <q>\")` | active | secondary — different registry; slug/publish workflow |\n| context7 skills | `npx ctx7 skills search <q>` | **deprecated** | avoid — prints \"Skill commands are deprecated and will stop working in the next major release\"; interactive UI truncates to ~8 rows even with stdin closed |\n\n**Default = `npx skills find`** — active, non-interactive (parseable), the canonical\nSkills CLI. Use it for the `route` topic's 2b remote search. `ctx7 skills search`\nexposes richer `Trust ★` + `Popularity` columns, but being deprecated + interactive\nit is a one-off manual cross-check at best, never the automated default.\n\n## Workflow\n\n### 1. Understand the Need\n\nIdentify:\n1. The domain (e.g., React, testing, design, deployment)\n2. The specific task (e.g., writing tests, creating animations, reviewing PRs)\n3. Whether a skill likely exists for this\n\n### 2. Check the Leaderboard First\n\nCheck the [skills.sh leaderboard](https://skills.sh/) before running a CLI search. Top skills include:\n- `vercel-labs/agent-skills` — React, Next.js, web design (100K+ installs)\n- `anthropics/skills` — Frontend design, document processing (100K+ installs)\n\n### 3. Search for Skills\n\n```bash\nnpx skills find [query]\n```\n\nExamples:\n- \"how do I make my React app faster?\" → `npx skills find react performance`\n- \"can you help me with PR reviews?\" → `npx skills find pr review`\n- \"I need to create a changelog\" → `npx skills find changelog`\n\n### 4. Verify Quality Before Recommending\n\n**Do not recommend based solely on search results.** Verify:\n\n1. **Install count** — Prefer 1K+ installs. Be cautious under 100.\n2. **Source reputation** — Official sources (`vercel-labs`, `anthropics`, `microsoft`) are more trustworthy.\n3. **GitHub stars** — Repos with <100 stars should be treated with skepticism.\n\n### 5. Present Options\n\nShow the user:\n1. Skill name and description\n2. Install count and source\n3. Install command\n4. Link to learn more at skills.sh\n\n### 6. Install\n\n```bash\nnpx skills add <owner/repo@skill> -g -y\n```\n\n`-g` installs globally (user-level), `-y` skips confirmation. **Note**: global install path may collide with ClawHub-installed skills under `~/.claude/skills/`. Prefer per-project install (`npx skills add ... ` without `-g`) when a same-named skill already exists from ClawHub.\n\n## Common Skill Categories\n\n| Category        | Example Queries                          |\n| --------------- | ---------------------------------------- |\n| Web Development | react, nextjs, typescript, css, tailwind |\n| Testing         | testing, jest, playwright, e2e           |\n| DevOps          | deploy, docker, kubernetes, ci-cd        |\n| Documentation   | docs, readme, changelog, api-docs        |\n| Code Quality    | review, lint, refactor, best-practices   |\n| Design          | ui, ux, design-system, accessibility     |\n| Productivity    | workflow, automation, git                |\n\n## When No Skills Are Found\n\n1. Acknowledge no existing skill was found\n2. Offer to help directly with general capabilities\n3. Suggest creating their own skill with `npx skills init`\n\nFile v0.11.0:graph.md\n\n# Skill Graph Extraction\n\nExtract skill dependency edges (frontmatter `depends-on` + topic body `Skill(...)` calls) for a given skill set, then render as Mermaid and optionally dispatch to a force-directed d3 receiver.\n\n## When to Use\n\n- Visualize how skills cross-reference each other before plugin bundling decisions\n- Audit cluster boundaries as companion to `cc-plugin/clustering`\n- Generate a dependency diagram for documentation deliverables\n- Detect outside-set edges (candidate → non-candidate) that signal vendor/pin candidates\n\n## Inputs\n\n| Input | Form | Example |\n|-------|------|---------|\n| Skill set | list of slugs or `~/.claude/skills/<slug>` paths | `code-workflow github-flow consolidate` |\n| `--render=<skill>:<topic>` (optional) | abstract dispatch contract for d3 receiver | `--render=es6kr:force-graph` |\n| `--scope=topic\\|skill\\|both` (optional) | edge granularity (default: `both`) | `--scope=skill` |\n\n## Procedure\n\n### Step 1: Run extract-deps or extract_skill_graph script\n\n```bash\n# Canonical Python Labeled Property Graph extractor (recommended):\npython3 ~/.claude/skills/skill-kit/scripts/extract_skill_graph.py --skills-dir ~/.claude/skills --output /tmp/graph.json\n\n# Or per-slug bash script:\nbash ~/.claude/skills/skill-kit/scripts/extract-deps.sh <slug...> > /tmp/edges.json\n```\n\nThe script:\n\n1. Resolves each slug to `~/.claude/skills/<slug>/` (falls back to `~/.agents/skills/<slug>/`).\n2. Parses **frontmatter `depends-on`** (both inline `[a, b]` and YAML block `- name` forms — both must be supported).\n3. Greps every `.md` body (SKILL.md included, frontmatter stripped) for two reference forms:\n   - `Skill(\"<name>\", ...)` calls\n   - `/<name>` slash invocations (word-boundary anchored to avoid matching path segments like `org/repo` or `repos/{owner}/issues`)\n4. Filters common false positives (GitHub API URL words like `issues`/`orgs`/`pulls`, generic frontmatter keys, shell paths).\n5. Dedups (`source > target`) across frontmatter + body so a target referenced both ways emits once.\n6. Emits `{nodes, edges}` JSON to stdout. Each edge carries `{source, target, kind, source_file}` where `kind ∈ {\"depends-on\", \"solid\", \"outside\"}`.\n\n### Step 1b: Analyze graph topology (cycles, blast radius, clustering)\n\n```bash\n# Detect cycles (exits with code 1 if cycles are found for CI gates):\npython3 ~/.claude/skills/skill-kit/scripts/skill_graph_analyzer.py --input /tmp/graph.json --cycles\n\n# Calculate blast radius for a target skill before refactoring:\npython3 ~/.claude/skills/skill-kit/scripts/skill_graph_analyzer.py --input /tmp/graph.json --blast-radius tdd\n\n# Community clustering recommendations for plugin bundling:\npython3 ~/.claude/skills/skill-kit/scripts/skill_graph_analyzer.py --input /tmp/graph.json --clusters\n```\n\n**Why both Skill() AND slash?** Frontmatter `depends-on` is the declared contract but body coupling often outweighs it. Real-world example: `consolidate` declares `depends-on: [superpowers, git-repo]` yet has very-strong body coupling with `github-flow` (`github-flow/merge.md` invokes `Skill(\"consolidate\", \"pr-review\")` as MANDATORY; `consolidate/next.md` routes to `/github-flow epic-bundle`). Without body-ref extraction, the resulting graph silently misses the strongest edge.\n\n### Step 2: Build Edge Table\n\nRender the JSON as a Markdown table for the documentation deliverable:\n\n```markdown\n| From | To | Trigger | Source |\n|------|-----|---------|--------|\n| skill-a | skill-b | frontmatter depends-on | SKILL.md L6 |\n| skill-a/topicX | skill-b/topicY | Skill() call | topicX.md L42 |\n| skill-a (in-set) → | external-skill (outside) | outside-set bundle signal | SKILL.md L7 |\n```\n\n### Step 3: Mermaid render (always)\n\nEmit a `flowchart TD` block. Group nodes by skill via Mermaid `subgraph`:\n\n```markdown\n\\`\\`\\`mermaid\nflowchart TD\n    subgraph A[skill-a]\n        a_topic1[topic1]\n        a_topic2[topic2]\n    end\n    subgraph B[skill-b]\n        b_topic1[topic1]\n    end\n    a_topic1 --> b_topic1\n\\`\\`\\`\n```\n\n### Step 4: Optional d3 force-directed render (dispatch or standalone)\n\n**Canonical standalone HTML generator:**\n```bash\n# Render self-contained HTML visualizer with search, blast radius highlighting, and weight slider:\npython3 ~/.claude/skills/skill-kit/scripts/render_skill_graph.py --input /tmp/graph.json --output /tmp/graph.html\n\n# Open in browser:\nopen /tmp/graph.html\n```\n\n**Caller-supplied dispatch flag** — `--render=<skill>:<topic>` lets the caller decide which receiver owns the d3 template.\n\n```bash\n/skill-kit graph <slugs> --render=<receiver-skill>:<receiver-topic>\n```\n\nWhen the flag is supplied, the graph topic invokes the receiver with the edges JSON. The receiver owns the HTML template, force-tuning controls, and convex-hull rendering. **Do NOT hardcode a specific receiver name** — see `portability` Rule B (Generic skills must expose abstract dispatch, not vendor-specific calls).\n\nWhen the flag is omitted, the procedure stops at the Mermaid + Edge Table deliverable.\n\n### Step 5: Outside-set surfacing (HARD STOP)\n\nEdges where `source ∈ input set` and `target ∉ input set` are **outside-set bundle signals** — not cluster expansion. Emit them in a separate table so the caller can decide vendor vs. cross-plugin pin per `cc-plugin/clustering` outside-set rule:\n\n```markdown\n| Outside edge | Source skill | Decision |\n|--------------|--------------|----------|\n| git-repo → commit-tidy | git-repo (frontmatter depends-on) | vendor / pin / drop |\n```\n\n### Step 6: Sync to LLM-Wiki (Dual-SSOT Bridge)\n\nAuto-project computed topological metrics, cycle audits, and blast radius rankings into the knowledge layer:\n\n```bash\npython3 ~/.claude/skills/skill-kit/scripts/sync_wiki_graph.py --input /tmp/graph.json --wiki-dir ~/ghq/github.com/es6kr/llm-wiki\n```\n\nGenerates or updates `pages/ops/skill-topology-matrix.md` with:\n- Summary counts (nodes, edges, cycles, clusters)\n- High-impact skills ranking by blast radius\n- `PAIR_OF_INTERNAL` equivalence table\n- Preserved initial `created` date with updated `last_modified`\n\n### Step 7: GraphRAG Dynamic Context Enrichment\n\nBridges vector search (`skill-search` / Qdrant) with graph topology to generate enriched agent context:\n\n```bash\n# Enrich a single skill with dependencies, callers, blast radius, and equivalence pair:\npython3 ~/.claude/skills/skill-kit/scripts/enrich_skill_context.py --skill consolidate --format banner\n\n# Output:\n# [Graph Context] Skill: consolidate | Dependencies: [git-repo, github-flow, hook-kit, superpowers] | Blast Radius: 0\n```\n\nSuppresses outside-set edges silently misses bundle decisions — always surface, never drop.\n\n## Don't / Do\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | Hardcode a specific render receiver (e.g., `es6kr:force-graph`) in graph topic body | Use abstract `--render=<skill>:<topic>` dispatch — caller chooses the receiver (Rule B of `portability`) |\n| 2 | Limit `depends-on` parser to inline `[a, b]` form only | Support both inline AND YAML block (`- name`) forms — both occur in published skills |\n| 3 | Stop at depends-on; ignore topic body `Skill(...)` calls | Both depends-on (skill-level) and `Skill(...)` (topic-level) are edges; topic-granularity reveals hub-and-spoke patterns invisible at skill-level |\n| 4 | Render Mermaid with topic-granularity nodes for skills not in the input set | Outside-set edges = bundle signal — emit separately in their own table for vendor/pin decision |\n| 5 | Add the graph topic without running `route.md` Step 2b remote-search first | New topic additions must clear the remote-search gate to detect existing published skills with the same capability |\n| 6 | Treat `Skill(\"<slug>\", ...)` and `Skill(\"<slug>:<topic>\", ...)` calls as different edge kinds | Both forms target the same skill; topic specifier is metadata, not a separate edge |\n\n## Self-check (HARD STOP — before invoking)\n\n1. Did you run `/skill-kit find <keyword>` and confirm no published skill already covers this capability? (per `route.md` Step 2b)\n2. Are edges enumerated from BOTH frontmatter `depends-on` AND topic body `Skill(...)` calls?\n3. If d3 render is requested, is it dispatched via the abstract `--render=<skill>:<topic>` flag (not a hardcoded receiver call)?\n4. Are outside-set edges surfaced in a separate table rather than silently dropped?\n5. Are both inline AND YAML block `depends-on` forms covered by your test inputs?\n\n## Outputs\n\n| Output | Always | When `--render` |\n|--------|--------|------------------|\n| Edge Table (Markdown) | ✅ | ✅ |\n| Mermaid `flowchart TD` block | ✅ | ✅ |\n| Outside-set table | ✅ | ✅ |\n| d3 force-directed graph (via receiver) | — | ✅ |\n\n## Related\n\n- `route.md` — Step 2b remote-search procedure (HARD STOP gate before adding new topics)\n- `portability.md` — Rule B abstract dispatch contract for generic skills\n- `cc-plugin/clustering` — plugin-level membership clustering reuses the same edge extraction\n- `find.md` — npx skills CLI discovery (primary remote-search receiver)\n\n## Example invocation\n\n```bash\n# Mermaid + Edge Table only\n/skill-kit graph code-workflow github-flow tdd\n\n# With d3 force-directed render dispatched to a force-graph receiver\n/skill-kit graph code-workflow github-flow tdd consolidate --render=es6kr:force-graph\n\n# Skill-level scope only (skip topic body grep)\n/skill-kit graph code-workflow github-flow --scope=skill\n```\n\nFile v0.11.0:invoke-discipline.md\n\n# Skill Invoke Discipline — slash command, multi-topic, and dispatch rules\n\nDiscipline rules for invoking skills correctly: slash command → Skill tool, multi-topic topic Read, post-decision auto-invoke, interactive script execution, and vendor dispatch.\n\n## 1. Any route to a skill's procedure — inject, or a self-identified need — requires a Skill tool call (HARD STOP)\n\nSystem auto-injecting SKILL.md content on `<command-name>/<slug></command-name>` input ≠ Skill tool call completion. Inject = text exposure in context only. The procedure execution obligation starts only with a `Skill` tool call.\n\nThe same separation holds when a skill's procedure is needed for a reason other than slash-command receipt — most commonly, recognizing mid-task that some skill's documented steps apply to the current goal. Reading that skill's topic `.md` (via `Read`/`Grep`) to learn \"how to do X\" is not a substitute for calling `Skill(name, topic)` first, for the same reason inject isn't: having the text in context is not the same act as declaring procedure-entry intent through the tool call.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | See SKILL.md content from slash command inject → judge \"skill loaded\" → skip tool call + do inline procedure | Call `Skill(\"<slug>\", \"<args>\")` in the same response turn after inject. Inject = text exposure; tool call = procedure start signal — they are separate acts |\n| 2 | Assume \"inject = equivalent to tool call\" | Inject = system shows SKILL.md. Tool call = author's explicit act declaring procedure entry intent. No tool call trace = cause for `fix` in next turn |\n| 3 | Avoid tool call thinking \"calling Skill again would duplicate SKILL.md exposure, inefficient\" | Duplicate exposure is system design — not the author's responsibility domain. Tool call is the forcing function for procedure start |\n| 4 | See inject text and perform Edit/Bash etc. procedure inline directly | Inline before tool call = rule violation. Skill call → return → start from Step 1 is the correct path |\n| 5 | Recognize mid-task (no slash command involved) that a skill's documented procedure applies, then `Read`/`Grep` its topic `.md` directly to learn the steps and act on them | Call `Skill(\"<name>\", \"<topic>\")` the moment that need is recognized, in the same turn — regardless of whether a slash command triggered the need |\n\n### Self-check (immediately after slash command input, or immediately after recognizing a skill's procedure is needed)\n\n1. Does the user's previous input contain `/<slug>` or `<command-name>/<slug></command-name>` pattern? → If match, this rule applies\n2. Did I just recognize, through my own task reasoning rather than a slash command, that some skill's documented procedure applies here? → If yes, this rule applies equally\n3. Does the same response turn include a `Skill(\"<slug>\", ...)` tool call? → If no, call immediately (inline procedure, or Reading the topic file directly, is forbidden before that call)\n4. Even if system injected SKILL.md content, tool call is a separate obligation — inject body is for reference only\n5. After tool call returns SKILL.md, re-read and start from Step 1\n\n## 2. Multi-topic skill — each topic `.md` Read before step execution (HARD STOP)\n\nIn multi-topic skills with a Topics table + Quick Reference + \"Step execution order\" in SKILL.md, the **Quick Reference is an index (index), not the procedure body**. The actual procedure for each step is in the topic `.md` file — **must Read the topic `.md` before executing that step**.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | After `Skill(\"consolidate\", ...)` returns, read Quick Reference → immediately run gh query + inline Edit + self-authored Summary | Follow \"Step execution order\" in Quick Reference, **sequentially Read** each topic — `pr.md` Read → execute Steps 1·2·2.4·2.5·2.6·2.7 → `collect.md` Read → execute Step 3 → ... to final step |\n| 2 | Look at Topics table + Quick Reference only and judge \"understood the procedure\" | Topics table is an index. Procedure body is in each topic `.md`. Inferring procedure without Read = skill bypass |\n| 3 | Read only some topics and skip rest as \"contextually understood\" | Read **all** topics listed in \"Step execution order\" in order. Skip = partial procedure omission |\n| 4 | Not aware of skip until user says \"/cmd wasn't called, was it?\" | Self-check \"Have I Read this step's topic.md?\" before each step execution |\n| 5 | Write self-authored Summary format based on Quick Reference one-liner (\"Step 7 Post Summary\") | Read `post.md` → apply the Summary template/Don't-Do/self-check stated there directly |\n| 6 | On a repeat invocation of the same skill+topic later in the session (e.g., a Stop hook re-triggers a skill call it triggered earlier), skip the topic `.md` Read because \"I already read it earlier this session, I remember the command\" | Read the topic `.md` again on **every** invocation, regardless of how recently it was read in this same session. In-session memory of a command is not a substitute for re-verifying against the authoritative doc — the doc may have changed, or memory may silently drift from the actual current syntax |\n\n### Self-check (immediately after every multi-topic skill call)\n\n1. Does the returned SKILL.md have a Topics table + \"Step execution order\"? → Yes = multi-topic skill\n2. Was the first topic in \"Step execution order\" read with the Read tool? → No → read immediately\n3. After reading the first topic, were the step procedures inside followed? — Quick Reference one-liner ≠ topic body\n4. Before entering the next step, was the next topic read? — repeat per step\n5. After all steps complete, was the final topic (usually next.md etc.) also read + applied?\n6. **Is this a repeat invocation of a skill/topic already read earlier in this same session?** → Read it again anyway. \"I read this topic before in this session\" is not a valid reason to skip the Read on a later invocation\n\n### Multi-topic skill identification signals\n\nAt least 1 of these in SKILL.md:\n- `## Topics` or `## Commands` table (Topic / Description / Guide row structure)\n- \"Step execution order\" or topic execution sequence text\n- Topic Dependencies diagram\n- `## Quick Reference` that summarizes each topic in 1-2 lines\n\nIf any match, this rule applies. Single-topic skills (SKILL.md only, no topic files) are exempt.\n\n## 3. Post-decision skill topic auto-invocation (HARD STOP — ask bypass forbidden)\n\n**Immediately after a user selects an option / direction is confirmed, if the next procedure is mapped to a skill topic, calling the `Skill` tool is the #1 priority.** After a confirmed decision, asking \"shall we enter the next procedure?\" via AskUserQuestion again is forbidden.\n\n### When to apply\n\n| Decision moment | Next procedure | Skill topic to call |\n|----------------|---------------|---------------------|\n| Fix direction (A/B/C/D) confirmed (code change PR needed) | GitHub issue registration | `Skill(\"github-flow\", \"register\")` |\n| Option D / implementation entry confirmed | issue → branch → implement | `Skill(\"github-flow\", \"register\")` → follow procedure |\n| After PR consolidate + merge decision | merge procedure | `Skill(\"github-flow\", \"merge\")` |\n| After external feedback response confirmed | consolidate procedure | `Skill(\"consolidate\", \"pr-review\")` |\n| After plan approved (no issue exists) | plan → issue conversion | `Skill(\"github-flow\", \"plan-to-issue\")` |\n| After review feedback apply confirmed | code fix + summary update | `Skill(\"github-flow\", \"review-apply\")` |\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | After Option D confirmed, re-present \"issue register + implement / issue only / hold\" AskUserQuestion | Call `Skill(\"github-flow\", \"register\")`. The topic procedure handles redundant confirmation, body writing, and entry decision |\n| 2 | After decision, ask \"shall we enter the next step?\" | Decision = intent to proceed expressed. If next procedure maps to a skill topic, call it. ask only when there are **real branch points** (hold vs different direction) |\n| 3 | Skip checking if skill topic exists → bypass with ask | Self-check immediately after decision: \"Does this next procedure map to a skill topic?\" — confirm with `Glob ~/.claude/skills/<domain>/*.md` |\n| 4 | \"Topic has another ask inside, let me ask ahead of time\" reasoning | Topic-internal ask is part of the procedure — after calling the topic, let it ask on its own |\n| 5 | Optionize procedure entry itself (\"issue register + implement\" as a choice) | State in option description \"(after deciding, github-flow register will be called automatically)\". Only diverging branches (hold / different direction) are real options |\n\n### Self-check (immediately after every direction/option decision)\n\n1. Did the user select an option or is a direction confirmed? (Yes/No)\n2. If yes, what is the next procedure? — state clearly in one sentence\n3. Does that procedure map to a skill topic? — check the table above + `Glob ~/.claude/skills/<domain>/<topic>.md`\n4. If mapped → **call `Skill` immediately**. Re-calling AskUserQuestion forbidden\n5. If not mapped or a real branch (hold etc.) → AskUserQuestion allowed. But options must be **real branches only**\n\n## 4. Interactive script execution (HARD STOP)\n\n**If a skill has scripts (`scripts/*.sh`), script call is #1 priority.** Even if interactive (`read`, `select`, interactive prompt) and cannot run from Bash, don't abandon the script.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | Script is interactive so can't run → manually substitute find/grep/rm | Guide user to run `! bash <script-path> <args>` |\n| 2 | \"Doesn't work in Bash, I'll do it manually\" decision | `!` prefix = Claude Code feature for user to run interactive commands directly in session |\n| 3 | Enter manual procedure without user confirmation | AskUserQuestion: \"script `!` run vs manual handling\" — only enter manual path after confirmation |\n\n## 5. Generic skill vendor dispatch resolution\n\nWhen a generic skill exposes dispatch flags (`--<verb>=<skill>:<topic>` form), the binding comes from the **workspace bindings config**, not from a caller-typed flag and not from an environment scan. Resolve it with `bash <hook-kit-skill>/resources/workspace-config.sh --export` and read the exported `WSCFG_<ROLE>_*` values.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | Demand a flag, warn, or block because the caller omitted one | The flag is an optional per-call override. Its absence is never an error |\n| 2 | Probe the environment (MCP tool list, endpoint healthchecks) to guess a receiver | Read the resolved binding. The config is the single source of truth |\n| 3 | Read `kind: none` as \"something is missing\" | `kind: none` = the role is deliberately unconfigured → skip quietly and continue |\n| 4 | Pick a vendor default when the config resolves none | No binding = no dispatch. The primary deliverable (the file write) still stands |\n| 5 | Hardcode a vendor endpoint or collection name inside the generic skill | Keep vendor detail in the config so a swap is a one-line edit; the skill only consumes `WSCFG_*` |\n\n### Resolution procedure\n\nBefore calling a generic skill:\n\n1. `bash <hook-kit-skill>/resources/workspace-config.sh --export`\n2. Read `WSCFG_<ROLE>_KIND` for the role in question (`RAG`, `BACKLOG`, `CHECKLIST`, …)\n3. Branch:\n   - unset / `none` / resolver unavailable → skip quietly, no warning, no ask\n   - set → dispatch using the accompanying `WSCFG_<ROLE>_*` values\n   - caller passed an explicit `--<verb>=<skill>:<topic>` → that override wins\n\n**Self-check**: resolver consulted / `kind: none` treated as a quiet skip / no environment guessing / no flag demanded of the caller.\n\n## 6. Verify a skill's own skip/precondition checks before recommending its action (HARD STOP)\n\n**Before offering or recommending a skill's documented action as a next step (e.g., \"run Internal Review\", \"merge now\"), check that skill's own skip-condition / precondition section first.** Recommending an action, then discovering later that its own procedure would have skipped it, means the recommendation was composed from the action's name alone rather than from its actual applicability this turn.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | Recommend \"run Internal Review\" on a PR, then read the reviewing skill's Step 2 skip conditions afterward | Read the skip-condition section first (e.g., draft-PR check) — only recommend the action if none apply |\n| 2 | Assume a skill's action always applies because it worked the same way last time | Skip conditions are evaluated per invocation (draft state, prior artifacts, branch policy) — re-check every time, not from memory |\n| 3 | Treat \"the skill will catch it if it doesn't apply\" as sufficient | The skill catching it after the fact still cost a wasted recommendation + user decision cycle. Check before offering, not after |\n\n### Self-check (before composing any AskUserQuestion or report that recommends invoking a skill's specific procedure)\n\n1. Does the target skill document skip conditions / preconditions for this action? Grep for a \"Skip Condition\" / \"Step 2\" / precondition section — in the relevant **topic file** for a multi-topic skill, or directly in **SKILL.md** for a single-topic (SKILL.md-only) skill. Don't assume a separate topic file exists; check whichever file actually documents the action.\n2. Have you verified those conditions against the current state (not assumed from a prior session or a similar-looking case)?\n3. If a skip condition applies, do not offer the action — state the blocked reason instead, or route to the skill's actual next applicable step.\n4. If step 1 finds **no documented precondition at all** (neither a topic file nor SKILL.md defines one for this action), that is not the same as \"no precondition applies\" — it means the skill's own author never specified one. Proceed with the recommendation, but note in the recommendation that no precondition check exists for this action (so the user can catch a case the skill itself doesn't guard against).\n\nFile v0.11.0:language.md\n\n# Language — Skill language = SKILL.md frontmatter `description` language (HARD STOP)\n\n**Every skill file (SKILL.md, topic .md, resources/*) is written in the same language as the SKILL.md frontmatter `description` field.** If description is English, all topic and resource files are English; if Korean, all are Korean. No per-Edit publish-target matching needed — the frontmatter description line alone decides.\n\n**`description` field itself must be a single language (HARD STOP)**. English skills allow **zero Korean keywords** in description (including trigger keywords). Korean skills may include English technical terms (Vault, ArgoCD, K3s, etc.) but the main description prose is Korean. No \"mixed\" exception.\n\n| Skill language (per description first sentence) | description body | description trigger keywords |\n|------|------|------|\n| English skill | English only | English only (zero Korean keywords) |\n| Korean skill | Korean only | Korean primary + English allowed only for proper nouns/technical terms (e.g., \"Vault\", \"ArgoCD\") |\n\n## Don't / Do table (description itself)\n\n| # | Don't | Do |\n|---|-------|-----|\n| A | Add any non-English trigger keyword to an English skill's description (e.g., adding a Korean translation/synonym of an existing English keyword) | Use English-only trigger keywords. Non-English users can still match via the English keywords |\n| B | \"Adding just one Korean keyword lets Korean users trigger the skill\" thinking | The system reminder exposes the full description to English speakers too. Even one Korean keyword breaks description consistency + wastes the truncate budget |\n| C | locale-duplicate with \"core nouns are OK\" (the previous weak lint.md rule) | English skill = zero Korean. Even a core noun applicable to both locales gets one English keyword only |\n| D | Korean skill description lists English trigger keywords with equal weight | Korean skills keep Korean keywords as primary. English is restricted to proper nouns/technical terms |\n\n## Don't / Do table (skill body)\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | Match against publish target / LICENSE presence / skill catalog before Edit | Check the SKILL.md first line `description:` language → write in that language |\n| 2 | \"It's a mixed file, so it's ambiguous\" thinking | frontmatter description is the primary criterion. Even if Korean sections exist in the body, the description language is the enforced answer |\n| 3 | \"Existing Korean is there, so new additions can be Korean too\" | If description is English, existing Korean is a mistake. Write new additions in English + queue existing Korean for a separate English conversion task |\n\n## Self-check (every time before editing a skill file)\n\n1. Confirm the description line with `head -5 <SKILL.md>` or `Grep \"^description:\" <SKILL.md>`\n2. description in English → write English. In Korean → write Korean\n3. If the body is mixed, the description language is the source of truth (mixed = partial stale signal)\n4. **Prior-task language ≠ skill description language — self-check (HARD STOP — prevents recurrence)**: Even if the prior N actions (e.g., posting a Korean PR correction comment / updating a Korean fix_plan / posting a Korean inline review) were all in Korean, if the skill file's description language is English, write in English. \"Context inertia\" is the most common bypass pattern\n\n## Context inertia trap (HARD STOP)\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | Write the new skill section in the same language as the prior N actions | Re-check the description before any skill Edit → reset every Edit (prior task language is irrelevant) |\n| 2 | \"PR comment was Korean, fix_plan was Korean, inline review was Korean → skill addition is Korean too\" mapping | Per-medium language rules are independent: medium language (PR / fix_plan / inline) is decided separately from skill file language |\n| 3 | \"Body has one Korean section already, so mixing is fine\" rationalization | A Korean section in the body = stale signal. description language is the answer. New additions follow description language |\n| 4 | \"Just this one section in Korean, will convert to English later\" deferral | Write in English at addition time. Deferral = permanent mix + higher cleanup cost |\n\n**Self-check trigger keywords** (re-check description before every skill Edit if any of these apply):\n\n- The prior response wrote/posted Korean text (PR comment, fix_plan entry, inline review body, etc.)\n- The prior response wrote/posted English text (GitHub PUBLIC repo issue/PR body, etc.)\n- The Edit target file path contains \"skills/\", `~/.claude/skills/`, or `~/.agents/skills/`\n- new_string contains a markdown section (`###`, `####`, `|` table)\n\n## Exceptions\n\n- Korean skill description's **proper nouns / technical terms** (Vault, ArgoCD, K3s, Authentik, etc.) — keep English as-is\n- English skill description's **proper nouns / product names** (no Korean transliteration/translation added)\n- description must be single-language (mixing deprecated)\n- If a description language change is needed, decide separately (per skill publish policy)\n\n## Hook installed\n\n- Script: `~/.agents/skills/hook-kit/resources/edit-guard.sh` — function `check_skill_language_mismatch()` (consolidated from the retired standalone `block-skill-language-mismatch.sh`, now in `~/.claude/.bak/`)\n- Registration: PreToolUse:Edit and PreToolUse:Write matchers in `~/.claude/settings.json` reference `edit-guard.sh` directly (no separate install copy)\n- Scope: only `.md` files under `*/skills/<name>/`. Code/data files unaffected\n- Detection: zero Hangul in SKILL.md `description` → strict mode (any Hangul in `NEW_CONTENT` → DENY exit 2). Hangul in description → permissive (Korean skills may include English technical terms)\n- Quote handling: user quotes must be paraphrased into English before pasting into English skill files. The hook does not distinguish quote vs body content\n\n### Untracked-file audit gap (HARD STOP for hook migration)\n\n`check_skill_language_mismatch()` fires only at PreToolUse:Edit/Write — it does not scan pre-existing untracked files. A file written under a **hook migration gap** (old standalone retired → new consolidation not yet active) persists indefinitely as untracked Korean in an English skill dir. Detect and remediate via:\n\n1. Any hook migration (retiring or renaming a guard hook) must **grep the replacement location for the guard function/logic** before retiring the old script. Emit the grep result in the migration commit body\n2. `check-hangul.py` `.md` scan already covers untracked files at commit time — but only when at least one file in the same skill dir is staged, so orphan untracked drift can persist across sessions\n3. Session-start or periodic audit — enumerate every English skill dir and grep newer-than-`SKILL.md` `.md` files for the Hangul range U+AC00–U+D7A3 (the range used by `check_skill_language_mismatch` in `edit-guard.sh`). Any match = drift candidate for review\n\n## PUBLIC repo locale-pattern externalization — `data/` folder (HARD STOP)\n\nWhen a PUBLIC repo skill needs Korean detection regex or locale-specific keyword matching (e.g., a Hangul-text-detection hook, Korean keyword alternation), **do NOT inline it in the skill body**. Externalize to **`<skill>/data/*.regex`**.\n\n### Why\n\n- PUBLIC repos enforce English (the repository language rule + `check-hangul` lint)\n- But some hooks must detect Korean phrasing in user input (e.g., Korean keywords for merge/issue/complete) to function\n- Inlining gets blocked by lint. An `# check-hangul: allow` inline marker still leaves Korean in the PUBLIC repo — not a clean solution\n- `data/` folder registered in `.gitignore` + `.clawhubignore` → **zero Korean in PUBLIC repo**, locale data preserved locally\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|----|\n| 1 | Inline Korean detection regex in hook body (`*.sh`/`*.md`) → `check-hangul` blocked | Externalize locale data to `data/*.regex` + hook `source`s it at runtime |\n| 2 | `# check-hangul: allow` inline marker to bypass lint (Korean still in PUBLIC) | data/ externalization (zero Korean in PUBLIC) |\n| 3 | Leave `data/` unregistered in `.gitignore` → tracked and pushed to PUBLIC | Register `data/` in both `.gitignore` and `.clawhubignore` |\n| 4 | Hook crashes on missing data file (`unbound variable`) | `${VAR:-english-default}` fallback — silent no-op or English-only matching when locale data absent |\n| 5 | Use `.sh` / `.md` extension for data file → scanned by `check-hangul` | Use `.regex` / `.txt` / `.conf` or any extension outside `SCAN_EXTS` |\n\n### Self-check (before adding/modifying a hook in a PUBLIC skill)\n\n1. Does the hook contain Korean detection regex or locale-specific keywords?\n2. Yes → separate to `<skill>/data/<purpose>.regex`. Confirm `data/` registered in `.gitignore` + `.clawhubignore`\n3. Hook uses `. \"$HG_DATA_FILE\"` to source + `${VAR:-english-default}` fallback\n4. Verify `python3 scripts/check-hangul.py skills/<skill>` passes (zero matches)\n5. Confirm data file does not appear in `git status --short skills/<skill>/`\n\nFile v0.11.0:lint.md\n\n# Skill Lint\n\nValidate and fix SKILL.md frontmatter issues automatically.\n\n## Scan Paths\n\n1. `~/.claude/skills/` - Personal skills\n2. `~/.claude/plugins/marketplaces/*/plugins/*/skills/` - Plugin skills\n3. `.claude/skills/` - Project skills\n\n## Validation Rules\n\n### Common Fields (Ordered)\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name:` | **Yes** | Skill name (must match directory) |\n| `description:` | **Yes** | Description + trigger keywords. **Length ≤ 1024 chars** (see below) |\n\n### Description Length Budget (HARD STOP)\n\n**`description` field must be ≤ 1024 characters.** Claude Code's system reminder truncates descriptions beyond the limit, dropping trigger keywords at the tail — which causes skill discovery failures.\n\n**Measure** (3-layer fallback — first available wins):\n\n```bash\n# Layer 1 (preferred — uses upstream YAML parser, exits cleanly on all frontmatter shapes)\nDESC=$(skills-ref read-properties <skill-dir> 2>/dev/null | jq -r '.description // \"\"')\n\n# Layer 2 (when skills-ref unavailable but Python+PyYAML present)\nDESC=$(python3 -c \"\nimport yaml\nparts = open('SKILL.md').read().split('---', 2)\nprint(yaml.safe_load(parts[1]).get('description','') or '', end='')\n\")\n\n# Layer 3 (awk fallback — block-scalar aware, exits on next top-level key or end of frontmatter)\nDESC=$(awk '\n  BEGIN { fm=0; in_desc=0 }\n  /^---$/ { fm++; if (fm==2) exit; if (in_desc) exit; next }\n  fm==1 {\n    if (in_desc) {\n      if (/^[A-Za-z_][A-Za-z0-9_-]*:/) exit          # next top-level key terminates block scalar\n      sub(/^  /, \"\"); printf \"%s\", $0; next\n    }\n    if (/^description:[[:space:]]*\\|/)  { in_desc=1; next }\n    if (/^description:[[:space:]]/)     { sub(/^description:[[:space:]]*/,\"\"); printf \"%s\", $0; exit }\n  }\n' SKILL.md)\n\necho \"len: ${#DESC}\"\n# Expected: ≤ 1024. If over → truncate or split topics.\n```\n\n**Why 3-layer (HARD STOP — historical bug)**: A naive `awk '/^description:/,/^---$/' SKILL.md | sed -E 's/^description: //; /^---$/d'` works **only when `description:` is the LAST key in the frontmatter**. If any other key (`depends-on`, `triggers`, `metadata`, `allowed-tools`) follows `description:`, that key's value is also captured and the measured length is inflated. The 3-layer fallback above (a) uses `skills-ref` which delegates to the upstream YAML parser (most accurate), (b) Python `yaml.safe_load` (parser-correct), (c) an awk that terminates at the next top-level key (boundary-aware). Pick the first layer whose dependency is available — do not fall back to the naive range pattern.\n\n**Reduction strategies (in priority order)**:\n\n| # | Strategy | Example |\n|---|----------|---------|\n| 1 | Compress `Use when` keyword list | Remove redundant synonyms (e.g., \"session ID\", \"current session\", \"session id\" → keep one) |\n| 2 | Shorten topic descriptions to ≤ 40 chars each | `list - enumerate current-project sessions (UUID + mtime + size)` → `list - enumerate sessions` |\n| 3 | Drop locale-duplicate keywords | If English and Korean keywords overlap meaning, keep one per concept |\n| 4 | Move detail to topic .md files | Topic .md files are unbounded — push verbose explanations there, keep description terse |\n\n**Don't / Do table (HARD STOP — derived from 5 cumulative violators 2026-05-23)**:\n\n| # | Don't (overweight pattern) | Do (canonical compression) | Real violation case |\n|---|---------------------------|---------------------------|---------------------|\n| 1 | Append new topic description without measuring current length | `wc -c` or awk-length check before Edit; if `current + new > 1024`, compress first | claude-session: 1480 → 1547 over limit |\n| 2 | Locale-mix in description (English skill with non-English keywords, or vice versa) | Single locale only. **English skill = 0 non-English keywords** (no \"core noun\" exception). Non-English skill = native keywords primary, English allowed only for proper nouns/technical terms (Vault, ArgoCD, K3s, etc.). See `opensource.md` \"Skill language = description language\" HARD STOP | ralph: an English keyword paired with two transliterated synonyms (`\"ralph update\"+\"ralph <update-localized>\"+\"ralph <latest-localized>\"`) → If ralph is an English skill, keep only the English form. If localized, keep only one localized form. No mix. |\n| 3 | Multiple English synonym variants for the same action | One canonical verb + one canonical noun. No `\"X fix\"+\"fix X\"+\"update X\"+\"modify X\"` chains | skill-kit: `\"skill upgrade\"+\"skill fix\"+\"fix skill\"+\"update skill\"` → `\"skill upgrade\"` only |\n| 4 | Topic description over 40 chars or with Step numbers / parenthetical context | Topic description = `<topic> - <one-liner ≤ 40 chars>`. Move Step numbers / nested context to topic .md | consolidate: `internal - Step 3.5 Internal Code Review fallback (CodeRabbit Free walkthrough only / Copilot failure) + Step 4.5 UI capture verification` → `internal - CodeRabbit fallback review` |\n| 5 | Append `[filename.md]` to topic descriptions | Topics table already has the file path. description has topic + one-liner only | github-flow: 8x `[xxx.md]` removed (~100 chars saved) |\n| 6 | Verbose prose context inside description (full sentences, \"Applies to...\" paragraphs) | description = one-line skill purpose + topic enumeration + Use when. Prose belongs in topic .md or SKILL.md body | code-workflow: `Applies to all tasks requiring code changes... TDD (Red→Green→Refactor) is applied by default... For GitHub repos, github-flow is the default companion...` → removed (~300 chars saved) |\n| 7 | Localized keyword conjugation variants (multiple inflections of the same concept, e.g. \"tidy\"+\"sync\"+\"items\" all referring to the same fix_plan operation) | One canonical conjugation per concept (usually `noun + verb-stem` or a single verb) | ralph: 5 conjugated variants of \"fix_plan tidy/sync/items/done-move/Completed-move\" → keep only `\"fix_plan tidy\"` (one canonical form). The unused variants were inflectional duplicates of the same intent |\n| 8 | Mix other frontmatter fields (`allowed-tools:`, `depends-on:`) into description text | Each YAML field on its own line. description ends before next field | consolidate: `triggers.allowed-tools: [Agent...]depends-on: [superpowers]` mixed into description tail — separate to own fields |\n| 9 | Trust system reminder display (\"looks fine to me\") | System reminder truncates with `…`. Always measure with `wc` or awk every Edit | claude-session: `\"sess…\"` truncate confirmed in system reminder |\n\n**Self-check (every time before Edit on `description:` field)**:\n1. Measure current length (3-layer fallback — `skills-ref read-properties` → `python yaml.safe_load` → boundary-aware awk; **never** use the legacy `/^description:/,/^---$/` range pattern alone — it over-counts when `description:` is not the last frontmatter key)\n2. Estimate new length after Edit\n3. If `> 1024`, apply reduction strategies #1~4 + Don't/Do patterns #1~9 first\n4. Re-measure after Edit. Confirm ≤ 1024\n5. Verify Topics table is the authoritative source for `[filename.md]` references — description should NOT repeat them\n\n**Violation cases (cumulative — system-wide non-compliance)**:\n- 2026-05-23 (1st flagged): `claude-session` 1547 chars after `list` topic added → user pointed it out\n- Pre-existing violations (cumulative): `github-flow` 2116, `ralph` 1506, `code-workflow` 1269, `consolidate` 1187, `skill-kit` 1091 — all over 1024. Strengthen this rule + run `/skill-kit lint --fix` across skills to bring under limit\n\n### `description:` value must use `|` block scalar when it contains a colon (HARD STOP)\n\nThe strict YAML parser used downstream (e.g. `skills-ref validate`) treats an unquoted `:` followed by whitespace as the start of a new mapping. When this appears inside the `description:` value — most commonly via phrases like `Use when: \"...\"`, `workflow: inventory, ...`, or any localized variant such as a topic-list prefix followed by `:` — the parser raises:\n\n```\ninvalid YAML: mapping values are not allowed in this context at line N column M\n```\n\nThe skill is then silently skipped from registration (\"Skipped loading N skill(s) due to invalid SKILL.md files\"), even though Claude Code's lenient parser would have accepted the same file.\n\n**The rule**: whenever `description:` contains a `:` followed by whitespace (i.e. anything that *looks* like a YAML mapping start), wrap the value in a `|` block scalar so the parser treats every following line as multi-line literal text.\n\n#### Don't / Do\n\n> **Notation note**: `\\|` in the table cells below is **markdown table-cell escaping** for the literal YAML pipe character. In actual YAML frontmatter, type the unescaped `|` (see the Canonical form snippet below for a copy-pasteable example).\n\n| # | Don't (forbidden) | Do (correct alternative) |\n|---|-------------------|--------------------------|\n| 1 | `description: ... Use when: \"keyword 1\", \"keyword 2\" ...` (inline scalar with unquoted `:`) | `description: \\|` on its own line, then the description body indented two spaces. The body may keep its `:` characters verbatim |\n| 2 | \"Claude Code parses it fine, so it must be valid YAML\" | Claude Code's parser is lenient; strict parsers like `strictyaml` (used by `skills-ref validate`) are stricter. Validate against the strict parser, not the lenient one |\n| 3 | Quote the whole value with `\"...\"` to dodge the parser error | Escaping nested quotes inside an already quote-heavy description (`\"Use when: \\\"keyword\\\"\"`) is fragile. The `\\|` block scalar form has no escaping requirement |\n| 4 | Strip the `:` (rewrite `Use when:` as `Use when`) to silence the parser | Information loss. Use `\\|` block scalar instead and keep the colon |\n| 5 | Apply `\\|` only when the lint already failed | Apply preemptively whenever the description contains `: ` (colon-space). Avoids the \"fail → fix → re-validate\" cycle |\n\n#### Canonical form\n\n```yaml\n---\nname: <skill>\ndescription: |\n  One-line skill purpose. Topics — a (foo), b (bar). Use when: \"trigger 1\", \"trigger 2\" triggers.\nmetadata:\n  author: <author>\n  version: \"0.1.0\"\n---\n```\n\nThe `|` literal block scalar starts on the same line as `description:`; the body lives on the following indented lines (2 spaces is conventional). `metadata:` follows the description block scalar at the same top-level indent — `description: |` plus its indented body ends cleanly when the next non-indented key (`metadata:`) starts. `metadata:` is included here because the host loader's allowlist accepts it and 20/20 published skills use it — omitting it from the canonical example causes new skills to be written without it.\n\n#### Self-check (every time before Edit on `description:` field)\n\n1. Does the new `description:` value contain `: ` (colon followed by whitespace) anywhere in the body? — grep for `: ` inside the staged value\n2. If yes, is the value already on a `|` block scalar? — verify the line containing `description:` ends with `|` and the body is indented\n3. If not, convert to `|` block scalar before saving\n4. After saving, run `skills-ref validate <SKILL.md>` (or equivalent strict-YAML check) — confirm the file parses\n\n#### Violation cases (2026-06-04)\n\nThree skills failed `skills-ref validate` simultaneously, with **two distinct strictyaml error families** at play. The lint rule above addresses the **colon-in-scalar** family. `git-repo` also exhibited a separate **flow-mapping** family — listed below for completeness so a future diagnosis does not collapse the two into one cause.\n\n| Skill | strictyaml error column | Error family | Offending text |\n|-------|-------------------------|--------------|----------------|\n| `ralph` | line 3, col 687 | colon-in-scalar | `description:` body contained `Use when: \"ralph update\", ...` |\n| `git-repo` (cause A) | line 6, col 810 | colon-in-scalar | `description:` body contained `worktree - unified worktree acquisition workflow: inventory, reuse inactive, or create new ...` |\n| `git-repo` (cause B) | line 4 (frontmatter) | flow-mapping (separate family) | `depends-on: [commit-tidy]` — strictyaml rejects JSON-flavored flow mappings in frontmatter. Fixed by converting to block-style list (`depends-on:` then `  - commit-tidy` on the next indented line) |\n| `rule-kit` | line 2, col 170 | colon-in-scalar | `description:` body contained a Korean topic-list label (a single Korean word) immediately followed by `: a (...), b (...), c (...), d (...)` — same `<label>: <comma-list>` parser shape as the cases above, just with a non-ASCII label |\n\nThe colon-in-scalar family was fixed by converting `description:` to `description: \\|` and leaving the body's colons untouched. The flow-mapping family is orthogonal and is fixed by converting `[...]` and `{...}` shorthands to block style. The lint rule above codifies the colon-in-scalar family so the same break does not have to be diagnosed three more times for three more skills; the flow-mapping family is a separate scope-expansion candidate.\n\n### Invalid Fields\n\n| Invalid | Correct | Action |\n|---------|---------|--------|\n| `tools:` | `allowed-tools:` | Rename field |\n| `trigger:` | (remove) | Move keywords to description |\n| `triggers:` | (remove) | Move keywords to description |\n| `<example>` in description | (remove) | `<example>` is agent-only syntax. Remove from skills. |\n\n### Frontmatter Field Order (Canonical Order)\n\nFrontmatter fields follow this order for readability. lint --fix will reorder automatically.\n\n```yaml\n---\nname:                      # 1. Required (skill identifier)\ndescription:               # 2. Required (block scalar `|` when body contains `:`)\nmetadata:                  # 3. Author/version metadata (20/20 published skills use it)\ndepends-on:                # 4. Dependencies\ntriggers:                  # 5. Hook triggers\nallowed-tools:             # 6. Optional\nagent:                     # 7. Optional\ncontext:                   # 8. Optional\nhooks:                     # 9. Optional\nmodel:                     # 10. Optional\nuser-invocable:            # 11. Optional\n---\n```\n\n**Rationale**: required fields (`name`, `description`) come first because every skill has them and they are scanned first by the loader; `metadata` follows because it is structural-but-optional (almost universally used). Hook-mechanism fields (`depends-on`, `triggers`) follow; tool/agent/runtime config trails.\n\n**Order validation rules:**\n- Required fields (`name`, `description`) must precede all optional fields\n- `metadata` follows `description` (4 skills currently use `metadata → name → description` — `cc-plugin`, `commit-tidy`, `fix`, `next`; `lint --fix` normalizes to `name → description → metadata`)\n- `depends-on` follows `metadata` (or `description` directly when `metadata` is absent)\n- `triggers` follows `depends-on`\n- Optional fields should be in alphabetical order among themselves\n\n### Valid Optional Fields\n\n```yaml\nagent: general-purpose     # Agent type\nallowed-tools: [...]       # Tool restrictions\ncontext: fork              # Context handling\ndepends-on: [skill-a, skill-b]  # Dependent skill list\nhooks: {...}               # Hook configuration\nmodel: claude-sonnet-4-... # Specific model\ntriggers: [...]            # Hook trigger declarations\nuser-invocable: true       # User can invoke directly\n```\n\n### Description Rules\n\n- Max 1024 characters\n- Include \"what it does\" + \"when to use\"\n- Natural trigger keywords\n\n## Workflow\n\n### Step 0: External Validation (skills-ref CLI — Anthropic official)\n\nBefore applying the custom rules below, run Anthropic's official reference validator `skills-ref` if available. It enforces the upstream Agent Skills spec (name / description / frontmatter shape) — independent of the custom checks in this file.\n\n#### 0a. Check availability\n\n```bash\nif command -v skills-ref >/dev/null 2>&1; then\n  skills-ref --version\n  SKILLS_REF_AVAILABLE=1\nelse\n  SKILLS_REF_AVAILABLE=0\nfi\n```\n\n#### 0b. Available — run validate\n\n```bash\n# Single skill\nskills-ref validate ~/.claude/skills/<skill-name>\n\n# All personal skills\nfor d in ~/.claude/skills/*/; do\n  [ -f \"$d/SKILL.md\" ] || continue\n  echo \"=== $(basename \"$d\") ===\"\n  skills-ref validate \"$d\"\ndone\n```\n\nTreat any reported problem as a blocking issue. Re-run until the output is empty before proceeding to Step 1.\n\nProperties readout (useful for cross-referencing the Topics table):\n\n```bash\nskills-ref read-properties ~/.claude/skills/<skill-name>   # JSON: name, description, ...\n```\n\n#### 0c. Not available — install\n\nIf `command -v uv` succeeds:\n\n```bash\nuv tool install \"git+https://github.com/agentskills/agentskills.git#subdirectory=skills-ref\"\n```\n\nAfter install, `skills-ref` is on PATH (`~/.local/bin/skills-ref`) — no alias needed. Re-run Step 0a to confirm, then 0b.\n\nIf `uv` is missing:\n\n| Platform | Install uv |\n|----------|------------|\n| macOS | `brew install uv` |\n| Linux | `f=$(mktemp) && curl -LsSf https://astral.sh/uv/install.sh -o \"$f\" && sh \"$f\"; rm -f \"$f\"` |\n| Windows (PowerShell) | `irm https://astral.sh/uv/install.ps1 \\| iex` — runs in user scope, no elevation needed |\n\nIf neither `uv` nor a viable installer is available in the current environment, **skip Step 0 and proceed with Step 1** — the custom rules below provide partial coverage only (description-length budget, depends-on order, hardlink scan), not the upstream spec enforcement. **Report the skip explicitly** with a risk statement naming which upstream checks were not exercised (e.g., \"Step 0 skipped — `skills-ref` name-match and properties-JSON validation not run\").\n\n#### 0d. Upgrade\n\n```bash\nuv tool upgrade skills-ref\n```\n\n#### Why both layers\n\n| Validator | Strengths |\n|-----------|-----------|\n| `skills-ref` (upstream) | Authoritative spec enforcement (name match, description shape, properties JSON read) — tracks Anthropic's reference implementation |\n| Custom rules (Steps 1–4 below) | Description length budget (1024), depends-on alphabetical order, hardlink-aware scan, plugin/project skill paths |\n\nThe two are complementary — run both. `skills-ref` failures must be fixed before the custom rules can be trusted.\n\n### Step 1: Scan for Issues\n\n```bash\n# Missing required fields\nfind ~/.claude/skills -name \"SKILL.md\" ! -path \"*.bak*\" -exec sh -c \\\n  'head -10 \"$1\" | grep -q \"^name:\" || echo \"name missing: $1\"' _ {} \\;\n\nfind ~/.claude/skills -name \"SKILL.md\" ! -path \"*.bak*\" -exec sh -c \\\n  'head -10 \"$1\" | grep -q \"^description:\" || echo \"description missing: $1\"' _ {} \\;\n\n# Invalid fields\ngrep -r \"^triggers:\" ~/.claude/skills --include=\"SKILL.md\" | grep -v \".bak\"\ngrep -r \"^tools:\" ~/.claude/skills --include=\"SKILL.md\" | grep -v \".bak\"\n\n# Frontmatter position (must start on line 1)\nfind ~/.claude/skills -name \"SKILL.md\" ! -path \"*.bak*\" -exec sh -c \\\n  'head -1 \"$1\" | grep -q \"^---$\" || echo \"frontmatter position error: $1\"' _ {} \\;\n```\n\n### Step 2: Report Issues\n\n| File | Issue | Fix Required |\n|------|-------|--------------|\n| skill-a/SKILL.md | name: missing | Add name to frontmatter |\n| skill-b/SKILL.md | triggers: used | Remove, add to description |\n| skill-c/SKILL.md | tools: used | Change to allowed-tools: |\n\n### Step 3: Fix (with user confirmation)\n\n#### Missing Frontmatter\n\n**Before:**\n```markdown\n# My Skill\n\nDescription here.\n```\n\n**After:**\n```yaml\n---\nname: my-skill\ndescription: Description here. \"keyword1\", \"keyword2\" triggers\n---\n\n# My Skill\n```\n\n#### triggers: → description\n\n**Before:**\n```yaml\n---\nname: my-skill\ndescription: Does something useful\ntriggers:\n  - keyword1\n  - keyword2\n---\n```\n\n**After:**\n```yaml\n---\nname: my-skill\ndescription: Does something useful. \"keyword1\", \"keyword2\" triggers\n---\n```\n\n#### tools: → allowed-tools:\n\n**Before:**\n```yaml\ntools:\n  - Read\n  - Bash(git:*)\n```\n\n**After:**\n```yaml\nallowed-tools: [Read, Bash(git:*)]\n```\n\n### Step 4: Validate\n\n```bash\nhead -20 SKILL.md  # Check YAML syntax\n```\n\n## Dependency Validation (depends-on + external references)\n\n### Step A: depends-on field validation\n\n**Checks:**\n1. Verify each listed skill actually exists\n2. **Alphabetical order** — `[chezmoi, skill-manager, utcp]` (OK), `[utcp, chezmoi, skill-manager]` (NOT OK)\n\nAuto-sort if not in alphabetical order:\n\n```bash\n# Extract depends-on from all SKILL.md → verify skill existence\n# Handles BOTH inline (depends-on: [a, b]) AND block-style (depends-on:\\n  - a\\n  - b) YAML.\nfor skill_md in ~/.claude/skills/*/SKILL.md; do\n  deps=$(awk '\n    /^depends-on:[[:space:]]*\\[/ { gsub(/^depends-on:[[:space:]]*\\[|\\]$|,/, \" \"); print; exit }\n    /^depends-on:[[:space:]]*$/ { block=1; next }\n    block && /^[[:space:]]+-[[:space:]]+/ { sub(/^[[:space:]]+-[[:space:]]+/, \"\"); printf \"%s \", $0; next }\n    block && /^[^[:space:]]/ { exit }\n  ' \"$skill_md\")\n  for dep in $deps; do\n    dep=$(echo \"$dep\" | tr -d ' \"'\"'\"'')\n    [ -z \"$dep\" ] && continue\n    if [ ! -d ~/.claude/skills/\"$dep\" ] && [ ! -d .claude/skills/\"$dep\" ]; then\n      echo \"BROKEN: $(dirname $skill_md | xargs basename) depends-on '$dep' — not found\"\n    fi\n  done\ndone\n```\n\n### Step B: Skill reference validation in rules/PROMPT.md\n\nExtract `/skill-name` or `Skill(\"skill-name\"` patterns from rules, PROMPT.md, and skill topic files, then verify each referenced skill exists:\n\n```bash\n# Scan targets: ~/.agents/rules/*.md, .ralph/PROMPT.md, ~/.claude/skills/*/*.md\nSCAN_PATHS=\"$HOME/.agents/rules/*.md .ralph/PROMPT.md $HOME/.claude/skills/*/*.md\"\n\n# /skill-name pattern (slash command references)\ngrep -hoP '(?<=/)[a-z][-a-z0-9]+' $SCAN_PATHS 2>/dev/null | sort -u | while read ref; do\n  if [ ! -d ~/.claude/skills/\"$ref\" ] && [ ! -d .claude/skills/\"$ref\" ]; then\n    echo \"BROKEN_REF: /$ref — skill not found\"\n  fi\ndone\n\n# Skill(\"name\" pattern (Skill tool invocations)\ngrep -hoP 'Skill\\(\"([^\"]+)\"' $SCAN_PATHS 2>/dev/null | sed 's/Skill(\"//;s/\"//' | sort -u | while read ref; do\n  if [ ! -d ~/.claude/skills/\"$ref\" ] && [ ! -d .claude/skills/\"$ref\" ]; then\n    echo \"BROKEN_REF: Skill(\\\"$ref\\\") — skill not found\"\n  fi\ndone\n```\n\n### Step C: Report format\n\n| Source file | Reference | Status |\n|-----------|------|------|\n| `ralph/SKILL.md` | `depends-on: safe-delete` | OK / BROKEN |\n| `rules/file-operations.md` | `/safe-delete` | OK / BROKEN |\n| `.ralph/PROMPT.md` | `Skill(\"safe-delete\")` | OK / BROKEN |\n\n### Step D: Undeclared vendor-specific path coupling (HARD STOP)\n\nDetect skill body references to vendor-specific paths/workflows that are NOT declared via `depends-on`. Undeclared coupling breaks portability — the skill silently assumes the vendor wrapper is present.\n\n**Pattern**: a skill at `<scope>/skills/<X>/` references vendor paths like `.ralph/`, `.omc/`, vendor-named wrappers (`ralph improve`, `omc deploy`, etc.) without `depends-on` covering that vendor.\n\n```bash\n# Vendor paths: extend the regex as new wrappers are introduced.\n# VENDOR_PAT escapes the leading dot so the bare `grep -nE \"$VENDOR_PAT\"` body scan matches `.ralph/` etc.\nVENDOR_PAT='\\.ralph/|\\.omc/|\\.codex/|\\.ai/'\n\nfor skill_dir in ~/.claude/skills/*/ ~/.agents/skills/*/; do\n  skill_name=$(basename \"$skill_dir\")\n  skill_md=\"$skill_dir/SKILL.md\"\n  [ -f \"$skill_md\" ] || continue\n\n  # Collect declared dependencies (handles BOTH inline `[a, b]` AND block-style YAML)\n  declared=$(awk '\n    /^depends-on:[[:space:]]*\\[/ { gsub(/^depends-on:[[:space:]]*\\[|\\]$|,/, \" \"); print; exit }\n    /^depends-on:[[:space:]]*$/ { block=1; next }\n    block && /^[[:space:]]+-[[:space:]]+/ { sub(/^[[:space:]]+-[[:space:]]+/, \"\"); printf \"%s \", $0; next }\n    block && /^[^[:space:]]/ { exit }\n  ' \"$skill_md\")\n\n  # Scan body files for vendor patterns (SKIP SKILL.md — its depends-on is the declaration, not a body reference)\n  for body in \"$skill_dir\"*.md; do\n    [ \"$(basename \"$body\")\" = \"SKILL.md\" ] && continue\n    matches=$(grep -nE \"$VENDOR_PAT\" \"$body\" 2>/dev/null | grep -v -E ':[[:space:]]*(#|//|<!--)')\n    [ -z \"$matches\" ] && continue\n\n    # Determine which vendor was hit (ralph / omc / codex / ai)\n    while IFS= read -r line; do\n      line_no=$(echo \"$line\" | cut -d: -f1)\n      # Suppress when a sanitize/strip section header appears within the preceding 5 lines (informational, not structural).\n      start=$(( line_no > 5 ? line_no - 5 : 1 ))\n      if sed -n \"${start},${line_no}p\" \"$body\" | grep -qiE '^##.*(sanitize|strip|removal[[:space:]]+target)'; then\n        continue\n      fi\n      # Drop the VENDOR_PAT leading `\\.` and extract the vendor token directly.\n      vendor=$(echo \"$line\" | grep -oE \"$VENDOR_PAT\" | head -1 | sed 's#^\\.\\([^/]*\\)/$#\\1#')\n      [ -z \"$vendor\" ] && continue\n      # If declared deps don't cover this vendor wrapper → BROKEN_COUPLING\n      if ! echo \"$declared\" | grep -qw \"$vendor\"; then\n        echo \"BROKEN_COUPLING: $skill_name → $(basename $body) references $vendor without depends-on\"\n      fi\n    done <<< \"$matches\"\n  done\ndone\n```\n\n**Allowed exception (example/sanitize list)**: when the vendor reference appears in a \"sanitize target list\" (path enumeration to be **removed** before publishing) or example list, the coupling is informational, not structural. Detect by surrounding context (e.g., `## Sanitize`, `## Strip`, `removal target` headers within 5 lines above the match). Body matches outside such sections are flagged.\n\n**Report row format**: append BROKEN_COUPLING entries to the Step C table.\n\n**Skill-to-skill body reference check (same Step D, second pass)**: `VENDOR_PAT` above only catches vendor wrapper paths (`.ralph/`, `.omc/`, etc.) — it does not catch a skill's body file quietly depending on **another skill's own resources** (e.g. a hook script owned by a different skill). Run this second regex against the same body-file set:\n\n```bash\nSKILL_PAT='~/\\.claude/skills/([a-z0-9-]+)/|~/\\.agents/skills/([a-z0-9-]+)/'\n\nfor skill_dir in ~/.claude/skills/*/ ~/.agents/skills/*/; do\n  skill_name=$(basename \"$skill_dir\")\n  skill_md=\"$skill_dir/SKILL.md\"\n  [ -f \"$skill_md\" ] || continue\n\n  declared=$(awk '\n    /^depends-on:[[:space:]]*\\[/ { gsub(/^depends-on:[[:space:]]*\\[|\\]$|,/, \" \"); print; exit }\n    /^depends-on:[[:space:]]*$/ { block=1; next }\n    block && /^[[:space:]]+-[[:space:]]+/ { sub(/^[[:space:]]+-[[:space:]]+/, \"\"); printf \"%s \", $0; next }\n    block && /^[^[:space:]]/ { exit }\n  ' \"$skill_md\")\n\n  for body in \"$skill_dir\"*.md; do\n    [ \"$(basename \"$body\")\" = \"SKILL.md\" ] && continue\n    grep -ohE \"$SKILL_PAT\" \"$body\" 2>/dev/null | sed -E 's#.*/skills/([a-z0-9-]+)/.*#\\1#' | sort -u | while read -r ref; do\n      [ \"$ref\" = \"$skill_name\" ] && continue   # self-reference, not a dependency\n      if ! echo \"$declared\" | grep -qw \"$ref\"; then\n        echo \"BROKEN_COUPLING: $skill_name → $(basename \"$body\") references skill '$ref' without depends-on\"\n      fi\n    done\n  done\ndone\n```\n\nSame allowed exception (sanitize/strip lists) and report format as the vendor-path pass above.\n\n#### Don't / Do\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | Hardcode `{workspace}/.ralph/fix_plan.md` path in a skill that does not declare `depends-on: ralph` | Use an abstract tracker reference (e.g., `<fix_plan tracker path>` per fix-plan SKILL.md `task-tracker` config). See fix-plan/SKILL.md \"vendor-agnostic\" note |\n| 2 | Reference `ralph improve 5-A2` step from a non-Ralph-dependent skill | Generalize to \"a post-hoc supervision flow\" (or whichever abstract role the vendor instantiates) |\n| 3 | Treat sanitize/strip lists as structural references | Sanitize/strip lists = informational; preserve as examples. Step D should NOT flag them |\n\n### Step E: Documented script path drift (HARD STOP)\n\nA skill body that tells the caller to run `bash <path>/script.sh` is making a claim the filesystem can settle. When the skill later moves — into a plugin, out of `~/.claude/skills/`, under a different scope — the prose keeps naming the old location. The call then fails at the moment of use, in someone else's session, with a bare \"No such file or directory\" and no hint that the doc is the thing that is wrong.\n\nThis is not hypothetical: `git-repo/rename-worktree.md` documented `~/.claude/skills/git-repo/scripts/rename-worktree.sh` while the only real copy lived under the plugin marketplace root, and `cleanup` documented `cleanup/scripts/fa-classify.py` the same way. Both were found by a caller hitting the failure, not by lint.\n\n**Scan**: extract every script-like path from skill bodies and resolve it.\n\n```bash\n# Script-like references: bash/sh/python3/node <path> and bare <path>/<file>.(sh|py|js|mjs)\nSCRIPT_REF='(bash|sh|python3?|node|uvx?)[[:space:]]+[\"'\"'\"']?([^\"'\"'\"'[:space:]]+\\.(sh|py|js|mjs))|([^\"'\"'\"'[:space:]]*scripts/[^\"'\"'\"'[:space:]]+\\.(sh|py|js|mjs))'\ngrep -rnoE \"$SCRIPT_REF\" <skill-dir>/*.md <skill-dir>/**/*.md 2>/dev/null\n```\n\n**Resolve each hit** in this order, and report BROKEN only when all of them miss:\n\n| Order | Candidate root | Rationale |\n|-------|----------------|-----------|\n| 1 | `${CLAUDE_PLUGIN_ROOT}` | The runtime-correct root when the skill ships inside a plugin |\n| 2 | The skill's own directory (the file's parent tree) | Relative `./scripts/...` references |\n| 3 | Any documented env override the skill itself defines (e.g. a `*_SCRIPTS` variable) | The skill's declared escape hatch |\n| 4 | Literal path as written, expanded | Catches genuinely absolute installs |\n\n**Exclusions — do not flag these**: paths inside fenced blocks marked as illustrative (`# example`, placeholder `<...>` segments), references to scripts owned by *another* skill that this one declares in `depends-on` (Step A already covers those), and shell variables that are assigned earlier in the same block.\n\n**Report format**:\n\n| Source file | Documented path | Resolved at | Status |\n|---|---|---|---|\n| `git-repo/rename-worktree.md:25` | `~/.claude/skills/git-repo/scripts/rename-worktree.sh` | `${CLAUDE_PLUGIN_ROOT}/skills/git-repo/scripts/rename-worktree.sh` | DRIFTED |\n| `cleanup/fa-prune.md:99` | `fa-classify.py` | (skill dir) | OK |\n\n**Fix direction**: prefer a resolution loop over a corrected literal. A literal that is right today drifts again on the next move; a loop that tries `${CLAUDE_PLUGIN_ROOT}` then the skill dir then an env override survives it. Rewriting one hardcoded home path into a different hardcoded home path is not a fix.\n\n#### Don't / Do\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | Trust a documented script path because the skill is in active use | Active use exercises the paths people happen to run. Resolve every documented path each lint pass |\n| 2 | Report DRIFTED after checking only the literal path | Walk the full candidate-root table first — a plugin-relative hit is not drift |\n| 3 | Fix by substituting the current absolute path | Emit the resolution loop, so the next relocation does not reopen this |\n| 4 | Flag placeholder paths inside illustrative examples | Honour the exclusion list; a `<skill-dir>/scripts/x.sh` placeholder is documentation, not a call site |\n\n## Related Actions\n\nAfter lint completes, recommend:\n\n### Duplicates Found?\n\nIf skills with similar names/descriptions exist:\n\n```\n💡 Found potential duplicates. Run dedup?\n   /skill-manager dedup\n```\n\n### Multiple Related Skills?\n\nIf skills share a common prefix (e.g., `k8s-deploy`, `k8s-debug`):\n\n```\n💡 Related skills detected. Consider merging?\n   /skill-manager merge k8s-deploy k8s-debug\n```\n\n## Auto-fix Rules\n\n1. **triggers array → description string**\n   - Convert to `\"keyword1\", \"keyword2\" triggers` format\n   - Append to description\n\n2. **tools → allowed-tools**\n   - Rename field only, keep values\n\n3. **Multi-line description cleanup**\n   - Convert `|` block scalar to single line\n   - Remove internal triggers: text\n\n## Example\n\n### Input (invalid)\n\n```yaml\n---\nname: example-skill\ndescription: |\n  Example skill for demo\n  triggers:\n    - example\n    - demo\ntools:\n  - Read\n  - Edit\n---\n```\n\n### Output (fixed)\n\n```yaml\n---\nname: example-skill\ndescription: Example skill for demo. \"example\", \"demo\" triggers\nallowed-tools: [Read, Edit]\n---\n```\n\n## SkillSpector Static Analysis & Security Scanner\n\n`skills/skill-kit/scripts/skillspector_lint.py` provides standalone static validation and security auditing for skill files and directories.\n\n### Checks Performed\n\n| Rule Code | Category | Description | Severity |\n|---|---|---|---|\n| `STR-01` | Structure | Validates YAML frontmatter boundaries and non-empty `name` (character-set check only — does not compare against the containing directory name) | Error |\n| `STR-02` | Structure | HARD STOP: Description length $\\le 1024$ characters to prevent Claude Code prompt truncation | Error |\n| `STR-03` | Structure | Resolves and verifies markdown topic references cited in SKILL.md | Warning |\n| `SEC-01` | Security | Detects dangerous download-and-execute pipes (`curl`/`wget` piped to shell) | Error |\n| `SEC-02` | Security | Scans for leaked credentials, GitHub tokens (`ghp_*`), AWS keys, or bearer tokens | Error |\n| `SEC-03` | Security | Flags unconstrained recursive deletion commands (`rm -rf /`, `~`, `$HOME`) | Error |\n| `SEC-05` | Security | Flags prompt injection or prompt-override instructions | Error |\n\n### Usage\n\n```bash\n# Scan a specific skill\npython3 skills/skill-kit/scripts/skillspector_lint.py skills/skill-kit\n\n# JSON output mode for CI\npython3 skills/skill-kit/scripts/skillspector_lint.py --json skills/skill-kit\n```\n\n## Notes\n\n- `.bak` directories are excluded from scans\n- Always confirm before fixing\n- For plugin skills, consider contributing fixes upstream\n\nArchive v0.10.0: 33 files, 116104 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (14835b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (9372b), invoke-discipline.md (13127b), language.md (9121b), LICENSE (1063b), lint.md (33473b), merge.md (3444b), portability.md (14060b), publish-scope.md (8539b), README.md (644b), resources/skill-yaml-validate.sh (1818b), resources/trigger-PostToolUse.js (3340b), resources/trigger-PreToolUse.js (3771b), resources/trigger-Stop.js (2572b), route.md (8688b), scripts/enrich_skill_context.py (6556b), scripts/extract_skill_graph.py (9439b), scripts/extract-deps.sh (7945b), scripts/render_skill_graph.py (13971b), scripts/skill_graph_analyzer.py (9950b), scripts/skillspector_lint.py (9319b), scripts/sync_wiki_graph.py (8110b), scripts/trigger-compile.sh (20456b), skill-card.md (1870b), SKILL.md (5807b), trigger.md (8412b), upgrade.md (33611b), writer.md (11661b), _meta.json (129b)\n\nFile v0.10.0:SKILL.md\n\n---\nname: skill-kit\ndepends-on: [cc-plugin, clawhub, cleanup, es6kr]\nmetadata:\n  author: es6kr\n  version: \"0.1.2\"\ndescription: |\n  Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body Skill calls into Edge Table + Mermaid + dispatched d3 force-directed render), language (per-skill language consistency enforcement), portability (public skill cross-ref + vendor isolation), publish-scope (published skill scope review before extending), invoke-discipline (slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch). Use when: \"skill writer\", \"skill lint\", \"skill merge\", \"skill dedup\", \"create skill\", \"frontmatter fix\", \"multi-topic skill\", \"convert agent\", \"skill upgrade\", \"add topic\", \"topic route\", \"trigger compile\", \"hook auto register\", \"find skill\", \"discover skill\", \"npx skills\", \"skills.sh\", \"install skill\", \"skill graph\", \"skill dependency graph\", \"depends-on extract\", \"mermaid skill graph\", \"force-directed skill graph\", \"skill language\", \"description language\", \"portability\", \"publish scope\", \"slash command tool call\", \"Skill tool missing\", \"multi-topic read\", \"invoke discipline\", \"post-decision skill invoke\", \"interactive script\".\n---\n\n# Skill-Kit\n\nComprehensive toolkit for creating, managing, and maintaining Claude Code skills.\n\n## Commands\n\n| Command | Description | Link |\n| ------- | ----------- | ---- |\n| architecture | Multi-topic skill structure and topics | [architecture.md](./architecture.md) |\n| convert | Convert agents or scripts to skills | [convert.md](./convert.md) |\n| dedup | Identify and merge duplicate skills | [dedup.md](./dedup.md) |\n| find | Discover and install skills via npx skills CLI | [find.md](./find.md) |\n| graph | Extract `depends-on` + topic body `Skill(...)` edges into Edge Table + Mermaid + dispatched d3 force-directed render | [graph.md](./graph.md) |\n| language | Enforce per-skill language consistency (description-language rule + Edit/Write pre-check) | [language.md](./language.md) |\n| lint | Validate and fix SKILL.md frontmatter | [lint.md](./lint.md) |\n| merge | Combine related skills into one | [merge.md](./merge.md) |\n| portability | public/published skill cross-ref + vendor-specific isolation rules | [portability.md](./portability.md) |\n| publish-scope | published skill scope check before adding topics/scripts | [publish-scope.md](./publish-scope.md) |\n| route | Recommend topic placement within skills (plugin-level clustering → cc-plugin/clustering) | [route.md](./route.md) |\n| trigger | Register triggers and generate hooks | [trigger.md](./trigger.md) |\n| upgrade | Enhance existing skills or add topics | [upgrade.md](./upgrade.md) |\n| writer | Interactive skill creation wizard | [writer.md](./writer.md) |\n| invoke-discipline | Slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch | [invoke-discipline.md](./invoke-discipline.md) |\n\n## Core Workflows\n\n### Creation (skill-writer)\n\nAlways use `writer` to ensure correct frontmatter and structure.\n\n```bash\n/skill-kit writer                  # Start wizard\n```\n\n### Maintenance (upgrade/lint)\n\nUse `upgrade` to add new functionality or topics to an existing skill.\n\n```bash\n/skill-kit upgrade skill-name      # Interactive upgrade\n/skill-kit lint skill-name         # Validation only\n```\n\nImprovement types:\n- **Add Topic**: Add documentation for a new sub-feature\n- **Add Script**: Add logic to `scripts/` and reference in SKILL.md\n- **Fix Frontmatter**: Correct `triggers`, `depends-on`, or `description`\n\n### Trigger (Auto-generate Hooks)\n\n```bash\n/skill-kit trigger compile     # Scan skills -> generate dispatcher -> register in settings.json\n/skill-kit trigger list        # List registered triggers\n/skill-kit trigger dry-run     # Preview only\n```\n\nDeclare `triggers` in SKILL.md -> auto-generate hook scripts -> auto-register in settings.json.\n\n[Detailed guide](./trigger.md)\n\n### Find (Discover via npx skills)\n\n```bash\n/skill-kit find <query>        # Search the open skills ecosystem via npx skills CLI\n```\n\nSearches the [skills.sh](https://skills.sh/) leaderboard and ecosystem for installable skills. Use when looking for an existing skill rather than building one from scratch.\n\n[Detailed guide](./find.md)\n\n## Success Case\n\n**Scenario (2026-03-09)**:\n- Found 3 openclaw-related functions\n- Proposed 3 options for merging\n- Result: Implementation success, user satisfied\n\n**Key factors**:\n1. Identification of 3 functions\n2. \"Merge?\" AskUserQuestion\n3. Merging skills using skill-writer (multi-topic)\n\n## Ralph Mode (AskUserQuestion bypass)\n\nIf `.ralph/` directory exists, operate in Ralph Mode.\n\n**Workflow Change**:\n\n| Step | User Interaction | Workflow |\n| ---- | ---------------- | -------- |\n| Step 1: Auto-detect | AskUserQuestion (multiSelect) | Summary info to `.ralph/improvements.md` |\n| Step 1.5: Merge logic / Structure | - | improvements.md recording |\n| Step 2: Requirements | AskUserQuestion | Trigger/scope recommendation to improvements.md |\n| Step 3: Type recommendation | Recommend only | improvements.md recording |\n| Step 4: Implementation | Direct action | **PROHIBITED** - Use `[NEEDS_REVIEW]` tag |\n| Step 5: Validation | Validation | **Auto validation** (after changes are complete) |\n\n## Self-Improvement\n\nAfter changes are complete, **Self-improve based on conversation**:\n\n1. Identify failure and workaround patterns\n2. If candidates found, run `/skill-kit upgrade skill-kit`\n\nFile v0.10.0:README.md\n\n# skill-kit\n\nClaude Code skill authoring and management — create, lint, merge, upgrade, and route skills, plus multi-topic architecture, dependency-graph, and publishing tooling.\n\n## Installation\n\n```bash\nnpx skills add es6kr/skills --skill skill-kit\n```\n\nBrowse on ClawHub: <https://clawhub.ai/skills/skill-kit>\n\n### Peer skills\n\n`skill-kit` depends on `cc-plugin` and `clawhub` (a companion skill for ClawHub publishing). Install the published peer:\n\n```bash\nnpx skills add es6kr/skills --skill cc-plugin\n```\n\n## Usage\n\nInvoke with `/skill-kit <topic>` (for example `/skill-kit lint`). See [`SKILL.md`](./SKILL.md) for the full topic list.\n\nFile v0.10.0:_meta.json\n\n{\n  \"ownerId\": \"kn74k8yfvftx6f062qa8fzyd8h8373jd\",\n  \"slug\": \"skill-kit\",\n  \"version\": \"0.10.0\",\n  \"publishedAt\": 1790524333575\n}\n\nFile v0.10.0:architecture.md\n\n# Multi-Topic Skill Architecture\n\nDefine the directory structure for skills with multiple related topics.\n\n## When to Use\n\n- Creating a new skill with multiple sub-topics\n- Merging related skills into one\n- Organizing complex skills with separate guides\n\n## Directory Structure\n\n```\n~/.claude/skills/{skill-name}/\n├── SKILL.md          # Unified frontmatter + topic references\n├── {topic1}.md       # First topic content (no frontmatter)\n├── {topic2}.md       # Second topic content (no frontmatter)\n└── scripts/          # Shell/Python scripts called by topics (optional)\n    ├── {script}.sh\n    └── {script}.py\n```\n\n### File Roles\n\n| File | Purpose |\n|------|---------|\n| `SKILL.md` | Entry point with frontmatter, overview, and topic index |\n| `{topic}.md` | Detailed guide for specific topic (no frontmatter) |\n| `scripts/` | Reusable scripts referenced from topic files |\n\n### scripts/ Rules\n\n- **All scripts executed by the skill must be inside `scripts/`** — no external path references\n- Scripts must be permanent files (no tmp paths)\n- Reference scripts from topic files using relative paths: `bash scripts/run.sh`\n- If using scripts outside the skill (`~/Sync/...`, `/usr/local/...`) → copy into `scripts/` first\n\n## SKILL.md Template\n\n```yaml\n---\nname: {skill-name}\ndescription: {unified description}. {topic1} - {desc1}, {topic2} - {desc2}. \"{trigger1}\", \"{trigger2}\" triggers\n---\n\n# {Skill Name}\n\n{Common theme description}\n\n## Topic Dispatch\n\n**When this skill is invoked with a topic specifier (e.g., `/{skill-name} {topic1}` or `Skill(\"{skill-name}\", \"{topic1}\")`), load and follow only the matching topic file (`{topic1}.md`). Do not echo the Topics table or summarize other topics in the response.** The Topics table below is an index for invocations without a topic specifier — it is not user-facing output when a topic is named.\n\n## Topics\n\n| Topic | Description | Guide |\n|-------|-------------|-------|\n| {topic1} | {description} | [{topic1}.md](./{topic1}.md) |\n| {topic2} | {description} | [{topic2}.md](./{topic2}.md) |\n\n## Quick Reference\n\n### {Topic1}\n\nBrief summary of topic1.\n\nSee [detailed guide](./{topic1}.md).\n\n### {Topic2}\n\nBrief summary of topic2.\n\nSee [detailed guide](./{topic2}.md).\n```\n\n## Topic File Template\n\nTopic files contain only content (no frontmatter):\n\n```markdown\n# {Topic Title}\n\n{Detailed guide content}\n\n## When to Use\n\n{Specific use cases for this topic}\n\n## Instructions\n\n{Step-by-step guidance}\n\n## Examples\n\n{Concrete usage examples}\n```\n\n## Naming Conventions\n\n| Element | Convention | Example |\n|---------|------------|---------|\n| Skill directory | lowercase, hyphens | `argocd-helm` |\n| Topic files | lowercase, hyphens, `.md` | `cleanup.md`, `oci.md` |\n| SKILL.md | Uppercase | `SKILL.md` |\n\n## Description Format\n\nFor multi-topic skills, use this description pattern (no markdown links to save tokens):\n\n```\n{Overall purpose}. {topic1} - {brief desc} [{file}], {topic2} - {brief desc} [{file}]. \"{trigger1}\", \"{trigger2}\" triggers\n```\n\nExample:\n```yaml\ndescription: ArgoCD Helm chart management. cleanup - clean Helm metadata [cleanup.md], oci - add OCI registry charts [oci.md]. \"argocd helm\", \"helm metadata\", \"OCI helm\" triggers\n```\n\n## Topic Dispatch Behavior\n\nWhen a multi-topic skill is invoked with a topic specifier, the LLM must load the matching topic file directly and avoid echoing the SKILL.md Topics table back to the user. Exposing the full topic index is noise when the user has already named a specific topic.\n\n### Don't / Do\n\n| # | Don't | Do |\n|---|-------|-----|\n| 1 | List the full Topics table in chat when the user typed `/skill-name topic` | Read `{topic}.md` and execute its instructions; the Topics table stays internal |\n| 2 | \"Topic was specified, but here are the other topics for context…\" preamble | No preamble. Begin executing the topic's procedure or answering directly |\n| 3 | Treat the SKILL.md Topics table as part of the user-facing response | The Topics table is an index for topic-less invocations only |\n| 4 | Re-read SKILL.md every turn even after the topic is resolved | After dispatching, work from the topic file contents until topic changes |\n\n### Required SKILL.md Section\n\nEvery multi-topic SKILL.md must include a `## Topic Dispatch` section placed **immediately above the Topics table**. Copy the directive verbatim, replacing `{skill-name}` and `{topic1}` with concrete values:\n\n```markdown\n## Topic Dispatch\n\n**When this skill is invoked with a topic specifier (e.g., `/{skill-name} {topic1}` or `Skill(\"{skill-name}\", \"{topic1}\")`), load and follow only the matching topic file (`{topic1}.md`). Do not echo the Topics table or summarize other topics in the response.** The Topics table below is an index for invocations without a topic specifier — it is not user-facing output when a topic is named.\n```\n\n### When the Topics Table IS Surfaced\n\nThe Topics table remains the right answer in exactly these cases:\n- The user invokes the skill without a topic (e.g., `/skill-name` alone) and needs to discover available topics\n- The user explicitly asks \"what topics does this skill have?\"\n- The user requests an overview or comparison across topics\n\n### Integration with Other Topics\n\n- **writer**: When generating a new multi-topic SKILL.md, insert the `## Topic Dispatch` section above the Topics table by default\n- **upgrade**: When upgrading an existing multi-topic skill that lacks the section, add it as part of the upgrade procedure\n- **lint**: Verify that every multi-topic SKILL.md contains the `## Topic Dispatch` heading; emit a warning if missing\n\n## Data Store Pattern\n\nSkills that maintain persistent state use a `data/` directory for JSON/cache files.\n\n### Structure\n\n```text\n~/.claude/skills/{skill-name}/\n├── SKILL.md\n├── {topic}.md          # Read/write logic for data files\n├── data/               # Persistent state (JSON, cache)\n│   └── {name}.json\n└── scripts/            # Optional automation scripts\n```\n\n### When to Use\n\n- Skill needs to remember state across sessions (e.g., published versions, mappings)\n- Data is too dynamic for static .md content but too small for a database\n- Multiple topics share the same data source\n\n### Rules\n\n| Rule | Rationale |\n|------|-----------|\n| `data/` only stores JSON/plain text | Keep parseable, no binaries |\n| Topics that modify data must update `data/` in the same step | Prevent stale cache |\n| Add `data/` to `.clawhubignore` if publishing | User-specific state should not be distributed |\n| Include an `updatedAt` field in JSON | Track freshness |\n\n### Example: clawhub skill\n\n```text\nclawhub/\n├── SKILL.md\n├── deploy.md         # Writes to data/published.json after publish\n├── status.md         # Reads from data/published.json\n├── data/\n│   └── published.json  # { \"updatedAt\": \"...\", \"skills\": [...] }\n└── scripts/\n    └── check-slugs.sh\n```\n\n### Example: next skill (hook locale pattern)\n\nWhen a hook script needs locale-specific match patterns (Korean, Japanese, etc.) but must stay language-neutral when published, separate the patterns into `data/*.regex` files and load them at runtime:\n\n```text\nnext/\n├── SKILL.md\n├── stall-detect.md\n├── resources/\n│   └── next-trigger.sh        # 100% English; loads data/*.regex at runtime\n├── data/                      # git-ignored AND publish-ignored\n│   ├── en.regex\n│   └── ko.regex\n├── .gitignore                 # data/\n└── .clawhubignore             # .gitignore, data/, *.tmp\n```\n\nHook script loader pattern:\n\n```bash\nDATA_DIR=\"$(dirname \"$0\")/../data\"\nif compgen -G \"$DATA_DIR/*.regex\" > /dev/null 2>&1; then\n  PATTERN=$(cat \"$DATA_DIR\"/*.regex | sed 's/#.*$//' | awk 'NF' | paste -sd'|' -)\nelse\n  PATTERN='Fix complete:|✅|all done|task complete'   # built-in English fallback\nfi\necho \"$LAST_TEXT\" | grep -qiE \"$PATTERN\" && ...\n```\n\nEach `*.regex` file uses `#` for comments, one alternation entry per line. Users can add their own locale file (e.g., `ja.regex`, `zh.regex`) without forking the script. The fallback ensures the hook works on fresh installs without a `data/` directory.\n\n| Pattern Type | When to Use |\n|--------------|-------------|\n| State cache (clawhub) | Persistent JSON state that scripts/topics read/write |\n| Locale data (next) | Functional input data that should not be distributed but should remain extensible by end users |\n\n### Integration with Other Topics\n\nWhen creating/upgrading skills with a data store:\n- **writer**: Ask if the skill needs persistent state → create `data/` directory\n- **upgrade**: When adding a topic that produces state, add `data/` and a corresponding read topic\n- **lint**: Verify `data/*.json` files are valid JSON\n\n## Best Practices\n\n1. **Keep topics focused**: Each topic file should cover one specific capability\n2. **Cross-reference**: Link between related topics when relevant\n3. **Consistent structure**: Use similar headings across topic files\n4. **Index in SKILL.md**: Always maintain the Topics table for discoverability\n\nFile v0.10.0:CHANGELOG.md\n\n# Changelog\n\n## [0.10.0](https://github.com/es6kr/skills/compare/skill-kit-v0.9.0...skill-kit-v0.10.0) (2026-09-27)\n\n\n### Features\n\n* **skill-kit:** add skill topology graph extractor, analyzer, visualizer, wiki sync, and context enricher ([#552](https://github.com/es6kr/skills/issues/552)) ([0472c23](https://github.com/es6kr/skills/commit/0472c2323d0990ddc13669b2b7843171b85e2c7e))\n\n## [0.9.0](https://github.com/es6kr/skills/compare/skill-kit-v0.8.1...skill-kit-v0.9.0) (2026-09-20)\n\n\n### Features\n\n* **skill-kit:** implement SkillSpector static linter and security scanner (green) ([720d0f3](https://github.com/es6kr/skills/commit/720d0f314295da4b098cc4727e93352653aab17d))\n\n\n### Bug Fixes\n\n* **skill-kit:** document SkillSpector static analysis and security scanner in lint.md ([#514](https://github.com/es6kr/skills/issues/514)) ([fe60edb](https://github.com/es6kr/skills/commit/fe60edbe17715d1b4eb83b7148757f4808527768))\n* **skill-kit:** fix SkillSpector detection gaps and correct its own doc ([0c43ca3](https://github.com/es6kr/skills/commit/0c43ca3b7be8ec99afd231ca0a575a210025ca8c))\n* **skill-kit:** replace pipe to shell pattern with safe installer download in lint.md ([4bd5371](https://github.com/es6kr/skills/commit/4bd53719572fed09b8a1a7a97ba2b9536c74c0b2))\n\n## [0.8.1](https://github.com/es6kr/skills/compare/skill-kit-v0.8.0...skill-kit-v0.8.1) (2026-09-18)\n\n\n### Bug Fixes\n\n* **cleanup:** make the session-end report table self-sufficient ([#487](https://github.com/es6kr/skills/issues/487)) ([c4a0255](https://github.com/es6kr/skills/commit/c4a02557fb8de3b32cf337c549f62535dabf824b))\n\n## [0.8.0](https://github.com/es6kr/skills/compare/skill-kit-v0.7.1...skill-kit-v0.8.0) (2026-08-29)\n\n\n### Features\n\n* promote next-feat batch (backlog skill, hooks JS port, git-repo doctor, pre-push guard) ([0d76a4c](https://github.com/es6kr/skills/commit/0d76a4c01180fbdc78bfeec8dea91373b4912470))\n* **skill-kit:** support exclude_content in trigger-compile and add unit tests ([f4400ef](https://github.com/es6kr/skills/commit/f4400ef586a666d9e16e001e84011bf1ec675425))\n\n\n### Bug Fixes\n\n* address CodeRabbit and Copilot review feedback on PR [#385](https://github.com/es6kr/skills/issues/385) ([e94de34](https://github.com/es6kr/skills/commit/e94de34ce5e075c79b7edc5d672813cea94a0acc))\n* address CodeRabbit and Copilot review feedback on PR [#389](https://github.com/es6kr/skills/issues/389) ([db4dfff](https://github.com/es6kr/skills/commit/db4dfff2829632bf263d93e0bbfdd1244772a5b2))\n* **hook-kit:** document --json mode and scope WSCFG_* to hook scripts ([373634c](https://github.com/es6kr/skills/commit/373634c022b0e2b114a3bbb799bb9a8934c9fbb2))\n* **hook-kit:** resolve RAG receiver from workspace config instead of mandating --rag ([58e85ec](https://github.com/es6kr/skills/commit/58e85ecbb437557544cd528281aa30b804bd2532))\n* **hook-kit:** resolve RAG receiver from workspace config instead of mandating --rag ([1412773](https://github.com/es6kr/skills/commit/1412773466d11354eca7521e4351faa5a78d9081))\n* **hook-kit:** scope PR-URL bare-ref check to per-number match, allow force-push in worktrees ([dd50dce](https://github.com/es6kr/skills/commit/dd50dced989eed4847daaf9a0cd4be12a04426e1))\n* promote next-fix batch (task plugin split, claudify matcher, pr recheck, omz chezmoi fix) ([3e90fd5](https://github.com/es6kr/skills/commit/3e90fd56ade0522d6773eb03f38760a317dd5180))\n* **review:** apply copilot review feedback on hooks and test suites ([cba86f4](https://github.com/es6kr/skills/commit/cba86f4ebbf274a0c979ab21aeea6d483f8cb8f3))\n* **skills:** finish the config-resolution sweep for receiver dispatch ([c188d44](https://github.com/es6kr/skills/commit/c188d44de268ef169070dedee525b2a483e57b40))\n\n\n### Refactor\n\n* **hooks:** port check-completed-bloat and wip-task-complete-detect to Node.js ([7097526](https://github.com/es6kr/skills/commit/7097526ca208c3106b38a3ac5c317d0eb49eff30))\n* **hooks:** sync hook registry, enhance bash-guard, and retire obsolete guards ([15d4a58](https://github.com/es6kr/skills/commit/15d4a58752d0d458f88c86cb41c537f90e3ca4dd))\n\n## [0.7.1](https://github.com/es6kr/skills/compare/skill-kit-v0.7.0...skill-kit-v0.7.1) (2026-08-26)\n\n\n### Bug Fixes\n\n* promote next-fix batch (consolidate fabrication guard, session rewind, config-driven PR base) ([7ca0ccb](https://github.com/es6kr/skills/commit/7ca0ccbf13cefafedc33a16a7361756c95f8b8f6))\n* **skill-kit:** resolve upgrade PR base from works-config staging role, not hardcoded main ([#362](https://github.com/es6kr/skills/issues/362)) ([c7a8c45](https://github.com/es6kr/skills/commit/c7a8c45d28be511fa7e645d00fe49050f1d14ba0))\n\n## [0.7.0](https://github.com/es6kr/skills/compare/skill-kit-v0.6.3...skill-kit-v0.7.0) (2026-08-20)\n\n\n### Features\n\n* promote next-feat staging (lifecycle guards, triage automation, and workflow safety procedures) ([77d58ac](https://github.com/es6kr/skills/commit/77d58ac3a771a4897043c9eea8b149ea1e8ba2ff))\n\n## [0.6.3](https://github.com/es6kr/skills/compare/skill-kit-v0.6.2...skill-kit-v0.6.3) (2026-08-17)\n\n\n### Bug Fixes\n\n* promote next-fix staging (30 fixes across 14 skills) ([ee467c0](https://github.com/es6kr/skills/commit/ee467c045d779d7b80d30f160763ec3534a9742b))\n* **skill-kit:** remove incorrect skill- prefix from commit-scope convention ([3e96181](https://github.com/es6kr/skills/commit/3e96181f5b1d15e96a60455f2c921cb37b9bd902))\n* **skill-kit:** translate locale-pattern rationale lines to English ([8cd45a1](https://github.com/es6kr/skills/commit/8cd45a10424b9b5154a57a85a99dd71602b75b4a))\n* **wip:** cross-ref PR-URL and TaskCreate subject repo-qualifier rules ([#186](https://github.com/es6kr/skills/issues/186)) ([4982364](https://github.com/es6kr/skills/commit/49823641a7b08123ebd0325273892bee41bc3280))\n\n## [0.6.2](https://github.com/es6kr/skills/compare/skill-kit-v0.6.1...skill-kit-v0.6.2) (2026-08-09)\n\n\n### Bug Fixes\n\n* declare undeclared skill-to-skill dependencies (7 skills) ([#271](https://github.com/es6kr/skills/issues/271)) ([36a9f9d](https://github.com/es6kr/skills/commit/36a9f9d7c1fac9bb1c4c96b325a067ab92ad0da7))\n* PR [#195](https://github.com/es6kr/skills/issues/195) review findings batch 2 (github-repo/skill-kit/commit-tidy/hook-kit) ([#264](https://github.com/es6kr/skills/issues/264)) ([d8d9df0](https://github.com/es6kr/skills/commit/d8d9df04bdf178fffa6822c44199a416668c6423))\n* promote accumulated next-fix fixes to main ([95656e9](https://github.com/es6kr/skills/commit/95656e9b551ee0bb77904a0a571d49c53bc01cc9))\n\n## [0.6.1](https://github.com/es6kr/skills/compare/skill-kit-v0.6.0...skill-kit-v0.6.1) (2026-08-05)\n\n\n### Bug Fixes\n\n* **hook-kit,skill-kit:** widen context-gate under-offer trigger + new-skill ready-ask gate ([#221](https://github.com/es6kr/skills/issues/221)) ([c127c72](https://github.com/es6kr/skills/commit/c127c72f3271826dffaced8d9442bf4f30f718d6))\n* promote next-fix staging (38 fixes across 16 skills) ([94f8c33](https://github.com/es6kr/skills/commit/94f8c33800ce411ae63e22c5259cdae8435508a4))\n* **skill-kit:** add explicit-ask axis to new-skill publication-readiness gate ([f7eb58d](https://github.com/es6kr/skills/commit/f7eb58d1fc2556f2526a0f1992e3c83e7380d4ac))\n* **skill-kit:** add new-skill publication-readiness gate to publish-scope ([5363490](https://github.com/es6kr/skills/commit/5363490006e1d6f0ca2c6187559bdeb2225aa1e6))\n* **skill-kit:** require relative paths for a skill's own bundled-script references ([#212](https://github.com/es6kr/skills/issues/212)) ([ff965f2](https://github.com/es6kr/skills/commit/ff965f26dfa21c3296a7aa09805633a9faaada69))\n* **wip:** cross-ref PR-URL and TaskCreate subject repo-qualifier rules ([#186](https://github.com/es6kr/skills/issues/186)) ([951c1e6](https://github.com/es6kr/skills/commit/951c1e6871e78e226757c6a7ae5ae53efeb7bfb0))\n\n## [0.6.0](https://github.com/es6kr/skills/compare/skill-kit-v0.5.0...skill-kit-v0.6.0) (2026-07-28)\n\n\n### Features\n\n* bundle next-feat — fix-plan expansion, next reactive guard, github-repo extraction ([#195](https://github.com/es6kr/skills/issues/195)) ([cd65a85](https://github.com/es6kr/skills/commit/cd65a8519c88f080321d746ef197e90713039fa6))\n\n\n### Bug Fixes\n\n* **skill-kit:** add skip-condition-before-recommend self-check to invoke-discipline ([0f27fa0](https://github.com/es6kr/skills/commit/0f27fa01379790b56d0cebfbaee3142627218348))\n* **skill-kit:** add skip-condition-before-recommend self-check to invoke-discipline ([9e6503f](https://github.com/es6kr/skills/commit/9e6503f282251094b0eec69c6b207464362040cf))\n\n## [0.5.0](https://github.com/es6kr/skills/compare/skill-kit-v0.4.2...skill-kit-v0.5.0) (2026-07-23)\n\n\n### Features\n\n* **next-feat:** accumulate features for hook-kit context gate ([df4f73a](https://github.com/es6kr/skills/commit/df4f73ae4d27d4919105da70c6c94a14a32e8056))\n* **skill-kit:** add invoke-discipline topic ([5a76602](https://github.com/es6kr/skills/commit/5a76602c0ecab63fa1bff270b600dce78a8628bf))\n* skills topic bundle — brief/email, code-workflow/plan-research-search, git-repo topics, skill-kit/invoke-discipline ([7fd877d](https://github.com/es6kr/skills/commit/7fd877da1b703fcdcdcaf1a3ce912f885abfa3f0))\n\n## [0.4.2](https://github.com/es6kr/skills/compare/skill-kit-v0.4.1...skill-kit-v0.4.2) (2026-07-16)\n\n\n### Bug Fixes\n\n* **consolidate,fix-plan:** promote next-fix staging (review hardening + periodic archive) ([24726e9](https://github.com/es6kr/skills/commit/24726e99a5b2972f706d8749ea3a45cbc358984b))\n* **skill-kit:** support script-driven triggers and compile priority ([3670224](https://github.com/es6kr/skills/commit/367022402afab29c9aabf7084989bc6cbddc0958))\n\n\n### Documentation\n\n* add install-guide READMEs for consolidate, git-repo, skill-kit ([380db80](https://github.com/es6kr/skills/commit/380db8070a60dbfe1be29d940a6740e1119db748))\n* add install-guide READMEs for consolidate, git-repo, skill-kit ([d9bec4b](https://github.com/es6kr/skills/commit/d9bec4bb17c294a40c373c376a2f22aa0d3c04f2))\n* correct skills install command (add, not install) + superpowers namespace ([ed8fb1a](https://github.com/es6kr/skills/commit/ed8fb1ab2cd251e2395363948104bd3d3915f010))\n\n## [0.4.1](https://github.com/es6kr/skills/compare/skill-kit-v0.4.0...skill-kit-v0.4.1) (2026-07-03)\n\n\n### Bug Fixes\n\n* **skill-kit:** add quality-method routing gate + release-please-aware version rule ([1a8e786](https://github.com/es6kr/skills/commit/1a8e7862d4096f02d8e7a2b049a359dee90d0a6e))\n* **skill-kit:** update parse_slash_calls comment to reflect consolidate pr topic ([fca143d](https://github.com/es6kr/skills/commit/fca143da79a70de3ec37f374d367b2d323a5759c))\n* **skills:** patch bundle — consolidate/next/fix/skill-kit/github-flow ([3cb90cb](https://github.com/es6kr/skills/commit/3cb90cb7601f619b63518860bebfb693d58a7633))\n\n## [0.4.0](https://github.com/es6kr/skills/compare/skill-kit-v0.3.2...skill-kit-v0.4.0) (2026-06-19)\n\n\n### Features\n\n* skill-kit graph topic + harness Phase 1 + auxiliary improvements ([01437f2](https://github.com/es6kr/skills/commit/01437f2135d5729eee16f074cb77e52b3cb1772c))\n* **skill-kit:** add graph + language + portability + publish-scope topics + extract-deps script ([8bf9ea2](https://github.com/es6kr/skills/commit/8bf9ea231cbe8c76fecae08aa7ffcb20e19a7a7f))\n\n\n### Bug Fixes\n\n* bundle skill patches across github-flow, skill-kit, fix ([0ef74c1](https://github.com/es6kr/skills/commit/0ef74c14aabfbdc2f802c34b3a1b431217e95208))\n* **fix,skill-kit:** add rule-file Edit gate + undeclared vendor coupling lint ([009348b](https://github.com/es6kr/skills/commit/009348b42a41fe23e94c42c2960d0e789dcc1cbc))\n* **skill-kit,github-flow:** address CodeRabbit + Internal Review feedback on PR [#54](https://github.com/es6kr/skills/issues/54) ([c5c741d](https://github.com/es6kr/skills/commit/c5c741da5631a042860e684580d1c92687b59eec))\n* **skill-kit:** require remote ecosystem scan before authoring topics or skills ([5447153](https://github.com/es6kr/skills/commit/54471534f071f60ae5a328afdcafba8805d9785a))\n\n## [0.3.2](https://github.com/es6kr/skills/compare/skill-kit-v0.3.1...skill-kit-v0.3.2) (2026-06-13)\n\n\n### Refactor\n\n* **fix,next:** decompose oversized SKILL.md into topic files ([#51](https://github.com/es6kr/skills/issues/51)) ([525eb17](https://github.com/es6kr/skills/commit/525eb170c1c3d371c76a4b1ef8033d624cea6002))\n\n## [0.3.1](https://github.com/es6kr/skills/compare/skill-kit-v0.3.0...skill-kit-v0.3.1) (2026-06-07)\n\n\n### Bug Fixes\n\n* **git-repo,skill-kit:** pre-commit worktree matrix + external-system structure check ([7f05819](https://github.com/es6kr/skills/commit/7f058194fcf568b7cac57fd79788b20caf217ae5))\n* **git-repo,skill-kit:** strictyaml description block scalar ([#44](https://github.com/es6kr/skills/issues/44)) ([fe0da66](https://github.com/es6kr/skills/commit/fe0da66e80ee06e2e30190a4afc4c12363f0d51f))\n* **skill-kit,git-repo:** address PR [#46](https://github.com/es6kr/skills/issues/46) review findings 1-6 ([ba4592c](https://github.com/es6kr/skills/commit/ba4592c9209718bab7ba2af82f060f82a529f1e6))\n\n\n### Documentation\n\n* **skill-kit:** add External-system Structure Check + translate HARD STOP bullets ([8decdc1](https://github.com/es6kr/skills/commit/8decdc18731239fee5c9150d5ffca94e5c7c6a29))\n\n## [0.3.0](https://github.com/es6kr/skills/compare/skill-kit-v0.2.0...skill-kit-v0.3.0) (2026-05-25)\n\n\n### Features\n\n* add metadata block (author, version) to all skills ([a36d9a5](https://github.com/es6kr/skills/commit/a36d9a5f029b595847220c3cc867370c7ff30a21))\n* **ci:** add lint jobs and untrack LICENSE ([#7](https://github.com/es6kr/skills/issues/7) Phase 1) ([03a8587](https://github.com/es6kr/skills/commit/03a85872c575c6ffdf72f5ca2bdb353fdc947a73))\n* publish 6 skills, rename folders to match slugs, add skill-kit find topic ([cc9859d](https://github.com/es6kr/skills/commit/cc9859ddbb2fa87e978a0f34c2ec6d18b9573995))\n* publish 7 new skills, update 4 existing skills ([dce016d](https://github.com/es6kr/skills/commit/dce016da291f4c9da03746f8be668fa5db04e578))\n* **skill-kit:** add find topic, expand lint Don't/Do, English-only Step 3-1 ([#18](https://github.com/es6kr/skills/issues/18)) ([15a75f3](https://github.com/es6kr/skills/commit/15a75f395fd9ab8e22fb98f9a1d52bad3ef62a7e))\n* **skill-kit:** consolidate upgrade/architecture/route/lint/writer (English-only) ([#23](https://github.com/es6kr/skills/issues/23)) ([a4228ac](https://github.com/es6kr/skills/commit/a4228ac9e57e2ead898ce3a4588875826e46eda1))\n\n## [0.2.0](https://github.com/es6kr/skills/compare/skill-kit-v0.1.2...skill-kit-v0.2.0) (2026-05-24)\n\n\n### Features\n\n* **ci:** add lint jobs and untrack LICENSE ([#7](https://github.com/es6kr/skills/issues/7) Phase 1) ([03a8587](https://github.com/es6kr/skills/commit/03a85872c575c6ffdf72f5ca2bdb353fdc947a73))\n* publish 7 new skills, update 4 existing skills ([dce016d](https://github.com/es6kr/skills/commit/dce016da291f4c9da03746f8be668fa5db04e578))\n\nFile v0.10.0:convert.md\n\n# Convert Agent to Skill\n\nConverts an existing agent (.md file) into a skill structure.\n\n## Usage\n\n```bash\n/skill-manager convert <agent-name>\n```\n\n## Workflow\n\n### 1. Read Agent File\n\n```bash\n# Global agent\ncat ~/.claude/agents/<agent-name>.md\n\n# Project agent\ncat .claude/agents/<agent-name>.md\n```\n\n### 2. Conversion Rules\n\n| Agent Element | Skill Conversion |\n|-----------|-----------|\n| `name` | Keep as-is (suffix removal recommended) |\n| `description` | Add triggers keywords |\n| `tools` | Remove (skills use all tools by default) |\n| `model` | Keep (optional) |\n| Script references | Copy to `scripts/` folder, change to relative paths |\n\n### 3. Create Skill\n\nFollow the [writer.md](./writer.md) guide to create the skill structure:\n\n1. Create folder: `mkdir -p ~/.claude/skills/<skill-name>/scripts`\n2. Write SKILL.md (frontmatter + body)\n3. Copy scripts and `chmod +x`\n\n### 4. Move Original\n\nDepending on the agent file location:\n\n```bash\n# Global agent\nmv ~/.claude/agents/<name>.md ~/.claude/.bak/\n\n# Project agent\nmv .claude/agents/<name>.md .claude/.bak/\n```\n\n## Example\n\n**Before conversion (Agent)**:\n```markdown\n---\nname: syncthing-conflict-resolver\ndescription: Automatically handles Syncthing sync-conflict files...\ntools: Bash, Read\n---\n~/Sync/AI/scripts/resolve-sync-conflicts.sh\n```\n\n**After conversion (Skill)**:\n```\nskills/syncthing-conflict/\n├── SKILL.md\n└── scripts/\n    └── resolve-conflicts.sh\n```\n\n## Checklist\n\n- [ ] Read agent\n- [ ] Create skill folder + SKILL.md ([writer.md](./writer.md))\n- [ ] Copy scripts + permissions\n- [ ] Delete original\n\nFile v0.10.0:dedup.md\n\n# Skill Dedup\n\nFind user skills that duplicate plugin skills and offer cleanup options.\n\n## When to Use\n\n- After installing new plugins\n- Periodic skill inventory cleanup\n- Before creating new skills (check if already exists)\n\n## Workflow\n\n### Step 1: Get User Skill Names\n\n```bash\nls ~/.claude/skills/ | grep -v '\\.bak$'\n```\n\nExtract skill names from frontmatter:\n```bash\ngrep -h \"^name:\" ~/.claude/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u\n```\n\n### Step 2: Get Plugin Skill Names\n\n```bash\ngrep -rh \"^name:\" ~/.claude/plugins/marketplaces/*/plugins/*/skills/*/SKILL.md 2>/dev/null | sed 's/name: *//' | sort -u\n```\n\n### Step 3: Find Duplicates\n\nCompare the two lists. A duplicate is when user skill name matches plugin skill name.\n\n### Step 4: Present Results\n\nShow duplicates in a concise table:\n\n| User Skill | Plugin | Status |\n|------------|--------|--------|\n| skill-name | plugin:skill-name | Backup recommended |\n| other-skill | plugin:other-skill | Already backed up |\n\nIf already in `.bak`: mark as \"Already backed up\"\n\n### Step 5: Offer Cleanup\n\nUse AskUserQuestion for duplicates not yet backed up:\n\n```\nBackup these duplicate skills to .bak folder?\n1. Backup All (Recommended) - Move to ~/.claude/skills/.bak/\n2. Select Individually - Choose which to backup\n3. Keep All - No changes\n```\n\n### Step 6: Execute Backup\n\n```bash\nmkdir -p ~/.claude/skills/.bak\nmv ~/.claude/skills/{duplicate-skill} ~/.claude/skills/.bak/\n```\n\n### Step 7: Report\n\n```\n## Deduplication Complete\n\n| Item | Count |\n|------|-------|\n| Skills checked | X |\n| Duplicates found | Y |\n| Backed up | Z |\n| Unique skills | N |\n```\n\n## Additional Checks\n\n### Similar Names\n\nAlso check for similar (not exact) matches:\n\n| User Skill | Plugin | Similarity |\n|------------|--------|------------|\n| git-commit | plugin:commit-helper | Name overlap |\n| k8s-debug | plugin:kubernetes-debug | Same purpose |\n\nRecommend review or merge.\n\n### Orphaned Backups\n\nCheck `.bak/` folder for old backups:\n\n```bash\nls ~/.claude/skills/.bak/\n```\n\nOffer cleanup:\n```\nClean up old backup folders?\n1. Delete All (Recommended) - Remove ~/.claude/skills/.bak/*\n2. Keep - Preserve for recovery\n```\n\n## Integration with Lint\n\nWhen running `/skill-manager lint`:\n\nIf duplicates detected during scan:\n```\n💡 Found 3 potential duplicates with plugins.\n   Run dedup? /skill-manager dedup\n```\n\n## Notes\n\n- Backups go to `~/.claude/skills/.bak/`\n- Plugin skills take precedence (maintained upstream)\n- User customizations should be merged into project skills\n- Review backup folder periodically\n\nFile v0.10.0:find.md\n\n# Find Skills\n\nDiscover and install skills from the open agent skills ecosystem using the Skills CLI (`npx skills`).\n\n## When to Use\n\n- User asks \"how do I do X\" where X might have an existing skill\n- \"find a skill for X\", \"is there a skill for X\"\n- \"can you do X\" where X is a specialized capability\n- User wants to extend agent capabilities with new tools/workflows\n\n## Skills CLI\n\nThe Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem.\n\n**Key commands:**\n\n```bash\nnpx skills find [query]              # Search for skills\nnpx skills add <owner/repo@skill>    # Install\n\nArchive v0.9.0: 28 files, 98106 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (14462b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13127b), language.md (9121b), LICENSE (1063b), lint.md (33473b), merge.md (3444b), portability.md (14060b), publish-scope.md (8539b), README.md (644b), resources/skill-yaml-validate.sh (1818b), resources/trigger-PostToolUse.js (3340b), resources/trigger-PreToolUse.js (3771b), resources/trigger-Stop.js (2572b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/skillspector_lint.py (9319b), scripts/trigger-compile.sh (20456b), skill-card.md (2332b), SKILL.md (5807b), trigger.md (8412b), upgrade.md (33611b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.8.1: 27 files, 94073 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (13572b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13127b), language.md (9121b), LICENSE (1063b), lint.md (32089b), merge.md (3444b), portability.md (14060b), publish-scope.md (8539b), README.md (644b), resources/skill-yaml-validate.sh (1818b), resources/trigger-PostToolUse.js (3340b), resources/trigger-PreToolUse.js (3771b), resources/trigger-Stop.js (2572b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (20456b), skill-card.md (2336b), SKILL.md (5807b), trigger.md (8412b), upgrade.md (33611b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.8.0: 27 files, 93840 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (13242b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13127b), language.md (9121b), LICENSE (1063b), lint.md (32089b), merge.md (3444b), portability.md (14060b), publish-scope.md (8539b), README.md (644b), resources/skill-yaml-validate.sh (1818b), resources/trigger-PostToolUse.js (3340b), resources/trigger-PreToolUse.js (3771b), resources/trigger-Stop.js (2572b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (20456b), skill-card.md (2086b), SKILL.md (5807b), trigger.md (8412b), upgrade.md (33611b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.7.1: 23 files, 84867 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (10771b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13331b), language.md (9121b), LICENSE (1063b), lint.md (32089b), merge.md (3444b), portability.md (13956b), publish-scope.md (8539b), README.md (644b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (13249b), skill-card.md (2269b), SKILL.md (5807b), trigger.md (8252b), upgrade.md (33611b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.7.0: 23 files, 84766 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (10225b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13331b), language.md (9121b), LICENSE (1063b), lint.md (32089b), merge.md (3444b), portability.md (13956b), publish-scope.md (8539b), README.md (644b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (13249b), skill-card.md (2924b), SKILL.md (5807b), trigger.md (8252b), upgrade.md (33095b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.6.3: 23 files, 83158 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (9916b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13331b), language.md (9121b), LICENSE (1063b), lint.md (28686b), merge.md (3444b), portability.md (13956b), publish-scope.md (8539b), README.md (644b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (13249b), skill-card.md (2434b), SKILL.md (5807b), trigger.md (8252b), upgrade.md (33095b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.6.2: 23 files, 81569 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (9099b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (13331b), language.md (5855b), LICENSE (1063b), lint.md (28686b), merge.md (3444b), portability.md (13956b), publish-scope.md (8539b), README.md (644b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (13249b), skill-card.md (2529b), SKILL.md (5807b), trigger.md (8252b), upgrade.md (32904b), writer.md (11661b), _meta.json (128b)\n\nArchive v0.6.1: 23 files, 80874 bytes\n\nFiles: architecture.md (9110b), CHANGELOG.md (8365b), convert.md (1595b), dedup.md (2564b), find.md (4233b), graph.md (7168b), invoke-discipline.md (12705b), language.md (5855b), LICENSE (1063b), lint.md (27167b), merge.md (3444b), portability.md (13956b), publish-scope.md (8539b), README.md (644b), route.md (8688b), scripts/extract-deps.sh (7945b), scripts/trigger-compile.sh (13249b), skill-card.md (2559b), SKILL.md (5796b), trigger.md (8252b), upgrade.md (32904b), writer.md (11661b), _meta.json (128b)","readmeExcerpt":"Skill: skill-kit Owner: drumrobot Summary: Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"/skill-kit writer                  # Start wizard"},{"language":"bash","snippet":"/skill-kit upgrade skill-name      # Interactive upgrade\n/skill-kit lint skill-name         # Validation only"},{"language":"bash","snippet":"/skill-kit trigger compile     # Scan skills -> generate dispatcher -> register in settings.json\n/skill-kit trigger list        # List registered triggers\n/skill-kit trigger dry-run     # Preview only"},{"language":"bash","snippet":"/skill-kit find <query>        # Search the open skills ecosystem via npx skills CLI"},{"language":"bash","snippet":"npx skills add es6kr/skills --skill skill-kit"},{"language":"bash","snippet":"npx skills add es6kr/skills --skill cc-plugin"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: skill-kit\ndepends-on: [cc-plugin, clawhub, cleanup, es6kr]\nmetadata:\n  author: es6kr\n  version: \"0.1.2\"\ndescription: |\n  Claude Code skill management. Topics — writer (create), lint (validate + fix frontmatter), merge (combine related), dedup (find duplicates), convert (agent → skill), architecture (multi-topic structure), upgrade (enhance + add topics), route (topic placement), trigger (declare + auto-register hooks), find (discover via npx skills CLI), graph (extract depends-on + topic body Skill calls into Edge Table + Mermaid + dispatched d3 force-directed render), language (per-skill language consistency enforcement), portability (public skill cross-ref + vendor isolation), publish-scope (published skill scope review before extending), invoke-discipline (slash command → Skill tool call, multi-topic Read, post-decision auto-invoke, interactive script, vendor dispatch). Use when: \"skill writer\", \"skill lint\", \"skill merge\", \"skill dedup\", \"create skill\", \"frontmatter fix\", \"multi-topic skill\", \"convert agent\", \"skill upgrade\", \"add topic\", \"topic route\", \"trigger compile\", \"hook auto register\", \"find skill\", \"discover skill\", \"npx skills\", \"skills.sh\", \"install skill\", \"skill graph\", \"skill dependency graph\", \"depends-on extract\", \"mermaid skill graph\", \"force-directed skill graph\", \"skill language\", \"description language\", \"portability\", \"publish scope\", \"slash command tool call\", \"Skill tool missing\", \"multi-topic read\", \"invoke discipline\", \"post-decision skill invoke\", \"interactive script\".\n---\n\n# Skill-Kit\n\nComprehensive toolkit for creating, managing, and maintaining Claude Code skills.\n\n## Commands\n\n| Command | Description | Link |\n| ------- | ----------- | ---- |\n| architecture | Multi-topic skill structure and topics | [architecture.md](./architecture.md) |\n| convert | Convert agents or scripts to skills | [convert.md](./convert.md) |\n| dedup | Identify and merge duplicate skills | [dedup.md](./dedup.md) |\n| find | Discover and install skills via npx skills CLI | [find.md](./find.md) |\n| graph | Extract `depends-on` + topic body `Skill(...)` edges into Edge Table + Mermaid + dispatched d3 force-directed render | [graph.md](./graph.md) |\n| language | Enforce per-skill language consistency (description-language rule + Edit/Write pre-check) | [language.md](./language.md) |\n| lint | Validate and fix SKILL.md frontmatter | [lint.md](./lint.md) |\n| merge | Combine related skills into one | [merge.md](./merge.md) |\n| portability | public/published skill cross-ref + vendor-specific isolation rules | [portability.md](./portability.md) |\n| publish-scope | published skill scope check before adding topics/scripts | [publish-scope.md](./publish-scope.md) |\n| route | Recommend topic placement within skills (plugin-level clustering → cc-plugin/clustering) | [route.md](./route.md) |\n| trigger | Register triggers and generate hooks | [trigger.md](./trigger.md) |\n| upgrade | Enhance existing skills or add topics | [upgrade.md](./upgrade.md) |"},{"path":"README.md","content":"# skill-kit\n\nClaude Code skill authoring and management — create, lint, merge, upgrade, and route skills, plus multi-topic architecture, dependency-graph, and publishing tooling.\n\n## Installation\n\n```bash\nnpx skills add es6kr/skills --skill skill-kit\n```\n\nBrowse on ClawHub: <https://clawhub.ai/skills/skill-kit>\n\n### Peer skills\n\n`skill-kit` depends on `cc-plugin` and `clawhub` (a companion skill for ClawHub publishing). Install the published peer:\n\n```bash\nnpx skills add es6kr/skills --skill cc-plugin\n```\n\n## Usage\n\nInvoke with `/skill-kit <topic>` (for example `/skill-kit lint`). See [`SKILL.md`](./SKILL.md) for the full topic list."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn74k8yfvftx6f062qa8fzyd8h8373jd\",\n  \"slug\": \"skill-kit\",\n  \"version\": \"0.11.0\",\n  \"publishedAt\": 1791543255004\n}"},{"path":"architecture.md","content":"# Multi-Topic Skill Architecture\n\nDefine the directory structure for skills with multiple related topics.\n\n## When to Use\n\n- Creating a new skill with multiple sub-topics\n- Merging related skills into one\n- Organizing complex skills with separate guides\n\n## Directory Structure\n\n```\n~/.claude/skills/{skill-name}/\n├── SKILL.md          # Unified frontmatter + topic references\n├── {topic1}.md       # First topic content (no frontmatter)\n├── {topic2}.md       # Second topic content (no frontmatter)\n└── scripts/          # Shell/Python scripts called by topics (optional)\n    ├── {script}.sh\n    └── {script}.py\n```\n\n### File Roles\n\n| File | Purpose |\n|------|---------|\n| `SKILL.md` | Entry point with frontmatter, overview, and topic index |\n| `{topic}.md` | Detailed guide for specific topic (no frontmatter) |\n| `scripts/` | Reusable scripts referenced from topic files |\n\n### scripts/ Rules\n\n- **All scripts executed by the skill must be inside `scripts/`** — no external path references\n- Scripts must be permanent files (no tmp paths)\n- Reference scripts from topic files using relative paths: `bash scripts/run.sh`\n- If using scripts outside the skill (`~/Sync/...`, `/usr/local/...`) → copy into `scripts/` first\n\n## SKILL.md Template\n\n```yaml\n---\nname: {skill-name}\ndescription: {unified description}. {topic1} - {desc1}, {topic2} - {desc2}. \"{trigger1}\", \"{trigger2}\" triggers\n---\n\n# {Skill Name}\n\n{Common theme description}\n\n## Topic Dispatch\n\n**When this skill is invoked with a topic specifier (e.g., `/{skill-name} {topic1}` or `Skill(\"{skill-name}\", \"{topic1}\")`), load and follow only the matching topic file (`{topic1}.md`). Do not echo the Topics table or summarize other topics in the response.** The Topics table below is an index for invocations without a topic specifier — it is not user-facing output when a topic is named.\n\n## Topics\n\n| Topic | Description | Guide |\n|-------|-------------|-------|\n| {topic1} | {description} | [{topic1}.md](./{topic1}.md) |\n| {topic2} | {description} | [{topic2}.md](./{topic2}.md) |\n\n## Quick Reference\n\n### {Topic1}\n\nBrief summary of topic1.\n\nSee [detailed guide](./{topic1}.md).\n\n### {Topic2}\n\nBrief summary of topic2.\n\nSee [detailed guide](./{topic2}.md).\n```\n\n## Topic File Template\n\nTopic files contain only content (no frontmatter):\n\n```markdown\n# {Topic Title}\n\n{Detailed guide content}\n\n## When to Use\n\n{Specific use cases for this topic}\n\n## Instructions\n\n{Step-by-step guidance}\n\n## Examples\n\n{Concrete usage examples}\n```\n\n## Naming Conventions\n\n| Element | Convention | Example |\n|---------|------------|---------|\n| Skill directory | lowercase, hyphens | `argocd-helm` |\n| Topic files | lowercase, hyphens, `.md` | `cleanup.md`, `oci.md` |\n| SKILL.md | Uppercase | `SKILL.md` |\n\n## Description Format\n\nFor multi-topic skills, use this description pattern (no markdown links to save tokens):\n\n```\n{Overall purpose}. {topic1} - {brief desc} [{file}], {topic2} - {brief desc} [{file}]. \"{trigger1}\", \"{trigger2}\" triggers\n```\n\nE"},{"path":"CHANGELOG.md","content":"# Changelog\n\n## [0.11.0](https://github.com/es6kr/skills/compare/skill-kit-v0.10.0...skill-kit-v0.11.0) (2026-10-06)\n\n\n### Features\n\n* **hook-kit:** declarative step-dependency enforcement engine ([9e3d188](https://github.com/es6kr/skills/commit/9e3d18898453d20a947b74b24032e61bf13bc297))\n\n\n### Bug Fixes\n\n* **skill-kit:** generalize invoke-discipline §1 beyond slash-command receipt ([#602](https://github.com/es6kr/skills/issues/602)) ([6508508](https://github.com/es6kr/skills/commit/65085089effbde0dd1ea0c2a68090614545a7928))\n\n## [0.10.0](https://github.com/es6kr/skills/compare/skill-kit-v0.9.0...skill-kit-v0.10.0) (2026-09-27)\n\n\n### Features\n\n* **skill-kit:** add skill topology graph extractor, analyzer, visualizer, wiki sync, and context enricher ([#552](https://github.com/es6kr/skills/issues/552)) ([0472c23](https://github.com/es6kr/skills/commit/0472c2323d0990ddc13669b2b7843171b85e2c7e))\n\n## [0.9.0](https://github.com/es6kr/skills/compare/skill-kit-v0.8.1...skill-kit-v0.9.0) (2026-09-20)\n\n\n### Features\n\n* **skill-kit:** implement SkillSpector static linter and security scanner (green) ([720d0f3](https://github.com/es6kr/skills/commit/720d0f314295da4b098cc4727e93352653aab17d))\n\n\n### Bug Fixes\n\n* **skill-kit:** document SkillSpector static analysis and security scanner in lint.md ([#514](https://github.com/es6kr/skills/issues/514)) ([fe60edb](https://github.com/es6kr/skills/commit/fe60edbe17715d1b4eb83b7148757f4808527768))\n* **skill-kit:** fix SkillSpector detection gaps and correct its own doc ([0c43ca3](https://github.com/es6kr/skills/commit/0c43ca3b7be8ec99afd231ca0a575a210025ca8c))\n* **skill-kit:** replace pipe to shell pattern with safe installer download in lint.md ([4bd5371](https://github.com/es6kr/skills/commit/4bd53719572fed09b8a1a7a97ba2b9536c74c0b2))\n\n## [0.8.1](https://github.com/es6kr/skills/compare/skill-kit-v0.8.0...skill-kit-v0.8.1) (2026-09-18)\n\n\n### Bug Fixes\n\n* **cleanup:** make the session-end report table self-sufficient ([#487](https://github.com/es6kr/skills/issues/487)) ([c4a0255](https://github.com/es6kr/skills/commit/c4a02557fb8de3b32cf337c549f62535dabf824b))\n\n## [0.8.0](https://github.com/es6kr/skills/compare/skill-kit-v0.7.1...skill-kit-v0.8.0) (2026-08-29)\n\n\n### Features\n\n* promote next-feat batch (backlog skill, hooks JS port, git-repo doctor, pre-push guard) ([0d76a4c](https://github.com/es6kr/skills/commit/0d76a4c01180fbdc78bfeec8dea91373b4912470))\n* **skill-kit:** support exclude_content in trigger-compile and add unit tests ([f4400ef](https://github.com/es6kr/skills/commit/f4400ef586a666d9e16e001e84011bf1ec675425))\n\n\n### Bug Fixes\n\n* address CodeRabbit and Copilot review feedback on PR [#385](https://github.com/es6kr/skills/issues/385) ([e94de34](https://github.com/es6kr/skills/commit/e94de34ce5e075c79b7edc5d672813cea94a0acc))\n* address CodeRabbit and Copilot review feedback on PR [#389](https://github.com/es6kr/skills/issues/389) ([db4dfff](https://github.com/es6kr/skills/commit/db4dfff2829632bf263d93e0bbfdd124"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1401,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:01:19.466Z","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-09T14:01:19.466Z","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-09T18:05:34.660Z","emptyReason":null},"items":[{"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":"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-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","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"}]}}}