yosr-seed 0.0.1 → 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 (117) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +2 -2
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +26 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/create.d.ts +4 -0
  7. package/dist/create.js +324 -0
  8. package/dist/create.js.map +1 -0
  9. package/dist/engine/delta/bounds.d.ts +14 -0
  10. package/dist/engine/delta/bounds.js +101 -0
  11. package/dist/engine/delta/bounds.js.map +1 -0
  12. package/dist/engine/delta/loop.d.ts +32 -0
  13. package/dist/engine/delta/loop.js +51 -0
  14. package/dist/engine/delta/loop.js.map +1 -0
  15. package/dist/engine/delta/provider.d.ts +3 -0
  16. package/dist/engine/delta/provider.js +15 -0
  17. package/dist/engine/delta/provider.js.map +1 -0
  18. package/dist/engine/delta/types.d.ts +34 -0
  19. package/dist/engine/delta/types.js +2 -0
  20. package/dist/engine/delta/types.js.map +1 -0
  21. package/dist/engine/exit-codes.d.ts +7 -0
  22. package/dist/engine/exit-codes.js +7 -0
  23. package/dist/engine/exit-codes.js.map +1 -0
  24. package/dist/engine/gate/matrix.d.ts +1 -0
  25. package/dist/engine/gate/matrix.js +69 -0
  26. package/dist/engine/gate/matrix.js.map +1 -0
  27. package/dist/engine/gate/run.d.ts +46 -0
  28. package/dist/engine/gate/run.js +268 -0
  29. package/dist/engine/gate/run.js.map +1 -0
  30. package/dist/engine/index.d.ts +14 -0
  31. package/dist/engine/index.js +13 -0
  32. package/dist/engine/index.js.map +1 -0
  33. package/dist/engine/node-version.d.ts +2 -0
  34. package/dist/engine/node-version.js +9 -0
  35. package/dist/engine/node-version.js.map +1 -0
  36. package/dist/engine/profile/hash.d.ts +8 -0
  37. package/dist/engine/profile/hash.js +6 -0
  38. package/dist/engine/profile/hash.js.map +1 -0
  39. package/dist/engine/profile/presets.d.ts +13 -0
  40. package/dist/engine/profile/presets.js +156 -0
  41. package/dist/engine/profile/presets.js.map +1 -0
  42. package/dist/engine/profile/store.d.ts +26 -0
  43. package/dist/engine/profile/store.js +128 -0
  44. package/dist/engine/profile/store.js.map +1 -0
  45. package/dist/engine/render/codemods.d.ts +6 -0
  46. package/dist/engine/render/codemods.js +159 -0
  47. package/dist/engine/render/codemods.js.map +1 -0
  48. package/dist/engine/render/conditions.d.ts +8 -0
  49. package/dist/engine/render/conditions.js +29 -0
  50. package/dist/engine/render/conditions.js.map +1 -0
  51. package/dist/engine/render/constraints.d.ts +3 -0
  52. package/dist/engine/render/constraints.js +10 -0
  53. package/dist/engine/render/constraints.js.map +1 -0
  54. package/dist/engine/render/enforcement.d.ts +6 -0
  55. package/dist/engine/render/enforcement.js +117 -0
  56. package/dist/engine/render/enforcement.js.map +1 -0
  57. package/dist/engine/render/engines.d.ts +2 -0
  58. package/dist/engine/render/engines.js +75 -0
  59. package/dist/engine/render/engines.js.map +1 -0
  60. package/dist/engine/render/errors.d.ts +3 -0
  61. package/dist/engine/render/errors.js +6 -0
  62. package/dist/engine/render/errors.js.map +1 -0
  63. package/dist/engine/render/features.d.ts +4 -0
  64. package/dist/engine/render/features.js +19 -0
  65. package/dist/engine/render/features.js.map +1 -0
  66. package/dist/engine/render/format.d.ts +3 -0
  67. package/dist/engine/render/format.js +16 -0
  68. package/dist/engine/render/format.js.map +1 -0
  69. package/dist/engine/render/json-merge.d.ts +12 -0
  70. package/dist/engine/render/json-merge.js +66 -0
  71. package/dist/engine/render/json-merge.js.map +1 -0
  72. package/dist/engine/render/lockfile.d.ts +23 -0
  73. package/dist/engine/render/lockfile.js +76 -0
  74. package/dist/engine/render/lockfile.js.map +1 -0
  75. package/dist/engine/render/options.d.ts +3 -0
  76. package/dist/engine/render/options.js +41 -0
  77. package/dist/engine/render/options.js.map +1 -0
  78. package/dist/engine/render/package-manager.d.ts +3 -0
  79. package/dist/engine/render/package-manager.js +13 -0
  80. package/dist/engine/render/package-manager.js.map +1 -0
  81. package/dist/engine/render/render.d.ts +22 -0
  82. package/dist/engine/render/render.js +126 -0
  83. package/dist/engine/render/render.js.map +1 -0
  84. package/dist/engine/render/rules.d.ts +4 -0
  85. package/dist/engine/render/rules.js +110 -0
  86. package/dist/engine/render/rules.js.map +1 -0
  87. package/dist/engine/render/style.d.ts +13 -0
  88. package/dist/engine/render/style.js +133 -0
  89. package/dist/engine/render/style.js.map +1 -0
  90. package/dist/engine/render/tokens.d.ts +4 -0
  91. package/dist/engine/render/tokens.js +35 -0
  92. package/dist/engine/render/tokens.js.map +1 -0
  93. package/dist/engine/render/tree-ops.d.ts +7 -0
  94. package/dist/engine/render/tree-ops.js +133 -0
  95. package/dist/engine/render/tree-ops.js.map +1 -0
  96. package/dist/engine/render/types.d.ts +253 -0
  97. package/dist/engine/render/types.js +3 -0
  98. package/dist/engine/render/types.js.map +1 -0
  99. package/dist/engine/render/util.d.ts +13 -0
  100. package/dist/engine/render/util.js +74 -0
  101. package/dist/engine/render/util.js.map +1 -0
  102. package/dist/engine/render/validate.d.ts +3 -0
  103. package/dist/engine/render/validate.js +25 -0
  104. package/dist/engine/render/validate.js.map +1 -0
  105. package/dist/profile.d.ts +12 -0
  106. package/dist/profile.js +126 -0
  107. package/dist/profile.js.map +1 -0
  108. package/dist/prompt.d.ts +6 -0
  109. package/dist/prompt.js +32 -0
  110. package/dist/prompt.js.map +1 -0
  111. package/dist/run.d.ts +30 -0
  112. package/dist/run.js +89 -0
  113. package/dist/run.js.map +1 -0
  114. package/dist/schemas/seed.answers.schema.json +283 -0
  115. package/dist/schemas/seed.profile.schema.json +289 -0
  116. package/dist/schemas/seed.template.schema.json +1469 -0
  117. package/package.json +32 -6
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # yosr-seed
2
+
3
+ ## 0.1.0-alpha.0
4
+
5
+ ### Major Changes
6
+
7
+ - First alpha of the Yosr Seed command-line interface.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # yosr-seed
2
2
 
3
- Yosr Seed by Yosr AI. Name reserved, first release coming soon.
3
+ The Yosr Seed command-line interface. Binary: `yosr-seed`. License: MIT. Node.js: `>=24`.
4
4
 
5
- https://seed.yosr.ai
5
+ Commands, flags, exit codes, and the profile path are in the [repository README](https://github.com/getyosr/yosr-seed#readme).
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { openPrompts } from "./prompt.js";
3
+ import { readOwnPackageVersion, runYosrSeed } from "./run.js";
4
+ const prompts = openPrompts();
5
+ void runYosrSeed({
6
+ nodeVersion: process.versions.node,
7
+ args: process.argv.slice(2),
8
+ version: readOwnPackageVersion(),
9
+ stdout: (line) => {
10
+ console.log(line);
11
+ },
12
+ stderr: (line) => {
13
+ console.error(line);
14
+ },
15
+ prompt: (question) => prompts.ask(question),
16
+ })
17
+ .then((code) => {
18
+ prompts.close();
19
+ process.exit(code);
20
+ })
21
+ .catch((error) => {
22
+ prompts.close();
23
+ console.error(error instanceof Error ? error.message : error);
24
+ process.exit(1);
25
+ });
26
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9D,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAE9B,KAAK,WAAW,CAAC;IACf,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAClC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,qBAAqB,EAAE;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;CAC5C,CAAC;KACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type CliIo } from "./run.js";
2
+ /** Directory of the installed `@yosr-ai/template-next-fullstack` package. */
3
+ export declare function installedTemplateDir(): string;
4
+ export declare function runCreate(io: CliIo): Promise<number>;
package/dist/create.js ADDED
@@ -0,0 +1,324 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { PRESET_TWEAKS, RenderError, buildProfile, evalCond, exitCodes, isPresetName, profileFile, readProfile, render, runGate, writeProfile, } from "./engine/index.js";
7
+ import { renderFromYosrSeed } from "./run.js";
8
+ const TWEAKS = [
9
+ { id: "structure", question: "How should folders be organized?" },
10
+ { id: "strictness", question: "TypeScript strictness?" },
11
+ { id: "errors", question: "How should server code report expected errors?" },
12
+ { id: "formatting", question: "Quotes and semicolons?" },
13
+ { id: "tests", question: "Where do unit tests live?" },
14
+ { id: "naming", question: "File naming?" },
15
+ ];
16
+ /** Directory of the installed `@yosr-ai/template-next-fullstack` package. */
17
+ export function installedTemplateDir() {
18
+ return path.dirname(fileURLToPath(import.meta.resolve("@yosr-ai/template-next-fullstack/package.json")));
19
+ }
20
+ function flagName(option) {
21
+ if (option.flag)
22
+ return option.flag;
23
+ return option.id.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
24
+ }
25
+ function splitFlag(token) {
26
+ const body = token.slice(2);
27
+ const eq = body.indexOf("=");
28
+ if (eq === -1)
29
+ return { name: body };
30
+ return { name: body.slice(0, eq), inline: body.slice(eq + 1) };
31
+ }
32
+ function takeValue(inline, rest, name) {
33
+ if (inline !== undefined)
34
+ return inline;
35
+ const next = rest[0];
36
+ if (next === undefined || next.startsWith("--"))
37
+ throw new Error(`Missing value for --${name}.`);
38
+ rest.shift();
39
+ return next;
40
+ }
41
+ function takeBoolean(inline, rest) {
42
+ let raw = inline;
43
+ if (raw === undefined && rest[0] !== undefined && !rest[0].startsWith("--"))
44
+ raw = rest.shift();
45
+ if (raw === undefined || raw === "true")
46
+ return true;
47
+ if (raw === "false")
48
+ return false;
49
+ throw new Error(`Expected true or false, got ${raw}.`);
50
+ }
51
+ function styleScalar(raw) {
52
+ if (raw === "true")
53
+ return true;
54
+ if (raw === "false")
55
+ return false;
56
+ if (/^-?\d+$/.test(raw))
57
+ return Number(raw);
58
+ return raw;
59
+ }
60
+ function parseCreateArgs(args, manifest) {
61
+ const byFlag = new Map(manifest.options.map((option) => [flagName(option), option]));
62
+ const rest = [...args];
63
+ const parsed = {
64
+ nonInteractive: false,
65
+ packageManager: "pnpm",
66
+ e2e: false,
67
+ saveProfile: false,
68
+ git: true,
69
+ push: false,
70
+ style: {},
71
+ answers: {},
72
+ };
73
+ while (rest.length > 0) {
74
+ const token = rest.shift();
75
+ if (token === undefined)
76
+ break;
77
+ if (!token.startsWith("--")) {
78
+ if (parsed.dir !== undefined)
79
+ throw new Error("Only one directory can be given.");
80
+ parsed.dir = token;
81
+ continue;
82
+ }
83
+ const { name, inline } = splitFlag(token);
84
+ if (name === "non-interactive")
85
+ parsed.nonInteractive = true;
86
+ else if (name === "e2e")
87
+ parsed.e2e = true;
88
+ else if (name === "save-profile")
89
+ parsed.saveProfile = true;
90
+ else if (name === "no-git")
91
+ parsed.git = false;
92
+ else if (name === "push")
93
+ parsed.push = true;
94
+ else if (name === "package-manager") {
95
+ const value = takeValue(inline, rest, name);
96
+ if (value !== "pnpm" && value !== "npm")
97
+ throw new Error("Package manager must be pnpm or npm.");
98
+ parsed.packageManager = value;
99
+ }
100
+ else if (name === "profile")
101
+ parsed.profilePath = takeValue(inline, rest, name);
102
+ else if (name === "style") {
103
+ const value = takeValue(inline, rest, name);
104
+ const eq = value.indexOf("=");
105
+ if (eq <= 0)
106
+ throw new Error("Expected --style <dimension>=<value>.");
107
+ parsed.style[value.slice(0, eq)] = styleScalar(value.slice(eq + 1));
108
+ }
109
+ else {
110
+ const option = byFlag.get(name);
111
+ if (option === undefined)
112
+ throw new Error(`Unknown flag --${name}.`);
113
+ if (option.type === "boolean")
114
+ parsed.answers[option.id] = takeBoolean(inline, rest);
115
+ else
116
+ parsed.answers[option.id] = takeValue(inline, rest, name);
117
+ }
118
+ }
119
+ if (parsed.push && !parsed.git)
120
+ throw new Error("--push needs git. Omit --no-git.");
121
+ return parsed;
122
+ }
123
+ function defaultLabel(option) {
124
+ if (option.default === undefined)
125
+ return undefined;
126
+ if (option.type === "boolean")
127
+ return option.default === true ? "Yes" : "No";
128
+ return option.choices?.find((choice) => choice.value === option.default)?.label.cli;
129
+ }
130
+ function parseBooleanAnswer(raw, fallback) {
131
+ if (raw === "") {
132
+ if (fallback === undefined)
133
+ throw new Error("Expected yes or no.");
134
+ return fallback;
135
+ }
136
+ if (raw === "true" || raw === "yes" || raw === "y")
137
+ return true;
138
+ if (raw === "false" || raw === "no" || raw === "n")
139
+ return false;
140
+ throw new Error(`Expected yes or no, got ${raw}.`);
141
+ }
142
+ function parseEnumAnswer(option, raw) {
143
+ if (raw === "") {
144
+ if (typeof option.default !== "string")
145
+ throw new Error(`Choose a value for ${option.label.cli}.`);
146
+ return option.default;
147
+ }
148
+ const choice = option.choices?.find((item) => item.value === raw || item.label.cli.toLowerCase() === raw.toLowerCase());
149
+ if (choice === undefined)
150
+ throw new Error(`"${raw}" is not a choice for ${option.label.cli}.`);
151
+ return choice.value;
152
+ }
153
+ function parseStringAnswer(option, raw) {
154
+ if (raw === "")
155
+ throw new Error(`${option.id} needs an answer.`);
156
+ if (option.pattern && !new RegExp(option.pattern).test(raw)) {
157
+ throw new Error(option.help?.cli ?? `${option.id} does not match ${option.pattern}`);
158
+ }
159
+ return raw;
160
+ }
161
+ async function ask(io, text) {
162
+ if (!io.prompt)
163
+ throw new Error("This create run needs answers. Pass --non-interactive or answer the prompts.");
164
+ return (await io.prompt(`${text}\n> `)).trim();
165
+ }
166
+ function runGit(dir, args) {
167
+ const result = spawnSync("git", args, { cwd: dir, encoding: "utf8" });
168
+ if (result.status !== 0)
169
+ throw new Error((result.stderr || result.stdout || `git ${args[0] ?? ""} failed`).trim());
170
+ }
171
+ function commitProject(dir, message, identity) {
172
+ runGit(dir, ["init"]);
173
+ if (identity) {
174
+ runGit(dir, ["config", "--local", "user.name", identity.name]);
175
+ runGit(dir, ["config", "--local", "user.email", identity.email]);
176
+ }
177
+ runGit(dir, ["add", "-A"]);
178
+ runGit(dir, ["commit", "-m", message]);
179
+ }
180
+ function defaultGh(args, cwd) {
181
+ const result = spawnSync("gh", [...args], { cwd, stdio: "inherit" });
182
+ if (result.status !== 0)
183
+ throw new Error("gh exited non-zero.");
184
+ }
185
+ export async function runCreate(io) {
186
+ try {
187
+ const templateDir = installedTemplateDir();
188
+ const manifest = JSON.parse(readFileSync(path.join(templateDir, "seed.template.json"), "utf8"));
189
+ const flags = parseCreateArgs(io.args.slice(1), manifest);
190
+ const cwd = io.cwd ?? process.cwd();
191
+ const store = profileFile({
192
+ env: io.env ?? process.env,
193
+ platform: io.platform ?? process.platform,
194
+ homedir: io.homedir ?? homedir(),
195
+ });
196
+ if (!flags.nonInteractive && flags.answers.projectName === undefined && !io.prompt) {
197
+ throw new Error("This create run needs answers. Pass --non-interactive or answer the prompts.");
198
+ }
199
+ if (flags.nonInteractive && flags.answers.projectName === undefined) {
200
+ io.stderr("projectName has no default and no flag. Pass --project-name.");
201
+ return exitCodes.failure;
202
+ }
203
+ let profile;
204
+ if (flags.profilePath !== undefined)
205
+ profile = readProfile(flags.profilePath);
206
+ else if (existsSync(store))
207
+ profile = readProfile(store);
208
+ else if (flags.nonInteractive) {
209
+ profile = buildProfile({ preset: "clean", now: io.now ?? new Date().toISOString(), createdWith: io.version });
210
+ }
211
+ else {
212
+ let presetName;
213
+ while (presetName === undefined) {
214
+ const answer = (await ask(io, "Start from a preset: Clean / Classic / Minimal")).toLowerCase();
215
+ if (isPresetName(answer))
216
+ presetName = answer;
217
+ else
218
+ io.stderr("Choose Clean, Classic, or Minimal.");
219
+ }
220
+ const tweaks = {};
221
+ const defaults = PRESET_TWEAKS[presetName];
222
+ for (const tweak of TWEAKS) {
223
+ let value = "";
224
+ while (value === "") {
225
+ const answer = await ask(io, tweak.question);
226
+ value = answer === "" ? defaults[tweak.id] : answer;
227
+ }
228
+ tweaks[tweak.id] = value;
229
+ }
230
+ profile = buildProfile({
231
+ preset: presetName,
232
+ tweaks,
233
+ now: io.now ?? new Date().toISOString(),
234
+ createdWith: io.version,
235
+ });
236
+ writeProfile(store, profile);
237
+ }
238
+ const extra = { packageManager: flags.packageManager };
239
+ for (const option of manifest.options) {
240
+ const applicable = option.when === undefined || evalCond(option.when, flags.answers, extra);
241
+ if (!applicable) {
242
+ if (flags.answers[option.id] === undefined)
243
+ flags.answers[option.id] = null;
244
+ continue;
245
+ }
246
+ if (flags.answers[option.id] !== undefined)
247
+ continue;
248
+ if (flags.nonInteractive) {
249
+ if (option.default === undefined) {
250
+ io.stderr(`${option.id} has no default and no flag. Pass --${flagName(option)}.`);
251
+ return exitCodes.failure;
252
+ }
253
+ flags.answers[option.id] = option.default;
254
+ continue;
255
+ }
256
+ const label = defaultLabel(option);
257
+ const text = label === undefined ? option.label.cli : `${option.label.cli} [${label}]`;
258
+ let accepted = false;
259
+ while (!accepted) {
260
+ const raw = await ask(io, text);
261
+ try {
262
+ if (option.type === "boolean")
263
+ flags.answers[option.id] = parseBooleanAnswer(raw, typeof option.default === "boolean" ? option.default : undefined);
264
+ else if (option.type === "enum")
265
+ flags.answers[option.id] = parseEnumAnswer(option, raw);
266
+ else
267
+ flags.answers[option.id] = parseStringAnswer(option, raw);
268
+ accepted = true;
269
+ }
270
+ catch (error) {
271
+ io.stderr(error instanceof Error ? error.message : String(error));
272
+ }
273
+ }
274
+ }
275
+ const projectName = flags.answers.projectName;
276
+ if (typeof projectName !== "string" || projectName.length === 0) {
277
+ io.stderr("projectName has no default and no flag. Pass --project-name.");
278
+ return exitCodes.failure;
279
+ }
280
+ const outDir = path.resolve(cwd, flags.dir ?? projectName);
281
+ const input = {
282
+ templateDir,
283
+ answers: flags.answers,
284
+ profile,
285
+ outDir,
286
+ packageManager: flags.packageManager,
287
+ styleOverrides: flags.style,
288
+ };
289
+ await renderFromYosrSeed(input, io.renderProject ?? render);
290
+ if (flags.saveProfile) {
291
+ writeProfile(store, JSON.parse(readFileSync(path.join(outDir, ".seed/profile.json"), "utf8")));
292
+ }
293
+ const gate = await (io.runProjectGate ?? runGate)({
294
+ dir: outDir,
295
+ templateDir,
296
+ services: true,
297
+ e2e: flags.e2e,
298
+ quiet: false,
299
+ });
300
+ if (flags.git)
301
+ commitProject(outDir, gate.green ? "Initial commit" : "Initial commit (not green)", io.gitIdentity);
302
+ if (flags.push && gate.green) {
303
+ (io.gh ?? defaultGh)(["repo", "create", projectName, "--source", outDir, "--private", "--push"], outDir);
304
+ }
305
+ else if (flags.push) {
306
+ io.stderr("Not pushed: gate is not green.");
307
+ }
308
+ const relative = path.relative(cwd, outDir);
309
+ io.stdout(`Wrote ${relative.startsWith("..") ? outDir : `./${relative}`}`);
310
+ if (flags.git)
311
+ io.stdout(".git initialized");
312
+ if (!gate.green) {
313
+ io.stderr(gate.banner ?? "NOT GREEN");
314
+ return gate.exitCode;
315
+ }
316
+ io.stdout("Gate green. Exit 0.");
317
+ return exitCodes.ok;
318
+ }
319
+ catch (error) {
320
+ io.stderr(error instanceof RenderError ? error.message : error instanceof Error ? error.message : String(error));
321
+ return exitCodes.failure;
322
+ }
323
+ }
324
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ModelFile, ZoneBounds } from "./types.js";
2
+ /** Engine defaults from template-format §7, plus the manifest protected list. */
3
+ export declare const ENGINE_PROTECTED: string[];
4
+ export declare function normDeltaPath(file: string): string;
5
+ export declare function resolveGlob(glob: string, pathMap: Record<string, string>): string;
6
+ export declare function checkBounds(input: {
7
+ files: ModelFile[];
8
+ dependencies?: string[];
9
+ zone: ZoneBounds;
10
+ protectedGlobs: string[];
11
+ tree: Set<string>;
12
+ previous: Map<string, string>;
13
+ maxChangedLines?: number;
14
+ }): string[];
@@ -0,0 +1,101 @@
1
+ import { globToRegex } from "../render/util.js";
2
+ /** Engine defaults from template-format §7, plus the manifest protected list. */
3
+ export const ENGINE_PROTECTED = [
4
+ "seed.template.json",
5
+ ".seed/**",
6
+ "pnpm-lock.yaml",
7
+ "package-lock.json",
8
+ "yarn.lock",
9
+ "npm-shrinkwrap.json",
10
+ "package.json",
11
+ ".env*",
12
+ ".github/**",
13
+ ];
14
+ export function normDeltaPath(file) {
15
+ return file.split("\\").join("/").replace(/^\.\//, "");
16
+ }
17
+ export function resolveGlob(glob, pathMap) {
18
+ for (const root of Object.keys(pathMap)) {
19
+ if (glob === root || glob.startsWith(`${root}/`))
20
+ return (pathMap[root] ?? "") + glob.slice(root.length);
21
+ }
22
+ return glob;
23
+ }
24
+ function splitLines(content) {
25
+ if (content.length === 0)
26
+ return [];
27
+ const parts = content.split("\n");
28
+ if (parts.at(-1) === "")
29
+ parts.pop();
30
+ return parts;
31
+ }
32
+ function lineDelta(before, after) {
33
+ if (before === undefined)
34
+ return splitLines(after).length;
35
+ const left = new Map();
36
+ for (const line of splitLines(before))
37
+ left.set(line, (left.get(line) ?? 0) + 1);
38
+ let added = 0;
39
+ for (const line of splitLines(after)) {
40
+ const count = left.get(line) ?? 0;
41
+ if (count > 0)
42
+ left.set(line, count - 1);
43
+ else
44
+ added += 1;
45
+ }
46
+ let removed = 0;
47
+ for (const count of left.values())
48
+ removed += count;
49
+ return added + removed;
50
+ }
51
+ function skippedOrFocused(content) {
52
+ return /\.(?:skip|only)\b/.test(content) || /\b(?:xit|fit)\s*\(/.test(content);
53
+ }
54
+ export function checkBounds(input) {
55
+ const errors = [];
56
+ const allowed = [...input.zone.paths.create, ...input.zone.paths.modify];
57
+ const constraints = input.zone.constraints ?? {};
58
+ const changes = input.files.map((file) => ({ path: normDeltaPath(file.path), content: file.content }));
59
+ for (const change of changes) {
60
+ if (input.protectedGlobs.some((glob) => globToRegex(glob).test(change.path)))
61
+ errors.push(`protected path: ${change.path}`);
62
+ if (!allowed.some((glob) => globToRegex(glob).test(change.path)))
63
+ errors.push(`path outside zone ${input.zone.id}: ${change.path}`);
64
+ }
65
+ const maxFiles = constraints.maxFiles;
66
+ if (typeof maxFiles === "number" && changes.length > maxFiles)
67
+ errors.push(`maxFiles ${changes.length} exceeds ${maxFiles}`);
68
+ const maxChangedLines = input.maxChangedLines ?? constraints.maxChangedLines;
69
+ if (typeof maxChangedLines === "number") {
70
+ let lines = 0;
71
+ for (const change of changes) {
72
+ const before = input.tree.has(change.path) ? input.previous.get(change.path) : undefined;
73
+ lines += lineDelta(before, change.content);
74
+ }
75
+ if (lines > maxChangedLines)
76
+ errors.push(`changed lines ${lines} exceed maxChangedLines ${maxChangedLines}`);
77
+ }
78
+ for (const pattern of constraints.forbidPatterns ?? []) {
79
+ const re = new RegExp(pattern);
80
+ for (const change of changes) {
81
+ if (re.test(change.content))
82
+ errors.push(`forbidPatterns matched in ${change.path}`);
83
+ }
84
+ }
85
+ const allow = new Set(constraints.allowDependencies ?? []);
86
+ for (const name of input.dependencies ?? []) {
87
+ if (!allow.has(name))
88
+ errors.push(`dependency not allowed: ${name}`);
89
+ }
90
+ const testPaths = input.zone.tests?.paths ?? [];
91
+ if (input.zone.tests?.required === true && !changes.some((change) => testPaths.some((glob) => globToRegex(glob).test(change.path)))) {
92
+ errors.push("tests.required: no file matches the required test paths");
93
+ }
94
+ for (const change of changes) {
95
+ const inZone = allowed.some((glob) => globToRegex(glob).test(change.path));
96
+ if (inZone && skippedOrFocused(change.content))
97
+ errors.push(`skipped or focused test in ${change.path}`);
98
+ }
99
+ return errors;
100
+ }
101
+ //# sourceMappingURL=bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/delta/bounds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ModelFile, ModelProvider, ZoneBounds } from "./types.js";
2
+ export type DeltaAttempt = {
3
+ n: number;
4
+ detail: string;
5
+ };
6
+ export type FixLoopResult = {
7
+ status: "green" | "not-green";
8
+ fixAttempts: number;
9
+ attempts: DeltaAttempt[];
10
+ gateRan: boolean;
11
+ };
12
+ /**
13
+ * Asks the provider up to maxFixAttempts times.
14
+ * A bounds violation is not written and does not start the gate.
15
+ * The loop stops after the last attempt with not-green when nothing went green.
16
+ */
17
+ export declare function runFixLoop(input: {
18
+ zone: ZoneBounds;
19
+ intent: string;
20
+ prompt: string;
21
+ contextPaths: string[];
22
+ protectedGlobs: string[];
23
+ tree: Set<string>;
24
+ readPrevious: (path: string) => string | undefined;
25
+ writeFiles: (files: ModelFile[]) => void;
26
+ provider: ModelProvider;
27
+ maxFixAttempts: number;
28
+ runGate: (attempt: number, attempts: DeltaAttempt[]) => Promise<{
29
+ green: boolean;
30
+ feedback: string;
31
+ }>;
32
+ }): Promise<FixLoopResult>;
@@ -0,0 +1,51 @@
1
+ import { checkBounds, normDeltaPath } from "./bounds.js";
2
+ /**
3
+ * Asks the provider up to maxFixAttempts times.
4
+ * A bounds violation is not written and does not start the gate.
5
+ * The loop stops after the last attempt with not-green when nothing went green.
6
+ */
7
+ export async function runFixLoop(input) {
8
+ const attempts = [];
9
+ let feedback;
10
+ let gateRan = false;
11
+ for (let n = 1; n <= input.maxFixAttempts; n += 1) {
12
+ const output = await input.provider({
13
+ zoneId: input.zone.id,
14
+ intent: input.intent,
15
+ prompt: input.prompt,
16
+ contextPaths: input.contextPaths,
17
+ ...(feedback !== undefined ? { feedback } : {}),
18
+ });
19
+ const previous = new Map();
20
+ for (const file of output.files) {
21
+ const rel = normDeltaPath(file.path);
22
+ const before = input.readPrevious(rel);
23
+ if (before !== undefined)
24
+ previous.set(rel, before);
25
+ }
26
+ const errors = checkBounds({
27
+ files: output.files,
28
+ ...(output.dependencies !== undefined ? { dependencies: output.dependencies } : {}),
29
+ zone: input.zone,
30
+ protectedGlobs: input.protectedGlobs,
31
+ tree: input.tree,
32
+ previous,
33
+ });
34
+ if (errors.length > 0) {
35
+ attempts.push({ n, detail: `bounds rejected: ${errors.join("; ")}` });
36
+ feedback = errors.join("; ");
37
+ continue;
38
+ }
39
+ input.writeFiles(output.files);
40
+ gateRan = true;
41
+ const gate = await input.runGate(n, attempts);
42
+ if (gate.green) {
43
+ attempts.push({ n, detail: "bounds passed" });
44
+ return { status: "green", fixAttempts: n, attempts, gateRan };
45
+ }
46
+ feedback = gate.feedback || "gate not green";
47
+ attempts.push({ n, detail: `gate not green: ${feedback}` });
48
+ }
49
+ return { status: "not-green", fixAttempts: attempts.length, attempts, gateRan };
50
+ }
51
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/delta/loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYzD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAYhC;IACC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;YAClC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAChE,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ModelProvider } from "./types.js";
2
+ /** Reads a recorded fixture from disk. It does not call a network. */
3
+ export declare function recordedProvider(fixturePath: string): ModelProvider;
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from "node:fs";
2
+ /** Reads a recorded fixture from disk. It does not call a network. */
3
+ export function recordedProvider(fixturePath) {
4
+ let call = 0;
5
+ return () => {
6
+ const fixture = JSON.parse(readFileSync(fixturePath, "utf8"));
7
+ const attempts = fixture.attempts ?? [];
8
+ const output = attempts[Math.min(call, attempts.length - 1)];
9
+ if (output === undefined)
10
+ throw new Error(`${fixturePath} has no attempts`);
11
+ call += 1;
12
+ return Promise.resolve(output);
13
+ };
14
+ }
15
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/delta/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,EAAE;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAiC,CAAC;QAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,kBAAkB,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,CAAC;QACV,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}