@chiralkit/cli 0.1.0-alpha.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 (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/add.d.ts +4 -0
  4. package/dist/add.js +118 -0
  5. package/dist/add.js.map +1 -0
  6. package/dist/agents/subprocess.d.ts +10 -0
  7. package/dist/agents/subprocess.js +43 -0
  8. package/dist/agents/subprocess.js.map +1 -0
  9. package/dist/automation/index.d.ts +14 -0
  10. package/dist/automation/index.js +129 -0
  11. package/dist/automation/index.js.map +1 -0
  12. package/dist/automation/install.d.ts +19 -0
  13. package/dist/automation/install.js +116 -0
  14. package/dist/automation/install.js.map +1 -0
  15. package/dist/automation/parsers/audit-report.d.ts +2 -0
  16. package/dist/automation/parsers/audit-report.js +42 -0
  17. package/dist/automation/parsers/audit-report.js.map +1 -0
  18. package/dist/automation/parsers/exit-code.d.ts +2 -0
  19. package/dist/automation/parsers/exit-code.js +6 -0
  20. package/dist/automation/parsers/exit-code.js.map +1 -0
  21. package/dist/automation/parsers/index.d.ts +10 -0
  22. package/dist/automation/parsers/index.js +13 -0
  23. package/dist/automation/parsers/index.js.map +1 -0
  24. package/dist/automation/parsers/observer-snapshot.d.ts +2 -0
  25. package/dist/automation/parsers/observer-snapshot.js +30 -0
  26. package/dist/automation/parsers/observer-snapshot.js.map +1 -0
  27. package/dist/automation/parsers/plan-report.d.ts +2 -0
  28. package/dist/automation/parsers/plan-report.js +53 -0
  29. package/dist/automation/parsers/plan-report.js.map +1 -0
  30. package/dist/automation/parsers/refinement-report.d.ts +2 -0
  31. package/dist/automation/parsers/refinement-report.js +149 -0
  32. package/dist/automation/parsers/refinement-report.js.map +1 -0
  33. package/dist/automation/parsers/types.d.ts +7 -0
  34. package/dist/automation/parsers/types.js +2 -0
  35. package/dist/automation/parsers/types.js.map +1 -0
  36. package/dist/automation/run.d.ts +25 -0
  37. package/dist/automation/run.js +68 -0
  38. package/dist/automation/run.js.map +1 -0
  39. package/dist/automation/schema.d.ts +130 -0
  40. package/dist/automation/schema.js +46 -0
  41. package/dist/automation/schema.js.map +1 -0
  42. package/dist/automation/status.d.ts +16 -0
  43. package/dist/automation/status.js +56 -0
  44. package/dist/automation/status.js.map +1 -0
  45. package/dist/automation/verifiers/index.d.ts +7 -0
  46. package/dist/automation/verifiers/index.js +5 -0
  47. package/dist/automation/verifiers/index.js.map +1 -0
  48. package/dist/automation/verifiers/shell.d.ts +5 -0
  49. package/dist/automation/verifiers/shell.js +17 -0
  50. package/dist/automation/verifiers/shell.js.map +1 -0
  51. package/dist/automation/verifiers/types.d.ts +12 -0
  52. package/dist/automation/verifiers/types.js +2 -0
  53. package/dist/automation/verifiers/types.js.map +1 -0
  54. package/dist/backlog/add.d.ts +10 -0
  55. package/dist/backlog/add.js +30 -0
  56. package/dist/backlog/add.js.map +1 -0
  57. package/dist/backlog/index.d.ts +1 -0
  58. package/dist/backlog/index.js +53 -0
  59. package/dist/backlog/index.js.map +1 -0
  60. package/dist/config.d.ts +26 -0
  61. package/dist/config.js +110 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/detect.d.ts +2 -0
  64. package/dist/detect.js +26 -0
  65. package/dist/detect.js.map +1 -0
  66. package/dist/doctor-invariants.d.ts +6 -0
  67. package/dist/doctor-invariants.js +50 -0
  68. package/dist/doctor-invariants.js.map +1 -0
  69. package/dist/doctor.d.ts +13 -0
  70. package/dist/doctor.js +281 -0
  71. package/dist/doctor.js.map +1 -0
  72. package/dist/generate.d.ts +1 -0
  73. package/dist/generate.js +275 -0
  74. package/dist/generate.js.map +1 -0
  75. package/dist/generator/agent.d.ts +8 -0
  76. package/dist/generator/agent.js +66 -0
  77. package/dist/generator/agent.js.map +1 -0
  78. package/dist/generator/api.d.ts +7 -0
  79. package/dist/generator/api.js +42 -0
  80. package/dist/generator/api.js.map +1 -0
  81. package/dist/generator/config.d.ts +23 -0
  82. package/dist/generator/config.js +121 -0
  83. package/dist/generator/config.js.map +1 -0
  84. package/dist/generator/parse-response.d.ts +5 -0
  85. package/dist/generator/parse-response.js +58 -0
  86. package/dist/generator/parse-response.js.map +1 -0
  87. package/dist/generator/prompt.d.ts +9 -0
  88. package/dist/generator/prompt.js +166 -0
  89. package/dist/generator/prompt.js.map +1 -0
  90. package/dist/generator/request.d.ts +17 -0
  91. package/dist/generator/request.js +15 -0
  92. package/dist/generator/request.js.map +1 -0
  93. package/dist/generators/prompts/stencil.md +45 -0
  94. package/dist/generators/prompts/vue.md +54 -0
  95. package/dist/index.d.ts +2 -0
  96. package/dist/index.js +102 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/init.d.ts +1 -0
  99. package/dist/init.js +89 -0
  100. package/dist/init.js.map +1 -0
  101. package/dist/installers/context.d.ts +4 -0
  102. package/dist/installers/context.js +120 -0
  103. package/dist/installers/context.js.map +1 -0
  104. package/dist/installers/index.d.ts +7 -0
  105. package/dist/installers/index.js +22 -0
  106. package/dist/installers/index.js.map +1 -0
  107. package/dist/installers/installer.d.ts +12 -0
  108. package/dist/installers/installer.js +30 -0
  109. package/dist/installers/installer.js.map +1 -0
  110. package/dist/installers/stencil/django-template/installer.d.ts +10 -0
  111. package/dist/installers/stencil/django-template/installer.js +77 -0
  112. package/dist/installers/stencil/django-template/installer.js.map +1 -0
  113. package/dist/installers/stencil/react/installer.d.ts +9 -0
  114. package/dist/installers/stencil/react/installer.js +22 -0
  115. package/dist/installers/stencil/react/installer.js.map +1 -0
  116. package/dist/installers/stencil/react/manifest.json +17 -0
  117. package/dist/installers/types.d.ts +24 -0
  118. package/dist/installers/types.js +2 -0
  119. package/dist/installers/types.js.map +1 -0
  120. package/dist/lock.d.ts +25 -0
  121. package/dist/lock.js +86 -0
  122. package/dist/lock.js.map +1 -0
  123. package/dist/manifest.d.ts +1 -0
  124. package/dist/manifest.js +93 -0
  125. package/dist/manifest.js.map +1 -0
  126. package/dist/pm/audit.d.ts +36 -0
  127. package/dist/pm/audit.js +147 -0
  128. package/dist/pm/audit.js.map +1 -0
  129. package/dist/pm/backlog.d.ts +3 -0
  130. package/dist/pm/backlog.js +123 -0
  131. package/dist/pm/backlog.js.map +1 -0
  132. package/dist/pm/brief.d.ts +4 -0
  133. package/dist/pm/brief.js +18 -0
  134. package/dist/pm/brief.js.map +1 -0
  135. package/dist/pm/git.d.ts +3 -0
  136. package/dist/pm/git.js +43 -0
  137. package/dist/pm/git.js.map +1 -0
  138. package/dist/pm/grid.d.ts +8 -0
  139. package/dist/pm/grid.js +16 -0
  140. package/dist/pm/grid.js.map +1 -0
  141. package/dist/pm/index.d.ts +25 -0
  142. package/dist/pm/index.js +199 -0
  143. package/dist/pm/index.js.map +1 -0
  144. package/dist/pm/observe.d.ts +55 -0
  145. package/dist/pm/observe.js +177 -0
  146. package/dist/pm/observe.js.map +1 -0
  147. package/dist/pm/plan.d.ts +54 -0
  148. package/dist/pm/plan.js +151 -0
  149. package/dist/pm/plan.js.map +1 -0
  150. package/dist/pm/refinement-worktree.d.ts +31 -0
  151. package/dist/pm/refinement-worktree.js +160 -0
  152. package/dist/pm/refinement-worktree.js.map +1 -0
  153. package/dist/pm/refinement.d.ts +79 -0
  154. package/dist/pm/refinement.js +326 -0
  155. package/dist/pm/refinement.js.map +1 -0
  156. package/dist/pm/render.d.ts +2 -0
  157. package/dist/pm/render.js +39 -0
  158. package/dist/pm/render.js.map +1 -0
  159. package/dist/pm/roadmap-rings.d.ts +7 -0
  160. package/dist/pm/roadmap-rings.js +31 -0
  161. package/dist/pm/roadmap-rings.js.map +1 -0
  162. package/dist/pm/roadmap.d.ts +2 -0
  163. package/dist/pm/roadmap.js +118 -0
  164. package/dist/pm/roadmap.js.map +1 -0
  165. package/dist/pm/snapshot.d.ts +10 -0
  166. package/dist/pm/snapshot.js +129 -0
  167. package/dist/pm/snapshot.js.map +1 -0
  168. package/dist/pm/types.d.ts +99 -0
  169. package/dist/pm/types.js +29 -0
  170. package/dist/pm/types.js.map +1 -0
  171. package/dist/registry-layout.d.ts +18 -0
  172. package/dist/registry-layout.js +122 -0
  173. package/dist/registry-layout.js.map +1 -0
  174. package/dist/scaffold-registry.d.ts +10 -0
  175. package/dist/scaffold-registry.js +283 -0
  176. package/dist/scaffold-registry.js.map +1 -0
  177. package/dist/scaffold.d.ts +1 -0
  178. package/dist/scaffold.js +32 -0
  179. package/dist/scaffold.js.map +1 -0
  180. package/dist/spec-from-react.d.ts +11 -0
  181. package/dist/spec-from-react.js +522 -0
  182. package/dist/spec-from-react.js.map +1 -0
  183. package/dist/spec-from-stencil.d.ts +7 -0
  184. package/dist/spec-from-stencil.js +275 -0
  185. package/dist/spec-from-stencil.js.map +1 -0
  186. package/dist/spec.d.ts +1 -0
  187. package/dist/spec.js +60 -0
  188. package/dist/spec.js.map +1 -0
  189. package/dist/tokens-map.d.ts +11 -0
  190. package/dist/tokens-map.js +43 -0
  191. package/dist/tokens-map.js.map +1 -0
  192. package/dist/update.d.ts +39 -0
  193. package/dist/update.js +490 -0
  194. package/dist/update.js.map +1 -0
  195. package/dist/workspace-init.d.ts +9 -0
  196. package/dist/workspace-init.js +119 -0
  197. package/dist/workspace-init.js.map +1 -0
  198. package/package.json +53 -0
@@ -0,0 +1,283 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { lstat, mkdir, readdir, readFile, stat, symlink, unlink, writeFile, } from "node:fs/promises";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { resolveKitsRoot } from "@chiralkit/kits";
5
+ import { readMaintainerConfig } from "./config.js";
6
+ import { runFromStencil } from "./spec-from-stencil.js";
7
+ import { MODULE_ENVELOPE_FILENAME, TYPE_TO_FAMILY, TYPE_TO_KIT } from "./registry-layout.js";
8
+ // Filenames scaffold itself manages at the implementations/stencil/ layer
9
+ // (generation.json) or elsewhere in the registry entry (module.json,
10
+ // spec.json — normally at registry/<family>/<name>/, but skipping
11
+ // defensively). The walker will not symlink source files with these names,
12
+ // so that step 4's writeFile through the symlink can't corrupt the source.
13
+ const RESERVED_FILENAMES = new Set([
14
+ "generation.json",
15
+ MODULE_ENVELOPE_FILENAME,
16
+ "spec.json",
17
+ ]);
18
+ export async function runScaffoldRegistry(name, opts) {
19
+ const cwd = opts.cwd ?? process.cwd();
20
+ const force = opts.force ?? false;
21
+ const type = opts.type ?? "ui-component";
22
+ const family = TYPE_TO_FAMILY[type];
23
+ const config = await readMaintainerConfig(cwd);
24
+ const kitsRoot = opts.kitsRoot ?? resolveKitsRoot();
25
+ const registryDir = join(kitsRoot, TYPE_TO_KIT[type], "registry", family, name);
26
+ // Non-ui-component types have no Stencil source to onboard from — there is
27
+ // no `ds-<name>.tsx` to parse into spec.json/tag/tokens_used. Until Task 5
28
+ // builds real agent/recipe/config scaffolders, `--type <t>` for those types
29
+ // writes a minimal placeholder envelope only (name/type/metadata scaffold,
30
+ // empty spec) at the correct family path, for a human to fill in by hand.
31
+ if (type !== "ui-component") {
32
+ await validateTarget(registryDir, family, name, force);
33
+ await mkdir(registryDir, { recursive: true });
34
+ const envelope = {
35
+ name,
36
+ type,
37
+ metadata: {
38
+ level: opts.level,
39
+ description: `TODO: describe ${name}`,
40
+ author: detectAuthor(cwd),
41
+ version: "0.1.0",
42
+ created_at: new Date().toISOString().slice(0, 10),
43
+ dependencies: [],
44
+ translations: {},
45
+ },
46
+ spec: {},
47
+ };
48
+ await writeFile(join(registryDir, MODULE_ENVELOPE_FILENAME), JSON.stringify(envelope, null, 2) + "\n", "utf8");
49
+ console.log(`Wrote placeholder envelope: ${join(registryDir, MODULE_ENVELOPE_FILENAME)}`);
50
+ console.log(`type '${type}' has no automated scaffolder yet — fill in metadata.description and spec by hand.`);
51
+ return;
52
+ }
53
+ const sourceDir = join(cwd, config.design_system_path, `ds-${name}`);
54
+ const stencilImplDir = join(registryDir, "implementations", "stencil");
55
+ await validateSource(sourceDir, name);
56
+ await validateTarget(registryDir, family, name, force);
57
+ // 1. spec.json (delegates to Plan 2's extractor via the wrapper below).
58
+ // Before writing, capture any hand-authored fields on an existing
59
+ // spec.json (slot, a11y, state_machine) so we can warn the user that
60
+ // the pure-parser regeneration will drop them.
61
+ const wipedFields = await detectFieldsToBeWiped(join(registryDir, "spec.json"));
62
+ await writeSpecViaFromStencil(name, sourceDir, registryDir);
63
+ if (wipedFields.length > 0) {
64
+ console.warn(`[WARN] scaffold: existing spec.json had hand-authored field(s): ` +
65
+ `${wipedFields.join(", ")}. The pure-parser regeneration dropped them; ` +
66
+ `re-add them to registry/${family}/${name}/spec.json before the next 'chiralkit doctor' pass.`);
67
+ }
68
+ // 2. module.json envelope — build it from the just-written spec.json
69
+ // (for tokens_used bucketed form) + parsed source (for the tag).
70
+ const spec = JSON.parse(await readFile(join(registryDir, "spec.json"), "utf8"));
71
+ const tag = extractTag(await readFile(join(sourceDir, `ds-${name}.tsx`), "utf8"), name);
72
+ const envelope = buildEnvelope({
73
+ name,
74
+ tag,
75
+ bucketedTokens: spec.tokens_used ?? {},
76
+ cwd,
77
+ level: opts.level,
78
+ });
79
+ await mkdir(registryDir, { recursive: true });
80
+ await writeFile(join(registryDir, MODULE_ENVELOPE_FILENAME), JSON.stringify(envelope, null, 2) + "\n", "utf8");
81
+ // 3. Symlinks: one per source file (files-only, no hidden, no subdirs).
82
+ await mkdir(stencilImplDir, { recursive: true });
83
+ // First: sweep any pre-existing symlinks in stencilImplDir so a --force
84
+ // regeneration doesn't leave orphans pointing at now-removed source
85
+ // files. Regular files (like generation.json) are left alone; only
86
+ // symlinks are swept.
87
+ await sweepSymlinks(stencilImplDir);
88
+ const sourceEntries = await readdir(sourceDir, { withFileTypes: true });
89
+ for (const entry of sourceEntries) {
90
+ if (entry.name.startsWith("."))
91
+ continue;
92
+ if (!entry.isFile())
93
+ continue;
94
+ // Skip CLI-managed filenames — if a user's source dir happens to
95
+ // contain one of these, symlinking through it would let step 4's
96
+ // writeFile clobber the source file.
97
+ if (RESERVED_FILENAMES.has(entry.name))
98
+ continue;
99
+ const linkPath = join(stencilImplDir, entry.name);
100
+ const targetAbs = join(sourceDir, entry.name);
101
+ const targetRel = relative(dirname(linkPath), targetAbs);
102
+ try {
103
+ await unlink(linkPath);
104
+ }
105
+ catch {
106
+ // Doesn't exist — that's fine.
107
+ }
108
+ await symlink(targetRel, linkPath);
109
+ }
110
+ // 4. generation.json baseline (regular file, not a symlink)
111
+ await writeFile(join(stencilImplDir, "generation.json"), JSON.stringify({
112
+ generated_from_spec_version: null,
113
+ generated_at: null,
114
+ generator_model: null,
115
+ manually_edited: true,
116
+ }, null, 2) + "\n", "utf8");
117
+ }
118
+ // Pure function — exposed for unit test. Flattens the bucketed tokens_used
119
+ // form spec.json uses ({ colors: ["primary"], spacing: ["sm"] }) into the
120
+ // flat "category.value" string list module.json uses.
121
+ export function flattenTokensUsed(bucketed) {
122
+ const out = [];
123
+ for (const [bucket, values] of Object.entries(bucketed)) {
124
+ if (!values || values.length === 0)
125
+ continue;
126
+ const cat = singular(bucket);
127
+ for (const v of values) {
128
+ out.push(`${cat}.${v}`);
129
+ }
130
+ }
131
+ return out;
132
+ }
133
+ // Same 5-line function as generator/prompt.ts:singular(). Duplicated per
134
+ // spec §Design decisions #5 — extracting a shared helper is not justified
135
+ // by two callers at ~5 LOC each.
136
+ function singular(bucket) {
137
+ switch (bucket) {
138
+ case "colors":
139
+ return "color";
140
+ default:
141
+ return bucket;
142
+ }
143
+ }
144
+ function buildEnvelope(input) {
145
+ return {
146
+ name: input.name,
147
+ type: "ui-component",
148
+ metadata: {
149
+ level: input.level,
150
+ description: `TODO: describe ${input.name}`,
151
+ author: detectAuthor(input.cwd),
152
+ version: "0.1.0",
153
+ created_at: new Date().toISOString().slice(0, 10),
154
+ dependencies: [],
155
+ translations: {},
156
+ },
157
+ spec: {
158
+ tech: "stencil",
159
+ tag: input.tag,
160
+ tokens_used: flattenTokensUsed(input.bucketedTokens),
161
+ },
162
+ };
163
+ }
164
+ function detectAuthor(cwd) {
165
+ try {
166
+ const out = execFileSync("git", ["config", "user.name"], {
167
+ cwd,
168
+ encoding: "utf8",
169
+ stdio: ["ignore", "pipe", "ignore"],
170
+ }).trim();
171
+ return out.length > 0 ? out : "TODO";
172
+ }
173
+ catch {
174
+ return "TODO";
175
+ }
176
+ }
177
+ // Parses `@Component({ tag: "ds-foo", ... })` from Stencil source and
178
+ // returns the tag. Falls back to `ds-<name>` if the decorator can't be
179
+ // parsed (shouldn't happen for a well-formed Stencil component, but the
180
+ // fallback keeps scaffold usable during Stencil source edits).
181
+ function extractTag(source, name) {
182
+ const m = /@Component\s*\(\s*\{[^}]*?\btag\s*:\s*["']([^"']+)["']/.exec(source);
183
+ return m ? m[1] : `ds-${name}`;
184
+ }
185
+ async function validateSource(sourceDir, name) {
186
+ try {
187
+ const s = await stat(sourceDir);
188
+ if (!s.isDirectory()) {
189
+ throw new Error(`source '${sourceDir}' exists but is not a directory.`);
190
+ }
191
+ }
192
+ catch (e) {
193
+ if (e.code === "ENOENT") {
194
+ throw new Error(`source '${sourceDir}' does not exist. Expected a Stencil component directory with ds-${name}.tsx and ds-${name}.css.`);
195
+ }
196
+ throw e;
197
+ }
198
+ const tsxPath = join(sourceDir, `ds-${name}.tsx`);
199
+ try {
200
+ await stat(tsxPath);
201
+ }
202
+ catch {
203
+ throw new Error(`${sourceDir} exists but has no ds-${name}.tsx (Stencil requires the tsx entry point named after the component).`);
204
+ }
205
+ }
206
+ async function validateTarget(registryDir, family, name, force) {
207
+ if (force)
208
+ return;
209
+ try {
210
+ await stat(registryDir);
211
+ // Exists — refuse.
212
+ throw new Error(`registry/${family}/${name}/ already exists at ${registryDir}; pass --force to regenerate (this will overwrite module.json and, for ui-component types, spec.json, generation.json, and all implementations/stencil/ symlinks).`);
213
+ }
214
+ catch (e) {
215
+ if (e.code === "ENOENT")
216
+ return;
217
+ throw e;
218
+ }
219
+ }
220
+ // Bridge to runFromStencil. Task 3 Step 3 extended runFromStencil to
221
+ // accept optional sourceDir + registryDir; scaffold passes both so the
222
+ // spec extractor operates against the scaffold's configured layout
223
+ // rather than the workspace-resolved default. `force: true` is safe
224
+ // because validateTarget above has already enforced the outer --force
225
+ // gate — reaching this line means we're allowed to overwrite.
226
+ async function writeSpecViaFromStencil(name, sourceDir, registryDir) {
227
+ await runFromStencil(name, { force: true, sourceDir, registryDir });
228
+ }
229
+ // Removes every symlink under `dir` (leaves regular files untouched). Used
230
+ // before recreating symlinks on --force regeneration so that source files
231
+ // removed since the last scaffold do not leave orphaned symlinks behind.
232
+ async function sweepSymlinks(dir) {
233
+ let entries;
234
+ try {
235
+ entries = await readdir(dir);
236
+ }
237
+ catch {
238
+ return; // Dir doesn't exist yet — nothing to sweep.
239
+ }
240
+ for (const name of entries) {
241
+ const full = join(dir, name);
242
+ let s;
243
+ try {
244
+ s = await lstat(full);
245
+ }
246
+ catch {
247
+ continue;
248
+ }
249
+ if (s.isSymbolicLink()) {
250
+ await unlink(full);
251
+ }
252
+ }
253
+ }
254
+ // Detects which human-authored fields exist on an already-present spec.json
255
+ // and would be wiped by the pure-parser regeneration. Returns [] if no
256
+ // spec.json exists (fresh scaffold — nothing to wipe).
257
+ async function detectFieldsToBeWiped(specPath) {
258
+ let raw;
259
+ try {
260
+ raw = await readFile(specPath, "utf8");
261
+ }
262
+ catch {
263
+ return [];
264
+ }
265
+ let parsed;
266
+ try {
267
+ parsed = JSON.parse(raw);
268
+ }
269
+ catch {
270
+ return [];
271
+ }
272
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
273
+ return [];
274
+ }
275
+ const obj = parsed;
276
+ const wiped = [];
277
+ for (const field of ["slot", "a11y", "state_machine"]) {
278
+ if (obj[field] !== undefined)
279
+ wiped.push(field);
280
+ }
281
+ return wiped;
282
+ }
283
+ //# sourceMappingURL=scaffold-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-registry.js","sourceRoot":"","sources":["../src/scaffold-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runScaffold(rest: string[]): Promise<void>;
@@ -0,0 +1,32 @@
1
+ import { runScaffoldRegistry } from "./scaffold-registry.js";
2
+ import { parseLevelFlag, parseTypeFlag } from "./registry-layout.js";
3
+ // Subcommand dispatcher for `chiralkit scaffold ...`. Currently one action;
4
+ // grows as future types (recipe, agent, config) gain their own scaffolders.
5
+ export async function runScaffold(rest) {
6
+ const [action, ...args] = rest;
7
+ switch (action) {
8
+ case "registry": {
9
+ const name = args[0];
10
+ if (!name) {
11
+ throw new Error("scaffold registry: missing module name. Usage: chiralkit scaffold registry <name> --level <n> [--type <t>] [--force]");
12
+ }
13
+ const force = args.includes("--force");
14
+ const type = parseTypeFlag(args, (msg) => {
15
+ throw new Error(`scaffold registry: ${msg}`);
16
+ });
17
+ const level = parseLevelFlag(args, (msg) => {
18
+ throw new Error(`scaffold registry: ${msg}`);
19
+ });
20
+ if (level === undefined) {
21
+ throw new Error("scaffold registry: --level <n> is required, where n ∈ 0,1,2,3,5,8");
22
+ }
23
+ await runScaffoldRegistry(name, { force, type, level });
24
+ return;
25
+ }
26
+ case undefined:
27
+ throw new Error("scaffold: missing action. Actions: registry <name> --level <n> [--type <t>] [--force]");
28
+ default:
29
+ throw new Error(`scaffold: unknown action '${action}'`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErE,4EAA4E;AAC5E,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACb,sHAAsH,CACvH,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YACH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;YACJ,CAAC;YACD,MAAM,mBAAmB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,KAAK,SAAS;YACZ,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,GAAG,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface FromReactOptions {
2
+ name?: string;
3
+ exportName?: string;
4
+ tokensMapPath: string;
5
+ version?: string;
6
+ outPath?: string;
7
+ force: boolean;
8
+ strict: boolean;
9
+ dryRun: boolean;
10
+ }
11
+ export declare function runFromReact(sourcePath: string, options: FromReactOptions): Promise<void>;