@chankov/agent-skills 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/{doctor.md → doctor-agent-skills.md} +1 -1
- package/.pi/extensions/agent-skills-update-check/README.md +58 -0
- package/.pi/extensions/agent-skills-update-check/index.ts +161 -0
- package/.pi/extensions/agent-skills-update-check/package.json +6 -0
- package/.pi/prompts/{doctor.md → doctor-agent-skills.md} +1 -1
- package/.versions/0.2.0/.claude/commands/build.md +18 -0
- package/.versions/0.2.0/.claude/commands/code-simplify.md +22 -0
- package/.versions/0.2.0/.claude/commands/design-agent.md +14 -0
- package/.versions/0.2.0/.claude/commands/doctor-agent-skills.md +13 -0
- package/.versions/0.2.0/.claude/commands/plan.md +16 -0
- package/.versions/0.2.0/.claude/commands/prime.md +22 -0
- package/.versions/0.2.0/.claude/commands/review.md +16 -0
- package/.versions/0.2.0/.claude/commands/setup-agent-skills.md +19 -0
- package/.versions/0.2.0/.claude/commands/ship.md +17 -0
- package/.versions/0.2.0/.claude/commands/spec.md +15 -0
- package/.versions/0.2.0/.claude/commands/test.md +19 -0
- package/.versions/0.2.0/.opencode/commands/as-build.md +17 -0
- package/.versions/0.2.0/.opencode/commands/as-code-simplify.md +16 -0
- package/.versions/0.2.0/.opencode/commands/as-design-agent.md +15 -0
- package/.versions/0.2.0/.opencode/commands/as-doctor-agent-skills.md +11 -0
- package/.versions/0.2.0/.opencode/commands/as-plan.md +16 -0
- package/.versions/0.2.0/.opencode/commands/as-prime.md +22 -0
- package/.versions/0.2.0/.opencode/commands/as-review.md +15 -0
- package/.versions/0.2.0/.opencode/commands/as-setup-agent-skills.md +11 -0
- package/.versions/0.2.0/.opencode/commands/as-ship.md +16 -0
- package/.versions/0.2.0/.opencode/commands/as-spec.md +16 -0
- package/.versions/0.2.0/.opencode/commands/as-test.md +21 -0
- package/.versions/0.2.0/.pi/agents/agent-chain.yaml +49 -0
- package/.versions/0.2.0/.pi/agents/bowser.md +19 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/agent-expert.md +98 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/cli-expert.md +41 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/config-expert.md +63 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/ext-expert.md +43 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/keybinding-expert.md +134 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/pi-orchestrator.md +57 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/prompt-expert.md +70 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/skill-expert.md +42 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/theme-expert.md +40 -0
- package/.versions/0.2.0/.pi/agents/pi-pi/tui-expert.md +85 -0
- package/.versions/0.2.0/.pi/agents/teams.yaml +31 -0
- package/.versions/0.2.0/.pi/damage-control-rules.yaml +278 -0
- package/.versions/0.2.0/.pi/extensions/agent-skills-update-check/README.md +58 -0
- package/.versions/0.2.0/.pi/extensions/agent-skills-update-check/index.ts +161 -0
- package/.versions/0.2.0/.pi/extensions/agent-skills-update-check/package.json +6 -0
- package/.versions/0.2.0/.pi/extensions/chrome-devtools-mcp/README.md +39 -0
- package/.versions/0.2.0/.pi/extensions/chrome-devtools-mcp/index.ts +61 -0
- package/.versions/0.2.0/.pi/extensions/chrome-devtools-mcp/package.json +6 -0
- package/.versions/0.2.0/.pi/extensions/compact-and-continue/README.md +42 -0
- package/.versions/0.2.0/.pi/extensions/compact-and-continue/index.ts +120 -0
- package/.versions/0.2.0/.pi/extensions/compact-and-continue/package.json +6 -0
- package/.versions/0.2.0/.pi/extensions/mcp-bridge/README.md +46 -0
- package/.versions/0.2.0/.pi/extensions/mcp-bridge/index.ts +206 -0
- package/.versions/0.2.0/.pi/extensions/mcp-bridge/package.json +6 -0
- package/.versions/0.2.0/.pi/extensions/package-lock.json +1143 -0
- package/.versions/0.2.0/.pi/extensions/package.json +9 -0
- package/.versions/0.2.0/.pi/harnesses/agent-chain/README.md +37 -0
- package/.versions/0.2.0/.pi/harnesses/agent-chain/index.ts +795 -0
- package/.versions/0.2.0/.pi/harnesses/agent-chain/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/agent-team/README.md +38 -0
- package/.versions/0.2.0/.pi/harnesses/agent-team/index.ts +732 -0
- package/.versions/0.2.0/.pi/harnesses/agent-team/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/coms/README.md +36 -0
- package/.versions/0.2.0/.pi/harnesses/coms/index.ts +1595 -0
- package/.versions/0.2.0/.pi/harnesses/coms/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/coms-net/README.md +46 -0
- package/.versions/0.2.0/.pi/harnesses/coms-net/index.ts +1637 -0
- package/.versions/0.2.0/.pi/harnesses/coms-net/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control/README.md +38 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control/index.ts +207 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control-continue/README.md +37 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control-continue/index.ts +234 -0
- package/.versions/0.2.0/.pi/harnesses/damage-control-continue/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/minimal/README.md +27 -0
- package/.versions/0.2.0/.pi/harnesses/minimal/index.ts +32 -0
- package/.versions/0.2.0/.pi/harnesses/minimal/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/package-lock.json +35 -0
- package/.versions/0.2.0/.pi/harnesses/package.json +9 -0
- package/.versions/0.2.0/.pi/harnesses/pi-pi/README.md +39 -0
- package/.versions/0.2.0/.pi/harnesses/pi-pi/index.ts +631 -0
- package/.versions/0.2.0/.pi/harnesses/pi-pi/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/purpose-gate/README.md +27 -0
- package/.versions/0.2.0/.pi/harnesses/purpose-gate/index.ts +82 -0
- package/.versions/0.2.0/.pi/harnesses/purpose-gate/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/session-replay/README.md +28 -0
- package/.versions/0.2.0/.pi/harnesses/session-replay/index.ts +214 -0
- package/.versions/0.2.0/.pi/harnesses/session-replay/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/subagent-widget/README.md +36 -0
- package/.versions/0.2.0/.pi/harnesses/subagent-widget/index.ts +479 -0
- package/.versions/0.2.0/.pi/harnesses/subagent-widget/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/system-select/README.md +39 -0
- package/.versions/0.2.0/.pi/harnesses/system-select/index.ts +165 -0
- package/.versions/0.2.0/.pi/harnesses/system-select/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/tilldone/README.md +35 -0
- package/.versions/0.2.0/.pi/harnesses/tilldone/index.ts +724 -0
- package/.versions/0.2.0/.pi/harnesses/tilldone/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter/README.md +31 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter/index.ts +100 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter/package.json +6 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter-widget/README.md +27 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter-widget/index.ts +66 -0
- package/.versions/0.2.0/.pi/harnesses/tool-counter-widget/package.json +6 -0
- package/.versions/0.2.0/.pi/prompts/build.md +24 -0
- package/.versions/0.2.0/.pi/prompts/code-simplify.md +22 -0
- package/.versions/0.2.0/.pi/prompts/doctor-agent-skills.md +13 -0
- package/.versions/0.2.0/.pi/prompts/plan.md +16 -0
- package/.versions/0.2.0/.pi/prompts/review.md +16 -0
- package/.versions/0.2.0/.pi/prompts/setup-agent-skills.md +19 -0
- package/.versions/0.2.0/.pi/prompts/ship.md +17 -0
- package/.versions/0.2.0/.pi/prompts/spec.md +15 -0
- package/.versions/0.2.0/.pi/prompts/test.md +19 -0
- package/.versions/0.2.0/.pi/skills/bowser/SKILL.md +114 -0
- package/.versions/0.2.0/.version +1 -0
- package/.versions/0.2.0/agents/builder.md +6 -0
- package/.versions/0.2.0/agents/code-reviewer.md +93 -0
- package/.versions/0.2.0/agents/documenter.md +6 -0
- package/.versions/0.2.0/agents/plan-reviewer.md +22 -0
- package/.versions/0.2.0/agents/planner.md +6 -0
- package/.versions/0.2.0/agents/scout.md +6 -0
- package/.versions/0.2.0/agents/security-auditor.md +97 -0
- package/.versions/0.2.0/agents/test-engineer.md +89 -0
- package/.versions/0.2.0/hooks/SIMPLIFY-IGNORE.md +90 -0
- package/.versions/0.2.0/hooks/hooks.json +14 -0
- package/.versions/0.2.0/hooks/session-start.sh +74 -0
- package/.versions/0.2.0/hooks/simplify-ignore-test.sh +247 -0
- package/.versions/0.2.0/hooks/simplify-ignore.sh +302 -0
- package/.versions/0.2.0/references/accessibility-checklist.md +159 -0
- package/.versions/0.2.0/references/performance-checklist.md +121 -0
- package/.versions/0.2.0/references/prompting-patterns.md +380 -0
- package/.versions/0.2.0/references/security-checklist.md +134 -0
- package/.versions/0.2.0/references/testing-patterns.md +236 -0
- package/.versions/0.2.0/skills/api-and-interface-design/SKILL.md +294 -0
- package/.versions/0.2.0/skills/browser-testing-with-devtools/SKILL.md +335 -0
- package/.versions/0.2.0/skills/ci-cd-and-automation/SKILL.md +390 -0
- package/.versions/0.2.0/skills/code-review-and-quality/SKILL.md +347 -0
- package/.versions/0.2.0/skills/code-simplification/SKILL.md +331 -0
- package/.versions/0.2.0/skills/context-engineering/SKILL.md +291 -0
- package/.versions/0.2.0/skills/debugging-and-error-recovery/SKILL.md +300 -0
- package/.versions/0.2.0/skills/deprecation-and-migration/SKILL.md +206 -0
- package/.versions/0.2.0/skills/designing-agents/SKILL.md +394 -0
- package/.versions/0.2.0/skills/designing-agents/pi-harness-authoring.md +213 -0
- package/.versions/0.2.0/skills/documentation-and-adrs/SKILL.md +278 -0
- package/.versions/0.2.0/skills/frontend-ui-engineering/SKILL.md +322 -0
- package/.versions/0.2.0/skills/git-workflow-and-versioning/SKILL.md +316 -0
- package/.versions/0.2.0/skills/guided-workspace-setup/SKILL.md +331 -0
- package/.versions/0.2.0/skills/idea-refine/SKILL.md +178 -0
- package/.versions/0.2.0/skills/idea-refine/examples.md +238 -0
- package/.versions/0.2.0/skills/idea-refine/frameworks.md +99 -0
- package/.versions/0.2.0/skills/idea-refine/refinement-criteria.md +113 -0
- package/.versions/0.2.0/skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/.versions/0.2.0/skills/incremental-implementation/SKILL.md +279 -0
- package/.versions/0.2.0/skills/performance-optimization/SKILL.md +350 -0
- package/.versions/0.2.0/skills/planning-and-task-breakdown/SKILL.md +237 -0
- package/.versions/0.2.0/skills/security-and-hardening/SKILL.md +349 -0
- package/.versions/0.2.0/skills/shipping-and-launch/SKILL.md +309 -0
- package/.versions/0.2.0/skills/source-driven-development/SKILL.md +194 -0
- package/.versions/0.2.0/skills/spec-driven-development/SKILL.md +237 -0
- package/.versions/0.2.0/skills/test-driven-development/SKILL.md +379 -0
- package/.versions/0.2.0/skills/using-agent-skills/SKILL.md +176 -0
- package/.versions/0.3.0/.claude/commands/build.md +18 -0
- package/.versions/0.3.0/.claude/commands/code-simplify.md +22 -0
- package/.versions/0.3.0/.claude/commands/design-agent.md +14 -0
- package/.versions/0.3.0/.claude/commands/doctor-agent-skills.md +13 -0
- package/.versions/0.3.0/.claude/commands/plan.md +16 -0
- package/.versions/0.3.0/.claude/commands/prime.md +22 -0
- package/.versions/0.3.0/.claude/commands/review.md +16 -0
- package/.versions/0.3.0/.claude/commands/setup-agent-skills.md +19 -0
- package/.versions/0.3.0/.claude/commands/ship.md +17 -0
- package/.versions/0.3.0/.claude/commands/spec.md +15 -0
- package/.versions/0.3.0/.claude/commands/test.md +19 -0
- package/.versions/0.3.0/.opencode/commands/as-build.md +17 -0
- package/.versions/0.3.0/.opencode/commands/as-code-simplify.md +16 -0
- package/.versions/0.3.0/.opencode/commands/as-design-agent.md +15 -0
- package/.versions/0.3.0/.opencode/commands/as-doctor-agent-skills.md +11 -0
- package/.versions/0.3.0/.opencode/commands/as-plan.md +16 -0
- package/.versions/0.3.0/.opencode/commands/as-prime.md +22 -0
- package/.versions/0.3.0/.opencode/commands/as-review.md +15 -0
- package/.versions/0.3.0/.opencode/commands/as-setup-agent-skills.md +11 -0
- package/.versions/0.3.0/.opencode/commands/as-ship.md +16 -0
- package/.versions/0.3.0/.opencode/commands/as-spec.md +16 -0
- package/.versions/0.3.0/.opencode/commands/as-test.md +21 -0
- package/.versions/0.3.0/.pi/agents/agent-chain.yaml +49 -0
- package/.versions/0.3.0/.pi/agents/bowser.md +19 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/agent-expert.md +98 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/cli-expert.md +41 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/config-expert.md +63 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/ext-expert.md +43 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/keybinding-expert.md +134 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/pi-orchestrator.md +57 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/prompt-expert.md +70 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/skill-expert.md +42 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/theme-expert.md +40 -0
- package/.versions/0.3.0/.pi/agents/pi-pi/tui-expert.md +85 -0
- package/.versions/0.3.0/.pi/agents/teams.yaml +31 -0
- package/.versions/0.3.0/.pi/damage-control-rules.yaml +278 -0
- package/.versions/0.3.0/.pi/extensions/agent-skills-update-check/README.md +58 -0
- package/.versions/0.3.0/.pi/extensions/agent-skills-update-check/index.ts +161 -0
- package/.versions/0.3.0/.pi/extensions/agent-skills-update-check/package.json +6 -0
- package/.versions/0.3.0/.pi/extensions/chrome-devtools-mcp/README.md +39 -0
- package/.versions/0.3.0/.pi/extensions/chrome-devtools-mcp/index.ts +61 -0
- package/.versions/0.3.0/.pi/extensions/chrome-devtools-mcp/package.json +6 -0
- package/.versions/0.3.0/.pi/extensions/compact-and-continue/README.md +42 -0
- package/.versions/0.3.0/.pi/extensions/compact-and-continue/index.ts +120 -0
- package/.versions/0.3.0/.pi/extensions/compact-and-continue/package.json +6 -0
- package/.versions/0.3.0/.pi/extensions/mcp-bridge/README.md +46 -0
- package/.versions/0.3.0/.pi/extensions/mcp-bridge/index.ts +206 -0
- package/.versions/0.3.0/.pi/extensions/mcp-bridge/package.json +6 -0
- package/.versions/0.3.0/.pi/extensions/package-lock.json +1143 -0
- package/.versions/0.3.0/.pi/extensions/package.json +9 -0
- package/.versions/0.3.0/.pi/harnesses/agent-chain/README.md +37 -0
- package/.versions/0.3.0/.pi/harnesses/agent-chain/index.ts +795 -0
- package/.versions/0.3.0/.pi/harnesses/agent-chain/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/agent-team/README.md +38 -0
- package/.versions/0.3.0/.pi/harnesses/agent-team/index.ts +732 -0
- package/.versions/0.3.0/.pi/harnesses/agent-team/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/coms/README.md +36 -0
- package/.versions/0.3.0/.pi/harnesses/coms/index.ts +1595 -0
- package/.versions/0.3.0/.pi/harnesses/coms/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/coms-net/README.md +46 -0
- package/.versions/0.3.0/.pi/harnesses/coms-net/index.ts +1637 -0
- package/.versions/0.3.0/.pi/harnesses/coms-net/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control/README.md +38 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control/index.ts +207 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control-continue/README.md +37 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control-continue/index.ts +234 -0
- package/.versions/0.3.0/.pi/harnesses/damage-control-continue/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/minimal/README.md +27 -0
- package/.versions/0.3.0/.pi/harnesses/minimal/index.ts +32 -0
- package/.versions/0.3.0/.pi/harnesses/minimal/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/package-lock.json +35 -0
- package/.versions/0.3.0/.pi/harnesses/package.json +9 -0
- package/.versions/0.3.0/.pi/harnesses/pi-pi/README.md +39 -0
- package/.versions/0.3.0/.pi/harnesses/pi-pi/index.ts +631 -0
- package/.versions/0.3.0/.pi/harnesses/pi-pi/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/purpose-gate/README.md +27 -0
- package/.versions/0.3.0/.pi/harnesses/purpose-gate/index.ts +82 -0
- package/.versions/0.3.0/.pi/harnesses/purpose-gate/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/session-replay/README.md +28 -0
- package/.versions/0.3.0/.pi/harnesses/session-replay/index.ts +214 -0
- package/.versions/0.3.0/.pi/harnesses/session-replay/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/subagent-widget/README.md +36 -0
- package/.versions/0.3.0/.pi/harnesses/subagent-widget/index.ts +479 -0
- package/.versions/0.3.0/.pi/harnesses/subagent-widget/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/system-select/README.md +39 -0
- package/.versions/0.3.0/.pi/harnesses/system-select/index.ts +165 -0
- package/.versions/0.3.0/.pi/harnesses/system-select/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/tilldone/README.md +35 -0
- package/.versions/0.3.0/.pi/harnesses/tilldone/index.ts +724 -0
- package/.versions/0.3.0/.pi/harnesses/tilldone/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter/README.md +31 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter/index.ts +100 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter/package.json +6 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter-widget/README.md +27 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter-widget/index.ts +66 -0
- package/.versions/0.3.0/.pi/harnesses/tool-counter-widget/package.json +6 -0
- package/.versions/0.3.0/.pi/prompts/build.md +24 -0
- package/.versions/0.3.0/.pi/prompts/code-simplify.md +22 -0
- package/.versions/0.3.0/.pi/prompts/doctor-agent-skills.md +13 -0
- package/.versions/0.3.0/.pi/prompts/plan.md +16 -0
- package/.versions/0.3.0/.pi/prompts/review.md +16 -0
- package/.versions/0.3.0/.pi/prompts/setup-agent-skills.md +19 -0
- package/.versions/0.3.0/.pi/prompts/ship.md +17 -0
- package/.versions/0.3.0/.pi/prompts/spec.md +15 -0
- package/.versions/0.3.0/.pi/prompts/test.md +19 -0
- package/.versions/0.3.0/.pi/skills/bowser/SKILL.md +114 -0
- package/.versions/0.3.0/.version +1 -0
- package/.versions/0.3.0/agents/builder.md +6 -0
- package/.versions/0.3.0/agents/code-reviewer.md +93 -0
- package/.versions/0.3.0/agents/documenter.md +6 -0
- package/.versions/0.3.0/agents/plan-reviewer.md +22 -0
- package/.versions/0.3.0/agents/planner.md +6 -0
- package/.versions/0.3.0/agents/scout.md +6 -0
- package/.versions/0.3.0/agents/security-auditor.md +97 -0
- package/.versions/0.3.0/agents/test-engineer.md +89 -0
- package/.versions/0.3.0/hooks/SIMPLIFY-IGNORE.md +90 -0
- package/.versions/0.3.0/hooks/hooks.json +14 -0
- package/.versions/0.3.0/hooks/session-start.sh +74 -0
- package/.versions/0.3.0/hooks/simplify-ignore-test.sh +247 -0
- package/.versions/0.3.0/hooks/simplify-ignore.sh +302 -0
- package/.versions/0.3.0/references/accessibility-checklist.md +159 -0
- package/.versions/0.3.0/references/performance-checklist.md +121 -0
- package/.versions/0.3.0/references/prompting-patterns.md +380 -0
- package/.versions/0.3.0/references/security-checklist.md +134 -0
- package/.versions/0.3.0/references/testing-patterns.md +236 -0
- package/.versions/0.3.0/skills/api-and-interface-design/SKILL.md +294 -0
- package/.versions/0.3.0/skills/browser-testing-with-devtools/SKILL.md +335 -0
- package/.versions/0.3.0/skills/ci-cd-and-automation/SKILL.md +390 -0
- package/.versions/0.3.0/skills/code-review-and-quality/SKILL.md +347 -0
- package/.versions/0.3.0/skills/code-simplification/SKILL.md +331 -0
- package/.versions/0.3.0/skills/context-engineering/SKILL.md +291 -0
- package/.versions/0.3.0/skills/debugging-and-error-recovery/SKILL.md +300 -0
- package/.versions/0.3.0/skills/deprecation-and-migration/SKILL.md +206 -0
- package/.versions/0.3.0/skills/designing-agents/SKILL.md +394 -0
- package/.versions/0.3.0/skills/designing-agents/pi-harness-authoring.md +213 -0
- package/.versions/0.3.0/skills/documentation-and-adrs/SKILL.md +278 -0
- package/.versions/0.3.0/skills/frontend-ui-engineering/SKILL.md +322 -0
- package/.versions/0.3.0/skills/git-workflow-and-versioning/SKILL.md +316 -0
- package/.versions/0.3.0/skills/guided-workspace-setup/SKILL.md +331 -0
- package/.versions/0.3.0/skills/idea-refine/SKILL.md +178 -0
- package/.versions/0.3.0/skills/idea-refine/examples.md +238 -0
- package/.versions/0.3.0/skills/idea-refine/frameworks.md +99 -0
- package/.versions/0.3.0/skills/idea-refine/refinement-criteria.md +113 -0
- package/.versions/0.3.0/skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/.versions/0.3.0/skills/incremental-implementation/SKILL.md +279 -0
- package/.versions/0.3.0/skills/performance-optimization/SKILL.md +350 -0
- package/.versions/0.3.0/skills/planning-and-task-breakdown/SKILL.md +237 -0
- package/.versions/0.3.0/skills/security-and-hardening/SKILL.md +349 -0
- package/.versions/0.3.0/skills/shipping-and-launch/SKILL.md +309 -0
- package/.versions/0.3.0/skills/source-driven-development/SKILL.md +194 -0
- package/.versions/0.3.0/skills/spec-driven-development/SKILL.md +237 -0
- package/.versions/0.3.0/skills/test-driven-development/SKILL.md +379 -0
- package/.versions/0.3.0/skills/using-agent-skills/SKILL.md +176 -0
- package/CHANGELOG.md +108 -0
- package/README.md +5 -5
- package/bin/cli.js +133 -22
- package/bin/lib/bootstrap.js +254 -0
- package/bin/lib/doctor.js +1 -1
- package/bin/lib/update-notifier.js +195 -0
- package/docs/getting-started.md +2 -2
- package/docs/npm-install.md +91 -8
- package/hooks/session-start.sh +66 -12
- package/package.json +1 -1
- package/skills/guided-workspace-setup/SKILL.md +41 -3
- /package/.claude/commands/{setup.md → setup-agent-skills.md} +0 -0
- /package/.opencode/commands/{as-doctor.md → as-doctor-agent-skills.md} +0 -0
- /package/.opencode/commands/{as-setup.md → as-setup-agent-skills.md} +0 -0
- /package/.pi/prompts/{setup.md → setup-agent-skills.md} +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// bootstrap.js — drop the minimum installer artifacts a coding agent needs
|
|
2
|
+
// to recognize `/setup-agent-skills` and `/doctor-agent-skills`.
|
|
3
|
+
//
|
|
4
|
+
// The CLI's `init` calls this before the handoff message. Without it, a
|
|
5
|
+
// fresh workspace has no `.claude/commands/setup-agent-skills.md`, `.pi/prompts/setup-agent-skills.md`,
|
|
6
|
+
// etc., so the agent has no idea what `/setup-agent-skills` is and the whole hand-off
|
|
7
|
+
// breaks silently.
|
|
8
|
+
//
|
|
9
|
+
// What we bootstrap (per agent):
|
|
10
|
+
// - The `setup` slash command (so the user can invoke it)
|
|
11
|
+
// - The `doctor` slash command (same)
|
|
12
|
+
// - The `guided-workspace-setup` skill body (the slash command says
|
|
13
|
+
// "load this skill" — the skill must be present somewhere the agent
|
|
14
|
+
// auto-discovers)
|
|
15
|
+
//
|
|
16
|
+
// What we do NOT bootstrap:
|
|
17
|
+
// - Any of the user-facing skills (spec-driven-development,
|
|
18
|
+
// test-driven-development, …). Those are picked by the user inside
|
|
19
|
+
// /setup-agent-skills, by design. The CLI never decides the workspace's catalogue
|
|
20
|
+
// for the user.
|
|
21
|
+
//
|
|
22
|
+
// Method:
|
|
23
|
+
// `copy` — safe default; works for npx caches that may be cleaned
|
|
24
|
+
// `symlink` — leaner; only safe when the source root is stable
|
|
25
|
+
// (global install / git clone). Warning printed if the
|
|
26
|
+
// source path looks like an npx cache.
|
|
27
|
+
|
|
28
|
+
import { existsSync, mkdirSync, copyFileSync, symlinkSync, unlinkSync, lstatSync, rmSync, readdirSync, rmdirSync } from "node:fs";
|
|
29
|
+
import { dirname, join, relative } from "node:path";
|
|
30
|
+
|
|
31
|
+
// (agent → list of {kind, src, dest}) — kind is just for the report.
|
|
32
|
+
//
|
|
33
|
+
// All installer slash commands are namespaced with `-agent-skills` so they
|
|
34
|
+
// don't collide with workspace-defined or other-tool slash commands. The
|
|
35
|
+
// short names (setup, doctor, as-setup, as-doctor) were used in 0.2.0 and
|
|
36
|
+
// earlier — cleanupLegacyNames() removes those if found.
|
|
37
|
+
function plan({ agent, sourceRoot, workspace }) {
|
|
38
|
+
const skillSrc = join(sourceRoot, "skills", "guided-workspace-setup", "SKILL.md");
|
|
39
|
+
|
|
40
|
+
switch (agent) {
|
|
41
|
+
case "claude-code":
|
|
42
|
+
return [
|
|
43
|
+
{ kind: "command", src: join(sourceRoot, ".claude/commands/setup-agent-skills.md"),
|
|
44
|
+
dest: join(workspace, ".claude/commands/setup-agent-skills.md") },
|
|
45
|
+
{ kind: "command", src: join(sourceRoot, ".claude/commands/doctor-agent-skills.md"),
|
|
46
|
+
dest: join(workspace, ".claude/commands/doctor-agent-skills.md") },
|
|
47
|
+
{ kind: "skill", src: skillSrc,
|
|
48
|
+
dest: join(workspace, ".claude/skills/guided-workspace-setup/SKILL.md") },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
case "pi":
|
|
52
|
+
return [
|
|
53
|
+
{ kind: "prompt", src: join(sourceRoot, ".pi/prompts/setup-agent-skills.md"),
|
|
54
|
+
dest: join(workspace, ".pi/prompts/setup-agent-skills.md") },
|
|
55
|
+
{ kind: "prompt", src: join(sourceRoot, ".pi/prompts/doctor-agent-skills.md"),
|
|
56
|
+
dest: join(workspace, ".pi/prompts/doctor-agent-skills.md") },
|
|
57
|
+
// pi auto-discovers skills from .pi/skills/ and .agents/skills/ —
|
|
58
|
+
// we use .pi/skills/ to avoid polluting a shared .agents/ dir if
|
|
59
|
+
// the user has other tools there.
|
|
60
|
+
{ kind: "skill", src: skillSrc,
|
|
61
|
+
dest: join(workspace, ".pi/skills/guided-workspace-setup/SKILL.md") },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
case "opencode":
|
|
65
|
+
// OpenCode discovers skills + commands from ~/.config/opencode/ (global)
|
|
66
|
+
// and references AGENTS.md. A project-local bootstrap is awkward — we
|
|
67
|
+
// drop the command file into .opencode/commands/ (which OpenCode does
|
|
68
|
+
// load from the project) and the skill alongside it, then flag the
|
|
69
|
+
// AGENTS.md gap for the user.
|
|
70
|
+
return [
|
|
71
|
+
{ kind: "command", src: join(sourceRoot, ".opencode/commands/as-setup-agent-skills.md"),
|
|
72
|
+
dest: join(workspace, ".opencode/commands/as-setup-agent-skills.md") },
|
|
73
|
+
{ kind: "command", src: join(sourceRoot, ".opencode/commands/as-doctor-agent-skills.md"),
|
|
74
|
+
dest: join(workspace, ".opencode/commands/as-doctor-agent-skills.md") },
|
|
75
|
+
{ kind: "skill", src: skillSrc,
|
|
76
|
+
dest: join(workspace, ".opencode/skills/guided-workspace-setup/SKILL.md") },
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`bootstrap: unknown agent "${agent}"`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Files that were the bootstrap targets in 0.2.0 and earlier (pre-rename).
|
|
85
|
+
// Removed during bootstrap so a workspace upgraded from 0.2.0 doesn't end
|
|
86
|
+
// up with both the old and new slash commands.
|
|
87
|
+
function legacyPaths({ agent, workspace }) {
|
|
88
|
+
switch (agent) {
|
|
89
|
+
case "claude-code":
|
|
90
|
+
return [
|
|
91
|
+
join(workspace, ".claude/commands/setup.md"),
|
|
92
|
+
join(workspace, ".claude/commands/doctor.md"),
|
|
93
|
+
];
|
|
94
|
+
case "pi":
|
|
95
|
+
return [
|
|
96
|
+
join(workspace, ".pi/prompts/setup.md"),
|
|
97
|
+
join(workspace, ".pi/prompts/doctor.md"),
|
|
98
|
+
];
|
|
99
|
+
case "opencode":
|
|
100
|
+
return [
|
|
101
|
+
join(workspace, ".opencode/commands/as-setup.md"),
|
|
102
|
+
join(workspace, ".opencode/commands/as-doctor.md"),
|
|
103
|
+
];
|
|
104
|
+
default:
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Run the bootstrap.
|
|
111
|
+
*
|
|
112
|
+
* @param {object} opts
|
|
113
|
+
* @param {string} opts.agent claude-code | opencode | pi
|
|
114
|
+
* @param {string} opts.sourceRoot Absolute path to the installed package
|
|
115
|
+
* @param {string} opts.workspace Absolute path to the target workspace
|
|
116
|
+
* @param {"copy"|"symlink"} opts.method
|
|
117
|
+
* @param {boolean} [opts.dryRun]
|
|
118
|
+
* @returns {{written:Array, skipped:Array, warnings:Array}}
|
|
119
|
+
*/
|
|
120
|
+
export function bootstrap({ agent, sourceRoot, workspace, method, dryRun = false }) {
|
|
121
|
+
const items = plan({ agent, sourceRoot, workspace });
|
|
122
|
+
const written = [], skipped = [], removed = [], warnings = [];
|
|
123
|
+
|
|
124
|
+
// Warn if the user asked for symlink against an unstable source.
|
|
125
|
+
if (method === "symlink" && /\/\.npm\/_npx\//.test(sourceRoot)) {
|
|
126
|
+
warnings.push(
|
|
127
|
+
"--method symlink against an npx cache path: links will break when " +
|
|
128
|
+
"the cache is cleaned. Consider --method copy or install globally " +
|
|
129
|
+
"with `npm install -g @chankov/agent-skills`.",
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Clean up pre-0.3.0 file names if present — they were renamed to
|
|
134
|
+
// *-agent-skills so they don't collide with other slash commands.
|
|
135
|
+
for (const oldPath of legacyPaths({ agent, workspace })) {
|
|
136
|
+
if (!existsSync(oldPath) && !isSymlink(oldPath)) continue;
|
|
137
|
+
if (dryRun) {
|
|
138
|
+
removed.push(oldPath);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
unlinkSync(oldPath);
|
|
143
|
+
removed.push(oldPath);
|
|
144
|
+
} catch (err) {
|
|
145
|
+
warnings.push(`could not remove legacy file ${relative(workspace, oldPath)}: ${err.message}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
for (const item of items) {
|
|
150
|
+
if (!existsSync(item.src)) {
|
|
151
|
+
warnings.push(`missing source: ${relative(sourceRoot, item.src)} (skipping ${item.kind})`);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (dryRun) {
|
|
156
|
+
written.push({ ...item, method });
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
mkdirSync(dirname(item.dest), { recursive: true });
|
|
162
|
+
|
|
163
|
+
// Always replace — the bootstrap is installer scaffolding, not user
|
|
164
|
+
// data. If we left it stale, an upgraded package would still hand off
|
|
165
|
+
// to the old /setup-agent-skills command. Step 6 of guided-workspace-setup explicitly
|
|
166
|
+
// never offers these files in the install menu, so we are the only
|
|
167
|
+
// mechanism that refreshes them.
|
|
168
|
+
if (existsSync(item.dest) || isSymlink(item.dest)) {
|
|
169
|
+
unlinkSync(item.dest);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (method === "symlink") {
|
|
173
|
+
symlinkSync(item.src, item.dest);
|
|
174
|
+
} else {
|
|
175
|
+
// copyFileSync handles plain files; for the SKILL.md case the source
|
|
176
|
+
// may have sibling support files in some skills — but
|
|
177
|
+
// guided-workspace-setup is a single-file skill, so copyFileSync is
|
|
178
|
+
// fine. Switch to cpSync if that ever changes.
|
|
179
|
+
copyFileSync(item.src, item.dest);
|
|
180
|
+
}
|
|
181
|
+
written.push({ ...item, method });
|
|
182
|
+
} catch (err) {
|
|
183
|
+
skipped.push({ ...item, error: err.message });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return { written, skipped, removed, warnings };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Remove every bootstrap artifact this module knows how to write. Called
|
|
192
|
+
* by guided-workspace-setup at the end of Step 10 unless the user chose
|
|
193
|
+
* to keep the installer commands. After cleanup, the only way back to
|
|
194
|
+
* /setup-agent-skills is to re-run `npx @chankov/agent-skills init`.
|
|
195
|
+
*
|
|
196
|
+
* The same `agent` value must be supplied that was used at bootstrap time —
|
|
197
|
+
* we don't have a tracking file, so we delete based on the plan map.
|
|
198
|
+
*
|
|
199
|
+
* @param {object} opts
|
|
200
|
+
* @param {string} opts.agent
|
|
201
|
+
* @param {string} opts.workspace
|
|
202
|
+
* @param {boolean} [opts.dryRun]
|
|
203
|
+
* @returns {{removed:string[], kept:string[], warnings:string[]}}
|
|
204
|
+
*/
|
|
205
|
+
export function cleanupInstaller({ agent, workspace, dryRun = false }) {
|
|
206
|
+
const planned = plan({ agent, sourceRoot: workspace, workspace });
|
|
207
|
+
const removed = [], kept = [], warnings = [];
|
|
208
|
+
|
|
209
|
+
for (const item of planned) {
|
|
210
|
+
if (!existsSync(item.dest) && !isSymlink(item.dest)) {
|
|
211
|
+
kept.push(item.dest); // already gone — count it as a no-op, not an error
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (dryRun) {
|
|
215
|
+
removed.push(item.dest);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const lst = lstatSync(item.dest);
|
|
220
|
+
if (lst.isDirectory() && !lst.isSymbolicLink()) {
|
|
221
|
+
rmSync(item.dest, { recursive: true });
|
|
222
|
+
} else {
|
|
223
|
+
unlinkSync(item.dest);
|
|
224
|
+
}
|
|
225
|
+
removed.push(item.dest);
|
|
226
|
+
|
|
227
|
+
// If we removed the only file in a parent directory we created
|
|
228
|
+
// (.claude/skills/guided-workspace-setup/), prune the directory too.
|
|
229
|
+
pruneEmptyDirsUpTo(dirname(item.dest), workspace);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
warnings.push(`could not remove ${relative(workspace, item.dest)}: ${err.message}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return { removed, kept, warnings };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function pruneEmptyDirsUpTo(dir, workspace) {
|
|
239
|
+
// Walk upward removing empty parent dirs until we hit a non-empty one or
|
|
240
|
+
// the workspace root. Never delete the workspace itself.
|
|
241
|
+
try {
|
|
242
|
+
while (dir !== workspace && dir.startsWith(workspace)) {
|
|
243
|
+
const entries = readdirSync(dir);
|
|
244
|
+
if (entries.length > 0) return;
|
|
245
|
+
rmdirSync(dir);
|
|
246
|
+
dir = dirname(dir);
|
|
247
|
+
}
|
|
248
|
+
} catch { /* prune is best-effort */ }
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function isSymlink(path) {
|
|
252
|
+
try { return lstatSync(path).isSymbolicLink(); }
|
|
253
|
+
catch { return false; }
|
|
254
|
+
}
|
package/bin/lib/doctor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Doctor scan — deterministic preflight extracted from
|
|
2
2
|
// guided-workspace-setup Step 5. Both `agent-skills doctor` (CLI) and the
|
|
3
|
-
// `/doctor` slash command call into this so behaviour cannot drift.
|
|
3
|
+
// `/doctor-agent-skills` slash command call into this so behaviour cannot drift.
|
|
4
4
|
//
|
|
5
5
|
// Two classes of findings:
|
|
6
6
|
// 1. Broken symlinks — links whose source has been moved, renamed, or deleted
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// update-notifier — zero-dependency check for newer versions on the npm
|
|
2
|
+
// registry, shared by the CLI, the Claude Code session hook, and the pi
|
|
3
|
+
// extension.
|
|
4
|
+
//
|
|
5
|
+
// Behaviour:
|
|
6
|
+
// - Cache lives at $XDG_CACHE_HOME/agent-skills/latest-version.json
|
|
7
|
+
// (falls back to ~/.cache/agent-skills/) with a 24h TTL.
|
|
8
|
+
// - The CLI invokes checkAndNotify() at the top of every command. If the
|
|
9
|
+
// cache is fresh and shows an upgrade, we print a banner immediately.
|
|
10
|
+
// If the cache is stale or absent, we start a background fetch (detached,
|
|
11
|
+
// non-blocking) and use whatever we have right now.
|
|
12
|
+
// - Network failures, JSON parse errors, and missing cache files are all
|
|
13
|
+
// swallowed silently — update checks must NEVER block the CLI or break
|
|
14
|
+
// a hook.
|
|
15
|
+
// - Opt-out: AGENT_SKILLS_NO_UPDATE_CHECK=1 in the environment disables
|
|
16
|
+
// everything in this module.
|
|
17
|
+
|
|
18
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { request } from "node:https";
|
|
22
|
+
import { spawn } from "node:child_process";
|
|
23
|
+
import { fileURLToPath } from "node:url";
|
|
24
|
+
|
|
25
|
+
const PACKAGE_NAME = "@chankov/agent-skills";
|
|
26
|
+
const REGISTRY = "https://registry.npmjs.org";
|
|
27
|
+
const TTL_MS = 24 * 60 * 60 * 1000;
|
|
28
|
+
|
|
29
|
+
const CACHE_DIR = join(
|
|
30
|
+
process.env.XDG_CACHE_HOME || join(homedir(), ".cache"),
|
|
31
|
+
"agent-skills",
|
|
32
|
+
);
|
|
33
|
+
const CACHE_FILE = join(CACHE_DIR, "latest-version.json");
|
|
34
|
+
|
|
35
|
+
// ── Public surface ───────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Run the standard check + banner flow used by the CLI.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} currentVersion The version of the running CLI
|
|
41
|
+
* @param {object} [opts]
|
|
42
|
+
* @param {boolean} [opts.silent] If true, return the banner string instead of printing
|
|
43
|
+
* @returns {string|null} The banner that would be (or was) printed
|
|
44
|
+
*/
|
|
45
|
+
export function checkAndNotify(currentVersion, opts = {}) {
|
|
46
|
+
if (isDisabled()) return null;
|
|
47
|
+
|
|
48
|
+
const cached = readCache();
|
|
49
|
+
const fresh = cached && Date.now() - cached.checkedAt < TTL_MS;
|
|
50
|
+
|
|
51
|
+
if (!fresh) startBackgroundFetch();
|
|
52
|
+
|
|
53
|
+
const latest = cached?.latest;
|
|
54
|
+
if (!latest || !gt(latest, currentVersion)) return null;
|
|
55
|
+
|
|
56
|
+
const banner = formatBanner(currentVersion, latest);
|
|
57
|
+
if (!opts.silent) process.stderr.write(banner + "\n");
|
|
58
|
+
return banner;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Synchronously fetch the latest version, write the cache, and return it.
|
|
63
|
+
* Used by the standalone check-update entry point (hooks block on this
|
|
64
|
+
* intentionally — they need the answer before the session continues).
|
|
65
|
+
*
|
|
66
|
+
* @param {number} [timeoutMs] Default 2000ms — hooks must not stall the UI
|
|
67
|
+
* @returns {Promise<string|null>}
|
|
68
|
+
*/
|
|
69
|
+
export async function fetchLatestSync(timeoutMs = 2000) {
|
|
70
|
+
if (isDisabled()) return null;
|
|
71
|
+
try {
|
|
72
|
+
const latest = await fetchLatest(timeoutMs);
|
|
73
|
+
writeCache({ latest, checkedAt: Date.now() });
|
|
74
|
+
return latest;
|
|
75
|
+
} catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Read the cached latest version without touching the network. Hook scripts
|
|
82
|
+
* use this on the fast path — if the cache is fresh, no fetch is needed.
|
|
83
|
+
*
|
|
84
|
+
* @returns {{latest:string, checkedAt:number, stale:boolean}|null}
|
|
85
|
+
*/
|
|
86
|
+
export function readCacheStatus() {
|
|
87
|
+
const c = readCache();
|
|
88
|
+
if (!c) return null;
|
|
89
|
+
return { ...c, stale: Date.now() - c.checkedAt >= TTL_MS };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function formatBanner(current, latest) {
|
|
93
|
+
const lines = [
|
|
94
|
+
`agent-skills update available: ${current} → ${latest}`,
|
|
95
|
+
` Run: npx ${PACKAGE_NAME}@latest update`,
|
|
96
|
+
` Releases: https://github.com/chankov/agent-skills/releases`,
|
|
97
|
+
];
|
|
98
|
+
const w = Math.max(...lines.map((l) => l.length)) + 2;
|
|
99
|
+
const bar = "─".repeat(w);
|
|
100
|
+
return [
|
|
101
|
+
`┌${bar}┐`,
|
|
102
|
+
...lines.map((l) => `│ ${l.padEnd(w - 1)}│`),
|
|
103
|
+
`└${bar}┘`,
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ── Internals ────────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
function isDisabled() {
|
|
110
|
+
return process.env.AGENT_SKILLS_NO_UPDATE_CHECK === "1"
|
|
111
|
+
|| process.env.CI === "true" // never spam CI logs
|
|
112
|
+
|| process.env.NO_UPDATE_NOTIFIER === "1"; // honour the common convention
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function readCache() {
|
|
116
|
+
try {
|
|
117
|
+
if (!existsSync(CACHE_FILE)) return null;
|
|
118
|
+
return JSON.parse(readFileSync(CACHE_FILE, "utf8"));
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function writeCache(payload) {
|
|
125
|
+
try {
|
|
126
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
127
|
+
writeFileSync(CACHE_FILE, JSON.stringify(payload, null, 2), "utf8");
|
|
128
|
+
} catch {
|
|
129
|
+
// Read-only home dir, full disk, etc. — caching is best-effort.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function fetchLatest(timeoutMs) {
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
const url = `${REGISTRY}/${encodeURIComponent(PACKAGE_NAME).replace("%40", "@")}/latest`;
|
|
136
|
+
const req = request(url, { method: "GET", headers: { accept: "application/json" } }, (res) => {
|
|
137
|
+
if (res.statusCode !== 200) {
|
|
138
|
+
reject(new Error(`registry returned ${res.statusCode}`));
|
|
139
|
+
res.resume();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
let body = "";
|
|
143
|
+
res.setEncoding("utf8");
|
|
144
|
+
res.on("data", (chunk) => { body += chunk; });
|
|
145
|
+
res.on("end", () => {
|
|
146
|
+
try {
|
|
147
|
+
const parsed = JSON.parse(body);
|
|
148
|
+
if (typeof parsed.version !== "string") throw new Error("missing version field");
|
|
149
|
+
resolve(parsed.version);
|
|
150
|
+
} catch (err) { reject(err); }
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
req.on("error", reject);
|
|
154
|
+
req.setTimeout(timeoutMs, () => {
|
|
155
|
+
req.destroy(new Error("timeout"));
|
|
156
|
+
});
|
|
157
|
+
req.end();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function startBackgroundFetch() {
|
|
162
|
+
// Detached worker: never blocks the CLI, never inherits stdio.
|
|
163
|
+
// We re-enter this module via dynamic import in a fresh node process and
|
|
164
|
+
// run fetchLatestSync there — keeps the parent CLI exit unaffected.
|
|
165
|
+
try {
|
|
166
|
+
const modPath = fileURLToPath(import.meta.url);
|
|
167
|
+
const child = spawn(process.execPath, [
|
|
168
|
+
"-e",
|
|
169
|
+
`import(${JSON.stringify(modPath)}).then(m => m.fetchLatestSync(8000)).catch(() => {})`,
|
|
170
|
+
], { detached: true, stdio: "ignore" });
|
|
171
|
+
child.unref();
|
|
172
|
+
} catch {
|
|
173
|
+
// If spawn fails (e.g. restricted env), skip — the next CLI run will retry.
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ── Tiny semver-gt comparator ────────────────────────────────────────────
|
|
178
|
+
// Enough for X.Y.Z comparisons; anything pre-release falls back to string
|
|
179
|
+
// compare on the suffix, which is good enough for "is the user behind?"
|
|
180
|
+
|
|
181
|
+
export function gt(a, b) {
|
|
182
|
+
const [aMain, aPre = ""] = a.split("-", 2);
|
|
183
|
+
const [bMain, bPre = ""] = b.split("-", 2);
|
|
184
|
+
const aParts = aMain.split(".").map(Number);
|
|
185
|
+
const bParts = bMain.split(".").map(Number);
|
|
186
|
+
for (let i = 0; i < 3; i++) {
|
|
187
|
+
const ai = aParts[i] ?? 0;
|
|
188
|
+
const bi = bParts[i] ?? 0;
|
|
189
|
+
if (ai !== bi) return ai > bi;
|
|
190
|
+
}
|
|
191
|
+
// Equal main versions: a release (no prerelease) outranks a prerelease.
|
|
192
|
+
if (!aPre && bPre) return true;
|
|
193
|
+
if (aPre && !bPre) return false;
|
|
194
|
+
return aPre > bPre;
|
|
195
|
+
}
|
package/docs/getting-started.md
CHANGED
|
@@ -14,7 +14,7 @@ Each skill is a Markdown file (`SKILL.md`) that describes a specific engineering
|
|
|
14
14
|
|---|---|---|
|
|
15
15
|
| **Most users** — you want to use the skills in your projects | `npx @chankov/agent-skills init` | One command; semver updates; cross-platform; no source dir to babysit. See [docs/npm-install.md](npm-install.md). |
|
|
16
16
|
| **Claude Code users** — you live in Claude Code and want plugin-managed updates | `/plugin marketplace add chankov/agent-skills` | Best UX inside Claude Code; marketplace handles the lifecycle. |
|
|
17
|
-
| **Skill authors / contributors** — you want to edit the skills and have changes flow into every connected workspace | `git clone` + `symlink` mode in `/setup` | Edit-in-place; every connected workspace sees the change instantly. |
|
|
17
|
+
| **Skill authors / contributors** — you want to edit the skills and have changes flow into every connected workspace | `git clone` + `symlink` mode in `/setup-agent-skills` | Edit-in-place; every connected workspace sees the change instantly. |
|
|
18
18
|
|
|
19
19
|
All three converge on the same `guided-workspace-setup` skill — they only differ in how the source files reach your workspace. None is being deprecated.
|
|
20
20
|
|
|
@@ -124,7 +124,7 @@ The `.claude/commands/` directory contains slash commands for Claude Code:
|
|
|
124
124
|
|
|
125
125
|
| Command | Skill Invoked |
|
|
126
126
|
|---------|---------------|
|
|
127
|
-
| `/setup` | guided-workspace-setup |
|
|
127
|
+
| `/setup-agent-skills` | guided-workspace-setup |
|
|
128
128
|
| `/spec` | spec-driven-development |
|
|
129
129
|
| `/plan` | planning-and-task-breakdown |
|
|
130
130
|
| `/build` | incremental-implementation + test-driven-development |
|
package/docs/npm-install.md
CHANGED
|
@@ -31,18 +31,41 @@ So:
|
|
|
31
31
|
# In the workspace you want to configure:
|
|
32
32
|
npx @chankov/agent-skills init
|
|
33
33
|
# Then open your coding agent in this directory and run:
|
|
34
|
-
# /setup
|
|
34
|
+
# /setup-agent-skills
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
That's it. `npx` fetches the package, the CLI detects your coding agent and
|
|
38
|
-
prints the next-step command, and `/setup` runs the full guided install
|
|
38
|
+
prints the next-step command, and `/setup-agent-skills` runs the full guided install
|
|
39
39
|
inside your agent.
|
|
40
40
|
|
|
41
41
|
## Commands
|
|
42
42
|
|
|
43
43
|
### `npx @chankov/agent-skills init`
|
|
44
44
|
|
|
45
|
-
Materializes the package
|
|
45
|
+
Materializes the package, **bootstraps the installer artifacts** into the
|
|
46
|
+
workspace (so the agent has a `/setup-agent-skills` and `/doctor-agent-skills` command to invoke),
|
|
47
|
+
and hands off to `/setup-agent-skills`.
|
|
48
|
+
|
|
49
|
+
What `init` writes per agent:
|
|
50
|
+
|
|
51
|
+
| Agent | Files written to the workspace |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `claude-code` | `.claude/commands/setup-agent-skills.md`, `.claude/commands/doctor-agent-skills.md`, `.claude/skills/guided-workspace-setup/SKILL.md` |
|
|
54
|
+
| `pi` | `.pi/prompts/setup-agent-skills.md`, `.pi/prompts/doctor-agent-skills.md`, `.pi/skills/guided-workspace-setup/SKILL.md` |
|
|
55
|
+
| `opencode` | `.opencode/commands/as-setup-agent-skills.md`, `.opencode/commands/as-doctor-agent-skills.md`, `.opencode/skills/guided-workspace-setup/SKILL.md` |
|
|
56
|
+
|
|
57
|
+
These are **just the plumbing** — the slash commands, plus the skill they
|
|
58
|
+
invoke. The actual catalogue (spec-driven-development, code-reviewer,
|
|
59
|
+
test-engineer, pi extensions, …) is picked by you inside `/setup-agent-skills`. Re-run
|
|
60
|
+
`init` to refresh the plumbing after a package upgrade; bootstrap files
|
|
61
|
+
are always overwritten because they're scaffolding, not user data.
|
|
62
|
+
|
|
63
|
+
After `/setup-agent-skills` finishes its install pass, **the bootstrap files
|
|
64
|
+
are removed by default** so they don't clutter your agent's slash-command
|
|
65
|
+
list. Re-run `npx @chankov/agent-skills init` whenever you want
|
|
66
|
+
`/setup-agent-skills` back. To keep them in place across runs, reply `keep`
|
|
67
|
+
to the Step 9 confirmation prompt — the skill will record
|
|
68
|
+
`keep-installer: true` in `.ai/agent-skills-setup.md`.
|
|
46
69
|
|
|
47
70
|
| Flag | Default | Purpose |
|
|
48
71
|
|------|---------|---------|
|
|
@@ -60,7 +83,7 @@ npx @chankov/agent-skills init --workspace ~/projects/foo --method symlink
|
|
|
60
83
|
|
|
61
84
|
Deterministic preflight scan — walks every install-target directory, lists
|
|
62
85
|
broken symlinks and stale persona references, and offers fixes. Same scan
|
|
63
|
-
that `/doctor` runs inside the agent.
|
|
86
|
+
that `/doctor-agent-skills` runs inside the agent.
|
|
64
87
|
|
|
65
88
|
| Flag | Default | Purpose |
|
|
66
89
|
|------|---------|---------|
|
|
@@ -78,13 +101,13 @@ npx @chankov/agent-skills doctor -y
|
|
|
78
101
|
Reads the workspace's `.ai/agent-skills-setup.md`, compares the recorded
|
|
79
102
|
package version against the installed package version, and prints the next
|
|
80
103
|
step. The actual diff-aware refresh runs inside the coding agent via
|
|
81
|
-
`/setup`.
|
|
104
|
+
`/setup-agent-skills`.
|
|
82
105
|
|
|
83
106
|
```bash
|
|
84
107
|
# Upgrade the package itself first, then check the delta:
|
|
85
108
|
npm install -g @chankov/agent-skills@latest
|
|
86
109
|
npx agent-skills update --workspace .
|
|
87
|
-
# Then open your agent and run /setup to review per-artifact diffs.
|
|
110
|
+
# Then open your agent and run /setup-agent-skills to review per-artifact diffs.
|
|
88
111
|
```
|
|
89
112
|
|
|
90
113
|
## Versioning
|
|
@@ -137,7 +160,7 @@ npm is the recommended path for most users. The other two stay supported:
|
|
|
137
160
|
- **[Claude Code plugin marketplace](../README.md#quick-start)** — best UX
|
|
138
161
|
inside Claude Code. Same skills, marketplace-managed updates.
|
|
139
162
|
- **Git clone + symlinks** — best for skill authors and contributors. Clone
|
|
140
|
-
the repo, run `/setup` from there, choose `symlink` in Step 8. Updates
|
|
163
|
+
the repo, run `/setup-agent-skills` from there, choose `symlink` in Step 8. Updates
|
|
141
164
|
flow through `git pull`. Symlinks need Developer Mode on Windows.
|
|
142
165
|
|
|
143
166
|
All three paths converge on the same `guided-workspace-setup` skill — the
|
|
@@ -153,9 +176,69 @@ npx --yes @chankov/agent-skills@latest init --agent claude-code --method copy --
|
|
|
153
176
|
```
|
|
154
177
|
|
|
155
178
|
`doctor` accepts `--yes` for non-interactive repair. Note that the
|
|
156
|
-
LLM-driven `/setup` flow is not CI-runnable by design — confirmation gates
|
|
179
|
+
LLM-driven `/setup-agent-skills` flow is not CI-runnable by design — confirmation gates
|
|
157
180
|
exist precisely so a human approves every write.
|
|
158
181
|
|
|
182
|
+
## Receiving update notifications
|
|
183
|
+
|
|
184
|
+
Three independent mechanisms surface "a new version is published" without
|
|
185
|
+
you having to remember to check. All three share a single cache at
|
|
186
|
+
`$XDG_CACHE_HOME/agent-skills/latest-version.json` (24h TTL) so the
|
|
187
|
+
registry is hit at most once per day.
|
|
188
|
+
|
|
189
|
+
### 1. CLI update-notifier (always on)
|
|
190
|
+
|
|
191
|
+
Every `npx @chankov/agent-skills <cmd>` invocation runs a fast cache read
|
|
192
|
+
on entry. If the cached latest version exceeds the running CLI version, a
|
|
193
|
+
banner prints to stderr before the command output:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
197
|
+
│ agent-skills update available: 0.1.0 → 0.2.0 │
|
|
198
|
+
│ Run: npx @chankov/agent-skills@latest update │
|
|
199
|
+
│ Releases: https://github.com/chankov/agent-skills/releases │
|
|
200
|
+
└──────────────────────────────────────────────────────────────┘
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
If the cache is stale, a detached background process refreshes it for the
|
|
204
|
+
*next* invocation — the current run is never blocked.
|
|
205
|
+
|
|
206
|
+
### 2. Claude Code session-start hook
|
|
207
|
+
|
|
208
|
+
When `hooks/session-start.sh` is installed (offered in Group 18 of `/setup-agent-skills`),
|
|
209
|
+
every new Claude Code session runs the check with a 3-second wall-clock cap.
|
|
210
|
+
If an upgrade is available, the banner is injected into the session context
|
|
211
|
+
so Claude can mention it on its first turn — e.g. *"Note: agent-skills 0.2.0
|
|
212
|
+
is available; want me to apply it via `/setup-agent-skills`?"*
|
|
213
|
+
|
|
214
|
+
### 3. pi extension (`agent-skills-update-check`)
|
|
215
|
+
|
|
216
|
+
When installed (offered in Group 10 of `/setup-agent-skills`), the extension fires on the
|
|
217
|
+
first `agent_start` event of each pi session and emits a `ctx.ui.notify`
|
|
218
|
+
message in the pi UI if a newer version is published. Reads the same cache
|
|
219
|
+
as the CLI — no double-fetching.
|
|
220
|
+
|
|
221
|
+
### Opting out
|
|
222
|
+
|
|
223
|
+
Any of these environment variables disables all three:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
export AGENT_SKILLS_NO_UPDATE_CHECK=1 # agent-skills-specific
|
|
227
|
+
export NO_UPDATE_NOTIFIER=1 # conventional, also honoured
|
|
228
|
+
# CI=true is auto-detected — banners never appear in CI logs
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Forcing a manual check
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Block on a single registry fetch; print the banner if outdated
|
|
235
|
+
npx @chankov/agent-skills check-update
|
|
236
|
+
|
|
237
|
+
# Bypass the cache entirely
|
|
238
|
+
rm ~/.cache/agent-skills/latest-version.json
|
|
239
|
+
npx @chankov/agent-skills check-update
|
|
240
|
+
```
|
|
241
|
+
|
|
159
242
|
## Troubleshooting
|
|
160
243
|
|
|
161
244
|
- **"Could not auto-detect your coding agent."** Pass `--agent` or run
|