@hegemonart/get-design-done 1.41.0 → 1.42.0

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 (130) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +81 -0
  4. package/README.md +2 -0
  5. package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +48 -0
  6. package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +95 -0
  7. package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +92 -0
  8. package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +170 -0
  9. package/dist/claude-code/.claude/skills/audit/SKILL.md +79 -0
  10. package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +94 -0
  11. package/dist/claude-code/.claude/skills/benchmark/SKILL.md +65 -0
  12. package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +43 -0
  13. package/dist/claude-code/.claude/skills/brief/SKILL.md +128 -0
  14. package/dist/claude-code/.claude/skills/budget/SKILL.md +45 -0
  15. package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +66 -0
  16. package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +126 -0
  17. package/dist/claude-code/.claude/skills/check-update/SKILL.md +98 -0
  18. package/dist/claude-code/.claude/skills/compare/SKILL.md +82 -0
  19. package/dist/claude-code/.claude/skills/compare/compare-rubric.md +171 -0
  20. package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +81 -0
  21. package/dist/claude-code/.claude/skills/connections/SKILL.md +71 -0
  22. package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +608 -0
  23. package/dist/claude-code/.claude/skills/continue/SKILL.md +24 -0
  24. package/dist/claude-code/.claude/skills/darkmode/SKILL.md +76 -0
  25. package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +258 -0
  26. package/dist/claude-code/.claude/skills/debug/SKILL.md +41 -0
  27. package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +119 -0
  28. package/dist/claude-code/.claude/skills/design/SKILL.md +99 -0
  29. package/dist/claude-code/.claude/skills/design/design-procedure.md +304 -0
  30. package/dist/claude-code/.claude/skills/discover/SKILL.md +72 -0
  31. package/dist/claude-code/.claude/skills/discover/discover-procedure.md +222 -0
  32. package/dist/claude-code/.claude/skills/discuss/SKILL.md +96 -0
  33. package/dist/claude-code/.claude/skills/do/SKILL.md +45 -0
  34. package/dist/claude-code/.claude/skills/explore/SKILL.md +105 -0
  35. package/dist/claude-code/.claude/skills/explore/explore-procedure.md +267 -0
  36. package/dist/claude-code/.claude/skills/export/SKILL.md +30 -0
  37. package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +98 -0
  38. package/dist/claude-code/.claude/skills/fast/SKILL.md +91 -0
  39. package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +64 -0
  40. package/dist/claude-code/.claude/skills/figma-write/SKILL.md +39 -0
  41. package/dist/claude-code/.claude/skills/graphify/SKILL.md +49 -0
  42. package/dist/claude-code/.claude/skills/health/SKILL.md +99 -0
  43. package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +44 -0
  44. package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +69 -0
  45. package/dist/claude-code/.claude/skills/help/SKILL.md +87 -0
  46. package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +61 -0
  47. package/dist/claude-code/.claude/skills/locale/SKILL.md +51 -0
  48. package/dist/claude-code/.claude/skills/map/SKILL.md +89 -0
  49. package/dist/claude-code/.claude/skills/migrate/SKILL.md +70 -0
  50. package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +37 -0
  51. package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +87 -0
  52. package/dist/claude-code/.claude/skills/new-project/SKILL.md +53 -0
  53. package/dist/claude-code/.claude/skills/next/SKILL.md +68 -0
  54. package/dist/claude-code/.claude/skills/note/SKILL.md +48 -0
  55. package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +86 -0
  56. package/dist/claude-code/.claude/skills/optimize/SKILL.md +97 -0
  57. package/dist/claude-code/.claude/skills/pause/SKILL.md +77 -0
  58. package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +88 -0
  59. package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +161 -0
  60. package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +90 -0
  61. package/dist/claude-code/.claude/skills/peers/SKILL.md +96 -0
  62. package/dist/claude-code/.claude/skills/plan/SKILL.md +105 -0
  63. package/dist/claude-code/.claude/skills/plan/plan-procedure.md +278 -0
  64. package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +48 -0
  65. package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +32 -0
  66. package/dist/claude-code/.claude/skills/progress/SKILL.md +95 -0
  67. package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +90 -0
  68. package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +101 -0
  69. package/dist/claude-code/.claude/skills/quick/SKILL.md +44 -0
  70. package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +32 -0
  71. package/dist/claude-code/.claude/skills/recall/SKILL.md +75 -0
  72. package/dist/claude-code/.claude/skills/reflect/SKILL.md +85 -0
  73. package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +120 -0
  74. package/dist/claude-code/.claude/skills/report-issue/SKILL.md +53 -0
  75. package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +120 -0
  76. package/dist/claude-code/.claude/skills/resume/SKILL.md +93 -0
  77. package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +46 -0
  78. package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +42 -0
  79. package/dist/claude-code/.claude/skills/roi/SKILL.md +54 -0
  80. package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +35 -0
  81. package/dist/claude-code/.claude/skills/router/SKILL.md +89 -0
  82. package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +65 -0
  83. package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +78 -0
  84. package/dist/claude-code/.claude/skills/router/router-rules.md +84 -0
  85. package/dist/claude-code/.claude/skills/scan/SKILL.md +92 -0
  86. package/dist/claude-code/.claude/skills/scan/scan-procedure.md +732 -0
  87. package/dist/claude-code/.claude/skills/settings/SKILL.md +87 -0
  88. package/dist/claude-code/.claude/skills/ship/SKILL.md +48 -0
  89. package/dist/claude-code/.claude/skills/sketch/SKILL.md +78 -0
  90. package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +92 -0
  91. package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +79 -0
  92. package/dist/claude-code/.claude/skills/spike/SKILL.md +67 -0
  93. package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +86 -0
  94. package/dist/claude-code/.claude/skills/start/SKILL.md +67 -0
  95. package/dist/claude-code/.claude/skills/start/start-procedure.md +115 -0
  96. package/dist/claude-code/.claude/skills/stats/SKILL.md +51 -0
  97. package/dist/claude-code/.claude/skills/style/SKILL.md +71 -0
  98. package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +150 -0
  99. package/dist/claude-code/.claude/skills/synthesize/SKILL.md +94 -0
  100. package/dist/claude-code/.claude/skills/timeline/SKILL.md +66 -0
  101. package/dist/claude-code/.claude/skills/todo/SKILL.md +64 -0
  102. package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +95 -0
  103. package/dist/claude-code/.claude/skills/undo/SKILL.md +31 -0
  104. package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +54 -0
  105. package/dist/claude-code/.claude/skills/update/SKILL.md +56 -0
  106. package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +78 -0
  107. package/dist/claude-code/.claude/skills/verify/SKILL.md +113 -0
  108. package/dist/claude-code/.claude/skills/verify/verify-procedure.md +512 -0
  109. package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +81 -0
  110. package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +82 -0
  111. package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +26 -0
  112. package/package.json +5 -1
  113. package/reference/DEPRECATIONS.md +14 -0
  114. package/reference/registry.json +7 -0
  115. package/reference/skill-placeholders.md +71 -0
  116. package/scripts/lib/build/factory.cjs +62 -0
  117. package/scripts/lib/build/harness-configs.cjs +64 -0
  118. package/scripts/lib/manifest/README.md +46 -0
  119. package/scripts/lib/manifest/harnesses.cjs +3 -0
  120. package/scripts/lib/manifest/harnesses.json +91 -0
  121. package/scripts/lib/manifest/index.cjs +26 -0
  122. package/scripts/lib/manifest/loader.cjs +51 -0
  123. package/scripts/lib/manifest/prose-denylist.json +126 -0
  124. package/scripts/lib/manifest/schemas/harnesses.schema.json +38 -0
  125. package/scripts/lib/manifest/schemas/prose-denylist.schema.json +41 -0
  126. package/scripts/lib/manifest/schemas/skills.schema.json +33 -0
  127. package/scripts/lib/manifest/skills.json +255 -0
  128. package/sdk/cli/commands/build.ts +106 -0
  129. package/sdk/cli/index.js +84 -2
  130. package/sdk/cli/index.ts +7 -0
@@ -0,0 +1,126 @@
1
+ {
2
+ "schema_version": 1,
3
+ "note": "AI-tell denylist SoT (Phase 41.5 seed). Phase 43 (lint-prose.cjs) + Phase 44 read this. Case-insensitive phrase match in the project's OWN user-facing prose only.",
4
+ "tells": [
5
+ {
6
+ "pattern": "load-bearing",
7
+ "kind": "phrase",
8
+ "note": "AI-prose tell (training-set monoculture)."
9
+ },
10
+ {
11
+ "pattern": "highest-leverage",
12
+ "kind": "phrase",
13
+ "note": "AI-prose tell (training-set monoculture)."
14
+ },
15
+ {
16
+ "pattern": "delve",
17
+ "kind": "phrase",
18
+ "note": "AI-prose tell (training-set monoculture)."
19
+ },
20
+ {
21
+ "pattern": "delves",
22
+ "kind": "phrase",
23
+ "note": "AI-prose tell (training-set monoculture)."
24
+ },
25
+ {
26
+ "pattern": "seamless",
27
+ "kind": "phrase",
28
+ "note": "AI-prose tell (training-set monoculture)."
29
+ },
30
+ {
31
+ "pattern": "seamlessly",
32
+ "kind": "phrase",
33
+ "note": "AI-prose tell (training-set monoculture)."
34
+ },
35
+ {
36
+ "pattern": "robust",
37
+ "kind": "phrase",
38
+ "note": "AI-prose tell (training-set monoculture)."
39
+ },
40
+ {
41
+ "pattern": "elevate",
42
+ "kind": "phrase",
43
+ "note": "AI-prose tell (training-set monoculture)."
44
+ },
45
+ {
46
+ "pattern": "empower",
47
+ "kind": "phrase",
48
+ "note": "AI-prose tell (training-set monoculture)."
49
+ },
50
+ {
51
+ "pattern": "underscore",
52
+ "kind": "phrase",
53
+ "note": "AI-prose tell (training-set monoculture)."
54
+ },
55
+ {
56
+ "pattern": "underscores",
57
+ "kind": "phrase",
58
+ "note": "AI-prose tell (training-set monoculture)."
59
+ },
60
+ {
61
+ "pattern": "in today's",
62
+ "kind": "phrase",
63
+ "note": "AI-prose tell (training-set monoculture)."
64
+ },
65
+ {
66
+ "pattern": "let's dive in",
67
+ "kind": "phrase",
68
+ "note": "AI-prose tell (training-set monoculture)."
69
+ },
70
+ {
71
+ "pattern": "moreover",
72
+ "kind": "phrase",
73
+ "note": "AI-prose tell (training-set monoculture)."
74
+ },
75
+ {
76
+ "pattern": "furthermore",
77
+ "kind": "phrase",
78
+ "note": "AI-prose tell (training-set monoculture)."
79
+ },
80
+ {
81
+ "pattern": "tapestry",
82
+ "kind": "phrase",
83
+ "note": "AI-prose tell (training-set monoculture)."
84
+ },
85
+ {
86
+ "pattern": "a testament to",
87
+ "kind": "phrase",
88
+ "note": "AI-prose tell (training-set monoculture)."
89
+ },
90
+ {
91
+ "pattern": "navigating the",
92
+ "kind": "phrase",
93
+ "note": "AI-prose tell (training-set monoculture)."
94
+ },
95
+ {
96
+ "pattern": "in the realm of",
97
+ "kind": "phrase",
98
+ "note": "AI-prose tell (training-set monoculture)."
99
+ },
100
+ {
101
+ "pattern": "unlock the power",
102
+ "kind": "phrase",
103
+ "note": "AI-prose tell (training-set monoculture)."
104
+ },
105
+ {
106
+ "pattern": "game-changer",
107
+ "kind": "phrase",
108
+ "note": "AI-prose tell (training-set monoculture)."
109
+ },
110
+ {
111
+ "pattern": "leverage",
112
+ "kind": "phrase",
113
+ "note": "AI-prose tell (training-set monoculture)."
114
+ },
115
+ {
116
+ "pattern": "\\u2014",
117
+ "kind": "token",
118
+ "note": "Em dash — banned in the project's own user-facing prose (Phase 43)."
119
+ },
120
+ {
121
+ "pattern": "--",
122
+ "kind": "token",
123
+ "note": "Double hyphen (often an em-dash surrogate)."
124
+ }
125
+ ]
126
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:gdd:manifest:harnesses",
4
+ "title": "manifest/harnesses.json",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "harnesses"
9
+ ],
10
+ "additionalProperties": true,
11
+ "properties": {
12
+ "schema_version": {
13
+ "type": "integer",
14
+ "minimum": 1
15
+ },
16
+ "harnesses": {
17
+ "type": "array",
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": true,
21
+ "required": [
22
+ "id",
23
+ "name"
24
+ ],
25
+ "properties": {
26
+ "id": {
27
+ "type": "string",
28
+ "pattern": "^[a-z0-9-]+$"
29
+ },
30
+ "name": {
31
+ "type": "string",
32
+ "minLength": 1
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:gdd:manifest:prose-denylist",
4
+ "title": "manifest/prose-denylist.json",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "tells"
9
+ ],
10
+ "additionalProperties": true,
11
+ "properties": {
12
+ "schema_version": {
13
+ "type": "integer",
14
+ "minimum": 1
15
+ },
16
+ "tells": {
17
+ "type": "array",
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": true,
21
+ "required": [
22
+ "pattern",
23
+ "kind"
24
+ ],
25
+ "properties": {
26
+ "pattern": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "kind": {
31
+ "type": "string",
32
+ "enum": [
33
+ "phrase",
34
+ "token"
35
+ ]
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:gdd:manifest:skills",
4
+ "title": "manifest/skills.json",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "skills"
9
+ ],
10
+ "additionalProperties": true,
11
+ "properties": {
12
+ "schema_version": {
13
+ "type": "integer",
14
+ "minimum": 1
15
+ },
16
+ "skills": {
17
+ "type": "array",
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": true,
21
+ "required": [
22
+ "name"
23
+ ],
24
+ "properties": {
25
+ "name": {
26
+ "type": "string",
27
+ "minLength": 1
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,255 @@
1
+ {
2
+ "schema_version": 1,
3
+ "note": "Skill metadata SoT (Phase 41.5 seed = the live skills/ dir names). Phase 47 enriches each record (aliases, pin, description budget).",
4
+ "skills": [
5
+ {
6
+ "name": "add-backlog"
7
+ },
8
+ {
9
+ "name": "analyze-dependencies"
10
+ },
11
+ {
12
+ "name": "apply-reflections"
13
+ },
14
+ {
15
+ "name": "audit"
16
+ },
17
+ {
18
+ "name": "bandit-status"
19
+ },
20
+ {
21
+ "name": "benchmark"
22
+ },
23
+ {
24
+ "name": "bootstrap-ds"
25
+ },
26
+ {
27
+ "name": "brief"
28
+ },
29
+ {
30
+ "name": "budget"
31
+ },
32
+ {
33
+ "name": "cache-manager"
34
+ },
35
+ {
36
+ "name": "check-update"
37
+ },
38
+ {
39
+ "name": "compare"
40
+ },
41
+ {
42
+ "name": "complete-cycle"
43
+ },
44
+ {
45
+ "name": "connections"
46
+ },
47
+ {
48
+ "name": "continue"
49
+ },
50
+ {
51
+ "name": "darkmode"
52
+ },
53
+ {
54
+ "name": "debug"
55
+ },
56
+ {
57
+ "name": "design"
58
+ },
59
+ {
60
+ "name": "discover"
61
+ },
62
+ {
63
+ "name": "discuss"
64
+ },
65
+ {
66
+ "name": "do"
67
+ },
68
+ {
69
+ "name": "explore"
70
+ },
71
+ {
72
+ "name": "export"
73
+ },
74
+ {
75
+ "name": "extract-learnings"
76
+ },
77
+ {
78
+ "name": "fast"
79
+ },
80
+ {
81
+ "name": "figma-extract"
82
+ },
83
+ {
84
+ "name": "figma-write"
85
+ },
86
+ {
87
+ "name": "graphify"
88
+ },
89
+ {
90
+ "name": "health"
91
+ },
92
+ {
93
+ "name": "help"
94
+ },
95
+ {
96
+ "name": "list-assumptions"
97
+ },
98
+ {
99
+ "name": "locale"
100
+ },
101
+ {
102
+ "name": "map"
103
+ },
104
+ {
105
+ "name": "migrate"
106
+ },
107
+ {
108
+ "name": "new-cycle"
109
+ },
110
+ {
111
+ "name": "new-project"
112
+ },
113
+ {
114
+ "name": "next"
115
+ },
116
+ {
117
+ "name": "note"
118
+ },
119
+ {
120
+ "name": "openrouter-status"
121
+ },
122
+ {
123
+ "name": "optimize"
124
+ },
125
+ {
126
+ "name": "pause"
127
+ },
128
+ {
129
+ "name": "peer-cli-add"
130
+ },
131
+ {
132
+ "name": "peer-cli-customize"
133
+ },
134
+ {
135
+ "name": "peers"
136
+ },
137
+ {
138
+ "name": "plan"
139
+ },
140
+ {
141
+ "name": "plant-seed"
142
+ },
143
+ {
144
+ "name": "pr-branch"
145
+ },
146
+ {
147
+ "name": "progress"
148
+ },
149
+ {
150
+ "name": "quality-gate"
151
+ },
152
+ {
153
+ "name": "quick"
154
+ },
155
+ {
156
+ "name": "reapply-patches"
157
+ },
158
+ {
159
+ "name": "recall"
160
+ },
161
+ {
162
+ "name": "reflect"
163
+ },
164
+ {
165
+ "name": "report-issue"
166
+ },
167
+ {
168
+ "name": "resume"
169
+ },
170
+ {
171
+ "name": "review-backlog"
172
+ },
173
+ {
174
+ "name": "review-decisions"
175
+ },
176
+ {
177
+ "name": "roi"
178
+ },
179
+ {
180
+ "name": "rollout-status"
181
+ },
182
+ {
183
+ "name": "router"
184
+ },
185
+ {
186
+ "name": "scan"
187
+ },
188
+ {
189
+ "name": "settings"
190
+ },
191
+ {
192
+ "name": "ship"
193
+ },
194
+ {
195
+ "name": "sketch"
196
+ },
197
+ {
198
+ "name": "sketch-wrap-up"
199
+ },
200
+ {
201
+ "name": "skill-manifest"
202
+ },
203
+ {
204
+ "name": "spike"
205
+ },
206
+ {
207
+ "name": "spike-wrap-up"
208
+ },
209
+ {
210
+ "name": "start"
211
+ },
212
+ {
213
+ "name": "stats"
214
+ },
215
+ {
216
+ "name": "style"
217
+ },
218
+ {
219
+ "name": "synthesize"
220
+ },
221
+ {
222
+ "name": "timeline"
223
+ },
224
+ {
225
+ "name": "todo"
226
+ },
227
+ {
228
+ "name": "turn-closeout"
229
+ },
230
+ {
231
+ "name": "undo"
232
+ },
233
+ {
234
+ "name": "unlock-decision"
235
+ },
236
+ {
237
+ "name": "update"
238
+ },
239
+ {
240
+ "name": "using-gdd"
241
+ },
242
+ {
243
+ "name": "verify"
244
+ },
245
+ {
246
+ "name": "warm-cache"
247
+ },
248
+ {
249
+ "name": "watch-authorities"
250
+ },
251
+ {
252
+ "name": "zoom-out"
253
+ }
254
+ ]
255
+ }
@@ -0,0 +1,106 @@
1
+ // sdk/cli/commands/build.ts — Phase 42 (COMPILE-06).
2
+ //
3
+ // `gdd-sdk build skills [--harness <id>] [--zip] [--check]` — compile the per-harness skill bundles
4
+ // from source/skills/ via the orchestrator scripts/build-skills.cjs. The orchestrator is a separate
5
+ // dep-free CJS process (no bundling entanglement with the SDK); we resolve it relative to the package
6
+ // root and spawn it, forwarding stdout/stderr.
7
+ //
8
+ // Exit codes:
9
+ // * 0 — build (or --check) succeeded.
10
+ // * 1 — --check found drift (committed != generated).
11
+ // * 3 — arg / config error (missing/unknown target).
12
+
13
+ import { spawnSync } from 'node:child_process';
14
+ import { existsSync } from 'node:fs';
15
+ import { dirname, join } from 'node:path';
16
+
17
+ import {
18
+ coerceFlags,
19
+ COMMON_FLAGS,
20
+ type FlagSpec,
21
+ type ParsedArgs,
22
+ } from '../parse-args.ts';
23
+
24
+ const BUILD_FLAGS: readonly FlagSpec[] = [
25
+ ...COMMON_FLAGS,
26
+ { name: 'harness', type: 'string' },
27
+ { name: 'zip', type: 'boolean' },
28
+ { name: 'check', type: 'boolean' },
29
+ ];
30
+
31
+ export const BUILD_USAGE = `gdd-sdk build skills [flags]
32
+
33
+ Compile per-harness skill bundles from source/skills/ into dist/<bundle>/ (and regenerate the
34
+ committed Claude-Code surface skills/). One source, N provider bundles.
35
+
36
+ Flags:
37
+ --harness <id> Build only one harness (e.g. claude, codex, gemini). Default: all 14.
38
+ --zip Also package each bundle as dist/<bundle>.tgz (needs tar).
39
+ --check Verify committed skills/ + dist/claude-code/ match source/ (the drift gate); no writes.
40
+ -h, --help Show this help.
41
+
42
+ Exit codes: 0 ok · 1 drift (--check) · 3 arg error
43
+ `;
44
+
45
+ interface CommandCtx {
46
+ readonly stdout: NodeJS.WritableStream;
47
+ readonly stderr: NodeJS.WritableStream;
48
+ }
49
+
50
+ /** Walk up from the CLI entry (argv[1]) to the package root that holds scripts/build-skills.cjs. */
51
+ function findOrchestrator(): string | null {
52
+ let dir = dirname(process.argv[1] ?? process.cwd());
53
+ for (let i = 0; i < 8; i++) {
54
+ const candidate = join(dir, 'scripts', 'build-skills.cjs');
55
+ if (existsSync(candidate)) return candidate;
56
+ const parent = dirname(dir);
57
+ if (parent === dir) break;
58
+ dir = parent;
59
+ }
60
+ const cwdCandidate = join(process.cwd(), 'scripts', 'build-skills.cjs');
61
+ return existsSync(cwdCandidate) ? cwdCandidate : null;
62
+ }
63
+
64
+ export async function buildCommand(parsed: ParsedArgs, ctx: CommandCtx): Promise<number> {
65
+ if (parsed.flags['help'] === true || parsed.flags['h'] === true) {
66
+ ctx.stdout.write(BUILD_USAGE);
67
+ return 0;
68
+ }
69
+
70
+ const target = parsed.positionals[0];
71
+ if (target !== 'skills') {
72
+ ctx.stderr.write(`gdd-sdk build: expected target "skills" (got ${target ? `"${target}"` : 'nothing'})\n${BUILD_USAGE}`);
73
+ return 3;
74
+ }
75
+
76
+ let flags: Record<string, unknown>;
77
+ try {
78
+ flags = coerceFlags(parsed, BUILD_FLAGS);
79
+ } catch {
80
+ ctx.stderr.write(`gdd-sdk build: invalid flags\n${BUILD_USAGE}`);
81
+ return 3;
82
+ }
83
+
84
+ const script = findOrchestrator();
85
+ if (!script) {
86
+ ctx.stderr.write('gdd-sdk build: could not locate scripts/build-skills.cjs\n');
87
+ return 3;
88
+ }
89
+
90
+ const orchestratorArgs: string[] = [];
91
+ if (flags['check'] === true) orchestratorArgs.push('--check');
92
+ if (flags['zip'] === true) orchestratorArgs.push('--zip');
93
+ const harness = flags['harness'];
94
+ if (typeof harness === 'string' && harness.length > 0) {
95
+ orchestratorArgs.push('--harness', harness);
96
+ }
97
+
98
+ const res = spawnSync(process.execPath, [script, ...orchestratorArgs], { encoding: 'utf8' });
99
+ if (res.stdout) ctx.stdout.write(res.stdout);
100
+ if (res.stderr) ctx.stderr.write(res.stderr);
101
+ if (res.error) {
102
+ ctx.stderr.write(`gdd-sdk build: failed to run orchestrator: ${res.error.message}\n`);
103
+ return 3;
104
+ }
105
+ return typeof res.status === 'number' ? res.status : 3;
106
+ }