@forgelore/cli 0.2.1 → 0.2.2

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/dist/index.js CHANGED
@@ -100,59 +100,21 @@ function progressBar(percent, width = 20) {
100
100
 
101
101
  // src/ui/banner.ts
102
102
  var SEDONA = "#CC5500";
103
- var SEDONA_GLOW = "#E07020";
104
103
  var SEDONA_SUNSET = "#F5A050";
105
- var FLAME_TIP = "#FFEECC";
106
104
  var LORE_VIOLET = "#7C3AED";
107
105
  var LORE_CYAN = "#06B6D4";
108
106
  var DARK = "#2A2A2A";
109
107
  var FLASH_WARM = "#FFF0D0";
110
- var brandGradient = gradient2([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);
111
- var TITLE_COLORS = [
112
- "#CC5500",
113
- // F deep Sedona
114
- "#D46020",
115
- // O
116
- "#DC7030",
117
- // R
118
- "#F5A050",
119
- // G — Sedona sunset
120
- "#C09040",
121
- // E — transitioning
122
- "#9060B0",
123
- // L — blending
124
- "#7C3AED",
125
- // O — lore violet
126
- "#4196CB",
127
- // R
128
- "#06B6D4"
129
- // E — lore cyan
108
+ var forgeloreGradient = gradient2([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);
109
+ var brandGradient = forgeloreGradient;
110
+ var LOGO_LINES = [
111
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 ",
112
+ " \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 ",
113
+ " \u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 ",
114
+ " \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 ",
115
+ " \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 "
130
116
  ];
131
- var INNER_W = 20;
132
- var PAD = " ";
133
- var FLAME_INNER = [
134
- " \xB7 \u2726 \u2726 \xB7 ",
135
- // sparks: · ✦ ✦ ·
136
- " \u2571\u2572 \u2571\u2572 \u2571\u2572 ",
137
- // tips: ╱╲ ╱╲ ╱╲
138
- " \u2572\u2571\u2572\u2571\u2572\u2571 ",
139
- // merge: ╲╱╲╱╲╱
140
- " \u2572\u2571\u2572\u2571 "
141
- // base: ╲╱╲╱
142
- ];
143
- var ANVIL_INNER = [
144
- " \u2554\u2550\u2550\u2567\u2550\u2550\u2557 ",
145
- // ╔══╧══╗
146
- " \u2501\u2501\u2501\u2523\u2588\u2588\u2588\u2588\u2588\u252B\u2501\u2501\u2501 ",
147
- // ━━━╣█████╠━━━
148
- " \u255A\u2550\u2550\u2564\u2550\u2550\u255D ",
149
- // ╚══╤══╝
150
- " \u2588\u2588\u2588\u2588\u2567\u2588\u2588\u2588\u2588\u2588 "
151
- // ████╧█████
152
- ];
153
- var EMPTY_INNER = " ";
154
- var SPINE_INNER = "\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593";
155
- var TOTAL_ART_LINES = 13;
117
+ var TOTAL_LOGO_LINES = LOGO_LINES.length;
156
118
  var SPARK_POOL = [
157
119
  { char: "\u2726", bright: ["#F5A050", "#FFD090", "#FFF0D0"] },
158
120
  // ✦
@@ -162,10 +124,8 @@ var SPARK_POOL = [
162
124
  // ✶
163
125
  { char: "\u2217", bright: ["#CC5500", "#E07020"] },
164
126
  // ∗
165
- { char: "\xB7", bright: ["#F5A050", "#FFD090"] },
127
+ { char: "\xB7", bright: ["#F5A050", "#FFD090"] }
166
128
  // ·
167
- { char: "\u02DA", bright: ["#CC8800", "#F5A050"] }
168
- // ˚
169
129
  ];
170
130
  var EMBER_COLORS = ["#996600", "#805500"];
171
131
  var HIDE_CURSOR = "\x1B[?25l";
@@ -190,52 +150,19 @@ function lerpHex(a, b, t) {
190
150
  const [r2, g2, b2] = parseHex(b);
191
151
  return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);
192
152
  }
193
- function colorArt(heat, flash = 0) {
153
+ function colorLogo(heat, flash = 0) {
194
154
  const t = Math.max(0, Math.min(1, heat));
195
155
  const f = Math.max(0, Math.min(1, flash));
196
- const bdrCol = lerpHex(DARK, LORE_VIOLET, t);
197
- const bdr = (s) => chalk2.hex(bdrCol)(s);
198
- const flS = lerpHex(DARK, f > 0 ? lerpHex(FLAME_TIP, FLASH_WARM, f) : FLAME_TIP, t);
199
- const flE = lerpHex(DARK, f > 0 ? lerpHex(SEDONA_SUNSET, FLASH_WARM, f) : SEDONA_SUNSET, t);
200
- const flm = (s) => gradient2([flS, flE])(s);
201
- const avS = lerpHex(DARK, SEDONA, t);
202
- const avE = lerpHex(DARK, SEDONA_SUNSET, t);
203
- const anv = (s) => gradient2([avS, avE])(s);
204
- const spnCol = lerpHex(DARK, LORE_CYAN, t);
205
- const spn = (s) => chalk2.hex(spnCol)(s);
206
- const TOP = PAD + "\u2554" + "\u2550".repeat(INNER_W) + "\u2557";
207
- const DIV = PAD + "\u2560" + "\u2550".repeat(INNER_W) + "\u2563";
208
- const BOT = PAD + "\u255A" + "\u2550".repeat(INNER_W) + "\u255D";
209
- const L = PAD + "\u2551";
210
- const R = "\u2551";
211
- return [
212
- bdr(TOP),
213
- // 0: ╔════════════════════╗
214
- bdr(L) + flm(FLAME_INNER[0]) + bdr(R),
215
- // 1: ║ sparks ║
216
- bdr(L) + flm(FLAME_INNER[1]) + bdr(R),
217
- // 2: ║ flame tips ║
218
- bdr(L) + flm(FLAME_INNER[2]) + bdr(R),
219
- // 3: ║ flame merge ║
220
- bdr(L) + flm(FLAME_INNER[3]) + bdr(R),
221
- // 4: ║ flame base ║
222
- bdr(L) + anv(ANVIL_INNER[0]) + bdr(R),
223
- // 5: ║ anvil top ║
224
- bdr(L) + anv(ANVIL_INNER[1]) + bdr(R),
225
- // 6: ║ anvil horn ║
226
- bdr(L) + anv(ANVIL_INNER[2]) + bdr(R),
227
- // 7: ║ anvil waist ║
228
- bdr(L) + anv(ANVIL_INNER[3]) + bdr(R),
229
- // 8: ║ anvil base ║
230
- bdr(L + EMPTY_INNER + R),
231
- // 9: ║ ║
232
- bdr(DIV),
233
- // 10: ╠════════════════════╣
234
- spn(L) + spn(SPINE_INNER) + spn(R),
235
- // 11: ║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║
236
- bdr(BOT)
237
- // 12: ╚════════════════════╝
238
- ];
156
+ if (t < 0.01) {
157
+ const col = lerpHex(DARK, "#333333", 0.5);
158
+ return LOGO_LINES.map((line) => chalk2.hex(col)(line));
159
+ }
160
+ const stops = [SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN].map((c) => {
161
+ const base = lerpHex(DARK, c, t);
162
+ return f > 0 ? lerpHex(base, FLASH_WARM, f) : base;
163
+ });
164
+ const grad = gradient2(stops);
165
+ return LOGO_LINES.map((line) => grad(line));
239
166
  }
240
167
  function randomSpark(bright = true) {
241
168
  const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];
@@ -245,25 +172,24 @@ function randomSpark(bright = true) {
245
172
  function sparkOverlay(frame) {
246
173
  const sp = /* @__PURE__ */ new Map();
247
174
  if (frame === 0) {
248
- sp.set(1, " " + randomSpark() + randomSpark());
249
- sp.set(2, " " + randomSpark() + " " + randomSpark() + randomSpark());
250
- sp.set(3, " " + randomSpark() + randomSpark());
175
+ sp.set(0, " " + randomSpark() + randomSpark());
176
+ sp.set(1, " " + randomSpark() + " " + randomSpark());
177
+ sp.set(2, " " + randomSpark() + randomSpark());
178
+ sp.set(3, " " + randomSpark());
251
179
  sp.set(4, " " + randomSpark());
252
180
  } else if (frame === 1) {
253
- sp.set(0, " " + randomSpark());
254
- sp.set(1, " " + randomSpark() + " " + randomSpark());
255
- sp.set(2, " " + randomSpark() + " " + randomSpark());
256
- sp.set(3, " " + randomSpark() + " " + randomSpark());
257
- sp.set(4, " " + randomSpark());
258
- sp.set(5, " " + randomSpark());
181
+ sp.set(0, " " + randomSpark() + " " + randomSpark());
182
+ sp.set(1, " " + randomSpark());
183
+ sp.set(2, " " + randomSpark() + " " + randomSpark());
184
+ sp.set(3, " " + randomSpark());
185
+ sp.set(4, " " + randomSpark() + " " + randomSpark());
259
186
  } else if (frame === 2) {
260
- sp.set(0, " " + randomSpark(false));
261
- sp.set(1, " " + randomSpark());
262
- sp.set(3, " " + randomSpark(false) + " " + randomSpark());
263
- sp.set(5, " " + randomSpark(false));
187
+ sp.set(0, " " + randomSpark(false));
188
+ sp.set(2, " " + randomSpark());
189
+ sp.set(4, " " + randomSpark(false));
264
190
  } else if (frame === 3) {
265
- sp.set(0, " " + randomSpark(false));
266
- sp.set(2, " " + randomSpark(false));
191
+ sp.set(1, " " + randomSpark(false));
192
+ sp.set(3, " " + randomSpark(false));
267
193
  }
268
194
  return sp;
269
195
  }
@@ -272,18 +198,13 @@ function writeFrame(lines, sparks) {
272
198
  process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || "") + "\n");
273
199
  }
274
200
  }
275
- function getTitle() {
276
- return "FORGELORE".split("").map((ch, i) => chalk2.bold(chalk2.hex(TITLE_COLORS[i])(ch))).join("");
277
- }
278
201
  function renderBanner() {
279
- const art = colorArt(1).join("\n");
280
- const title = ` ${getTitle()}`;
281
- const tagline = colors.muted(" forge knowledge, shape code");
282
- const version = chalk2.dim(" v0.2.1");
202
+ const logo = colorLogo(1).join("\n");
203
+ const tagline = colors.muted(" forge knowledge, shape code");
204
+ const version = chalk2.dim(" v0.2.2");
283
205
  return `
284
- ${art}
206
+ ${logo}
285
207
 
286
- ${title}
287
208
  ${tagline}${version}
288
209
  `;
289
210
  }
@@ -295,48 +216,35 @@ async function renderAnimatedBanner() {
295
216
  process.stdout.write(HIDE_CURSOR);
296
217
  try {
297
218
  console.log("");
298
- const coldArt = colorArt(0.08);
299
- for (const line of coldArt) {
219
+ const coldLogo = colorLogo(0.06);
220
+ for (const line of coldLogo) {
300
221
  process.stdout.write(CLEAR_LINE + line + "\n");
301
222
  await sleep(20);
302
223
  }
303
- const heatSteps = [0.15, 0.3, 0.5, 0.7, 0.85, 1];
224
+ const heatSteps = [0.12, 0.25, 0.45, 0.65, 0.85, 1];
304
225
  for (const heat of heatSteps) {
305
- process.stdout.write(moveUp(TOTAL_ART_LINES));
306
- const frame = colorArt(heat);
226
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
227
+ const frame = colorLogo(heat);
307
228
  for (const line of frame) {
308
229
  process.stdout.write(CLEAR_LINE + line + "\n");
309
230
  }
310
231
  await sleep(55);
311
232
  }
312
- process.stdout.write(moveUp(TOTAL_ART_LINES));
313
- writeFrame(colorArt(1, 0.6), sparkOverlay(0));
233
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
234
+ writeFrame(colorLogo(1, 0.5), sparkOverlay(0));
314
235
  await sleep(65);
315
- for (let f = 1; f <= 4; f++) {
316
- const flashDecay = Math.max(0, 0.45 - f * 0.15);
317
- process.stdout.write(moveUp(TOTAL_ART_LINES));
318
- writeFrame(colorArt(1, flashDecay), sparkOverlay(f));
236
+ for (let f = 1; f <= 3; f++) {
237
+ const flashDecay = Math.max(0, 0.35 - f * 0.12);
238
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
239
+ writeFrame(colorLogo(1, flashDecay), sparkOverlay(f));
319
240
  await sleep(65);
320
241
  }
321
- process.stdout.write(moveUp(TOTAL_ART_LINES));
322
- writeFrame(colorArt(1), /* @__PURE__ */ new Map());
323
- console.log("");
324
- process.stdout.write(" ");
325
- const title = "FORGELORE";
326
- for (let i = 0; i < title.length; i++) {
327
- process.stdout.write(chalk2.hex(SEDONA_GLOW)("\u2588"));
328
- await sleep(15);
329
- process.stdout.write("\b" + chalk2.hex("#CC7744")("\u2593"));
330
- await sleep(15);
331
- process.stdout.write(
332
- "\b" + chalk2.bold(chalk2.hex(TITLE_COLORS[i])(title[i]))
333
- );
334
- await sleep(25);
335
- }
242
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
243
+ writeFrame(colorLogo(1), /* @__PURE__ */ new Map());
244
+ await sleep(150);
336
245
  console.log("");
337
- await sleep(120);
338
246
  console.log(
339
- colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.2.1")
247
+ colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.2.2")
340
248
  );
341
249
  console.log("");
342
250
  } finally {
@@ -1720,7 +1628,7 @@ async function analyzeChangeDrift(projectRoot, changeName, items) {
1720
1628
 
1721
1629
  // src/index.ts
1722
1630
  var program = new Command();
1723
- program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.2.1");
1631
+ program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.2.2");
1724
1632
  program.command("init").description("Initialize forgelore in the current project").option("-C, --cwd <path>", "Working directory").action((opts) => initCommand({ cwd: opts.cwd }));
1725
1633
  program.command("propose [idea]").description("Create a new change proposal").option("-C, --cwd <path>", "Working directory").action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));
1726
1634
  program.command("clarify <change>").description("Review and refine requirements for a change").option("-C, --cwd <path>", "Working directory").action((change, opts) => clarifyCommand(change, { cwd: opts.cwd }));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/commands/propose.ts","../src/commands/status.ts","../src/commands/clarify.ts","../src/commands/list.ts","../src/commands/verify.ts","../src/commands/archive.ts","../src/commands/sync.ts","../src/commands/doctor.ts","../src/commands/capabilities.ts","../src/commands/config.ts","../src/commands/diff.ts"],"sourcesContent":["/**\n * forgelore CLI\n * Spec-driven development for AI-assisted teams\n * Forge knowledge, shape code.\n */\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { proposeCommand } from \"./commands/propose.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { clarifyCommand } from \"./commands/clarify.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { archiveCommand } from \"./commands/archive.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { capabilitiesCommand } from \"./commands/capabilities.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { renderAnimatedBanner } from \"./ui/banner.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"forgelore\")\n .description(\"Spec-driven development for AI-assisted teams — forge knowledge, shape code\")\n .version(\"0.2.1\");\n\n// --- init ---\nprogram\n .command(\"init\")\n .description(\"Initialize forgelore in the current project\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => initCommand({ cwd: opts.cwd }));\n\n// --- propose ---\nprogram\n .command(\"propose [idea]\")\n .description(\"Create a new change proposal\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));\n\n// --- clarify ---\nprogram\n .command(\"clarify <change>\")\n .description(\"Review and refine requirements for a change\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => clarifyCommand(change, { cwd: opts.cwd }));\n\n// --- status ---\nprogram\n .command(\"status\")\n .description(\"Show project status dashboard\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => statusCommand({ cwd: opts.cwd }));\n\n// --- list ---\nprogram\n .command(\"list\")\n .description(\"List all changes\")\n .option(\"-a, --archived\", \"Include archived changes\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => listCommand({ archived: opts.archived, status: opts.status, cwd: opts.cwd }));\n\n// --- verify ---\nprogram\n .command(\"verify [change]\")\n .description(\"Verify a change against its specs (structural check)\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => verifyCommand(change, { cwd: opts.cwd }));\n\n// --- archive ---\nprogram\n .command(\"archive <change>\")\n .description(\"Archive a completed change and extract capabilities\")\n .option(\"--skip-outcome\", \"Skip outcome.md generation step\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => archiveCommand(change, { skipOutcome: opts.skipOutcome, cwd: opts.cwd }));\n\n// --- sync ---\nprogram\n .command(\"sync\")\n .description(\"Sync with the global spec repository\")\n .option(\"--force\", \"Force sync even if local changes exist\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => syncCommand({ force: opts.force, cwd: opts.cwd }));\n\n// --- doctor ---\nprogram\n .command(\"doctor\")\n .description(\"Check forgelore health and diagnose issues\")\n .option(\"--fix\", \"Attempt to fix detected issues\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => doctorCommand({ fix: opts.fix, cwd: opts.cwd }));\n\n// --- capabilities ---\nprogram\n .command(\"capabilities\")\n .alias(\"caps\")\n .description(\"List all registered capabilities\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => capabilitiesCommand({ json: opts.json, cwd: opts.cwd }));\n\n// --- config ---\nprogram\n .command(\"config [key] [value]\")\n .description(\"Get or set configuration values\")\n .option(\"--list\", \"List all config values\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((key, value, opts) => configCommand(key, value, { list: opts.list, cwd: opts.cwd }));\n\n// --- diff ---\nprogram\n .command(\"diff [change]\")\n .description(\"Show drift between specs and implementation\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => diffCommand(change, { cwd: opts.cwd }));\n\n// Default: animated banner + help\nprogram.action(async () => {\n await renderAnimatedBanner();\n program.outputHelp();\n});\n\nprogram.parse();\n","/**\n * forgelore init command\n * Scaffold forgelore in a project, configure mode and paths\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport {\n createDefaultConfig,\n writeConfig,\n configExists,\n getForgeloreDir,\n type SpecMode,\n type ForgeloreConfig,\n} from \"@forgelore/core\";\nimport { scaffoldSpecDirs } from \"@forgelore/core\";\nimport { scaffoldKnowledge } from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function initCommand(options: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options.cwd || process.cwd());\n\n console.log(renderBanner());\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n console.log(\n renderBox(\n `${icons.warning} forgelore is already initialized in this project.\\n` +\n `${colors.muted(\"Run\")} ${colors.primary(\"forgelore status\")} ${colors.muted(\"to see current state.\")}`,\n \"Already Initialized\"\n )\n );\n return;\n }\n\n p.intro(gradients.brand(\" forgelore init \"));\n\n // Choose mode\n const mode = (await p.select({\n message: \"How do you want to manage specs?\",\n options: [\n {\n value: \"local\",\n label: \"Local only\",\n hint: \"Specs live in this repo only\",\n },\n {\n value: \"local+global\",\n label: \"Local + Global\",\n hint: \"Local specs + a shared company spec repo\",\n },\n {\n value: \"global\",\n label: \"Global only\",\n hint: \"Reference a shared spec repo\",\n },\n ],\n })) as SpecMode;\n\n if (p.isCancel(mode)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n // Configure global source if needed\n let globalSource: string | undefined;\n if (mode === \"local+global\" || mode === \"global\") {\n const source = await p.text({\n message: \"Global spec source (filesystem path or GitHub URL):\",\n placeholder: \"/path/to/company-specs or https://github.com/org/specs\",\n validate: (val) => {\n if (!val) return \"Please enter a path or URL\";\n return undefined;\n },\n });\n\n if (p.isCancel(source)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n globalSource = source as string;\n }\n\n // Create config\n const config = createDefaultConfig(mode);\n if (globalSource) {\n const isUrl =\n globalSource.startsWith(\"http://\") || globalSource.startsWith(\"https://\");\n config.global = {\n source: globalSource,\n path: isUrl\n ? `~/.cache/forgelore/global/${globalSource.split(\"/\").pop()}`\n : globalSource,\n autoSync: true,\n };\n }\n\n // Scaffold\n const spinner = ora({\n text: \"Scaffolding forgelore...\",\n color: \"magenta\",\n }).start();\n\n try {\n const forgeloreDir = getForgeloreDir(projectRoot);\n await mkdir(forgeloreDir, { recursive: true });\n\n spinner.text = \"Creating directory structure...\";\n await scaffoldSpecDirs(projectRoot);\n\n spinner.text = \"Setting up knowledge base...\";\n await scaffoldKnowledge(projectRoot);\n\n spinner.text = \"Writing config...\";\n await writeConfig(projectRoot, config);\n\n spinner.succeed(colors.success(\"forgelore initialized\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to initialize forgelore\"));\n console.error(err);\n process.exit(1);\n }\n\n // Summary\n const summary = [\n `${icons.success} ${colors.white(\"Created:\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/forgelore.json\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/changes/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/architecture.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/patterns.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/glossary.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/capabilities/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/decisions/\")}`,\n \"\",\n `${icons.info} Mode: ${colors.primary(mode)}`,\n ];\n\n if (globalSource) {\n summary.push(`${icons.info} Global: ${colors.secondary(globalSource)}`);\n }\n\n console.log(renderBox(summary.join(\"\\n\"), \"Setup Complete\", \"#10B981\"));\n\n p.outro(\n `Run ${colors.primary(\"forgelore propose\")} ${colors.muted('\"your idea\"')} to create your first spec.`\n );\n}\n","/**\n * forgelore CLI banner and branding\n * A tome with a forge scene on its cover — flames, anvil, and sparks.\n *\n * Animation: the book starts cold (barely visible), heats up to full\n * Sedona/lore color, flames flash and sparks erupt from the cover,\n * then the title forges letter by letter from ember to final color.\n */\n\nimport boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\nimport { colors } from \"./theme.js\";\n\n// ─── Sedona Brand Palette ────────────────────────────────────\n\nconst SEDONA = \"#CC5500\"; // deep Sedona red-rock\nconst SEDONA_GLOW = \"#E07020\"; // bright warm Sedona\nconst SEDONA_SUNSET = \"#F5A050\"; // sunset gold\nconst FLAME_BRIGHT = \"#FFD090\"; // bright flame gold\nconst FLAME_TIP = \"#FFEECC\"; // flame tip highlight\nconst LORE_VIOLET = \"#7C3AED\"; // lore violet\nconst LORE_CYAN = \"#06B6D4\"; // lore cyan\nconst DARK = \"#2A2A2A\"; // cold / unlit\nconst FLASH_WARM = \"#FFF0D0\"; // warm-white impact flash\n\n// Pre-built gradients\nconst brandGradient = gradient([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);\n\n// Per-character title gradient: Sedona warm → lore cool\nconst TITLE_COLORS = [\n \"#CC5500\", // F — deep Sedona\n \"#D46020\", // O\n \"#DC7030\", // R\n \"#F5A050\", // G — Sedona sunset\n \"#C09040\", // E — transitioning\n \"#9060B0\", // L — blending\n \"#7C3AED\", // O — lore violet\n \"#4196CB\", // R\n \"#06B6D4\", // E — lore cyan\n];\n\n// ─── ASCII Art: Tome with Forge Cover ────────────────────────\n//\n// The art is a book (double-line border) with a forge scene on the\n// cover: flames at top, anvil below. The spine/pages show at bottom.\n// Each inner content line is exactly 20 characters wide.\n\nconst INNER_W = 20;\nconst PAD = \" \"; // left indent\n\n// Inner content between ║ borders (each exactly 20 chars)\nconst FLAME_INNER = [\n \" \\u00B7 \\u2726 \\u2726 \\u00B7 \", // sparks: · ✦ ✦ ·\n \" \\u2571\\u2572 \\u2571\\u2572 \\u2571\\u2572 \", // tips: ╱╲ ╱╲ ╱╲\n \" \\u2572\\u2571\\u2572\\u2571\\u2572\\u2571 \", // merge: ╲╱╲╱╲╱\n \" \\u2572\\u2571\\u2572\\u2571 \", // base: ╲╱╲╱\n];\n\nconst ANVIL_INNER = [\n \" \\u2554\\u2550\\u2550\\u2567\\u2550\\u2550\\u2557 \", // ╔══╧══╗\n \" \\u2501\\u2501\\u2501\\u2523\\u2588\\u2588\\u2588\\u2588\\u2588\\u252B\\u2501\\u2501\\u2501 \", // ━━━╣█████╠━━━\n \" \\u255A\\u2550\\u2550\\u2564\\u2550\\u2550\\u255D \", // ╚══╤══╝\n \" \\u2588\\u2588\\u2588\\u2588\\u2567\\u2588\\u2588\\u2588\\u2588\\u2588 \", // ████╧█████\n];\n\nconst EMPTY_INNER = \" \"; // 20 spaces\nconst SPINE_INNER = \"\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\"; // 20× ▓\n\n// Total art lines: top(1) + flame(4) + anvil(4) + empty(1) + divider(1) + spine(1) + bottom(1) = 13\nconst TOTAL_ART_LINES = 13;\nconst FLAME_START_ROW = 1; // first flame row in the frame\n\n// Spark characters with warm Sedona color pools\nconst SPARK_POOL = [\n { char: \"\\u2726\", bright: [\"#F5A050\", \"#FFD090\", \"#FFF0D0\"] }, // ✦\n { char: \"\\u2727\", bright: [\"#FFD090\", \"#FFF0D0\"] }, // ✧\n { char: \"\\u2736\", bright: [\"#E07020\", \"#F5A050\"] }, // ✶\n { char: \"\\u2217\", bright: [\"#CC5500\", \"#E07020\"] }, // ∗\n { char: \"\\u00B7\", bright: [\"#F5A050\", \"#FFD090\"] }, // ·\n { char: \"\\u02DA\", bright: [\"#CC8800\", \"#F5A050\"] }, // ˚\n];\n\nconst EMBER_COLORS = [\"#996600\", \"#805500\"];\n\n// ─── ANSI Helpers ────────────────────────────────────────────\n\nconst HIDE_CURSOR = \"\\x1b[?25l\";\nconst SHOW_CURSOR = \"\\x1b[?25h\";\nconst CLEAR_LINE = \"\\x1b[2K\";\nconst moveUp = (n: number) => (n > 0 ? `\\x1b[${n}A` : \"\");\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\n// ─── Color Math ──────────────────────────────────────────────\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n ];\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const c = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return (\n \"#\" +\n c(r).toString(16).padStart(2, \"0\") +\n c(g).toString(16).padStart(2, \"0\") +\n c(b).toString(16).padStart(2, \"0\")\n );\n}\n\nfunction lerpHex(a: string, b: string, t: number): string {\n const [r1, g1, b1] = parseHex(a);\n const [r2, g2, b2] = parseHex(b);\n return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);\n}\n\n// ─── Art Coloring ────────────────────────────────────────────\n\n/**\n * Compose the full art frame at a given heat level.\n *\n * heat — 0 (cold/dark) to 1 (full color)\n * flash — 0–1, brightens flame lines toward warm-white\n *\n * The book border uses lore violet, the flame content uses bright\n * warm gold, and the anvil uses Sedona orange. Each section gets\n * its own gradient so the forge \"pops\" against the cool frame.\n */\nfunction colorArt(heat: number, flash = 0): string[] {\n const t = Math.max(0, Math.min(1, heat));\n const f = Math.max(0, Math.min(1, flash));\n\n // Border color (lore violet, modulated by heat)\n const bdrCol = lerpHex(DARK, LORE_VIOLET, t);\n const bdr = (s: string) => chalk.hex(bdrCol)(s);\n\n // Flame gradient: bright gold → sunset\n const flS = lerpHex(DARK, f > 0 ? lerpHex(FLAME_TIP, FLASH_WARM, f) : FLAME_TIP, t);\n const flE = lerpHex(DARK, f > 0 ? lerpHex(SEDONA_SUNSET, FLASH_WARM, f) : SEDONA_SUNSET, t);\n const flm = (s: string) => gradient([flS, flE])(s);\n\n // Anvil gradient: Sedona → sunset\n const avS = lerpHex(DARK, SEDONA, t);\n const avE = lerpHex(DARK, SEDONA_SUNSET, t);\n const anv = (s: string) => gradient([avS, avE])(s);\n\n // Spine: lore cyan\n const spnCol = lerpHex(DARK, LORE_CYAN, t);\n const spn = (s: string) => chalk.hex(spnCol)(s);\n\n // Book border characters\n const TOP = PAD + \"\\u2554\" + \"\\u2550\".repeat(INNER_W) + \"\\u2557\"; // ╔═══╗\n const DIV = PAD + \"\\u2560\" + \"\\u2550\".repeat(INNER_W) + \"\\u2563\"; // ╠═══╣\n const BOT = PAD + \"\\u255A\" + \"\\u2550\".repeat(INNER_W) + \"\\u255D\"; // ╚═══╝\n const L = PAD + \"\\u2551\"; // ║ (left border)\n const R = \"\\u2551\"; // ║ (right border)\n\n return [\n bdr(TOP), // 0: ╔════════════════════╗\n bdr(L) + flm(FLAME_INNER[0]) + bdr(R), // 1: ║ sparks ║\n bdr(L) + flm(FLAME_INNER[1]) + bdr(R), // 2: ║ flame tips ║\n bdr(L) + flm(FLAME_INNER[2]) + bdr(R), // 3: ║ flame merge ║\n bdr(L) + flm(FLAME_INNER[3]) + bdr(R), // 4: ║ flame base ║\n bdr(L) + anv(ANVIL_INNER[0]) + bdr(R), // 5: ║ anvil top ║\n bdr(L) + anv(ANVIL_INNER[1]) + bdr(R), // 6: ║ anvil horn ║\n bdr(L) + anv(ANVIL_INNER[2]) + bdr(R), // 7: ║ anvil waist ║\n bdr(L) + anv(ANVIL_INNER[3]) + bdr(R), // 8: ║ anvil base ║\n bdr(L + EMPTY_INNER + R), // 9: ║ ║\n bdr(DIV), // 10: ╠════════════════════╣\n spn(L) + spn(SPINE_INNER) + spn(R), // 11: ║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║\n bdr(BOT), // 12: ╚════════════════════╝\n ];\n}\n\n// ─── Sparks ──────────────────────────────────────────────────\n\nfunction randomSpark(bright = true): string {\n const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];\n const pool = bright ? s.bright : EMBER_COLORS;\n return chalk.hex(pool[Math.floor(Math.random() * pool.length)])(s.char);\n}\n\n/**\n * Spark decorations that appear to the RIGHT of the book frame,\n * as if sparks are escaping the tome. Centered on the flame rows.\n * 0 = tight burst, 1–2 = expanding, 3 = last embers, 4+ = clear\n */\nfunction sparkOverlay(frame: number): Map<number, string> {\n const sp = new Map<number, string>();\n\n if (frame === 0) {\n // Tight burst near flames\n sp.set(1, \" \" + randomSpark() + randomSpark());\n sp.set(2, \" \" + randomSpark() + \" \" + randomSpark() + randomSpark());\n sp.set(3, \" \" + randomSpark() + randomSpark());\n sp.set(4, \" \" + randomSpark());\n } else if (frame === 1) {\n // Expanding outward\n sp.set(0, \" \" + randomSpark());\n sp.set(1, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(2, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(3, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(4, \" \" + randomSpark());\n sp.set(5, \" \" + randomSpark());\n } else if (frame === 2) {\n // Wide, starting to fade\n sp.set(0, \" \" + randomSpark(false));\n sp.set(1, \" \" + randomSpark());\n sp.set(3, \" \" + randomSpark(false) + \" \" + randomSpark());\n sp.set(5, \" \" + randomSpark(false));\n } else if (frame === 3) {\n // Last embers\n sp.set(0, \" \" + randomSpark(false));\n sp.set(2, \" \" + randomSpark(false));\n }\n return sp;\n}\n\n// ─── Frame Output ────────────────────────────────────────────\n\nfunction writeFrame(lines: string[], sparks: Map<number, string>): void {\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || \"\") + \"\\n\");\n }\n}\n\n// ─── Title ───────────────────────────────────────────────────\n\nfunction getTitle(): string {\n return \"FORGELORE\"\n .split(\"\")\n .map((ch, i) => chalk.bold(chalk.hex(TITLE_COLORS[i])(ch)))\n .join(\"\");\n}\n\n// ─── Public API ──────────────────────────────────────────────\n\n/**\n * Static banner — used in non-TTY or when animation is skipped\n */\nexport function renderBanner(): string {\n const art = colorArt(1).join(\"\\n\");\n const title = ` ${getTitle()}`;\n const tagline = colors.muted(\" forge knowledge, shape code\");\n const version = chalk.dim(\" v0.2.1\");\n return `\\n${art}\\n\\n${title}\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — forge heat-up, spark burst, title forging\n *\n * Timeline (~1.5s):\n * Cold reveal 260ms (13 lines × 20ms)\n * Heat-up 330ms (6 steps × 55ms)\n * Spark burst 325ms (5 frames × 65ms)\n * Title forge 495ms (9 letters × 55ms)\n * Tagline 120ms (pause + print)\n */\nexport async function renderAnimatedBanner(): Promise<void> {\n if (!process.stdout.isTTY) {\n console.log(renderBanner());\n return;\n }\n\n process.stdout.write(HIDE_CURSOR);\n\n try {\n console.log(\"\"); // top padding\n\n // ── Phase 1: Cold reveal ──────────────────────────────────\n const coldArt = colorArt(0.08);\n for (const line of coldArt) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n await sleep(20);\n }\n\n // ── Phase 2: Heat-up ──────────────────────────────────────\n const heatSteps = [0.15, 0.30, 0.50, 0.70, 0.85, 1.0];\n for (const heat of heatSteps) {\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n const frame = colorArt(heat);\n for (const line of frame) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(55);\n }\n\n // ── Phase 3: Flash + spark burst ──────────────────────────\n // Flames flash white-hot, sparks fly out of the book\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0, 0.6), sparkOverlay(0));\n await sleep(65);\n\n for (let f = 1; f <= 4; f++) {\n const flashDecay = Math.max(0, 0.45 - f * 0.15);\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0, flashDecay), sparkOverlay(f));\n await sleep(65);\n }\n\n // Clean final art\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0), new Map());\n\n // ── Phase 4: Title forging ────────────────────────────────\n console.log(\"\");\n process.stdout.write(\" \");\n const title = \"FORGELORE\";\n for (let i = 0; i < title.length; i++) {\n process.stdout.write(chalk.hex(SEDONA_GLOW)(\"\\u2588\"));\n await sleep(15);\n process.stdout.write(\"\\b\" + chalk.hex(\"#CC7744\")(\"\\u2593\"));\n await sleep(15);\n process.stdout.write(\n \"\\b\" + chalk.bold(chalk.hex(TITLE_COLORS[i])(title[i]))\n );\n await sleep(25);\n }\n console.log(\"\");\n\n // ── Phase 5: Tagline ──────────────────────────────────────\n await sleep(120);\n console.log(\n colors.muted(\" forge knowledge, shape code\") + chalk.dim(\" v0.2.1\")\n );\n console.log(\"\");\n } finally {\n process.stdout.write(SHOW_CURSOR);\n }\n}\n\n/**\n * Render a boxed section with Sedona-themed border\n */\nexport function renderBox(\n content: string,\n title?: string,\n borderColor = SEDONA\n): string {\n return boxen(content, {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 0, right: 0 },\n borderStyle: \"round\",\n borderColor,\n title,\n titleAlignment: \"left\",\n });\n}\n\n/**\n * Render a titled section with brand gradient\n */\nexport function renderSection(title: string, content: string): string {\n return `\\n${brandGradient(` ${title} `)}\\n${content}\\n`;\n}\n","/**\n * forgelore CLI theme\n * Sedona-inspired colors — warm red-rock tones (forge) + cool violet/cyan (lore)\n */\n\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\n\n// Brand colors — Sedona warm (forge) + cool (lore)\nexport const colors = {\n primary: chalk.hex(\"#CC5500\"), // Sedona orange (red rock)\n secondary: chalk.hex(\"#06B6D4\"), // lore cyan\n accent: chalk.hex(\"#F5A050\"), // Sedona sunset gold\n lore: chalk.hex(\"#7C3AED\"), // lore violet\n success: chalk.hex(\"#10B981\"), // emerald\n warning: chalk.hex(\"#E07020\"), // Sedona warm warning\n error: chalk.hex(\"#EF4444\"), // red\n muted: chalk.hex(\"#6B7280\"), // gray\n dim: chalk.dim,\n bold: chalk.bold,\n white: chalk.white,\n};\n\n// Gradients\nexport const gradients = {\n brand: gradient([\"#CC5500\", \"#F5A050\", \"#7C3AED\", \"#06B6D4\"]),\n forge: gradient([\"#CC5500\", \"#F5A050\"]),\n lore: gradient([\"#7C3AED\", \"#06B6D4\"]),\n warm: gradient([\"#F5A050\", \"#EF4444\"]),\n cool: gradient([\"#06B6D4\", \"#7C3AED\"]),\n success: gradient([\"#10B981\", \"#06B6D4\"]),\n sunset: gradient([\"#E07020\", \"#EF4444\", \"#7C3AED\"]),\n};\n\n// Status icons\nexport const icons = {\n success: colors.success(\"\\u2713\"),\n error: colors.error(\"\\u2717\"),\n warning: colors.warning(\"\\u26A0\"),\n info: colors.secondary(\"\\u25C6\"),\n pending: colors.muted(\"\\u25CB\"),\n inProgress: colors.accent(\"\\u25CF\"),\n arrow: colors.primary(\"\\u2192\"),\n bullet: colors.muted(\"\\u2022\"),\n star: colors.accent(\"\\u2605\"),\n spark: colors.accent(\"\\u2726\"),\n anvil: colors.primary(\"\\u2692\"),\n};\n\n// Status colors for tasks/changes\nexport function statusColor(status: string): string {\n switch (status) {\n case \"passed\":\n case \"validated\":\n case \"archived\":\n return colors.success(status);\n case \"failed\":\n return colors.error(status);\n case \"in-progress\":\n case \"claimed\":\n case \"implementing\":\n case \"validating\":\n return colors.accent(status);\n case \"blocked\":\n return colors.error(status);\n case \"pending\":\n case \"proposed\":\n case \"planning\":\n return colors.muted(status);\n default:\n return colors.white(status);\n }\n}\n\n// Progress bar\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar =\n colors.success(\"\\u2588\".repeat(filled)) + colors.muted(\"\\u2591\".repeat(empty));\n return `${bar} ${percent}%`;\n}\n","/**\n * forgelore propose command\n * Create a new change with proposal, specs, design, and tasks\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n createChange,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\nexport async function proposeCommand(\n idea?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore propose \"));\n\n // Get the idea if not provided\n let ideaText = idea;\n if (!ideaText) {\n const input = await p.text({\n message: \"What do you want to build?\",\n placeholder: \"e.g., Add dark mode toggle to settings\",\n validate: (val) => {\n if (!val) return \"Please describe your idea\";\n return undefined;\n },\n });\n\n if (p.isCancel(input)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n ideaText = input as string;\n }\n\n // Generate a slug name\n const suggestedName = slugify(ideaText).slice(0, 50);\n const nameInput = await p.text({\n message: \"Change name (used as folder name):\",\n placeholder: suggestedName,\n defaultValue: suggestedName,\n validate: (val) => {\n if (!val) return \"Please enter a name\";\n if (!/^[a-z0-9-]+$/.test(val))\n return \"Use lowercase letters, numbers, and hyphens only\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameInput)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n const changeName = (nameInput as string) || suggestedName;\n\n // Build the proposal content\n const proposalContent = `# Proposal: ${ideaText}\n\n## Motivation\n\n<!-- Why are we doing this? What problem does it solve? -->\n\n\n## Scope\n\n<!-- What is included and excluded from this change? -->\n\n### In Scope\n\n\n### Out of Scope\n\n\n## Context\n\n<!-- Any relevant context, links, or references -->\n\n\n## Success Criteria\n\n<!-- How do we know this is done? -->\n\n1. \n\n---\n\n*Proposed: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n // Create the change\n const spinner = ora({\n text: \"Creating change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const change = await createChange(projectRoot, changeName, proposalContent);\n spinner.succeed(colors.success(`Created change: ${changeName}`));\n\n const files = [\n `forgelore/changes/${changeName}/proposal.md`,\n `forgelore/changes/${changeName}/specs/requirements.md`,\n `forgelore/changes/${changeName}/specs/scenarios.md`,\n `forgelore/changes/${changeName}/design.md`,\n `forgelore/changes/${changeName}/tasks.md`,\n ];\n\n const summary = [\n `${icons.success} ${colors.white(\"Change created:\")} ${colors.primary(changeName)}`,\n \"\",\n `${colors.white(\"Files:\")}`,\n ...files.map((f) => ` ${icons.bullet} ${colors.muted(f)}`),\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Fill in ${colors.primary(\"proposal.md\")} with motivation and scope`,\n ` 2. Define requirements in ${colors.primary(\"specs/requirements.md\")}`,\n ` 3. Add scenarios in ${colors.primary(\"specs/scenarios.md\")}`,\n ` 4. Describe approach in ${colors.primary(\"design.md\")}`,\n ` 5. Break into tasks in ${colors.primary(\"tasks.md\")}`,\n ];\n\n console.log(renderBox(summary.join(\"\\n\"), \"Proposed\", \"#7C3AED\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to create change\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(\n `Run ${colors.primary(\"forgelore clarify\")} ${colors.muted(changeName)} to refine requirements.`\n );\n}\n","/**\n * forgelore status command\n * Beautiful dashboard showing all changes, progress, and capabilities\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listCapabilities,\n getProjectSummary,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function statusCommand(options?: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n console.log(renderBanner());\n\n const config = await readConfig(projectRoot);\n const summary = await getProjectSummary(projectRoot);\n const capabilities = await listCapabilities(projectRoot);\n\n // Header stats\n const statsLine = [\n `${colors.primary(String(summary.activeChanges))} active`,\n `${colors.success(String(summary.archivedChanges))} archived`,\n `${colors.secondary(String(summary.totalCapabilities))} capabilities`,\n `${colors.muted(\"mode:\")} ${colors.accent(config.mode)}`,\n ].join(colors.muted(\" \\u2502 \"));\n\n console.log(renderBox(statsLine, \"forgelore status\", \"#7C3AED\"));\n\n // Active changes table\n if (summary.changes.length > 0) {\n const table = new Table({\n head: [\n colors.bold(\"Change\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 14, 10, 30],\n });\n\n for (const change of summary.changes) {\n const ts = change.taskSummary;\n const taskStr =\n ts.total > 0\n ? `${ts.passed}/${ts.total}`\n : colors.muted(\"none\");\n const progress =\n ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n ]);\n }\n\n console.log(renderSection(\"Active Changes\", table.toString()));\n } else {\n console.log(\n renderSection(\n \"Active Changes\",\n ` ${colors.muted(\"No active changes.\")} Run ${colors.primary(\"forgelore propose\")} to create one.`\n )\n );\n }\n\n // Capabilities\n if (capabilities.length > 0) {\n const capTable = new Table({\n head: [\n colors.bold(\"Capability\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 25, 16],\n });\n\n for (const cap of capabilities.slice(0, 10)) {\n capTable.push([\n colors.white(cap.name),\n colors.muted(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n ]);\n }\n\n const moreText =\n capabilities.length > 10\n ? `\\n ${colors.muted(`...and ${capabilities.length - 10} more. Run`)} ${colors.primary(\"forgelore capabilities\")} ${colors.muted(\"to see all.\")}`\n : \"\";\n\n console.log(\n renderSection(\"Capabilities\", capTable.toString() + moreText)\n );\n } else {\n console.log(\n renderSection(\n \"Capabilities\",\n ` ${colors.muted(\"No capabilities yet.\")} Archive a completed change to start building the knowledge base.`\n )\n );\n }\n\n // Global sync status\n if (config.mode === \"local+global\" || config.mode === \"global\") {\n const globalInfo = config.global\n ? ` ${icons.info} Source: ${colors.secondary(config.global.source)}\\n` +\n ` ${icons.info} Path: ${colors.muted(config.global.path)}\\n` +\n ` ${icons.info} Auto-sync: ${config.global.autoSync ? colors.success(\"enabled\") : colors.muted(\"disabled\")}`\n : ` ${colors.warning(\"Global spec repo not configured.\")}`;\n\n console.log(renderSection(\"Global Specs\", globalInfo));\n }\n}\n","/**\n * forgelore clarify command\n * Review and refine requirements for a change\n */\n\nimport * as p from \"@clack/prompts\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n updateChangeStatus,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function clarifyCommand(\n changeName: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore clarify \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.\\nRun ${colors.primary(\"forgelore list\")} to see available changes.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Show current state\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n let requirements: string;\n try {\n requirements = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n } catch {\n requirements = \"(not yet defined)\";\n }\n\n let scenarios: string;\n try {\n scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n } catch {\n scenarios = \"(not yet defined)\";\n }\n\n console.log(\n renderBox(\n [\n `${icons.info} Change: ${colors.primary(changeName)}`,\n `${icons.info} Status: ${colors.accent(change.status)}`,\n `${icons.info} Created: ${colors.muted(change.createdAt.slice(0, 10))}`,\n ].join(\"\\n\"),\n \"Change Details\"\n )\n );\n\n console.log(renderSection(\"Proposal\", colors.muted(proposal.slice(0, 500))));\n console.log(renderSection(\"Requirements\", colors.muted(requirements.slice(0, 500))));\n console.log(renderSection(\"Scenarios\", colors.muted(scenarios.slice(0, 500))));\n\n // Clarification checklist\n const checks = await p.group({\n proposalComplete: () =>\n p.confirm({\n message: \"Is the proposal well-defined with clear motivation and scope?\",\n initialValue: false,\n }),\n requirementsDefined: () =>\n p.confirm({\n message: \"Are functional and non-functional requirements specified?\",\n initialValue: false,\n }),\n scenariosCovered: () =>\n p.confirm({\n message: \"Are happy path, edge cases, and error scenarios defined?\",\n initialValue: false,\n }),\n readyForDesign: () =>\n p.confirm({\n message: \"Is this change ready for design and task breakdown?\",\n initialValue: false,\n }),\n });\n\n if (p.isCancel(checks)) {\n p.cancel(\"Clarify cancelled.\");\n process.exit(0);\n }\n\n const allReady = checks.proposalComplete && checks.requirementsDefined && checks.scenariosCovered && checks.readyForDesign;\n\n if (allReady) {\n await updateChangeStatus(projectRoot, changeName, \"planning\");\n console.log(\n renderBox(\n `${icons.success} Change ${colors.primary(changeName)} is ready for design.\\n` +\n `Status updated to ${colors.accent(\"planning\")}.\\n\\n` +\n `Next: Fill in ${colors.primary(\"design.md\")} and ${colors.primary(\"tasks.md\")}`,\n \"Ready\",\n \"#10B981\"\n )\n );\n } else {\n const incomplete = [];\n if (!checks.proposalComplete) incomplete.push(` ${icons.pending} Proposal needs refinement`);\n if (!checks.requirementsDefined) incomplete.push(` ${icons.pending} Requirements need specification`);\n if (!checks.scenariosCovered) incomplete.push(` ${icons.pending} Scenarios need coverage`);\n\n console.log(\n renderBox(\n `${icons.warning} Change ${colors.primary(changeName)} needs more clarification:\\n\\n` +\n incomplete.join(\"\\n\") +\n `\\n\\n${colors.muted(\"Edit the spec files and run\")} ${colors.primary(\"forgelore clarify \" + changeName)} ${colors.muted(\"again.\")}`,\n \"Needs Work\",\n \"#F59E0B\"\n )\n );\n }\n\n p.outro(colors.muted(\"Specs are the foundation. Take the time to get them right.\"));\n}\n","/**\n * forgelore list command\n * List all changes with status and progress\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listChanges,\n} from \"@forgelore/core\";\nimport { summarizeTasks } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function listCommand(options?: {\n archived?: boolean;\n status?: string;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n let changes = await listChanges(projectRoot, options?.archived ?? false);\n\n // Filter by status if specified\n if (options?.status) {\n changes = changes.filter((c) => c.status === options.status);\n }\n\n if (changes.length === 0) {\n const msg = options?.status\n ? `No changes with status \"${options.status}\".`\n : \"No changes found.\";\n console.log(\n renderBox(\n `${icons.info} ${msg}\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Changes\"\n )\n );\n return;\n }\n\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n colors.bold(\"Updated\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [28, 14, 10, 26, 14],\n });\n\n for (const change of changes) {\n const ts = summarizeTasks(change.tasks);\n const taskStr = ts.total > 0 ? `${ts.passed}/${ts.total}` : colors.muted(\"--\");\n const progress = ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n const updated = colors.dim(change.updatedAt.slice(0, 10));\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n updated,\n ]);\n }\n\n const title = options?.archived ? \"All Changes (including archived)\" : \"Active Changes\";\n console.log(renderSection(title, table.toString()));\n console.log(\n colors.muted(` ${changes.length} change${changes.length === 1 ? \"\" : \"s\"} found`)\n );\n}\n","/**\n * forgelore verify command\n * Structural verification of a change's spec completeness\n * NOTE: This does NOT call any LLM — it checks file existence and content structure\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n listChanges,\n getChangePath,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface VerifyCheck {\n name: string;\n passed: boolean;\n message: string;\n}\n\nasync function verifyChange(\n projectRoot: string,\n changeName: string\n): Promise<VerifyCheck[]> {\n const checks: VerifyCheck[] = [];\n const changePath = getChangePath(projectRoot, changeName);\n\n // Check proposal.md exists and has content\n try {\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n const hasContent = proposal.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Proposal\",\n passed: hasContent,\n message: hasContent\n ? \"proposal.md has content\"\n : \"proposal.md is mostly empty — fill in motivation and scope\",\n });\n } catch {\n checks.push({\n name: \"Proposal\",\n passed: false,\n message: \"proposal.md is missing\",\n });\n }\n\n // Check requirements.md\n try {\n const reqs = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n const hasContent = reqs.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Requirements\",\n passed: hasContent,\n message: hasContent\n ? \"requirements.md has content\"\n : \"requirements.md is mostly empty — define functional and non-functional requirements\",\n });\n } catch {\n checks.push({\n name: \"Requirements\",\n passed: false,\n message: \"specs/requirements.md is missing\",\n });\n }\n\n // Check scenarios.md\n try {\n const scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n const hasContent = scenarios.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Scenarios\",\n passed: hasContent,\n message: hasContent\n ? \"scenarios.md has content\"\n : \"scenarios.md is mostly empty — define happy path, edge cases, error cases\",\n });\n } catch {\n checks.push({\n name: \"Scenarios\",\n passed: false,\n message: \"specs/scenarios.md is missing\",\n });\n }\n\n // Check design.md\n try {\n const design = await readChangeFile(projectRoot, changeName, \"design.md\");\n const hasContent = design.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Design\",\n passed: hasContent,\n message: hasContent\n ? \"design.md has content\"\n : \"design.md is mostly empty — describe technical approach\",\n });\n } catch {\n checks.push({\n name: \"Design\",\n passed: false,\n message: \"design.md is missing\",\n });\n }\n\n // Check tasks.md\n try {\n const tasks = await readChangeFile(projectRoot, changeName, \"tasks.md\");\n const hasContent = tasks.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Tasks\",\n passed: hasContent,\n message: hasContent\n ? \"tasks.md has content\"\n : \"tasks.md is mostly empty — break down implementation into tasks\",\n });\n } catch {\n checks.push({\n name: \"Tasks\",\n passed: false,\n message: \"tasks.md is missing\",\n });\n }\n\n return checks;\n}\n\nexport async function verifyCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // If no change specified, verify all active changes\n const changesToVerify: string[] = [];\n if (changeName) {\n changesToVerify.push(changeName);\n } else {\n const changes = await listChanges(projectRoot, false);\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to verify.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Nothing to Verify\"\n )\n );\n return;\n }\n changesToVerify.push(...changes.map((c) => c.name));\n }\n\n let totalPassed = 0;\n let totalChecks = 0;\n\n for (const name of changesToVerify) {\n try {\n const checks = await verifyChange(projectRoot, name);\n const passed = checks.filter((c) => c.passed).length;\n totalPassed += passed;\n totalChecks += checks.length;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}`\n );\n\n const allPassed = passed === checks.length;\n const borderColor = allPassed ? \"#10B981\" : \"#F59E0B\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${checks.length} checks passed\\n\\n${lines.join(\"\\n\")}`,\n name,\n borderColor\n )\n );\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(name)} not found.`,\n name,\n \"#EF4444\"\n )\n );\n }\n }\n\n // Summary\n if (changesToVerify.length > 1) {\n const allPassed = totalPassed === totalChecks;\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${totalPassed}/${totalChecks} total checks passed across ${changesToVerify.length} changes`,\n \"Summary\",\n allPassed ? \"#10B981\" : \"#F59E0B\"\n )\n );\n }\n}\n","/**\n * forgelore archive command\n * Two-step archive: 1) write outcome.md, 2) move to archive + extract capabilities\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n archiveChange,\n readOutcome,\n writeOutcome,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function archiveCommand(\n changeName: string,\n options?: { skipOutcome?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore archive \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Check if outcome.md already exists\n const changePath = getChangePath(projectRoot, changeName);\n const existingOutcome = await readOutcome(changePath);\n\n if (!existingOutcome && !options?.skipOutcome) {\n // Step 1: outcome.md needs to be created\n console.log(\n renderBox(\n [\n `${icons.info} Before archiving, an ${colors.primary(\"outcome.md\")} should be created.`,\n \"\",\n `This file captures:`,\n ` ${icons.bullet} What was built and the final state`,\n ` ${icons.bullet} Capabilities that emerged from this change`,\n ` ${icons.bullet} Lessons learned and patterns established`,\n \"\",\n `${colors.muted(\"An AI agent can generate this, or you can write it manually.\")}`,\n `${colors.muted(\"Create\")} ${colors.primary(`forgelore/changes/${changeName}/outcome.md`)} ${colors.muted(\"and run archive again.\")}`,\n ].join(\"\\n\"),\n \"Step 1: Outcome\",\n \"#F59E0B\"\n )\n );\n\n const proceed = await p.confirm({\n message: \"Create a placeholder outcome.md and continue archiving?\",\n initialValue: false,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel(\"Archive paused. Create outcome.md and run archive again.\");\n process.exit(0);\n }\n\n // Write placeholder outcome\n const placeholderOutcome = `# Outcome: ${changeName}\n\n## What Was Built\n\n<!-- Summary of what was implemented -->\n\n\n## Capabilities\n\n<!-- List capabilities that emerged from this change -->\n<!-- Format: - **Capability Name**: Description -->\n\n- \n\n## Lessons Learned\n\n<!-- What did we learn? Any patterns to document? -->\n\n\n## Files Changed\n\n<!-- Key files that were created or modified -->\n\n- \n\n---\n\n*Archived: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n await writeOutcome(changePath, placeholderOutcome);\n console.log(` ${icons.success} Created placeholder outcome.md`);\n }\n\n // Step 2: Archive\n const confirmArchive = await p.confirm({\n message: `Archive \"${changeName}\"? This will move it to forgelore/changes/archive/`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmArchive) || !confirmArchive) {\n p.cancel(\"Archive cancelled.\");\n process.exit(0);\n }\n\n const spinner = ora({\n text: \"Archiving change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const archivePath = await archiveChange(projectRoot, changeName);\n spinner.succeed(colors.success(\"Change archived\"));\n\n console.log(\n renderBox(\n [\n `${icons.success} ${colors.white(\"Archived:\")} ${colors.primary(changeName)}`,\n `${icons.arrow} ${colors.muted(archivePath)}`,\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Review ${colors.primary(\"outcome.md\")} and extract capabilities`,\n ` 2. Run ${colors.primary(\"forgelore capabilities\")} to view the knowledge base`,\n ` 3. Update ${colors.primary(\"forgelore/knowledge/architecture.md\")} if needed`,\n ].join(\"\\n\"),\n \"Archived\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Failed to archive\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(colors.muted(\"Knowledge captured. The spec lives on.\"));\n}\n","/**\n * forgelore sync command\n * Sync with global spec repository\n */\n\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport {\n configExists,\n readConfig,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function syncCommand(options?: {\n force?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const config = await readConfig(projectRoot);\n\n if (config.mode === \"local\") {\n console.log(\n renderBox(\n `${icons.info} Spec mode is ${colors.primary(\"local\")}. No global repo to sync.\\n` +\n `Run ${colors.primary(\"forgelore config mode local+global\")} to enable global specs.`,\n \"No Sync Needed\"\n )\n );\n return;\n }\n\n if (!config.global?.source) {\n console.log(\n renderBox(\n `${icons.error} Global spec source not configured.\\n` +\n `Run ${colors.primary(\"forgelore config global.source <path-or-url>\")} to set it.`,\n \"Not Configured\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const source = config.global.source;\n const isGitUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\") || source.startsWith(\"git@\");\n const targetPath = config.global.path;\n\n const spinner = ora({\n text: `Syncing from ${source}...`,\n color: \"magenta\",\n }).start();\n\n try {\n if (isGitUrl) {\n // Git clone or pull\n if (existsSync(targetPath)) {\n spinner.text = \"Pulling latest changes...\";\n execSync(\"git pull --ff-only\", { cwd: targetPath, stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs updated (git pull)\"));\n } else {\n spinner.text = \"Cloning global spec repo...\";\n mkdirSync(targetPath, { recursive: true });\n execSync(`git clone ${source} ${targetPath}`, { stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs cloned\"));\n }\n } else {\n // Filesystem path — just validate it exists\n if (existsSync(source)) {\n spinner.succeed(\n colors.success(`Global specs linked: ${colors.muted(source)}`)\n );\n } else {\n spinner.fail(\n colors.error(`Global spec path not found: ${source}`)\n );\n process.exit(1);\n }\n }\n\n console.log(\n renderBox(\n [\n `${icons.success} Global specs synced`,\n `${icons.info} Source: ${colors.secondary(source)}`,\n `${icons.info} Path: ${colors.muted(targetPath)}`,\n ].join(\"\\n\"),\n \"Sync Complete\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Sync failed\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n}\n","/**\n * forgelore doctor command\n * Health check and diagnostics for forgelore configuration\n */\n\nimport ora from \"ora\";\nimport { resolve, join } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n configExists,\n readConfig,\n fileExists,\n getForgeloreDir,\n listChanges,\n listCapabilities,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\ninterface HealthCheck {\n name: string;\n passed: boolean;\n message: string;\n fixable?: boolean;\n}\n\nexport async function doctorCommand(options?: {\n fix?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n const forgeloreDir = getForgeloreDir(projectRoot);\n const checks: HealthCheck[] = [];\n\n console.log(\n renderBox(\n `${icons.info} Running health checks...`,\n \"forgelore doctor\"\n )\n );\n\n // 1. Config exists\n const hasConfig = await configExists(projectRoot);\n checks.push({\n name: \"Configuration\",\n passed: hasConfig,\n message: hasConfig\n ? \"forgelore.json found\"\n : \"forgelore.json not found — run forgelore init\",\n });\n\n if (!hasConfig) {\n printResults(checks);\n return;\n }\n\n // 2. Config parseable\n let config;\n try {\n config = await readConfig(projectRoot);\n checks.push({\n name: \"Config Valid\",\n passed: true,\n message: `Config parsed (v${config.version}, mode: ${config.mode})`,\n });\n } catch (err) {\n checks.push({\n name: \"Config Valid\",\n passed: false,\n message: `Config parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n printResults(checks);\n return;\n }\n\n // 3. Directory structure\n const dirs = [\n { path: join(forgeloreDir, \"changes\"), name: \"changes/\" },\n { path: join(forgeloreDir, \"changes\", \"archive\"), name: \"changes/archive/\" },\n { path: join(forgeloreDir, \"knowledge\"), name: \"knowledge/\" },\n { path: join(forgeloreDir, \"knowledge\", \"capabilities\"), name: \"knowledge/capabilities/\" },\n { path: join(forgeloreDir, \"knowledge\", \"decisions\"), name: \"knowledge/decisions/\" },\n ];\n\n for (const dir of dirs) {\n const exists = await fileExists(dir.path);\n checks.push({\n name: `Dir: ${dir.name}`,\n passed: exists,\n message: exists ? `${dir.name} exists` : `${dir.name} missing`,\n fixable: true,\n });\n\n if (!exists && options?.fix) {\n await mkdir(dir.path, { recursive: true });\n }\n }\n\n // 4. Knowledge base files\n const knowledgeFiles = [\n { path: join(forgeloreDir, \"knowledge\", \"architecture.md\"), name: \"architecture.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"patterns.md\"), name: \"patterns.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"glossary.md\"), name: \"glossary.md\" },\n ];\n\n for (const file of knowledgeFiles) {\n const exists = await fileExists(file.path);\n checks.push({\n name: `KB: ${file.name}`,\n passed: exists,\n message: exists ? `${file.name} present` : `${file.name} missing`,\n });\n }\n\n // 5. Changes health\n try {\n const changes = await listChanges(projectRoot, false);\n checks.push({\n name: \"Active Changes\",\n passed: true,\n message: `${changes.length} active change${changes.length === 1 ? \"\" : \"s\"}`,\n });\n\n // Check for orphaned metadata\n for (const change of changes) {\n const hasProposal = await fileExists(join(change.path, \"proposal.md\"));\n if (!hasProposal) {\n checks.push({\n name: `Change: ${change.name}`,\n passed: false,\n message: `${change.name} has metadata but missing proposal.md`,\n });\n }\n }\n } catch {\n checks.push({\n name: \"Active Changes\",\n passed: false,\n message: \"Could not read changes directory\",\n });\n }\n\n // 6. Global sync (if applicable)\n if (config.mode !== \"local\" && config.global) {\n const globalExists = await fileExists(config.global.path);\n checks.push({\n name: \"Global Repo\",\n passed: globalExists,\n message: globalExists\n ? `Global specs available at ${config.global.path}`\n : `Global specs not found at ${config.global.path} — run forgelore sync`,\n });\n }\n\n printResults(checks, options?.fix);\n}\n\nfunction printResults(checks: HealthCheck[], didFix?: boolean): void {\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const allPassed = passed === total;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}${!c.passed && c.fixable && didFix ? colors.success(\" (fixed)\") : \"\"}`\n );\n\n const borderColor = allPassed ? \"#10B981\" : passed > total / 2 ? \"#F59E0B\" : \"#EF4444\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${total} checks passed\\n\\n${lines.join(\"\\n\")}`,\n \"Results\",\n borderColor\n )\n );\n\n if (!allPassed && !didFix) {\n const fixable = checks.filter((c) => !c.passed && c.fixable).length;\n if (fixable > 0) {\n console.log(\n colors.muted(` Run ${colors.primary(\"forgelore doctor --fix\")} to auto-fix ${fixable} issue${fixable === 1 ? \"\" : \"s\"}.`)\n );\n }\n }\n}\n","/**\n * forgelore capabilities command\n * List all registered capabilities in the knowledge base\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listCapabilities,\n} from \"@forgelore/core\";\nimport type { Capability } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function capabilitiesCommand(options?: {\n json?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const capabilities = await listCapabilities(projectRoot);\n\n if (capabilities.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No capabilities registered yet.\\n\\n` +\n `Capabilities are extracted when changes are archived.\\n` +\n `Archive a completed change with ${colors.primary(\"forgelore archive <change>\")} to start building\\nyour knowledge base.`,\n \"Capabilities\"\n )\n );\n return;\n }\n\n // JSON output\n if (options?.json) {\n console.log(JSON.stringify(capabilities, null, 2));\n return;\n }\n\n // Table output\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Description\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n colors.bold(\"Tags\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [22, 30, 18, 14, 16],\n wordWrap: true,\n });\n\n for (const cap of capabilities) {\n table.push([\n colors.white(cap.name),\n colors.muted(cap.description.slice(0, 60)),\n colors.secondary(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n cap.tags?.length ? colors.accent(cap.tags.join(\", \")) : colors.muted(\"--\"),\n ]);\n }\n\n console.log(renderSection(\"Capabilities\", table.toString()));\n console.log(\n colors.muted(\n ` ${capabilities.length} capabilit${capabilities.length === 1 ? \"y\" : \"ies\"} registered`\n )\n );\n}\n","/**\n * forgelore config command\n * Get, set, or list configuration values\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readConfig,\n getConfigValue,\n setConfigValue,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function configCommand(\n key?: string,\n value?: string,\n options?: { list?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // List all config\n if (options?.list || (!key && !value)) {\n const config = await readConfig(projectRoot);\n const lines = formatObject(config, \"\");\n\n console.log(\n renderSection(\"Configuration\", lines.join(\"\\n\"))\n );\n return;\n }\n\n // Get value\n if (key && !value) {\n const val = await getConfigValue(projectRoot, key);\n if (val === undefined) {\n console.log(\n ` ${icons.error} Key ${colors.primary(key)} not found in config.`\n );\n process.exit(1);\n }\n\n if (typeof val === \"object\" && val !== null) {\n const lines = formatObject(val as Record<string, unknown>, \"\");\n console.log(renderSection(key, lines.join(\"\\n\")));\n } else {\n console.log(` ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(val))}`);\n }\n return;\n }\n\n // Set value\n if (key && value) {\n // Parse value — try JSON, booleans, numbers, then string\n let parsed: unknown = value;\n if (value === \"true\") parsed = true;\n else if (value === \"false\") parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n else {\n try {\n parsed = JSON.parse(value);\n } catch {\n // keep as string\n }\n }\n\n await setConfigValue(projectRoot, key, parsed);\n console.log(\n ` ${icons.success} Set ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(parsed))}`\n );\n }\n}\n\nfunction formatObject(\n obj: Record<string, unknown>,\n prefix: string\n): string[] {\n const lines: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${k}` : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n lines.push(` ${colors.muted(fullKey + \":\")}`);\n lines.push(...formatObject(v as Record<string, unknown>, fullKey));\n } else {\n lines.push(\n ` ${colors.primary(fullKey)} ${colors.muted(\"=\")} ${colors.white(String(v))}`\n );\n }\n }\n return lines;\n}\n","/**\n * forgelore diff command\n * Show structural drift between specs and current project state\n * NOTE: This is a structural check, not an LLM-powered analysis\n */\n\nimport { resolve, relative } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listChanges,\n readChange,\n readChangeFile,\n getChangesDir,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface DriftItem {\n type: string;\n severity: \"info\" | \"warning\" | \"critical\";\n message: string;\n}\n\nexport async function diffCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const driftItems: DriftItem[] = [];\n\n if (changeName) {\n // Analyze a specific change\n try {\n const change = await readChange(projectRoot, changeName);\n await analyzeChangeDrift(projectRoot, changeName, driftItems);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n } else {\n // Analyze all active changes\n const changes = await listChanges(projectRoot, false);\n\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to analyze.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"No Changes\"\n )\n );\n return;\n }\n\n for (const change of changes) {\n await analyzeChangeDrift(projectRoot, change.name, driftItems);\n }\n }\n\n if (driftItems.length === 0) {\n console.log(\n renderBox(\n `${icons.success} No drift detected. Specs and implementation are in sync.`,\n \"All Clear\",\n \"#10B981\"\n )\n );\n return;\n }\n\n // Display drift items\n const table = new Table({\n head: [\n colors.bold(\"Severity\"),\n colors.bold(\"Type\"),\n colors.bold(\"Message\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [12, 20, 55],\n wordWrap: true,\n });\n\n for (const item of driftItems) {\n const sevColor =\n item.severity === \"critical\"\n ? colors.error\n : item.severity === \"warning\"\n ? colors.warning\n : colors.muted;\n\n table.push([\n sevColor(item.severity),\n colors.white(item.type),\n colors.muted(item.message),\n ]);\n }\n\n const critical = driftItems.filter((d) => d.severity === \"critical\").length;\n const warnings = driftItems.filter((d) => d.severity === \"warning\").length;\n const info = driftItems.filter((d) => d.severity === \"info\").length;\n\n const summaryParts = [];\n if (critical > 0) summaryParts.push(colors.error(`${critical} critical`));\n if (warnings > 0) summaryParts.push(colors.warning(`${warnings} warnings`));\n if (info > 0) summaryParts.push(colors.muted(`${info} info`));\n\n console.log(\n renderSection(\"Drift Report\", table.toString())\n );\n console.log(\n renderBox(\n `${critical > 0 ? icons.error : icons.warning} ${summaryParts.join(\", \")}`,\n \"Summary\",\n critical > 0 ? \"#EF4444\" : \"#F59E0B\"\n )\n );\n}\n\nasync function analyzeChangeDrift(\n projectRoot: string,\n changeName: string,\n items: DriftItem[]\n): Promise<void> {\n // Check for stale changes (proposed but no activity for 7+ days)\n try {\n const change = await readChange(projectRoot, changeName);\n const updatedAt = new Date(change.updatedAt);\n const daysSince = Math.floor(\n (Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (daysSince > 14 && change.status === \"proposed\") {\n items.push({\n type: \"stale-proposal\",\n severity: \"warning\",\n message: `\"${changeName}\" proposed ${daysSince} days ago with no progress`,\n });\n }\n\n if (daysSince > 7 && change.status === \"in-progress\") {\n items.push({\n type: \"stale-progress\",\n severity: \"info\",\n message: `\"${changeName}\" in progress for ${daysSince} days since last update`,\n });\n }\n\n // Check for empty spec files\n const specFiles = [\"proposal.md\", \"specs/requirements.md\", \"specs/scenarios.md\", \"design.md\", \"tasks.md\"];\n for (const file of specFiles) {\n try {\n const content = await readChangeFile(projectRoot, changeName, file);\n const stripped = content.replace(/<!--.*?-->/gs, \"\").trim();\n if (stripped.length < 30) {\n items.push({\n type: \"empty-spec\",\n severity: change.status === \"in-progress\" ? \"warning\" : \"info\",\n message: `\"${changeName}/${file}\" has minimal content`,\n });\n }\n } catch {\n items.push({\n type: \"missing-file\",\n severity: \"critical\",\n message: `\"${changeName}/${file}\" is missing`,\n });\n }\n }\n\n // Check for tasks with no progress if status is in-progress\n if (\n change.status === \"in-progress\" &&\n change.tasks.length > 0 &&\n change.tasks.every((t) => t.status === \"pending\")\n ) {\n items.push({\n type: \"no-task-progress\",\n severity: \"warning\",\n message: `\"${changeName}\" is in-progress but all ${change.tasks.length} tasks are still pending`,\n });\n }\n } catch {\n items.push({\n type: \"read-error\",\n severity: \"critical\",\n message: `Could not read change \"${changeName}\"`,\n });\n }\n}\n"],"mappings":"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","names":["chalk","gradient","gradient","chalk","gradient","p","ora","resolve","configExists","text","resolve","configExists","ora","resolve","configExists","resolve","configExists","p","resolve","configExists","resolve","configExists","resolve","Table","configExists","resolve","configExists","Table","resolve","configExists","readChangeFile","listChanges","getChangePath","getChangePath","readChangeFile","resolve","configExists","listChanges","p","ora","resolve","configExists","readChange","getChangePath","resolve","configExists","readChange","getChangePath","ora","ora","resolve","configExists","readConfig","resolve","configExists","readConfig","ora","resolve","mkdir","configExists","readConfig","fileExists","getForgeloreDir","listChanges","resolve","getForgeloreDir","configExists","readConfig","fileExists","mkdir","listChanges","resolve","Table","configExists","listCapabilities","resolve","configExists","listCapabilities","Table","resolve","configExists","readConfig","resolve","configExists","readConfig","resolve","Table","configExists","listChanges","readChange","readChangeFile","resolve","configExists","readChange","listChanges","Table","readChangeFile"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/commands/propose.ts","../src/commands/status.ts","../src/commands/clarify.ts","../src/commands/list.ts","../src/commands/verify.ts","../src/commands/archive.ts","../src/commands/sync.ts","../src/commands/doctor.ts","../src/commands/capabilities.ts","../src/commands/config.ts","../src/commands/diff.ts"],"sourcesContent":["/**\n * forgelore CLI\n * Spec-driven development for AI-assisted teams\n * Forge knowledge, shape code.\n */\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { proposeCommand } from \"./commands/propose.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { clarifyCommand } from \"./commands/clarify.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { archiveCommand } from \"./commands/archive.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { capabilitiesCommand } from \"./commands/capabilities.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { renderAnimatedBanner } from \"./ui/banner.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"forgelore\")\n .description(\"Spec-driven development for AI-assisted teams — forge knowledge, shape code\")\n .version(\"0.2.2\");\n\n// --- init ---\nprogram\n .command(\"init\")\n .description(\"Initialize forgelore in the current project\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => initCommand({ cwd: opts.cwd }));\n\n// --- propose ---\nprogram\n .command(\"propose [idea]\")\n .description(\"Create a new change proposal\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));\n\n// --- clarify ---\nprogram\n .command(\"clarify <change>\")\n .description(\"Review and refine requirements for a change\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => clarifyCommand(change, { cwd: opts.cwd }));\n\n// --- status ---\nprogram\n .command(\"status\")\n .description(\"Show project status dashboard\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => statusCommand({ cwd: opts.cwd }));\n\n// --- list ---\nprogram\n .command(\"list\")\n .description(\"List all changes\")\n .option(\"-a, --archived\", \"Include archived changes\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => listCommand({ archived: opts.archived, status: opts.status, cwd: opts.cwd }));\n\n// --- verify ---\nprogram\n .command(\"verify [change]\")\n .description(\"Verify a change against its specs (structural check)\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => verifyCommand(change, { cwd: opts.cwd }));\n\n// --- archive ---\nprogram\n .command(\"archive <change>\")\n .description(\"Archive a completed change and extract capabilities\")\n .option(\"--skip-outcome\", \"Skip outcome.md generation step\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => archiveCommand(change, { skipOutcome: opts.skipOutcome, cwd: opts.cwd }));\n\n// --- sync ---\nprogram\n .command(\"sync\")\n .description(\"Sync with the global spec repository\")\n .option(\"--force\", \"Force sync even if local changes exist\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => syncCommand({ force: opts.force, cwd: opts.cwd }));\n\n// --- doctor ---\nprogram\n .command(\"doctor\")\n .description(\"Check forgelore health and diagnose issues\")\n .option(\"--fix\", \"Attempt to fix detected issues\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => doctorCommand({ fix: opts.fix, cwd: opts.cwd }));\n\n// --- capabilities ---\nprogram\n .command(\"capabilities\")\n .alias(\"caps\")\n .description(\"List all registered capabilities\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => capabilitiesCommand({ json: opts.json, cwd: opts.cwd }));\n\n// --- config ---\nprogram\n .command(\"config [key] [value]\")\n .description(\"Get or set configuration values\")\n .option(\"--list\", \"List all config values\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((key, value, opts) => configCommand(key, value, { list: opts.list, cwd: opts.cwd }));\n\n// --- diff ---\nprogram\n .command(\"diff [change]\")\n .description(\"Show drift between specs and implementation\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => diffCommand(change, { cwd: opts.cwd }));\n\n// Default: animated banner + help\nprogram.action(async () => {\n await renderAnimatedBanner();\n program.outputHelp();\n});\n\nprogram.parse();\n","/**\n * forgelore init command\n * Scaffold forgelore in a project, configure mode and paths\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport {\n createDefaultConfig,\n writeConfig,\n configExists,\n getForgeloreDir,\n type SpecMode,\n type ForgeloreConfig,\n} from \"@forgelore/core\";\nimport { scaffoldSpecDirs } from \"@forgelore/core\";\nimport { scaffoldKnowledge } from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function initCommand(options: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options.cwd || process.cwd());\n\n console.log(renderBanner());\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n console.log(\n renderBox(\n `${icons.warning} forgelore is already initialized in this project.\\n` +\n `${colors.muted(\"Run\")} ${colors.primary(\"forgelore status\")} ${colors.muted(\"to see current state.\")}`,\n \"Already Initialized\"\n )\n );\n return;\n }\n\n p.intro(gradients.brand(\" forgelore init \"));\n\n // Choose mode\n const mode = (await p.select({\n message: \"How do you want to manage specs?\",\n options: [\n {\n value: \"local\",\n label: \"Local only\",\n hint: \"Specs live in this repo only\",\n },\n {\n value: \"local+global\",\n label: \"Local + Global\",\n hint: \"Local specs + a shared company spec repo\",\n },\n {\n value: \"global\",\n label: \"Global only\",\n hint: \"Reference a shared spec repo\",\n },\n ],\n })) as SpecMode;\n\n if (p.isCancel(mode)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n // Configure global source if needed\n let globalSource: string | undefined;\n if (mode === \"local+global\" || mode === \"global\") {\n const source = await p.text({\n message: \"Global spec source (filesystem path or GitHub URL):\",\n placeholder: \"/path/to/company-specs or https://github.com/org/specs\",\n validate: (val) => {\n if (!val) return \"Please enter a path or URL\";\n return undefined;\n },\n });\n\n if (p.isCancel(source)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n globalSource = source as string;\n }\n\n // Create config\n const config = createDefaultConfig(mode);\n if (globalSource) {\n const isUrl =\n globalSource.startsWith(\"http://\") || globalSource.startsWith(\"https://\");\n config.global = {\n source: globalSource,\n path: isUrl\n ? `~/.cache/forgelore/global/${globalSource.split(\"/\").pop()}`\n : globalSource,\n autoSync: true,\n };\n }\n\n // Scaffold\n const spinner = ora({\n text: \"Scaffolding forgelore...\",\n color: \"magenta\",\n }).start();\n\n try {\n const forgeloreDir = getForgeloreDir(projectRoot);\n await mkdir(forgeloreDir, { recursive: true });\n\n spinner.text = \"Creating directory structure...\";\n await scaffoldSpecDirs(projectRoot);\n\n spinner.text = \"Setting up knowledge base...\";\n await scaffoldKnowledge(projectRoot);\n\n spinner.text = \"Writing config...\";\n await writeConfig(projectRoot, config);\n\n spinner.succeed(colors.success(\"forgelore initialized\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to initialize forgelore\"));\n console.error(err);\n process.exit(1);\n }\n\n // Summary\n const summary = [\n `${icons.success} ${colors.white(\"Created:\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/forgelore.json\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/changes/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/architecture.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/patterns.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/glossary.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/capabilities/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/decisions/\")}`,\n \"\",\n `${icons.info} Mode: ${colors.primary(mode)}`,\n ];\n\n if (globalSource) {\n summary.push(`${icons.info} Global: ${colors.secondary(globalSource)}`);\n }\n\n console.log(renderBox(summary.join(\"\\n\"), \"Setup Complete\", \"#10B981\"));\n\n p.outro(\n `Run ${colors.primary(\"forgelore propose\")} ${colors.muted('\"your idea\"')} to create your first spec.`\n );\n}\n","/**\n * forgelore CLI banner and branding\n * Big gradient text logo, like Claude Code / Gemini CLI style.\n *\n * Animation: letters materialize from ember blocks, the full logo\n * gradient sweeps from Sedona warm to lore cool, then the tagline fades in.\n */\n\nimport boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\nimport { colors } from \"./theme.js\";\n\n// ─── Sedona Brand Palette ────────────────────────────────────\n\nconst SEDONA = \"#CC5500\"; // deep Sedona red-rock\nconst SEDONA_GLOW = \"#E07020\"; // bright warm Sedona\nconst SEDONA_SUNSET = \"#F5A050\"; // sunset gold\nconst LORE_VIOLET = \"#7C3AED\"; // lore violet\nconst LORE_CYAN = \"#06B6D4\"; // lore cyan\nconst DARK = \"#2A2A2A\"; // cold / unlit\nconst FLASH_WARM = \"#FFF0D0\"; // warm-white impact flash\n\n// Brand gradient: Sedona warm → lore cool\nconst forgeloreGradient = gradient([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);\nconst brandGradient = forgeloreGradient;\n\n// ─── Big Text Logo ───────────────────────────────────────────\n//\n// FIGlet-style block letters for \"FORGELORE\"\n// Font style: chunky/bold, 6 lines tall\n\nconst LOGO_LINES = [\n \" ███████ ██████ ██████ ██████ ███████ ██ ██████ ██████ ███████ \",\n \" ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \",\n \" █████ ██ ██ ██████ ██ ███ █████ ██ ██ ██ ██████ █████ \",\n \" ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \",\n \" ██ ██████ ██ ██ ██████ ███████ ███████ ██████ ██ ██ ███████ \",\n];\n\nconst TOTAL_LOGO_LINES = LOGO_LINES.length;\n\n// Spark characters with warm Sedona color pools\nconst SPARK_POOL = [\n { char: \"\\u2726\", bright: [\"#F5A050\", \"#FFD090\", \"#FFF0D0\"] }, // ✦\n { char: \"\\u2727\", bright: [\"#FFD090\", \"#FFF0D0\"] }, // ✧\n { char: \"\\u2736\", bright: [\"#E07020\", \"#F5A050\"] }, // ✶\n { char: \"\\u2217\", bright: [\"#CC5500\", \"#E07020\"] }, // ∗\n { char: \"\\u00B7\", bright: [\"#F5A050\", \"#FFD090\"] }, // ·\n];\n\nconst EMBER_COLORS = [\"#996600\", \"#805500\"];\n\n// ─── ANSI Helpers ────────────────────────────────────────────\n\nconst HIDE_CURSOR = \"\\x1b[?25l\";\nconst SHOW_CURSOR = \"\\x1b[?25h\";\nconst CLEAR_LINE = \"\\x1b[2K\";\nconst moveUp = (n: number) => (n > 0 ? `\\x1b[${n}A` : \"\");\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\n// ─── Color Math ──────────────────────────────────────────────\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n ];\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const c = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return (\n \"#\" +\n c(r).toString(16).padStart(2, \"0\") +\n c(g).toString(16).padStart(2, \"0\") +\n c(b).toString(16).padStart(2, \"0\")\n );\n}\n\nfunction lerpHex(a: string, b: string, t: number): string {\n const [r1, g1, b1] = parseHex(a);\n const [r2, g2, b2] = parseHex(b);\n return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);\n}\n\n// ─── Logo Coloring ───────────────────────────────────────────\n\n/**\n * Color the logo at a given heat level.\n * heat — 0 (cold/dark) to 1 (full Sedona→lore gradient)\n * flash — 0–1, push colors toward warm-white\n */\nfunction colorLogo(heat: number, flash = 0): string[] {\n const t = Math.max(0, Math.min(1, heat));\n const f = Math.max(0, Math.min(1, flash));\n\n if (t < 0.01) {\n // Completely dark — barely visible solid color\n const col = lerpHex(DARK, \"#333333\", 0.5);\n return LOGO_LINES.map((line) => chalk.hex(col)(line));\n }\n\n // Build the gradient stops, modulated by heat (dark → full color)\n const stops = [SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN].map((c) => {\n const base = lerpHex(DARK, c, t);\n return f > 0 ? lerpHex(base, FLASH_WARM, f) : base;\n });\n\n const grad = gradient(stops);\n return LOGO_LINES.map((line) => grad(line));\n}\n\n// ─── Sparks ──────────────────────────────────────────────────\n\nfunction randomSpark(bright = true): string {\n const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];\n const pool = bright ? s.bright : EMBER_COLORS;\n return chalk.hex(pool[Math.floor(Math.random() * pool.length)])(s.char);\n}\n\n/**\n * Spark decorations that fly off the logo to the right.\n * 0 = tight burst, 1–2 = expanding, 3 = embers, 4+ = clear\n */\nfunction sparkOverlay(frame: number): Map<number, string> {\n const sp = new Map<number, string>();\n\n if (frame === 0) {\n sp.set(0, \" \" + randomSpark() + randomSpark());\n sp.set(1, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(2, \" \" + randomSpark() + randomSpark());\n sp.set(3, \" \" + randomSpark());\n sp.set(4, \" \" + randomSpark());\n } else if (frame === 1) {\n sp.set(0, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(1, \" \" + randomSpark());\n sp.set(2, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(3, \" \" + randomSpark());\n sp.set(4, \" \" + randomSpark() + \" \" + randomSpark());\n } else if (frame === 2) {\n sp.set(0, \" \" + randomSpark(false));\n sp.set(2, \" \" + randomSpark());\n sp.set(4, \" \" + randomSpark(false));\n } else if (frame === 3) {\n sp.set(1, \" \" + randomSpark(false));\n sp.set(3, \" \" + randomSpark(false));\n }\n return sp;\n}\n\n// ─── Frame Output ────────────────────────────────────────────\n\nfunction writeFrame(lines: string[], sparks: Map<number, string>): void {\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || \"\") + \"\\n\");\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────\n\n/**\n * Static banner — used in non-TTY or when animation is skipped\n */\nexport function renderBanner(): string {\n const logo = colorLogo(1).join(\"\\n\");\n const tagline = colors.muted(\" forge knowledge, shape code\");\n const version = chalk.dim(\" v0.2.2\");\n return `\\n${logo}\\n\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — logo heats up, sparks fly, tagline fades in\n *\n * Timeline (~1.2s):\n * Cold reveal 100ms (5 lines × 20ms)\n * Heat-up 330ms (6 steps × 55ms)\n * Spark burst 260ms (4 frames × 65ms)\n * Tagline 150ms (pause + print)\n */\nexport async function renderAnimatedBanner(): Promise<void> {\n if (!process.stdout.isTTY) {\n console.log(renderBanner());\n return;\n }\n\n process.stdout.write(HIDE_CURSOR);\n\n try {\n console.log(\"\"); // top padding\n\n // ── Phase 1: Cold reveal ──────────────────────────────────\n const coldLogo = colorLogo(0.06);\n for (const line of coldLogo) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n await sleep(20);\n }\n\n // ── Phase 2: Heat-up ──────────────────────────────────────\n // Logo warms from dark to full Sedona → lore gradient\n const heatSteps = [0.12, 0.25, 0.45, 0.65, 0.85, 1.0];\n for (const heat of heatSteps) {\n process.stdout.write(moveUp(TOTAL_LOGO_LINES));\n const frame = colorLogo(heat);\n for (const line of frame) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(55);\n }\n\n // ── Phase 3: Flash + spark burst ──────────────────────────\n process.stdout.write(moveUp(TOTAL_LOGO_LINES));\n writeFrame(colorLogo(1.0, 0.5), sparkOverlay(0));\n await sleep(65);\n\n for (let f = 1; f <= 3; f++) {\n const flashDecay = Math.max(0, 0.35 - f * 0.12);\n process.stdout.write(moveUp(TOTAL_LOGO_LINES));\n writeFrame(colorLogo(1.0, flashDecay), sparkOverlay(f));\n await sleep(65);\n }\n\n // Clean final logo\n process.stdout.write(moveUp(TOTAL_LOGO_LINES));\n writeFrame(colorLogo(1.0), new Map());\n\n // ── Phase 4: Tagline ──────────────────────────────────────\n await sleep(150);\n console.log(\"\");\n console.log(\n colors.muted(\" forge knowledge, shape code\") + chalk.dim(\" v0.2.2\")\n );\n console.log(\"\");\n } finally {\n process.stdout.write(SHOW_CURSOR);\n }\n}\n\n/**\n * Render a boxed section with Sedona-themed border\n */\nexport function renderBox(\n content: string,\n title?: string,\n borderColor = SEDONA\n): string {\n return boxen(content, {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 0, right: 0 },\n borderStyle: \"round\",\n borderColor,\n title,\n titleAlignment: \"left\",\n });\n}\n\n/**\n * Render a titled section with brand gradient\n */\nexport function renderSection(title: string, content: string): string {\n return `\\n${brandGradient(` ${title} `)}\\n${content}\\n`;\n}\n","/**\n * forgelore CLI theme\n * Sedona-inspired colors — warm red-rock tones (forge) + cool violet/cyan (lore)\n */\n\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\n\n// Brand colors — Sedona warm (forge) + cool (lore)\nexport const colors = {\n primary: chalk.hex(\"#CC5500\"), // Sedona orange (red rock)\n secondary: chalk.hex(\"#06B6D4\"), // lore cyan\n accent: chalk.hex(\"#F5A050\"), // Sedona sunset gold\n lore: chalk.hex(\"#7C3AED\"), // lore violet\n success: chalk.hex(\"#10B981\"), // emerald\n warning: chalk.hex(\"#E07020\"), // Sedona warm warning\n error: chalk.hex(\"#EF4444\"), // red\n muted: chalk.hex(\"#6B7280\"), // gray\n dim: chalk.dim,\n bold: chalk.bold,\n white: chalk.white,\n};\n\n// Gradients\nexport const gradients = {\n brand: gradient([\"#CC5500\", \"#F5A050\", \"#7C3AED\", \"#06B6D4\"]),\n forge: gradient([\"#CC5500\", \"#F5A050\"]),\n lore: gradient([\"#7C3AED\", \"#06B6D4\"]),\n warm: gradient([\"#F5A050\", \"#EF4444\"]),\n cool: gradient([\"#06B6D4\", \"#7C3AED\"]),\n success: gradient([\"#10B981\", \"#06B6D4\"]),\n sunset: gradient([\"#E07020\", \"#EF4444\", \"#7C3AED\"]),\n};\n\n// Status icons\nexport const icons = {\n success: colors.success(\"\\u2713\"),\n error: colors.error(\"\\u2717\"),\n warning: colors.warning(\"\\u26A0\"),\n info: colors.secondary(\"\\u25C6\"),\n pending: colors.muted(\"\\u25CB\"),\n inProgress: colors.accent(\"\\u25CF\"),\n arrow: colors.primary(\"\\u2192\"),\n bullet: colors.muted(\"\\u2022\"),\n star: colors.accent(\"\\u2605\"),\n spark: colors.accent(\"\\u2726\"),\n anvil: colors.primary(\"\\u2692\"),\n};\n\n// Status colors for tasks/changes\nexport function statusColor(status: string): string {\n switch (status) {\n case \"passed\":\n case \"validated\":\n case \"archived\":\n return colors.success(status);\n case \"failed\":\n return colors.error(status);\n case \"in-progress\":\n case \"claimed\":\n case \"implementing\":\n case \"validating\":\n return colors.accent(status);\n case \"blocked\":\n return colors.error(status);\n case \"pending\":\n case \"proposed\":\n case \"planning\":\n return colors.muted(status);\n default:\n return colors.white(status);\n }\n}\n\n// Progress bar\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar =\n colors.success(\"\\u2588\".repeat(filled)) + colors.muted(\"\\u2591\".repeat(empty));\n return `${bar} ${percent}%`;\n}\n","/**\n * forgelore propose command\n * Create a new change with proposal, specs, design, and tasks\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n createChange,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\nexport async function proposeCommand(\n idea?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore propose \"));\n\n // Get the idea if not provided\n let ideaText = idea;\n if (!ideaText) {\n const input = await p.text({\n message: \"What do you want to build?\",\n placeholder: \"e.g., Add dark mode toggle to settings\",\n validate: (val) => {\n if (!val) return \"Please describe your idea\";\n return undefined;\n },\n });\n\n if (p.isCancel(input)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n ideaText = input as string;\n }\n\n // Generate a slug name\n const suggestedName = slugify(ideaText).slice(0, 50);\n const nameInput = await p.text({\n message: \"Change name (used as folder name):\",\n placeholder: suggestedName,\n defaultValue: suggestedName,\n validate: (val) => {\n if (!val) return \"Please enter a name\";\n if (!/^[a-z0-9-]+$/.test(val))\n return \"Use lowercase letters, numbers, and hyphens only\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameInput)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n const changeName = (nameInput as string) || suggestedName;\n\n // Build the proposal content\n const proposalContent = `# Proposal: ${ideaText}\n\n## Motivation\n\n<!-- Why are we doing this? What problem does it solve? -->\n\n\n## Scope\n\n<!-- What is included and excluded from this change? -->\n\n### In Scope\n\n\n### Out of Scope\n\n\n## Context\n\n<!-- Any relevant context, links, or references -->\n\n\n## Success Criteria\n\n<!-- How do we know this is done? -->\n\n1. \n\n---\n\n*Proposed: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n // Create the change\n const spinner = ora({\n text: \"Creating change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const change = await createChange(projectRoot, changeName, proposalContent);\n spinner.succeed(colors.success(`Created change: ${changeName}`));\n\n const files = [\n `forgelore/changes/${changeName}/proposal.md`,\n `forgelore/changes/${changeName}/specs/requirements.md`,\n `forgelore/changes/${changeName}/specs/scenarios.md`,\n `forgelore/changes/${changeName}/design.md`,\n `forgelore/changes/${changeName}/tasks.md`,\n ];\n\n const summary = [\n `${icons.success} ${colors.white(\"Change created:\")} ${colors.primary(changeName)}`,\n \"\",\n `${colors.white(\"Files:\")}`,\n ...files.map((f) => ` ${icons.bullet} ${colors.muted(f)}`),\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Fill in ${colors.primary(\"proposal.md\")} with motivation and scope`,\n ` 2. Define requirements in ${colors.primary(\"specs/requirements.md\")}`,\n ` 3. Add scenarios in ${colors.primary(\"specs/scenarios.md\")}`,\n ` 4. Describe approach in ${colors.primary(\"design.md\")}`,\n ` 5. Break into tasks in ${colors.primary(\"tasks.md\")}`,\n ];\n\n console.log(renderBox(summary.join(\"\\n\"), \"Proposed\", \"#7C3AED\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to create change\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(\n `Run ${colors.primary(\"forgelore clarify\")} ${colors.muted(changeName)} to refine requirements.`\n );\n}\n","/**\n * forgelore status command\n * Beautiful dashboard showing all changes, progress, and capabilities\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listCapabilities,\n getProjectSummary,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function statusCommand(options?: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n console.log(renderBanner());\n\n const config = await readConfig(projectRoot);\n const summary = await getProjectSummary(projectRoot);\n const capabilities = await listCapabilities(projectRoot);\n\n // Header stats\n const statsLine = [\n `${colors.primary(String(summary.activeChanges))} active`,\n `${colors.success(String(summary.archivedChanges))} archived`,\n `${colors.secondary(String(summary.totalCapabilities))} capabilities`,\n `${colors.muted(\"mode:\")} ${colors.accent(config.mode)}`,\n ].join(colors.muted(\" \\u2502 \"));\n\n console.log(renderBox(statsLine, \"forgelore status\", \"#7C3AED\"));\n\n // Active changes table\n if (summary.changes.length > 0) {\n const table = new Table({\n head: [\n colors.bold(\"Change\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 14, 10, 30],\n });\n\n for (const change of summary.changes) {\n const ts = change.taskSummary;\n const taskStr =\n ts.total > 0\n ? `${ts.passed}/${ts.total}`\n : colors.muted(\"none\");\n const progress =\n ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n ]);\n }\n\n console.log(renderSection(\"Active Changes\", table.toString()));\n } else {\n console.log(\n renderSection(\n \"Active Changes\",\n ` ${colors.muted(\"No active changes.\")} Run ${colors.primary(\"forgelore propose\")} to create one.`\n )\n );\n }\n\n // Capabilities\n if (capabilities.length > 0) {\n const capTable = new Table({\n head: [\n colors.bold(\"Capability\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 25, 16],\n });\n\n for (const cap of capabilities.slice(0, 10)) {\n capTable.push([\n colors.white(cap.name),\n colors.muted(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n ]);\n }\n\n const moreText =\n capabilities.length > 10\n ? `\\n ${colors.muted(`...and ${capabilities.length - 10} more. Run`)} ${colors.primary(\"forgelore capabilities\")} ${colors.muted(\"to see all.\")}`\n : \"\";\n\n console.log(\n renderSection(\"Capabilities\", capTable.toString() + moreText)\n );\n } else {\n console.log(\n renderSection(\n \"Capabilities\",\n ` ${colors.muted(\"No capabilities yet.\")} Archive a completed change to start building the knowledge base.`\n )\n );\n }\n\n // Global sync status\n if (config.mode === \"local+global\" || config.mode === \"global\") {\n const globalInfo = config.global\n ? ` ${icons.info} Source: ${colors.secondary(config.global.source)}\\n` +\n ` ${icons.info} Path: ${colors.muted(config.global.path)}\\n` +\n ` ${icons.info} Auto-sync: ${config.global.autoSync ? colors.success(\"enabled\") : colors.muted(\"disabled\")}`\n : ` ${colors.warning(\"Global spec repo not configured.\")}`;\n\n console.log(renderSection(\"Global Specs\", globalInfo));\n }\n}\n","/**\n * forgelore clarify command\n * Review and refine requirements for a change\n */\n\nimport * as p from \"@clack/prompts\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n updateChangeStatus,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function clarifyCommand(\n changeName: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore clarify \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.\\nRun ${colors.primary(\"forgelore list\")} to see available changes.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Show current state\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n let requirements: string;\n try {\n requirements = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n } catch {\n requirements = \"(not yet defined)\";\n }\n\n let scenarios: string;\n try {\n scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n } catch {\n scenarios = \"(not yet defined)\";\n }\n\n console.log(\n renderBox(\n [\n `${icons.info} Change: ${colors.primary(changeName)}`,\n `${icons.info} Status: ${colors.accent(change.status)}`,\n `${icons.info} Created: ${colors.muted(change.createdAt.slice(0, 10))}`,\n ].join(\"\\n\"),\n \"Change Details\"\n )\n );\n\n console.log(renderSection(\"Proposal\", colors.muted(proposal.slice(0, 500))));\n console.log(renderSection(\"Requirements\", colors.muted(requirements.slice(0, 500))));\n console.log(renderSection(\"Scenarios\", colors.muted(scenarios.slice(0, 500))));\n\n // Clarification checklist\n const checks = await p.group({\n proposalComplete: () =>\n p.confirm({\n message: \"Is the proposal well-defined with clear motivation and scope?\",\n initialValue: false,\n }),\n requirementsDefined: () =>\n p.confirm({\n message: \"Are functional and non-functional requirements specified?\",\n initialValue: false,\n }),\n scenariosCovered: () =>\n p.confirm({\n message: \"Are happy path, edge cases, and error scenarios defined?\",\n initialValue: false,\n }),\n readyForDesign: () =>\n p.confirm({\n message: \"Is this change ready for design and task breakdown?\",\n initialValue: false,\n }),\n });\n\n if (p.isCancel(checks)) {\n p.cancel(\"Clarify cancelled.\");\n process.exit(0);\n }\n\n const allReady = checks.proposalComplete && checks.requirementsDefined && checks.scenariosCovered && checks.readyForDesign;\n\n if (allReady) {\n await updateChangeStatus(projectRoot, changeName, \"planning\");\n console.log(\n renderBox(\n `${icons.success} Change ${colors.primary(changeName)} is ready for design.\\n` +\n `Status updated to ${colors.accent(\"planning\")}.\\n\\n` +\n `Next: Fill in ${colors.primary(\"design.md\")} and ${colors.primary(\"tasks.md\")}`,\n \"Ready\",\n \"#10B981\"\n )\n );\n } else {\n const incomplete = [];\n if (!checks.proposalComplete) incomplete.push(` ${icons.pending} Proposal needs refinement`);\n if (!checks.requirementsDefined) incomplete.push(` ${icons.pending} Requirements need specification`);\n if (!checks.scenariosCovered) incomplete.push(` ${icons.pending} Scenarios need coverage`);\n\n console.log(\n renderBox(\n `${icons.warning} Change ${colors.primary(changeName)} needs more clarification:\\n\\n` +\n incomplete.join(\"\\n\") +\n `\\n\\n${colors.muted(\"Edit the spec files and run\")} ${colors.primary(\"forgelore clarify \" + changeName)} ${colors.muted(\"again.\")}`,\n \"Needs Work\",\n \"#F59E0B\"\n )\n );\n }\n\n p.outro(colors.muted(\"Specs are the foundation. Take the time to get them right.\"));\n}\n","/**\n * forgelore list command\n * List all changes with status and progress\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listChanges,\n} from \"@forgelore/core\";\nimport { summarizeTasks } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function listCommand(options?: {\n archived?: boolean;\n status?: string;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n let changes = await listChanges(projectRoot, options?.archived ?? false);\n\n // Filter by status if specified\n if (options?.status) {\n changes = changes.filter((c) => c.status === options.status);\n }\n\n if (changes.length === 0) {\n const msg = options?.status\n ? `No changes with status \"${options.status}\".`\n : \"No changes found.\";\n console.log(\n renderBox(\n `${icons.info} ${msg}\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Changes\"\n )\n );\n return;\n }\n\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n colors.bold(\"Updated\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [28, 14, 10, 26, 14],\n });\n\n for (const change of changes) {\n const ts = summarizeTasks(change.tasks);\n const taskStr = ts.total > 0 ? `${ts.passed}/${ts.total}` : colors.muted(\"--\");\n const progress = ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n const updated = colors.dim(change.updatedAt.slice(0, 10));\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n updated,\n ]);\n }\n\n const title = options?.archived ? \"All Changes (including archived)\" : \"Active Changes\";\n console.log(renderSection(title, table.toString()));\n console.log(\n colors.muted(` ${changes.length} change${changes.length === 1 ? \"\" : \"s\"} found`)\n );\n}\n","/**\n * forgelore verify command\n * Structural verification of a change's spec completeness\n * NOTE: This does NOT call any LLM — it checks file existence and content structure\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n listChanges,\n getChangePath,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface VerifyCheck {\n name: string;\n passed: boolean;\n message: string;\n}\n\nasync function verifyChange(\n projectRoot: string,\n changeName: string\n): Promise<VerifyCheck[]> {\n const checks: VerifyCheck[] = [];\n const changePath = getChangePath(projectRoot, changeName);\n\n // Check proposal.md exists and has content\n try {\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n const hasContent = proposal.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Proposal\",\n passed: hasContent,\n message: hasContent\n ? \"proposal.md has content\"\n : \"proposal.md is mostly empty — fill in motivation and scope\",\n });\n } catch {\n checks.push({\n name: \"Proposal\",\n passed: false,\n message: \"proposal.md is missing\",\n });\n }\n\n // Check requirements.md\n try {\n const reqs = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n const hasContent = reqs.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Requirements\",\n passed: hasContent,\n message: hasContent\n ? \"requirements.md has content\"\n : \"requirements.md is mostly empty — define functional and non-functional requirements\",\n });\n } catch {\n checks.push({\n name: \"Requirements\",\n passed: false,\n message: \"specs/requirements.md is missing\",\n });\n }\n\n // Check scenarios.md\n try {\n const scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n const hasContent = scenarios.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Scenarios\",\n passed: hasContent,\n message: hasContent\n ? \"scenarios.md has content\"\n : \"scenarios.md is mostly empty — define happy path, edge cases, error cases\",\n });\n } catch {\n checks.push({\n name: \"Scenarios\",\n passed: false,\n message: \"specs/scenarios.md is missing\",\n });\n }\n\n // Check design.md\n try {\n const design = await readChangeFile(projectRoot, changeName, \"design.md\");\n const hasContent = design.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Design\",\n passed: hasContent,\n message: hasContent\n ? \"design.md has content\"\n : \"design.md is mostly empty — describe technical approach\",\n });\n } catch {\n checks.push({\n name: \"Design\",\n passed: false,\n message: \"design.md is missing\",\n });\n }\n\n // Check tasks.md\n try {\n const tasks = await readChangeFile(projectRoot, changeName, \"tasks.md\");\n const hasContent = tasks.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Tasks\",\n passed: hasContent,\n message: hasContent\n ? \"tasks.md has content\"\n : \"tasks.md is mostly empty — break down implementation into tasks\",\n });\n } catch {\n checks.push({\n name: \"Tasks\",\n passed: false,\n message: \"tasks.md is missing\",\n });\n }\n\n return checks;\n}\n\nexport async function verifyCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // If no change specified, verify all active changes\n const changesToVerify: string[] = [];\n if (changeName) {\n changesToVerify.push(changeName);\n } else {\n const changes = await listChanges(projectRoot, false);\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to verify.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Nothing to Verify\"\n )\n );\n return;\n }\n changesToVerify.push(...changes.map((c) => c.name));\n }\n\n let totalPassed = 0;\n let totalChecks = 0;\n\n for (const name of changesToVerify) {\n try {\n const checks = await verifyChange(projectRoot, name);\n const passed = checks.filter((c) => c.passed).length;\n totalPassed += passed;\n totalChecks += checks.length;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}`\n );\n\n const allPassed = passed === checks.length;\n const borderColor = allPassed ? \"#10B981\" : \"#F59E0B\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${checks.length} checks passed\\n\\n${lines.join(\"\\n\")}`,\n name,\n borderColor\n )\n );\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(name)} not found.`,\n name,\n \"#EF4444\"\n )\n );\n }\n }\n\n // Summary\n if (changesToVerify.length > 1) {\n const allPassed = totalPassed === totalChecks;\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${totalPassed}/${totalChecks} total checks passed across ${changesToVerify.length} changes`,\n \"Summary\",\n allPassed ? \"#10B981\" : \"#F59E0B\"\n )\n );\n }\n}\n","/**\n * forgelore archive command\n * Two-step archive: 1) write outcome.md, 2) move to archive + extract capabilities\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n archiveChange,\n readOutcome,\n writeOutcome,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function archiveCommand(\n changeName: string,\n options?: { skipOutcome?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore archive \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Check if outcome.md already exists\n const changePath = getChangePath(projectRoot, changeName);\n const existingOutcome = await readOutcome(changePath);\n\n if (!existingOutcome && !options?.skipOutcome) {\n // Step 1: outcome.md needs to be created\n console.log(\n renderBox(\n [\n `${icons.info} Before archiving, an ${colors.primary(\"outcome.md\")} should be created.`,\n \"\",\n `This file captures:`,\n ` ${icons.bullet} What was built and the final state`,\n ` ${icons.bullet} Capabilities that emerged from this change`,\n ` ${icons.bullet} Lessons learned and patterns established`,\n \"\",\n `${colors.muted(\"An AI agent can generate this, or you can write it manually.\")}`,\n `${colors.muted(\"Create\")} ${colors.primary(`forgelore/changes/${changeName}/outcome.md`)} ${colors.muted(\"and run archive again.\")}`,\n ].join(\"\\n\"),\n \"Step 1: Outcome\",\n \"#F59E0B\"\n )\n );\n\n const proceed = await p.confirm({\n message: \"Create a placeholder outcome.md and continue archiving?\",\n initialValue: false,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel(\"Archive paused. Create outcome.md and run archive again.\");\n process.exit(0);\n }\n\n // Write placeholder outcome\n const placeholderOutcome = `# Outcome: ${changeName}\n\n## What Was Built\n\n<!-- Summary of what was implemented -->\n\n\n## Capabilities\n\n<!-- List capabilities that emerged from this change -->\n<!-- Format: - **Capability Name**: Description -->\n\n- \n\n## Lessons Learned\n\n<!-- What did we learn? Any patterns to document? -->\n\n\n## Files Changed\n\n<!-- Key files that were created or modified -->\n\n- \n\n---\n\n*Archived: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n await writeOutcome(changePath, placeholderOutcome);\n console.log(` ${icons.success} Created placeholder outcome.md`);\n }\n\n // Step 2: Archive\n const confirmArchive = await p.confirm({\n message: `Archive \"${changeName}\"? This will move it to forgelore/changes/archive/`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmArchive) || !confirmArchive) {\n p.cancel(\"Archive cancelled.\");\n process.exit(0);\n }\n\n const spinner = ora({\n text: \"Archiving change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const archivePath = await archiveChange(projectRoot, changeName);\n spinner.succeed(colors.success(\"Change archived\"));\n\n console.log(\n renderBox(\n [\n `${icons.success} ${colors.white(\"Archived:\")} ${colors.primary(changeName)}`,\n `${icons.arrow} ${colors.muted(archivePath)}`,\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Review ${colors.primary(\"outcome.md\")} and extract capabilities`,\n ` 2. Run ${colors.primary(\"forgelore capabilities\")} to view the knowledge base`,\n ` 3. Update ${colors.primary(\"forgelore/knowledge/architecture.md\")} if needed`,\n ].join(\"\\n\"),\n \"Archived\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Failed to archive\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(colors.muted(\"Knowledge captured. The spec lives on.\"));\n}\n","/**\n * forgelore sync command\n * Sync with global spec repository\n */\n\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport {\n configExists,\n readConfig,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function syncCommand(options?: {\n force?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const config = await readConfig(projectRoot);\n\n if (config.mode === \"local\") {\n console.log(\n renderBox(\n `${icons.info} Spec mode is ${colors.primary(\"local\")}. No global repo to sync.\\n` +\n `Run ${colors.primary(\"forgelore config mode local+global\")} to enable global specs.`,\n \"No Sync Needed\"\n )\n );\n return;\n }\n\n if (!config.global?.source) {\n console.log(\n renderBox(\n `${icons.error} Global spec source not configured.\\n` +\n `Run ${colors.primary(\"forgelore config global.source <path-or-url>\")} to set it.`,\n \"Not Configured\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const source = config.global.source;\n const isGitUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\") || source.startsWith(\"git@\");\n const targetPath = config.global.path;\n\n const spinner = ora({\n text: `Syncing from ${source}...`,\n color: \"magenta\",\n }).start();\n\n try {\n if (isGitUrl) {\n // Git clone or pull\n if (existsSync(targetPath)) {\n spinner.text = \"Pulling latest changes...\";\n execSync(\"git pull --ff-only\", { cwd: targetPath, stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs updated (git pull)\"));\n } else {\n spinner.text = \"Cloning global spec repo...\";\n mkdirSync(targetPath, { recursive: true });\n execSync(`git clone ${source} ${targetPath}`, { stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs cloned\"));\n }\n } else {\n // Filesystem path — just validate it exists\n if (existsSync(source)) {\n spinner.succeed(\n colors.success(`Global specs linked: ${colors.muted(source)}`)\n );\n } else {\n spinner.fail(\n colors.error(`Global spec path not found: ${source}`)\n );\n process.exit(1);\n }\n }\n\n console.log(\n renderBox(\n [\n `${icons.success} Global specs synced`,\n `${icons.info} Source: ${colors.secondary(source)}`,\n `${icons.info} Path: ${colors.muted(targetPath)}`,\n ].join(\"\\n\"),\n \"Sync Complete\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Sync failed\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n}\n","/**\n * forgelore doctor command\n * Health check and diagnostics for forgelore configuration\n */\n\nimport ora from \"ora\";\nimport { resolve, join } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n configExists,\n readConfig,\n fileExists,\n getForgeloreDir,\n listChanges,\n listCapabilities,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\ninterface HealthCheck {\n name: string;\n passed: boolean;\n message: string;\n fixable?: boolean;\n}\n\nexport async function doctorCommand(options?: {\n fix?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n const forgeloreDir = getForgeloreDir(projectRoot);\n const checks: HealthCheck[] = [];\n\n console.log(\n renderBox(\n `${icons.info} Running health checks...`,\n \"forgelore doctor\"\n )\n );\n\n // 1. Config exists\n const hasConfig = await configExists(projectRoot);\n checks.push({\n name: \"Configuration\",\n passed: hasConfig,\n message: hasConfig\n ? \"forgelore.json found\"\n : \"forgelore.json not found — run forgelore init\",\n });\n\n if (!hasConfig) {\n printResults(checks);\n return;\n }\n\n // 2. Config parseable\n let config;\n try {\n config = await readConfig(projectRoot);\n checks.push({\n name: \"Config Valid\",\n passed: true,\n message: `Config parsed (v${config.version}, mode: ${config.mode})`,\n });\n } catch (err) {\n checks.push({\n name: \"Config Valid\",\n passed: false,\n message: `Config parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n printResults(checks);\n return;\n }\n\n // 3. Directory structure\n const dirs = [\n { path: join(forgeloreDir, \"changes\"), name: \"changes/\" },\n { path: join(forgeloreDir, \"changes\", \"archive\"), name: \"changes/archive/\" },\n { path: join(forgeloreDir, \"knowledge\"), name: \"knowledge/\" },\n { path: join(forgeloreDir, \"knowledge\", \"capabilities\"), name: \"knowledge/capabilities/\" },\n { path: join(forgeloreDir, \"knowledge\", \"decisions\"), name: \"knowledge/decisions/\" },\n ];\n\n for (const dir of dirs) {\n const exists = await fileExists(dir.path);\n checks.push({\n name: `Dir: ${dir.name}`,\n passed: exists,\n message: exists ? `${dir.name} exists` : `${dir.name} missing`,\n fixable: true,\n });\n\n if (!exists && options?.fix) {\n await mkdir(dir.path, { recursive: true });\n }\n }\n\n // 4. Knowledge base files\n const knowledgeFiles = [\n { path: join(forgeloreDir, \"knowledge\", \"architecture.md\"), name: \"architecture.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"patterns.md\"), name: \"patterns.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"glossary.md\"), name: \"glossary.md\" },\n ];\n\n for (const file of knowledgeFiles) {\n const exists = await fileExists(file.path);\n checks.push({\n name: `KB: ${file.name}`,\n passed: exists,\n message: exists ? `${file.name} present` : `${file.name} missing`,\n });\n }\n\n // 5. Changes health\n try {\n const changes = await listChanges(projectRoot, false);\n checks.push({\n name: \"Active Changes\",\n passed: true,\n message: `${changes.length} active change${changes.length === 1 ? \"\" : \"s\"}`,\n });\n\n // Check for orphaned metadata\n for (const change of changes) {\n const hasProposal = await fileExists(join(change.path, \"proposal.md\"));\n if (!hasProposal) {\n checks.push({\n name: `Change: ${change.name}`,\n passed: false,\n message: `${change.name} has metadata but missing proposal.md`,\n });\n }\n }\n } catch {\n checks.push({\n name: \"Active Changes\",\n passed: false,\n message: \"Could not read changes directory\",\n });\n }\n\n // 6. Global sync (if applicable)\n if (config.mode !== \"local\" && config.global) {\n const globalExists = await fileExists(config.global.path);\n checks.push({\n name: \"Global Repo\",\n passed: globalExists,\n message: globalExists\n ? `Global specs available at ${config.global.path}`\n : `Global specs not found at ${config.global.path} — run forgelore sync`,\n });\n }\n\n printResults(checks, options?.fix);\n}\n\nfunction printResults(checks: HealthCheck[], didFix?: boolean): void {\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const allPassed = passed === total;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}${!c.passed && c.fixable && didFix ? colors.success(\" (fixed)\") : \"\"}`\n );\n\n const borderColor = allPassed ? \"#10B981\" : passed > total / 2 ? \"#F59E0B\" : \"#EF4444\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${total} checks passed\\n\\n${lines.join(\"\\n\")}`,\n \"Results\",\n borderColor\n )\n );\n\n if (!allPassed && !didFix) {\n const fixable = checks.filter((c) => !c.passed && c.fixable).length;\n if (fixable > 0) {\n console.log(\n colors.muted(` Run ${colors.primary(\"forgelore doctor --fix\")} to auto-fix ${fixable} issue${fixable === 1 ? \"\" : \"s\"}.`)\n );\n }\n }\n}\n","/**\n * forgelore capabilities command\n * List all registered capabilities in the knowledge base\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listCapabilities,\n} from \"@forgelore/core\";\nimport type { Capability } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function capabilitiesCommand(options?: {\n json?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const capabilities = await listCapabilities(projectRoot);\n\n if (capabilities.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No capabilities registered yet.\\n\\n` +\n `Capabilities are extracted when changes are archived.\\n` +\n `Archive a completed change with ${colors.primary(\"forgelore archive <change>\")} to start building\\nyour knowledge base.`,\n \"Capabilities\"\n )\n );\n return;\n }\n\n // JSON output\n if (options?.json) {\n console.log(JSON.stringify(capabilities, null, 2));\n return;\n }\n\n // Table output\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Description\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n colors.bold(\"Tags\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [22, 30, 18, 14, 16],\n wordWrap: true,\n });\n\n for (const cap of capabilities) {\n table.push([\n colors.white(cap.name),\n colors.muted(cap.description.slice(0, 60)),\n colors.secondary(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n cap.tags?.length ? colors.accent(cap.tags.join(\", \")) : colors.muted(\"--\"),\n ]);\n }\n\n console.log(renderSection(\"Capabilities\", table.toString()));\n console.log(\n colors.muted(\n ` ${capabilities.length} capabilit${capabilities.length === 1 ? \"y\" : \"ies\"} registered`\n )\n );\n}\n","/**\n * forgelore config command\n * Get, set, or list configuration values\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readConfig,\n getConfigValue,\n setConfigValue,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function configCommand(\n key?: string,\n value?: string,\n options?: { list?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // List all config\n if (options?.list || (!key && !value)) {\n const config = await readConfig(projectRoot);\n const lines = formatObject(config, \"\");\n\n console.log(\n renderSection(\"Configuration\", lines.join(\"\\n\"))\n );\n return;\n }\n\n // Get value\n if (key && !value) {\n const val = await getConfigValue(projectRoot, key);\n if (val === undefined) {\n console.log(\n ` ${icons.error} Key ${colors.primary(key)} not found in config.`\n );\n process.exit(1);\n }\n\n if (typeof val === \"object\" && val !== null) {\n const lines = formatObject(val as Record<string, unknown>, \"\");\n console.log(renderSection(key, lines.join(\"\\n\")));\n } else {\n console.log(` ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(val))}`);\n }\n return;\n }\n\n // Set value\n if (key && value) {\n // Parse value — try JSON, booleans, numbers, then string\n let parsed: unknown = value;\n if (value === \"true\") parsed = true;\n else if (value === \"false\") parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n else {\n try {\n parsed = JSON.parse(value);\n } catch {\n // keep as string\n }\n }\n\n await setConfigValue(projectRoot, key, parsed);\n console.log(\n ` ${icons.success} Set ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(parsed))}`\n );\n }\n}\n\nfunction formatObject(\n obj: Record<string, unknown>,\n prefix: string\n): string[] {\n const lines: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${k}` : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n lines.push(` ${colors.muted(fullKey + \":\")}`);\n lines.push(...formatObject(v as Record<string, unknown>, fullKey));\n } else {\n lines.push(\n ` ${colors.primary(fullKey)} ${colors.muted(\"=\")} ${colors.white(String(v))}`\n );\n }\n }\n return lines;\n}\n","/**\n * forgelore diff command\n * Show structural drift between specs and current project state\n * NOTE: This is a structural check, not an LLM-powered analysis\n */\n\nimport { resolve, relative } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listChanges,\n readChange,\n readChangeFile,\n getChangesDir,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface DriftItem {\n type: string;\n severity: \"info\" | \"warning\" | \"critical\";\n message: string;\n}\n\nexport async function diffCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const driftItems: DriftItem[] = [];\n\n if (changeName) {\n // Analyze a specific change\n try {\n const change = await readChange(projectRoot, changeName);\n await analyzeChangeDrift(projectRoot, changeName, driftItems);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n } else {\n // Analyze all active changes\n const changes = await listChanges(projectRoot, false);\n\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to analyze.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"No Changes\"\n )\n );\n return;\n }\n\n for (const change of changes) {\n await analyzeChangeDrift(projectRoot, change.name, driftItems);\n }\n }\n\n if (driftItems.length === 0) {\n console.log(\n renderBox(\n `${icons.success} No drift detected. Specs and implementation are in sync.`,\n \"All Clear\",\n \"#10B981\"\n )\n );\n return;\n }\n\n // Display drift items\n const table = new Table({\n head: [\n colors.bold(\"Severity\"),\n colors.bold(\"Type\"),\n colors.bold(\"Message\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [12, 20, 55],\n wordWrap: true,\n });\n\n for (const item of driftItems) {\n const sevColor =\n item.severity === \"critical\"\n ? colors.error\n : item.severity === \"warning\"\n ? colors.warning\n : colors.muted;\n\n table.push([\n sevColor(item.severity),\n colors.white(item.type),\n colors.muted(item.message),\n ]);\n }\n\n const critical = driftItems.filter((d) => d.severity === \"critical\").length;\n const warnings = driftItems.filter((d) => d.severity === \"warning\").length;\n const info = driftItems.filter((d) => d.severity === \"info\").length;\n\n const summaryParts = [];\n if (critical > 0) summaryParts.push(colors.error(`${critical} critical`));\n if (warnings > 0) summaryParts.push(colors.warning(`${warnings} warnings`));\n if (info > 0) summaryParts.push(colors.muted(`${info} info`));\n\n console.log(\n renderSection(\"Drift Report\", table.toString())\n );\n console.log(\n renderBox(\n `${critical > 0 ? icons.error : icons.warning} ${summaryParts.join(\", \")}`,\n \"Summary\",\n critical > 0 ? \"#EF4444\" : \"#F59E0B\"\n )\n );\n}\n\nasync function analyzeChangeDrift(\n projectRoot: string,\n changeName: string,\n items: DriftItem[]\n): Promise<void> {\n // Check for stale changes (proposed but no activity for 7+ days)\n try {\n const change = await readChange(projectRoot, changeName);\n const updatedAt = new Date(change.updatedAt);\n const daysSince = Math.floor(\n (Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (daysSince > 14 && change.status === \"proposed\") {\n items.push({\n type: \"stale-proposal\",\n severity: \"warning\",\n message: `\"${changeName}\" proposed ${daysSince} days ago with no progress`,\n });\n }\n\n if (daysSince > 7 && change.status === \"in-progress\") {\n items.push({\n type: \"stale-progress\",\n severity: \"info\",\n message: `\"${changeName}\" in progress for ${daysSince} days since last update`,\n });\n }\n\n // Check for empty spec files\n const specFiles = [\"proposal.md\", \"specs/requirements.md\", \"specs/scenarios.md\", \"design.md\", \"tasks.md\"];\n for (const file of specFiles) {\n try {\n const content = await readChangeFile(projectRoot, changeName, file);\n const stripped = content.replace(/<!--.*?-->/gs, \"\").trim();\n if (stripped.length < 30) {\n items.push({\n type: \"empty-spec\",\n severity: change.status === \"in-progress\" ? \"warning\" : \"info\",\n message: `\"${changeName}/${file}\" has minimal content`,\n });\n }\n } catch {\n items.push({\n type: \"missing-file\",\n severity: \"critical\",\n message: `\"${changeName}/${file}\" is missing`,\n });\n }\n }\n\n // Check for tasks with no progress if status is in-progress\n if (\n change.status === \"in-progress\" &&\n change.tasks.length > 0 &&\n change.tasks.every((t) => t.status === \"pending\")\n ) {\n items.push({\n type: \"no-task-progress\",\n severity: \"warning\",\n message: `\"${changeName}\" is in-progress but all ${change.tasks.length} tasks are still pending`,\n });\n }\n } catch {\n items.push({\n type: \"read-error\",\n severity: \"critical\",\n message: `Could not read change \"${changeName}\"`,\n });\n }\n}\n"],"mappings":"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","names":["chalk","gradient","gradient","chalk","p","ora","resolve","configExists","text","resolve","configExists","ora","resolve","configExists","resolve","configExists","p","resolve","configExists","resolve","configExists","resolve","Table","configExists","resolve","configExists","Table","resolve","configExists","readChangeFile","listChanges","getChangePath","getChangePath","readChangeFile","resolve","configExists","listChanges","p","ora","resolve","configExists","readChange","getChangePath","resolve","configExists","readChange","getChangePath","ora","ora","resolve","configExists","readConfig","resolve","configExists","readConfig","ora","resolve","mkdir","configExists","readConfig","fileExists","getForgeloreDir","listChanges","resolve","getForgeloreDir","configExists","readConfig","fileExists","mkdir","listChanges","resolve","Table","configExists","listCapabilities","resolve","configExists","listCapabilities","Table","resolve","configExists","readConfig","resolve","configExists","readConfig","resolve","Table","configExists","listChanges","readChange","readChangeFile","resolve","configExists","readChange","listChanges","Table","readChangeFile"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgelore/cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Beautiful CLI for spec-driven development — forge knowledge, shape code",
5
5
  "type": "module",
6
6
  "bin": {