yosr-seed 0.2.3 → 0.2.5
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 +28 -0
- package/README.md +2 -1
- package/dist/adopt.d.ts +6 -0
- package/dist/adopt.js +430 -0
- package/dist/adopt.js.map +1 -0
- package/dist/create.js +39 -3
- package/dist/create.js.map +1 -1
- package/dist/doctor.js +42 -2
- package/dist/doctor.js.map +1 -1
- package/dist/engine/ci/apply.d.ts +4 -0
- package/dist/engine/ci/apply.js +8 -1
- package/dist/engine/ci/apply.js.map +1 -1
- package/dist/engine/ci/content.d.ts +1 -1
- package/dist/engine/ci/content.js +20 -0
- package/dist/engine/ci/content.js.map +1 -1
- package/dist/engine/gate/run.d.ts +61 -1
- package/dist/engine/gate/run.js +305 -32
- package/dist/engine/gate/run.js.map +1 -1
- package/dist/engine/index.d.ts +9 -6
- package/dist/engine/index.js +7 -4
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/render/lockfile.js +1 -0
- package/dist/engine/render/lockfile.js.map +1 -1
- package/dist/engine/render/package-manager.d.ts +21 -0
- package/dist/engine/render/package-manager.js +75 -1
- package/dist/engine/render/package-manager.js.map +1 -1
- package/dist/engine/render/render.d.ts +1 -1
- package/dist/engine/render/render.js +44 -8
- package/dist/engine/render/render.js.map +1 -1
- package/dist/engine/render/types.d.ts +5 -1
- package/dist/gate.js +68 -12
- package/dist/gate.js.map +1 -1
- package/dist/help.js +24 -2
- package/dist/help.js.map +1 -1
- package/dist/preflight.d.ts +15 -1
- package/dist/preflight.js +43 -5
- package/dist/preflight.js.map +1 -1
- package/dist/run.js +6 -0
- package/dist/run.js.map +1 -1
- package/dist/schemas/seed.answers.schema.json +8 -1
- package/dist/schemas/seed.template.schema.json +12 -2
- package/dist/templates.d.ts +1 -1
- package/dist/templates.js +24 -0
- package/dist/templates.js.map +1 -1
- package/dist/upgrade.d.ts +35 -0
- package/dist/upgrade.js +390 -0
- package/dist/upgrade.js.map +1 -0
- package/package.json +10 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# yosr-seed
|
|
2
2
|
|
|
3
|
+
## 0.2.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 63badc9: Add the ASP.NET Core API template (`--template dotnet`, ADR 0026): .NET 10 LTS, minimal API, xUnit + WebApplicationFactory, locked NuGet restore with committed `packages.lock.json` and `global.json`, notes API, database none/Postgres (EF Core + Npgsql), API-key auth, multi-stage non-root Docker. Engine gains `engines.dotnet` / package manager `dotnet` (and the same shape for later `engines.java` / `maven`). Joins the Yosr Seed fixed group.
|
|
8
|
+
- 11f252b: Add Spring Boot template-spring (ADR 0027): Java 25, Maven locked resolve, optional JPA Postgres.
|
|
9
|
+
- Updated dependencies [63badc9]
|
|
10
|
+
- Updated dependencies [11f252b]
|
|
11
|
+
- @yosr-ai/template-dotnet@0.2.5
|
|
12
|
+
- @yosr-ai/template-next-fullstack@0.2.5
|
|
13
|
+
- @yosr-ai/template-fastapi@0.2.5
|
|
14
|
+
- @yosr-ai/template-hono@0.2.5
|
|
15
|
+
- @yosr-ai/template-vite-react@0.2.5
|
|
16
|
+
- @yosr-ai/template-astro-site@0.2.5
|
|
17
|
+
- @yosr-ai/template-spring@0.2.5
|
|
18
|
+
|
|
19
|
+
## 0.2.4
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- ADR 0025 §2–§3: `yosr-seed upgrade` (report-only) and `yosr-seed adopt` (rulebook + adopted `.seed/` record). Creates write `origin: "created"`. No auto-apply, no architecture assessment.
|
|
24
|
+
- Updated dependencies
|
|
25
|
+
- @yosr-ai/template-next-fullstack@0.2.4
|
|
26
|
+
- @yosr-ai/template-fastapi@0.2.4
|
|
27
|
+
- @yosr-ai/template-hono@0.2.4
|
|
28
|
+
- @yosr-ai/template-vite-react@0.2.4
|
|
29
|
+
- @yosr-ai/template-astro-site@0.2.4
|
|
30
|
+
|
|
3
31
|
## 0.2.3
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@ Templates:
|
|
|
7
7
|
- `next-fullstack` (`@yosr-ai/template-next-fullstack`, the default) — Next.js full-stack
|
|
8
8
|
- `hono` (`@yosr-ai/template-hono`) — API-only Hono on Node.js 24
|
|
9
9
|
- `fastapi` (`@yosr-ai/template-fastapi`) — API-only FastAPI on Python 3.12+
|
|
10
|
+
- `dotnet` (`@yosr-ai/template-dotnet`) — API-only ASP.NET Core on .NET 10
|
|
10
11
|
- `vite-react` (`@yosr-ai/template-vite-react`) — Web app (Vite + React) static SPA
|
|
11
12
|
- `astro-site` (`@yosr-ai/template-astro-site`) — Website (Astro) content-first static site
|
|
12
13
|
|
|
@@ -85,7 +86,7 @@ Style presets (Clean / Classic / Minimal) and tweaks shape layout, formatting, a
|
|
|
85
86
|
| `create-yosr-seed [dir]` | Same as `yosr-seed create` |
|
|
86
87
|
| `yosr-seed doctor` | Preflight checks and copy-paste versions |
|
|
87
88
|
| `yosr-seed info` | Inside a generated project: setup choices, create versions, tracked-file drift |
|
|
88
|
-
| `yosr-seed gate [dir] [--e2e] [--image]` | Inside a generated project: run its checks again |
|
|
89
|
+
| `yosr-seed gate [dir] [--e2e] [--image] [--database-url <url>] [--mongodb-uri <uri>]` | Inside a generated project: run its checks again (optional throwaway DB URL instead of Docker) |
|
|
89
90
|
| `yosr-seed profile` | TTY menu for named profiles; pipe prints usage |
|
|
90
91
|
| `yosr-seed profile list` | List names; mark the default |
|
|
91
92
|
| `yosr-seed profile show [name]` | Print a style profile |
|
package/dist/adopt.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CliIo } from "./run.js";
|
|
2
|
+
/**
|
|
3
|
+
* Add the Yosr Seed rulebook + adopted `.seed/` record to an existing repo (ADR 0025 §3).
|
|
4
|
+
* Always previews (including one gate run) before writing Yosr Seed files.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runAdopt(io: CliIo): Promise<number>;
|
package/dist/adopt.js
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { buildProfile, copilotInstructions, exitCodes, geminiMd, render, RenderError, runGate, templateSource, validateAnswers, } from "./engine/index.js";
|
|
6
|
+
import { dotnetCheck, javaCheck, liveProbe, packageManagerCheck, pythonCheck, } from "./preflight.js";
|
|
7
|
+
import { isTemplateId, loadTemplateManifest, templateDir, templatePackageVersion, TEMPLATE_IDS, } from "./templates.js";
|
|
8
|
+
const RULEBOOK_PATHS = [
|
|
9
|
+
"AGENTS.md",
|
|
10
|
+
"CLAUDE.md",
|
|
11
|
+
"GEMINI.md",
|
|
12
|
+
".github/copilot-instructions.md",
|
|
13
|
+
];
|
|
14
|
+
const USAGE = "Usage: yosr-seed adopt [dir] --template <next-fullstack|fastapi|hono|vite-react|astro-site|dotnet|spring> [--package-manager pnpm|npm|uv|dotnet|maven] [--yes]";
|
|
15
|
+
function sha256Text(content) {
|
|
16
|
+
return createHash("sha256").update(content).digest("hex");
|
|
17
|
+
}
|
|
18
|
+
function parseFlags(args) {
|
|
19
|
+
let dir;
|
|
20
|
+
let template;
|
|
21
|
+
let packageManager;
|
|
22
|
+
let yes = false;
|
|
23
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
24
|
+
const arg = args[i];
|
|
25
|
+
if (arg === "--yes" || arg === "-y") {
|
|
26
|
+
yes = true;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (arg === "--template") {
|
|
30
|
+
const value = args[i + 1];
|
|
31
|
+
if (value === undefined || value.startsWith("--")) {
|
|
32
|
+
return { error: USAGE };
|
|
33
|
+
}
|
|
34
|
+
template = value;
|
|
35
|
+
i += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (arg.startsWith("--template=")) {
|
|
39
|
+
template = arg.slice("--template=".length);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (arg === "--package-manager") {
|
|
43
|
+
const value = args[i + 1];
|
|
44
|
+
if (value === undefined || value.startsWith("--")) {
|
|
45
|
+
return { error: USAGE };
|
|
46
|
+
}
|
|
47
|
+
if (value !== "pnpm" && value !== "npm" && value !== "uv") {
|
|
48
|
+
return { error: `Unknown package manager ${JSON.stringify(value)}.` };
|
|
49
|
+
}
|
|
50
|
+
packageManager = value;
|
|
51
|
+
i += 1;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (arg.startsWith("--package-manager=")) {
|
|
55
|
+
const value = arg.slice("--package-manager=".length);
|
|
56
|
+
if (value !== "pnpm" && value !== "npm" && value !== "uv") {
|
|
57
|
+
return { error: `Unknown package manager ${JSON.stringify(value)}.` };
|
|
58
|
+
}
|
|
59
|
+
packageManager = value;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (arg.startsWith("--"))
|
|
63
|
+
return { error: USAGE };
|
|
64
|
+
if (dir !== undefined)
|
|
65
|
+
return { error: USAGE };
|
|
66
|
+
dir = arg;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
dir: dir ?? ".",
|
|
70
|
+
...(template !== undefined ? { template } : {}),
|
|
71
|
+
...(packageManager !== undefined ? { packageManager } : {}),
|
|
72
|
+
yes,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function defaultPackageManager(template) {
|
|
76
|
+
if (template === "fastapi")
|
|
77
|
+
return "uv";
|
|
78
|
+
if (template === "dotnet")
|
|
79
|
+
return "dotnet";
|
|
80
|
+
if (template === "spring")
|
|
81
|
+
return "maven";
|
|
82
|
+
return "pnpm";
|
|
83
|
+
}
|
|
84
|
+
function lockfileName(pm) {
|
|
85
|
+
if (pm === "pnpm")
|
|
86
|
+
return "pnpm-lock.yaml";
|
|
87
|
+
if (pm === "npm")
|
|
88
|
+
return "package-lock.json";
|
|
89
|
+
if (pm === "uv")
|
|
90
|
+
return "uv.lock";
|
|
91
|
+
if (pm === "dotnet")
|
|
92
|
+
return "packages.lock.json";
|
|
93
|
+
return "pom.xml";
|
|
94
|
+
}
|
|
95
|
+
function foreignLockfiles(root, chosen) {
|
|
96
|
+
const found = [];
|
|
97
|
+
for (const pm of ["pnpm", "npm", "uv", "dotnet", "maven"]) {
|
|
98
|
+
if (pm === chosen)
|
|
99
|
+
continue;
|
|
100
|
+
const name = lockfileName(pm);
|
|
101
|
+
if (existsSync(path.join(root, name)))
|
|
102
|
+
found.push(name);
|
|
103
|
+
}
|
|
104
|
+
return found;
|
|
105
|
+
}
|
|
106
|
+
function claudePointer() {
|
|
107
|
+
return `@AGENTS.md\n\n<!-- Claude Code imports AGENTS.md above. Add Claude-specific notes below. -->\n`;
|
|
108
|
+
}
|
|
109
|
+
async function agentsFromTemplate(templateId, engineVersion, packageManager, projectName) {
|
|
110
|
+
const tempRoot = mkdtempSync(path.join(tmpdir(), "yosr-adopt-agents-"));
|
|
111
|
+
const outDir = path.join(tempRoot, "out");
|
|
112
|
+
try {
|
|
113
|
+
await render({
|
|
114
|
+
templateDir: templateDir(templateId),
|
|
115
|
+
engineVersion,
|
|
116
|
+
answers: { projectName },
|
|
117
|
+
profile: buildProfile({
|
|
118
|
+
preset: "clean",
|
|
119
|
+
now: "2026-11-10T00:00:00.000Z",
|
|
120
|
+
createdWith: "yosr-seed adopt",
|
|
121
|
+
}),
|
|
122
|
+
outDir,
|
|
123
|
+
packageManager,
|
|
124
|
+
});
|
|
125
|
+
const agentsPath = path.join(outDir, "AGENTS.md");
|
|
126
|
+
if (!existsSync(agentsPath)) {
|
|
127
|
+
throw new Error(`Template ${templateId} did not produce AGENTS.md for adopt.`);
|
|
128
|
+
}
|
|
129
|
+
return readFileSync(agentsPath, "utf8");
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function plannedRulebook(templateId, engineVersion, packageManager, projectName) {
|
|
136
|
+
const agents = await agentsFromTemplate(templateId, engineVersion, packageManager, projectName);
|
|
137
|
+
return {
|
|
138
|
+
"AGENTS.md": agents,
|
|
139
|
+
"CLAUDE.md": claudePointer(),
|
|
140
|
+
"GEMINI.md": geminiMd(),
|
|
141
|
+
".github/copilot-instructions.md": copilotInstructions(),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function lastLines(text) {
|
|
145
|
+
const lines = text.split("\n").filter((line) => line.trim().length > 0);
|
|
146
|
+
return lines.slice(-15).join("\n");
|
|
147
|
+
}
|
|
148
|
+
function printGateSteps(io, gate) {
|
|
149
|
+
for (const step of gate.steps) {
|
|
150
|
+
const seconds = step.durationSec !== undefined ? ` ${step.durationSec}s` : "";
|
|
151
|
+
const mark = step.result === "passed"
|
|
152
|
+
? "ok "
|
|
153
|
+
: step.result === "skipped"
|
|
154
|
+
? "skip"
|
|
155
|
+
: "fail";
|
|
156
|
+
io.stdout(`${mark} ${step.id}${seconds}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function askYesNo(io, question, defaultYes) {
|
|
160
|
+
if (io.interactive) {
|
|
161
|
+
const answer = await io.interactive.confirm({
|
|
162
|
+
kind: "confirm",
|
|
163
|
+
message: question,
|
|
164
|
+
initialValue: defaultYes,
|
|
165
|
+
});
|
|
166
|
+
if (io.interactive.isCancel(answer))
|
|
167
|
+
return "cancel";
|
|
168
|
+
return answer;
|
|
169
|
+
}
|
|
170
|
+
if (io.prompt) {
|
|
171
|
+
const hint = defaultYes ? "Y/n" : "y/N";
|
|
172
|
+
const answer = String(await io.prompt(`${question} (${hint}) `)).trim();
|
|
173
|
+
if (answer.length === 0)
|
|
174
|
+
return defaultYes;
|
|
175
|
+
return /^(y|yes)$/i.test(answer);
|
|
176
|
+
}
|
|
177
|
+
return defaultYes;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Add the Yosr Seed rulebook + adopted `.seed/` record to an existing repo (ADR 0025 §3).
|
|
181
|
+
* Always previews (including one gate run) before writing Yosr Seed files.
|
|
182
|
+
*/
|
|
183
|
+
export async function runAdopt(io) {
|
|
184
|
+
const parsed = parseFlags(io.args.slice(1));
|
|
185
|
+
if ("error" in parsed) {
|
|
186
|
+
io.stderr(parsed.error);
|
|
187
|
+
return exitCodes.failure;
|
|
188
|
+
}
|
|
189
|
+
const root = path.resolve(io.cwd ?? process.cwd(), parsed.dir);
|
|
190
|
+
if (!existsSync(root) || !statSync(root).isDirectory()) {
|
|
191
|
+
io.stderr(`Directory not found: ${root}`);
|
|
192
|
+
return exitCodes.failure;
|
|
193
|
+
}
|
|
194
|
+
if (existsSync(path.join(root, ".seed"))) {
|
|
195
|
+
io.stderr("This folder already has a .seed/ record. Adopt refuses to run when .seed/ exists.");
|
|
196
|
+
return exitCodes.failure;
|
|
197
|
+
}
|
|
198
|
+
let templateId;
|
|
199
|
+
if (parsed.template !== undefined) {
|
|
200
|
+
if (!isTemplateId(parsed.template)) {
|
|
201
|
+
io.stderr(`Unknown template ${JSON.stringify(parsed.template)}. Choose one of: ${TEMPLATE_IDS.join(", ")}.`);
|
|
202
|
+
return exitCodes.failure;
|
|
203
|
+
}
|
|
204
|
+
templateId = parsed.template;
|
|
205
|
+
}
|
|
206
|
+
else if (io.interactive) {
|
|
207
|
+
const picked = await io.interactive.select({
|
|
208
|
+
kind: "select",
|
|
209
|
+
message: "Template to adopt as",
|
|
210
|
+
options: TEMPLATE_IDS.map((id) => ({ value: id, label: id })),
|
|
211
|
+
initialValue: TEMPLATE_IDS[0],
|
|
212
|
+
line: "choices",
|
|
213
|
+
});
|
|
214
|
+
if (io.interactive.isCancel(picked) || !isTemplateId(picked)) {
|
|
215
|
+
io.stderr("Adopt cancelled.");
|
|
216
|
+
return exitCodes.failure;
|
|
217
|
+
}
|
|
218
|
+
templateId = picked;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
io.stderr("Pass --template <next-fullstack|fastapi|hono|vite-react|astro-site> (adopt does not detect the stack).");
|
|
222
|
+
return exitCodes.failure;
|
|
223
|
+
}
|
|
224
|
+
const packageManager = parsed.packageManager ?? defaultPackageManager(templateId);
|
|
225
|
+
const manifest = loadTemplateManifest(templateId);
|
|
226
|
+
const shippedVersion = templatePackageVersion(templateId);
|
|
227
|
+
const tdir = templateDir(templateId);
|
|
228
|
+
for (const foreign of foreignLockfiles(root, packageManager)) {
|
|
229
|
+
io.stdout(`Warning: found ${foreign} while using ${packageManager}. Pass --package-manager if you meant a different manager.`);
|
|
230
|
+
}
|
|
231
|
+
const probe = io.probe ?? liveProbe();
|
|
232
|
+
const checks = [packageManagerCheck(packageManager, probe)];
|
|
233
|
+
if (manifest.engines.python !== undefined) {
|
|
234
|
+
checks.push(pythonCheck(manifest.engines.python, probe));
|
|
235
|
+
}
|
|
236
|
+
if (manifest.engines.dotnet !== undefined) {
|
|
237
|
+
checks.push(dotnetCheck(manifest.engines.dotnet, probe));
|
|
238
|
+
}
|
|
239
|
+
if (manifest.engines.java !== undefined) {
|
|
240
|
+
checks.push(javaCheck(manifest.engines.java, probe));
|
|
241
|
+
}
|
|
242
|
+
const missing = checks.filter((check) => !check.ok);
|
|
243
|
+
if (missing.length > 0) {
|
|
244
|
+
for (const check of missing)
|
|
245
|
+
io.stderr(check.line);
|
|
246
|
+
return exitCodes.failure;
|
|
247
|
+
}
|
|
248
|
+
io.stdout("Yosr Seed adopt preview");
|
|
249
|
+
io.stdout(`Template ${templateId}@${shippedVersion}`);
|
|
250
|
+
io.stdout(`Package manager ${packageManager}`);
|
|
251
|
+
io.stdout("");
|
|
252
|
+
io.stdout("Rulebook files");
|
|
253
|
+
const projectName = path.basename(root);
|
|
254
|
+
let planned;
|
|
255
|
+
try {
|
|
256
|
+
planned = await plannedRulebook(templateId, io.version, packageManager, projectName);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
const message = error instanceof RenderError || error instanceof Error
|
|
260
|
+
? error.message
|
|
261
|
+
: String(error);
|
|
262
|
+
io.stderr(`Could not build the rulebook from folder name ${JSON.stringify(projectName)}.\n${message}`);
|
|
263
|
+
return exitCodes.failure;
|
|
264
|
+
}
|
|
265
|
+
const existing = [];
|
|
266
|
+
const missingPaths = [];
|
|
267
|
+
for (const rel of RULEBOOK_PATHS) {
|
|
268
|
+
if (existsSync(path.join(root, rel))) {
|
|
269
|
+
existing.push(rel);
|
|
270
|
+
io.stdout(` keep (exists): ${rel}`);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
missingPaths.push(rel);
|
|
274
|
+
io.stdout(` add: ${rel}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const reportTempDir = mkdtempSync(path.join(tmpdir(), "yosr-adopt-report-"));
|
|
278
|
+
const reportTemp = path.join(reportTempDir, "report.md");
|
|
279
|
+
const ephemeralAnswers = {
|
|
280
|
+
packageManager,
|
|
281
|
+
options: {},
|
|
282
|
+
files: {},
|
|
283
|
+
style: { applied: {} },
|
|
284
|
+
};
|
|
285
|
+
io.stdout("");
|
|
286
|
+
io.stdout("Gate preview (may write node_modules / .venv / caches, and a lockfile if none exists; not .seed/)");
|
|
287
|
+
const gate = await (io.runProjectGate ?? runGate)({
|
|
288
|
+
dir: root,
|
|
289
|
+
templateDir: tdir,
|
|
290
|
+
services: true,
|
|
291
|
+
e2e: false,
|
|
292
|
+
image: false,
|
|
293
|
+
quiet: true,
|
|
294
|
+
answers: ephemeralAnswers,
|
|
295
|
+
persistAnswers: false,
|
|
296
|
+
reportPath: reportTemp,
|
|
297
|
+
lockedInstall: true,
|
|
298
|
+
});
|
|
299
|
+
if (gate.installCommand) {
|
|
300
|
+
io.stdout(`Install command: ${gate.installCommand}`);
|
|
301
|
+
}
|
|
302
|
+
printGateSteps(io, gate);
|
|
303
|
+
if (!gate.green) {
|
|
304
|
+
const failed = gate.steps.find((step) => step.result === "failed" || step.result === "timed-out");
|
|
305
|
+
if (failed?.excerpt)
|
|
306
|
+
io.stderr(lastLines(failed.excerpt));
|
|
307
|
+
for (const problem of gate.problems)
|
|
308
|
+
io.stderr(problem);
|
|
309
|
+
io.stdout("Gate would be red today.");
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
io.stdout(`Tests: ${gate.testCount}`);
|
|
313
|
+
io.stdout("Gate would be green today.");
|
|
314
|
+
}
|
|
315
|
+
io.stdout("Preview writes no Yosr Seed files (.seed/ and rulebook paths untouched).");
|
|
316
|
+
if (!parsed.yes) {
|
|
317
|
+
// TTY only. Pipes and CI must pass --yes (line prompts would hang).
|
|
318
|
+
if (io.interactive) {
|
|
319
|
+
const answer = await askYesNo(io, "Apply adopt (write missing rulebook files + .seed/)?", false);
|
|
320
|
+
if (answer === "cancel" || answer === false) {
|
|
321
|
+
io.stdout("Adopt cancelled. Nothing written.");
|
|
322
|
+
rmSync(reportTempDir, { recursive: true, force: true });
|
|
323
|
+
return exitCodes.ok;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
io.stdout("Pass --yes to apply. Existing rulebook files are kept.");
|
|
328
|
+
rmSync(reportTempDir, { recursive: true, force: true });
|
|
329
|
+
return exitCodes.ok;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const overwrite = new Set();
|
|
333
|
+
if (!parsed.yes && io.interactive) {
|
|
334
|
+
for (const rel of existing) {
|
|
335
|
+
const replace = await askYesNo(io, `Overwrite existing ${rel}?`, false);
|
|
336
|
+
if (replace === "cancel") {
|
|
337
|
+
io.stdout("Adopt cancelled. Nothing written.");
|
|
338
|
+
rmSync(reportTempDir, { recursive: true, force: true });
|
|
339
|
+
return exitCodes.ok;
|
|
340
|
+
}
|
|
341
|
+
if (replace)
|
|
342
|
+
overwrite.add(rel);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
const toWrite = [...missingPaths, ...overwrite];
|
|
346
|
+
try {
|
|
347
|
+
const written = {};
|
|
348
|
+
for (const rel of toWrite) {
|
|
349
|
+
written[rel] = {
|
|
350
|
+
owner: "template",
|
|
351
|
+
sha256: sha256Text(planned[rel]),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
const profile = buildProfile({
|
|
355
|
+
preset: "clean",
|
|
356
|
+
now: new Date().toISOString(),
|
|
357
|
+
createdWith: "yosr-seed adopt",
|
|
358
|
+
});
|
|
359
|
+
const profileJson = `${JSON.stringify(profile, null, 2)}\n`;
|
|
360
|
+
written[".seed/profile.json"] = {
|
|
361
|
+
owner: "template",
|
|
362
|
+
sha256: sha256Text(profileJson),
|
|
363
|
+
};
|
|
364
|
+
const reportBody = readFileSync(reportTemp);
|
|
365
|
+
written[".seed/report.md"] = {
|
|
366
|
+
owner: "template",
|
|
367
|
+
sha256: sha256Text(reportBody),
|
|
368
|
+
};
|
|
369
|
+
const answers = {
|
|
370
|
+
lockVersion: 1,
|
|
371
|
+
engine: io.version,
|
|
372
|
+
origin: "adopted",
|
|
373
|
+
template: {
|
|
374
|
+
name: templateId,
|
|
375
|
+
version: shippedVersion,
|
|
376
|
+
source: templateSource(tdir),
|
|
377
|
+
},
|
|
378
|
+
packageManager,
|
|
379
|
+
options: {},
|
|
380
|
+
style: {
|
|
381
|
+
profileVersion: profile.profileVersion,
|
|
382
|
+
snapshot: ".seed/profile.json",
|
|
383
|
+
applied: {},
|
|
384
|
+
},
|
|
385
|
+
features: [],
|
|
386
|
+
files: written,
|
|
387
|
+
gate: {
|
|
388
|
+
status: gate.green ? "green" : "not-green",
|
|
389
|
+
location: "local",
|
|
390
|
+
fixAttempts: 0,
|
|
391
|
+
report: ".seed/report.md",
|
|
392
|
+
steps: gate.steps.map((step) => ({
|
|
393
|
+
id: step.id,
|
|
394
|
+
required: step.required,
|
|
395
|
+
result: step.result,
|
|
396
|
+
...(step.durationSec !== undefined
|
|
397
|
+
? { durationSec: step.durationSec }
|
|
398
|
+
: {}),
|
|
399
|
+
})),
|
|
400
|
+
},
|
|
401
|
+
};
|
|
402
|
+
try {
|
|
403
|
+
validateAnswers(answers, ".seed/answers.json");
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
const message = error instanceof RenderError || error instanceof Error
|
|
407
|
+
? error.message
|
|
408
|
+
: String(error);
|
|
409
|
+
io.stderr(`Adopt record is invalid; nothing written.\n${message}`);
|
|
410
|
+
return exitCodes.failure;
|
|
411
|
+
}
|
|
412
|
+
for (const rel of toWrite) {
|
|
413
|
+
const dest = path.join(root, rel);
|
|
414
|
+
mkdirSync(path.dirname(dest), { recursive: true });
|
|
415
|
+
writeFileSync(dest, planned[rel]);
|
|
416
|
+
}
|
|
417
|
+
mkdirSync(path.join(root, ".seed"), { recursive: true });
|
|
418
|
+
writeFileSync(path.join(root, ".seed", "profile.json"), profileJson);
|
|
419
|
+
copyFileSync(reportTemp, path.join(root, ".seed", "report.md"));
|
|
420
|
+
writeFileSync(path.join(root, ".seed", "answers.json"), `${JSON.stringify(answers, null, 2)}\n`);
|
|
421
|
+
io.stdout(gate.green
|
|
422
|
+
? "Adopted. .seed/ written with origin adopted. Gate was green at preview."
|
|
423
|
+
: "Adopted. .seed/ written with origin adopted. Gate was red at preview — fix and re-run yosr-seed gate.");
|
|
424
|
+
return exitCodes.ok;
|
|
425
|
+
}
|
|
426
|
+
finally {
|
|
427
|
+
rmSync(reportTempDir, { recursive: true, force: true });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=adopt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.js","sourceRoot":"","sources":["../src/adopt.ts"],"names":[],"mappings":"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"}
|
package/dist/create.js
CHANGED
|
@@ -4,7 +4,7 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { PRESET_TWEAKS, PROFILE_PATH_DEPRECATION, RenderError, buildProfile, defaultProfileName, evalCond, exitCodes, ignoredTweaks, isPresetName, isProfilePathArg, isTweakId, listProfileNames, migrateProfileStore, namedProfileFile, readProfile, render, resolveNamedProfile, runGate, setDefaultProfile, writeProfile, } from "./engine/index.js";
|
|
6
6
|
import { savedStyleLabels } from "./labels.js";
|
|
7
|
-
import { folderCheck, gitCheck, liveProbe, nodeCheck, packageManagerCheck, pythonCheck, } from "./preflight.js";
|
|
7
|
+
import { folderCheck, gitCheck, liveProbe, nodeCheck, dotnetCheck, javaCheck, packageManagerCheck, pythonCheck, } from "./preflight.js";
|
|
8
8
|
import { TWEAKS, lineQuestion, optionPrompt, presetPrompt, tweakPrompt, } from "./prompts.js";
|
|
9
9
|
import { renderFromYosrSeed } from "./run.js";
|
|
10
10
|
import { DEFAULT_TEMPLATE, TEMPLATES, TEMPLATE_IDS, isTemplateId, loadTemplateManifest, templateChoices, templateDir as installedTemplatePath, } from "./templates.js";
|
|
@@ -112,6 +112,10 @@ function parseCreateArgs(args, manifest) {
|
|
|
112
112
|
parsed.git = false;
|
|
113
113
|
else if (name === "push")
|
|
114
114
|
parsed.push = true;
|
|
115
|
+
else if (name === "database-url")
|
|
116
|
+
parsed.databaseUrl = takeValue(inline, rest, name);
|
|
117
|
+
else if (name === "mongodb-uri")
|
|
118
|
+
parsed.mongodbUri = takeValue(inline, rest, name);
|
|
115
119
|
else if (name === "package-manager") {
|
|
116
120
|
const value = takeValue(inline, rest, name);
|
|
117
121
|
const manager = managers.find((item) => item === value);
|
|
@@ -148,6 +152,11 @@ function parseCreateArgs(args, manifest) {
|
|
|
148
152
|
throw new Error("--push needs a green gate. Omit --no-gate.");
|
|
149
153
|
if (parsed.noGate && parsed.saveProfile)
|
|
150
154
|
throw new Error("--save-profile needs a green gate. Omit --no-gate.");
|
|
155
|
+
if (parsed.databaseUrl !== undefined && parsed.mongodbUri !== undefined)
|
|
156
|
+
throw new Error("Pass only one of --database-url or --mongodb-uri.");
|
|
157
|
+
if (parsed.noGate &&
|
|
158
|
+
(parsed.databaseUrl !== undefined || parsed.mongodbUri !== undefined))
|
|
159
|
+
throw new Error("--database-url / --mongodb-uri need the gate. Omit --no-gate.");
|
|
151
160
|
return parsed;
|
|
152
161
|
}
|
|
153
162
|
function parseBooleanAnswer(raw, fallback) {
|
|
@@ -426,10 +435,14 @@ export async function runCreate(io) {
|
|
|
426
435
|
const now = io.now ?? new Date().toISOString();
|
|
427
436
|
const probe = io.probe ?? liveProbe();
|
|
428
437
|
const python = manifest.engines.python;
|
|
438
|
+
const dotnet = manifest.engines.dotnet;
|
|
439
|
+
const java = manifest.engines.java;
|
|
429
440
|
const preflight = [
|
|
430
441
|
nodeCheck(io.nodeVersion),
|
|
431
442
|
packageManagerCheck(flags.packageManager, probe),
|
|
432
443
|
...(python !== undefined ? [pythonCheck(python, probe)] : []),
|
|
444
|
+
...(dotnet !== undefined ? [dotnetCheck(dotnet, probe)] : []),
|
|
445
|
+
...(java !== undefined ? [javaCheck(java, probe)] : []),
|
|
433
446
|
gitCheck(flags.git, probe, io.gitIdentity),
|
|
434
447
|
];
|
|
435
448
|
const knownDir = flags.dir ??
|
|
@@ -861,7 +874,9 @@ export async function runCreate(io) {
|
|
|
861
874
|
? "npm run dev"
|
|
862
875
|
: flags.packageManager === "uv"
|
|
863
876
|
? "uv run dev"
|
|
864
|
-
:
|
|
877
|
+
: flags.packageManager === "dotnet"
|
|
878
|
+
? "dotnet run --project src/App"
|
|
879
|
+
: "pnpm dev";
|
|
865
880
|
const createdHere = !existsSync(outDir);
|
|
866
881
|
const finishCancel = () => {
|
|
867
882
|
if (createdHere && existsSync(outDir)) {
|
|
@@ -906,7 +921,9 @@ export async function runCreate(io) {
|
|
|
906
921
|
spin?.stop(`Rendered ${secondsSince(renderStarted)}`);
|
|
907
922
|
const ignored = rendered.ignored ?? [];
|
|
908
923
|
if (ignored.length > 0) {
|
|
909
|
-
const line = manifest.stack?.framework === "hono"
|
|
924
|
+
const line = manifest.stack?.framework === "hono" ||
|
|
925
|
+
manifest.engines.dotnet !== undefined ||
|
|
926
|
+
manifest.engines.java !== undefined
|
|
910
927
|
? `Style: ${ignored.length} profile settings this template ignores (for example Next.js-only lint) were skipped.`
|
|
911
928
|
: `Style: ${ignored.length} profile settings for TypeScript and front-end code do not apply to ${manifest.name}; skipped.`;
|
|
912
929
|
if (session)
|
|
@@ -935,6 +952,15 @@ export async function runCreate(io) {
|
|
|
935
952
|
};
|
|
936
953
|
}
|
|
937
954
|
else {
|
|
955
|
+
const databaseChoice = typeof flags.answers.database === "string"
|
|
956
|
+
? flags.answers.database
|
|
957
|
+
: undefined;
|
|
958
|
+
if (flags.databaseUrl !== undefined && databaseChoice !== "postgres") {
|
|
959
|
+
throw new Error("--database-url is only for Postgres projects. Pass --database postgres or omit --database-url.");
|
|
960
|
+
}
|
|
961
|
+
if (flags.mongodbUri !== undefined && databaseChoice !== "mongodb") {
|
|
962
|
+
throw new Error("--mongodb-uri is only for MongoDB projects. Pass --database mongodb or omit --mongodb-uri.");
|
|
963
|
+
}
|
|
938
964
|
const gateOptions = {
|
|
939
965
|
dir: outDir,
|
|
940
966
|
templateDir,
|
|
@@ -942,6 +968,12 @@ export async function runCreate(io) {
|
|
|
942
968
|
e2e: flags.e2e,
|
|
943
969
|
quiet: session !== undefined,
|
|
944
970
|
shouldStop: () => abandoned,
|
|
971
|
+
...(flags.databaseUrl !== undefined
|
|
972
|
+
? { databaseUrl: flags.databaseUrl }
|
|
973
|
+
: {}),
|
|
974
|
+
...(flags.mongodbUri !== undefined
|
|
975
|
+
? { mongodbUri: flags.mongodbUri }
|
|
976
|
+
: {}),
|
|
945
977
|
};
|
|
946
978
|
let liveSteps = false;
|
|
947
979
|
if (spin) {
|
|
@@ -1044,6 +1076,8 @@ export async function runCreate(io) {
|
|
|
1044
1076
|
return exitCodes.ok;
|
|
1045
1077
|
}
|
|
1046
1078
|
if (!gate.green) {
|
|
1079
|
+
for (const problem of gate.problems)
|
|
1080
|
+
session.log.error(problem);
|
|
1047
1081
|
session.log.error(gate.banner ?? "NOT GREEN");
|
|
1048
1082
|
session.outro(`The project was still written. See ${cd}/.seed/report.md`);
|
|
1049
1083
|
return gate.exitCode;
|
|
@@ -1065,6 +1099,8 @@ export async function runCreate(io) {
|
|
|
1065
1099
|
if (flags.noGate)
|
|
1066
1100
|
return exitCodes.ok;
|
|
1067
1101
|
if (!gate.green) {
|
|
1102
|
+
for (const problem of gate.problems)
|
|
1103
|
+
io.stderr(problem);
|
|
1068
1104
|
io.stderr(gate.banner ?? "NOT GREEN");
|
|
1069
1105
|
return gate.exitCode;
|
|
1070
1106
|
}
|