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.
Files changed (403) hide show
  1. package/README.md +103 -98
  2. package/agents/README.md +3 -3
  3. package/bin/skilldrop.js +165 -26
  4. package/catalogue.json +111 -0
  5. package/contracts/catalogue.schema.json +32 -0
  6. package/contracts/loop.schema.json +2 -2
  7. package/contracts/pack.schema.json +34 -27
  8. package/package.json +3 -4
  9. package/packs/ai-engineering/pack.json +22 -0
  10. package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/SKILL.md +2 -2
  11. package/packs/claude-api/pack.json +21 -0
  12. package/{skills → packs/claude-api/skills}/eval-harness-generator/SKILL.md +2 -2
  13. package/{skills → packs/claude-api/skills}/eval-harness-generator/manifest.json +1 -1
  14. package/{loops → packs/core/loops}/ship-a-draft/LOOP.md +1 -1
  15. package/packs/core/pack.json +21 -0
  16. package/{skills → packs/core/skills}/council-review/SKILL.md +1 -1
  17. package/{skills → packs/core/skills}/council-review/reference.md +2 -2
  18. package/{loops → packs/dev-team/loops}/build/LOOP.md +3 -3
  19. package/{loops → packs/dev-team/loops}/build/loop.json +1 -1
  20. package/{loops → packs/dev-team/loops}/release/LOOP.md +2 -2
  21. package/packs/dev-team/pack.json +22 -0
  22. package/{skills → packs/dev-team/skills}/agents-md-generator/reference.md +1 -1
  23. package/{skills → packs/dev-team/skills}/contribution-wizard/SKILL.md +5 -5
  24. package/{skills → packs/dev-team/skills}/contribution-wizard/manifest.json +1 -1
  25. package/{skills → packs/dev-team/skills}/devils-advocate/SKILL.md +1 -1
  26. package/{skills → packs/dev-team/skills}/pre-merge-review/SKILL.md +1 -1
  27. package/{loops → packs/product-manager/loops}/discover/LOOP.md +3 -3
  28. package/packs/product-manager/pack.json +22 -0
  29. package/{loops → packs/solution-architect/loops}/design/LOOP.md +2 -2
  30. package/packs/solution-architect/pack.json +22 -0
  31. package/{loops → packs/sre-oncall/loops}/operate/LOOP.md +1 -1
  32. package/packs/sre-oncall/pack.json +22 -0
  33. package/packs/stakeholder-comms/pack.json +22 -0
  34. package/{skills → packs/stakeholder-comms/skills}/deck-builder/SKILL.md +1 -1
  35. package/packs.json +0 -231
  36. /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/evals/eval_queries.json +0 -0
  37. /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/evals/evals.json +0 -0
  38. /package/{skills → packs/ai-engineering/skills}/agent-adoption-stage/manifest.json +0 -0
  39. /package/{skills → packs/ai-engineering/skills}/agent-budget/SKILL.md +0 -0
  40. /package/{skills → packs/ai-engineering/skills}/agent-budget/evals/eval_queries.json +0 -0
  41. /package/{skills → packs/ai-engineering/skills}/agent-budget/evals/evals.json +0 -0
  42. /package/{skills → packs/ai-engineering/skills}/agent-budget/manifest.json +0 -0
  43. /package/{skills → packs/ai-engineering/skills}/agent-budget/templates/budget-spec.md +0 -0
  44. /package/{skills → packs/ai-engineering/skills}/agent-loop-design/SKILL.md +0 -0
  45. /package/{skills → packs/ai-engineering/skills}/agent-loop-design/evals/eval_queries.json +0 -0
  46. /package/{skills → packs/ai-engineering/skills}/agent-loop-design/evals/evals.json +0 -0
  47. /package/{skills → packs/ai-engineering/skills}/agent-loop-design/manifest.json +0 -0
  48. /package/{skills → packs/ai-engineering/skills}/agent-loop-design/templates/loop-spec.md +0 -0
  49. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/SKILL.md +0 -0
  50. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/evals/eval_queries.json +0 -0
  51. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/evals/evals.json +0 -0
  52. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/examples/support-triage-agent.md +0 -0
  53. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/manifest.json +0 -0
  54. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/reference.md +0 -0
  55. /package/{skills → packs/ai-engineering/skills}/agent-threat-model/templates/agent-threat-model.md +0 -0
  56. /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/SKILL.md +0 -0
  57. /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/evals/eval_queries.json +0 -0
  58. /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/evals/evals.json +0 -0
  59. /package/{skills → packs/ai-engineering/skills}/ai-adoption-rollout/manifest.json +0 -0
  60. /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/SKILL.md +0 -0
  61. /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/evals/eval_queries.json +0 -0
  62. /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/evals/evals.json +0 -0
  63. /package/{skills → packs/ai-engineering/skills}/ai-readiness-assessment/manifest.json +0 -0
  64. /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/SKILL.md +0 -0
  65. /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/evals/eval_queries.json +0 -0
  66. /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/evals/evals.json +0 -0
  67. /package/{skills → packs/ai-engineering/skills}/ai-usage-policy/manifest.json +0 -0
  68. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/SKILL.md +0 -0
  69. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/examples/weekly-engineering-team.md +0 -0
  70. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/manifest.json +0 -0
  71. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/scripts/build_report.py +0 -0
  72. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/report-per-user.md +0 -0
  73. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/report-team-rollup.md +0 -0
  74. /package/{skills → packs/ai-engineering/skills}/ai-usage-report/templates/usage-event-schema.md +0 -0
  75. /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/SKILL.md +0 -0
  76. /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/evals/eval_queries.json +0 -0
  77. /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/evals/evals.json +0 -0
  78. /package/{skills → packs/ai-engineering/skills}/ai-use-case-triage/manifest.json +0 -0
  79. /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/SKILL.md +0 -0
  80. /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/manifest.json +0 -0
  81. /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/reference.md +0 -0
  82. /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/templates/eval-plan.md +0 -0
  83. /package/{skills → packs/ai-engineering/skills}/llm-eval-harness/templates/golden-case.jsonl +0 -0
  84. /package/{skills → packs/ai-engineering/skills}/subagent-design/SKILL.md +0 -0
  85. /package/{skills → packs/ai-engineering/skills}/subagent-design/evals/eval_queries.json +0 -0
  86. /package/{skills → packs/ai-engineering/skills}/subagent-design/evals/evals.json +0 -0
  87. /package/{skills → packs/ai-engineering/skills}/subagent-design/manifest.json +0 -0
  88. /package/{skills → packs/ai-engineering/skills}/subagent-design/templates/orchestration-plan.md +0 -0
  89. /package/{skills → packs/claude-api/skills}/prompt-caching-advisor/SKILL.md +0 -0
  90. /package/{skills → packs/claude-api/skills}/prompt-caching-advisor/manifest.json +0 -0
  91. /package/{skills → packs/claude-api/skills}/token-budget-estimator/SKILL.md +0 -0
  92. /package/{skills → packs/claude-api/skills}/token-budget-estimator/manifest.json +0 -0
  93. /package/{skills → packs/claude-api/skills}/tool-use-schema-writer/SKILL.md +0 -0
  94. /package/{skills → packs/claude-api/skills}/tool-use-schema-writer/manifest.json +0 -0
  95. /package/{loops → packs/core/loops}/ship-a-draft/evals/eval_queries.json +0 -0
  96. /package/{loops → packs/core/loops}/ship-a-draft/evals/evals.json +0 -0
  97. /package/{loops → packs/core/loops}/ship-a-draft/loop.json +0 -0
  98. /package/{skills → packs/core/skills}/brief-intake/SKILL.md +0 -0
  99. /package/{skills → packs/core/skills}/brief-intake/evals/eval_queries.json +0 -0
  100. /package/{skills → packs/core/skills}/brief-intake/evals/evals.json +0 -0
  101. /package/{skills → packs/core/skills}/brief-intake/manifest.json +0 -0
  102. /package/{skills → packs/core/skills}/brief-intake/templates/brief-adr.md +0 -0
  103. /package/{skills → packs/core/skills}/brief-intake/templates/brief-decision-log.md +0 -0
  104. /package/{skills → packs/core/skills}/brief-intake/templates/brief-deck.md +0 -0
  105. /package/{skills → packs/core/skills}/brief-intake/templates/brief-design-doc.md +0 -0
  106. /package/{skills → packs/core/skills}/brief-intake/templates/brief-exec-summary.md +0 -0
  107. /package/{skills → packs/core/skills}/brief-intake/templates/brief-generic.md +0 -0
  108. /package/{skills → packs/core/skills}/brief-intake/templates/brief-runbook.md +0 -0
  109. /package/{skills → packs/core/skills}/brief-intake/templates/brief-tech-comparison.md +0 -0
  110. /package/{skills → packs/core/skills}/council-review/evals/eval_queries.json +0 -0
  111. /package/{skills → packs/core/skills}/council-review/evals/evals.json +0 -0
  112. /package/{skills → packs/core/skills}/council-review/examples/redis-cache-decision.md +0 -0
  113. /package/{skills → packs/core/skills}/council-review/manifest.json +0 -0
  114. /package/{skills → packs/core/skills}/council-review/seats/architect.md +0 -0
  115. /package/{skills → packs/core/skills}/council-review/seats/bench.md +0 -0
  116. /package/{skills → packs/core/skills}/council-review/seats/operator.md +0 -0
  117. /package/{skills → packs/core/skills}/council-review/seats/pragmatist.md +0 -0
  118. /package/{skills → packs/core/skills}/council-review/seats/security-engineer.md +0 -0
  119. /package/{skills → packs/core/skills}/council-review/seats/user-advocate.md +0 -0
  120. /package/{skills → packs/core/skills}/council-review/templates/council-review.md +0 -0
  121. /package/{skills → packs/core/skills}/doc-critique/SKILL.md +0 -0
  122. /package/{skills → packs/core/skills}/doc-critique/evals/eval_queries.json +0 -0
  123. /package/{skills → packs/core/skills}/doc-critique/evals/evals.json +0 -0
  124. /package/{skills → packs/core/skills}/doc-critique/examples/design-doc-critique.md +0 -0
  125. /package/{skills → packs/core/skills}/doc-critique/manifest.json +0 -0
  126. /package/{skills → packs/core/skills}/doc-critique/rubrics/adr.md +0 -0
  127. /package/{skills → packs/core/skills}/doc-critique/rubrics/decision-log.md +0 -0
  128. /package/{skills → packs/core/skills}/doc-critique/rubrics/deck.md +0 -0
  129. /package/{skills → packs/core/skills}/doc-critique/rubrics/design-doc.md +0 -0
  130. /package/{skills → packs/core/skills}/doc-critique/rubrics/exec-summary.md +0 -0
  131. /package/{skills → packs/core/skills}/doc-critique/rubrics/generic.md +0 -0
  132. /package/{skills → packs/core/skills}/doc-critique/rubrics/runbook.md +0 -0
  133. /package/{skills → packs/core/skills}/doc-critique/rubrics/tech-comparison.md +0 -0
  134. /package/{skills → packs/core/skills}/doc-critique/templates/critique.md +0 -0
  135. /package/{skills → packs/core/skills}/output-hygiene/SKILL.md +0 -0
  136. /package/{skills → packs/core/skills}/output-hygiene/evals/eval_queries.json +0 -0
  137. /package/{skills → packs/core/skills}/output-hygiene/evals/evals.json +0 -0
  138. /package/{skills → packs/core/skills}/output-hygiene/manifest.json +0 -0
  139. /package/{skills → packs/core/skills}/output-hygiene/reference.md +0 -0
  140. /package/{skills → packs/core/skills}/output-hygiene/scripts/scrub.py +0 -0
  141. /package/{loops → packs/dev-team/loops}/build/evals/eval_queries.json +0 -0
  142. /package/{loops → packs/dev-team/loops}/build/evals/evals.json +0 -0
  143. /package/{loops → packs/dev-team/loops}/release/loop.json +0 -0
  144. /package/{skills → packs/dev-team/skills}/accessibility-audit/SKILL.md +0 -0
  145. /package/{skills → packs/dev-team/skills}/accessibility-audit/examples/login-form.md +0 -0
  146. /package/{skills → packs/dev-team/skills}/accessibility-audit/manifest.json +0 -0
  147. /package/{skills → packs/dev-team/skills}/accessibility-audit/reference.md +0 -0
  148. /package/{skills → packs/dev-team/skills}/agents-md-generator/SKILL.md +0 -0
  149. /package/{skills → packs/dev-team/skills}/agents-md-generator/evals/eval_queries.json +0 -0
  150. /package/{skills → packs/dev-team/skills}/agents-md-generator/evals/evals.json +0 -0
  151. /package/{skills → packs/dev-team/skills}/agents-md-generator/manifest.json +0 -0
  152. /package/{skills → packs/dev-team/skills}/agents-md-generator/templates/agents-md.md +0 -0
  153. /package/{skills → packs/dev-team/skills}/bug-triage/SKILL.md +0 -0
  154. /package/{skills → packs/dev-team/skills}/bug-triage/evals/eval_queries.json +0 -0
  155. /package/{skills → packs/dev-team/skills}/bug-triage/evals/evals.json +0 -0
  156. /package/{skills → packs/dev-team/skills}/bug-triage/manifest.json +0 -0
  157. /package/{skills → packs/dev-team/skills}/bug-triage/templates/bug-ticket.md +0 -0
  158. /package/{skills → packs/dev-team/skills}/devils-advocate/evals/eval_queries.json +0 -0
  159. /package/{skills → packs/dev-team/skills}/devils-advocate/evals/evals.json +0 -0
  160. /package/{skills → packs/dev-team/skills}/devils-advocate/examples/rate-limiter-review.md +0 -0
  161. /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/adversarial-review.md +0 -0
  162. /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/edge-cases.md +0 -0
  163. /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/future-proofing.md +0 -0
  164. /package/{skills → packs/dev-team/skills}/devils-advocate/lenses/test-coverage.md +0 -0
  165. /package/{skills → packs/dev-team/skills}/devils-advocate/manifest.json +0 -0
  166. /package/{skills → packs/dev-team/skills}/devils-advocate/templates/challenge.md +0 -0
  167. /package/{skills → packs/dev-team/skills}/feature-implement-loop/SKILL.md +0 -0
  168. /package/{skills → packs/dev-team/skills}/feature-implement-loop/manifest.json +0 -0
  169. /package/{skills → packs/dev-team/skills}/launch-readiness/SKILL.md +0 -0
  170. /package/{skills → packs/dev-team/skills}/launch-readiness/evals/eval_queries.json +0 -0
  171. /package/{skills → packs/dev-team/skills}/launch-readiness/evals/evals.json +0 -0
  172. /package/{skills → packs/dev-team/skills}/launch-readiness/examples/schema-change-revise.md +0 -0
  173. /package/{skills → packs/dev-team/skills}/launch-readiness/manifest.json +0 -0
  174. /package/{skills → packs/dev-team/skills}/launch-readiness/templates/readiness-report.md +0 -0
  175. /package/{skills → packs/dev-team/skills}/migration-plan/SKILL.md +0 -0
  176. /package/{skills → packs/dev-team/skills}/migration-plan/evals/eval_queries.json +0 -0
  177. /package/{skills → packs/dev-team/skills}/migration-plan/evals/evals.json +0 -0
  178. /package/{skills → packs/dev-team/skills}/migration-plan/manifest.json +0 -0
  179. /package/{skills → packs/dev-team/skills}/migration-plan/templates/migration-plan.md +0 -0
  180. /package/{skills → packs/dev-team/skills}/pre-merge-review/evals/eval_queries.json +0 -0
  181. /package/{skills → packs/dev-team/skills}/pre-merge-review/evals/evals.json +0 -0
  182. /package/{skills → packs/dev-team/skills}/pre-merge-review/examples/pre-merge-verdict.md +0 -0
  183. /package/{skills → packs/dev-team/skills}/pre-merge-review/manifest.json +0 -0
  184. /package/{skills → packs/dev-team/skills}/pre-merge-review/scripts/gate.py +0 -0
  185. /package/{skills → packs/dev-team/skills}/release-notes/SKILL.md +0 -0
  186. /package/{skills → packs/dev-team/skills}/release-notes/manifest.json +0 -0
  187. /package/{skills → packs/dev-team/skills}/release-notes/templates/release-notes.md +0 -0
  188. /package/{skills → packs/dev-team/skills}/sonar-onboard/SKILL.md +0 -0
  189. /package/{skills → packs/dev-team/skills}/sonar-onboard/evals/eval_queries.json +0 -0
  190. /package/{skills → packs/dev-team/skills}/sonar-onboard/evals/evals.json +0 -0
  191. /package/{skills → packs/dev-team/skills}/sonar-onboard/manifest.json +0 -0
  192. /package/{skills → packs/dev-team/skills}/sonar-onboard/reference.md +0 -0
  193. /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +0 -0
  194. /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +0 -0
  195. /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/readme-snippet.md +0 -0
  196. /package/{skills → packs/dev-team/skills}/sonar-onboard/templates/sonar-project.properties.tmpl +0 -0
  197. /package/{skills → packs/dev-team/skills}/sonar-review/SKILL.md +0 -0
  198. /package/{skills → packs/dev-team/skills}/sonar-review/evals/eval_queries.json +0 -0
  199. /package/{skills → packs/dev-team/skills}/sonar-review/evals/evals.json +0 -0
  200. /package/{skills → packs/dev-team/skills}/sonar-review/lenses/bugs.md +0 -0
  201. /package/{skills → packs/dev-team/skills}/sonar-review/lenses/code-smells.md +0 -0
  202. /package/{skills → packs/dev-team/skills}/sonar-review/lenses/coverage-and-duplication.md +0 -0
  203. /package/{skills → packs/dev-team/skills}/sonar-review/lenses/security-hotspots.md +0 -0
  204. /package/{skills → packs/dev-team/skills}/sonar-review/lenses/vulnerabilities.md +0 -0
  205. /package/{skills → packs/dev-team/skills}/sonar-review/manifest.json +0 -0
  206. /package/{skills → packs/dev-team/skills}/sonar-review/reference.md +0 -0
  207. /package/{skills → packs/dev-team/skills}/sonar-review/templates/report.md +0 -0
  208. /package/{skills → packs/dev-team/skills}/test-plan-generator/SKILL.md +0 -0
  209. /package/{skills → packs/dev-team/skills}/test-plan-generator/evals/eval_queries.json +0 -0
  210. /package/{skills → packs/dev-team/skills}/test-plan-generator/evals/evals.json +0 -0
  211. /package/{skills → packs/dev-team/skills}/test-plan-generator/manifest.json +0 -0
  212. /package/{skills → packs/dev-team/skills}/test-plan-generator/templates/test-plan.md +0 -0
  213. /package/{skills → packs/dev-team/skills}/user-story-splitter/SKILL.md +0 -0
  214. /package/{skills → packs/dev-team/skills}/user-story-splitter/evals/eval_queries.json +0 -0
  215. /package/{skills → packs/dev-team/skills}/user-story-splitter/evals/evals.json +0 -0
  216. /package/{skills → packs/dev-team/skills}/user-story-splitter/examples/notifications-epic.md +0 -0
  217. /package/{skills → packs/dev-team/skills}/user-story-splitter/manifest.json +0 -0
  218. /package/{skills → packs/dev-team/skills}/user-story-splitter/templates/story.md +0 -0
  219. /package/{loops → packs/product-manager/loops}/discover/evals/eval_queries.json +0 -0
  220. /package/{loops → packs/product-manager/loops}/discover/evals/evals.json +0 -0
  221. /package/{loops → packs/product-manager/loops}/discover/loop.json +0 -0
  222. /package/{skills → packs/product-manager/skills}/business-case/SKILL.md +0 -0
  223. /package/{skills → packs/product-manager/skills}/business-case/examples/build-vs-buy-flags.md +0 -0
  224. /package/{skills → packs/product-manager/skills}/business-case/manifest.json +0 -0
  225. /package/{skills → packs/product-manager/skills}/business-case/templates/business-case.md +0 -0
  226. /package/{skills → packs/product-manager/skills}/okr-cascade/SKILL.md +0 -0
  227. /package/{skills → packs/product-manager/skills}/okr-cascade/evals/eval_queries.json +0 -0
  228. /package/{skills → packs/product-manager/skills}/okr-cascade/evals/evals.json +0 -0
  229. /package/{skills → packs/product-manager/skills}/okr-cascade/manifest.json +0 -0
  230. /package/{skills → packs/product-manager/skills}/okr-cascade/templates/okr-cascade.md +0 -0
  231. /package/{skills → packs/product-manager/skills}/prd-draft/SKILL.md +0 -0
  232. /package/{skills → packs/product-manager/skills}/prd-draft/evals/eval_queries.json +0 -0
  233. /package/{skills → packs/product-manager/skills}/prd-draft/evals/evals.json +0 -0
  234. /package/{skills → packs/product-manager/skills}/prd-draft/manifest.json +0 -0
  235. /package/{skills → packs/product-manager/skills}/prd-draft/templates/prd.md +0 -0
  236. /package/{skills → packs/product-manager/skills}/prfaq/SKILL.md +0 -0
  237. /package/{skills → packs/product-manager/skills}/prfaq/evals/eval_queries.json +0 -0
  238. /package/{skills → packs/product-manager/skills}/prfaq/evals/evals.json +0 -0
  239. /package/{skills → packs/product-manager/skills}/prfaq/manifest.json +0 -0
  240. /package/{skills → packs/product-manager/skills}/prfaq/templates/prfaq.md +0 -0
  241. /package/{skills → packs/product-manager/skills}/requirements-interview/SKILL.md +0 -0
  242. /package/{skills → packs/product-manager/skills}/requirements-interview/evals/eval_queries.json +0 -0
  243. /package/{skills → packs/product-manager/skills}/requirements-interview/evals/evals.json +0 -0
  244. /package/{skills → packs/product-manager/skills}/requirements-interview/manifest.json +0 -0
  245. /package/{skills → packs/product-manager/skills}/requirements-interview/templates/interview-kit.md +0 -0
  246. /package/{skills → packs/product-manager/skills}/strategy-analysis/SKILL.md +0 -0
  247. /package/{skills → packs/product-manager/skills}/strategy-analysis/evals/eval_queries.json +0 -0
  248. /package/{skills → packs/product-manager/skills}/strategy-analysis/evals/evals.json +0 -0
  249. /package/{skills → packs/product-manager/skills}/strategy-analysis/examples/market-entry-tows.md +0 -0
  250. /package/{skills → packs/product-manager/skills}/strategy-analysis/manifest.json +0 -0
  251. /package/{skills → packs/product-manager/skills}/success-metrics/SKILL.md +0 -0
  252. /package/{skills → packs/product-manager/skills}/success-metrics/evals/eval_queries.json +0 -0
  253. /package/{skills → packs/product-manager/skills}/success-metrics/evals/evals.json +0 -0
  254. /package/{skills → packs/product-manager/skills}/success-metrics/manifest.json +0 -0
  255. /package/{skills → packs/product-manager/skills}/success-metrics/templates/metrics-plan.md +0 -0
  256. /package/{skills → packs/product-manager/skills}/user-journey-map/SKILL.md +0 -0
  257. /package/{skills → packs/product-manager/skills}/user-journey-map/evals/eval_queries.json +0 -0
  258. /package/{skills → packs/product-manager/skills}/user-journey-map/evals/evals.json +0 -0
  259. /package/{skills → packs/product-manager/skills}/user-journey-map/examples/b2b-saas-onboarding.md +0 -0
  260. /package/{skills → packs/product-manager/skills}/user-journey-map/manifest.json +0 -0
  261. /package/{skills → packs/product-manager/skills}/user-journey-map/templates/journey-map.md +0 -0
  262. /package/{loops → packs/solution-architect/loops}/design/evals/eval_queries.json +0 -0
  263. /package/{loops → packs/solution-architect/loops}/design/evals/evals.json +0 -0
  264. /package/{loops → packs/solution-architect/loops}/design/loop.json +0 -0
  265. /package/{skills → packs/solution-architect/skills}/adr-generator/SKILL.md +0 -0
  266. /package/{skills → packs/solution-architect/skills}/adr-generator/evals/eval_queries.json +0 -0
  267. /package/{skills → packs/solution-architect/skills}/adr-generator/evals/evals.json +0 -0
  268. /package/{skills → packs/solution-architect/skills}/adr-generator/manifest.json +0 -0
  269. /package/{skills → packs/solution-architect/skills}/adr-generator/templates/madr.md +0 -0
  270. /package/{skills → packs/solution-architect/skills}/adr-generator/templates/nygard.md +0 -0
  271. /package/{skills → packs/solution-architect/skills}/api-contract-draft/SKILL.md +0 -0
  272. /package/{skills → packs/solution-architect/skills}/api-contract-draft/evals/eval_queries.json +0 -0
  273. /package/{skills → packs/solution-architect/skills}/api-contract-draft/evals/evals.json +0 -0
  274. /package/{skills → packs/solution-architect/skills}/api-contract-draft/manifest.json +0 -0
  275. /package/{skills → packs/solution-architect/skills}/api-contract-draft/reference.md +0 -0
  276. /package/{skills → packs/solution-architect/skills}/api-contract-draft/templates/openapi-skeleton.yaml +0 -0
  277. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/SKILL.md +0 -0
  278. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/evals/eval_queries.json +0 -0
  279. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/evals/evals.json +0 -0
  280. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/aws-three-tier.md +0 -0
  281. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/c4-container-saas.md +0 -0
  282. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/examples/microservices-sequence.md +0 -0
  283. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/manifest.json +0 -0
  284. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/c4-container.puml +0 -0
  285. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-aws.md +0 -0
  286. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-flowchart.md +0 -0
  287. /package/{skills → packs/solution-architect/skills}/architecture-diagrams/templates/mermaid-sequence.md +0 -0
  288. /package/{skills → packs/solution-architect/skills}/data-contract/SKILL.md +0 -0
  289. /package/{skills → packs/solution-architect/skills}/data-contract/evals/eval_queries.json +0 -0
  290. /package/{skills → packs/solution-architect/skills}/data-contract/evals/evals.json +0 -0
  291. /package/{skills → packs/solution-architect/skills}/data-contract/manifest.json +0 -0
  292. /package/{skills → packs/solution-architect/skills}/data-contract/reference.md +0 -0
  293. /package/{skills → packs/solution-architect/skills}/data-contract/templates/data-contract.md +0 -0
  294. /package/{skills → packs/solution-architect/skills}/db-schema-design/SKILL.md +0 -0
  295. /package/{skills → packs/solution-architect/skills}/db-schema-design/evals/eval_queries.json +0 -0
  296. /package/{skills → packs/solution-architect/skills}/db-schema-design/evals/evals.json +0 -0
  297. /package/{skills → packs/solution-architect/skills}/db-schema-design/manifest.json +0 -0
  298. /package/{skills → packs/solution-architect/skills}/db-schema-design/reference.md +0 -0
  299. /package/{skills → packs/solution-architect/skills}/db-schema-design/templates/schema-design.md +0 -0
  300. /package/{skills → packs/solution-architect/skills}/design-doc/SKILL.md +0 -0
  301. /package/{skills → packs/solution-architect/skills}/design-doc/evals/eval_queries.json +0 -0
  302. /package/{skills → packs/solution-architect/skills}/design-doc/evals/evals.json +0 -0
  303. /package/{skills → packs/solution-architect/skills}/design-doc/manifest.json +0 -0
  304. /package/{skills → packs/solution-architect/skills}/design-doc/templates/design-doc.md +0 -0
  305. /package/{skills → packs/solution-architect/skills}/figma-diagrams/SKILL.md +0 -0
  306. /package/{skills → packs/solution-architect/skills}/figma-diagrams/evals/eval_queries.json +0 -0
  307. /package/{skills → packs/solution-architect/skills}/figma-diagrams/evals/evals.json +0 -0
  308. /package/{skills → packs/solution-architect/skills}/figma-diagrams/manifest.json +0 -0
  309. /package/{skills → packs/solution-architect/skills}/figma-diagrams/reference.md +0 -0
  310. /package/{skills → packs/solution-architect/skills}/figma-diagrams/requirements.txt +0 -0
  311. /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/_figma_client.py +0 -0
  312. /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/frame_to_mermaid.py +0 -0
  313. /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/inspect_file.py +0 -0
  314. /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/list_comments.py +0 -0
  315. /package/{skills → packs/solution-architect/skills}/figma-diagrams/scripts/post_comment.py +0 -0
  316. /package/{skills → packs/solution-architect/skills}/figma-diagrams/templates/figjam-import.json +0 -0
  317. /package/{skills → packs/solution-architect/skills}/nfr-spec/SKILL.md +0 -0
  318. /package/{skills → packs/solution-architect/skills}/nfr-spec/evals/eval_queries.json +0 -0
  319. /package/{skills → packs/solution-architect/skills}/nfr-spec/evals/evals.json +0 -0
  320. /package/{skills → packs/solution-architect/skills}/nfr-spec/manifest.json +0 -0
  321. /package/{skills → packs/solution-architect/skills}/nfr-spec/reference.md +0 -0
  322. /package/{skills → packs/solution-architect/skills}/nfr-spec/templates/nfr-spec.md +0 -0
  323. /package/{skills → packs/solution-architect/skills}/reverse-architecture/SKILL.md +0 -0
  324. /package/{skills → packs/solution-architect/skills}/reverse-architecture/evals/eval_queries.json +0 -0
  325. /package/{skills → packs/solution-architect/skills}/reverse-architecture/evals/evals.json +0 -0
  326. /package/{skills → packs/solution-architect/skills}/reverse-architecture/manifest.json +0 -0
  327. /package/{skills → packs/solution-architect/skills}/reverse-architecture/reference.md +0 -0
  328. /package/{skills → packs/solution-architect/skills}/reverse-architecture/templates/description.md +0 -0
  329. /package/{skills → packs/solution-architect/skills}/reverse-architecture/templates/extraction.md +0 -0
  330. /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/SKILL.md +0 -0
  331. /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/examples/queue-selection.md +0 -0
  332. /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/manifest.json +0 -0
  333. /package/{skills → packs/solution-architect/skills}/tech-comparison-matrix/templates/matrix.md +0 -0
  334. /package/{skills → packs/solution-architect/skills}/threat-model/SKILL.md +0 -0
  335. /package/{skills → packs/solution-architect/skills}/threat-model/evals/eval_queries.json +0 -0
  336. /package/{skills → packs/solution-architect/skills}/threat-model/evals/evals.json +0 -0
  337. /package/{skills → packs/solution-architect/skills}/threat-model/examples/document-upload.md +0 -0
  338. /package/{skills → packs/solution-architect/skills}/threat-model/manifest.json +0 -0
  339. /package/{skills → packs/solution-architect/skills}/threat-model/reference.md +0 -0
  340. /package/{loops → packs/sre-oncall/loops}/operate/evals/eval_queries.json +0 -0
  341. /package/{loops → packs/sre-oncall/loops}/operate/evals/evals.json +0 -0
  342. /package/{loops → packs/sre-oncall/loops}/operate/loop.json +0 -0
  343. /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/SKILL.md +0 -0
  344. /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/manifest.json +0 -0
  345. /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/reference.md +0 -0
  346. /package/{skills → packs/sre-oncall/skills}/capacity-cost-model/templates/cost-model.md +0 -0
  347. /package/{skills → packs/sre-oncall/skills}/incident-comms/SKILL.md +0 -0
  348. /package/{skills → packs/sre-oncall/skills}/incident-comms/evals/eval_queries.json +0 -0
  349. /package/{skills → packs/sre-oncall/skills}/incident-comms/evals/evals.json +0 -0
  350. /package/{skills → packs/sre-oncall/skills}/incident-comms/manifest.json +0 -0
  351. /package/{skills → packs/sre-oncall/skills}/incident-comms/reference.md +0 -0
  352. /package/{skills → packs/sre-oncall/skills}/incident-comms/templates/messages.md +0 -0
  353. /package/{skills → packs/sre-oncall/skills}/observability-plan/SKILL.md +0 -0
  354. /package/{skills → packs/sre-oncall/skills}/observability-plan/evals/eval_queries.json +0 -0
  355. /package/{skills → packs/sre-oncall/skills}/observability-plan/evals/evals.json +0 -0
  356. /package/{skills → packs/sre-oncall/skills}/observability-plan/manifest.json +0 -0
  357. /package/{skills → packs/sre-oncall/skills}/observability-plan/reference.md +0 -0
  358. /package/{skills → packs/sre-oncall/skills}/observability-plan/templates/observability-plan.md +0 -0
  359. /package/{skills → packs/sre-oncall/skills}/postmortem-generator/SKILL.md +0 -0
  360. /package/{skills → packs/sre-oncall/skills}/postmortem-generator/evals/eval_queries.json +0 -0
  361. /package/{skills → packs/sre-oncall/skills}/postmortem-generator/evals/evals.json +0 -0
  362. /package/{skills → packs/sre-oncall/skills}/postmortem-generator/manifest.json +0 -0
  363. /package/{skills → packs/sre-oncall/skills}/postmortem-generator/templates/postmortem.md +0 -0
  364. /package/{skills → packs/sre-oncall/skills}/runbook-generator/SKILL.md +0 -0
  365. /package/{skills → packs/sre-oncall/skills}/runbook-generator/evals/eval_queries.json +0 -0
  366. /package/{skills → packs/sre-oncall/skills}/runbook-generator/evals/evals.json +0 -0
  367. /package/{skills → packs/sre-oncall/skills}/runbook-generator/manifest.json +0 -0
  368. /package/{skills → packs/sre-oncall/skills}/runbook-generator/templates/runbook.md +0 -0
  369. /package/{skills → packs/stakeholder-comms/skills}/audience-profile/SKILL.md +0 -0
  370. /package/{skills → packs/stakeholder-comms/skills}/audience-profile/evals/eval_queries.json +0 -0
  371. /package/{skills → packs/stakeholder-comms/skills}/audience-profile/evals/evals.json +0 -0
  372. /package/{skills → packs/stakeholder-comms/skills}/audience-profile/manifest.json +0 -0
  373. /package/{skills → packs/stakeholder-comms/skills}/audience-profile/reference.md +0 -0
  374. /package/{skills → packs/stakeholder-comms/skills}/decision-log/SKILL.md +0 -0
  375. /package/{skills → packs/stakeholder-comms/skills}/decision-log/evals/eval_queries.json +0 -0
  376. /package/{skills → packs/stakeholder-comms/skills}/decision-log/evals/evals.json +0 -0
  377. /package/{skills → packs/stakeholder-comms/skills}/decision-log/manifest.json +0 -0
  378. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/evals/eval_queries.json +0 -0
  379. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/evals/evals.json +0 -0
  380. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/examples/exec-board-update.md +0 -0
  381. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/examples/templated-brand-deck.md +0 -0
  382. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/manifest.json +0 -0
  383. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/reference.md +0 -0
  384. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/requirements.txt +0 -0
  385. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/scripts/build_deck.py +0 -0
  386. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/templates/deck-spec.json +0 -0
  387. /package/{skills → packs/stakeholder-comms/skills}/deck-builder/templates/palettes.json +0 -0
  388. /package/{skills → packs/stakeholder-comms/skills}/exec-summary/SKILL.md +0 -0
  389. /package/{skills → packs/stakeholder-comms/skills}/exec-summary/evals/eval_queries.json +0 -0
  390. /package/{skills → packs/stakeholder-comms/skills}/exec-summary/evals/evals.json +0 -0
  391. /package/{skills → packs/stakeholder-comms/skills}/exec-summary/manifest.json +0 -0
  392. /package/{skills → packs/stakeholder-comms/skills}/exec-summary/templates/exec-summary.md +0 -0
  393. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/SKILL.md +0 -0
  394. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/examples/local-setup-guide.md +0 -0
  395. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/manifest.json +0 -0
  396. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/api-reference.md +0 -0
  397. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/design-walkthrough.md +0 -0
  398. /package/{skills → packs/stakeholder-comms/skills}/guide-builder/templates/setup-guide.md +0 -0
  399. /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/SKILL.md +0 -0
  400. /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/evals/eval_queries.json +0 -0
  401. /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/evals/evals.json +0 -0
  402. /package/{skills → packs/stakeholder-comms/skills}/slide-outliner/manifest.json +0 -0
  403. /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 two catalog shapes: skilldrop (flat skills/) and agentbundle (packs/<p>/.apm/skills).
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 re-copy installed skills whose version changed
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>/{SKILL.md,manifest.json}) OR an
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
- Two on-disk shapes are read (RFC-0003, RFC-0014):
116
- "skilldrop" — flat skills/<name>/{SKILL.md,manifest.json} + optional packs.json
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/ (skilldrop) or packs/ (agentbundle) directory`);
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.shape === "apm") return Object.keys(cat.skillIndex).sort();
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.shape === "apm") return cat.skillIndex[s] && cat.skillIndex[s].dir;
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.skillsDir, s, "manifest.json"));
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.shape === "apm") return Object.keys(cat.packsData).length ? cat.packsData : null;
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}' has no packs.json — install skills by name`);
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 p.skills.slice();
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
- copyOne(r.cat, r.s, dest, ide, l);
884
- console.log(`updated ${r.s} ${r.installed} -> ${r.current} (${r.src})`);
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}' has no packs.json`);
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 = (pk.loops || []).slice();
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.json: pack '${n}' lists unknown skill '${s}'`); bad++; }
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 flat 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`.",
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>. `*` means any generator, and is legal only in a wrapper."
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-0026 / RFC-0029. Packs and outcomes are METADATA ONLY — skills never move out of flat skills/<name> folders. Packs answer WHO needs a skill; outcomes answer WHY someone opened the catalogue. Both get the same two-way membership check in validate.py.",
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": ["version", "packs", "outcomes"],
8
+ "required": ["description"],
9
9
  "properties": {
10
10
  "$comment": { "type": "string" },
11
- "version": { "type": "string" },
12
- "packs": {
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
- "description": "Role-based bundles. Keys are pack names.",
15
- "additionalProperties": {
16
- "type": "object",
17
- "additionalProperties": false,
18
- "required": ["description", "skills"],
19
- "properties": {
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
- "outcomes": {
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
- "description": "The catalogue's second browse axis. A browse aid only — never an install unit; the CLI takes no --outcome.",
31
- "additionalProperties": {
32
- "type": "object",
33
- "additionalProperties": false,
34
- "required": ["description", "skills"],
35
- "properties": {
36
- "description": { "type": "string", "description": "The chip's tooltip on the catalogue site." },
37
- "skills": { "type": "array", "items": { "type": "string" }, "minItems": 1 }
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.1",
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
- "skills/",
14
+ "packs/",
15
15
  "agents/",
16
- "loops/",
17
16
  "contracts/",
18
- "packs.json",
17
+ "catalogue.json",
19
18
  "model-routing.json"
20
19
  ],
21
20
  "engines": {