skilldrop-cli 0.13.1 → 0.13.3
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/README.md +103 -98
- package/agents/README.md +3 -3
- package/bin/skilldrop.js +165 -26
- package/catalogue.json +111 -0
- package/contracts/catalogue.schema.json +32 -0
- package/contracts/loop.schema.json +2 -2
- package/contracts/pack.schema.json +34 -27
- package/package.json +3 -4
- package/packs/ai-engineering/pack.json +22 -0
- package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/SKILL.md +2 -2
- package/packs/claude-api/pack.json +21 -0
- package/{skills → packs/claude-api/skills}/eval-harness-generator/SKILL.md +2 -2
- package/{skills → packs/claude-api/skills}/eval-harness-generator/manifest.json +1 -1
- package/{loops → packs/core/loops}/ship-a-draft/LOOP.md +1 -1
- package/packs/core/pack.json +21 -0
- package/{skills → packs/core/skills}/council-review/SKILL.md +1 -1
- package/{skills → packs/core/skills}/council-review/reference.md +2 -2
- package/{loops → packs/dev-team/loops}/build/LOOP.md +3 -3
- package/{loops → packs/dev-team/loops}/build/loop.json +1 -1
- package/{loops → packs/dev-team/loops}/release/LOOP.md +2 -2
- package/packs/dev-team/pack.json +22 -0
- package/{skills → packs/dev-team/skills}/agents-md-generator/reference.md +1 -1
- package/{skills → packs/dev-team/skills}/contribution-wizard/SKILL.md +5 -5
- package/{skills → packs/dev-team/skills}/contribution-wizard/manifest.json +1 -1
- package/{skills → packs/dev-team/skills}/devils-advocate/SKILL.md +1 -1
- package/{skills → packs/dev-team/skills}/pre-merge-review/SKILL.md +1 -1
- package/{loops → packs/product-manager/loops}/discover/LOOP.md +3 -3
- package/packs/product-manager/pack.json +22 -0
- package/{loops → packs/solution-architect/loops}/design/LOOP.md +2 -2
- package/packs/solution-architect/pack.json +22 -0
- package/{loops → packs/sre-oncall/loops}/operate/LOOP.md +1 -1
- package/packs/sre-oncall/pack.json +22 -0
- package/packs/stakeholder-comms/pack.json +22 -0
- package/{skills → packs/stakeholder-comms/skills}/deck-builder/SKILL.md +1 -1
- package/packs.json +0 -231
- /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-budget/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-budget/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-budget/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-budget/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-budget/templates/budget-spec.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-loop-design/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-loop-design/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-loop-design/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-loop-design/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-loop-design/templates/loop-spec.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/examples/support-triage-agent.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/reference.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/agent-threat-model/templates/agent-threat-model.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/examples/weekly-engineering-team.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/scripts/build_report.py +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/report-per-user.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/report-team-rollup.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/usage-event-schema.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/reference.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/templates/eval-plan.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/templates/golden-case.jsonl +0 -0
- /package/{skills → packs/ai-engineering/skills}/subagent-design/SKILL.md +0 -0
- /package/{skills → packs/ai-engineering/skills}/subagent-design/evals/eval_queries.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/subagent-design/evals/evals.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/subagent-design/manifest.json +0 -0
- /package/{skills → packs/ai-engineering/skills}/subagent-design/templates/orchestration-plan.md +0 -0
- /package/{skills → packs/claude-api/skills}/prompt-caching-advisor/SKILL.md +0 -0
- /package/{skills → packs/claude-api/skills}/prompt-caching-advisor/manifest.json +0 -0
- /package/{skills → packs/claude-api/skills}/token-budget-estimator/SKILL.md +0 -0
- /package/{skills → packs/claude-api/skills}/token-budget-estimator/manifest.json +0 -0
- /package/{skills → packs/claude-api/skills}/tool-use-schema-writer/SKILL.md +0 -0
- /package/{skills → packs/claude-api/skills}/tool-use-schema-writer/manifest.json +0 -0
- /package/{loops → packs/core/loops}/ship-a-draft/evals/eval_queries.json +0 -0
- /package/{loops → packs/core/loops}/ship-a-draft/evals/evals.json +0 -0
- /package/{loops → packs/core/loops}/ship-a-draft/loop.json +0 -0
- /package/{skills → packs/core/skills}/brief-intake/SKILL.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/evals/eval_queries.json +0 -0
- /package/{skills → packs/core/skills}/brief-intake/evals/evals.json +0 -0
- /package/{skills → packs/core/skills}/brief-intake/manifest.json +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-adr.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-decision-log.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-deck.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-design-doc.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-exec-summary.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-generic.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-runbook.md +0 -0
- /package/{skills → packs/core/skills}/brief-intake/templates/brief-tech-comparison.md +0 -0
- /package/{skills → packs/core/skills}/council-review/evals/eval_queries.json +0 -0
- /package/{skills → packs/core/skills}/council-review/evals/evals.json +0 -0
- /package/{skills → packs/core/skills}/council-review/examples/redis-cache-decision.md +0 -0
- /package/{skills → packs/core/skills}/council-review/manifest.json +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/architect.md +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/bench.md +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/operator.md +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/pragmatist.md +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/security-engineer.md +0 -0
- /package/{skills → packs/core/skills}/council-review/seats/user-advocate.md +0 -0
- /package/{skills → packs/core/skills}/council-review/templates/council-review.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/SKILL.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/evals/eval_queries.json +0 -0
- /package/{skills → packs/core/skills}/doc-critique/evals/evals.json +0 -0
- /package/{skills → packs/core/skills}/doc-critique/examples/design-doc-critique.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/manifest.json +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/adr.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/decision-log.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/deck.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/design-doc.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/exec-summary.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/generic.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/runbook.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/rubrics/tech-comparison.md +0 -0
- /package/{skills → packs/core/skills}/doc-critique/templates/critique.md +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/SKILL.md +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/evals/eval_queries.json +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/evals/evals.json +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/manifest.json +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/reference.md +0 -0
- /package/{skills → packs/core/skills}/output-hygiene/scripts/scrub.py +0 -0
- /package/{loops → packs/dev-team/loops}/build/evals/eval_queries.json +0 -0
- /package/{loops → packs/dev-team/loops}/build/evals/evals.json +0 -0
- /package/{loops → packs/dev-team/loops}/release/loop.json +0 -0
- /package/{skills → packs/dev-team/skills}/accessibility-audit/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/accessibility-audit/examples/login-form.md +0 -0
- /package/{skills → packs/dev-team/skills}/accessibility-audit/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/accessibility-audit/reference.md +0 -0
- /package/{skills → packs/dev-team/skills}/agents-md-generator/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/agents-md-generator/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/agents-md-generator/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/agents-md-generator/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/agents-md-generator/templates/agents-md.md +0 -0
- /package/{skills → packs/dev-team/skills}/bug-triage/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/bug-triage/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/bug-triage/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/bug-triage/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/bug-triage/templates/bug-ticket.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/examples/rate-limiter-review.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/adversarial-review.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/edge-cases.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/future-proofing.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/test-coverage.md +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/devils-advocate/templates/challenge.md +0 -0
- /package/{skills → packs/dev-team/skills}/feature-implement-loop/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/feature-implement-loop/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/examples/schema-change-revise.md +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/launch-readiness/templates/readiness-report.md +0 -0
- /package/{skills → packs/dev-team/skills}/migration-plan/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/migration-plan/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/migration-plan/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/migration-plan/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/migration-plan/templates/migration-plan.md +0 -0
- /package/{skills → packs/dev-team/skills}/pre-merge-review/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/pre-merge-review/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/pre-merge-review/examples/pre-merge-verdict.md +0 -0
- /package/{skills → packs/dev-team/skills}/pre-merge-review/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/pre-merge-review/scripts/gate.py +0 -0
- /package/{skills → packs/dev-team/skills}/release-notes/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/release-notes/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/release-notes/templates/release-notes.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/reference.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/readme-snippet.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/sonar-project.properties.tmpl +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/lenses/bugs.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/lenses/code-smells.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/lenses/coverage-and-duplication.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/lenses/security-hotspots.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/lenses/vulnerabilities.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/reference.md +0 -0
- /package/{skills → packs/dev-team/skills}/sonar-review/templates/report.md +0 -0
- /package/{skills → packs/dev-team/skills}/test-plan-generator/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/test-plan-generator/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/test-plan-generator/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/test-plan-generator/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/test-plan-generator/templates/test-plan.md +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/SKILL.md +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/evals/eval_queries.json +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/evals/evals.json +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/examples/notifications-epic.md +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/manifest.json +0 -0
- /package/{skills → packs/dev-team/skills}/user-story-splitter/templates/story.md +0 -0
- /package/{loops → packs/product-manager/loops}/discover/evals/eval_queries.json +0 -0
- /package/{loops → packs/product-manager/loops}/discover/evals/evals.json +0 -0
- /package/{loops → packs/product-manager/loops}/discover/loop.json +0 -0
- /package/{skills → packs/product-manager/skills}/business-case/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/business-case/examples/build-vs-buy-flags.md +0 -0
- /package/{skills → packs/product-manager/skills}/business-case/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/business-case/templates/business-case.md +0 -0
- /package/{skills → packs/product-manager/skills}/okr-cascade/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/okr-cascade/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/okr-cascade/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/okr-cascade/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/okr-cascade/templates/okr-cascade.md +0 -0
- /package/{skills → packs/product-manager/skills}/prd-draft/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/prd-draft/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/prd-draft/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/prd-draft/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/prd-draft/templates/prd.md +0 -0
- /package/{skills → packs/product-manager/skills}/prfaq/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/prfaq/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/prfaq/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/prfaq/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/prfaq/templates/prfaq.md +0 -0
- /package/{skills → packs/product-manager/skills}/requirements-interview/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/requirements-interview/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/requirements-interview/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/requirements-interview/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/requirements-interview/templates/interview-kit.md +0 -0
- /package/{skills → packs/product-manager/skills}/strategy-analysis/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/strategy-analysis/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/strategy-analysis/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/strategy-analysis/examples/market-entry-tows.md +0 -0
- /package/{skills → packs/product-manager/skills}/strategy-analysis/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/success-metrics/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/success-metrics/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/success-metrics/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/success-metrics/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/success-metrics/templates/metrics-plan.md +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/SKILL.md +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/evals/eval_queries.json +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/evals/evals.json +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/examples/b2b-saas-onboarding.md +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/manifest.json +0 -0
- /package/{skills → packs/product-manager/skills}/user-journey-map/templates/journey-map.md +0 -0
- /package/{loops → packs/solution-architect/loops}/design/evals/eval_queries.json +0 -0
- /package/{loops → packs/solution-architect/loops}/design/evals/evals.json +0 -0
- /package/{loops → packs/solution-architect/loops}/design/loop.json +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/templates/madr.md +0 -0
- /package/{skills → packs/solution-architect/skills}/adr-generator/templates/nygard.md +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/api-contract-draft/templates/openapi-skeleton.yaml +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/aws-three-tier.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/c4-container-saas.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/microservices-sequence.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/c4-container.puml +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-aws.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-flowchart.md +0 -0
- /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-sequence.md +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/data-contract/templates/data-contract.md +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/db-schema-design/templates/schema-design.md +0 -0
- /package/{skills → packs/solution-architect/skills}/design-doc/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/design-doc/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/design-doc/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/design-doc/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/design-doc/templates/design-doc.md +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/requirements.txt +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/_figma_client.py +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/frame_to_mermaid.py +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/inspect_file.py +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/list_comments.py +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/post_comment.py +0 -0
- /package/{skills → packs/solution-architect/skills}/figma-diagrams/templates/figjam-import.json +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/nfr-spec/templates/nfr-spec.md +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/reference.md +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/templates/description.md +0 -0
- /package/{skills → packs/solution-architect/skills}/reverse-architecture/templates/extraction.md +0 -0
- /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/examples/queue-selection.md +0 -0
- /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/templates/matrix.md +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/SKILL.md +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/evals/eval_queries.json +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/evals/evals.json +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/examples/document-upload.md +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/manifest.json +0 -0
- /package/{skills → packs/solution-architect/skills}/threat-model/reference.md +0 -0
- /package/{loops → packs/sre-oncall/loops}/operate/evals/eval_queries.json +0 -0
- /package/{loops → packs/sre-oncall/loops}/operate/evals/evals.json +0 -0
- /package/{loops → packs/sre-oncall/loops}/operate/loop.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/SKILL.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/manifest.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/reference.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/templates/cost-model.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/SKILL.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/evals/eval_queries.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/evals/evals.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/manifest.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/reference.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/incident-comms/templates/messages.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/SKILL.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/evals/eval_queries.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/evals/evals.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/manifest.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/reference.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/observability-plan/templates/observability-plan.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/postmortem-generator/SKILL.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/postmortem-generator/evals/eval_queries.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/postmortem-generator/evals/evals.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/postmortem-generator/manifest.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/postmortem-generator/templates/postmortem.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/runbook-generator/SKILL.md +0 -0
- /package/{skills → packs/sre-oncall/skills}/runbook-generator/evals/eval_queries.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/runbook-generator/evals/evals.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/runbook-generator/manifest.json +0 -0
- /package/{skills → packs/sre-oncall/skills}/runbook-generator/templates/runbook.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/audience-profile/SKILL.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/audience-profile/evals/eval_queries.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/audience-profile/evals/evals.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/audience-profile/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/audience-profile/reference.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/decision-log/SKILL.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/decision-log/evals/eval_queries.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/decision-log/evals/evals.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/decision-log/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/evals/eval_queries.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/evals/evals.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/examples/exec-board-update.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/examples/templated-brand-deck.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/reference.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/requirements.txt +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/scripts/build_deck.py +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/templates/deck-spec.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/deck-builder/templates/palettes.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/exec-summary/SKILL.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/exec-summary/evals/eval_queries.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/exec-summary/evals/evals.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/exec-summary/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/exec-summary/templates/exec-summary.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/SKILL.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/examples/local-setup-guide.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/api-reference.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/design-walkthrough.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/setup-guide.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/SKILL.md +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/evals/eval_queries.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/evals/evals.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/manifest.json +0 -0
- /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/templates/deck-outline.md +0 -0
package/bin/skilldrop.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* or any directory, from the bundled catalog or any third-party catalog
|
|
4
4
|
* (--from <path | git-url[#ref]>). Zero dependencies; copy-only, never executes
|
|
5
5
|
* catalog content at install time.
|
|
6
|
-
* Reads
|
|
6
|
+
* Reads three catalog shapes: skilldrop pack folders (packs/<p>/pack.json + packs/<p>/skills/),
|
|
7
|
+
* flat skilldrop (skills/ + packs.json), and agentbundle (packs/<p>/pack.toml + .apm/skills).
|
|
7
8
|
* Design: skilldrop-cli-design/skilldrop-cli-design.md
|
|
8
9
|
* Scope: docs/rfcs/0002-skilldrop-cli.md, docs/rfcs/0003-third-party-catalogs.md,
|
|
9
10
|
* docs/rfcs/0014-agentbundle-interop.md (the agentbundle reader)
|
|
@@ -13,6 +14,7 @@ const fs = require("fs");
|
|
|
13
14
|
const path = require("path");
|
|
14
15
|
const os = require("os");
|
|
15
16
|
const { execFileSync } = require("child_process");
|
|
17
|
+
const crypto = require("crypto");
|
|
16
18
|
|
|
17
19
|
const ROOT = path.resolve(__dirname, "..");
|
|
18
20
|
const LEDGER = ".skilldrop.json";
|
|
@@ -35,6 +37,7 @@ const HELP = `skilldrop — portable AI-agent skills for Claude Code, Cursor, Ki
|
|
|
35
37
|
Usage:
|
|
36
38
|
skilldrop list [--from <src>] all skills in a catalog (name, version, tier)
|
|
37
39
|
skilldrop info <skill> [--from <src>] description, related, packs, deps
|
|
40
|
+
skilldrop info --pack <name> a pack's skills, loops, and what to try first (RFC-0032)
|
|
38
41
|
skilldrop packs [--from <src>] role-based packs
|
|
39
42
|
skilldrop agents [--from <src>] reviewer subagents in a catalog
|
|
40
43
|
skilldrop loops [--from <src>] loops — sequenced stages over skills (RFC-0028)
|
|
@@ -48,7 +51,9 @@ Usage:
|
|
|
48
51
|
(--no-skills for the loop alone) (RFC-0028)
|
|
49
52
|
skilldrop install --panel review install the review panel — the 3 reviewer subagents +
|
|
50
53
|
the pre-merge-review orchestrator that fires them (RFC-0020)
|
|
51
|
-
skilldrop update
|
|
54
|
+
skilldrop update [--force] re-copy installed skills whose version changed; files
|
|
55
|
+
you edited are kept and the new copy lands beside them
|
|
56
|
+
as <file>.upstream (--force overwrites) (RFC-0032)
|
|
52
57
|
skilldrop outdated show installed vs current versions, change nothing
|
|
53
58
|
skilldrop uninstall <skill...> remove skills (and wiring files this tool wrote)
|
|
54
59
|
skilldrop uninstall --agent <name...> remove subagents
|
|
@@ -62,8 +67,8 @@ Usage:
|
|
|
62
67
|
|
|
63
68
|
Catalogs:
|
|
64
69
|
(default) the catalog bundled with this package
|
|
65
|
-
--from <dir|url> a skilldrop catalog (skills/<name>/
|
|
66
|
-
agentbundle one (packs/<pack>/.apm/skills/<name>/SKILL.md); a git URL
|
|
70
|
+
--from <dir|url> a skilldrop catalog (packs/<pack>/skills/<name>/ or flat skills/<name>/) OR
|
|
71
|
+
an agentbundle one (packs/<pack>/.apm/skills/<name>/SKILL.md); a git URL
|
|
67
72
|
works for either — append #<branch-or-tag> to pin
|
|
68
73
|
|
|
69
74
|
Install/update/uninstall targets (pick one):
|
|
@@ -104,7 +109,7 @@ function parseArgs(argv) {
|
|
|
104
109
|
const out = { _: [], flags: {} };
|
|
105
110
|
for (let i = 0; i < argv.length; i++) {
|
|
106
111
|
const a = argv[i];
|
|
107
|
-
if (a === "--pack" || a === "--ide" || a === "--dest" || a === "--from" || a === "--panel") out.flags[a.slice(2)] = argv[++i];
|
|
112
|
+
if (a === "--pack" || a === "--ide" || a === "--dest" || a === "--from" || a === "--panel" || a === "--profile") out.flags[a.slice(2)] = argv[++i];
|
|
108
113
|
else if (a.startsWith("--")) out.flags[a.slice(2)] = true;
|
|
109
114
|
else out._.push(a);
|
|
110
115
|
}
|
|
@@ -112,15 +117,18 @@ function parseArgs(argv) {
|
|
|
112
117
|
}
|
|
113
118
|
|
|
114
119
|
/* ---------- catalogs ----------
|
|
115
|
-
|
|
116
|
-
"
|
|
120
|
+
Three on-disk shapes are read (RFC-0003, RFC-0014, RFC-0034):
|
|
121
|
+
"packs" — skilldrop's own layout since RFC-0034: packs/<pack>/{pack.json,
|
|
122
|
+
skills/<name>/{SKILL.md,manifest.json}, loops/<name>/} + catalogue.json
|
|
123
|
+
"skilldrop" — flat skills/<name>/{SKILL.md,manifest.json} + optional packs.json; what
|
|
124
|
+
skilldrop shipped before RFC-0034, and what most third-party catalogs use
|
|
117
125
|
"apm" — agentbundle (agent-ready-repo): packs/<pack>/{pack.toml,
|
|
118
126
|
.apm/skills/<name>/SKILL.md, .apm/agents/<name>.md}
|
|
119
127
|
The apm reader normalizes into the same accessors the native path uses — skills keyed by
|
|
120
128
|
folder name, a per-skill manifest synthesized from the SKILL.md frontmatter + the pack.toml
|
|
121
129
|
version, each pack.toml's [pack] table a virtual pack — so `--from git+https://…/agent-ready-repo`
|
|
122
130
|
installs his packs through this same CLI. Skill accessors: skillsIn / skillDir / skillExists /
|
|
123
|
-
manifestOf; never touch cat.skillsDir directly (it exists only on the skilldrop shape). */
|
|
131
|
+
manifestOf; never touch cat.skillsDir directly (it exists only on the flat skilldrop shape). */
|
|
124
132
|
|
|
125
133
|
const catalogCache = {};
|
|
126
134
|
function resolveCatalog(source) {
|
|
@@ -139,11 +147,36 @@ function resolveCatalog(source) {
|
|
|
139
147
|
}
|
|
140
148
|
}
|
|
141
149
|
const src = source || BUNDLED;
|
|
150
|
+
const packsDir = path.join(dir, "packs");
|
|
151
|
+
if (fs.existsSync(packsDir) && fs.readdirSync(packsDir).some((p) => fs.existsSync(path.join(packsDir, p, "pack.json"))))
|
|
152
|
+
return (catalogCache[key] = readPacksCatalog(dir, src));
|
|
142
153
|
if (fs.existsSync(path.join(dir, "skills")))
|
|
143
154
|
return (catalogCache[key] = { dir, source: src, shape: "skilldrop", skillsDir: path.join(dir, "skills") });
|
|
144
155
|
if (fs.existsSync(path.join(dir, "packs")))
|
|
145
156
|
return (catalogCache[key] = readApmCatalog(dir, src));
|
|
146
|
-
die(`'${src}' is not a catalog — expected a skills/
|
|
157
|
+
die(`'${src}' is not a catalog — expected packs/<pack>/pack.json, a skills/ directory, or packs/<pack>/pack.toml (agentbundle)`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* RFC-0034: membership is the folder. A skill is in a pack because it sits at
|
|
161
|
+
packs/<pack>/skills/<name>/; catalogue.json only sets the order packs are listed in. */
|
|
162
|
+
function readPacksCatalog(dir, source) {
|
|
163
|
+
const packsDir = path.join(dir, "packs");
|
|
164
|
+
const children = (d, marker) => fs.existsSync(d)
|
|
165
|
+
? fs.readdirSync(d).filter((x) => fs.existsSync(path.join(d, x, marker))).sort() : [];
|
|
166
|
+
const onDisk = children(packsDir, "pack.json");
|
|
167
|
+
const idx = path.join(dir, "catalogue.json");
|
|
168
|
+
const listed = fs.existsSync(idx) ? (readJSON(idx).packs || []).filter((p) => onDisk.includes(p)) : [];
|
|
169
|
+
const order = [...listed, ...onDisk.filter((p) => !listed.includes(p))];
|
|
170
|
+
const skillIndex = {}, loopIndex = {}, packsData = {};
|
|
171
|
+
for (const pack of order) {
|
|
172
|
+
const pdir = path.join(packsDir, pack);
|
|
173
|
+
const skills = children(path.join(pdir, "skills"), "SKILL.md");
|
|
174
|
+
const loops = children(path.join(pdir, "loops"), "loop.json");
|
|
175
|
+
for (const s of skills) if (!skillIndex[s]) skillIndex[s] = { dir: path.join(pdir, "skills", s) };
|
|
176
|
+
for (const l of loops) if (!loopIndex[l]) loopIndex[l] = path.join(pdir, "loops", l);
|
|
177
|
+
packsData[pack] = Object.assign({}, readJSON(path.join(pdir, "pack.json")), { skills, loops });
|
|
178
|
+
}
|
|
179
|
+
return { dir, source, shape: "packs", skillIndex, loopIndex, packsData };
|
|
147
180
|
}
|
|
148
181
|
|
|
149
182
|
/* Minimal TOML read — the [pack] table's basic-string scalars (name, version, description).
|
|
@@ -205,11 +238,11 @@ function readApmCatalog(dir, source) {
|
|
|
205
238
|
}
|
|
206
239
|
|
|
207
240
|
function skillsIn(cat) {
|
|
208
|
-
if (cat.
|
|
241
|
+
if (cat.skillIndex) return Object.keys(cat.skillIndex).sort();
|
|
209
242
|
return fs.readdirSync(cat.skillsDir).filter((d) => fs.statSync(path.join(cat.skillsDir, d)).isDirectory()).sort();
|
|
210
243
|
}
|
|
211
244
|
function skillDir(cat, s) {
|
|
212
|
-
if (cat.
|
|
245
|
+
if (cat.skillIndex) return cat.skillIndex[s] && cat.skillIndex[s].dir;
|
|
213
246
|
return path.join(cat.skillsDir, s);
|
|
214
247
|
}
|
|
215
248
|
// Skill names reach RegExp when unwiring hooks. skillExists() proves a directory exists; it
|
|
@@ -228,7 +261,7 @@ function manifestOf(cat, s) {
|
|
|
228
261
|
if (!cat.skillIndex[s]) throw new Error(`no such skill '${s}'`);
|
|
229
262
|
return cat.skillIndex[s].manifest;
|
|
230
263
|
}
|
|
231
|
-
return readJSON(path.join(cat
|
|
264
|
+
return readJSON(path.join(skillDir(cat, s), "manifest.json"));
|
|
232
265
|
}
|
|
233
266
|
|
|
234
267
|
/* Agents (RFC-0012): single markdown files, frontmatter is already Claude Code's format.
|
|
@@ -260,10 +293,19 @@ function checkAgent(cat, a) {
|
|
|
260
293
|
return problems;
|
|
261
294
|
}
|
|
262
295
|
function packsOf(cat) {
|
|
263
|
-
if (cat.
|
|
296
|
+
if (cat.packsData) return Object.keys(cat.packsData).length ? cat.packsData : null;
|
|
264
297
|
const p = path.join(cat.dir, "packs.json");
|
|
265
298
|
return fs.existsSync(p) ? readJSON(p).packs : null;
|
|
266
299
|
}
|
|
300
|
+
/* RFC-0033: a pack installs together with the packs it `requires` (in practice, core), so
|
|
301
|
+
one --pack still delivers a role's whole toolkit now that shared skills have one home. */
|
|
302
|
+
function packMembers(ps, name, key) {
|
|
303
|
+
const req = (ps[name].requires || []).filter((r) => ps[r]);
|
|
304
|
+
const out = [];
|
|
305
|
+
for (const n of [...req, name]) for (const x of ps[n][key] || []) if (!out.includes(x)) out.push(x);
|
|
306
|
+
if (req.length) console.log(`pack '${name}' includes ${req.join(", ")}`);
|
|
307
|
+
return out;
|
|
308
|
+
}
|
|
267
309
|
function profilesOf(cat) {
|
|
268
310
|
const p = path.join(cat.dir, "profiles.json");
|
|
269
311
|
return fs.existsSync(p) ? readJSON(p).profiles : null;
|
|
@@ -706,10 +748,10 @@ function expandNames(args, cat) {
|
|
|
706
748
|
if (args.flags.all) return skillsIn(cat);
|
|
707
749
|
if (args.flags.pack) {
|
|
708
750
|
const ps = packsOf(cat);
|
|
709
|
-
if (!ps) die(`catalog '${cat.source}'
|
|
751
|
+
if (!ps) die(`catalog '${cat.source}' defines no packs — install skills by name`);
|
|
710
752
|
const p = ps[args.flags.pack];
|
|
711
753
|
if (!p) die(`unknown pack '${args.flags.pack}' in catalog '${cat.source}'`);
|
|
712
|
-
return
|
|
754
|
+
return packMembers(ps, args.flags.pack, "skills");
|
|
713
755
|
}
|
|
714
756
|
if (!args._.length) die("nothing to install — pass skill names, --pack <name>, or --all");
|
|
715
757
|
for (const s of args._) if (!skillExists(cat, s)) die(`unknown skill '${s}' in catalog '${cat.source}'`);
|
|
@@ -721,10 +763,64 @@ function copyOne(cat, s, dest, ide, l, notes) {
|
|
|
721
763
|
fs.cpSync(skillDir(cat, s), path.join(dest, s), { recursive: true });
|
|
722
764
|
const note = writeWiring(ide, dest, s, m.description);
|
|
723
765
|
if (note && notes) notes.push(note);
|
|
724
|
-
l.data[s] = { version: m.version, source: cat.source };
|
|
766
|
+
l.data[s] = { version: m.version, source: cat.source, files: fileHashes(skillDir(cat, s)) };
|
|
725
767
|
return m;
|
|
726
768
|
}
|
|
727
769
|
|
|
770
|
+
/* RFC-0032: per-file SHA-256 of a skill as the catalog shipped it, recorded in the ledger at
|
|
771
|
+
copy time. It is the baseline `update` compares against, so a file the user edited is never
|
|
772
|
+
overwritten. Paths are forward-slash relative; *.upstream files are this tool's output. */
|
|
773
|
+
function sha256(buf) { return crypto.createHash("sha256").update(buf).digest("hex"); }
|
|
774
|
+
function fileHashes(dir) {
|
|
775
|
+
const out = {};
|
|
776
|
+
(function walk(d, rel) {
|
|
777
|
+
for (const e of fs.readdirSync(d, { withFileTypes: true })) {
|
|
778
|
+
const r = rel ? `${rel}/${e.name}` : e.name;
|
|
779
|
+
if (e.isDirectory()) walk(path.join(d, e.name), r);
|
|
780
|
+
else if (e.isFile() && !e.name.endsWith(".upstream")) out[r] = sha256(fs.readFileSync(path.join(d, e.name)));
|
|
781
|
+
}
|
|
782
|
+
})(dir, "");
|
|
783
|
+
return out;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/* Update one skill file by file against the ledger baseline (RFC-0032):
|
|
787
|
+
upstream unchanged -> leave the local file alone, edited or not
|
|
788
|
+
local untouched, or new file -> take the new version
|
|
789
|
+
local edited, upstream moved -> keep the local file, write the new one as <file>.upstream
|
|
790
|
+
A file the catalog dropped is removed only if the user never touched it. The new baseline is
|
|
791
|
+
what the catalog ships now, so a kept edit stays "edited" until the user merges it. */
|
|
792
|
+
function mergeOne(cat, s, dest, ide, l, notes) {
|
|
793
|
+
const m = manifestOf(cat, s);
|
|
794
|
+
const src = skillDir(cat, s), dst = path.join(dest, s);
|
|
795
|
+
const base = l.data[s].files, next = fileHashes(src);
|
|
796
|
+
const kept = [], orphaned = [];
|
|
797
|
+
const at = (root, rel) => path.join(root, ...rel.split("/"));
|
|
798
|
+
const localHash = (rel) => { try { return sha256(fs.readFileSync(at(dst, rel))); } catch (e) { return null; } };
|
|
799
|
+
for (const [rel, h] of Object.entries(next)) {
|
|
800
|
+
const mine = localHash(rel), to = at(dst, rel);
|
|
801
|
+
if (mine === h) { fs.rmSync(to + ".upstream", { force: true }); continue; }
|
|
802
|
+
if (h === base[rel]) continue;
|
|
803
|
+
fs.mkdirSync(path.dirname(to), { recursive: true });
|
|
804
|
+
if (mine === null ? !(rel in base) : mine === base[rel]) {
|
|
805
|
+
fs.copyFileSync(at(src, rel), to);
|
|
806
|
+
fs.rmSync(to + ".upstream", { force: true });
|
|
807
|
+
} else {
|
|
808
|
+
fs.copyFileSync(at(src, rel), to + ".upstream");
|
|
809
|
+
kept.push(rel);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
for (const rel of Object.keys(base)) {
|
|
813
|
+
if (rel in next) continue;
|
|
814
|
+
const mine = localHash(rel);
|
|
815
|
+
if (mine === base[rel]) fs.rmSync(at(dst, rel), { force: true });
|
|
816
|
+
else if (mine !== null) orphaned.push(rel);
|
|
817
|
+
}
|
|
818
|
+
const note = writeWiring(ide, dest, s, m.description);
|
|
819
|
+
if (note && notes) notes.push(note);
|
|
820
|
+
l.data[s] = { version: m.version, source: cat.source, files: next };
|
|
821
|
+
return { m, kept, orphaned };
|
|
822
|
+
}
|
|
823
|
+
|
|
728
824
|
/* Install a whole review panel — the reviewer subagents + the orchestrator skill — in one
|
|
729
825
|
command (RFC-0020). Needs a target with BOTH a subagent and a skill format, so it accepts
|
|
730
826
|
the default (Claude Code), --project, --ide kiro, or --dest; other IDEs install the halves
|
|
@@ -854,6 +950,8 @@ function install(args) {
|
|
|
854
950
|
console.log(`deps: ${s} needs Python packages — run: cd ${path.join(dest, s)} && python3 -m pip install -r requirements.txt`);
|
|
855
951
|
if (suggestions.size)
|
|
856
952
|
console.log(`related (not installed): ${[...suggestions].sort().join(", ")} — add --with-related or install by name.`);
|
|
953
|
+
const pk = args.flags.pack && (packsOf(cat) || {})[args.flags.pack];
|
|
954
|
+
if (pk && pk["first-value"]) console.log("\n" + firstValueLines(pk).join("\n"));
|
|
857
955
|
}
|
|
858
956
|
|
|
859
957
|
function installedRows(flags) {
|
|
@@ -874,18 +972,30 @@ function installedRows(flags) {
|
|
|
874
972
|
function update(args) {
|
|
875
973
|
const { dest, ide, l, rows } = installedRows(args.flags);
|
|
876
974
|
if (!rows.length) return console.log(`nothing installed at ${dest}`);
|
|
877
|
-
let n = 0;
|
|
975
|
+
let n = 0, conflicts = 0;
|
|
878
976
|
for (const r of rows) {
|
|
879
977
|
if (!r.current) { console.log(`skip ${r.s}: source '${r.src}' unreachable or skill gone from it`); continue; }
|
|
880
978
|
if (r.current === r.installed) continue;
|
|
881
979
|
const problems = checkSkill(r.cat, r.s);
|
|
882
980
|
if (problems.length) { console.log(`skip ${r.s}: fails structural check in '${r.src}' (${problems[0]})`); continue; }
|
|
883
|
-
|
|
884
|
-
|
|
981
|
+
// No baseline (installed before RFC-0032) or --force: overwrite as before, and record one.
|
|
982
|
+
const entry = l.data[r.s];
|
|
983
|
+
if (args.flags.force || typeof entry !== "object" || !entry.files) {
|
|
984
|
+
copyOne(r.cat, r.s, dest, ide, l);
|
|
985
|
+
console.log(`updated ${r.s} ${r.installed} -> ${r.current} (${r.src})`);
|
|
986
|
+
} else {
|
|
987
|
+
const { kept, orphaned } = mergeOne(r.cat, r.s, dest, ide, l);
|
|
988
|
+
console.log(`updated ${r.s} ${r.installed} -> ${r.current} (${r.src})`);
|
|
989
|
+
for (const f of kept) console.log(` kept your edits in ${f} — new version at ${f}.upstream`);
|
|
990
|
+
for (const f of orphaned) console.log(` kept ${f} — dropped upstream, but you edited it`);
|
|
991
|
+
conflicts += kept.length;
|
|
992
|
+
}
|
|
885
993
|
n++;
|
|
886
994
|
}
|
|
887
995
|
saveLedger(l);
|
|
888
996
|
console.log(n ? `\n${n} skill(s) updated.` : "everything up to date.");
|
|
997
|
+
if (conflicts)
|
|
998
|
+
console.log(`${conflicts} file(s) kept your edits. Merge each <file>.upstream into its file, then delete it — or rerun with --force to take every new version.`);
|
|
889
999
|
}
|
|
890
1000
|
|
|
891
1001
|
function outdated(args) {
|
|
@@ -952,11 +1062,12 @@ function listAgents(args) {
|
|
|
952
1062
|
stages name, unless --no-skills. Optional in a catalog. */
|
|
953
1063
|
function loopsIn(cat) {
|
|
954
1064
|
if (cat.shape === "apm") return [];
|
|
1065
|
+
if (cat.loopIndex) return Object.keys(cat.loopIndex).sort();
|
|
955
1066
|
const d = path.join(cat.dir, "loops");
|
|
956
1067
|
if (!fs.existsSync(d)) return [];
|
|
957
1068
|
return fs.readdirSync(d).filter((x) => fs.existsSync(path.join(d, x, "loop.json"))).sort();
|
|
958
1069
|
}
|
|
959
|
-
function loopDir(cat, n) { return path.join(cat.dir, "loops", n); }
|
|
1070
|
+
function loopDir(cat, n) { return cat.loopIndex ? cat.loopIndex[n] : path.join(cat.dir, "loops", n); }
|
|
960
1071
|
function loopSpec(cat, n) { return readJSON(path.join(loopDir(cat, n), "loop.json")); }
|
|
961
1072
|
|
|
962
1073
|
function loopSkills(cat, n) {
|
|
@@ -1010,10 +1121,10 @@ function installLoops(args) {
|
|
|
1010
1121
|
let names = args._.slice();
|
|
1011
1122
|
if (!names.length && args.flags.pack) {
|
|
1012
1123
|
const ps = packsOf(cat);
|
|
1013
|
-
if (!ps) die(`catalog '${cat.source}'
|
|
1124
|
+
if (!ps) die(`catalog '${cat.source}' defines no packs`);
|
|
1014
1125
|
const pk = ps[args.flags.pack];
|
|
1015
1126
|
if (!pk) die(`unknown pack '${args.flags.pack}' in catalog '${cat.source}'`);
|
|
1016
|
-
names = (
|
|
1127
|
+
names = packMembers(ps, args.flags.pack, "loops");
|
|
1017
1128
|
if (!names.length) die(`pack '${args.flags.pack}' declares no loops`);
|
|
1018
1129
|
}
|
|
1019
1130
|
if (!names.length && args.flags.all) names = available.slice();
|
|
@@ -1143,9 +1254,37 @@ function list(args) {
|
|
|
1143
1254
|
console.log(`\n${rows.length} skills in catalog '${cat.source}'. Details: skilldrop info <skill>`);
|
|
1144
1255
|
}
|
|
1145
1256
|
|
|
1257
|
+
/* RFC-0032: what to try first after installing a pack, how to tell it worked, what to do
|
|
1258
|
+
if it didn't — the same first-value block the pack's site page renders. */
|
|
1259
|
+
function firstValueLines(p) {
|
|
1260
|
+
const fv = p["first-value"];
|
|
1261
|
+
if (!fv) return [];
|
|
1262
|
+
const out = [`Start here: ${fv["starter-task"]}`, "", ` ${fv["starter-prompt"]}`, ""];
|
|
1263
|
+
for (const pre of fv.prerequisites || []) out.push(` before you start: ${pre}`);
|
|
1264
|
+
out.push(` worked if: ${fv.verification}`, ` if nothing happens: ${fv.recovery}`);
|
|
1265
|
+
return out;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
function infoPack(args) {
|
|
1269
|
+
const cat = resolveCatalog(args.flags.from);
|
|
1270
|
+
const ps = packsOf(cat) || die(`catalog '${cat.source}' has no packs`);
|
|
1271
|
+
const name = args.flags.pack;
|
|
1272
|
+
const p = ps[name] || die(`unknown pack '${name}' — available: ${Object.keys(ps).join(", ")}`);
|
|
1273
|
+
if (args.flags.json)
|
|
1274
|
+
return emitJSON({ catalog: cat.source, name, ...p });
|
|
1275
|
+
console.log(`${p.display_name || name} (${name})\n\n${p.description}\n`);
|
|
1276
|
+
console.log(`skills: ${p.skills.join(", ")}`);
|
|
1277
|
+
if ((p.requires || []).length) console.log(`requires: ${p.requires.join(", ")} (installed with it)`);
|
|
1278
|
+
if ((p.loops || []).length) console.log(`loops: ${p.loops.join(", ")}`);
|
|
1279
|
+
if (p.links && p.links.documentation) console.log(`page: ${p.links.documentation}`);
|
|
1280
|
+
const fv = firstValueLines(p);
|
|
1281
|
+
if (fv.length) console.log("\n" + fv.join("\n"));
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1146
1284
|
function info(args) {
|
|
1285
|
+
if (args.flags.pack) return infoPack(args);
|
|
1147
1286
|
const cat = resolveCatalog(args.flags.from);
|
|
1148
|
-
const s = args._[0] || die("pass a skill name");
|
|
1287
|
+
const s = args._[0] || die("pass a skill name, or --pack <name>");
|
|
1149
1288
|
if (!skillExists(cat, s)) die(`unknown skill '${s}' in catalog '${cat.source}'`);
|
|
1150
1289
|
const m = manifestOf(cat, s);
|
|
1151
1290
|
const ps = packsOf(cat) || {};
|
|
@@ -1182,13 +1321,13 @@ function listPacks(args) {
|
|
|
1182
1321
|
catalog: cat.source,
|
|
1183
1322
|
count: ps ? Object.keys(ps).length : 0,
|
|
1184
1323
|
packs: Object.entries(ps || {}).map(([name, p]) => ({
|
|
1185
|
-
name, description: p.description || null, skills: p.skills || [],
|
|
1324
|
+
name, description: p.description || null, skills: p.skills || [], requires: p.requires || [],
|
|
1186
1325
|
})),
|
|
1187
1326
|
});
|
|
1188
1327
|
if (!ps) return console.log(`catalog '${cat.source}' defines no packs.`);
|
|
1189
1328
|
const w = Math.max(...Object.keys(ps).map((n) => n.length));
|
|
1190
1329
|
for (const [n, p] of Object.entries(ps))
|
|
1191
|
-
console.log(`${n.padEnd(w)} (${p.skills.length} skills) ${p.description}`);
|
|
1330
|
+
console.log(`${n.padEnd(w)} (${p.skills.length} skills${(p.requires || []).length ? ` + ${p.requires.join(", ")}` : ""}) ${p.description}`);
|
|
1192
1331
|
console.log("\nInstall one: skilldrop install --pack <name>");
|
|
1193
1332
|
}
|
|
1194
1333
|
|
|
@@ -1205,7 +1344,7 @@ function validateCmd(args) {
|
|
|
1205
1344
|
if (ps)
|
|
1206
1345
|
for (const [n, p] of Object.entries(ps))
|
|
1207
1346
|
for (const s of p.skills)
|
|
1208
|
-
if (!names.includes(s)) { console.log(`FAIL packs
|
|
1347
|
+
if (!names.includes(s)) { console.log(`FAIL packs: pack '${n}' lists unknown skill '${s}'`); bad++; }
|
|
1209
1348
|
if (bad) { console.log(`\n${bad} problem(s) in catalog '${cat.source}'.`); process.exit(1); }
|
|
1210
1349
|
console.log(`OK: ${names.length} skills in catalog '${cat.source}' pass the structural check.`);
|
|
1211
1350
|
}
|
package/catalogue.json
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "RFC-0034. The catalogue index: pack display order and the outcome browse axis (RFC-0026). Pack metadata lives in packs/<pack>/pack.json; membership is the folders — a skill is in a pack because it sits at packs/<pack>/skills/<name>/.",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "ai-engineering", "claude-api"],
|
|
5
|
+
"outcomes": {
|
|
6
|
+
"decide-what-to-build": {
|
|
7
|
+
"description": "Turn a direction into a committed, measurable plan: press releases, strategy frameworks, OKRs, business cases, requirements, PRDs, and the metrics that will say whether it worked.",
|
|
8
|
+
"skills": [
|
|
9
|
+
"prfaq",
|
|
10
|
+
"strategy-analysis",
|
|
11
|
+
"okr-cascade",
|
|
12
|
+
"business-case",
|
|
13
|
+
"capacity-cost-model",
|
|
14
|
+
"requirements-interview",
|
|
15
|
+
"prd-draft",
|
|
16
|
+
"nfr-spec",
|
|
17
|
+
"success-metrics",
|
|
18
|
+
"user-story-splitter",
|
|
19
|
+
"user-journey-map"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"design-the-system": {
|
|
23
|
+
"description": "Commit the shape before the code: decision records, design docs, diagrams, contracts, schemas, migration and threat models, and the design of any agentic parts.",
|
|
24
|
+
"skills": [
|
|
25
|
+
"adr-generator",
|
|
26
|
+
"design-doc",
|
|
27
|
+
"architecture-diagrams",
|
|
28
|
+
"reverse-architecture",
|
|
29
|
+
"figma-diagrams",
|
|
30
|
+
"api-contract-draft",
|
|
31
|
+
"db-schema-design",
|
|
32
|
+
"data-contract",
|
|
33
|
+
"tech-comparison-matrix",
|
|
34
|
+
"threat-model",
|
|
35
|
+
"agent-threat-model",
|
|
36
|
+
"migration-plan",
|
|
37
|
+
"agent-loop-design",
|
|
38
|
+
"subagent-design",
|
|
39
|
+
"agent-budget"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"build-and-review-software": {
|
|
43
|
+
"description": "The loop around the code itself: supervised implementation, adversarial review panels, test plans, triage, accessibility and static-analysis passes, and the policy files agents read.",
|
|
44
|
+
"skills": [
|
|
45
|
+
"feature-implement-loop",
|
|
46
|
+
"pre-merge-review",
|
|
47
|
+
"devils-advocate",
|
|
48
|
+
"council-review",
|
|
49
|
+
"accessibility-audit",
|
|
50
|
+
"sonar-onboard",
|
|
51
|
+
"sonar-review",
|
|
52
|
+
"test-plan-generator",
|
|
53
|
+
"bug-triage",
|
|
54
|
+
"agents-md-generator",
|
|
55
|
+
"llm-eval-harness",
|
|
56
|
+
"eval-harness-generator",
|
|
57
|
+
"contribution-wizard"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
"build-on-the-claude-api": {
|
|
61
|
+
"description": "Skills for teams building directly on the Anthropic API — prompt caching strategy, token budgeting, eval generation, and tool-use schema writing.",
|
|
62
|
+
"skills": [
|
|
63
|
+
"prompt-caching-advisor",
|
|
64
|
+
"token-budget-estimator",
|
|
65
|
+
"eval-harness-generator",
|
|
66
|
+
"tool-use-schema-writer"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"run-and-recover-the-service": {
|
|
70
|
+
"description": "Operate what shipped: runbooks, observability design, release notes, incident communication, and the postmortem that closes the loop.",
|
|
71
|
+
"skills": [
|
|
72
|
+
"runbook-generator",
|
|
73
|
+
"observability-plan",
|
|
74
|
+
"release-notes",
|
|
75
|
+
"incident-comms",
|
|
76
|
+
"postmortem-generator",
|
|
77
|
+
"launch-readiness"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"explain-it-to-decision-makers": {
|
|
81
|
+
"description": "Get a non-technical audience to a decision: audience profiling, deck outlines and real decks, exec summaries, decision logs, and how-to guides.",
|
|
82
|
+
"skills": [
|
|
83
|
+
"audience-profile",
|
|
84
|
+
"slide-outliner",
|
|
85
|
+
"deck-builder",
|
|
86
|
+
"exec-summary",
|
|
87
|
+
"decision-log",
|
|
88
|
+
"guide-builder"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"govern-ai-use": {
|
|
92
|
+
"description": "Adopt AI deliberately and prove what it is doing: readiness assessment, use-case triage, rollout plans, acceptable-use policy, adoption staging, and usage reporting.",
|
|
93
|
+
"skills": [
|
|
94
|
+
"ai-readiness-assessment",
|
|
95
|
+
"ai-use-case-triage",
|
|
96
|
+
"ai-adoption-rollout",
|
|
97
|
+
"ai-usage-policy",
|
|
98
|
+
"agent-adoption-stage",
|
|
99
|
+
"ai-usage-report"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"get-a-draft-ready-to-ship": {
|
|
103
|
+
"description": "The passes either side of a generator: collect a messy input into a structured brief, critique the argument, and strip the machine artifacts before it leaves the building.",
|
|
104
|
+
"skills": [
|
|
105
|
+
"brief-intake",
|
|
106
|
+
"doc-critique",
|
|
107
|
+
"output-hygiene"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/sananthanarayan/skilldrop/contracts/catalogue.schema.json",
|
|
4
|
+
"title": "skilldrop catalogue.json",
|
|
5
|
+
"$comment": "RFC-0026 / RFC-0034. The catalogue index: pack display order, and the outcome axis. Packs answer WHO needs a skill (the folder it sits in); outcomes answer WHY someone opened the catalogue.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["version", "packs", "outcomes"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"$comment": { "type": "string" },
|
|
11
|
+
"version": { "type": "string" },
|
|
12
|
+
"packs": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"items": { "type": "string" },
|
|
15
|
+
"minItems": 1,
|
|
16
|
+
"description": "Every pack folder under packs/, in display order. validate.py checks both directions."
|
|
17
|
+
},
|
|
18
|
+
"outcomes": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"description": "The catalogue's second browse axis. A browse aid only — never an install unit; the CLI takes no --outcome.",
|
|
21
|
+
"additionalProperties": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"required": ["description", "skills"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"description": { "type": "string", "description": "The chip's tooltip on the catalogue site." },
|
|
27
|
+
"skills": { "type": "array", "items": { "type": "string" }, "minItems": 1 }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/sananthanarayan/skilldrop/contracts/loop.schema.json",
|
|
4
4
|
"title": "skilldrop loop",
|
|
5
|
-
"$comment": "RFC-0028. A loop sequences existing skills; it never contains one. Skills stay in
|
|
5
|
+
"$comment": "RFC-0028. A loop sequences existing skills; it never contains one. Skills stay in their own packs/<pack>/skills/<name> folders and stay independently installable — a loop is a named order plus the gates between stages. Enforced by validate.py with hand-rolled stdlib checks: skilldrop ships zero runtime dependencies and this file must not become a reason to add `jsonschema`.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["name", "description", "entrypoint", "kind", "stages"],
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"type": "array",
|
|
49
49
|
"minItems": 1,
|
|
50
50
|
"items": { "type": "string" },
|
|
51
|
-
"description": "Skill folder names, in order. Each must be a real skills/<name
|
|
51
|
+
"description": "Skill folder names, in order. Each must be a real skill folder (packs/<pack>/skills/<name>). `*` means any generator, and is legal only in a wrapper."
|
|
52
52
|
},
|
|
53
53
|
"gate": {
|
|
54
54
|
"type": "object",
|
|
@@ -1,42 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/sananthanarayan/skilldrop/contracts/pack.schema.json",
|
|
4
|
-
"title": "skilldrop packs.json",
|
|
5
|
-
"$comment": "RFC-0001 / RFC-
|
|
4
|
+
"title": "skilldrop packs/<pack>/pack.json",
|
|
5
|
+
"$comment": "RFC-0001 / RFC-0032 / RFC-0033 / RFC-0034. One pack's metadata. Membership is not listed here: a skill is in this pack because it sits at packs/<pack>/skills/<name>/, and a loop because it sits at packs/<pack>/loops/<name>/. Key names follow agent-ready-repo's pack.toml so the two stay mechanically convertible.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
|
-
"required": ["
|
|
8
|
+
"required": ["description"],
|
|
9
9
|
"properties": {
|
|
10
10
|
"$comment": { "type": "string" },
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"description": { "type": "string", "description": "One line — who this pack is for." },
|
|
12
|
+
"display_name": { "type": "string", "description": "RFC-0032. Human title for the pack's page and plugin entry." },
|
|
13
|
+
"keywords": { "type": "array", "items": { "type": "string" }, "description": "RFC-0032. Search terms, copied into the plugin entry." },
|
|
14
|
+
"links": {
|
|
13
15
|
"type": "object",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"description": { "type": "string", "description": "One line — who this pack is for." },
|
|
21
|
-
"skills": { "type": "array", "items": { "type": "string" }, "minItems": 1,
|
|
22
|
-
"description": "Real skill folders. Every skill must appear in at least one pack." },
|
|
23
|
-
"loops": { "type": "array", "items": { "type": "string" },
|
|
24
|
-
"description": "RFC-0028. Real loops/ folders. Every loop must appear in at least one pack." }
|
|
25
|
-
}
|
|
16
|
+
"additionalProperties": false,
|
|
17
|
+
"description": "RFC-0032. Catalogue-facing links; `documentation` is the pack's page.",
|
|
18
|
+
"properties": {
|
|
19
|
+
"homepage": { "type": "string" },
|
|
20
|
+
"repository": { "type": "string" },
|
|
21
|
+
"documentation": { "type": "string" }
|
|
26
22
|
}
|
|
27
23
|
},
|
|
28
|
-
"
|
|
24
|
+
"maintainers": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"description": "RFC-0032.",
|
|
27
|
+
"items": { "type": "object", "additionalProperties": false, "required": ["name"], "properties": { "name": { "type": "string" } } }
|
|
28
|
+
},
|
|
29
|
+
"first-value": {
|
|
29
30
|
"type": "object",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
31
|
+
"additionalProperties": false,
|
|
32
|
+
"description": "RFC-0032. What to try first after installing, how to tell it worked, and what to do if it didn't. Key names match agent-ready-repo's [pack.first-value].",
|
|
33
|
+
"required": ["audience-posture", "prerequisites", "starter-task", "starter-prompt", "verification", "recovery"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"audience-posture": { "type": "string", "enum": ["technical", "non-technical"] },
|
|
36
|
+
"prerequisites": { "type": "array", "items": { "type": "string" } },
|
|
37
|
+
"starter-task": { "type": "string" },
|
|
38
|
+
"starter-prompt": { "type": "string" },
|
|
39
|
+
"verification": { "type": "string" },
|
|
40
|
+
"recovery": { "type": "string" }
|
|
39
41
|
}
|
|
42
|
+
},
|
|
43
|
+
"requires": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"items": { "type": "string" },
|
|
46
|
+
"description": "RFC-0033. Packs installed together with this one (in practice, `core`). One level only: a required pack may not itself require."
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
49
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "Portable AI-agent skills for the deliverables knowledge workers ship \u2014 diagrams, ADRs, PRDs, runbooks, decks, reviews \u2014 installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sanjay Ananthanarayan",
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
13
|
"bin/",
|
|
14
|
-
"
|
|
14
|
+
"packs/",
|
|
15
15
|
"agents/",
|
|
16
|
-
"loops/",
|
|
17
16
|
"contracts/",
|
|
18
|
-
"
|
|
17
|
+
"catalogue.json",
|
|
19
18
|
"model-routing.json"
|
|
20
19
|
],
|
|
21
20
|
"engines": {
|