@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.
- package/CHANGELOG.md +25 -20
- package/README.en.md +41 -75
- package/README.md +26 -39
- package/bin/cli.js +260 -151
- package/bin/rules-loader.js +271 -484
- package/codex-commands/README.md +25 -23
- package/codex-commands/commands/analyze.md +21 -22
- package/codex-commands/commands/build.md +22 -22
- package/codex-commands/commands/design.md +21 -22
- package/codex-commands/commands/distill.md +21 -21
- package/codex-commands/commands/doc.md +21 -22
- package/codex-commands/commands/infra.md +21 -21
- package/codex-commands/commands/init.md +20 -20
- package/codex-commands/commands/kb.md +21 -20
- package/codex-commands/commands/perf.md +21 -21
- package/codex-commands/commands/prd.md +21 -22
- package/codex-commands/commands/review.md +21 -22
- package/codex-commands/commands/security.md +21 -22
- package/codex-commands/commands/test.md +21 -21
- package/codex-commands/commands/workflow.md +21 -20
- package/package.json +5 -2
- package/rules/core/index.md +26 -41
- package/rules/delivery/index.md +25 -0
- package/rules/design/index.md +25 -0
- package/rules/discovery/index.md +25 -0
- package/rules/implementation/index.md +25 -0
- package/rules/index.md +24 -39
- package/rules/overlays/index.md +19 -19
- package/rules/overlays/pig-cloud.md +20 -45
- package/rules/shared/index.md +25 -0
- package/rules/skill-stage-map.json +26 -0
- package/rules/stages.json +48 -0
- package/rules/validation/index.md +25 -0
- package/scripts/add-skill-reference-nav.js +3 -0
- package/scripts/bootstrap-skill-specs.js +96 -0
- package/scripts/ci-validator.sh +51 -114
- package/scripts/generate-skill-prompt-library.js +3 -0
- package/scripts/golden-prompt-suite.current.js +211 -0
- package/scripts/migrate-skill-packages.js +309 -0
- package/scripts/run-golden-replays.js +110 -79
- package/scripts/validate-rules.js +128 -125
- package/scripts/validate-skill-replay-signals.js +45 -57
- package/scripts/validate-skill-shapes.js +153 -127
- package/scripts/validate-skill-stop-rules.js +54 -46
- package/skills/01-discovery/ambiguity-detection/SKILL.md +30 -0
- package/skills/01-discovery/ambiguity-detection/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/ambiguity-detection/references/README.md +17 -0
- package/skills/01-discovery/ambiguity-detection/references/cases.md +26 -0
- package/skills/01-discovery/ambiguity-detection/references/prompt-template.md +18 -0
- package/skills/01-discovery/ambiguity-detection/skill-spec.json +26 -0
- package/skills/01-discovery/business-analysis/SKILL.md +30 -0
- package/skills/01-discovery/business-analysis/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/business-analysis/references/README.md +17 -0
- package/skills/01-discovery/business-analysis/references/cases.md +26 -0
- package/skills/01-discovery/business-analysis/references/prompt-template.md +18 -0
- package/skills/01-discovery/business-analysis/skill-spec.json +26 -0
- package/skills/01-discovery/impact-analysis/SKILL.md +30 -0
- package/skills/01-discovery/impact-analysis/assets/golden-prompt-suite.current.js +22 -0
- package/skills/01-discovery/impact-analysis/references/README.md +17 -0
- package/skills/01-discovery/impact-analysis/references/cases.md +26 -0
- package/skills/01-discovery/impact-analysis/references/prompt-template.md +18 -0
- package/skills/01-discovery/impact-analysis/skill-spec.json +26 -0
- package/skills/01-discovery/requirement-discovery/SKILL.md +30 -0
- package/skills/01-discovery/requirement-discovery/assets/golden-prompt-suite.current.js +24 -0
- package/skills/01-discovery/requirement-discovery/references/README.md +17 -0
- package/skills/01-discovery/requirement-discovery/references/cases.md +28 -0
- package/skills/01-discovery/requirement-discovery/references/prompt-template.md +18 -0
- package/skills/01-discovery/requirement-discovery/skill-spec.json +26 -0
- package/skills/02-design/api-design/SKILL.md +29 -0
- package/skills/02-design/api-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/api-design/references/README.md +17 -0
- package/skills/02-design/api-design/references/cases.md +26 -0
- package/skills/02-design/api-design/references/prompt-template.md +18 -0
- package/skills/02-design/api-design/skill-spec.json +25 -0
- package/skills/02-design/architecture-design/SKILL.md +29 -0
- package/skills/02-design/architecture-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/architecture-design/references/README.md +17 -0
- package/skills/02-design/architecture-design/references/cases.md +26 -0
- package/skills/02-design/architecture-design/references/prompt-template.md +18 -0
- package/skills/02-design/architecture-design/skill-spec.json +25 -0
- package/skills/02-design/database-design/SKILL.md +29 -0
- package/skills/02-design/database-design/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/database-design/references/README.md +17 -0
- package/skills/02-design/database-design/references/cases.md +26 -0
- package/skills/02-design/database-design/references/prompt-template.md +18 -0
- package/skills/02-design/database-design/skill-spec.json +25 -0
- package/skills/02-design/task-breakdown/SKILL.md +29 -0
- package/skills/02-design/task-breakdown/assets/golden-prompt-suite.current.js +22 -0
- package/skills/02-design/task-breakdown/references/README.md +17 -0
- package/skills/02-design/task-breakdown/references/cases.md +26 -0
- package/skills/02-design/task-breakdown/references/prompt-template.md +18 -0
- package/skills/02-design/task-breakdown/skill-spec.json +25 -0
- package/skills/03-implementation/backend-development/SKILL.md +29 -0
- package/skills/03-implementation/backend-development/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/backend-development/references/README.md +17 -0
- package/skills/03-implementation/backend-development/references/cases.md +26 -0
- package/skills/03-implementation/backend-development/references/prompt-template.md +18 -0
- package/skills/03-implementation/backend-development/skill-spec.json +25 -0
- package/skills/03-implementation/bug-fix/SKILL.md +29 -0
- package/skills/03-implementation/bug-fix/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/bug-fix/references/README.md +17 -0
- package/skills/03-implementation/bug-fix/references/cases.md +26 -0
- package/skills/03-implementation/bug-fix/references/prompt-template.md +18 -0
- package/skills/03-implementation/bug-fix/skill-spec.json +25 -0
- package/skills/03-implementation/database-change/SKILL.md +29 -0
- package/skills/03-implementation/database-change/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/database-change/references/README.md +17 -0
- package/skills/03-implementation/database-change/references/cases.md +26 -0
- package/skills/03-implementation/database-change/references/prompt-template.md +18 -0
- package/skills/03-implementation/database-change/skill-spec.json +25 -0
- package/skills/03-implementation/frontend-development/SKILL.md +29 -0
- package/skills/03-implementation/frontend-development/assets/golden-prompt-suite.current.js +22 -0
- package/skills/03-implementation/frontend-development/references/README.md +17 -0
- package/skills/03-implementation/frontend-development/references/cases.md +26 -0
- package/skills/03-implementation/frontend-development/references/prompt-template.md +18 -0
- package/skills/03-implementation/frontend-development/skill-spec.json +25 -0
- package/skills/04-validation/code-review/SKILL.md +29 -0
- package/skills/04-validation/code-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/code-review/references/README.md +17 -0
- package/skills/04-validation/code-review/references/cases.md +26 -0
- package/skills/04-validation/code-review/references/prompt-template.md +18 -0
- package/skills/04-validation/code-review/skill-spec.json +25 -0
- package/skills/04-validation/performance-review/SKILL.md +29 -0
- package/skills/04-validation/performance-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/performance-review/references/README.md +17 -0
- package/skills/04-validation/performance-review/references/cases.md +26 -0
- package/skills/04-validation/performance-review/references/prompt-template.md +18 -0
- package/skills/04-validation/performance-review/skill-spec.json +25 -0
- package/skills/04-validation/regression-check/SKILL.md +29 -0
- package/skills/04-validation/regression-check/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/regression-check/references/README.md +17 -0
- package/skills/04-validation/regression-check/references/cases.md +26 -0
- package/skills/04-validation/regression-check/references/prompt-template.md +18 -0
- package/skills/04-validation/regression-check/skill-spec.json +25 -0
- package/skills/04-validation/security-review/SKILL.md +29 -0
- package/skills/04-validation/security-review/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/security-review/references/README.md +17 -0
- package/skills/04-validation/security-review/references/cases.md +26 -0
- package/skills/04-validation/security-review/references/prompt-template.md +18 -0
- package/skills/04-validation/security-review/skill-spec.json +25 -0
- package/skills/04-validation/unit-test/SKILL.md +29 -0
- package/skills/04-validation/unit-test/assets/golden-prompt-suite.current.js +22 -0
- package/skills/04-validation/unit-test/references/README.md +17 -0
- package/skills/04-validation/unit-test/references/cases.md +26 -0
- package/skills/04-validation/unit-test/references/prompt-template.md +18 -0
- package/skills/04-validation/unit-test/skill-spec.json +25 -0
- package/skills/05-delivery/change-log/SKILL.md +29 -0
- package/skills/05-delivery/change-log/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/change-log/references/README.md +17 -0
- package/skills/05-delivery/change-log/references/cases.md +26 -0
- package/skills/05-delivery/change-log/references/prompt-template.md +18 -0
- package/skills/05-delivery/change-log/skill-spec.json +25 -0
- package/skills/05-delivery/deployment-guide/SKILL.md +29 -0
- package/skills/05-delivery/deployment-guide/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/deployment-guide/references/README.md +17 -0
- package/skills/05-delivery/deployment-guide/references/cases.md +26 -0
- package/skills/05-delivery/deployment-guide/references/prompt-template.md +18 -0
- package/skills/05-delivery/deployment-guide/skill-spec.json +25 -0
- package/skills/05-delivery/release-check/SKILL.md +29 -0
- package/skills/05-delivery/release-check/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/release-check/references/README.md +17 -0
- package/skills/05-delivery/release-check/references/cases.md +26 -0
- package/skills/05-delivery/release-check/references/prompt-template.md +18 -0
- package/skills/05-delivery/release-check/skill-spec.json +25 -0
- package/skills/05-delivery/release-validation/SKILL.md +29 -0
- package/skills/05-delivery/release-validation/assets/golden-prompt-suite.current.js +22 -0
- package/skills/05-delivery/release-validation/references/README.md +17 -0
- package/skills/05-delivery/release-validation/references/cases.md +26 -0
- package/skills/05-delivery/release-validation/references/prompt-template.md +18 -0
- package/skills/05-delivery/release-validation/skill-spec.json +25 -0
- package/skills/shared/codebase-learning/SKILL.md +29 -0
- package/skills/shared/codebase-learning/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/codebase-learning/references/README.md +17 -0
- package/skills/shared/codebase-learning/references/cases.md +26 -0
- package/skills/shared/codebase-learning/references/prompt-template.md +18 -0
- package/skills/shared/codebase-learning/skill-spec.json +25 -0
- package/skills/shared/evidence-collector/SKILL.md +29 -0
- package/skills/shared/evidence-collector/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/evidence-collector/references/README.md +17 -0
- package/skills/shared/evidence-collector/references/cases.md +26 -0
- package/skills/shared/evidence-collector/references/prompt-template.md +18 -0
- package/skills/shared/evidence-collector/skill-spec.json +25 -0
- package/skills/shared/framework-guide/SKILL.md +28 -0
- package/skills/shared/framework-guide/assets/golden-prompt-suite.current.js +22 -0
- package/skills/shared/framework-guide/references/README.md +17 -0
- package/skills/shared/framework-guide/references/cases.md +26 -0
- package/skills/shared/framework-guide/references/prompt-template.md +18 -0
- package/skills/shared/framework-guide/skill-spec.json +24 -0
- package/rules/bundles.json +0 -358
- package/rules/coding/analysis.md +0 -27
- package/rules/coding/backend/cache-invalidation.md +0 -30
- package/rules/coding/backend/cache-keying.md +0 -30
- package/rules/coding/backend/cache.md +0 -37
- package/rules/coding/backend/database.md +0 -32
- package/rules/coding/backend/feign.md +0 -30
- package/rules/coding/backend/index.md +0 -42
- package/rules/coding/backend/query.md +0 -32
- package/rules/coding/backend/remote.md +0 -33
- package/rules/coding/backend/transaction-boundary.md +0 -30
- package/rules/coding/backend/transaction-rollback.md +0 -30
- package/rules/coding/backend/transaction.md +0 -38
- package/rules/coding/boundary.md +0 -25
- package/rules/coding/implementation.md +0 -26
- package/rules/coding/index.md +0 -38
- package/rules/coding/scaffold.md +0 -28
- package/rules/coding/testing.md +0 -29
- package/rules/coding/validation.md +0 -29
- package/rules/core/code-quality.md +0 -30
- package/rules/core/evidence.md +0 -26
- package/rules/core/interface.md +0 -26
- package/rules/core/iteration.md +0 -26
- package/rules/core/layer-boundary.md +0 -25
- package/rules/core/logging.md +0 -26
- package/rules/core/security.md +0 -26
- package/rules/core/task-boundary.md +0 -27
- package/rules/docs/api.md +0 -34
- package/rules/docs/capture-summary.md +0 -29
- package/rules/docs/capture.md +0 -34
- package/rules/docs/contract.md +0 -30
- package/rules/docs/decision-log.md +0 -32
- package/rules/docs/examples.md +0 -28
- package/rules/docs/index.md +0 -49
- package/rules/docs/reference.md +0 -32
- package/rules/overlays/pig-cloud/controller.md +0 -33
- package/rules/overlays/pig-cloud/dto-vo.md +0 -33
- package/rules/overlays/pig-cloud/entity.md +0 -32
- package/rules/overlays/pig-cloud/exception.md +0 -32
- package/rules/overlays/pig-cloud/layering.md +0 -31
- package/rules/overlays/pig-cloud/mapper.md +0 -32
- package/rules/overlays/pig-cloud/query-style.md +0 -32
- package/rules/overlays/pig-cloud/rest-response.md +0 -33
- package/rules/overlays/pig-cloud/service.md +0 -33
- package/rules/overlays/pig-cloud/transactions.md +0 -32
- package/rules/overlays/pig-cloud/validation.md +0 -33
- package/rules/product/acceptance.md +0 -25
- package/rules/product/briefing.md +0 -27
- package/rules/product/index.md +0 -36
- package/rules/product/intake.md +0 -27
- package/rules/product/modeling.md +0 -25
- package/rules/product/project-context.md +0 -29
- package/rules/review/code.md +0 -35
- package/rules/review/evidence.md +0 -31
- package/rules/review/index.md +0 -50
- package/rules/review/java.md +0 -42
- package/rules/review/performance.md +0 -38
- package/rules/review/rubric.md +0 -28
- package/rules/review/security.md +0 -38
- package/rules/review/ts.md +0 -33
- package/rules/review/vue.md +0 -33
- package/rules/skill-profile-map.json +0 -59
- package/rules/skill-profile-map.md +0 -29
- package/rules/workflow/handoff.md +0 -25
- package/rules/workflow/index.md +0 -37
- package/rules/workflow/refinement.md +0 -29
- package/rules/workflow/router.md +0 -25
- package/rules/workflow/selection.md +0 -25
- package/rules/workflow/stop.md +0 -25
- package/skills/api-contract-docs/SKILL.md +0 -77
- package/skills/business-fact-extraction/SKILL.md +0 -337
- package/skills/business-fact-extraction/scripts/write-knowledge-base.js +0 -228
- package/skills/code-review/SKILL.md +0 -136
- package/skills/code-review/references/findings-template.md +0 -51
- package/skills/code-review/references/performance-checklist.md +0 -213
- package/skills/code-review/references/rubric.md +0 -232
- package/skills/code-review/references/rules.md +0 -32
- package/skills/code-review/references/security-checklist.md +0 -178
- package/skills/code-review/references/stack-notes.md +0 -25
- package/skills/code-review/references/template-review.md +0 -39
- package/skills/code-review/scripts/lint-code-review.mjs +0 -431
- package/skills/domain-modeling/SKILL.md +0 -81
- package/skills/domain-modeling/references/README.md +0 -134
- package/skills/domain-modeling/references/distillation-checklist.md +0 -44
- package/skills/domain-modeling/references/test-cases-template.md +0 -128
- package/skills/environment-deploy/SKILL.md +0 -81
- package/skills/feature-build/SKILL.md +0 -122
- package/skills/feature-build/references/coding-checklist.md +0 -97
- package/skills/feature-build/references/comment-specification.md +0 -89
- package/skills/knowledge-capture/SKILL.md +0 -93
- package/skills/performance-audit/SKILL.md +0 -118
- package/skills/project-bootstrap/SKILL.md +0 -81
- package/skills/references/anti-rationalization.md +0 -144
- package/skills/references/business-fact-extraction.md +0 -415
- package/skills/references/engineering-delivery-method.md +0 -64
- package/skills/references/engineering-delivery-template.md +0 -81
- package/skills/references/golden-prompt-suite.js +0 -436
- package/skills/references/golden-prompt-suite.md +0 -33
- package/skills/references/project-requirement-alignment.md +0 -42
- package/skills/references/rule-loading-map.md +0 -117
- package/skills/references/skill-authoring-standard.md +0 -74
- package/skills/references/skill-boundary-template.md +0 -71
- package/skills/references/skill-enhanced-template.md +0 -103
- package/skills/references/skill-reference-matrix.md +0 -62
- package/skills/security-audit/SKILL.md +0 -119
- package/skills/spec-refinement/SKILL.md +0 -149
- package/skills/technical-design/SKILL.md +0 -106
- package/skills/technical-design/references/solid-checklist.md +0 -199
- package/skills/test-design/SKILL.md +0 -92
- package/skills/workflow-router/SKILL.md +0 -86
package/scripts/ci-validator.sh
CHANGED
|
@@ -1,114 +1,51 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
echo "[1/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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,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();
|