@pigcloud/skills 1.0.10 → 1.1.2

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 (298) hide show
  1. package/CHANGELOG.md +25 -20
  2. package/README.en.md +41 -75
  3. package/README.md +26 -39
  4. package/bin/cli.js +282 -188
  5. package/bin/rules-loader.js +271 -484
  6. package/codex-commands/README.md +25 -23
  7. package/codex-commands/commands/analyze.md +21 -22
  8. package/codex-commands/commands/build.md +22 -22
  9. package/codex-commands/commands/design.md +21 -22
  10. package/codex-commands/commands/distill.md +21 -21
  11. package/codex-commands/commands/doc.md +21 -22
  12. package/codex-commands/commands/infra.md +21 -21
  13. package/codex-commands/commands/init.md +20 -20
  14. package/codex-commands/commands/kb.md +21 -20
  15. package/codex-commands/commands/perf.md +21 -21
  16. package/codex-commands/commands/prd.md +21 -22
  17. package/codex-commands/commands/review.md +21 -22
  18. package/codex-commands/commands/security.md +21 -22
  19. package/codex-commands/commands/test.md +21 -21
  20. package/codex-commands/commands/workflow.md +21 -20
  21. package/package.json +5 -2
  22. package/rules/core/index.md +26 -41
  23. package/rules/delivery/index.md +25 -0
  24. package/rules/design/index.md +25 -0
  25. package/rules/discovery/index.md +25 -0
  26. package/rules/implementation/index.md +25 -0
  27. package/rules/index.md +24 -39
  28. package/rules/overlays/index.md +19 -19
  29. package/rules/overlays/pig-cloud.md +20 -45
  30. package/rules/shared/index.md +25 -0
  31. package/rules/skill-stage-map.json +26 -0
  32. package/rules/stages.json +48 -0
  33. package/rules/validation/index.md +25 -0
  34. package/scripts/add-skill-reference-nav.js +3 -0
  35. package/scripts/bootstrap-skill-specs.js +96 -0
  36. package/scripts/ci-validator.sh +51 -114
  37. package/scripts/generate-skill-prompt-library.js +3 -0
  38. package/scripts/golden-prompt-suite.current.js +211 -0
  39. package/scripts/migrate-skill-packages.js +309 -0
  40. package/scripts/run-golden-replays.js +110 -79
  41. package/scripts/validate-rules.js +128 -125
  42. package/scripts/validate-skill-replay-signals.js +45 -57
  43. package/scripts/validate-skill-shapes.js +153 -127
  44. package/scripts/validate-skill-stop-rules.js +54 -46
  45. package/skills/01-discovery/ambiguity-detection/SKILL.md +30 -0
  46. package/skills/01-discovery/ambiguity-detection/assets/golden-prompt-suite.current.js +22 -0
  47. package/skills/01-discovery/ambiguity-detection/references/README.md +17 -0
  48. package/skills/01-discovery/ambiguity-detection/references/cases.md +26 -0
  49. package/skills/01-discovery/ambiguity-detection/references/prompt-template.md +18 -0
  50. package/skills/01-discovery/ambiguity-detection/skill-spec.json +26 -0
  51. package/skills/01-discovery/business-analysis/SKILL.md +30 -0
  52. package/skills/01-discovery/business-analysis/assets/golden-prompt-suite.current.js +22 -0
  53. package/skills/01-discovery/business-analysis/references/README.md +17 -0
  54. package/skills/01-discovery/business-analysis/references/cases.md +26 -0
  55. package/skills/01-discovery/business-analysis/references/prompt-template.md +18 -0
  56. package/skills/01-discovery/business-analysis/skill-spec.json +26 -0
  57. package/skills/01-discovery/impact-analysis/SKILL.md +30 -0
  58. package/skills/01-discovery/impact-analysis/assets/golden-prompt-suite.current.js +22 -0
  59. package/skills/01-discovery/impact-analysis/references/README.md +17 -0
  60. package/skills/01-discovery/impact-analysis/references/cases.md +26 -0
  61. package/skills/01-discovery/impact-analysis/references/prompt-template.md +18 -0
  62. package/skills/01-discovery/impact-analysis/skill-spec.json +26 -0
  63. package/skills/01-discovery/requirement-discovery/SKILL.md +30 -0
  64. package/skills/01-discovery/requirement-discovery/assets/golden-prompt-suite.current.js +24 -0
  65. package/skills/01-discovery/requirement-discovery/references/README.md +17 -0
  66. package/skills/01-discovery/requirement-discovery/references/cases.md +28 -0
  67. package/skills/01-discovery/requirement-discovery/references/prompt-template.md +18 -0
  68. package/skills/01-discovery/requirement-discovery/skill-spec.json +26 -0
  69. package/skills/02-design/api-design/SKILL.md +29 -0
  70. package/skills/02-design/api-design/assets/golden-prompt-suite.current.js +22 -0
  71. package/skills/02-design/api-design/references/README.md +17 -0
  72. package/skills/02-design/api-design/references/cases.md +26 -0
  73. package/skills/02-design/api-design/references/prompt-template.md +18 -0
  74. package/skills/02-design/api-design/skill-spec.json +25 -0
  75. package/skills/02-design/architecture-design/SKILL.md +29 -0
  76. package/skills/02-design/architecture-design/assets/golden-prompt-suite.current.js +22 -0
  77. package/skills/02-design/architecture-design/references/README.md +17 -0
  78. package/skills/02-design/architecture-design/references/cases.md +26 -0
  79. package/skills/02-design/architecture-design/references/prompt-template.md +18 -0
  80. package/skills/02-design/architecture-design/skill-spec.json +25 -0
  81. package/skills/02-design/database-design/SKILL.md +29 -0
  82. package/skills/02-design/database-design/assets/golden-prompt-suite.current.js +22 -0
  83. package/skills/02-design/database-design/references/README.md +17 -0
  84. package/skills/02-design/database-design/references/cases.md +26 -0
  85. package/skills/02-design/database-design/references/prompt-template.md +18 -0
  86. package/skills/02-design/database-design/skill-spec.json +25 -0
  87. package/skills/02-design/task-breakdown/SKILL.md +29 -0
  88. package/skills/02-design/task-breakdown/assets/golden-prompt-suite.current.js +22 -0
  89. package/skills/02-design/task-breakdown/references/README.md +17 -0
  90. package/skills/02-design/task-breakdown/references/cases.md +26 -0
  91. package/skills/02-design/task-breakdown/references/prompt-template.md +18 -0
  92. package/skills/02-design/task-breakdown/skill-spec.json +25 -0
  93. package/skills/03-implementation/backend-development/SKILL.md +29 -0
  94. package/skills/03-implementation/backend-development/assets/golden-prompt-suite.current.js +22 -0
  95. package/skills/03-implementation/backend-development/references/README.md +17 -0
  96. package/skills/03-implementation/backend-development/references/cases.md +26 -0
  97. package/skills/03-implementation/backend-development/references/prompt-template.md +18 -0
  98. package/skills/03-implementation/backend-development/skill-spec.json +25 -0
  99. package/skills/03-implementation/bug-fix/SKILL.md +29 -0
  100. package/skills/03-implementation/bug-fix/assets/golden-prompt-suite.current.js +22 -0
  101. package/skills/03-implementation/bug-fix/references/README.md +17 -0
  102. package/skills/03-implementation/bug-fix/references/cases.md +26 -0
  103. package/skills/03-implementation/bug-fix/references/prompt-template.md +18 -0
  104. package/skills/03-implementation/bug-fix/skill-spec.json +25 -0
  105. package/skills/03-implementation/database-change/SKILL.md +29 -0
  106. package/skills/03-implementation/database-change/assets/golden-prompt-suite.current.js +22 -0
  107. package/skills/03-implementation/database-change/references/README.md +17 -0
  108. package/skills/03-implementation/database-change/references/cases.md +26 -0
  109. package/skills/03-implementation/database-change/references/prompt-template.md +18 -0
  110. package/skills/03-implementation/database-change/skill-spec.json +25 -0
  111. package/skills/03-implementation/frontend-development/SKILL.md +29 -0
  112. package/skills/03-implementation/frontend-development/assets/golden-prompt-suite.current.js +22 -0
  113. package/skills/03-implementation/frontend-development/references/README.md +17 -0
  114. package/skills/03-implementation/frontend-development/references/cases.md +26 -0
  115. package/skills/03-implementation/frontend-development/references/prompt-template.md +18 -0
  116. package/skills/03-implementation/frontend-development/skill-spec.json +25 -0
  117. package/skills/04-validation/code-review/SKILL.md +29 -0
  118. package/skills/04-validation/code-review/assets/golden-prompt-suite.current.js +22 -0
  119. package/skills/04-validation/code-review/references/README.md +17 -0
  120. package/skills/04-validation/code-review/references/cases.md +26 -0
  121. package/skills/04-validation/code-review/references/prompt-template.md +18 -0
  122. package/skills/04-validation/code-review/skill-spec.json +25 -0
  123. package/skills/04-validation/performance-review/SKILL.md +29 -0
  124. package/skills/04-validation/performance-review/assets/golden-prompt-suite.current.js +22 -0
  125. package/skills/04-validation/performance-review/references/README.md +17 -0
  126. package/skills/04-validation/performance-review/references/cases.md +26 -0
  127. package/skills/04-validation/performance-review/references/prompt-template.md +18 -0
  128. package/skills/04-validation/performance-review/skill-spec.json +25 -0
  129. package/skills/04-validation/regression-check/SKILL.md +29 -0
  130. package/skills/04-validation/regression-check/assets/golden-prompt-suite.current.js +22 -0
  131. package/skills/04-validation/regression-check/references/README.md +17 -0
  132. package/skills/04-validation/regression-check/references/cases.md +26 -0
  133. package/skills/04-validation/regression-check/references/prompt-template.md +18 -0
  134. package/skills/04-validation/regression-check/skill-spec.json +25 -0
  135. package/skills/04-validation/security-review/SKILL.md +29 -0
  136. package/skills/04-validation/security-review/assets/golden-prompt-suite.current.js +22 -0
  137. package/skills/04-validation/security-review/references/README.md +17 -0
  138. package/skills/04-validation/security-review/references/cases.md +26 -0
  139. package/skills/04-validation/security-review/references/prompt-template.md +18 -0
  140. package/skills/04-validation/security-review/skill-spec.json +25 -0
  141. package/skills/04-validation/unit-test/SKILL.md +29 -0
  142. package/skills/04-validation/unit-test/assets/golden-prompt-suite.current.js +22 -0
  143. package/skills/04-validation/unit-test/references/README.md +17 -0
  144. package/skills/04-validation/unit-test/references/cases.md +26 -0
  145. package/skills/04-validation/unit-test/references/prompt-template.md +18 -0
  146. package/skills/04-validation/unit-test/skill-spec.json +25 -0
  147. package/skills/05-delivery/change-log/SKILL.md +29 -0
  148. package/skills/05-delivery/change-log/assets/golden-prompt-suite.current.js +22 -0
  149. package/skills/05-delivery/change-log/references/README.md +17 -0
  150. package/skills/05-delivery/change-log/references/cases.md +26 -0
  151. package/skills/05-delivery/change-log/references/prompt-template.md +18 -0
  152. package/skills/05-delivery/change-log/skill-spec.json +25 -0
  153. package/skills/05-delivery/deployment-guide/SKILL.md +29 -0
  154. package/skills/05-delivery/deployment-guide/assets/golden-prompt-suite.current.js +22 -0
  155. package/skills/05-delivery/deployment-guide/references/README.md +17 -0
  156. package/skills/05-delivery/deployment-guide/references/cases.md +26 -0
  157. package/skills/05-delivery/deployment-guide/references/prompt-template.md +18 -0
  158. package/skills/05-delivery/deployment-guide/skill-spec.json +25 -0
  159. package/skills/05-delivery/release-check/SKILL.md +29 -0
  160. package/skills/05-delivery/release-check/assets/golden-prompt-suite.current.js +22 -0
  161. package/skills/05-delivery/release-check/references/README.md +17 -0
  162. package/skills/05-delivery/release-check/references/cases.md +26 -0
  163. package/skills/05-delivery/release-check/references/prompt-template.md +18 -0
  164. package/skills/05-delivery/release-check/skill-spec.json +25 -0
  165. package/skills/05-delivery/release-validation/SKILL.md +29 -0
  166. package/skills/05-delivery/release-validation/assets/golden-prompt-suite.current.js +22 -0
  167. package/skills/05-delivery/release-validation/references/README.md +17 -0
  168. package/skills/05-delivery/release-validation/references/cases.md +26 -0
  169. package/skills/05-delivery/release-validation/references/prompt-template.md +18 -0
  170. package/skills/05-delivery/release-validation/skill-spec.json +25 -0
  171. package/skills/shared/codebase-learning/SKILL.md +29 -0
  172. package/skills/shared/codebase-learning/assets/golden-prompt-suite.current.js +22 -0
  173. package/skills/shared/codebase-learning/references/README.md +17 -0
  174. package/skills/shared/codebase-learning/references/cases.md +26 -0
  175. package/skills/shared/codebase-learning/references/prompt-template.md +18 -0
  176. package/skills/shared/codebase-learning/skill-spec.json +25 -0
  177. package/skills/shared/evidence-collector/SKILL.md +29 -0
  178. package/skills/shared/evidence-collector/assets/golden-prompt-suite.current.js +22 -0
  179. package/skills/shared/evidence-collector/references/README.md +17 -0
  180. package/skills/shared/evidence-collector/references/cases.md +26 -0
  181. package/skills/shared/evidence-collector/references/prompt-template.md +18 -0
  182. package/skills/shared/evidence-collector/skill-spec.json +25 -0
  183. package/skills/shared/framework-guide/SKILL.md +28 -0
  184. package/skills/shared/framework-guide/assets/golden-prompt-suite.current.js +22 -0
  185. package/skills/shared/framework-guide/references/README.md +17 -0
  186. package/skills/shared/framework-guide/references/cases.md +26 -0
  187. package/skills/shared/framework-guide/references/prompt-template.md +18 -0
  188. package/skills/shared/framework-guide/skill-spec.json +24 -0
  189. package/rules/bundles.json +0 -358
  190. package/rules/coding/analysis.md +0 -27
  191. package/rules/coding/backend/cache-invalidation.md +0 -30
  192. package/rules/coding/backend/cache-keying.md +0 -30
  193. package/rules/coding/backend/cache.md +0 -37
  194. package/rules/coding/backend/database.md +0 -32
  195. package/rules/coding/backend/feign.md +0 -30
  196. package/rules/coding/backend/index.md +0 -42
  197. package/rules/coding/backend/query.md +0 -32
  198. package/rules/coding/backend/remote.md +0 -33
  199. package/rules/coding/backend/transaction-boundary.md +0 -30
  200. package/rules/coding/backend/transaction-rollback.md +0 -30
  201. package/rules/coding/backend/transaction.md +0 -38
  202. package/rules/coding/boundary.md +0 -25
  203. package/rules/coding/implementation.md +0 -26
  204. package/rules/coding/index.md +0 -38
  205. package/rules/coding/scaffold.md +0 -28
  206. package/rules/coding/testing.md +0 -29
  207. package/rules/coding/validation.md +0 -29
  208. package/rules/core/code-quality.md +0 -30
  209. package/rules/core/evidence.md +0 -26
  210. package/rules/core/interface.md +0 -26
  211. package/rules/core/iteration.md +0 -26
  212. package/rules/core/layer-boundary.md +0 -25
  213. package/rules/core/logging.md +0 -26
  214. package/rules/core/security.md +0 -26
  215. package/rules/core/task-boundary.md +0 -27
  216. package/rules/docs/api.md +0 -34
  217. package/rules/docs/capture-summary.md +0 -29
  218. package/rules/docs/capture.md +0 -34
  219. package/rules/docs/contract.md +0 -30
  220. package/rules/docs/decision-log.md +0 -32
  221. package/rules/docs/examples.md +0 -28
  222. package/rules/docs/index.md +0 -49
  223. package/rules/docs/reference.md +0 -32
  224. package/rules/overlays/pig-cloud/controller.md +0 -33
  225. package/rules/overlays/pig-cloud/dto-vo.md +0 -33
  226. package/rules/overlays/pig-cloud/entity.md +0 -32
  227. package/rules/overlays/pig-cloud/exception.md +0 -32
  228. package/rules/overlays/pig-cloud/layering.md +0 -31
  229. package/rules/overlays/pig-cloud/mapper.md +0 -32
  230. package/rules/overlays/pig-cloud/query-style.md +0 -32
  231. package/rules/overlays/pig-cloud/rest-response.md +0 -33
  232. package/rules/overlays/pig-cloud/service.md +0 -33
  233. package/rules/overlays/pig-cloud/transactions.md +0 -32
  234. package/rules/overlays/pig-cloud/validation.md +0 -33
  235. package/rules/product/acceptance.md +0 -25
  236. package/rules/product/briefing.md +0 -27
  237. package/rules/product/index.md +0 -36
  238. package/rules/product/intake.md +0 -27
  239. package/rules/product/modeling.md +0 -25
  240. package/rules/product/project-context.md +0 -29
  241. package/rules/review/code.md +0 -35
  242. package/rules/review/evidence.md +0 -31
  243. package/rules/review/index.md +0 -50
  244. package/rules/review/java.md +0 -42
  245. package/rules/review/performance.md +0 -38
  246. package/rules/review/rubric.md +0 -28
  247. package/rules/review/security.md +0 -38
  248. package/rules/review/ts.md +0 -33
  249. package/rules/review/vue.md +0 -33
  250. package/rules/skill-profile-map.json +0 -59
  251. package/rules/skill-profile-map.md +0 -29
  252. package/rules/workflow/handoff.md +0 -25
  253. package/rules/workflow/index.md +0 -37
  254. package/rules/workflow/refinement.md +0 -29
  255. package/rules/workflow/router.md +0 -25
  256. package/rules/workflow/selection.md +0 -25
  257. package/rules/workflow/stop.md +0 -25
  258. package/skills/api-contract-docs/SKILL.md +0 -77
  259. package/skills/business-fact-extraction/SKILL.md +0 -337
  260. package/skills/business-fact-extraction/scripts/write-knowledge-base.js +0 -228
  261. package/skills/code-review/SKILL.md +0 -136
  262. package/skills/code-review/references/findings-template.md +0 -51
  263. package/skills/code-review/references/performance-checklist.md +0 -213
  264. package/skills/code-review/references/rubric.md +0 -232
  265. package/skills/code-review/references/rules.md +0 -32
  266. package/skills/code-review/references/security-checklist.md +0 -178
  267. package/skills/code-review/references/stack-notes.md +0 -25
  268. package/skills/code-review/references/template-review.md +0 -39
  269. package/skills/code-review/scripts/lint-code-review.mjs +0 -431
  270. package/skills/domain-modeling/SKILL.md +0 -81
  271. package/skills/domain-modeling/references/README.md +0 -134
  272. package/skills/domain-modeling/references/distillation-checklist.md +0 -44
  273. package/skills/domain-modeling/references/test-cases-template.md +0 -128
  274. package/skills/environment-deploy/SKILL.md +0 -81
  275. package/skills/feature-build/SKILL.md +0 -122
  276. package/skills/feature-build/references/coding-checklist.md +0 -97
  277. package/skills/feature-build/references/comment-specification.md +0 -89
  278. package/skills/knowledge-capture/SKILL.md +0 -93
  279. package/skills/performance-audit/SKILL.md +0 -118
  280. package/skills/project-bootstrap/SKILL.md +0 -81
  281. package/skills/references/anti-rationalization.md +0 -144
  282. package/skills/references/business-fact-extraction.md +0 -415
  283. package/skills/references/engineering-delivery-method.md +0 -64
  284. package/skills/references/engineering-delivery-template.md +0 -81
  285. package/skills/references/golden-prompt-suite.js +0 -436
  286. package/skills/references/golden-prompt-suite.md +0 -33
  287. package/skills/references/project-requirement-alignment.md +0 -42
  288. package/skills/references/rule-loading-map.md +0 -117
  289. package/skills/references/skill-authoring-standard.md +0 -74
  290. package/skills/references/skill-boundary-template.md +0 -71
  291. package/skills/references/skill-enhanced-template.md +0 -103
  292. package/skills/references/skill-reference-matrix.md +0 -62
  293. package/skills/security-audit/SKILL.md +0 -119
  294. package/skills/spec-refinement/SKILL.md +0 -149
  295. package/skills/technical-design/SKILL.md +0 -106
  296. package/skills/technical-design/references/solid-checklist.md +0 -199
  297. package/skills/test-design/SKILL.md +0 -92
  298. package/skills/workflow-router/SKILL.md +0 -86
@@ -3,133 +3,159 @@
3
3
  const fs = require('fs');
4
4
  const path = require('path');
5
5
 
6
- const repoRoot = path.join(__dirname, '..');
7
- const skillsRoot = path.join(repoRoot, 'skills');
8
- const enhancedTemplateSkills = new Set([
9
- 'spec-refinement',
10
- 'technical-design',
11
- 'feature-build',
12
- 'code-review',
13
- 'security-audit',
14
- 'performance-audit',
15
- 'business-fact-extraction',
16
- ]);
17
- const enhancedSections = [
18
- '## Quick Start',
19
- '## Inputs / Outputs',
20
- '## Gotchas',
21
- ];
22
- const shortTemplateSections = [
23
- '## Quick Start',
24
- '## Inputs / Outputs',
25
- '## Gotchas',
26
- ];
27
-
28
- function readSkillDirectories() {
29
- return fs.readdirSync(skillsRoot, { withFileTypes: true })
30
- .filter((entry) => entry.isDirectory() && entry.name !== 'references')
31
- .map((entry) => entry.name)
32
- .sort();
33
- }
34
-
35
- function readSkillFile(skillName) {
36
- return fs.readFileSync(path.join(skillsRoot, skillName, 'SKILL.md'), 'utf8');
37
- }
38
-
39
- function extractFrontmatter(content) {
40
- const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
41
- return match ? match[1] : '';
42
- }
43
-
44
- function extractHeadings(content) {
45
- return content
46
- .split(/\r?\n/)
47
- .map((line) => line.trim())
48
- .filter((line) => /^##\s+/.test(line))
49
- .map((line) => line);
50
- }
51
-
52
- function assert(condition, message) {
53
- if (!condition) {
54
- throw new Error(message);
55
- }
56
- }
57
-
58
- function ensureFrontmatterKeys(skillName, frontmatter) {
59
- const requiredKeys = [
60
- 'name:',
61
- 'description:',
62
- 'lifecycle_stage:',
63
- 'dependencies:',
64
- 'triggers:',
65
- 'inputs:',
66
- 'outputs:',
67
- 'workflow:',
68
- 'gates:',
69
- 'refs:',
70
- 'rule_profile:',
71
- ];
72
-
73
- for (const key of requiredKeys) {
74
- assert(frontmatter.includes(key), `${skillName}: missing frontmatter key ${key}`);
75
- }
76
- }
77
-
78
- function ensureSectionOrder(skillName, headings, requiredOrder) {
79
- let lastIndex = -1;
80
- for (const section of requiredOrder) {
81
- const index = headings.indexOf(section);
82
- assert(index >= 0, `${skillName}: missing section ${section}`);
83
- assert(index > lastIndex, `${skillName}: section order is invalid around ${section}`);
84
- lastIndex = index;
85
- }
86
- }
87
-
88
- function validateSkill(skillName) {
89
- const content = readSkillFile(skillName);
90
- const frontmatter = extractFrontmatter(content);
91
- assert(frontmatter, `${skillName}: missing frontmatter`);
92
- ensureFrontmatterKeys(skillName, frontmatter);
93
-
94
- const headings = extractHeadings(content);
95
- const requiredOrder = enhancedTemplateSkills.has(skillName)
96
- ? [
97
- '## Purpose',
98
- '## Suitable / Unsuitable',
99
- '## Quick Start',
100
- '## Inputs / Outputs',
101
- '## Workflow',
102
- '## Replay Signals',
103
- '## Gotchas',
104
- '## Stop Rules',
105
- '## References',
106
- ]
107
- : [
108
- '## Purpose',
109
- '## Suitable / Unsuitable',
110
- '## Workflow',
111
- '## Replay Signals',
112
- '## Stop Rules',
113
- '## References',
114
- ];
115
-
116
- ensureSectionOrder(skillName, headings, requiredOrder);
117
-
118
- if (enhancedTemplateSkills.has(skillName)) {
119
- for (const section of enhancedSections) {
120
- assert(headings.includes(section), `${skillName}: missing enhanced section ${section}`);
121
- }
122
- } else {
123
- for (const section of shortTemplateSections) {
124
- assert(!headings.includes(section), `${skillName}: short template should not include ${section}`);
125
- }
126
- }
127
- }
128
-
129
- function main() {
130
- for (const skillName of readSkillDirectories()) {
131
- validateSkill(skillName);
132
- }
6
+ const repoRoot = path.join(__dirname, '..');
7
+ const skillsRoot = path.join(repoRoot, 'skills');
8
+
9
+ function readSkillDirectories() {
10
+ const results = [];
11
+
12
+ function walk(dir) {
13
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
14
+ if (entry.name === 'references') {
15
+ continue;
16
+ }
17
+
18
+ const fullPath = path.join(dir, entry.name);
19
+ if (entry.isDirectory()) {
20
+ const skillFile = path.join(fullPath, 'SKILL.md');
21
+ if (fs.existsSync(skillFile)) {
22
+ results.push(fullPath);
23
+ }
24
+ walk(fullPath);
25
+ }
26
+ }
27
+ }
28
+
29
+ walk(skillsRoot);
30
+ return results.sort();
31
+ }
32
+
33
+ function readSkillFile(skillDir) {
34
+ return fs.readFileSync(path.join(skillDir, 'SKILL.md'), 'utf8');
35
+ }
36
+
37
+ function extractFrontmatter(content) {
38
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
39
+ return match ? match[1] : '';
40
+ }
41
+
42
+ function extractHeadings(content) {
43
+ return content
44
+ .split(/\r?\n/)
45
+ .map((line) => line.trim())
46
+ .filter((line) => /^##\s+/.test(line));
47
+ }
48
+
49
+ function extractSectionItems(content, sectionName) {
50
+ const lines = content.split(/\r?\n/);
51
+ const items = [];
52
+ let inSection = false;
53
+
54
+ for (const rawLine of lines) {
55
+ const line = rawLine.trim();
56
+ if (!inSection) {
57
+ if (line === `## ${sectionName}`) {
58
+ inSection = true;
59
+ }
60
+ continue;
61
+ }
62
+
63
+ if (line.startsWith('## ')) {
64
+ break;
65
+ }
66
+
67
+ if (line.startsWith('- ')) {
68
+ items.push(line.slice(2).trim());
69
+ }
70
+ }
71
+
72
+ return items;
73
+ }
74
+
75
+ function assert(condition, message) {
76
+ if (!condition) {
77
+ throw new Error(message);
78
+ }
79
+ }
80
+
81
+ function parseFrontmatter(frontmatter) {
82
+ const entries = [];
83
+ for (const line of frontmatter.split(/\r?\n/)) {
84
+ const trimmed = line.trim();
85
+ if (!trimmed || trimmed.startsWith('#')) {
86
+ continue;
87
+ }
88
+
89
+ const match = trimmed.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
90
+ if (match) {
91
+ entries.push({ key: match[1], value: match[2] });
92
+ }
93
+ }
94
+
95
+ return entries;
96
+ }
97
+
98
+ function extractBody(content) {
99
+ const match = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?([\s\S]*)$/);
100
+ return match ? match[1] : '';
101
+ }
102
+
103
+ function validateSkill(skillDir) {
104
+ const skillName = path.basename(skillDir);
105
+ const specPath = path.join(skillDir, 'skill-spec.json');
106
+ const content = readSkillFile(skillDir);
107
+ assert(fs.existsSync(specPath), `${skillName}: missing skill-spec.json`);
108
+ const spec = JSON.parse(fs.readFileSync(specPath, 'utf8'));
109
+ const frontmatter = extractFrontmatter(content);
110
+ assert(frontmatter, `${skillName}: missing frontmatter`);
111
+ const entries = parseFrontmatter(frontmatter);
112
+ const keys = entries.map((entry) => entry.key);
113
+ assert(keys.includes('name'), `${skillName}: missing frontmatter key name`);
114
+ assert(keys.includes('description'), `${skillName}: missing frontmatter key description`);
115
+
116
+ const allowedKeys = new Set(['name', 'description']);
117
+ const extraKeys = entries.filter((entry) => !allowedKeys.has(entry.key));
118
+ assert(extraKeys.length === 0, `${skillName}: unexpected frontmatter keys: ${extraKeys.map((entry) => entry.key).join(', ')}`);
119
+
120
+ const body = extractBody(content).trim();
121
+ assert(body.length > 0, `${skillName}: skill body is missing`);
122
+ assert(spec.name === skillName, `${skillName}: skill-spec.json name mismatch`);
123
+ assert(spec.description === entries.find((entry) => entry.key === 'description')?.value, `${skillName}: skill-spec.json description mismatch`);
124
+ assert(Array.isArray(spec.whenToUse) && spec.whenToUse.length >= 2, `${skillName}: skill-spec.json whenToUse too short`);
125
+ assert(Array.isArray(spec.how) && spec.how.length >= 3, `${skillName}: skill-spec.json how too short`);
126
+ assert(Array.isArray(spec.whenToAvoid) && spec.whenToAvoid.length >= 2, `${skillName}: skill-spec.json whenToAvoid too short`);
127
+ assert(typeof spec.purpose === 'string' && spec.purpose.length > 0, `${skillName}: skill-spec.json purpose missing`);
128
+
129
+ const headings = extractHeadings(body);
130
+ const expectedOrder = ['## Purpose', '## When to Use', '## How', '## When to Avoid'];
131
+ let lastIndex = -1;
132
+ for (const section of expectedOrder) {
133
+ const index = headings.indexOf(section);
134
+ assert(index >= 0, `${skillName}: missing section ${section}`);
135
+ assert(index > lastIndex, `${skillName}: section order is invalid around ${section}`);
136
+ lastIndex = index;
137
+ }
138
+
139
+ for (const heading of headings) {
140
+ assert(expectedOrder.includes(heading), `${skillName}: unexpected section ${heading}`);
141
+ }
142
+
143
+ assert(extractSectionItems(body, 'When to Use').length >= 2, `${skillName}: When to Use needs at least 2 bullets`);
144
+ assert(extractSectionItems(body, 'How').length >= 3, `${skillName}: How needs at least 3 bullets`);
145
+ assert(extractSectionItems(body, 'When to Avoid').length >= 2, `${skillName}: When to Avoid needs at least 2 bullets`);
146
+ const referencesDir = path.join(skillDir, 'references');
147
+ const assetsDir = path.join(skillDir, 'assets');
148
+ assert(fs.existsSync(path.join(referencesDir, 'README.md')), `${skillName}: missing local references README file`);
149
+ assert(fs.existsSync(path.join(referencesDir, 'prompt-template.md')), `${skillName}: missing local prompt template file`);
150
+ assert(fs.existsSync(path.join(referencesDir, 'cases.md')), `${skillName}: missing local replay cases file`);
151
+ assert(fs.existsSync(path.join(assetsDir, 'golden-prompt-suite.current.js')), `${skillName}: missing local replay asset file`);
152
+ }
153
+
154
+ function main() {
155
+ assert(!fs.existsSync(path.join(skillsRoot, 'references')), 'legacy skills/references directory should not exist');
156
+ for (const skillDir of readSkillDirectories()) {
157
+ validateSkill(skillDir);
158
+ }
133
159
 
134
160
  console.log('=== Skill shape validation complete ===');
135
161
  }
@@ -6,17 +6,34 @@ const path = require('path');
6
6
  const repoRoot = path.join(__dirname, '..');
7
7
  const skillsRoot = path.join(repoRoot, 'skills');
8
8
 
9
- function readSkillDirectories() {
10
- return fs.readdirSync(skillsRoot, { withFileTypes: true })
11
- .filter((entry) => entry.isDirectory() && entry.name !== 'references')
12
- .map((entry) => entry.name)
13
- .sort();
14
- }
15
-
16
- function readSkillFile(skillName) {
17
- const skillFile = path.join(skillsRoot, skillName, 'SKILL.md');
18
- return fs.readFileSync(skillFile, 'utf8');
19
- }
9
+ function readSkillDirectories() {
10
+ const results = [];
11
+
12
+ function walk(dir) {
13
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
14
+ if (entry.name === 'references') {
15
+ continue;
16
+ }
17
+
18
+ const fullPath = path.join(dir, entry.name);
19
+ if (entry.isDirectory()) {
20
+ const skillFile = path.join(fullPath, 'SKILL.md');
21
+ if (fs.existsSync(skillFile)) {
22
+ results.push(fullPath);
23
+ }
24
+ walk(fullPath);
25
+ }
26
+ }
27
+ }
28
+
29
+ walk(skillsRoot);
30
+ return results.sort();
31
+ }
32
+
33
+ function readSkillFile(skillDir) {
34
+ const skillFile = path.join(skillDir, 'SKILL.md');
35
+ return fs.readFileSync(skillFile, 'utf8');
36
+ }
20
37
 
21
38
  function extractFrontmatter(content) {
22
39
  const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
@@ -92,41 +109,32 @@ function hasMatchingRule(gate, stopRules) {
92
109
  });
93
110
  }
94
111
 
95
- function validateSkill(skillName) {
96
- const content = readSkillFile(skillName);
97
- const frontmatter = extractFrontmatter(content);
98
- if (!frontmatter) {
99
- throw new Error(`${skillName}: missing frontmatter`);
100
- }
101
-
102
- const gates = extractSectionList(frontmatter, 'gates');
103
- const stopRules = extractStopRules(content);
104
-
105
- if (!gates.length) {
106
- throw new Error(`${skillName}: missing gates`);
107
- }
108
-
109
- if (!stopRules.length) {
110
- throw new Error(`${skillName}: missing Stop Rules section`);
111
- }
112
-
113
- const missing = gates.filter((gate) => !hasMatchingRule(gate, stopRules));
114
- if (missing.length > 0) {
115
- throw new Error(`${skillName}: stop rules do not cover gates: ${missing.join(' | ')}`);
116
- }
117
-
118
- return {
119
- skillName,
120
- gates,
121
- stopRules,
122
- };
123
- }
124
-
125
- function main() {
126
- const skills = readSkillDirectories();
127
- for (const skillName of skills) {
128
- validateSkill(skillName);
129
- }
112
+ function validateSkill(skillDir) {
113
+ const skillName = path.basename(skillDir);
114
+ const content = readSkillFile(skillDir);
115
+ const frontmatter = extractFrontmatter(content);
116
+ if (!frontmatter) {
117
+ throw new Error(`${skillName}: missing frontmatter`);
118
+ }
119
+
120
+ const body = content.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '');
121
+ if (!/##\s+When to Avoid/.test(body)) {
122
+ throw new Error(`${skillName}: missing When to Avoid section`);
123
+ }
124
+
125
+ const stopRules = extractStopRules(content);
126
+ if (stopRules.length > 0) {
127
+ throw new Error(`${skillName}: Stop Rules section should be removed`);
128
+ }
129
+
130
+ return { skillName };
131
+ }
132
+
133
+ function main() {
134
+ const skills = readSkillDirectories();
135
+ for (const skillDir of skills) {
136
+ validateSkill(skillDir);
137
+ }
130
138
 
131
139
  console.log(`=== Stop rule validation complete for ${skills.length} skills ===`);
132
140
  }
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: ambiguity-detection
3
+ description: Surface blockers, contradictions, and missing decisions before the work moves forward.
4
+ ---
5
+
6
+ # Ambiguity Detection
7
+
8
+ ## Purpose
9
+
10
+ Find blockers that prevent the next stage from being safe or deterministic.
11
+
12
+ ## When to Use
13
+
14
+ - The input contains conflicting or underspecified statements.
15
+ - You need to surface risks before committing to a plan.
16
+ - The same phrase could reasonably mean more than one thing.
17
+
18
+ ## How
19
+
20
+ - Separate facts, assumptions, conflicts, and missing decisions before the work moves forward.
21
+ - Name each ambiguity, the decision it blocks, and the question that removes it.
22
+ - Classify each item as blocker, risk, or open question.
23
+ - Turn every assumption into an explicit decision or an explicit unknown.
24
+ - Stop after the blocker list is complete; do not resolve conflicts without evidence.
25
+
26
+ ## When to Avoid
27
+
28
+ - The request is already routeable and only needs design work.
29
+ - The input is already clear enough for implementation.
30
+ - You only need wording cleanup or formatting.
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ module.exports = {
4
+ "name": "ambiguity-detection.golden-prompt-suite.current",
5
+ "skill": "ambiguity-detection",
6
+ "description": "Surface blockers, contradictions, and missing decisions before the work moves forward.",
7
+ "cases": [
8
+ {
9
+ "id": "ambiguity-conflict-scan",
10
+ "prompt": "This request may contain contradictions or hidden assumptions. Find them.",
11
+ "expectedFirstSkill": "ambiguity-detection",
12
+ "expectedOutput": [
13
+ "blockers",
14
+ "conflicts",
15
+ "missing decisions"
16
+ ],
17
+ "expectedStop": "Do not resolve conflicts without evidence.",
18
+ "expectedHandoff": "impact-analysis"
19
+ }
20
+ ]
21
+ };
22
+
@@ -0,0 +1,17 @@
1
+ # ambiguity-detection References
2
+
3
+ This directory is local to the skill and is the only reference entry point for this skill.
4
+
5
+ ## Contents
6
+
7
+ - `../skill-spec.json`: design source for regenerating this skill
8
+ - `prompt-template.md`: reusable prompt wording for this skill
9
+ - `cases.md`: human-readable replay case for this skill
10
+ - `../assets/golden-prompt-suite.current.js`: machine-readable local case fixture
11
+
12
+ ## Guidance
13
+
14
+ - Keep skill-specific explanation here instead of pushing it into a stage-level shared library.
15
+ - Keep shared hard constraints in `../../../rules/index.md`.
16
+ - Keep canonical names unchanged.
17
+ - Skill summary: Surface blockers, contradictions, and missing decisions before the work moves forward.
@@ -0,0 +1,26 @@
1
+ # ambiguity-detection
2
+
3
+ ## Replay Case
4
+
5
+ - Case: `ambiguity-conflict-scan`
6
+ - First skill: `ambiguity-detection`
7
+
8
+ ### Prompt
9
+
10
+ ```text
11
+ This request may contain contradictions or hidden assumptions. Find them.
12
+ ```
13
+
14
+ ### Expected Output
15
+
16
+ - blockers
17
+ - conflicts
18
+ - missing decisions
19
+
20
+ ### Stop Rule
21
+
22
+ - Do not resolve conflicts without evidence.
23
+
24
+ ### Handoff
25
+
26
+ - impact-analysis
@@ -0,0 +1,18 @@
1
+ # ambiguity-detection
2
+
3
+ ## Prompt Template
4
+
5
+ ```text
6
+ You are handling the ambiguity-detection skill.
7
+ Goal: Surface blockers, contradictions, and missing decisions before the work moves forward
8
+ Inputs: the request, supporting evidence, constraints, and existing repository facts.
9
+ Output contract: blockers, conflicts, missing decisions.
10
+ Stop rule: Do not resolve conflicts without evidence.
11
+ Handoff: impact-analysis.
12
+ Keep the response scoped to this stage and do not absorb the work of the next stage.
13
+ ```
14
+
15
+ ## Notes
16
+
17
+ - Keep the template aligned with the local replay case and local assets.
18
+ - Read `cases.md` for the matching replay example.
@@ -0,0 +1,26 @@
1
+ {
2
+ "group": "01-discovery",
3
+ "name": "ambiguity-detection",
4
+ "description": "Surface blockers, contradictions, and missing decisions before the work moves forward.",
5
+ "title": "Ambiguity Detection",
6
+ "purpose": "Find blockers that prevent the next stage from being safe or deterministic.",
7
+ "whenToUse": [
8
+ "The input contains conflicting or underspecified statements.",
9
+ "You need to surface risks before committing to a plan.",
10
+ "The same phrase could reasonably mean more than one thing."
11
+ ],
12
+ "how": [
13
+ "Separate facts, assumptions, conflicts, and missing decisions before the work moves forward.",
14
+ "Name each ambiguity, the decision it blocks, and the question that removes it.",
15
+ "Classify each item as blocker, risk, or open question.",
16
+ "Turn every assumption into an explicit decision or an explicit unknown.",
17
+ "Stop after the blocker list is complete; do not resolve conflicts without evidence."
18
+ ],
19
+ "whenToAvoid": [
20
+ "The request is already routeable and only needs design work.",
21
+ "The input is already clear enough for implementation.",
22
+ "You only need wording cleanup or formatting."
23
+ ],
24
+ "caseId": "ambiguity-conflict-scan",
25
+ "source": "bootstrap-from-skill-md"
26
+ }
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: business-analysis
3
+ description: Normalize business terms, ownership, and rules into a reusable glossary.
4
+ ---
5
+
6
+ # Business Analysis
7
+
8
+ ## Purpose
9
+
10
+ Normalize business language into stable terms, ownership boundaries, and decision rules.
11
+
12
+ ## When to Use
13
+
14
+ - The business logic is unclear.
15
+ - You need to define terms, rules, workflows, or ownership boundaries.
16
+ - Different stakeholders are using different words for the same thing.
17
+
18
+ ## How
19
+
20
+ - Extract canonical terms, then define each term in one sentence.
21
+ - Map each term to owner, scope, rule, exception, and evidence.
22
+ - Separate user intent, business behavior, and implementation detail.
23
+ - Capture success conditions, exclusions, and exceptions, not just the happy path.
24
+ - Stop once later stages can reuse the glossary and business rules without re-interpretation.
25
+
26
+ ## When to Avoid
27
+
28
+ - The glossary and business rules are already stable.
29
+ - The request is already technical and needs impact or design work.
30
+ - You only need wording cleanup or formatting.
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ module.exports = {
4
+ "name": "business-analysis.golden-prompt-suite.current",
5
+ "skill": "business-analysis",
6
+ "description": "Normalize business terms, ownership, and rules into a reusable glossary.",
7
+ "cases": [
8
+ {
9
+ "id": "analysis-business-terms",
10
+ "prompt": "This is a business description. Extract the business goal, terms, and boundaries.",
11
+ "expectedFirstSkill": "business-analysis",
12
+ "expectedOutput": [
13
+ "glossary",
14
+ "business rules",
15
+ "ownership boundaries"
16
+ ],
17
+ "expectedStop": "Do not decide design or implementation details.",
18
+ "expectedHandoff": "ambiguity-detection"
19
+ }
20
+ ]
21
+ };
22
+
@@ -0,0 +1,17 @@
1
+ # business-analysis References
2
+
3
+ This directory is local to the skill and is the only reference entry point for this skill.
4
+
5
+ ## Contents
6
+
7
+ - `../skill-spec.json`: design source for regenerating this skill
8
+ - `prompt-template.md`: reusable prompt wording for this skill
9
+ - `cases.md`: human-readable replay case for this skill
10
+ - `../assets/golden-prompt-suite.current.js`: machine-readable local case fixture
11
+
12
+ ## Guidance
13
+
14
+ - Keep skill-specific explanation here instead of pushing it into a stage-level shared library.
15
+ - Keep shared hard constraints in `../../../rules/index.md`.
16
+ - Keep canonical names unchanged.
17
+ - Skill summary: Normalize business terms, ownership, and rules into a reusable glossary.
@@ -0,0 +1,26 @@
1
+ # business-analysis
2
+
3
+ ## Replay Case
4
+
5
+ - Case: `analysis-business-terms`
6
+ - First skill: `business-analysis`
7
+
8
+ ### Prompt
9
+
10
+ ```text
11
+ This is a business description. Extract the business goal, terms, and boundaries.
12
+ ```
13
+
14
+ ### Expected Output
15
+
16
+ - glossary
17
+ - business rules
18
+ - ownership boundaries
19
+
20
+ ### Stop Rule
21
+
22
+ - Do not decide design or implementation details.
23
+
24
+ ### Handoff
25
+
26
+ - ambiguity-detection