@forgelore/cli 0.2.0 → 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,60 +100,32 @@ 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
104
  var LORE_VIOLET = "#7C3AED";
106
105
  var LORE_CYAN = "#06B6D4";
107
106
  var DARK = "#2A2A2A";
108
107
  var FLASH_WARM = "#FFF0D0";
109
- var brandGradient = gradient2([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);
110
- var TITLE_COLORS = [
111
- "#CC5500",
112
- // F deep Sedona
113
- "#D46020",
114
- // O
115
- "#DC7030",
116
- // R
117
- "#F5A050",
118
- // G — Sedona sunset
119
- "#C09040",
120
- // E — transitioning
121
- "#9060B0",
122
- // L — blending
123
- "#7C3AED",
124
- // O — lore violet
125
- "#4196CB",
126
- // R
127
- "#06B6D4"
128
- // 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 "
129
116
  ];
130
- var BOOK_LINES = [
131
- " .\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500.",
132
- " \u2571 \u2261 \u2261 \u2261 \u2261 \u2261 \u2571\u2502",
133
- " \u2571 \u2261 \u2261 \u2261 \u2261 \u2261 \u2571 \u2502",
134
- " \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502",
135
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502 \u2502",
136
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502 \u2571",
137
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502\u2571",
138
- " \u2514\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2518"
139
- ];
140
- var ANVIL_LINES = [
141
- " \u2554\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2557",
142
- " \u2501\u2501\u2501\u2501\u2501\u2563\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2560\u2501\u2501\u2501\u2501\u2501",
143
- " \u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551",
144
- " \u255A\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u255D",
145
- " \u2588\u2588\u2588\u2588\u2588\u2567\u2588\u2588\u2588\u2588\u2588\u2588",
146
- " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588"
147
- ];
148
- var TOTAL_ART_LINES = BOOK_LINES.length + ANVIL_LINES.length;
149
- var JUNCTION = BOOK_LINES.length - 1;
117
+ var TOTAL_LOGO_LINES = LOGO_LINES.length;
150
118
  var SPARK_POOL = [
151
119
  { char: "\u2726", bright: ["#F5A050", "#FFD090", "#FFF0D0"] },
120
+ // ✦
152
121
  { char: "\u2727", bright: ["#FFD090", "#FFF0D0"] },
122
+ // ✧
153
123
  { char: "\u2736", bright: ["#E07020", "#F5A050"] },
124
+ // ✶
154
125
  { char: "\u2217", bright: ["#CC5500", "#E07020"] },
155
- { char: "\xB7", bright: ["#F5A050", "#FFD090"] },
156
- { char: "\u02DA", bright: ["#CC8800", "#F5A050"] }
126
+ //
127
+ { char: "\xB7", bright: ["#F5A050", "#FFD090"] }
128
+ // ·
157
129
  ];
158
130
  var EMBER_COLORS = ["#996600", "#805500"];
159
131
  var HIDE_CURSOR = "\x1B[?25l";
@@ -178,30 +150,19 @@ function lerpHex(a, b, t) {
178
150
  const [r2, g2, b2] = parseHex(b);
179
151
  return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);
180
152
  }
181
- function colorArt(heat, flash = 0) {
153
+ function colorLogo(heat, flash = 0) {
182
154
  const t = Math.max(0, Math.min(1, heat));
183
155
  const f = Math.max(0, Math.min(1, flash));
184
- const bkS = lerpHex(DARK, LORE_VIOLET, t);
185
- const bkE = lerpHex(DARK, LORE_CYAN, t);
186
- const avS = lerpHex(DARK, SEDONA, t);
187
- const avE = lerpHex(DARK, SEDONA_SUNSET, t);
188
- const fbkS = lerpHex(bkS, FLASH_WARM, f);
189
- const fbkE = lerpHex(bkE, FLASH_WARM, f);
190
- const favS = lerpHex(avS, FLASH_WARM, f);
191
- const favE = lerpHex(avE, FLASH_WARM, f);
192
- const bookColored = BOOK_LINES.map((line, i) => {
193
- if (f > 0 && i >= BOOK_LINES.length - 2) {
194
- return gradient2([fbkS, fbkE])(line);
195
- }
196
- return gradient2([bkS, bkE])(line);
197
- });
198
- const anvilColored = ANVIL_LINES.map((line, i) => {
199
- if (f > 0 && i < 2) {
200
- return gradient2([favS, favE])(line);
201
- }
202
- return gradient2([avS, avE])(line);
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;
203
163
  });
204
- return [...bookColored, ...anvilColored];
164
+ const grad = gradient2(stops);
165
+ return LOGO_LINES.map((line) => grad(line));
205
166
  }
206
167
  function randomSpark(bright = true) {
207
168
  const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];
@@ -210,29 +171,25 @@ function randomSpark(bright = true) {
210
171
  }
211
172
  function sparkOverlay(frame) {
212
173
  const sp = /* @__PURE__ */ new Map();
213
- const j = JUNCTION;
214
174
  if (frame === 0) {
215
- sp.set(j - 1, " " + randomSpark() + randomSpark());
216
- sp.set(j, " " + randomSpark() + " " + randomSpark() + randomSpark());
217
- sp.set(j + 1, " " + randomSpark() + randomSpark());
218
- sp.set(j + 2, " " + randomSpark());
175
+ sp.set(0, " " + randomSpark() + randomSpark());
176
+ sp.set(1, " " + randomSpark() + " " + randomSpark());
177
+ sp.set(2, " " + randomSpark() + randomSpark());
178
+ sp.set(3, " " + randomSpark());
179
+ sp.set(4, " " + randomSpark());
219
180
  } else if (frame === 1) {
220
- sp.set(j - 3, " " + randomSpark());
221
- sp.set(j - 2, " " + randomSpark() + " " + randomSpark());
222
- sp.set(j - 1, " " + randomSpark() + " " + randomSpark());
223
- sp.set(j, " " + randomSpark() + " " + randomSpark());
224
- sp.set(j + 1, " " + randomSpark() + " " + randomSpark());
225
- sp.set(j + 2, " " + randomSpark());
226
- sp.set(j + 3, " " + 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());
227
186
  } else if (frame === 2) {
228
- sp.set(j - 4, " " + randomSpark(false));
229
- sp.set(j - 2, " " + randomSpark());
230
- sp.set(j, " " + randomSpark(false) + " " + randomSpark());
231
- sp.set(j + 2, " " + randomSpark(false));
232
- sp.set(j + 4, " " + randomSpark(false));
187
+ sp.set(0, " " + randomSpark(false));
188
+ sp.set(2, " " + randomSpark());
189
+ sp.set(4, " " + randomSpark(false));
233
190
  } else if (frame === 3) {
234
- sp.set(j - 3, " " + randomSpark(false));
235
- sp.set(j + 1, " " + randomSpark(false));
191
+ sp.set(1, " " + randomSpark(false));
192
+ sp.set(3, " " + randomSpark(false));
236
193
  }
237
194
  return sp;
238
195
  }
@@ -241,18 +198,13 @@ function writeFrame(lines, sparks) {
241
198
  process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || "") + "\n");
242
199
  }
243
200
  }
244
- function getTitle() {
245
- return "FORGELORE".split("").map((ch, i) => chalk2.bold(chalk2.hex(TITLE_COLORS[i])(ch))).join("");
246
- }
247
201
  function renderBanner() {
248
- const art = colorArt(1).join("\n");
249
- const title = ` ${getTitle()}`;
202
+ const logo = colorLogo(1).join("\n");
250
203
  const tagline = colors.muted(" forge knowledge, shape code");
251
- const version = chalk2.dim(" v0.2.0");
204
+ const version = chalk2.dim(" v0.2.2");
252
205
  return `
253
- ${art}
206
+ ${logo}
254
207
 
255
- ${title}
256
208
  ${tagline}${version}
257
209
  `;
258
210
  }
@@ -264,48 +216,35 @@ async function renderAnimatedBanner() {
264
216
  process.stdout.write(HIDE_CURSOR);
265
217
  try {
266
218
  console.log("");
267
- const coldArt = colorArt(0.08);
268
- for (const line of coldArt) {
219
+ const coldLogo = colorLogo(0.06);
220
+ for (const line of coldLogo) {
269
221
  process.stdout.write(CLEAR_LINE + line + "\n");
270
222
  await sleep(20);
271
223
  }
272
- 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];
273
225
  for (const heat of heatSteps) {
274
- process.stdout.write(moveUp(TOTAL_ART_LINES));
275
- const frame = colorArt(heat);
226
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
227
+ const frame = colorLogo(heat);
276
228
  for (const line of frame) {
277
229
  process.stdout.write(CLEAR_LINE + line + "\n");
278
230
  }
279
231
  await sleep(55);
280
232
  }
281
- process.stdout.write(moveUp(TOTAL_ART_LINES));
282
- writeFrame(colorArt(1, 0.6), sparkOverlay(0));
233
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
234
+ writeFrame(colorLogo(1, 0.5), sparkOverlay(0));
283
235
  await sleep(65);
284
- for (let f = 1; f <= 4; f++) {
285
- const flashDecay = Math.max(0, 0.45 - f * 0.15);
286
- process.stdout.write(moveUp(TOTAL_ART_LINES));
287
- 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));
288
240
  await sleep(65);
289
241
  }
290
- process.stdout.write(moveUp(TOTAL_ART_LINES));
291
- writeFrame(colorArt(1), /* @__PURE__ */ new Map());
292
- console.log("");
293
- process.stdout.write(" ");
294
- const title = "FORGELORE";
295
- for (let i = 0; i < title.length; i++) {
296
- process.stdout.write(chalk2.hex(SEDONA_GLOW)("\u2588"));
297
- await sleep(15);
298
- process.stdout.write("\b" + chalk2.hex("#CC7744")("\u2593"));
299
- await sleep(15);
300
- process.stdout.write(
301
- "\b" + chalk2.bold(chalk2.hex(TITLE_COLORS[i])(title[i]))
302
- );
303
- await sleep(25);
304
- }
242
+ process.stdout.write(moveUp(TOTAL_LOGO_LINES));
243
+ writeFrame(colorLogo(1), /* @__PURE__ */ new Map());
244
+ await sleep(150);
305
245
  console.log("");
306
- await sleep(120);
307
246
  console.log(
308
- colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.2.0")
247
+ colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.2.2")
309
248
  );
310
249
  console.log("");
311
250
  } finally {
@@ -1689,7 +1628,7 @@ async function analyzeChangeDrift(projectRoot, changeName, items) {
1689
1628
 
1690
1629
  // src/index.ts
1691
1630
  var program = new Command();
1692
- program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.2.0");
1631
+ program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.2.2");
1693
1632
  program.command("init").description("Initialize forgelore in the current project").option("-C, --cwd <path>", "Working directory").action((opts) => initCommand({ cwd: opts.cwd }));
1694
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 }));
1695
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.0\");\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 * Anvil + book ASCII art with forge heat-up animation\n *\n * Animation concept: the art starts cold (barely visible), heats up through\n * Sedona red-rock tones to full color, then a burst of sparks erupts at the\n * book-anvil junction. The title forges letter by letter from ember to final.\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// 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 ───────────────────────────────────────────────\n\nconst BOOK_LINES = [\n \" .───────────.\",\n \" ╱ ≡ ≡ ≡ ≡ ≡ ╱│\",\n \" ╱ ≡ ≡ ≡ ≡ ≡ ╱ │\",\n \" ├───────────┤ │\",\n \" │ ≡ ≡ ≡ ≡ ≡ │ │\",\n \" │ ≡ ≡ ≡ ≡ ≡ │ ╱\",\n \" │ ≡ ≡ ≡ ≡ ≡ │╱\",\n \" └─────┬─────┘\",\n];\n\nconst ANVIL_LINES = [\n \" ╔═══╧════╗\",\n \" ━━━━━╣████████╠━━━━━\",\n \" ║████████║\",\n \" ╚═══╤════╝\",\n \" █████╧██████\",\n \" ████████████████\",\n];\n\nconst TOTAL_ART_LINES = BOOK_LINES.length + ANVIL_LINES.length;\nconst JUNCTION = BOOK_LINES.length - 1; // line where book meets anvil\n\n// Spark characters with warm Sedona color pools\nconst SPARK_POOL = [\n { char: \"✦\", bright: [\"#F5A050\", \"#FFD090\", \"#FFF0D0\"] },\n { char: \"✧\", bright: [\"#FFD090\", \"#FFF0D0\"] },\n { char: \"✶\", bright: [\"#E07020\", \"#F5A050\"] },\n { char: \"∗\", bright: [\"#CC5500\", \"#E07020\"] },\n { char: \"·\", bright: [\"#F5A050\", \"#FFD090\"] },\n { char: \"˚\", 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 * Color the full art at a given heat level.\n * heat — 0 (cold, dark gray) to 1 (full Sedona / lore color)\n * flash — 0–1, brightens junction lines toward warm-white\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 // Book: lore gradient modulated by heat\n const bkS = lerpHex(DARK, LORE_VIOLET, t);\n const bkE = lerpHex(DARK, LORE_CYAN, t);\n // Anvil: forge gradient modulated by heat\n const avS = lerpHex(DARK, SEDONA, t);\n const avE = lerpHex(DARK, SEDONA_SUNSET, t);\n\n // Junction flash variants\n const fbkS = lerpHex(bkS, FLASH_WARM, f);\n const fbkE = lerpHex(bkE, FLASH_WARM, f);\n const favS = lerpHex(avS, FLASH_WARM, f);\n const favE = lerpHex(avE, FLASH_WARM, f);\n\n const bookColored = BOOK_LINES.map((line, i) => {\n if (f > 0 && i >= BOOK_LINES.length - 2) {\n return gradient([fbkS, fbkE])(line);\n }\n return gradient([bkS, bkE])(line);\n });\n\n const anvilColored = ANVIL_LINES.map((line, i) => {\n if (f > 0 && i < 2) {\n return gradient([favS, favE])(line);\n }\n return gradient([avS, avE])(line);\n });\n\n return [...bookColored, ...anvilColored];\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 * Generate spark decorations for each art line at a burst frame.\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 const j = JUNCTION;\n\n if (frame === 0) {\n sp.set(j - 1, \" \" + randomSpark() + randomSpark());\n sp.set(j, \" \" + randomSpark() + \" \" + randomSpark() + randomSpark());\n sp.set(j + 1, \" \" + randomSpark() + randomSpark());\n sp.set(j + 2, \" \" + randomSpark());\n } else if (frame === 1) {\n sp.set(j - 3, \" \" + randomSpark());\n sp.set(j - 2, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(j - 1, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(j, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(j + 1, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(j + 2, \" \" + randomSpark());\n sp.set(j + 3, \" \" + randomSpark());\n } else if (frame === 2) {\n sp.set(j - 4, \" \" + randomSpark(false));\n sp.set(j - 2, \" \" + randomSpark());\n sp.set(j, \" \" + randomSpark(false) + \" \" + randomSpark());\n sp.set(j + 2, \" \" + randomSpark(false));\n sp.set(j + 4, \" \" + randomSpark(false));\n } else if (frame === 3) {\n sp.set(j - 3, \" \" + randomSpark(false));\n sp.set(j + 1, \" \" + 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.0\");\n return `\\n${art}\\n\\n${title}\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — forge heat-up, impact sparks, title forging\n *\n * Timeline (~1.6s):\n * Cold reveal 280ms (14 lines × 20ms)\n * Heat-up 330ms (6 steps × 55ms)\n * Impact 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 // Lines appear barely visible, like cooling metal in the dark\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 // Art warms from dark to full Sedona / lore color\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: Impact flash + spark burst ───────────────────\n // Junction flashes white-hot, sparks erupt outward\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0, 0.6), sparkOverlay(0));\n await sleep(65);\n\n // Burst frames with decaying flash\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 // Each letter: ember block → cooling metal → final color\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)(\"█\"));\n await sleep(15);\n process.stdout.write(\"\\b\" + chalk.hex(\"#CC7744\")(\"▓\"));\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.0\")\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"]}
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.0",
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": {