craftar 0.17.4 → 0.18.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.
@@ -0,0 +1,502 @@
1
+ import { existsSync } from "node:fs";
2
+ import { TARGETS } from "../schema/index.js";
3
+ import { countStates } from "./impact.js";
4
+ import { resolveHome } from "./home-lock.js";
5
+ import { checkInitFlags, checkLocalKeys, forgeSource, initLine } from "./init.js";
6
+ import { planRecipeEdit, slotHeld } from "./recipe-edit.js";
7
+ import { readRegistry } from "./registry.js";
8
+ import { classifyForge, credentialFault } from "./remote.js";
9
+ import { profileNotFoundMessage, resolve } from "./resolve.js";
10
+ import { loadForgeSource, mergeWorkspaceConfig } from "./sync.js";
11
+ /**
12
+ * The Forge last used on this machine: the entry with the most recent `lastSync`
13
+ * whose Forge can be offered — a path entry by its `key` (skipped when `null` or gone),
14
+ * a remote one by its `source` (skipped when `credentialFault`).
15
+ */
16
+ export function lastForge(registry, exists) {
17
+ const sorted = [...registry.workspaces].sort((a, b) => b.lastSync.localeCompare(a.lastSync));
18
+ for (const entry of sorted) {
19
+ const offer = offerableForge(entry, exists);
20
+ if (offer !== null)
21
+ return offer;
22
+ }
23
+ return null;
24
+ }
25
+ function offerableForge(entry, exists) {
26
+ if (entry.forge.kind === "path") {
27
+ if (entry.forge.key === null)
28
+ return null;
29
+ if (!exists(entry.forge.key))
30
+ return null;
31
+ return { forge: entry.forge.key, ref: null };
32
+ }
33
+ if (credentialFault(entry.forge.source))
34
+ return null;
35
+ return { forge: entry.forge.source, ref: entry.forge.ref };
36
+ }
37
+ /** y, yes → true; n, no → false; anything else → null. */
38
+ export function yesNo(answer) {
39
+ const a = answer.trim().toLowerCase();
40
+ if (a === "y" || a === "yes")
41
+ return true;
42
+ if (a === "n" || a === "no")
43
+ return false;
44
+ return null;
45
+ }
46
+ /**
47
+ * Says the summary and the `first sync:` line, asks through `io.confirm`,
48
+ * re-asks anything but yes/no, returns confirmed or cancelled.
49
+ */
50
+ export async function confirmInit(init, root, io, opts) {
51
+ io.say(`craftar init — about to write craftar.yaml in ${root}`);
52
+ io.say(` ${initLine(init)}`);
53
+ const counts = countStates(init.statuses);
54
+ if (counts.length === 0) {
55
+ io.say(" first sync: nothing to write");
56
+ }
57
+ else {
58
+ const parts = counts.map(([k, n]) => `${n} ${k}`);
59
+ io.say(` first sync: ${parts.join(", ")}`);
60
+ }
61
+ const question = opts.sync
62
+ ? "Write craftar.yaml and sync [yes]: "
63
+ : "Write craftar.yaml [yes]: ";
64
+ for (;;) {
65
+ const answer = await io.confirm(question);
66
+ if (answer === null)
67
+ return "cancelled";
68
+ if (answer === "")
69
+ return "confirmed";
70
+ const yn = yesNo(answer);
71
+ if (yn === true)
72
+ return "confirmed";
73
+ if (yn === false)
74
+ return "cancelled";
75
+ io.say("answer yes or no");
76
+ }
77
+ }
78
+ const SAFE_CHARS = /^[A-Za-z0-9_./:@=+,-]+$/;
79
+ function maybeQuote(value) {
80
+ if (value === "")
81
+ return '""';
82
+ if (SAFE_CHARS.test(value))
83
+ return value;
84
+ return `"${value}"`;
85
+ }
86
+ /**
87
+ * Returns ` again craftar init` followed by the flags that reproduce the run.
88
+ * Throws if `answers.forge` holds credentials (defense: never print them).
89
+ */
90
+ export function againLine(answers, given) {
91
+ if (credentialFault(answers.forge)) {
92
+ throw new Error("againLine: the Forge holds credentials");
93
+ }
94
+ const parts = [" again craftar init"];
95
+ parts.push(`--forge ${maybeQuote(answers.forge)}`);
96
+ if (answers.ref !== undefined)
97
+ parts.push(`--ref ${maybeQuote(answers.ref)}`);
98
+ parts.push(`--profile ${maybeQuote(answers.profile)}`);
99
+ if (answers.targets !== undefined)
100
+ parts.push(`--targets ${answers.targets.join(",")}`);
101
+ for (const name of answers.removeRecipes)
102
+ parts.push(`--remove-recipe ${maybeQuote(name)}`);
103
+ for (const name of answers.addRecipes)
104
+ parts.push(`--add-recipe ${maybeQuote(name)}`);
105
+ if (answers.replace && answers.addRecipes.length > 0)
106
+ parts.push("--replace");
107
+ if (given.workspace !== undefined)
108
+ parts.push(`--workspace ${maybeQuote(given.workspace)}`);
109
+ if (!given.sync)
110
+ parts.push("--no-sync");
111
+ if (given.offline)
112
+ parts.push("--offline");
113
+ return parts.join(" ");
114
+ }
115
+ /**
116
+ * An item of a numbered list by its answer: the name wins over the number (a profile or a recipe
117
+ * literally named `2` stays reachable), and a number is digits only — `2x` is no item.
118
+ */
119
+ function pickItem(names, answer) {
120
+ if (names.includes(answer))
121
+ return answer;
122
+ if (!/^\d+$/.test(answer))
123
+ return null;
124
+ return names[Number(answer) - 1] ?? null;
125
+ }
126
+ /**
127
+ * Steps 2–7 of the interactive flow: asks for the Forge, ref, profile, recipes and targets
128
+ * a command line does not give. Returns the `InitInput` for `planInit` and the `InitAnswers`
129
+ * for `againLine`, or a `cancelled` result when the user interrupted.
130
+ */
131
+ export async function askInit(root, given, local, io, opts) {
132
+ const exists = opts.exists ?? existsSync;
133
+ const home = resolveHome(opts.home);
134
+ // The flags given, checked here too: nothing below may say a Forge that holds credentials.
135
+ checkInitFlags(given);
136
+ checkLocalKeys(local.keys, {
137
+ ref: given.ref !== undefined,
138
+ recipes: given.addRecipes.length + given.removeRecipes.length > 0,
139
+ targets: given.targets !== undefined,
140
+ });
141
+ let answeredForge;
142
+ let answeredRef;
143
+ let answeredProfile;
144
+ let answeredTargets;
145
+ let answeredAddRecipes = [];
146
+ let answeredRemoveRecipes = [];
147
+ let answeredReplace = false;
148
+ let forgeDefault = null;
149
+ let refDefault = null;
150
+ let forgeWasAsked = false;
151
+ if (given.forge === undefined && !opts.registryOff) {
152
+ try {
153
+ const registry = await readRegistry(home);
154
+ const offered = lastForge(registry, exists);
155
+ if (offered !== null) {
156
+ forgeDefault = offered.forge;
157
+ refDefault = offered.ref;
158
+ }
159
+ }
160
+ catch (e) {
161
+ io.say(` warn cannot read the registry (${e.message}) — no Forge is offered`);
162
+ }
163
+ }
164
+ let loaded;
165
+ let localConfig = null;
166
+ forgeLoop: for (;;) {
167
+ answeredRef = undefined;
168
+ let forgeValue;
169
+ if (given.forge !== undefined && !forgeWasAsked) {
170
+ forgeValue = given.forge;
171
+ }
172
+ else {
173
+ forgeWasAsked = true;
174
+ const q = forgeDefault !== null
175
+ ? `Forge — a directory or a git URL [${forgeDefault}]: `
176
+ : "Forge — a directory or a git URL: ";
177
+ const answer = await io.ask(q);
178
+ if (answer === null)
179
+ return { kind: "cancelled" };
180
+ const trimmed = answer.trim();
181
+ if (trimmed === "") {
182
+ if (forgeDefault === null) {
183
+ io.say("a Forge is needed — a directory or a git URL");
184
+ continue forgeLoop;
185
+ }
186
+ forgeValue = forgeDefault;
187
+ }
188
+ else {
189
+ if (credentialFault(trimmed)) {
190
+ io.say("the answer holds credentials in the URL — remove them and let git authenticate");
191
+ continue forgeLoop;
192
+ }
193
+ forgeValue = trimmed;
194
+ if (forgeValue !== forgeDefault)
195
+ refDefault = null;
196
+ }
197
+ if (given.ref !== undefined && classifyForge(forgeValue) !== "url") {
198
+ try {
199
+ checkInitFlags({ forge: forgeValue, ref: given.ref });
200
+ }
201
+ catch (e) {
202
+ io.say(e.message);
203
+ continue forgeLoop;
204
+ }
205
+ }
206
+ forgeDefault = forgeValue;
207
+ }
208
+ answeredForge = forgeValue;
209
+ // The placeholder profile "-" is never used: only ref, recipes and targets are read,
210
+ // and none depends on the profile value. A schema error surfaces here.
211
+ localConfig = local.doc !== null
212
+ ? mergeWorkspaceConfig({ forge: forgeSource(root, forgeValue), profile: given.profile ?? "-" }, local.doc).config
213
+ : null;
214
+ let refValue = null;
215
+ if (classifyForge(forgeValue) === "url") {
216
+ if (given.ref !== undefined) {
217
+ refValue = given.ref;
218
+ answeredRef = given.ref;
219
+ }
220
+ else if (local.keys.includes("ref")) {
221
+ const localRef = localConfig?.ref ?? null;
222
+ if (localRef !== null)
223
+ io.say(`Ref: ${localRef} (from craftar.local.yaml)`);
224
+ refValue = localRef;
225
+ }
226
+ else {
227
+ const refQ = refDefault !== null && refDefault !== "the default branch"
228
+ ? `Ref — a branch, a tag or a full SHA [${refDefault}]: `
229
+ : "Ref — a branch, a tag or a full SHA [the default branch]: ";
230
+ const answer = await io.ask(refQ);
231
+ if (answer === null)
232
+ return { kind: "cancelled" };
233
+ const trimmed = answer.trim();
234
+ if (trimmed === "") {
235
+ if (refDefault !== null && refDefault !== "the default branch") {
236
+ refValue = refDefault;
237
+ answeredRef = refValue;
238
+ }
239
+ else {
240
+ refValue = null;
241
+ answeredRef = undefined;
242
+ }
243
+ }
244
+ else {
245
+ refValue = trimmed;
246
+ answeredRef = refValue;
247
+ }
248
+ refDefault = trimmed || refDefault;
249
+ }
250
+ }
251
+ try {
252
+ const loadRef = given.ref !== undefined ? given.ref
253
+ : local.keys.includes("ref") ? (localConfig?.ref ?? null)
254
+ : (answeredRef ?? null);
255
+ const source = forgeSource(root, forgeValue);
256
+ loaded = await loadForgeSource(root, source, loadRef, { ...opts, mode: "sync" });
257
+ }
258
+ catch (e) {
259
+ if (forgeWasAsked) {
260
+ io.say(e.message);
261
+ forgeDefault = forgeValue;
262
+ refDefault = answeredRef ?? refDefault;
263
+ continue forgeLoop;
264
+ }
265
+ else {
266
+ throw e;
267
+ }
268
+ }
269
+ break forgeLoop;
270
+ }
271
+ const forge = loaded.forge;
272
+ if (forge.profiles.size === 0 && given.profile === undefined) {
273
+ throw new Error("the Forge has no profile — add one under profiles/, then re-run init");
274
+ }
275
+ if (given.profile !== undefined) {
276
+ if (!forge.profiles.has(given.profile)) {
277
+ throw new Error(profileNotFoundMessage(given.profile, [...forge.profiles.keys()]));
278
+ }
279
+ answeredProfile = given.profile;
280
+ }
281
+ else {
282
+ const profiles = [...forge.profiles.values()].sort((a, b) => a.name.localeCompare(b.name));
283
+ io.say(`Profiles in ${answeredForge}:`);
284
+ const maxLen = Math.max(...profiles.map((p) => p.name.length));
285
+ for (let i = 0; i < profiles.length; i++) {
286
+ const p = profiles[i];
287
+ const desc = p.description;
288
+ if (desc) {
289
+ io.say(` ${i + 1}) ${p.name.padEnd(maxLen)} ${desc}`);
290
+ }
291
+ else {
292
+ io.say(` ${i + 1}) ${p.name}`);
293
+ }
294
+ }
295
+ const defProfile = profiles.length === 1 ? profiles[0].name : null;
296
+ const profileQ = defProfile !== null ? `Profile [${defProfile}]: ` : "Profile: ";
297
+ profileLoop: for (;;) {
298
+ const answer = await io.ask(profileQ);
299
+ if (answer === null)
300
+ return { kind: "cancelled" };
301
+ const trimmed = answer.trim();
302
+ if (trimmed === "") {
303
+ if (defProfile === null) {
304
+ io.say("a profile is needed — a name or a number from the list");
305
+ continue profileLoop;
306
+ }
307
+ answeredProfile = defProfile;
308
+ break profileLoop;
309
+ }
310
+ const picked = pickItem(profiles.map((p) => p.name), trimmed);
311
+ if (picked !== null) {
312
+ answeredProfile = picked;
313
+ break profileLoop;
314
+ }
315
+ io.say(profileNotFoundMessage(trimmed, [...forge.profiles.keys()]));
316
+ }
317
+ }
318
+ const profile = forge.profiles.get(answeredProfile);
319
+ const recipesFlagged = given.addRecipes.length > 0 || given.removeRecipes.length > 0;
320
+ if (recipesFlagged) {
321
+ answeredAddRecipes = given.addRecipes;
322
+ answeredRemoveRecipes = given.removeRecipes;
323
+ answeredReplace = given.replace;
324
+ }
325
+ else if (local.keys.includes("recipes")) {
326
+ const recipeConfig = { ...localConfig, profile: answeredProfile };
327
+ const resolution = resolve(forge, recipeConfig);
328
+ io.say(`Recipes: ${resolution.recipes.join(" → ")} (from craftar.local.yaml)`);
329
+ }
330
+ else {
331
+ const baseConfig = mergeWorkspaceConfig({ forge: forgeSource(root, answeredForge), profile: answeredProfile }, null).config;
332
+ let resolution = resolve(forge, baseConfig);
333
+ io.say(`Recipes of ${answeredProfile}: ${resolution.recipes.join(" → ")}`);
334
+ recipeLoop: for (;;) {
335
+ const adjustQ = "Adjust the recipes [no]: ";
336
+ const adjustAns = await io.ask(adjustQ);
337
+ if (adjustAns === null)
338
+ return { kind: "cancelled" };
339
+ const yn = yesNo(adjustAns);
340
+ if (adjustAns.trim() !== "" && yn === null) {
341
+ io.say("answer yes or no");
342
+ continue recipeLoop;
343
+ }
344
+ if (yn !== true)
345
+ break recipeLoop;
346
+ io.say(`Recipes in ${answeredForge}:`);
347
+ const allRecipes = [...forge.recipes.values()].sort((a, b) => a.name.localeCompare(b.name));
348
+ const inUse = resolution.recipes;
349
+ const orderedInUse = inUse.map((name) => allRecipes.find((r) => r.name === name));
350
+ const notInUseRecipes = allRecipes.filter((r) => !inUse.includes(r.name));
351
+ const ordered = [...orderedInUse, ...notInUseRecipes];
352
+ for (let i = 0; i < ordered.length; i++) {
353
+ const r = ordered[i];
354
+ const parts = [` ${i + 1}) ${r.name}`];
355
+ if (inUse.includes(r.name))
356
+ parts.push("· in use");
357
+ if (r.slot)
358
+ parts.push(`· slot ${r.slot}`);
359
+ if (r.description)
360
+ parts.push(`· ${r.description}`);
361
+ io.say(parts.join(" "));
362
+ }
363
+ // An answer that is no item is kept as typed, so spec 22's R2 names it.
364
+ const names = ordered.map((r) => r.name);
365
+ const parseRecipeAnswer = (answer) => answer.split(",").map((s) => s.trim()).filter((s) => s !== "").map((s) => pickItem(names, s) ?? s);
366
+ const removeAns = await io.ask("Remove [none]: ");
367
+ if (removeAns === null)
368
+ return { kind: "cancelled" };
369
+ const addAns = await io.ask("Add [none]: ");
370
+ if (addAns === null)
371
+ return { kind: "cancelled" };
372
+ const removeNames = parseRecipeAnswer(removeAns);
373
+ const addNames = parseRecipeAnswer(addAns);
374
+ if (removeNames.length === 0 && addNames.length === 0)
375
+ break recipeLoop;
376
+ const both = addNames.find((n) => removeNames.includes(n));
377
+ if (both !== undefined) {
378
+ try {
379
+ checkInitFlags({ addRecipes: addNames, removeRecipes: removeNames });
380
+ }
381
+ catch (e) {
382
+ io.say(e.message);
383
+ continue recipeLoop;
384
+ }
385
+ }
386
+ // Every round starts from the profile's recipes
387
+ let editConfig = mergeWorkspaceConfig({ forge: forgeSource(root, answeredForge), profile: answeredProfile }, null).config;
388
+ let replaceUsed = false;
389
+ try {
390
+ if (removeNames.length > 0) {
391
+ const removeEdit = planRecipeEdit(forge, editConfig, "remove", removeNames);
392
+ editConfig = { ...editConfig, recipes: removeEdit.recipes };
393
+ if (removeEdit.reasons.length)
394
+ io.say(` note ${removeEdit.reasons.join(", ")}`);
395
+ }
396
+ let doReplace = false;
397
+ if (addNames.length > 0) {
398
+ addLoop: for (;;) {
399
+ try {
400
+ const addEdit = planRecipeEdit(forge, editConfig, "add", addNames, { replace: doReplace });
401
+ editConfig = { ...editConfig, recipes: addEdit.recipes };
402
+ if (addEdit.reasons.length)
403
+ io.say(` note ${addEdit.reasons.join(", ")}`);
404
+ break addLoop;
405
+ }
406
+ catch (e) {
407
+ const held = slotHeld(e);
408
+ if (held !== null && !doReplace) {
409
+ const replaceQ = `${held.recipe} takes the slot "${held.slot}" that ${held.holder} holds — replace ${held.holder} [no]: `;
410
+ let replaceYn;
411
+ for (;;) {
412
+ const replaceAns = await io.ask(replaceQ);
413
+ if (replaceAns === null)
414
+ return { kind: "cancelled" };
415
+ replaceYn = replaceAns.trim() === "" ? false : yesNo(replaceAns);
416
+ if (replaceYn !== null)
417
+ break;
418
+ io.say("answer yes or no");
419
+ }
420
+ if (replaceYn) {
421
+ doReplace = true;
422
+ replaceUsed = true;
423
+ continue addLoop;
424
+ }
425
+ continue recipeLoop;
426
+ }
427
+ throw e;
428
+ }
429
+ }
430
+ }
431
+ answeredReplace = replaceUsed;
432
+ resolution = resolve(forge, editConfig);
433
+ io.say(`Recipes: ${resolution.recipes.join(" → ")}`);
434
+ // Return the typed names, not the resulting lists
435
+ answeredAddRecipes = addNames;
436
+ answeredRemoveRecipes = removeNames;
437
+ break recipeLoop;
438
+ }
439
+ catch (e) {
440
+ io.say(e.message);
441
+ continue recipeLoop;
442
+ }
443
+ }
444
+ }
445
+ if (given.targets !== undefined) {
446
+ answeredTargets = given.targets;
447
+ }
448
+ else if (local.keys.includes("targets")) {
449
+ const localTargets = localConfig?.targets ?? [];
450
+ io.say(`Targets: ${localTargets.join(", ")} (from craftar.local.yaml)`);
451
+ }
452
+ else {
453
+ const profileTargets = profile.targets;
454
+ const targetsQ = `Targets — ${TARGETS.join(", ")}, separated by commas [${profileTargets.join(", ")}, from the profile]: `;
455
+ targetsLoop: for (;;) {
456
+ const answer = await io.ask(targetsQ);
457
+ if (answer === null)
458
+ return { kind: "cancelled" };
459
+ const trimmed = answer.trim();
460
+ if (trimmed === "")
461
+ break targetsLoop;
462
+ const parsed = trimmed.split(",").map((s) => s.trim());
463
+ try {
464
+ checkInitFlags({ targets: parsed });
465
+ }
466
+ catch (e) {
467
+ io.say(e.message);
468
+ continue targetsLoop;
469
+ }
470
+ answeredTargets = parsed;
471
+ break targetsLoop;
472
+ }
473
+ }
474
+ const input = {
475
+ forge: answeredForge,
476
+ profile: answeredProfile,
477
+ loaded: loaded,
478
+ };
479
+ if (answeredRef !== undefined)
480
+ input.ref = answeredRef;
481
+ if (answeredTargets !== undefined)
482
+ input.targets = answeredTargets;
483
+ if (answeredAddRecipes.length > 0)
484
+ input.addRecipes = answeredAddRecipes;
485
+ if (answeredRemoveRecipes.length > 0)
486
+ input.removeRecipes = answeredRemoveRecipes;
487
+ if (answeredReplace)
488
+ input.replace = true;
489
+ const answers = {
490
+ forge: answeredForge,
491
+ profile: answeredProfile,
492
+ addRecipes: answeredAddRecipes,
493
+ removeRecipes: answeredRemoveRecipes,
494
+ replace: answeredReplace,
495
+ };
496
+ if (answeredRef !== undefined)
497
+ answers.ref = answeredRef;
498
+ if (answeredTargets !== undefined)
499
+ answers.targets = answeredTargets;
500
+ return { kind: "answered", input, answers };
501
+ }
502
+ //# sourceMappingURL=init-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-flow.js","sourceRoot":"","sources":["../../src/core/init-flow.ts"],"names":[],"mappings":"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"}