@pigcloud/skills 1.0.11 → 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 +260 -151
  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
@@ -1,114 +1,51 @@
1
- #!/bin/bash
2
- # ci-validator.sh - Skills CI 楠岃瘉鑴氭湰
3
- # 鐢ㄤ簬楠岃瘉鎶€鑳芥枃浠剁殑瀹屾暣鎬у拰瑙勮寖鎬?
4
-
5
- set -e
6
-
7
- echo "=== Skills CI Validator ==="
8
-
9
- # 1. 妫€鏌ユ妧鑳芥枃浠跺畬鏁存€?
10
- echo "[1/5] Checking skill files..."
11
- SKILLS_DIR="${SKILLS_DIR:-.trae/skills}"
12
- ERROR_COUNT=0
13
-
14
- for skill in $(find "$SKILLS_DIR" -name "SKILL.md" -type f); do
15
- skill_name=$(basename $(dirname "$skill"))
16
-
17
- # 妫€鏌?frontmatter
18
- if ! grep -q "^name:" "$skill"; then
19
- echo "ERROR: Missing 'name' in $skill"
20
- ERROR_COUNT=$((ERROR_COUNT + 1))
21
- fi
22
- if ! grep -q "^description:" "$skill"; then
23
- echo "ERROR: Missing 'description' in $skill"
24
- ERROR_COUNT=$((ERROR_COUNT + 1))
25
- fi
26
- if ! grep -q "^lifecycle_stage:" "$skill"; then
27
- echo "WARN: Missing 'lifecycle_stage' in $skill"
28
- fi
29
- if ! grep -q "^version:" "$skill"; then
30
- echo "WARN: Missing 'version' in $skill"
31
- fi
32
-
33
- # 妫€鏌ュ繀瑕佺珷鑺?
34
- for section in "When to Run" "Workflow"; do
35
- if ! grep -q "## $section" "$skill"; then
36
- echo "ERROR: Missing '$section' section in $skill"
37
- ERROR_COUNT=$((ERROR_COUNT + 1))
38
- fi
39
- done
40
-
41
- # 妫€鏌?Lifecycle Position锛堟柊澧烇級
42
- if ! grep -q "## Lifecycle Position" "$skill"; then
43
- echo "WARN: Missing 'Lifecycle Position' in $skill (recommended)"
44
- fi
45
-
46
- echo "鉁?$skill_name valid"
47
- done
48
-
49
- if [ "$ERROR_COUNT" -gt 0 ]; then
50
- echo "ERROR: $ERROR_COUNT errors found in skill files"
51
- exit 1
52
- fi
53
- echo "鉁?Skill files valid"
54
-
55
- # 2. 妫€鏌ョ敓鍛藉懆鏈熸槧灏勫畬鏁存€?
56
- echo "[2/5] Checking lifecycle mapping..."
57
- LIFECYCLE_STAGES="define plan build verify review ship meta"
58
- for stage in $LIFECYCLE_STAGES; do
59
- count=$(grep -l "lifecycle_stage: \"$stage\"" $(find "$SKILLS_DIR" -name "SKILL.md" -type f) 2>/dev/null | wc -l || echo "0")
60
- if [ "$count" -eq 0 ] && [ "$stage" != "meta" ]; then
61
- echo "WARN: No skill mapped to '$stage' stage"
62
- else
63
- echo "鉁?$stage stage has $count skills"
64
- fi
65
- done
66
-
67
- # 3. 妫€鏌ユ妧鑳介棿渚濊禆涓€鑷存€?
68
- echo "[3/5] Checking skill dependencies..."
69
- for skill in $(find "$SKILLS_DIR" -name "SKILL.md" -type f); do
70
- deps=$(grep "^dependencies:" "$skill" | sed 's/dependencies: //' | tr ',' ' ' 2>/dev/null || echo "")
71
- for dep in $deps; do
72
- dep_name=$(echo "$dep" | tr -d '[]"')
73
- if [ -n "$dep_name" ] && [ ! -d "$SKILLS_DIR/$dep_name" ]; then
74
- echo "ERROR: Dependency '$dep_name' not found for $(basename $(dirname "$skill"))"
75
- ERROR_COUNT=$((ERROR_COUNT + 1))
76
- fi
77
- done
78
- done
79
-
80
- if [ "$ERROR_COUNT" -gt 0 ]; then
81
- echo "ERROR: Dependency errors found"
82
- exit 1
83
- fi
84
- echo "鉁?Dependencies valid"
85
-
86
- # 4. 妫€鏌?Reference Checklists
87
- echo "[4/5] Checking reference checklists..."
88
- REQUIRED_CHECKLISTS="coding-checklist.md solid-checklist.md security-checklist.md performance-auditlist.md anti-rationalization.md"
89
- for checklist in $REQUIRED_CHECKLISTS; do
90
- found=$(find "$SKILLS_DIR" -name "$checklist" -type f | wc -l)
91
- if [ "$found" -eq 0 ]; then
92
- echo "WARN: Missing reference checklist '$checklist'"
93
- else
94
- echo "鉁?Found $checklist"
95
- fi
96
- done
97
-
98
- # 5. 妫€鏌?Agent Personas 鍜?Slash Commands
99
- echo "[5/5] Checking agent personas and slash commands..."
100
- if [ ! -f "$SKILLS_DIR/../references/agent-personas.md" ]; then
101
- echo "WARN: Missing agent-personas.md"
102
- else
103
- echo "鉁?Found agent-personas.md"
104
- fi
105
-
106
- if [ ! -f "$SKILLS_DIR/../references/slash-commands.md" ]; then
107
- echo "WARN: Missing slash-commands.md"
108
- else
109
- echo "鉁?Found slash-commands.md"
110
- fi
111
-
112
- echo "=== CI Validator Complete ==="
113
- echo "All checks passed!"
114
- exit 0
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ echo "=== Skills CI Validator ==="
6
+
7
+ SKILLS_DIR="${SKILLS_DIR:-skills}"
8
+ ERROR_COUNT=0
9
+
10
+ echo "[1/3] Checking minimal skill contract..."
11
+ for skill in $(find "$SKILLS_DIR" -name "SKILL.md" -type f); do
12
+ if ! grep -q "^name:" "$skill"; then
13
+ echo "ERROR: Missing 'name' in $skill"
14
+ ERROR_COUNT=$((ERROR_COUNT + 1))
15
+ fi
16
+ if ! grep -q "^description:" "$skill"; then
17
+ echo "ERROR: Missing 'description' in $skill"
18
+ ERROR_COUNT=$((ERROR_COUNT + 1))
19
+ fi
20
+
21
+ if grep -q "^lifecycle_stage:" "$skill" || grep -q "^rule_profile:" "$skill" || grep -q "^dependencies:" "$skill" || grep -q "^triggers:" "$skill" || grep -q "^inputs:" "$skill" || grep -q "^outputs:" "$skill" || grep -q "^workflow:" "$skill" || grep -q "^gates:" "$skill" || grep -q "^refs:" "$skill"; then
22
+ echo "ERROR: Legacy metadata found in $skill"
23
+ ERROR_COUNT=$((ERROR_COUNT + 1))
24
+ fi
25
+ done
26
+
27
+ if [ "$ERROR_COUNT" -gt 0 ]; then
28
+ echo "ERROR: $ERROR_COUNT error(s) found in skill files"
29
+ exit 1
30
+ fi
31
+
32
+ echo "[2/3] Checking canonical mappings..."
33
+ if [ ! -f "$SKILLS_DIR/../rules/stages.json" ]; then
34
+ echo "ERROR: Missing rules/stages.json"
35
+ exit 1
36
+ fi
37
+ if [ ! -f "$SKILLS_DIR/../rules/skill-stage-map.json" ]; then
38
+ echo "ERROR: Missing rules/skill-stage-map.json"
39
+ exit 1
40
+ fi
41
+
42
+ echo "[3/3] Checking reference docs..."
43
+ for file in "$SKILLS_DIR/../rules/index.md" "$SKILLS_DIR/../docs/skill-system-target.md"; do
44
+ if [ ! -f "$file" ]; then
45
+ echo "ERROR: Missing $file"
46
+ exit 1
47
+ fi
48
+ done
49
+
50
+ echo "=== CI Validator Complete ==="
51
+ echo "All checks passed!"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('./migrate-skill-packages');
@@ -0,0 +1,211 @@
1
+ function makeCase(skill, id, prompt, expectedOutput, expectedStop, expectedHandoff) {
2
+ return {
3
+ id,
4
+ prompt,
5
+ expectedFirstSkill: skill,
6
+ expectedOutput,
7
+ expectedStop,
8
+ expectedHandoff,
9
+ };
10
+ }
11
+
12
+ const cases = [
13
+ makeCase(
14
+ 'requirement-discovery',
15
+ 'discovery-clarify-scope',
16
+ 'This request is still vague. Clarify the goal, success target, and missing facts first.',
17
+ ['problem statement', 'success target', 'unknowns', 'constraints', 'routing recommendation'],
18
+ 'Do not jump into design or code; stop once the request is routeable.',
19
+ 'business-analysis or ambiguity-detection',
20
+ ),
21
+ makeCase(
22
+ 'business-analysis',
23
+ 'analysis-business-terms',
24
+ 'This is a business description. Extract the business goal, terms, and boundaries.',
25
+ ['glossary', 'business rules', 'ownership boundaries'],
26
+ 'Do not decide design or implementation details.',
27
+ 'ambiguity-detection',
28
+ ),
29
+ makeCase(
30
+ 'ambiguity-detection',
31
+ 'ambiguity-conflict-scan',
32
+ 'This request may contain contradictions or hidden assumptions. Find them.',
33
+ ['blockers', 'conflicts', 'missing decisions'],
34
+ 'Do not resolve conflicts without evidence.',
35
+ 'impact-analysis',
36
+ ),
37
+ makeCase(
38
+ 'impact-analysis',
39
+ 'impact-existing-system',
40
+ 'This change may affect an existing system. Map the impact surface.',
41
+ ['impact map', 'validation surfaces', 'release risks'],
42
+ 'Do not write implementation.',
43
+ 'architecture-design',
44
+ ),
45
+ makeCase(
46
+ 'architecture-design',
47
+ 'architecture-multi-module',
48
+ 'This request affects multiple modules. Design the boundaries and tradeoffs.',
49
+ ['architecture decisions', 'boundaries', 'tradeoffs'],
50
+ 'Do not write production code yet.',
51
+ 'api-design',
52
+ ),
53
+ makeCase(
54
+ 'api-design',
55
+ 'api-contract-new-endpoint',
56
+ 'Define a new API endpoint. Design the request, response, and compatibility rules.',
57
+ ['request shape', 'response shape', 'constraints'],
58
+ 'Do not change implementation.',
59
+ 'database-design',
60
+ ),
61
+ makeCase(
62
+ 'database-design',
63
+ 'database-schema-plan',
64
+ 'This feature needs persistence. Design the schema and query shape.',
65
+ ['schema', 'indexes', 'query plan'],
66
+ 'Do not write migration code yet.',
67
+ 'task-breakdown',
68
+ ),
69
+ makeCase(
70
+ 'task-breakdown',
71
+ 'breakdown-executable-work',
72
+ 'The plan is fixed. Break it into executable and verifiable tasks.',
73
+ ['task list', 'ordering', 'acceptance points'],
74
+ 'Do not start implementation.',
75
+ 'backend-development',
76
+ ),
77
+ makeCase(
78
+ 'backend-development',
79
+ 'backend-implementation-plan',
80
+ 'This backend capability needs implementation. Give the smallest viable approach and code changes.',
81
+ ['implementation notes', 'code changes', 'validation'],
82
+ 'Do not expand scope.',
83
+ 'unit-test',
84
+ ),
85
+ makeCase(
86
+ 'frontend-development',
87
+ 'frontend-implementation-plan',
88
+ 'This frontend page or component needs implementation. Outline the key steps and constraints.',
89
+ ['component changes', 'state handling', 'validation'],
90
+ 'Do not change unrelated UI.',
91
+ 'unit-test',
92
+ ),
93
+ makeCase(
94
+ 'database-change',
95
+ 'database-migration-safety',
96
+ 'This change needs a database schema update. Confirm migration and rollback safety.',
97
+ ['migration steps', 'safety checks', 'rollback'],
98
+ 'Do not skip rollback planning.',
99
+ 'regression-check',
100
+ ),
101
+ makeCase(
102
+ 'bug-fix',
103
+ 'bugfix-minimal-root-cause',
104
+ 'This bug already reproduced. Identify the root cause and give the smallest fix.',
105
+ ['root cause', 'fix', 'verification'],
106
+ 'Do not broaden the scope.',
107
+ 'regression-check',
108
+ ),
109
+ makeCase(
110
+ 'unit-test',
111
+ 'unit-test-behavior-coverage',
112
+ 'This behavior needs tests. Design unit tests that cover the expected behavior.',
113
+ ['test cases', 'assertions', 'edge cases'],
114
+ 'Do not modify production code.',
115
+ 'code-review',
116
+ ),
117
+ makeCase(
118
+ 'code-review',
119
+ 'review-diff-correctness',
120
+ 'Review this diff for correctness, maintainability, and regression risk.',
121
+ ['findings', 'severity', 'fix recommendations'],
122
+ 'Do not refactor the code inside the review step.',
123
+ 'evidence-collector',
124
+ ),
125
+ makeCase(
126
+ 'security-review',
127
+ 'security-risk-check',
128
+ 'Check whether this change introduces auth, injection, or data exposure risks.',
129
+ ['security findings', 'risk level', 'mitigation'],
130
+ 'Do not rewrite code.',
131
+ 'regression-check',
132
+ ),
133
+ makeCase(
134
+ 'performance-review',
135
+ 'performance-bottleneck-check',
136
+ 'Check whether this change introduces latency, throughput, or resource pressure risks.',
137
+ ['performance findings', 'bottleneck map', 'optimization advice'],
138
+ 'Do not rewrite code.',
139
+ 'regression-check',
140
+ ),
141
+ makeCase(
142
+ 'regression-check',
143
+ 'regression-behavior-scan',
144
+ 'The change is complete. Check whether related behavior broke.',
145
+ ['regression matrix', 'safety check', 'remaining risk'],
146
+ 'Do not change production code.',
147
+ 'release-check',
148
+ ),
149
+ makeCase(
150
+ 'release-check',
151
+ 'release-readiness-check',
152
+ 'Before release, check readiness and blockers.',
153
+ ['release readiness', 'blockers', 'next actions'],
154
+ 'Do not start new feature work.',
155
+ 'release-validation',
156
+ ),
157
+ makeCase(
158
+ 'release-validation',
159
+ 'release-post-check',
160
+ 'After release, confirm the core behavior and release result are healthy.',
161
+ ['verification result', 'release status', 'issues'],
162
+ 'Do not redesign the release plan.',
163
+ 'change-log',
164
+ ),
165
+ makeCase(
166
+ 'change-log',
167
+ 'changelog-summary',
168
+ 'Summarize this change into a clear changelog entry.',
169
+ ['change summary', 'impact', 'notes'],
170
+ 'Do not rewrite implementation details.',
171
+ 'deployment-guide',
172
+ ),
173
+ makeCase(
174
+ 'deployment-guide',
175
+ 'deployment-runbook',
176
+ 'Write the deployment and startup guide for this capability.',
177
+ ['startup', 'verify', 'recover'],
178
+ 'Do not change product scope.',
179
+ 'codebase-learning',
180
+ ),
181
+ makeCase(
182
+ 'codebase-learning',
183
+ 'repo-orientation',
184
+ 'I just entered this repository. Help me quickly map the structure, conventions, and key facts.',
185
+ ['repo map', 'conventions', 'key facts'],
186
+ 'Do not propose implementation changes yet.',
187
+ 'evidence-collector',
188
+ ),
189
+ makeCase(
190
+ 'evidence-collector',
191
+ 'evidence-pack',
192
+ 'Organize the current evidence into a reusable fact pack.',
193
+ ['evidence', 'facts', 'handoff'],
194
+ 'Do not reopen the design debate.',
195
+ 'framework-guide',
196
+ ),
197
+ makeCase(
198
+ 'framework-guide',
199
+ 'framework-governance-overview',
200
+ 'Explain how the repository conventions, rules, and skill layers fit together.',
201
+ ['guidance', 'rules', 'usage notes'],
202
+ 'Do not invent repo policy.',
203
+ null,
204
+ ),
205
+ ];
206
+
207
+ module.exports = {
208
+ name: 'golden-prompt-suite.current',
209
+ purpose: 'Golden prompt set for the current canonical skill catalog.',
210
+ cases,
211
+ };
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ const repoRoot = path.join(__dirname, '..');
7
+ const legacySuitePath = path.join(repoRoot, 'skills', 'references', 'golden-prompt-suite.current.js');
8
+ const suitePath = path.join(repoRoot, 'scripts', 'golden-prompt-suite.current.js');
9
+ const skillsRoot = path.join(repoRoot, 'skills');
10
+
11
+ function readSkillDirectories() {
12
+ const results = [];
13
+
14
+ function walk(dir) {
15
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
16
+ if (entry.name === 'references') {
17
+ continue;
18
+ }
19
+
20
+ const fullPath = path.join(dir, entry.name);
21
+ if (entry.isDirectory()) {
22
+ const skillFile = path.join(fullPath, 'SKILL.md');
23
+ if (fs.existsSync(skillFile)) {
24
+ results.push(fullPath);
25
+ }
26
+ walk(fullPath);
27
+ }
28
+ }
29
+ }
30
+
31
+ walk(skillsRoot);
32
+ return results.sort();
33
+ }
34
+
35
+ function readSkillFrontmatter(skillFile) {
36
+ const content = fs.readFileSync(skillFile, 'utf8');
37
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
38
+ const frontmatter = match ? match[1] : '';
39
+ const name = (frontmatter.match(/^name:\s*(.+)$/m) || [])[1]?.trim() || path.basename(path.dirname(skillFile));
40
+ const description = (frontmatter.match(/^description:\s*(.+)$/m) || [])[1]?.trim() || '';
41
+ return { content, name, description };
42
+ }
43
+
44
+ function readSkillSpec(skillDir) {
45
+ const specPath = path.join(skillDir, 'skill-spec.json');
46
+ if (fs.existsSync(specPath)) {
47
+ return JSON.parse(fs.readFileSync(specPath, 'utf8'));
48
+ }
49
+
50
+ const skillFile = path.join(skillDir, 'SKILL.md');
51
+ const { name, description, content } = readSkillFrontmatter(skillFile);
52
+ const title = (content.match(/^#\s+(.+)$/m) || [])[1]?.trim() || name;
53
+ const extractSection = (title) => {
54
+ const match = content.match(new RegExp(`## ${title}\\s*\\n\\n([\\s\\S]*?)(?=\\n## |$)`));
55
+ if (!match) {
56
+ return [];
57
+ }
58
+ return match[1]
59
+ .split(/\r?\n/)
60
+ .map((line) => line.trim())
61
+ .filter((line) => line.startsWith('- '))
62
+ .map((line) => line.slice(2).trim());
63
+ };
64
+ const extractSectionText = (sectionTitle) => {
65
+ const match = content.match(new RegExp(`## ${sectionTitle}\\s*\\n\\n([\\s\\S]*?)(?=\\n## |$)`));
66
+ return match ? match[1].trim().replace(/\r/g, '') : '';
67
+ };
68
+
69
+ return {
70
+ group: path.relative(skillsRoot, skillDir).split(path.sep)[0],
71
+ name,
72
+ description,
73
+ title,
74
+ purpose: extractSectionText('Purpose'),
75
+ whenToUse: extractSection('When to Use'),
76
+ how: extractSection('How'),
77
+ whenToAvoid: extractSection('When to Avoid'),
78
+ caseId: null,
79
+ source: 'fallback-from-skill-md',
80
+ };
81
+ }
82
+
83
+ function extractFrontmatter(content) {
84
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
85
+ return match ? match[1] : '';
86
+ }
87
+
88
+ function parseSkillCase(suite, skillName) {
89
+ const found = suite.cases.find((item) => item.expectedFirstSkill === skillName);
90
+ if (!found) {
91
+ throw new Error(`Missing golden replay case for ${skillName}`);
92
+ }
93
+ return found;
94
+ }
95
+
96
+ function trimTrailingPunctuation(value) {
97
+ return String(value || '').replace(/[。.\.]+$/u, '').trim();
98
+ }
99
+
100
+ function cleanBlockText(value) {
101
+ return String(value || '').replace(/\r/g, '').trimEnd();
102
+ }
103
+
104
+ function formatList(items) {
105
+ return items.length ? items.map((item) => `- ${item}`).join('\n') : '- none';
106
+ }
107
+
108
+ function renderSkillMd(spec) {
109
+ const title = spec.title || spec.name.split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(' ');
110
+ const lines = [
111
+ '---',
112
+ `name: ${spec.name}`,
113
+ `description: ${spec.description}`,
114
+ '---',
115
+ '',
116
+ `# ${title}`,
117
+ '',
118
+ '## Purpose',
119
+ '',
120
+ spec.purpose || spec.description,
121
+ '',
122
+ '## When to Use',
123
+ '',
124
+ ...spec.whenToUse.map((line) => `- ${line}`),
125
+ '',
126
+ '## How',
127
+ '',
128
+ ...spec.how.map((line) => `- ${line}`),
129
+ '',
130
+ '## When to Avoid',
131
+ '',
132
+ ...spec.whenToAvoid.map((line) => `- ${line}`),
133
+ ];
134
+ return `${lines.join('\n')}\n`;
135
+ }
136
+
137
+ function renderPromptTemplate(skillName, description, example) {
138
+ return [
139
+ `# ${skillName}`,
140
+ '',
141
+ '## Prompt Template',
142
+ '',
143
+ '```text',
144
+ `You are handling the ${skillName} skill.`,
145
+ `Goal: ${trimTrailingPunctuation(description) || 'Complete the stage-specific work for this request.'}`,
146
+ 'Inputs: the request, supporting evidence, constraints, and existing repository facts.',
147
+ `Output contract: ${example.expectedOutput.join(', ')}.`,
148
+ `Stop rule: ${trimTrailingPunctuation(example.expectedStop)}.`,
149
+ `Handoff: ${trimTrailingPunctuation(example.expectedHandoff || 'none')}.`,
150
+ 'Keep the response scoped to this stage and do not absorb the work of the next stage.',
151
+ '```',
152
+ '',
153
+ '## Notes',
154
+ '',
155
+ '- Keep the template aligned with the local replay case and local assets.',
156
+ '- Read `cases.md` for the matching replay example.',
157
+ ].join('\n');
158
+ }
159
+
160
+ function renderCasesDoc(skillName, example) {
161
+ return [
162
+ `# ${skillName}`,
163
+ '',
164
+ '## Replay Case',
165
+ '',
166
+ `- Case: \`${example.id}\``,
167
+ `- First skill: \`${example.expectedFirstSkill}\``,
168
+ '',
169
+ '### Prompt',
170
+ '',
171
+ '```text',
172
+ cleanBlockText(example.prompt),
173
+ '```',
174
+ '',
175
+ '### Expected Output',
176
+ '',
177
+ formatList(example.expectedOutput),
178
+ '',
179
+ '### Stop Rule',
180
+ '',
181
+ `- ${example.expectedStop}`,
182
+ '',
183
+ '### Handoff',
184
+ '',
185
+ `- ${example.expectedHandoff || 'none'}`,
186
+ ].join('\n');
187
+ }
188
+
189
+ function renderReferencesReadme(skillName, description) {
190
+ return [
191
+ `# ${skillName} References`,
192
+ '',
193
+ 'This directory is local to the skill and is the only reference entry point for this skill.',
194
+ '',
195
+ '## Contents',
196
+ '',
197
+ '- `../skill-spec.json`: design source for regenerating this skill',
198
+ '- `prompt-template.md`: reusable prompt wording for this skill',
199
+ '- `cases.md`: human-readable replay case for this skill',
200
+ '- `../assets/golden-prompt-suite.current.js`: machine-readable local case fixture',
201
+ '',
202
+ '## Guidance',
203
+ '',
204
+ '- Keep skill-specific explanation here instead of pushing it into a stage-level shared library.',
205
+ '- Keep shared hard constraints in `../../../rules/index.md`.',
206
+ '- Keep canonical names unchanged.',
207
+ description ? `- Skill summary: ${description}` : '- Skill summary: none',
208
+ ].join('\n');
209
+ }
210
+
211
+ function renderAssetModule(skillName, example, description) {
212
+ const payload = {
213
+ name: `${skillName}.golden-prompt-suite.current`,
214
+ skill: skillName,
215
+ description,
216
+ cases: [example],
217
+ };
218
+
219
+ return [
220
+ '#!/usr/bin/env node',
221
+ '',
222
+ `module.exports = ${JSON.stringify(payload, null, 2)};`,
223
+ '',
224
+ ].join('\n');
225
+ }
226
+
227
+ function updateSkillFile(skillFile) {
228
+ const skillDir = path.dirname(skillFile);
229
+ const spec = readSkillSpec(skillDir);
230
+ fs.writeFileSync(skillFile, renderSkillMd(spec), 'utf8');
231
+ }
232
+
233
+ function ensureDir(dir) {
234
+ fs.mkdirSync(dir, { recursive: true });
235
+ }
236
+
237
+ function removeFileIfExists(filePath) {
238
+ if (fs.existsSync(filePath)) {
239
+ fs.unlinkSync(filePath);
240
+ }
241
+ }
242
+
243
+ function main() {
244
+ const sourceSuitePath = fs.existsSync(suitePath) ? suitePath : legacySuitePath;
245
+ if (!fs.existsSync(sourceSuitePath)) {
246
+ throw new Error(`Replay suite not found: ${sourceSuitePath}`);
247
+ }
248
+
249
+ const suite = require(sourceSuitePath);
250
+ const skillDirs = readSkillDirectories();
251
+ const packages = [];
252
+
253
+ for (const skillDir of skillDirs) {
254
+ const skillFile = path.join(skillDir, 'SKILL.md');
255
+ const spec = readSkillSpec(skillDir);
256
+ const { name, description } = spec;
257
+ const example = parseSkillCase(suite, name);
258
+ const referencesDir = path.join(skillDir, 'references');
259
+ const assetsDir = path.join(skillDir, 'assets');
260
+
261
+ ensureDir(referencesDir);
262
+ ensureDir(assetsDir);
263
+
264
+ fs.writeFileSync(path.join(referencesDir, 'README.md'), `${renderReferencesReadme(name, description)}\n`, 'utf8');
265
+ fs.writeFileSync(path.join(referencesDir, 'prompt-template.md'), `${renderPromptTemplate(name, description, example)}\n`, 'utf8');
266
+ fs.writeFileSync(path.join(referencesDir, 'cases.md'), `${renderCasesDoc(name, example)}\n`, 'utf8');
267
+ fs.writeFileSync(path.join(assetsDir, 'golden-prompt-suite.current.js'), `${renderAssetModule(name, example, description)}\n`, 'utf8');
268
+ updateSkillFile(skillFile);
269
+
270
+ packages.push({
271
+ name,
272
+ description,
273
+ files: {
274
+ references: path.relative(repoRoot, referencesDir),
275
+ assets: path.relative(repoRoot, assetsDir),
276
+ },
277
+ });
278
+ }
279
+
280
+ if (sourceSuitePath !== suitePath) {
281
+ fs.copyFileSync(sourceSuitePath, suitePath);
282
+ }
283
+
284
+ const legacyFiles = [
285
+ path.join(repoRoot, 'skills', 'references', 'README.md'),
286
+ path.join(repoRoot, 'skills', 'references', 'golden-prompt-suite.md'),
287
+ path.join(repoRoot, 'skills', 'references', 'golden-prompt-suite.current.js'),
288
+ path.join(repoRoot, 'skills', 'references', 'open-source-skill-patterns.md'),
289
+ path.join(repoRoot, 'skills', 'references', 'rule-loading-map.md'),
290
+ path.join(repoRoot, 'skills', 'references', 'skill-authoring-standard.md'),
291
+ path.join(repoRoot, 'skills', 'references', 'skill-boundary-template.md'),
292
+ path.join(repoRoot, 'skills', 'references', 'skill-enhanced-template.md'),
293
+ path.join(repoRoot, 'skills', 'references', 'skill-prompt-library.md'),
294
+ path.join(repoRoot, 'skills', 'references', 'skill-reference-matrix.md'),
295
+ ];
296
+
297
+ for (const filePath of legacyFiles) {
298
+ removeFileIfExists(filePath);
299
+ }
300
+
301
+ const legacyDir = path.join(repoRoot, 'skills', 'references');
302
+ if (fs.existsSync(legacyDir) && fs.readdirSync(legacyDir).length === 0) {
303
+ fs.rmdirSync(legacyDir);
304
+ }
305
+
306
+ console.log(`Migrated ${packages.length} skill packages.`);
307
+ }
308
+
309
+ main();