@forgelore/cli 0.1.0 → 0.2.1

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
@@ -26,18 +26,18 @@ import gradient2 from "gradient-string";
26
26
  import chalk from "chalk";
27
27
  import gradient from "gradient-string";
28
28
  var colors = {
29
- primary: chalk.hex("#FF6B35"),
30
- // forge orange
29
+ primary: chalk.hex("#CC5500"),
30
+ // Sedona orange (red rock)
31
31
  secondary: chalk.hex("#06B6D4"),
32
32
  // lore cyan
33
- accent: chalk.hex("#FFD700"),
34
- // spark gold
33
+ accent: chalk.hex("#F5A050"),
34
+ // Sedona sunset gold
35
35
  lore: chalk.hex("#7C3AED"),
36
36
  // lore violet
37
37
  success: chalk.hex("#10B981"),
38
38
  // emerald
39
- warning: chalk.hex("#F97316"),
40
- // orange
39
+ warning: chalk.hex("#E07020"),
40
+ // Sedona warm warning
41
41
  error: chalk.hex("#EF4444"),
42
42
  // red
43
43
  muted: chalk.hex("#6B7280"),
@@ -47,13 +47,13 @@ var colors = {
47
47
  white: chalk.white
48
48
  };
49
49
  var gradients = {
50
- brand: gradient(["#FF6B35", "#FFD700", "#7C3AED", "#06B6D4"]),
51
- forge: gradient(["#FF6B35", "#FFD700"]),
50
+ brand: gradient(["#CC5500", "#F5A050", "#7C3AED", "#06B6D4"]),
51
+ forge: gradient(["#CC5500", "#F5A050"]),
52
52
  lore: gradient(["#7C3AED", "#06B6D4"]),
53
- warm: gradient(["#F59E0B", "#EF4444"]),
53
+ warm: gradient(["#F5A050", "#EF4444"]),
54
54
  cool: gradient(["#06B6D4", "#7C3AED"]),
55
55
  success: gradient(["#10B981", "#06B6D4"]),
56
- sunset: gradient(["#F97316", "#EF4444", "#7C3AED"])
56
+ sunset: gradient(["#E07020", "#EF4444", "#7C3AED"])
57
57
  };
58
58
  var icons = {
59
59
  success: colors.success("\u2713"),
@@ -99,82 +99,189 @@ function progressBar(percent, width = 20) {
99
99
  }
100
100
 
101
101
  // src/ui/banner.ts
102
- var forgeGradient = gradient2(["#FF6B35", "#FFD700"]);
103
- var loreGradient = gradient2(["#7C3AED", "#06B6D4"]);
104
- var brandGradient = gradient2(["#FF6B35", "#FFD700", "#7C3AED", "#06B6D4"]);
105
- var sparkColor = chalk2.hex("#FFD700");
106
- var emberColor = chalk2.hex("#FF6B35");
107
- var TITLE_GRADIENT = [
108
- "#FF6B35",
109
- // F - forge orange
110
- "#FF8E3C",
102
+ var SEDONA = "#CC5500";
103
+ var SEDONA_GLOW = "#E07020";
104
+ var SEDONA_SUNSET = "#F5A050";
105
+ var FLAME_TIP = "#FFEECC";
106
+ var LORE_VIOLET = "#7C3AED";
107
+ var LORE_CYAN = "#06B6D4";
108
+ var DARK = "#2A2A2A";
109
+ var FLASH_WARM = "#FFF0D0";
110
+ var brandGradient = gradient2([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);
111
+ var TITLE_COLORS = [
112
+ "#CC5500",
113
+ // F — deep Sedona
114
+ "#D46020",
111
115
  // O
112
- "#FFB347",
116
+ "#DC7030",
113
117
  // R
114
- "#FFD700",
115
- // G - spark gold
116
- "#C9A832",
117
- // E
118
- "#9B6FC0",
119
- // L - transitioning
118
+ "#F5A050",
119
+ // G Sedona sunset
120
+ "#C09040",
121
+ // E — transitioning
122
+ "#9060B0",
123
+ // L blending
120
124
  "#7C3AED",
121
- // O - lore violet
125
+ // O lore violet
122
126
  "#4196CB",
123
127
  // R
124
128
  "#06B6D4"
125
- // E - lore cyan
129
+ // E lore cyan
126
130
  ];
127
- var BOOK_LINES = [
128
- " .\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500.",
129
- " \u2571 \u2261 \u2261 \u2261 \u2261 \u2261 \u2571\u2502",
130
- " \u2571 \u2261 \u2261 \u2261 \u2261 \u2261 \u2571 \u2502",
131
- " \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502",
132
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502 \u2502",
133
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502 \u2571",
134
- " \u2502 \u2261 \u2261 \u2261 \u2261 \u2261 \u2502\u2571",
135
- " \u2514\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2518"
131
+ var INNER_W = 20;
132
+ var PAD = " ";
133
+ var FLAME_INNER = [
134
+ " \xB7 \u2726 \u2726 \xB7 ",
135
+ // sparks: · ✦ ✦ ·
136
+ " \u2571\u2572 \u2571\u2572 \u2571\u2572 ",
137
+ // tips: ╱╲ ╱╲ ╱╲
138
+ " \u2572\u2571\u2572\u2571\u2572\u2571 ",
139
+ // merge: ╲╱╲╱╲╱
140
+ " \u2572\u2571\u2572\u2571 "
141
+ // base: ╲╱╲╱
136
142
  ];
137
- var ANVIL_LINES = [
138
- " \u2554\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2557",
139
- " \u2501\u2501\u2501\u2501\u2501\u2563\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2560\u2501\u2501\u2501\u2501\u2501",
140
- " \u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551",
141
- " \u255A\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u255D",
142
- " \u2588\u2588\u2588\u2588\u2588\u2567\u2588\u2588\u2588\u2588\u2588\u2588",
143
- " \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588"
143
+ var ANVIL_INNER = [
144
+ " \u2554\u2550\u2550\u2567\u2550\u2550\u2557 ",
145
+ // ╔══╧══╗
146
+ " \u2501\u2501\u2501\u2523\u2588\u2588\u2588\u2588\u2588\u252B\u2501\u2501\u2501 ",
147
+ // ━━━╣█████╠━━━
148
+ " \u255A\u2550\u2550\u2564\u2550\u2550\u255D ",
149
+ // ╚══╤══╝
150
+ " \u2588\u2588\u2588\u2588\u2567\u2588\u2588\u2588\u2588\u2588 "
151
+ // ████╧█████
144
152
  ];
145
- var SPARK_CHARS = ["\u2726", "\u2727", "\xB7", "\u2736", "\u2217"];
146
- function getColoredBook() {
147
- return BOOK_LINES.map((l) => loreGradient(l));
153
+ var EMPTY_INNER = " ";
154
+ var SPINE_INNER = "\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593";
155
+ var TOTAL_ART_LINES = 13;
156
+ var SPARK_POOL = [
157
+ { char: "\u2726", bright: ["#F5A050", "#FFD090", "#FFF0D0"] },
158
+ // ✦
159
+ { char: "\u2727", bright: ["#FFD090", "#FFF0D0"] },
160
+ // ✧
161
+ { char: "\u2736", bright: ["#E07020", "#F5A050"] },
162
+ // ✶
163
+ { char: "\u2217", bright: ["#CC5500", "#E07020"] },
164
+ // ∗
165
+ { char: "\xB7", bright: ["#F5A050", "#FFD090"] },
166
+ // ·
167
+ { char: "\u02DA", bright: ["#CC8800", "#F5A050"] }
168
+ // ˚
169
+ ];
170
+ var EMBER_COLORS = ["#996600", "#805500"];
171
+ var HIDE_CURSOR = "\x1B[?25l";
172
+ var SHOW_CURSOR = "\x1B[?25h";
173
+ var CLEAR_LINE = "\x1B[2K";
174
+ var moveUp = (n) => n > 0 ? `\x1B[${n}A` : "";
175
+ var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
176
+ function parseHex(hex) {
177
+ const h = hex.replace("#", "");
178
+ return [
179
+ parseInt(h.substring(0, 2), 16),
180
+ parseInt(h.substring(2, 4), 16),
181
+ parseInt(h.substring(4, 6), 16)
182
+ ];
148
183
  }
149
- function getColoredAnvil() {
150
- return ANVIL_LINES.map((l) => forgeGradient(l));
184
+ function toHex(r, g, b) {
185
+ const c = (v) => Math.max(0, Math.min(255, Math.round(v)));
186
+ return "#" + c(r).toString(16).padStart(2, "0") + c(g).toString(16).padStart(2, "0") + c(b).toString(16).padStart(2, "0");
151
187
  }
152
- function getTitle() {
153
- return "FORGELORE".split("").map((ch, i) => chalk2.bold(chalk2.hex(TITLE_GRADIENT[i])(ch))).join("");
188
+ function lerpHex(a, b, t) {
189
+ const [r1, g1, b1] = parseHex(a);
190
+ const [r2, g2, b2] = parseHex(b);
191
+ return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);
154
192
  }
155
- function randomSpark() {
156
- return sparkColor(
157
- SPARK_CHARS[Math.floor(Math.random() * SPARK_CHARS.length)]
158
- );
193
+ function colorArt(heat, flash = 0) {
194
+ const t = Math.max(0, Math.min(1, heat));
195
+ const f = Math.max(0, Math.min(1, flash));
196
+ const bdrCol = lerpHex(DARK, LORE_VIOLET, t);
197
+ const bdr = (s) => chalk2.hex(bdrCol)(s);
198
+ const flS = lerpHex(DARK, f > 0 ? lerpHex(FLAME_TIP, FLASH_WARM, f) : FLAME_TIP, t);
199
+ const flE = lerpHex(DARK, f > 0 ? lerpHex(SEDONA_SUNSET, FLASH_WARM, f) : SEDONA_SUNSET, t);
200
+ const flm = (s) => gradient2([flS, flE])(s);
201
+ const avS = lerpHex(DARK, SEDONA, t);
202
+ const avE = lerpHex(DARK, SEDONA_SUNSET, t);
203
+ const anv = (s) => gradient2([avS, avE])(s);
204
+ const spnCol = lerpHex(DARK, LORE_CYAN, t);
205
+ const spn = (s) => chalk2.hex(spnCol)(s);
206
+ const TOP = PAD + "\u2554" + "\u2550".repeat(INNER_W) + "\u2557";
207
+ const DIV = PAD + "\u2560" + "\u2550".repeat(INNER_W) + "\u2563";
208
+ const BOT = PAD + "\u255A" + "\u2550".repeat(INNER_W) + "\u255D";
209
+ const L = PAD + "\u2551";
210
+ const R = "\u2551";
211
+ return [
212
+ bdr(TOP),
213
+ // 0: ╔════════════════════╗
214
+ bdr(L) + flm(FLAME_INNER[0]) + bdr(R),
215
+ // 1: ║ sparks ║
216
+ bdr(L) + flm(FLAME_INNER[1]) + bdr(R),
217
+ // 2: ║ flame tips ║
218
+ bdr(L) + flm(FLAME_INNER[2]) + bdr(R),
219
+ // 3: ║ flame merge ║
220
+ bdr(L) + flm(FLAME_INNER[3]) + bdr(R),
221
+ // 4: ║ flame base ║
222
+ bdr(L) + anv(ANVIL_INNER[0]) + bdr(R),
223
+ // 5: ║ anvil top ║
224
+ bdr(L) + anv(ANVIL_INNER[1]) + bdr(R),
225
+ // 6: ║ anvil horn ║
226
+ bdr(L) + anv(ANVIL_INNER[2]) + bdr(R),
227
+ // 7: ║ anvil waist ║
228
+ bdr(L) + anv(ANVIL_INNER[3]) + bdr(R),
229
+ // 8: ║ anvil base ║
230
+ bdr(L + EMPTY_INNER + R),
231
+ // 9: ║ ║
232
+ bdr(DIV),
233
+ // 10: ╠════════════════════╣
234
+ spn(L) + spn(SPINE_INNER) + spn(R),
235
+ // 11: ║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║
236
+ bdr(BOT)
237
+ // 12: ╚════════════════════╝
238
+ ];
159
239
  }
160
- var HIDE_CURSOR = "\x1B[?25l";
161
- var SHOW_CURSOR = "\x1B[?25h";
162
- var CLEAR_LINE = "\x1B[2K";
163
- function moveUp(n) {
164
- return n > 0 ? `\x1B[${n}A` : "";
240
+ function randomSpark(bright = true) {
241
+ const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];
242
+ const pool = bright ? s.bright : EMBER_COLORS;
243
+ return chalk2.hex(pool[Math.floor(Math.random() * pool.length)])(s.char);
244
+ }
245
+ function sparkOverlay(frame) {
246
+ const sp = /* @__PURE__ */ new Map();
247
+ if (frame === 0) {
248
+ sp.set(1, " " + randomSpark() + randomSpark());
249
+ sp.set(2, " " + randomSpark() + " " + randomSpark() + randomSpark());
250
+ sp.set(3, " " + randomSpark() + randomSpark());
251
+ sp.set(4, " " + randomSpark());
252
+ } else if (frame === 1) {
253
+ sp.set(0, " " + randomSpark());
254
+ sp.set(1, " " + randomSpark() + " " + randomSpark());
255
+ sp.set(2, " " + randomSpark() + " " + randomSpark());
256
+ sp.set(3, " " + randomSpark() + " " + randomSpark());
257
+ sp.set(4, " " + randomSpark());
258
+ sp.set(5, " " + randomSpark());
259
+ } else if (frame === 2) {
260
+ sp.set(0, " " + randomSpark(false));
261
+ sp.set(1, " " + randomSpark());
262
+ sp.set(3, " " + randomSpark(false) + " " + randomSpark());
263
+ sp.set(5, " " + randomSpark(false));
264
+ } else if (frame === 3) {
265
+ sp.set(0, " " + randomSpark(false));
266
+ sp.set(2, " " + randomSpark(false));
267
+ }
268
+ return sp;
269
+ }
270
+ function writeFrame(lines, sparks) {
271
+ for (let i = 0; i < lines.length; i++) {
272
+ process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || "") + "\n");
273
+ }
165
274
  }
166
- function sleep(ms) {
167
- return new Promise((r) => setTimeout(r, ms));
275
+ function getTitle() {
276
+ return "FORGELORE".split("").map((ch, i) => chalk2.bold(chalk2.hex(TITLE_COLORS[i])(ch))).join("");
168
277
  }
169
278
  function renderBanner() {
170
- const book = getColoredBook().join("\n");
171
- const anvil = getColoredAnvil().join("\n");
172
- const title = ` ${getTitle()}`;
173
- const tagline = colors.muted(" forge knowledge, shape code");
174
- const version = chalk2.dim(" v0.1.0");
279
+ const art = colorArt(1).join("\n");
280
+ const title = ` ${getTitle()}`;
281
+ const tagline = colors.muted(" forge knowledge, shape code");
282
+ const version = chalk2.dim(" v0.2.1");
175
283
  return `
176
- ${book}
177
- ${anvil}
284
+ ${art}
178
285
 
179
286
  ${title}
180
287
  ${tagline}${version}
@@ -185,76 +292,58 @@ async function renderAnimatedBanner() {
185
292
  console.log(renderBanner());
186
293
  return;
187
294
  }
188
- const bookColored = getColoredBook();
189
- const anvilColored = getColoredAnvil();
190
- const allLines = [...bookColored, ...anvilColored];
191
- const totalHeight = allLines.length;
192
295
  process.stdout.write(HIDE_CURSOR);
193
296
  try {
194
297
  console.log("");
195
- for (let i = anvilColored.length - 1; i >= 0; i--) {
196
- const visible = anvilColored.slice(i);
197
- for (const line of visible) {
198
- process.stdout.write(CLEAR_LINE + line + "\n");
199
- }
200
- await sleep(45);
201
- if (i > 0) {
202
- process.stdout.write(moveUp(visible.length));
203
- }
298
+ const coldArt = colorArt(0.08);
299
+ for (const line of coldArt) {
300
+ process.stdout.write(CLEAR_LINE + line + "\n");
301
+ await sleep(20);
204
302
  }
205
- const anvilHeight = anvilColored.length;
206
- process.stdout.write(moveUp(anvilHeight));
207
- for (let i = bookColored.length - 1; i >= 0; i--) {
208
- const visibleBook = bookColored.slice(i);
209
- const frame = [...visibleBook, ...anvilColored];
303
+ const heatSteps = [0.15, 0.3, 0.5, 0.7, 0.85, 1];
304
+ for (const heat of heatSteps) {
305
+ process.stdout.write(moveUp(TOTAL_ART_LINES));
306
+ const frame = colorArt(heat);
210
307
  for (const line of frame) {
211
308
  process.stdout.write(CLEAR_LINE + line + "\n");
212
309
  }
213
- await sleep(35);
214
- process.stdout.write(moveUp(frame.length));
215
- }
216
- for (const line of allLines) {
217
- process.stdout.write(CLEAR_LINE + line + "\n");
218
- }
219
- for (let cycle = 0; cycle < 5; cycle++) {
220
- await sleep(90);
221
- process.stdout.write(moveUp(totalHeight));
222
- for (let i = 0; i < totalHeight; i++) {
223
- const line = allLines[i];
224
- let spark = "";
225
- if (i >= bookColored.length - 2 && i <= bookColored.length + 2) {
226
- if (Math.random() > 0.3) {
227
- spark = " " + randomSpark();
228
- if (Math.random() > 0.5) spark += " " + randomSpark();
229
- }
230
- } else if (Math.random() > 0.7) {
231
- spark = " " + randomSpark();
232
- }
233
- process.stdout.write(CLEAR_LINE + line + spark + "\n");
234
- }
310
+ await sleep(55);
235
311
  }
236
- process.stdout.write(moveUp(totalHeight));
237
- for (const line of allLines) {
238
- process.stdout.write(CLEAR_LINE + line + "\n");
312
+ process.stdout.write(moveUp(TOTAL_ART_LINES));
313
+ writeFrame(colorArt(1, 0.6), sparkOverlay(0));
314
+ await sleep(65);
315
+ for (let f = 1; f <= 4; f++) {
316
+ const flashDecay = Math.max(0, 0.45 - f * 0.15);
317
+ process.stdout.write(moveUp(TOTAL_ART_LINES));
318
+ writeFrame(colorArt(1, flashDecay), sparkOverlay(f));
319
+ await sleep(65);
239
320
  }
321
+ process.stdout.write(moveUp(TOTAL_ART_LINES));
322
+ writeFrame(colorArt(1), /* @__PURE__ */ new Map());
240
323
  console.log("");
241
- process.stdout.write(" ");
324
+ process.stdout.write(" ");
242
325
  const title = "FORGELORE";
243
326
  for (let i = 0; i < title.length; i++) {
244
- process.stdout.write(emberColor("\u2588"));
245
- await sleep(35);
246
- process.stdout.write("\b" + chalk2.bold(chalk2.hex(TITLE_GRADIENT[i])(title[i])));
247
- await sleep(50);
327
+ process.stdout.write(chalk2.hex(SEDONA_GLOW)("\u2588"));
328
+ await sleep(15);
329
+ process.stdout.write("\b" + chalk2.hex("#CC7744")("\u2593"));
330
+ await sleep(15);
331
+ process.stdout.write(
332
+ "\b" + chalk2.bold(chalk2.hex(TITLE_COLORS[i])(title[i]))
333
+ );
334
+ await sleep(25);
248
335
  }
249
336
  console.log("");
250
- await sleep(200);
251
- console.log(colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.1.0"));
337
+ await sleep(120);
338
+ console.log(
339
+ colors.muted(" forge knowledge, shape code") + chalk2.dim(" v0.2.1")
340
+ );
252
341
  console.log("");
253
342
  } finally {
254
343
  process.stdout.write(SHOW_CURSOR);
255
344
  }
256
345
  }
257
- function renderBox(content, title, borderColor = "#FF6B35") {
346
+ function renderBox(content, title, borderColor = SEDONA) {
258
347
  return boxen(content, {
259
348
  padding: 1,
260
349
  margin: { top: 0, bottom: 1, left: 0, right: 0 },
@@ -1631,7 +1720,7 @@ async function analyzeChangeDrift(projectRoot, changeName, items) {
1631
1720
 
1632
1721
  // src/index.ts
1633
1722
  var program = new Command();
1634
- program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.1.0");
1723
+ program.name("forgelore").description("Spec-driven development for AI-assisted teams \u2014 forge knowledge, shape code").version("0.2.1");
1635
1724
  program.command("init").description("Initialize forgelore in the current project").option("-C, --cwd <path>", "Working directory").action((opts) => initCommand({ cwd: opts.cwd }));
1636
1725
  program.command("propose [idea]").description("Create a new change proposal").option("-C, --cwd <path>", "Working directory").action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));
1637
1726
  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.1.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 spark animations\n */\n\nimport boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\nimport { colors } from \"./theme.js\";\n\n// Brand gradients: forge (warm) → lore (cool)\nconst forgeGradient = gradient([\"#FF6B35\", \"#FFD700\"]);\nconst loreGradient = gradient([\"#7C3AED\", \"#06B6D4\"]);\nconst brandGradient = gradient([\"#FF6B35\", \"#FFD700\", \"#7C3AED\", \"#06B6D4\"]);\nconst sparkColor = chalk.hex(\"#FFD700\");\nconst emberColor = chalk.hex(\"#FF6B35\");\n\n// Per-character gradient for FORGELORE title\nconst TITLE_GRADIENT = [\n \"#FF6B35\", // F - forge orange\n \"#FF8E3C\", // O\n \"#FFB347\", // R\n \"#FFD700\", // G - spark gold\n \"#C9A832\", // E\n \"#9B6FC0\", // L - transitioning\n \"#7C3AED\", // O - lore violet\n \"#4196CB\", // R\n \"#06B6D4\", // E - lore cyan\n];\n\n// Book (lore) sitting on anvil (forge)\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 SPARK_CHARS = [\"✦\", \"✧\", \"·\", \"✶\", \"∗\"];\n\nfunction getColoredBook(): string[] {\n return BOOK_LINES.map((l) => loreGradient(l));\n}\n\nfunction getColoredAnvil(): string[] {\n return ANVIL_LINES.map((l) => forgeGradient(l));\n}\n\nfunction getTitle(): string {\n return \"FORGELORE\"\n .split(\"\")\n .map((ch, i) => chalk.bold(chalk.hex(TITLE_GRADIENT[i])(ch)))\n .join(\"\");\n}\n\nfunction randomSpark(): string {\n return sparkColor(\n SPARK_CHARS[Math.floor(Math.random() * SPARK_CHARS.length)]\n );\n}\n\nfunction generateSparkLine(width = 30): string {\n const chars = new Array(width).fill(\" \");\n const count = 2 + Math.floor(Math.random() * 4);\n for (let i = 0; i < count; i++) {\n const pos = Math.floor(Math.random() * width);\n chars[pos] = randomSpark();\n }\n return chars.join(\"\");\n}\n\n// ANSI helpers\nconst HIDE_CURSOR = \"\\x1b[?25l\";\nconst SHOW_CURSOR = \"\\x1b[?25h\";\nconst CLEAR_LINE = \"\\x1b[2K\";\nfunction moveUp(n: number): string {\n return n > 0 ? `\\x1b[${n}A` : \"\";\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Static banner — used in non-TTY or when animation isn't wanted\n */\nexport function renderBanner(): string {\n const book = getColoredBook().join(\"\\n\");\n const anvil = getColoredAnvil().join(\"\\n\");\n const title = ` ${getTitle()}`;\n const tagline = colors.muted(\" forge knowledge, shape code\");\n const version = chalk.dim(\" v0.1.0\");\n return `\\n${book}\\n${anvil}\\n\\n${title}\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — anvil rises, book drops, sparks fly, title types out\n * Only runs in interactive TTY; falls back to static otherwise\n */\nexport async function renderAnimatedBanner(): Promise<void> {\n if (!process.stdout.isTTY) {\n console.log(renderBanner());\n return;\n }\n\n const bookColored = getColoredBook();\n const anvilColored = getColoredAnvil();\n const allLines = [...bookColored, ...anvilColored];\n const totalHeight = allLines.length;\n\n process.stdout.write(HIDE_CURSOR);\n\n try {\n console.log(\"\"); // top spacing\n\n // Phase 1: Anvil rises from below (bottom-up reveal)\n for (let i = anvilColored.length - 1; i >= 0; i--) {\n const visible = anvilColored.slice(i);\n for (const line of visible) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(45);\n if (i > 0) {\n process.stdout.write(moveUp(visible.length));\n }\n }\n\n // Phase 2: Book drops onto anvil (top-down reveal)\n const anvilHeight = anvilColored.length;\n process.stdout.write(moveUp(anvilHeight));\n\n for (let i = bookColored.length - 1; i >= 0; i--) {\n const visibleBook = bookColored.slice(i);\n const frame = [...visibleBook, ...anvilColored];\n for (const line of frame) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(35);\n process.stdout.write(moveUp(frame.length));\n }\n\n // Redraw complete art\n for (const line of allLines) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n\n // Phase 3: Sparks fly from the anvil\n for (let cycle = 0; cycle < 5; cycle++) {\n await sleep(90);\n process.stdout.write(moveUp(totalHeight));\n\n for (let i = 0; i < totalHeight; i++) {\n const line = allLines[i];\n // Add random sparks to the right of anvil lines and around the impact point\n let spark = \"\";\n if (i >= bookColored.length - 2 && i <= bookColored.length + 2) {\n // Near the book-anvil junction — more sparks\n if (Math.random() > 0.3) {\n spark = \" \" + randomSpark();\n if (Math.random() > 0.5) spark += \" \" + randomSpark();\n }\n } else if (Math.random() > 0.7) {\n spark = \" \" + randomSpark();\n }\n process.stdout.write(CLEAR_LINE + line + spark + \"\\n\");\n }\n }\n\n // Final clean render (no sparks)\n process.stdout.write(moveUp(totalHeight));\n for (const line of allLines) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n\n // Phase 4: Title types out letter by letter\n console.log(\"\");\n process.stdout.write(\" \");\n const title = \"FORGELORE\";\n for (let i = 0; i < title.length; i++) {\n // Flash as ember block, then resolve to colored letter\n process.stdout.write(emberColor(\"█\"));\n await sleep(35);\n process.stdout.write(\"\\b\" + chalk.bold(chalk.hex(TITLE_GRADIENT[i])(title[i])));\n await sleep(50);\n }\n console.log(\"\");\n\n // Phase 5: Tagline fades in\n await sleep(200);\n console.log(colors.muted(\" forge knowledge, shape code\") + chalk.dim(\" v0.1.0\"));\n console.log(\"\");\n } finally {\n process.stdout.write(SHOW_CURSOR);\n }\n}\n\n/**\n * Render a boxed section with forge-themed border\n */\nexport function renderBox(\n content: string,\n title?: string,\n borderColor = \"#FF6B35\"\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 * Forge-inspired colors, gradients, and visual constants\n */\n\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\n\n// Brand colors — forge (warm) + lore (cool)\nexport const colors = {\n primary: chalk.hex(\"#FF6B35\"), // forge orange\n secondary: chalk.hex(\"#06B6D4\"), // lore cyan\n accent: chalk.hex(\"#FFD700\"), // spark gold\n lore: chalk.hex(\"#7C3AED\"), // lore violet\n success: chalk.hex(\"#10B981\"), // emerald\n warning: chalk.hex(\"#F97316\"), // orange\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([\"#FF6B35\", \"#FFD700\", \"#7C3AED\", \"#06B6D4\"]),\n forge: gradient([\"#FF6B35\", \"#FFD700\"]),\n lore: gradient([\"#7C3AED\", \"#06B6D4\"]),\n warm: gradient([\"#F59E0B\", \"#EF4444\"]),\n cool: gradient([\"#06B6D4\", \"#7C3AED\"]),\n success: gradient([\"#10B981\", \"#06B6D4\"]),\n sunset: gradient([\"#F97316\", \"#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","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.1\");\n\n// --- init ---\nprogram\n .command(\"init\")\n .description(\"Initialize forgelore in the current project\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => initCommand({ cwd: opts.cwd }));\n\n// --- propose ---\nprogram\n .command(\"propose [idea]\")\n .description(\"Create a new change proposal\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));\n\n// --- clarify ---\nprogram\n .command(\"clarify <change>\")\n .description(\"Review and refine requirements for a change\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => clarifyCommand(change, { cwd: opts.cwd }));\n\n// --- status ---\nprogram\n .command(\"status\")\n .description(\"Show project status dashboard\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => statusCommand({ cwd: opts.cwd }));\n\n// --- list ---\nprogram\n .command(\"list\")\n .description(\"List all changes\")\n .option(\"-a, --archived\", \"Include archived changes\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => listCommand({ archived: opts.archived, status: opts.status, cwd: opts.cwd }));\n\n// --- verify ---\nprogram\n .command(\"verify [change]\")\n .description(\"Verify a change against its specs (structural check)\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => verifyCommand(change, { cwd: opts.cwd }));\n\n// --- archive ---\nprogram\n .command(\"archive <change>\")\n .description(\"Archive a completed change and extract capabilities\")\n .option(\"--skip-outcome\", \"Skip outcome.md generation step\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => archiveCommand(change, { skipOutcome: opts.skipOutcome, cwd: opts.cwd }));\n\n// --- sync ---\nprogram\n .command(\"sync\")\n .description(\"Sync with the global spec repository\")\n .option(\"--force\", \"Force sync even if local changes exist\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => syncCommand({ force: opts.force, cwd: opts.cwd }));\n\n// --- doctor ---\nprogram\n .command(\"doctor\")\n .description(\"Check forgelore health and diagnose issues\")\n .option(\"--fix\", \"Attempt to fix detected issues\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => doctorCommand({ fix: opts.fix, cwd: opts.cwd }));\n\n// --- capabilities ---\nprogram\n .command(\"capabilities\")\n .alias(\"caps\")\n .description(\"List all registered capabilities\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => capabilitiesCommand({ json: opts.json, cwd: opts.cwd }));\n\n// --- config ---\nprogram\n .command(\"config [key] [value]\")\n .description(\"Get or set configuration values\")\n .option(\"--list\", \"List all config values\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((key, value, opts) => configCommand(key, value, { list: opts.list, cwd: opts.cwd }));\n\n// --- diff ---\nprogram\n .command(\"diff [change]\")\n .description(\"Show drift between specs and implementation\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => diffCommand(change, { cwd: opts.cwd }));\n\n// Default: animated banner + help\nprogram.action(async () => {\n await renderAnimatedBanner();\n program.outputHelp();\n});\n\nprogram.parse();\n","/**\n * forgelore init command\n * Scaffold forgelore in a project, configure mode and paths\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport {\n createDefaultConfig,\n writeConfig,\n configExists,\n getForgeloreDir,\n type SpecMode,\n type ForgeloreConfig,\n} from \"@forgelore/core\";\nimport { scaffoldSpecDirs } from \"@forgelore/core\";\nimport { scaffoldKnowledge } from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function initCommand(options: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options.cwd || process.cwd());\n\n console.log(renderBanner());\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n console.log(\n renderBox(\n `${icons.warning} forgelore is already initialized in this project.\\n` +\n `${colors.muted(\"Run\")} ${colors.primary(\"forgelore status\")} ${colors.muted(\"to see current state.\")}`,\n \"Already Initialized\"\n )\n );\n return;\n }\n\n p.intro(gradients.brand(\" forgelore init \"));\n\n // Choose mode\n const mode = (await p.select({\n message: \"How do you want to manage specs?\",\n options: [\n {\n value: \"local\",\n label: \"Local only\",\n hint: \"Specs live in this repo only\",\n },\n {\n value: \"local+global\",\n label: \"Local + Global\",\n hint: \"Local specs + a shared company spec repo\",\n },\n {\n value: \"global\",\n label: \"Global only\",\n hint: \"Reference a shared spec repo\",\n },\n ],\n })) as SpecMode;\n\n if (p.isCancel(mode)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n // Configure global source if needed\n let globalSource: string | undefined;\n if (mode === \"local+global\" || mode === \"global\") {\n const source = await p.text({\n message: \"Global spec source (filesystem path or GitHub URL):\",\n placeholder: \"/path/to/company-specs or https://github.com/org/specs\",\n validate: (val) => {\n if (!val) return \"Please enter a path or URL\";\n return undefined;\n },\n });\n\n if (p.isCancel(source)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n globalSource = source as string;\n }\n\n // Create config\n const config = createDefaultConfig(mode);\n if (globalSource) {\n const isUrl =\n globalSource.startsWith(\"http://\") || globalSource.startsWith(\"https://\");\n config.global = {\n source: globalSource,\n path: isUrl\n ? `~/.cache/forgelore/global/${globalSource.split(\"/\").pop()}`\n : globalSource,\n autoSync: true,\n };\n }\n\n // Scaffold\n const spinner = ora({\n text: \"Scaffolding forgelore...\",\n color: \"magenta\",\n }).start();\n\n try {\n const forgeloreDir = getForgeloreDir(projectRoot);\n await mkdir(forgeloreDir, { recursive: true });\n\n spinner.text = \"Creating directory structure...\";\n await scaffoldSpecDirs(projectRoot);\n\n spinner.text = \"Setting up knowledge base...\";\n await scaffoldKnowledge(projectRoot);\n\n spinner.text = \"Writing config...\";\n await writeConfig(projectRoot, config);\n\n spinner.succeed(colors.success(\"forgelore initialized\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to initialize forgelore\"));\n console.error(err);\n process.exit(1);\n }\n\n // Summary\n const summary = [\n `${icons.success} ${colors.white(\"Created:\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/forgelore.json\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/changes/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/architecture.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/patterns.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/glossary.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/capabilities/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/decisions/\")}`,\n \"\",\n `${icons.info} Mode: ${colors.primary(mode)}`,\n ];\n\n if (globalSource) {\n summary.push(`${icons.info} Global: ${colors.secondary(globalSource)}`);\n }\n\n console.log(renderBox(summary.join(\"\\n\"), \"Setup Complete\", \"#10B981\"));\n\n p.outro(\n `Run ${colors.primary(\"forgelore propose\")} ${colors.muted('\"your idea\"')} to create your first spec.`\n );\n}\n","/**\n * forgelore CLI banner and branding\n * A tome with a forge scene on its cover — flames, anvil, and sparks.\n *\n * Animation: the book starts cold (barely visible), heats up to full\n * Sedona/lore color, flames flash and sparks erupt from the cover,\n * then the title forges letter by letter from ember to final color.\n */\n\nimport boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\nimport { colors } from \"./theme.js\";\n\n// ─── Sedona Brand Palette ────────────────────────────────────\n\nconst SEDONA = \"#CC5500\"; // deep Sedona red-rock\nconst SEDONA_GLOW = \"#E07020\"; // bright warm Sedona\nconst SEDONA_SUNSET = \"#F5A050\"; // sunset gold\nconst FLAME_BRIGHT = \"#FFD090\"; // bright flame gold\nconst FLAME_TIP = \"#FFEECC\"; // flame tip highlight\nconst LORE_VIOLET = \"#7C3AED\"; // lore violet\nconst LORE_CYAN = \"#06B6D4\"; // lore cyan\nconst DARK = \"#2A2A2A\"; // cold / unlit\nconst FLASH_WARM = \"#FFF0D0\"; // warm-white impact flash\n\n// Pre-built gradients\nconst brandGradient = gradient([SEDONA, SEDONA_SUNSET, LORE_VIOLET, LORE_CYAN]);\n\n// Per-character title gradient: Sedona warm → lore cool\nconst TITLE_COLORS = [\n \"#CC5500\", // F — deep Sedona\n \"#D46020\", // O\n \"#DC7030\", // R\n \"#F5A050\", // G — Sedona sunset\n \"#C09040\", // E — transitioning\n \"#9060B0\", // L — blending\n \"#7C3AED\", // O — lore violet\n \"#4196CB\", // R\n \"#06B6D4\", // E — lore cyan\n];\n\n// ─── ASCII Art: Tome with Forge Cover ────────────────────────\n//\n// The art is a book (double-line border) with a forge scene on the\n// cover: flames at top, anvil below. The spine/pages show at bottom.\n// Each inner content line is exactly 20 characters wide.\n\nconst INNER_W = 20;\nconst PAD = \" \"; // left indent\n\n// Inner content between ║ borders (each exactly 20 chars)\nconst FLAME_INNER = [\n \" \\u00B7 \\u2726 \\u2726 \\u00B7 \", // sparks: · ✦ ✦ ·\n \" \\u2571\\u2572 \\u2571\\u2572 \\u2571\\u2572 \", // tips: ╱╲ ╱╲ ╱╲\n \" \\u2572\\u2571\\u2572\\u2571\\u2572\\u2571 \", // merge: ╲╱╲╱╲╱\n \" \\u2572\\u2571\\u2572\\u2571 \", // base: ╲╱╲╱\n];\n\nconst ANVIL_INNER = [\n \" \\u2554\\u2550\\u2550\\u2567\\u2550\\u2550\\u2557 \", // ╔══╧══╗\n \" \\u2501\\u2501\\u2501\\u2523\\u2588\\u2588\\u2588\\u2588\\u2588\\u252B\\u2501\\u2501\\u2501 \", // ━━━╣█████╠━━━\n \" \\u255A\\u2550\\u2550\\u2564\\u2550\\u2550\\u255D \", // ╚══╤══╝\n \" \\u2588\\u2588\\u2588\\u2588\\u2567\\u2588\\u2588\\u2588\\u2588\\u2588 \", // ████╧█████\n];\n\nconst EMPTY_INNER = \" \"; // 20 spaces\nconst SPINE_INNER = \"\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\\u2593\"; // 20× ▓\n\n// Total art lines: top(1) + flame(4) + anvil(4) + empty(1) + divider(1) + spine(1) + bottom(1) = 13\nconst TOTAL_ART_LINES = 13;\nconst FLAME_START_ROW = 1; // first flame row in the frame\n\n// Spark characters with warm Sedona color pools\nconst SPARK_POOL = [\n { char: \"\\u2726\", bright: [\"#F5A050\", \"#FFD090\", \"#FFF0D0\"] }, // ✦\n { char: \"\\u2727\", bright: [\"#FFD090\", \"#FFF0D0\"] }, // ✧\n { char: \"\\u2736\", bright: [\"#E07020\", \"#F5A050\"] }, // ✶\n { char: \"\\u2217\", bright: [\"#CC5500\", \"#E07020\"] }, // ∗\n { char: \"\\u00B7\", bright: [\"#F5A050\", \"#FFD090\"] }, // ·\n { char: \"\\u02DA\", bright: [\"#CC8800\", \"#F5A050\"] }, // ˚\n];\n\nconst EMBER_COLORS = [\"#996600\", \"#805500\"];\n\n// ─── ANSI Helpers ────────────────────────────────────────────\n\nconst HIDE_CURSOR = \"\\x1b[?25l\";\nconst SHOW_CURSOR = \"\\x1b[?25h\";\nconst CLEAR_LINE = \"\\x1b[2K\";\nconst moveUp = (n: number) => (n > 0 ? `\\x1b[${n}A` : \"\");\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\n// ─── Color Math ──────────────────────────────────────────────\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\");\n return [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n ];\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const c = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return (\n \"#\" +\n c(r).toString(16).padStart(2, \"0\") +\n c(g).toString(16).padStart(2, \"0\") +\n c(b).toString(16).padStart(2, \"0\")\n );\n}\n\nfunction lerpHex(a: string, b: string, t: number): string {\n const [r1, g1, b1] = parseHex(a);\n const [r2, g2, b2] = parseHex(b);\n return toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t);\n}\n\n// ─── Art Coloring ────────────────────────────────────────────\n\n/**\n * Compose the full art frame at a given heat level.\n *\n * heat — 0 (cold/dark) to 1 (full color)\n * flash — 0–1, brightens flame lines toward warm-white\n *\n * The book border uses lore violet, the flame content uses bright\n * warm gold, and the anvil uses Sedona orange. Each section gets\n * its own gradient so the forge \"pops\" against the cool frame.\n */\nfunction colorArt(heat: number, flash = 0): string[] {\n const t = Math.max(0, Math.min(1, heat));\n const f = Math.max(0, Math.min(1, flash));\n\n // Border color (lore violet, modulated by heat)\n const bdrCol = lerpHex(DARK, LORE_VIOLET, t);\n const bdr = (s: string) => chalk.hex(bdrCol)(s);\n\n // Flame gradient: bright gold → sunset\n const flS = lerpHex(DARK, f > 0 ? lerpHex(FLAME_TIP, FLASH_WARM, f) : FLAME_TIP, t);\n const flE = lerpHex(DARK, f > 0 ? lerpHex(SEDONA_SUNSET, FLASH_WARM, f) : SEDONA_SUNSET, t);\n const flm = (s: string) => gradient([flS, flE])(s);\n\n // Anvil gradient: Sedona → sunset\n const avS = lerpHex(DARK, SEDONA, t);\n const avE = lerpHex(DARK, SEDONA_SUNSET, t);\n const anv = (s: string) => gradient([avS, avE])(s);\n\n // Spine: lore cyan\n const spnCol = lerpHex(DARK, LORE_CYAN, t);\n const spn = (s: string) => chalk.hex(spnCol)(s);\n\n // Book border characters\n const TOP = PAD + \"\\u2554\" + \"\\u2550\".repeat(INNER_W) + \"\\u2557\"; // ╔═══╗\n const DIV = PAD + \"\\u2560\" + \"\\u2550\".repeat(INNER_W) + \"\\u2563\"; // ╠═══╣\n const BOT = PAD + \"\\u255A\" + \"\\u2550\".repeat(INNER_W) + \"\\u255D\"; // ╚═══╝\n const L = PAD + \"\\u2551\"; // ║ (left border)\n const R = \"\\u2551\"; // ║ (right border)\n\n return [\n bdr(TOP), // 0: ╔════════════════════╗\n bdr(L) + flm(FLAME_INNER[0]) + bdr(R), // 1: ║ sparks ║\n bdr(L) + flm(FLAME_INNER[1]) + bdr(R), // 2: ║ flame tips ║\n bdr(L) + flm(FLAME_INNER[2]) + bdr(R), // 3: ║ flame merge ║\n bdr(L) + flm(FLAME_INNER[3]) + bdr(R), // 4: ║ flame base ║\n bdr(L) + anv(ANVIL_INNER[0]) + bdr(R), // 5: ║ anvil top ║\n bdr(L) + anv(ANVIL_INNER[1]) + bdr(R), // 6: ║ anvil horn ║\n bdr(L) + anv(ANVIL_INNER[2]) + bdr(R), // 7: ║ anvil waist ║\n bdr(L) + anv(ANVIL_INNER[3]) + bdr(R), // 8: ║ anvil base ║\n bdr(L + EMPTY_INNER + R), // 9: ║ ║\n bdr(DIV), // 10: ╠════════════════════╣\n spn(L) + spn(SPINE_INNER) + spn(R), // 11: ║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║\n bdr(BOT), // 12: ╚════════════════════╝\n ];\n}\n\n// ─── Sparks ──────────────────────────────────────────────────\n\nfunction randomSpark(bright = true): string {\n const s = SPARK_POOL[Math.floor(Math.random() * SPARK_POOL.length)];\n const pool = bright ? s.bright : EMBER_COLORS;\n return chalk.hex(pool[Math.floor(Math.random() * pool.length)])(s.char);\n}\n\n/**\n * Spark decorations that appear to the RIGHT of the book frame,\n * as if sparks are escaping the tome. Centered on the flame rows.\n * 0 = tight burst, 1–2 = expanding, 3 = last embers, 4+ = clear\n */\nfunction sparkOverlay(frame: number): Map<number, string> {\n const sp = new Map<number, string>();\n\n if (frame === 0) {\n // Tight burst near flames\n sp.set(1, \" \" + randomSpark() + randomSpark());\n sp.set(2, \" \" + randomSpark() + \" \" + randomSpark() + randomSpark());\n sp.set(3, \" \" + randomSpark() + randomSpark());\n sp.set(4, \" \" + randomSpark());\n } else if (frame === 1) {\n // Expanding outward\n sp.set(0, \" \" + randomSpark());\n sp.set(1, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(2, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(3, \" \" + randomSpark() + \" \" + randomSpark());\n sp.set(4, \" \" + randomSpark());\n sp.set(5, \" \" + randomSpark());\n } else if (frame === 2) {\n // Wide, starting to fade\n sp.set(0, \" \" + randomSpark(false));\n sp.set(1, \" \" + randomSpark());\n sp.set(3, \" \" + randomSpark(false) + \" \" + randomSpark());\n sp.set(5, \" \" + randomSpark(false));\n } else if (frame === 3) {\n // Last embers\n sp.set(0, \" \" + randomSpark(false));\n sp.set(2, \" \" + randomSpark(false));\n }\n return sp;\n}\n\n// ─── Frame Output ────────────────────────────────────────────\n\nfunction writeFrame(lines: string[], sparks: Map<number, string>): void {\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(CLEAR_LINE + lines[i] + (sparks.get(i) || \"\") + \"\\n\");\n }\n}\n\n// ─── Title ───────────────────────────────────────────────────\n\nfunction getTitle(): string {\n return \"FORGELORE\"\n .split(\"\")\n .map((ch, i) => chalk.bold(chalk.hex(TITLE_COLORS[i])(ch)))\n .join(\"\");\n}\n\n// ─── Public API ──────────────────────────────────────────────\n\n/**\n * Static banner — used in non-TTY or when animation is skipped\n */\nexport function renderBanner(): string {\n const art = colorArt(1).join(\"\\n\");\n const title = ` ${getTitle()}`;\n const tagline = colors.muted(\" forge knowledge, shape code\");\n const version = chalk.dim(\" v0.2.1\");\n return `\\n${art}\\n\\n${title}\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — forge heat-up, spark burst, title forging\n *\n * Timeline (~1.5s):\n * Cold reveal 260ms (13 lines × 20ms)\n * Heat-up 330ms (6 steps × 55ms)\n * Spark burst 325ms (5 frames × 65ms)\n * Title forge 495ms (9 letters × 55ms)\n * Tagline 120ms (pause + print)\n */\nexport async function renderAnimatedBanner(): Promise<void> {\n if (!process.stdout.isTTY) {\n console.log(renderBanner());\n return;\n }\n\n process.stdout.write(HIDE_CURSOR);\n\n try {\n console.log(\"\"); // top padding\n\n // ── Phase 1: Cold reveal ──────────────────────────────────\n const coldArt = colorArt(0.08);\n for (const line of coldArt) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n await sleep(20);\n }\n\n // ── Phase 2: Heat-up ──────────────────────────────────────\n const heatSteps = [0.15, 0.30, 0.50, 0.70, 0.85, 1.0];\n for (const heat of heatSteps) {\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n const frame = colorArt(heat);\n for (const line of frame) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(55);\n }\n\n // ── Phase 3: Flash + spark burst ──────────────────────────\n // Flames flash white-hot, sparks fly out of the book\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0, 0.6), sparkOverlay(0));\n await sleep(65);\n\n for (let f = 1; f <= 4; f++) {\n const flashDecay = Math.max(0, 0.45 - f * 0.15);\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0, flashDecay), sparkOverlay(f));\n await sleep(65);\n }\n\n // Clean final art\n process.stdout.write(moveUp(TOTAL_ART_LINES));\n writeFrame(colorArt(1.0), new Map());\n\n // ── Phase 4: Title forging ────────────────────────────────\n console.log(\"\");\n process.stdout.write(\" \");\n const title = \"FORGELORE\";\n for (let i = 0; i < title.length; i++) {\n process.stdout.write(chalk.hex(SEDONA_GLOW)(\"\\u2588\"));\n await sleep(15);\n process.stdout.write(\"\\b\" + chalk.hex(\"#CC7744\")(\"\\u2593\"));\n await sleep(15);\n process.stdout.write(\n \"\\b\" + chalk.bold(chalk.hex(TITLE_COLORS[i])(title[i]))\n );\n await sleep(25);\n }\n console.log(\"\");\n\n // ── Phase 5: Tagline ──────────────────────────────────────\n await sleep(120);\n console.log(\n colors.muted(\" forge knowledge, shape code\") + chalk.dim(\" v0.2.1\")\n );\n console.log(\"\");\n } finally {\n process.stdout.write(SHOW_CURSOR);\n }\n}\n\n/**\n * Render a boxed section with Sedona-themed border\n */\nexport function renderBox(\n content: string,\n title?: string,\n borderColor = SEDONA\n): string {\n return boxen(content, {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 0, right: 0 },\n borderStyle: \"round\",\n borderColor,\n title,\n titleAlignment: \"left\",\n });\n}\n\n/**\n * Render a titled section with brand gradient\n */\nexport function renderSection(title: string, content: string): string {\n return `\\n${brandGradient(` ${title} `)}\\n${content}\\n`;\n}\n","/**\n * forgelore CLI theme\n * Sedona-inspired colors — warm red-rock tones (forge) + cool violet/cyan (lore)\n */\n\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\n\n// Brand colors — Sedona warm (forge) + cool (lore)\nexport const colors = {\n primary: chalk.hex(\"#CC5500\"), // Sedona orange (red rock)\n secondary: chalk.hex(\"#06B6D4\"), // lore cyan\n accent: chalk.hex(\"#F5A050\"), // Sedona sunset gold\n lore: chalk.hex(\"#7C3AED\"), // lore violet\n success: chalk.hex(\"#10B981\"), // emerald\n warning: chalk.hex(\"#E07020\"), // Sedona warm warning\n error: chalk.hex(\"#EF4444\"), // red\n muted: chalk.hex(\"#6B7280\"), // gray\n dim: chalk.dim,\n bold: chalk.bold,\n white: chalk.white,\n};\n\n// Gradients\nexport const gradients = {\n brand: gradient([\"#CC5500\", \"#F5A050\", \"#7C3AED\", \"#06B6D4\"]),\n forge: gradient([\"#CC5500\", \"#F5A050\"]),\n lore: gradient([\"#7C3AED\", \"#06B6D4\"]),\n warm: gradient([\"#F5A050\", \"#EF4444\"]),\n cool: gradient([\"#06B6D4\", \"#7C3AED\"]),\n success: gradient([\"#10B981\", \"#06B6D4\"]),\n sunset: gradient([\"#E07020\", \"#EF4444\", \"#7C3AED\"]),\n};\n\n// Status icons\nexport const icons = {\n success: colors.success(\"\\u2713\"),\n error: colors.error(\"\\u2717\"),\n warning: colors.warning(\"\\u26A0\"),\n info: colors.secondary(\"\\u25C6\"),\n pending: colors.muted(\"\\u25CB\"),\n inProgress: colors.accent(\"\\u25CF\"),\n arrow: colors.primary(\"\\u2192\"),\n bullet: colors.muted(\"\\u2022\"),\n star: colors.accent(\"\\u2605\"),\n spark: colors.accent(\"\\u2726\"),\n anvil: colors.primary(\"\\u2692\"),\n};\n\n// Status colors for tasks/changes\nexport function statusColor(status: string): string {\n switch (status) {\n case \"passed\":\n case \"validated\":\n case \"archived\":\n return colors.success(status);\n case \"failed\":\n return colors.error(status);\n case \"in-progress\":\n case \"claimed\":\n case \"implementing\":\n case \"validating\":\n return colors.accent(status);\n case \"blocked\":\n return colors.error(status);\n case \"pending\":\n case \"proposed\":\n case \"planning\":\n return colors.muted(status);\n default:\n return colors.white(status);\n }\n}\n\n// Progress bar\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar =\n colors.success(\"\\u2588\".repeat(filled)) + colors.muted(\"\\u2591\".repeat(empty));\n return `${bar} ${percent}%`;\n}\n","/**\n * forgelore propose command\n * Create a new change with proposal, specs, design, and tasks\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n createChange,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\nexport async function proposeCommand(\n idea?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore propose \"));\n\n // Get the idea if not provided\n let ideaText = idea;\n if (!ideaText) {\n const input = await p.text({\n message: \"What do you want to build?\",\n placeholder: \"e.g., Add dark mode toggle to settings\",\n validate: (val) => {\n if (!val) return \"Please describe your idea\";\n return undefined;\n },\n });\n\n if (p.isCancel(input)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n ideaText = input as string;\n }\n\n // Generate a slug name\n const suggestedName = slugify(ideaText).slice(0, 50);\n const nameInput = await p.text({\n message: \"Change name (used as folder name):\",\n placeholder: suggestedName,\n defaultValue: suggestedName,\n validate: (val) => {\n if (!val) return \"Please enter a name\";\n if (!/^[a-z0-9-]+$/.test(val))\n return \"Use lowercase letters, numbers, and hyphens only\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameInput)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n const changeName = (nameInput as string) || suggestedName;\n\n // Build the proposal content\n const proposalContent = `# Proposal: ${ideaText}\n\n## Motivation\n\n<!-- Why are we doing this? What problem does it solve? -->\n\n\n## Scope\n\n<!-- What is included and excluded from this change? -->\n\n### In Scope\n\n\n### Out of Scope\n\n\n## Context\n\n<!-- Any relevant context, links, or references -->\n\n\n## Success Criteria\n\n<!-- How do we know this is done? -->\n\n1. \n\n---\n\n*Proposed: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n // Create the change\n const spinner = ora({\n text: \"Creating change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const change = await createChange(projectRoot, changeName, proposalContent);\n spinner.succeed(colors.success(`Created change: ${changeName}`));\n\n const files = [\n `forgelore/changes/${changeName}/proposal.md`,\n `forgelore/changes/${changeName}/specs/requirements.md`,\n `forgelore/changes/${changeName}/specs/scenarios.md`,\n `forgelore/changes/${changeName}/design.md`,\n `forgelore/changes/${changeName}/tasks.md`,\n ];\n\n const summary = [\n `${icons.success} ${colors.white(\"Change created:\")} ${colors.primary(changeName)}`,\n \"\",\n `${colors.white(\"Files:\")}`,\n ...files.map((f) => ` ${icons.bullet} ${colors.muted(f)}`),\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Fill in ${colors.primary(\"proposal.md\")} with motivation and scope`,\n ` 2. Define requirements in ${colors.primary(\"specs/requirements.md\")}`,\n ` 3. Add scenarios in ${colors.primary(\"specs/scenarios.md\")}`,\n ` 4. Describe approach in ${colors.primary(\"design.md\")}`,\n ` 5. Break into tasks in ${colors.primary(\"tasks.md\")}`,\n ];\n\n console.log(renderBox(summary.join(\"\\n\"), \"Proposed\", \"#7C3AED\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to create change\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(\n `Run ${colors.primary(\"forgelore clarify\")} ${colors.muted(changeName)} to refine requirements.`\n );\n}\n","/**\n * forgelore status command\n * Beautiful dashboard showing all changes, progress, and capabilities\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listCapabilities,\n getProjectSummary,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function statusCommand(options?: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n console.log(renderBanner());\n\n const config = await readConfig(projectRoot);\n const summary = await getProjectSummary(projectRoot);\n const capabilities = await listCapabilities(projectRoot);\n\n // Header stats\n const statsLine = [\n `${colors.primary(String(summary.activeChanges))} active`,\n `${colors.success(String(summary.archivedChanges))} archived`,\n `${colors.secondary(String(summary.totalCapabilities))} capabilities`,\n `${colors.muted(\"mode:\")} ${colors.accent(config.mode)}`,\n ].join(colors.muted(\" \\u2502 \"));\n\n console.log(renderBox(statsLine, \"forgelore status\", \"#7C3AED\"));\n\n // Active changes table\n if (summary.changes.length > 0) {\n const table = new Table({\n head: [\n colors.bold(\"Change\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 14, 10, 30],\n });\n\n for (const change of summary.changes) {\n const ts = change.taskSummary;\n const taskStr =\n ts.total > 0\n ? `${ts.passed}/${ts.total}`\n : colors.muted(\"none\");\n const progress =\n ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n ]);\n }\n\n console.log(renderSection(\"Active Changes\", table.toString()));\n } else {\n console.log(\n renderSection(\n \"Active Changes\",\n ` ${colors.muted(\"No active changes.\")} Run ${colors.primary(\"forgelore propose\")} to create one.`\n )\n );\n }\n\n // Capabilities\n if (capabilities.length > 0) {\n const capTable = new Table({\n head: [\n colors.bold(\"Capability\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 25, 16],\n });\n\n for (const cap of capabilities.slice(0, 10)) {\n capTable.push([\n colors.white(cap.name),\n colors.muted(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n ]);\n }\n\n const moreText =\n capabilities.length > 10\n ? `\\n ${colors.muted(`...and ${capabilities.length - 10} more. Run`)} ${colors.primary(\"forgelore capabilities\")} ${colors.muted(\"to see all.\")}`\n : \"\";\n\n console.log(\n renderSection(\"Capabilities\", capTable.toString() + moreText)\n );\n } else {\n console.log(\n renderSection(\n \"Capabilities\",\n ` ${colors.muted(\"No capabilities yet.\")} Archive a completed change to start building the knowledge base.`\n )\n );\n }\n\n // Global sync status\n if (config.mode === \"local+global\" || config.mode === \"global\") {\n const globalInfo = config.global\n ? ` ${icons.info} Source: ${colors.secondary(config.global.source)}\\n` +\n ` ${icons.info} Path: ${colors.muted(config.global.path)}\\n` +\n ` ${icons.info} Auto-sync: ${config.global.autoSync ? colors.success(\"enabled\") : colors.muted(\"disabled\")}`\n : ` ${colors.warning(\"Global spec repo not configured.\")}`;\n\n console.log(renderSection(\"Global Specs\", globalInfo));\n }\n}\n","/**\n * forgelore clarify command\n * Review and refine requirements for a change\n */\n\nimport * as p from \"@clack/prompts\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n updateChangeStatus,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function clarifyCommand(\n changeName: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore clarify \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.\\nRun ${colors.primary(\"forgelore list\")} to see available changes.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Show current state\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n let requirements: string;\n try {\n requirements = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n } catch {\n requirements = \"(not yet defined)\";\n }\n\n let scenarios: string;\n try {\n scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n } catch {\n scenarios = \"(not yet defined)\";\n }\n\n console.log(\n renderBox(\n [\n `${icons.info} Change: ${colors.primary(changeName)}`,\n `${icons.info} Status: ${colors.accent(change.status)}`,\n `${icons.info} Created: ${colors.muted(change.createdAt.slice(0, 10))}`,\n ].join(\"\\n\"),\n \"Change Details\"\n )\n );\n\n console.log(renderSection(\"Proposal\", colors.muted(proposal.slice(0, 500))));\n console.log(renderSection(\"Requirements\", colors.muted(requirements.slice(0, 500))));\n console.log(renderSection(\"Scenarios\", colors.muted(scenarios.slice(0, 500))));\n\n // Clarification checklist\n const checks = await p.group({\n proposalComplete: () =>\n p.confirm({\n message: \"Is the proposal well-defined with clear motivation and scope?\",\n initialValue: false,\n }),\n requirementsDefined: () =>\n p.confirm({\n message: \"Are functional and non-functional requirements specified?\",\n initialValue: false,\n }),\n scenariosCovered: () =>\n p.confirm({\n message: \"Are happy path, edge cases, and error scenarios defined?\",\n initialValue: false,\n }),\n readyForDesign: () =>\n p.confirm({\n message: \"Is this change ready for design and task breakdown?\",\n initialValue: false,\n }),\n });\n\n if (p.isCancel(checks)) {\n p.cancel(\"Clarify cancelled.\");\n process.exit(0);\n }\n\n const allReady = checks.proposalComplete && checks.requirementsDefined && checks.scenariosCovered && checks.readyForDesign;\n\n if (allReady) {\n await updateChangeStatus(projectRoot, changeName, \"planning\");\n console.log(\n renderBox(\n `${icons.success} Change ${colors.primary(changeName)} is ready for design.\\n` +\n `Status updated to ${colors.accent(\"planning\")}.\\n\\n` +\n `Next: Fill in ${colors.primary(\"design.md\")} and ${colors.primary(\"tasks.md\")}`,\n \"Ready\",\n \"#10B981\"\n )\n );\n } else {\n const incomplete = [];\n if (!checks.proposalComplete) incomplete.push(` ${icons.pending} Proposal needs refinement`);\n if (!checks.requirementsDefined) incomplete.push(` ${icons.pending} Requirements need specification`);\n if (!checks.scenariosCovered) incomplete.push(` ${icons.pending} Scenarios need coverage`);\n\n console.log(\n renderBox(\n `${icons.warning} Change ${colors.primary(changeName)} needs more clarification:\\n\\n` +\n incomplete.join(\"\\n\") +\n `\\n\\n${colors.muted(\"Edit the spec files and run\")} ${colors.primary(\"forgelore clarify \" + changeName)} ${colors.muted(\"again.\")}`,\n \"Needs Work\",\n \"#F59E0B\"\n )\n );\n }\n\n p.outro(colors.muted(\"Specs are the foundation. Take the time to get them right.\"));\n}\n","/**\n * forgelore list command\n * List all changes with status and progress\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listChanges,\n} from \"@forgelore/core\";\nimport { summarizeTasks } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function listCommand(options?: {\n archived?: boolean;\n status?: string;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n let changes = await listChanges(projectRoot, options?.archived ?? false);\n\n // Filter by status if specified\n if (options?.status) {\n changes = changes.filter((c) => c.status === options.status);\n }\n\n if (changes.length === 0) {\n const msg = options?.status\n ? `No changes with status \"${options.status}\".`\n : \"No changes found.\";\n console.log(\n renderBox(\n `${icons.info} ${msg}\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Changes\"\n )\n );\n return;\n }\n\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n colors.bold(\"Updated\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [28, 14, 10, 26, 14],\n });\n\n for (const change of changes) {\n const ts = summarizeTasks(change.tasks);\n const taskStr = ts.total > 0 ? `${ts.passed}/${ts.total}` : colors.muted(\"--\");\n const progress = ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n const updated = colors.dim(change.updatedAt.slice(0, 10));\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n updated,\n ]);\n }\n\n const title = options?.archived ? \"All Changes (including archived)\" : \"Active Changes\";\n console.log(renderSection(title, table.toString()));\n console.log(\n colors.muted(` ${changes.length} change${changes.length === 1 ? \"\" : \"s\"} found`)\n );\n}\n","/**\n * forgelore verify command\n * Structural verification of a change's spec completeness\n * NOTE: This does NOT call any LLM — it checks file existence and content structure\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n listChanges,\n getChangePath,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface VerifyCheck {\n name: string;\n passed: boolean;\n message: string;\n}\n\nasync function verifyChange(\n projectRoot: string,\n changeName: string\n): Promise<VerifyCheck[]> {\n const checks: VerifyCheck[] = [];\n const changePath = getChangePath(projectRoot, changeName);\n\n // Check proposal.md exists and has content\n try {\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n const hasContent = proposal.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Proposal\",\n passed: hasContent,\n message: hasContent\n ? \"proposal.md has content\"\n : \"proposal.md is mostly empty — fill in motivation and scope\",\n });\n } catch {\n checks.push({\n name: \"Proposal\",\n passed: false,\n message: \"proposal.md is missing\",\n });\n }\n\n // Check requirements.md\n try {\n const reqs = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n const hasContent = reqs.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Requirements\",\n passed: hasContent,\n message: hasContent\n ? \"requirements.md has content\"\n : \"requirements.md is mostly empty — define functional and non-functional requirements\",\n });\n } catch {\n checks.push({\n name: \"Requirements\",\n passed: false,\n message: \"specs/requirements.md is missing\",\n });\n }\n\n // Check scenarios.md\n try {\n const scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n const hasContent = scenarios.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Scenarios\",\n passed: hasContent,\n message: hasContent\n ? \"scenarios.md has content\"\n : \"scenarios.md is mostly empty — define happy path, edge cases, error cases\",\n });\n } catch {\n checks.push({\n name: \"Scenarios\",\n passed: false,\n message: \"specs/scenarios.md is missing\",\n });\n }\n\n // Check design.md\n try {\n const design = await readChangeFile(projectRoot, changeName, \"design.md\");\n const hasContent = design.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Design\",\n passed: hasContent,\n message: hasContent\n ? \"design.md has content\"\n : \"design.md is mostly empty — describe technical approach\",\n });\n } catch {\n checks.push({\n name: \"Design\",\n passed: false,\n message: \"design.md is missing\",\n });\n }\n\n // Check tasks.md\n try {\n const tasks = await readChangeFile(projectRoot, changeName, \"tasks.md\");\n const hasContent = tasks.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Tasks\",\n passed: hasContent,\n message: hasContent\n ? \"tasks.md has content\"\n : \"tasks.md is mostly empty — break down implementation into tasks\",\n });\n } catch {\n checks.push({\n name: \"Tasks\",\n passed: false,\n message: \"tasks.md is missing\",\n });\n }\n\n return checks;\n}\n\nexport async function verifyCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // If no change specified, verify all active changes\n const changesToVerify: string[] = [];\n if (changeName) {\n changesToVerify.push(changeName);\n } else {\n const changes = await listChanges(projectRoot, false);\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to verify.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Nothing to Verify\"\n )\n );\n return;\n }\n changesToVerify.push(...changes.map((c) => c.name));\n }\n\n let totalPassed = 0;\n let totalChecks = 0;\n\n for (const name of changesToVerify) {\n try {\n const checks = await verifyChange(projectRoot, name);\n const passed = checks.filter((c) => c.passed).length;\n totalPassed += passed;\n totalChecks += checks.length;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}`\n );\n\n const allPassed = passed === checks.length;\n const borderColor = allPassed ? \"#10B981\" : \"#F59E0B\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${checks.length} checks passed\\n\\n${lines.join(\"\\n\")}`,\n name,\n borderColor\n )\n );\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(name)} not found.`,\n name,\n \"#EF4444\"\n )\n );\n }\n }\n\n // Summary\n if (changesToVerify.length > 1) {\n const allPassed = totalPassed === totalChecks;\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${totalPassed}/${totalChecks} total checks passed across ${changesToVerify.length} changes`,\n \"Summary\",\n allPassed ? \"#10B981\" : \"#F59E0B\"\n )\n );\n }\n}\n","/**\n * forgelore archive command\n * Two-step archive: 1) write outcome.md, 2) move to archive + extract capabilities\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n archiveChange,\n readOutcome,\n writeOutcome,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function archiveCommand(\n changeName: string,\n options?: { skipOutcome?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore archive \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Check if outcome.md already exists\n const changePath = getChangePath(projectRoot, changeName);\n const existingOutcome = await readOutcome(changePath);\n\n if (!existingOutcome && !options?.skipOutcome) {\n // Step 1: outcome.md needs to be created\n console.log(\n renderBox(\n [\n `${icons.info} Before archiving, an ${colors.primary(\"outcome.md\")} should be created.`,\n \"\",\n `This file captures:`,\n ` ${icons.bullet} What was built and the final state`,\n ` ${icons.bullet} Capabilities that emerged from this change`,\n ` ${icons.bullet} Lessons learned and patterns established`,\n \"\",\n `${colors.muted(\"An AI agent can generate this, or you can write it manually.\")}`,\n `${colors.muted(\"Create\")} ${colors.primary(`forgelore/changes/${changeName}/outcome.md`)} ${colors.muted(\"and run archive again.\")}`,\n ].join(\"\\n\"),\n \"Step 1: Outcome\",\n \"#F59E0B\"\n )\n );\n\n const proceed = await p.confirm({\n message: \"Create a placeholder outcome.md and continue archiving?\",\n initialValue: false,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel(\"Archive paused. Create outcome.md and run archive again.\");\n process.exit(0);\n }\n\n // Write placeholder outcome\n const placeholderOutcome = `# Outcome: ${changeName}\n\n## What Was Built\n\n<!-- Summary of what was implemented -->\n\n\n## Capabilities\n\n<!-- List capabilities that emerged from this change -->\n<!-- Format: - **Capability Name**: Description -->\n\n- \n\n## Lessons Learned\n\n<!-- What did we learn? Any patterns to document? -->\n\n\n## Files Changed\n\n<!-- Key files that were created or modified -->\n\n- \n\n---\n\n*Archived: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n await writeOutcome(changePath, placeholderOutcome);\n console.log(` ${icons.success} Created placeholder outcome.md`);\n }\n\n // Step 2: Archive\n const confirmArchive = await p.confirm({\n message: `Archive \"${changeName}\"? This will move it to forgelore/changes/archive/`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmArchive) || !confirmArchive) {\n p.cancel(\"Archive cancelled.\");\n process.exit(0);\n }\n\n const spinner = ora({\n text: \"Archiving change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const archivePath = await archiveChange(projectRoot, changeName);\n spinner.succeed(colors.success(\"Change archived\"));\n\n console.log(\n renderBox(\n [\n `${icons.success} ${colors.white(\"Archived:\")} ${colors.primary(changeName)}`,\n `${icons.arrow} ${colors.muted(archivePath)}`,\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Review ${colors.primary(\"outcome.md\")} and extract capabilities`,\n ` 2. Run ${colors.primary(\"forgelore capabilities\")} to view the knowledge base`,\n ` 3. Update ${colors.primary(\"forgelore/knowledge/architecture.md\")} if needed`,\n ].join(\"\\n\"),\n \"Archived\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Failed to archive\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(colors.muted(\"Knowledge captured. The spec lives on.\"));\n}\n","/**\n * forgelore sync command\n * Sync with global spec repository\n */\n\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport {\n configExists,\n readConfig,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function syncCommand(options?: {\n force?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const config = await readConfig(projectRoot);\n\n if (config.mode === \"local\") {\n console.log(\n renderBox(\n `${icons.info} Spec mode is ${colors.primary(\"local\")}. No global repo to sync.\\n` +\n `Run ${colors.primary(\"forgelore config mode local+global\")} to enable global specs.`,\n \"No Sync Needed\"\n )\n );\n return;\n }\n\n if (!config.global?.source) {\n console.log(\n renderBox(\n `${icons.error} Global spec source not configured.\\n` +\n `Run ${colors.primary(\"forgelore config global.source <path-or-url>\")} to set it.`,\n \"Not Configured\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const source = config.global.source;\n const isGitUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\") || source.startsWith(\"git@\");\n const targetPath = config.global.path;\n\n const spinner = ora({\n text: `Syncing from ${source}...`,\n color: \"magenta\",\n }).start();\n\n try {\n if (isGitUrl) {\n // Git clone or pull\n if (existsSync(targetPath)) {\n spinner.text = \"Pulling latest changes...\";\n execSync(\"git pull --ff-only\", { cwd: targetPath, stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs updated (git pull)\"));\n } else {\n spinner.text = \"Cloning global spec repo...\";\n mkdirSync(targetPath, { recursive: true });\n execSync(`git clone ${source} ${targetPath}`, { stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs cloned\"));\n }\n } else {\n // Filesystem path — just validate it exists\n if (existsSync(source)) {\n spinner.succeed(\n colors.success(`Global specs linked: ${colors.muted(source)}`)\n );\n } else {\n spinner.fail(\n colors.error(`Global spec path not found: ${source}`)\n );\n process.exit(1);\n }\n }\n\n console.log(\n renderBox(\n [\n `${icons.success} Global specs synced`,\n `${icons.info} Source: ${colors.secondary(source)}`,\n `${icons.info} Path: ${colors.muted(targetPath)}`,\n ].join(\"\\n\"),\n \"Sync Complete\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Sync failed\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n}\n","/**\n * forgelore doctor command\n * Health check and diagnostics for forgelore configuration\n */\n\nimport ora from \"ora\";\nimport { resolve, join } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n configExists,\n readConfig,\n fileExists,\n getForgeloreDir,\n listChanges,\n listCapabilities,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\ninterface HealthCheck {\n name: string;\n passed: boolean;\n message: string;\n fixable?: boolean;\n}\n\nexport async function doctorCommand(options?: {\n fix?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n const forgeloreDir = getForgeloreDir(projectRoot);\n const checks: HealthCheck[] = [];\n\n console.log(\n renderBox(\n `${icons.info} Running health checks...`,\n \"forgelore doctor\"\n )\n );\n\n // 1. Config exists\n const hasConfig = await configExists(projectRoot);\n checks.push({\n name: \"Configuration\",\n passed: hasConfig,\n message: hasConfig\n ? \"forgelore.json found\"\n : \"forgelore.json not found — run forgelore init\",\n });\n\n if (!hasConfig) {\n printResults(checks);\n return;\n }\n\n // 2. Config parseable\n let config;\n try {\n config = await readConfig(projectRoot);\n checks.push({\n name: \"Config Valid\",\n passed: true,\n message: `Config parsed (v${config.version}, mode: ${config.mode})`,\n });\n } catch (err) {\n checks.push({\n name: \"Config Valid\",\n passed: false,\n message: `Config parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n printResults(checks);\n return;\n }\n\n // 3. Directory structure\n const dirs = [\n { path: join(forgeloreDir, \"changes\"), name: \"changes/\" },\n { path: join(forgeloreDir, \"changes\", \"archive\"), name: \"changes/archive/\" },\n { path: join(forgeloreDir, \"knowledge\"), name: \"knowledge/\" },\n { path: join(forgeloreDir, \"knowledge\", \"capabilities\"), name: \"knowledge/capabilities/\" },\n { path: join(forgeloreDir, \"knowledge\", \"decisions\"), name: \"knowledge/decisions/\" },\n ];\n\n for (const dir of dirs) {\n const exists = await fileExists(dir.path);\n checks.push({\n name: `Dir: ${dir.name}`,\n passed: exists,\n message: exists ? `${dir.name} exists` : `${dir.name} missing`,\n fixable: true,\n });\n\n if (!exists && options?.fix) {\n await mkdir(dir.path, { recursive: true });\n }\n }\n\n // 4. Knowledge base files\n const knowledgeFiles = [\n { path: join(forgeloreDir, \"knowledge\", \"architecture.md\"), name: \"architecture.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"patterns.md\"), name: \"patterns.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"glossary.md\"), name: \"glossary.md\" },\n ];\n\n for (const file of knowledgeFiles) {\n const exists = await fileExists(file.path);\n checks.push({\n name: `KB: ${file.name}`,\n passed: exists,\n message: exists ? `${file.name} present` : `${file.name} missing`,\n });\n }\n\n // 5. Changes health\n try {\n const changes = await listChanges(projectRoot, false);\n checks.push({\n name: \"Active Changes\",\n passed: true,\n message: `${changes.length} active change${changes.length === 1 ? \"\" : \"s\"}`,\n });\n\n // Check for orphaned metadata\n for (const change of changes) {\n const hasProposal = await fileExists(join(change.path, \"proposal.md\"));\n if (!hasProposal) {\n checks.push({\n name: `Change: ${change.name}`,\n passed: false,\n message: `${change.name} has metadata but missing proposal.md`,\n });\n }\n }\n } catch {\n checks.push({\n name: \"Active Changes\",\n passed: false,\n message: \"Could not read changes directory\",\n });\n }\n\n // 6. Global sync (if applicable)\n if (config.mode !== \"local\" && config.global) {\n const globalExists = await fileExists(config.global.path);\n checks.push({\n name: \"Global Repo\",\n passed: globalExists,\n message: globalExists\n ? `Global specs available at ${config.global.path}`\n : `Global specs not found at ${config.global.path} — run forgelore sync`,\n });\n }\n\n printResults(checks, options?.fix);\n}\n\nfunction printResults(checks: HealthCheck[], didFix?: boolean): void {\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const allPassed = passed === total;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}${!c.passed && c.fixable && didFix ? colors.success(\" (fixed)\") : \"\"}`\n );\n\n const borderColor = allPassed ? \"#10B981\" : passed > total / 2 ? \"#F59E0B\" : \"#EF4444\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${total} checks passed\\n\\n${lines.join(\"\\n\")}`,\n \"Results\",\n borderColor\n )\n );\n\n if (!allPassed && !didFix) {\n const fixable = checks.filter((c) => !c.passed && c.fixable).length;\n if (fixable > 0) {\n console.log(\n colors.muted(` Run ${colors.primary(\"forgelore doctor --fix\")} to auto-fix ${fixable} issue${fixable === 1 ? \"\" : \"s\"}.`)\n );\n }\n }\n}\n","/**\n * forgelore capabilities command\n * List all registered capabilities in the knowledge base\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listCapabilities,\n} from \"@forgelore/core\";\nimport type { Capability } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function capabilitiesCommand(options?: {\n json?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const capabilities = await listCapabilities(projectRoot);\n\n if (capabilities.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No capabilities registered yet.\\n\\n` +\n `Capabilities are extracted when changes are archived.\\n` +\n `Archive a completed change with ${colors.primary(\"forgelore archive <change>\")} to start building\\nyour knowledge base.`,\n \"Capabilities\"\n )\n );\n return;\n }\n\n // JSON output\n if (options?.json) {\n console.log(JSON.stringify(capabilities, null, 2));\n return;\n }\n\n // Table output\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Description\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n colors.bold(\"Tags\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [22, 30, 18, 14, 16],\n wordWrap: true,\n });\n\n for (const cap of capabilities) {\n table.push([\n colors.white(cap.name),\n colors.muted(cap.description.slice(0, 60)),\n colors.secondary(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n cap.tags?.length ? colors.accent(cap.tags.join(\", \")) : colors.muted(\"--\"),\n ]);\n }\n\n console.log(renderSection(\"Capabilities\", table.toString()));\n console.log(\n colors.muted(\n ` ${capabilities.length} capabilit${capabilities.length === 1 ? \"y\" : \"ies\"} registered`\n )\n );\n}\n","/**\n * forgelore config command\n * Get, set, or list configuration values\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readConfig,\n getConfigValue,\n setConfigValue,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function configCommand(\n key?: string,\n value?: string,\n options?: { list?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // List all config\n if (options?.list || (!key && !value)) {\n const config = await readConfig(projectRoot);\n const lines = formatObject(config, \"\");\n\n console.log(\n renderSection(\"Configuration\", lines.join(\"\\n\"))\n );\n return;\n }\n\n // Get value\n if (key && !value) {\n const val = await getConfigValue(projectRoot, key);\n if (val === undefined) {\n console.log(\n ` ${icons.error} Key ${colors.primary(key)} not found in config.`\n );\n process.exit(1);\n }\n\n if (typeof val === \"object\" && val !== null) {\n const lines = formatObject(val as Record<string, unknown>, \"\");\n console.log(renderSection(key, lines.join(\"\\n\")));\n } else {\n console.log(` ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(val))}`);\n }\n return;\n }\n\n // Set value\n if (key && value) {\n // Parse value — try JSON, booleans, numbers, then string\n let parsed: unknown = value;\n if (value === \"true\") parsed = true;\n else if (value === \"false\") parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n else {\n try {\n parsed = JSON.parse(value);\n } catch {\n // keep as string\n }\n }\n\n await setConfigValue(projectRoot, key, parsed);\n console.log(\n ` ${icons.success} Set ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(parsed))}`\n );\n }\n}\n\nfunction formatObject(\n obj: Record<string, unknown>,\n prefix: string\n): string[] {\n const lines: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${k}` : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n lines.push(` ${colors.muted(fullKey + \":\")}`);\n lines.push(...formatObject(v as Record<string, unknown>, fullKey));\n } else {\n lines.push(\n ` ${colors.primary(fullKey)} ${colors.muted(\"=\")} ${colors.white(String(v))}`\n );\n }\n }\n return lines;\n}\n","/**\n * forgelore diff command\n * Show structural drift between specs and current project state\n * NOTE: This is a structural check, not an LLM-powered analysis\n */\n\nimport { resolve, relative } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listChanges,\n readChange,\n readChangeFile,\n getChangesDir,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface DriftItem {\n type: string;\n severity: \"info\" | \"warning\" | \"critical\";\n message: string;\n}\n\nexport async function diffCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const driftItems: DriftItem[] = [];\n\n if (changeName) {\n // Analyze a specific change\n try {\n const change = await readChange(projectRoot, changeName);\n await analyzeChangeDrift(projectRoot, changeName, driftItems);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n } else {\n // Analyze all active changes\n const changes = await listChanges(projectRoot, false);\n\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to analyze.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"No Changes\"\n )\n );\n return;\n }\n\n for (const change of changes) {\n await analyzeChangeDrift(projectRoot, change.name, driftItems);\n }\n }\n\n if (driftItems.length === 0) {\n console.log(\n renderBox(\n `${icons.success} No drift detected. Specs and implementation are in sync.`,\n \"All Clear\",\n \"#10B981\"\n )\n );\n return;\n }\n\n // Display drift items\n const table = new Table({\n head: [\n colors.bold(\"Severity\"),\n colors.bold(\"Type\"),\n colors.bold(\"Message\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [12, 20, 55],\n wordWrap: true,\n });\n\n for (const item of driftItems) {\n const sevColor =\n item.severity === \"critical\"\n ? colors.error\n : item.severity === \"warning\"\n ? colors.warning\n : colors.muted;\n\n table.push([\n sevColor(item.severity),\n colors.white(item.type),\n colors.muted(item.message),\n ]);\n }\n\n const critical = driftItems.filter((d) => d.severity === \"critical\").length;\n const warnings = driftItems.filter((d) => d.severity === \"warning\").length;\n const info = driftItems.filter((d) => d.severity === \"info\").length;\n\n const summaryParts = [];\n if (critical > 0) summaryParts.push(colors.error(`${critical} critical`));\n if (warnings > 0) summaryParts.push(colors.warning(`${warnings} warnings`));\n if (info > 0) summaryParts.push(colors.muted(`${info} info`));\n\n console.log(\n renderSection(\"Drift Report\", table.toString())\n );\n console.log(\n renderBox(\n `${critical > 0 ? icons.error : icons.warning} ${summaryParts.join(\", \")}`,\n \"Summary\",\n critical > 0 ? \"#EF4444\" : \"#F59E0B\"\n )\n );\n}\n\nasync function analyzeChangeDrift(\n projectRoot: string,\n changeName: string,\n items: DriftItem[]\n): Promise<void> {\n // Check for stale changes (proposed but no activity for 7+ days)\n try {\n const change = await readChange(projectRoot, changeName);\n const updatedAt = new Date(change.updatedAt);\n const daysSince = Math.floor(\n (Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (daysSince > 14 && change.status === \"proposed\") {\n items.push({\n type: \"stale-proposal\",\n severity: \"warning\",\n message: `\"${changeName}\" proposed ${daysSince} days ago with no progress`,\n });\n }\n\n if (daysSince > 7 && change.status === \"in-progress\") {\n items.push({\n type: \"stale-progress\",\n severity: \"info\",\n message: `\"${changeName}\" in progress for ${daysSince} days since last update`,\n });\n }\n\n // Check for empty spec files\n const specFiles = [\"proposal.md\", \"specs/requirements.md\", \"specs/scenarios.md\", \"design.md\", \"tasks.md\"];\n for (const file of specFiles) {\n try {\n const content = await readChangeFile(projectRoot, changeName, file);\n const stripped = content.replace(/<!--.*?-->/gs, \"\").trim();\n if (stripped.length < 30) {\n items.push({\n type: \"empty-spec\",\n severity: change.status === \"in-progress\" ? \"warning\" : \"info\",\n message: `\"${changeName}/${file}\" has minimal content`,\n });\n }\n } catch {\n items.push({\n type: \"missing-file\",\n severity: \"critical\",\n message: `\"${changeName}/${file}\" is missing`,\n });\n }\n }\n\n // Check for tasks with no progress if status is in-progress\n if (\n change.status === \"in-progress\" &&\n change.tasks.length > 0 &&\n change.tasks.every((t) => t.status === \"pending\")\n ) {\n items.push({\n type: \"no-task-progress\",\n severity: \"warning\",\n message: `\"${changeName}\" is in-progress but all ${change.tasks.length} tasks are still pending`,\n });\n }\n } catch {\n items.push({\n type: \"read-error\",\n severity: \"critical\",\n message: `Could not read change \"${changeName}\"`,\n });\n }\n}\n"],"mappings":";;;AAMA,SAAS,eAAe;;;ACDxB,YAAY,OAAO;AACnB,OAAO,SAAS;AAChB,SAAoB,aAAa;AACjC,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;;;ACTlC,OAAO,WAAW;AAClB,OAAOA,YAAW;AAClB,OAAOC,eAAc;;;ACNrB,OAAO,WAAW;AAClB,OAAO,cAAc;AAGd,IAAM,SAAS;AAAA,EACpB,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAC5B,WAAW,MAAM,IAAI,SAAS;AAAA;AAAA,EAC9B,QAAQ,MAAM,IAAI,SAAS;AAAA;AAAA,EAC3B,MAAM,MAAM,IAAI,SAAS;AAAA;AAAA,EACzB,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAC5B,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAC5B,OAAO,MAAM,IAAI,SAAS;AAAA;AAAA,EAC1B,OAAO,MAAM,IAAI,SAAS;AAAA;AAAA,EAC1B,KAAK,MAAM;AAAA,EACX,MAAM,MAAM;AAAA,EACZ,OAAO,MAAM;AACf;AAGO,IAAM,YAAY;AAAA,EACvB,OAAO,SAAS,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AAAA,EAC5D,OAAO,SAAS,CAAC,WAAW,SAAS,CAAC;AAAA,EACtC,MAAM,SAAS,CAAC,WAAW,SAAS,CAAC;AAAA,EACrC,MAAM,SAAS,CAAC,WAAW,SAAS,CAAC;AAAA,EACrC,MAAM,SAAS,CAAC,WAAW,SAAS,CAAC;AAAA,EACrC,SAAS,SAAS,CAAC,WAAW,SAAS,CAAC;AAAA,EACxC,QAAQ,SAAS,CAAC,WAAW,WAAW,SAAS,CAAC;AACpD;AAGO,IAAM,QAAQ;AAAA,EACnB,SAAS,OAAO,QAAQ,QAAQ;AAAA,EAChC,OAAO,OAAO,MAAM,QAAQ;AAAA,EAC5B,SAAS,OAAO,QAAQ,QAAQ;AAAA,EAChC,MAAM,OAAO,UAAU,QAAQ;AAAA,EAC/B,SAAS,OAAO,MAAM,QAAQ;AAAA,EAC9B,YAAY,OAAO,OAAO,QAAQ;AAAA,EAClC,OAAO,OAAO,QAAQ,QAAQ;AAAA,EAC9B,QAAQ,OAAO,MAAM,QAAQ;AAAA,EAC7B,MAAM,OAAO,OAAO,QAAQ;AAAA,EAC5B,OAAO,OAAO,OAAO,QAAQ;AAAA,EAC7B,OAAO,OAAO,QAAQ,QAAQ;AAChC;AAGO,SAAS,YAAY,QAAwB;AAClD,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,QAAQ,MAAM;AAAA,IAC9B,KAAK;AACH,aAAO,OAAO,MAAM,MAAM;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,OAAO,MAAM;AAAA,IAC7B,KAAK;AACH,aAAO,OAAO,MAAM,MAAM;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,MAAM,MAAM;AAAA,IAC5B;AACE,aAAO,OAAO,MAAM,MAAM;AAAA,EAC9B;AACF;AAGO,SAAS,YAAY,SAAiB,QAAQ,IAAY;AAC/D,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,KAAK;AACjD,QAAM,QAAQ,QAAQ;AACtB,QAAM,MACJ,OAAO,QAAQ,SAAS,OAAO,MAAM,CAAC,IAAI,OAAO,MAAM,SAAS,OAAO,KAAK,CAAC;AAC/E,SAAO,GAAG,GAAG,IAAI,OAAO;AAC1B;;;ADjEA,IAAM,SAAiB;AACvB,IAAM,cAAiB;AACvB,IAAM,gBAAiB;AAEvB,IAAM,YAAiB;AACvB,IAAM,cAAiB;AACvB,IAAM,YAAiB;AACvB,IAAM,OAAiB;AACvB,IAAM,aAAiB;AAGvB,IAAM,gBAAgBC,UAAS,CAAC,QAAQ,eAAe,aAAa,SAAS,CAAC;AAG9E,IAAM,eAAe;AAAA,EACnB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAQA,IAAM,UAAU;AAChB,IAAM,MAAM;AAGZ,IAAM,cAAc;AAAA,EAClB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,IAAM,cAAc;AACpB,IAAM,cAAc;AAGpB,IAAM,kBAAkB;AAIxB,IAAM,aAAa;AAAA,EACjB,EAAE,MAAM,UAAU,QAAQ,CAAC,WAAW,WAAW,SAAS,EAAE;AAAA;AAAA,EAC5D,EAAE,MAAM,UAAU,QAAQ,CAAC,WAAW,SAAS,EAAE;AAAA;AAAA,EACjD,EAAE,MAAM,UAAU,QAAQ,CAAC,WAAW,SAAS,EAAE;AAAA;AAAA,EACjD,EAAE,MAAM,UAAU,QAAQ,CAAC,WAAW,SAAS,EAAE;AAAA;AAAA,EACjD,EAAE,MAAM,QAAU,QAAQ,CAAC,WAAW,SAAS,EAAE;AAAA;AAAA,EACjD,EAAE,MAAM,UAAU,QAAQ,CAAC,WAAW,SAAS,EAAE;AAAA;AACnD;AAEA,IAAM,eAAe,CAAC,WAAW,SAAS;AAI1C,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,aAAc;AACpB,IAAM,SAAS,CAAC,MAAe,IAAI,IAAI,QAAQ,CAAC,MAAM;AACtD,IAAM,QAAS,CAAC,OAAe,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAIzE,SAAS,SAAS,KAAuC;AACvD,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE;AAC7B,SAAO;AAAA,IACL,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,IAC9B,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,IAC9B,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,MAAM,GAAW,GAAW,GAAmB;AACtD,QAAM,IAAI,CAAC,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AACjE,SACE,MACA,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,IACjC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,IACjC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAErC;AAEA,SAAS,QAAQ,GAAW,GAAW,GAAmB;AACxD,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,CAAC;AAC/B,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,CAAC;AAC/B,SAAO,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AACzE;AAcA,SAAS,SAAS,MAAc,QAAQ,GAAa;AACnD,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;AACvC,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAGxC,QAAM,SAAS,QAAQ,MAAM,aAAa,CAAC;AAC3C,QAAM,MAAM,CAAC,MAAcC,OAAM,IAAI,MAAM,EAAE,CAAC;AAG9C,QAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,QAAQ,WAAW,YAAY,CAAC,IAAI,WAAW,CAAC;AAClF,QAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,QAAQ,eAAe,YAAY,CAAC,IAAI,eAAe,CAAC;AAC1F,QAAM,MAAM,CAAC,MAAcC,UAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;AAGjD,QAAM,MAAM,QAAQ,MAAM,QAAQ,CAAC;AACnC,QAAM,MAAM,QAAQ,MAAM,eAAe,CAAC;AAC1C,QAAM,MAAM,CAAC,MAAcA,UAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;AAGjD,QAAM,SAAS,QAAQ,MAAM,WAAW,CAAC;AACzC,QAAM,MAAM,CAAC,MAAcD,OAAM,IAAI,MAAM,EAAE,CAAC;AAG9C,QAAM,MAAS,MAAM,WAAW,SAAS,OAAO,OAAO,IAAI;AAC3D,QAAM,MAAS,MAAM,WAAW,SAAS,OAAO,OAAO,IAAI;AAC3D,QAAM,MAAS,MAAM,WAAW,SAAS,OAAO,OAAO,IAAI;AAC3D,QAAM,IAAS,MAAM;AACrB,QAAM,IAAS;AAEf,SAAO;AAAA,IACL,IAAI,GAAG;AAAA;AAAA,IACP,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA;AAAA,IACpC,IAAI,IAAI,cAAc,CAAC;AAAA;AAAA,IACvB,IAAI,GAAG;AAAA;AAAA,IACP,IAAI,CAAC,IAAI,IAAI,WAAW,IAAI,IAAI,CAAC;AAAA;AAAA,IACjC,IAAI,GAAG;AAAA;AAAA,EACT;AACF;AAIA,SAAS,YAAY,SAAS,MAAc;AAC1C,QAAM,IAAI,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,WAAW,MAAM,CAAC;AAClE,QAAM,OAAO,SAAS,EAAE,SAAS;AACjC,SAAOA,OAAM,IAAI,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI;AACxE;AAOA,SAAS,aAAa,OAAoC;AACxD,QAAM,KAAK,oBAAI,IAAoB;AAEnC,MAAI,UAAU,GAAG;AAEf,OAAG,IAAI,GAAG,OAAO,YAAY,IAAI,YAAY,CAAC;AAC9C,OAAG,IAAI,GAAG,QAAQ,YAAY,IAAI,MAAM,YAAY,IAAI,YAAY,CAAC;AACrE,OAAG,IAAI,GAAG,OAAO,YAAY,IAAI,YAAY,CAAC;AAC9C,OAAG,IAAI,GAAG,MAAM,YAAY,CAAC;AAAA,EAC/B,WAAW,UAAU,GAAG;AAEtB,OAAG,IAAI,GAAG,WAAW,YAAY,CAAC;AAClC,OAAG,IAAI,GAAG,SAAS,YAAY,IAAI,MAAM,YAAY,CAAC;AACtD,OAAG,IAAI,GAAG,QAAQ,YAAY,IAAI,OAAO,YAAY,CAAC;AACtD,OAAG,IAAI,GAAG,OAAO,YAAY,IAAI,QAAQ,YAAY,CAAC;AACtD,OAAG,IAAI,GAAG,QAAQ,YAAY,CAAC;AAC/B,OAAG,IAAI,GAAG,SAAS,YAAY,CAAC;AAAA,EAClC,WAAW,UAAU,GAAG;AAEtB,OAAG,IAAI,GAAG,aAAa,YAAY,KAAK,CAAC;AACzC,OAAG,IAAI,GAAG,WAAW,YAAY,CAAC;AAClC,OAAG,IAAI,GAAG,SAAS,YAAY,KAAK,IAAI,OAAO,YAAY,CAAC;AAC5D,OAAG,IAAI,GAAG,WAAW,YAAY,KAAK,CAAC;AAAA,EACzC,WAAW,UAAU,GAAG;AAEtB,OAAG,IAAI,GAAG,cAAc,YAAY,KAAK,CAAC;AAC1C,OAAG,IAAI,GAAG,YAAY,YAAY,KAAK,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAIA,SAAS,WAAW,OAAiB,QAAmC;AACtE,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAQ,OAAO,MAAM,aAAa,MAAM,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM,IAAI;AAAA,EAC3E;AACF;AAIA,SAAS,WAAmB;AAC1B,SAAO,YACJ,MAAM,EAAE,EACR,IAAI,CAAC,IAAI,MAAMA,OAAM,KAAKA,OAAM,IAAI,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACzD,KAAK,EAAE;AACZ;AAOO,SAAS,eAAuB;AACrC,QAAM,MAAM,SAAS,CAAC,EAAE,KAAK,IAAI;AACjC,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,UAAU,OAAO,MAAM,iCAAiC;AAC9D,QAAM,UAAUA,OAAM,IAAI,UAAU;AACpC,SAAO;AAAA,EAAK,GAAG;AAAA;AAAA,EAAO,KAAK;AAAA,EAAK,OAAO,GAAG,OAAO;AAAA;AACnD;AAYA,eAAsB,uBAAsC;AAC1D,MAAI,CAAC,QAAQ,OAAO,OAAO;AACzB,YAAQ,IAAI,aAAa,CAAC;AAC1B;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,WAAW;AAEhC,MAAI;AACF,YAAQ,IAAI,EAAE;AAGd,UAAM,UAAU,SAAS,IAAI;AAC7B,eAAW,QAAQ,SAAS;AAC1B,cAAQ,OAAO,MAAM,aAAa,OAAO,IAAI;AAC7C,YAAM,MAAM,EAAE;AAAA,IAChB;AAGA,UAAM,YAAY,CAAC,MAAM,KAAM,KAAM,KAAM,MAAM,CAAG;AACpD,eAAW,QAAQ,WAAW;AAC5B,cAAQ,OAAO,MAAM,OAAO,eAAe,CAAC;AAC5C,YAAM,QAAQ,SAAS,IAAI;AAC3B,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,OAAO,MAAM,aAAa,OAAO,IAAI;AAAA,MAC/C;AACA,YAAM,MAAM,EAAE;AAAA,IAChB;AAIA,YAAQ,OAAO,MAAM,OAAO,eAAe,CAAC;AAC5C,eAAW,SAAS,GAAK,GAAG,GAAG,aAAa,CAAC,CAAC;AAC9C,UAAM,MAAM,EAAE;AAEd,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,aAAa,KAAK,IAAI,GAAG,OAAO,IAAI,IAAI;AAC9C,cAAQ,OAAO,MAAM,OAAO,eAAe,CAAC;AAC5C,iBAAW,SAAS,GAAK,UAAU,GAAG,aAAa,CAAC,CAAC;AACrD,YAAM,MAAM,EAAE;AAAA,IAChB;AAGA,YAAQ,OAAO,MAAM,OAAO,eAAe,CAAC;AAC5C,eAAW,SAAS,CAAG,GAAG,oBAAI,IAAI,CAAC;AAGnC,YAAQ,IAAI,EAAE;AACd,YAAQ,OAAO,MAAM,MAAM;AAC3B,UAAM,QAAQ;AACd,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAQ,OAAO,MAAMA,OAAM,IAAI,WAAW,EAAE,QAAQ,CAAC;AACrD,YAAM,MAAM,EAAE;AACd,cAAQ,OAAO,MAAM,OAAOA,OAAM,IAAI,SAAS,EAAE,QAAQ,CAAC;AAC1D,YAAM,MAAM,EAAE;AACd,cAAQ,OAAO;AAAA,QACb,OAAOA,OAAM,KAAKA,OAAM,IAAI,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,MACxD;AACA,YAAM,MAAM,EAAE;AAAA,IAChB;AACA,YAAQ,IAAI,EAAE;AAGd,UAAM,MAAM,GAAG;AACf,YAAQ;AAAA,MACN,OAAO,MAAM,iCAAiC,IAAIA,OAAM,IAAI,UAAU;AAAA,IACxE;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB,UAAE;AACA,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC;AACF;AAKO,SAAS,UACd,SACA,OACA,cAAc,QACN;AACR,SAAO,MAAM,SAAS;AAAA,IACpB,SAAS;AAAA,IACT,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,IAC/C,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB,CAAC;AACH;AAKO,SAAS,cAAc,OAAe,SAAyB;AACpE,SAAO;AAAA,EAAK,cAAc,IAAI,KAAK,GAAG,CAAC;AAAA,EAAK,OAAO;AAAA;AACrD;;;ADhVA,eAAsB,YAAY,SAA0C;AAC1E,QAAM,cAAc,QAAQ,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAExD,UAAQ,IAAI,aAAa,CAAC;AAG1B,MAAI,MAAM,aAAa,WAAW,GAAG;AACnC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,OAAO;AAAA,EACX,OAAO,MAAM,KAAK,CAAC,IAAI,OAAO,QAAQ,kBAAkB,CAAC,IAAI,OAAO,MAAM,uBAAuB,CAAC;AAAA,QACvG;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,EAAE,QAAM,UAAU,MAAM,kBAAkB,CAAC;AAG3C,QAAM,OAAQ,MAAQ,SAAO;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAM,WAAS,IAAI,GAAG;AACpB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACJ,MAAI,SAAS,kBAAkB,SAAS,UAAU;AAChD,UAAM,SAAS,MAAQ,OAAK;AAAA,MAC1B,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,CAAC,QAAQ;AACjB,YAAI,CAAC,IAAK,QAAO;AACjB,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,QAAM,WAAS,MAAM,GAAG;AACtB,MAAE,SAAO,iBAAiB;AAC1B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,mBAAe;AAAA,EACjB;AAGA,QAAM,SAAS,oBAAoB,IAAI;AACvC,MAAI,cAAc;AAChB,UAAM,QACJ,aAAa,WAAW,SAAS,KAAK,aAAa,WAAW,UAAU;AAC1E,WAAO,SAAS;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,QACF,6BAA6B,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,KAC1D;AAAA,MACJ,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,UAAU,IAAI;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,UAAM,eAAe,gBAAgB,WAAW;AAChD,UAAM,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,YAAQ,OAAO;AACf,UAAM,iBAAiB,WAAW;AAElC,YAAQ,OAAO;AACf,UAAM,kBAAkB,WAAW;AAEnC,YAAQ,OAAO;AACf,UAAM,YAAY,aAAa,MAAM;AAErC,YAAQ,QAAQ,OAAO,QAAQ,uBAAuB,CAAC;AAAA,EACzD,SAAS,KAAK;AACZ,YAAQ,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAC3D,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU;AAAA,IACd,GAAG,MAAM,OAAO,IAAI,OAAO,MAAM,UAAU,CAAC;AAAA,IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,0BAA0B,CAAC;AAAA,IAC7D,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,oBAAoB,CAAC;AAAA,IACvD,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,qCAAqC,CAAC;AAAA,IACxE,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,iCAAiC,CAAC;AAAA,IACpE,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,iCAAiC,CAAC;AAAA,IACpE,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,mCAAmC,CAAC;AAAA,IACtE,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,gCAAgC,CAAC;AAAA,IACnE;AAAA,IACA,GAAG,MAAM,IAAI,UAAU,OAAO,QAAQ,IAAI,CAAC;AAAA,EAC7C;AAEA,MAAI,cAAc;AAChB,YAAQ,KAAK,GAAG,MAAM,IAAI,YAAY,OAAO,UAAU,YAAY,CAAC,EAAE;AAAA,EACxE;AAEA,UAAQ,IAAI,UAAU,QAAQ,KAAK,IAAI,GAAG,kBAAkB,SAAS,CAAC;AAEtE,EAAE;AAAA,IACA,OAAO,OAAO,QAAQ,mBAAmB,CAAC,IAAI,OAAO,MAAM,aAAa,CAAC;AAAA,EAC3E;AACF;;;AGlJA,YAAYE,QAAO;AACnB,OAAOC,UAAS;AAChB,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,gBAAAC;AAAA,EACA;AAAA,OACK;AAIP,SAAS,QAAQC,OAAsB;AACrC,SAAOA,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,eAAsB,eACpB,MACA,SACe;AACf,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAGzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MACL,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAE,SAAM,UAAU,MAAM,qBAAqB,CAAC;AAG9C,MAAI,WAAW;AACf,MAAI,CAAC,UAAU;AACb,UAAM,QAAQ,MAAQ,QAAK;AAAA,MACzB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,CAAC,QAAQ;AACjB,YAAI,CAAC,IAAK,QAAO;AACjB,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,QAAM,YAAS,KAAK,GAAG;AACrB,MAAE,UAAO,oBAAoB;AAC7B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,eAAW;AAAA,EACb;AAGA,QAAM,gBAAgB,QAAQ,QAAQ,EAAE,MAAM,GAAG,EAAE;AACnD,QAAM,YAAY,MAAQ,QAAK;AAAA,IAC7B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU,CAAC,QAAQ;AACjB,UAAI,CAAC,IAAK,QAAO;AACjB,UAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,eAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAM,YAAS,SAAS,GAAG;AACzB,IAAE,UAAO,oBAAoB;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAc,aAAwB;AAG5C,QAAM,kBAAkB,eAAe,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cA8BpC,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA;AAIhD,QAAM,UAAUC,KAAI;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,aAAa,YAAY,eAAe;AAC1E,YAAQ,QAAQ,OAAO,QAAQ,mBAAmB,UAAU,EAAE,CAAC;AAE/D,UAAM,QAAQ;AAAA,MACZ,qBAAqB,UAAU;AAAA,MAC/B,qBAAqB,UAAU;AAAA,MAC/B,qBAAqB,UAAU;AAAA,MAC/B,qBAAqB,UAAU;AAAA,MAC/B,qBAAqB,UAAU;AAAA,IACjC;AAEA,UAAM,UAAU;AAAA,MACd,GAAG,MAAM,OAAO,IAAI,OAAO,MAAM,iBAAiB,CAAC,IAAI,OAAO,QAAQ,UAAU,CAAC;AAAA,MACjF;AAAA,MACA,GAAG,OAAO,MAAM,QAAQ,CAAC;AAAA,MACzB,GAAG,MAAM,IAAI,CAAC,MAAM,KAAK,MAAM,MAAM,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE;AAAA,MAC1D;AAAA,MACA,GAAG,OAAO,MAAM,aAAa,CAAC;AAAA,MAC9B,gBAAgB,OAAO,QAAQ,aAAa,CAAC;AAAA,MAC7C,+BAA+B,OAAO,QAAQ,uBAAuB,CAAC;AAAA,MACtE,yBAAyB,OAAO,QAAQ,oBAAoB,CAAC;AAAA,MAC7D,6BAA6B,OAAO,QAAQ,WAAW,CAAC;AAAA,MACxD,4BAA4B,OAAO,QAAQ,UAAU,CAAC;AAAA,IACxD;AAEA,YAAQ,IAAI,UAAU,QAAQ,KAAK,IAAI,GAAG,YAAY,SAAS,CAAC;AAAA,EAClE,SAAS,KAAK;AACZ,YAAQ,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACpD,QAAI,eAAe,OAAO;AACxB,cAAQ,MAAM,OAAO,MAAM,IAAI,OAAO,CAAC;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAE;AAAA,IACA,OAAO,OAAO,QAAQ,mBAAmB,CAAC,IAAI,OAAO,MAAM,UAAU,CAAC;AAAA,EACxE;AACF;;;AC7JA,SAAS,WAAAC,gBAAe;AACxB,OAAO,WAAW;AAClB;AAAA,EACE,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,eAAsB,cAAc,SAA2C;AAC7E,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAGzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MACL,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,aAAa,CAAC;AAE1B,QAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,QAAM,UAAU,MAAM,kBAAkB,WAAW;AACnD,QAAM,eAAe,MAAM,iBAAiB,WAAW;AAGvD,QAAM,YAAY;AAAA,IAChB,GAAG,OAAO,QAAQ,OAAO,QAAQ,aAAa,CAAC,CAAC;AAAA,IAChD,GAAG,OAAO,QAAQ,OAAO,QAAQ,eAAe,CAAC,CAAC;AAAA,IAClD,GAAG,OAAO,UAAU,OAAO,QAAQ,iBAAiB,CAAC,CAAC;AAAA,IACtD,GAAG,OAAO,MAAM,OAAO,CAAC,IAAI,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EACxD,EAAE,KAAK,OAAO,MAAM,YAAY,CAAC;AAEjC,UAAQ,IAAI,UAAU,WAAW,oBAAoB,SAAS,CAAC;AAG/D,MAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,UAAM,QAAQ,IAAI,MAAM;AAAA,MACtB,MAAM;AAAA,QACJ,OAAO,KAAK,QAAQ;AAAA,QACpB,OAAO,KAAK,QAAQ;AAAA,QACpB,OAAO,KAAK,OAAO;AAAA,QACnB,OAAO,KAAK,UAAU;AAAA,MACxB,EAAE,IAAI,MAAM;AAAA,MACZ,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,MACpC,WAAW,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,IAC5B,CAAC;AAED,eAAW,UAAU,QAAQ,SAAS;AACpC,YAAM,KAAK,OAAO;AAClB,YAAM,UACJ,GAAG,QAAQ,IACP,GAAG,GAAG,MAAM,IAAI,GAAG,KAAK,KACxB,OAAO,MAAM,MAAM;AACzB,YAAM,WACJ,GAAG,QAAQ,IAAI,YAAY,GAAG,iBAAiB,IAAI,OAAO,MAAM,IAAI;AAEtE,YAAM,KAAK;AAAA,QACT,OAAO,MAAM,OAAO,IAAI;AAAA,QACxB,YAAY,OAAO,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI,cAAc,kBAAkB,MAAM,SAAS,CAAC,CAAC;AAAA,EAC/D,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,KAAK,OAAO,MAAM,oBAAoB,CAAC,QAAQ,OAAO,QAAQ,mBAAmB,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,WAAW,IAAI,MAAM;AAAA,MACzB,MAAM;AAAA,QACJ,OAAO,KAAK,YAAY;AAAA,QACxB,OAAO,KAAK,QAAQ;AAAA,QACpB,OAAO,KAAK,UAAU;AAAA,MACxB,EAAE,IAAI,MAAM;AAAA,MACZ,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,MACpC,WAAW,CAAC,IAAI,IAAI,EAAE;AAAA,IACxB,CAAC;AAED,eAAW,OAAO,aAAa,MAAM,GAAG,EAAE,GAAG;AAC3C,eAAS,KAAK;AAAA,QACZ,OAAO,MAAM,IAAI,IAAI;AAAA,QACrB,OAAO,MAAM,IAAI,YAAY;AAAA,QAC7B,OAAO,IAAI,IAAI,WAAW,MAAM,GAAG,EAAE,CAAC;AAAA,MACxC,CAAC;AAAA,IACH;AAEA,UAAM,WACJ,aAAa,SAAS,KAClB;AAAA,IAAO,OAAO,MAAM,UAAU,aAAa,SAAS,EAAE,YAAY,CAAC,IAAI,OAAO,QAAQ,wBAAwB,CAAC,IAAI,OAAO,MAAM,aAAa,CAAC,KAC9I;AAEN,YAAQ;AAAA,MACN,cAAc,gBAAgB,SAAS,SAAS,IAAI,QAAQ;AAAA,IAC9D;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,kBAAkB,OAAO,SAAS,UAAU;AAC9D,UAAM,aAAa,OAAO,SACtB,KAAK,MAAM,IAAI,YAAY,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AAAA,IAC5D,MAAM,IAAI,UAAU,OAAO,MAAM,OAAO,OAAO,IAAI,CAAC;AAAA,IACpD,MAAM,IAAI,eAAe,OAAO,OAAO,WAAW,OAAO,QAAQ,SAAS,IAAI,OAAO,MAAM,UAAU,CAAC,KAC3G,KAAK,OAAO,QAAQ,kCAAkC,CAAC;AAE3D,YAAQ,IAAI,cAAc,gBAAgB,UAAU,CAAC;AAAA,EACvD;AACF;;;AClIA,YAAYC,QAAO;AACnB,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAIP,eAAsB,eACpB,YACA,SACe;AACf,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAE,SAAM,UAAU,MAAM,qBAAqB,CAAC;AAE9C,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,WAAW,aAAa,UAAU;AAAA,EACnD,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK,WAAW,OAAO,QAAQ,UAAU,CAAC;AAAA,MAAoB,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACvG;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAW,MAAM,eAAe,aAAa,YAAY,aAAa;AAC5E,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,eAAe,aAAa,YAAY,uBAAuB;AAAA,EACtF,QAAQ;AACN,mBAAe;AAAA,EACjB;AAEA,MAAI;AACJ,MAAI;AACF,gBAAY,MAAM,eAAe,aAAa,YAAY,oBAAoB;AAAA,EAChF,QAAQ;AACN,gBAAY;AAAA,EACd;AAEA,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,QACE,GAAG,MAAM,IAAI,YAAY,OAAO,QAAQ,UAAU,CAAC;AAAA,QACnD,GAAG,MAAM,IAAI,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,QACrD,GAAG,MAAM,IAAI,aAAa,OAAO,MAAM,OAAO,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MACvE,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,cAAc,YAAY,OAAO,MAAM,SAAS,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3E,UAAQ,IAAI,cAAc,gBAAgB,OAAO,MAAM,aAAa,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AACnF,UAAQ,IAAI,cAAc,aAAa,OAAO,MAAM,UAAU,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAG7E,QAAM,SAAS,MAAQ,SAAM;AAAA,IAC3B,kBAAkB,MACd,WAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACH,qBAAqB,MACjB,WAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACH,kBAAkB,MACd,WAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,IACH,gBAAgB,MACZ,WAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAAA,EACL,CAAC;AAED,MAAM,YAAS,MAAM,GAAG;AACtB,IAAE,UAAO,oBAAoB;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,OAAO,oBAAoB,OAAO,uBAAuB,OAAO,oBAAoB,OAAO;AAE5G,MAAI,UAAU;AACZ,UAAM,mBAAmB,aAAa,YAAY,UAAU;AAC5D,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,OAAO,WAAW,OAAO,QAAQ,UAAU,CAAC;AAAA,oBAC9B,OAAO,OAAO,UAAU,CAAC;AAAA;AAAA,gBAC7B,OAAO,QAAQ,WAAW,CAAC,QAAQ,OAAO,QAAQ,UAAU,CAAC;AAAA,QAChF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,aAAa,CAAC;AACpB,QAAI,CAAC,OAAO,iBAAkB,YAAW,KAAK,KAAK,MAAM,OAAO,4BAA4B;AAC5F,QAAI,CAAC,OAAO,oBAAqB,YAAW,KAAK,KAAK,MAAM,OAAO,kCAAkC;AACrG,QAAI,CAAC,OAAO,iBAAkB,YAAW,KAAK,KAAK,MAAM,OAAO,0BAA0B;AAE1F,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,OAAO,WAAW,OAAO,QAAQ,UAAU,CAAC;AAAA;AAAA,IACnD,WAAW,KAAK,IAAI,IACpB;AAAA;AAAA,EAAO,OAAO,MAAM,6BAA6B,CAAC,IAAI,OAAO,QAAQ,uBAAuB,UAAU,CAAC,IAAI,OAAO,MAAM,QAAQ,CAAC;AAAA,QACnI;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAE,SAAM,OAAO,MAAM,4DAA4D,CAAC;AACpF;;;ACxIA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB;AAAA,EACE,gBAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAI/B,eAAsB,YAAY,SAIhB;AAChB,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,UAAU,MAAM,YAAY,aAAa,SAAS,YAAY,KAAK;AAGvE,MAAI,SAAS,QAAQ;AACnB,cAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAAA,EAC7D;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,MAAM,SAAS,SACjB,2BAA2B,QAAQ,MAAM,OACzC;AACJ,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,IAAI,IAAI,GAAG;AAAA,MAAS,OAAO,QAAQ,mBAAmB,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,QAAQ,IAAIC,OAAM;AAAA,IACtB,MAAM;AAAA,MACJ,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO,KAAK,QAAQ;AAAA,MACpB,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO,KAAK,UAAU;AAAA,MACtB,OAAO,KAAK,SAAS;AAAA,IACvB,EAAE,IAAI,MAAM;AAAA,IACZ,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,IACpC,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EAChC,CAAC;AAED,aAAW,UAAU,SAAS;AAC5B,UAAM,KAAK,eAAe,OAAO,KAAK;AACtC,UAAM,UAAU,GAAG,QAAQ,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,MAAM,IAAI;AAC7E,UAAM,WAAW,GAAG,QAAQ,IAAI,YAAY,GAAG,iBAAiB,IAAI,OAAO,MAAM,IAAI;AACrF,UAAM,UAAU,OAAO,IAAI,OAAO,UAAU,MAAM,GAAG,EAAE,CAAC;AAExD,UAAM,KAAK;AAAA,MACT,OAAO,MAAM,OAAO,IAAI;AAAA,MACxB,YAAY,OAAO,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,SAAS,WAAW,qCAAqC;AACvE,UAAQ,IAAI,cAAc,OAAO,MAAM,SAAS,CAAC,CAAC;AAClD,UAAQ;AAAA,IACN,OAAO,MAAM,KAAK,QAAQ,MAAM,UAAU,QAAQ,WAAW,IAAI,KAAK,GAAG,QAAQ;AAAA,EACnF;AACF;;;AC/EA,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,gBAAAC;AAAA,EAEA,kBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,OAEK;AAUP,eAAe,aACb,aACA,YACwB;AACxB,QAAM,SAAwB,CAAC;AAC/B,QAAM,aAAaC,eAAc,aAAa,UAAU;AAGxD,MAAI;AACF,UAAM,WAAW,MAAMC,gBAAe,aAAa,YAAY,aAAa;AAC5E,UAAM,aAAa,SAAS,QAAQ,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS;AACxE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aACL,4BACA;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,OAAO,MAAMA,gBAAe,aAAa,YAAY,uBAAuB;AAClF,UAAM,aAAa,KAAK,QAAQ,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS;AACpE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aACL,gCACA;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,YAAY,MAAMA,gBAAe,aAAa,YAAY,oBAAoB;AACpF,UAAM,aAAa,UAAU,QAAQ,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS;AACzE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aACL,6BACA;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,SAAS,MAAMA,gBAAe,aAAa,YAAY,WAAW;AACxE,UAAM,aAAa,OAAO,QAAQ,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS;AACtE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aACL,0BACA;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,QAAQ,MAAMA,gBAAe,aAAa,YAAY,UAAU;AACtE,UAAM,aAAa,MAAM,QAAQ,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS;AACrE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aACL,yBACA;AAAA,IACN,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,cACpB,YACA,SACe;AACf,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,kBAA4B,CAAC;AACnC,MAAI,YAAY;AACd,oBAAgB,KAAK,UAAU;AAAA,EACjC,OAAO;AACL,UAAM,UAAU,MAAMC,aAAY,aAAa,KAAK;AACpD,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ;AAAA,QACN;AAAA,UACE,GAAG,MAAM,IAAI;AAAA,MAAsC,OAAO,QAAQ,mBAAmB,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,oBAAgB,KAAK,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,EACpD;AAEA,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,aAAW,QAAQ,iBAAiB;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,aAAa,IAAI;AACnD,YAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC9C,qBAAe;AACf,qBAAe,OAAO;AAEtB,YAAM,QAAQ,OAAO;AAAA,QACnB,CAAC,MACC,KAAK,EAAE,SAAS,MAAM,UAAU,MAAM,KAAK,IAAI,OAAO,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,OAAO,MAAM,EAAE,OAAO,IAAI,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,MAC1I;AAEA,YAAM,YAAY,WAAW,OAAO;AACpC,YAAM,cAAc,YAAY,YAAY;AAE5C,cAAQ;AAAA,QACN;AAAA,UACE,GAAG,YAAY,MAAM,UAAU,MAAM,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM;AAAA;AAAA,EAAqB,MAAM,KAAK,IAAI,CAAC;AAAA,UAC5G;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AACN,cAAQ;AAAA,QACN;AAAA,UACE,GAAG,MAAM,KAAK,WAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,UAC7C;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,YAAY,gBAAgB;AAClC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,YAAY,MAAM,UAAU,MAAM,OAAO,IAAI,WAAW,IAAI,WAAW,+BAA+B,gBAAgB,MAAM;AAAA,QAC/H;AAAA,QACA,YAAY,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;AC9MA,YAAYC,QAAO;AACnB,OAAOC,UAAS;AAChB,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,OACK;AAIP,eAAsB,eACpB,YACA,SACe;AACf,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAE,SAAM,UAAU,MAAM,qBAAqB,CAAC;AAE9C,MAAI;AACJ,MAAI;AACF,aAAS,MAAMC,YAAW,aAAa,UAAU;AAAA,EACnD,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK,WAAW,OAAO,QAAQ,UAAU,CAAC;AAAA,QACnD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAaC,eAAc,aAAa,UAAU;AACxD,QAAM,kBAAkB,MAAM,YAAY,UAAU;AAEpD,MAAI,CAAC,mBAAmB,CAAC,SAAS,aAAa;AAE7C,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,UACE,GAAG,MAAM,IAAI,yBAAyB,OAAO,QAAQ,YAAY,CAAC;AAAA,UAClE;AAAA,UACA;AAAA,UACA,KAAK,MAAM,MAAM;AAAA,UACjB,KAAK,MAAM,MAAM;AAAA,UACjB,KAAK,MAAM,MAAM;AAAA,UACjB;AAAA,UACA,GAAG,OAAO,MAAM,8DAA8D,CAAC;AAAA,UAC/E,GAAG,OAAO,MAAM,QAAQ,CAAC,IAAI,OAAO,QAAQ,qBAAqB,UAAU,aAAa,CAAC,IAAI,OAAO,MAAM,wBAAwB,CAAC;AAAA,QACrI,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAQ,WAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAED,QAAM,YAAS,OAAO,KAAK,CAAC,SAAS;AACnC,MAAE,UAAO,0DAA0D;AACnE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,qBAAqB,cAAc,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cA2B1C,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA;AAG9C,UAAM,aAAa,YAAY,kBAAkB;AACjD,YAAQ,IAAI,KAAK,MAAM,OAAO,iCAAiC;AAAA,EACjE;AAGA,QAAM,iBAAiB,MAAQ,WAAQ;AAAA,IACrC,SAAS,YAAY,UAAU;AAAA,IAC/B,cAAc;AAAA,EAChB,CAAC;AAED,MAAM,YAAS,cAAc,KAAK,CAAC,gBAAgB;AACjD,IAAE,UAAO,oBAAoB;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,UAAM,cAAc,MAAM,cAAc,aAAa,UAAU;AAC/D,YAAQ,QAAQ,OAAO,QAAQ,iBAAiB,CAAC;AAEjD,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,UACE,GAAG,MAAM,OAAO,IAAI,OAAO,MAAM,WAAW,CAAC,IAAI,OAAO,QAAQ,UAAU,CAAC;AAAA,UAC3E,GAAG,MAAM,KAAK,IAAI,OAAO,MAAM,WAAW,CAAC;AAAA,UAC3C;AAAA,UACA,GAAG,OAAO,MAAM,aAAa,CAAC;AAAA,UAC9B,eAAe,OAAO,QAAQ,YAAY,CAAC;AAAA,UAC3C,YAAY,OAAO,QAAQ,wBAAwB,CAAC;AAAA,UACpD,eAAe,OAAO,QAAQ,qCAAqC,CAAC;AAAA,QACtE,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC9C,QAAI,eAAe,OAAO;AACxB,cAAQ,MAAM,OAAO,MAAM,IAAI,OAAO,CAAC;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAE,SAAM,OAAO,MAAM,wCAAwC,CAAC;AAChE;;;AChKA,OAAOC,UAAS;AAChB,SAAS,WAAAC,gBAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,YAAY,iBAAiB;AACtC;AAAA,EACE,gBAAAC;AAAA,EACA,cAAAC;AAAA,OACK;AAIP,eAAsB,YAAY,SAGhB;AAChB,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,cAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAMC,YAAW,WAAW;AAE3C,MAAI,OAAO,SAAS,SAAS;AAC3B,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,IAAI,iBAAiB,OAAO,QAAQ,OAAO,CAAC;AAAA,MAC5C,OAAO,QAAQ,oCAAoC,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,QAAQ,QAAQ;AAC1B,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MACL,OAAO,QAAQ,8CAA8C,CAAC;AAAA,QACvE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,OAAO,OAAO;AAC7B,QAAM,WAAW,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,KAAK,OAAO,WAAW,MAAM;AAC1G,QAAM,aAAa,OAAO,OAAO;AAEjC,QAAM,UAAUC,KAAI;AAAA,IAClB,MAAM,gBAAgB,MAAM;AAAA,IAC5B,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,QAAI,UAAU;AAEZ,UAAI,WAAW,UAAU,GAAG;AAC1B,gBAAQ,OAAO;AACf,iBAAS,sBAAsB,EAAE,KAAK,YAAY,OAAO,OAAO,CAAC;AACjE,gBAAQ,QAAQ,OAAO,QAAQ,iCAAiC,CAAC;AAAA,MACnE,OAAO;AACL,gBAAQ,OAAO;AACf,kBAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,iBAAS,aAAa,MAAM,IAAI,UAAU,IAAI,EAAE,OAAO,OAAO,CAAC;AAC/D,gBAAQ,QAAQ,OAAO,QAAQ,qBAAqB,CAAC;AAAA,MACvD;AAAA,IACF,OAAO;AAEL,UAAI,WAAW,MAAM,GAAG;AACtB,gBAAQ;AAAA,UACN,OAAO,QAAQ,wBAAwB,OAAO,MAAM,MAAM,CAAC,EAAE;AAAA,QAC/D;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN,OAAO,MAAM,+BAA+B,MAAM,EAAE;AAAA,QACtD;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,UACE,GAAG,MAAM,OAAO;AAAA,UAChB,GAAG,MAAM,IAAI,YAAY,OAAO,UAAU,MAAM,CAAC;AAAA,UACjD,GAAG,MAAM,IAAI,UAAU,OAAO,MAAM,UAAU,CAAC;AAAA,QACjD,EAAE,KAAK,IAAI;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,OAAO,MAAM,aAAa,CAAC;AACxC,QAAI,eAAe,OAAO;AACxB,cAAQ,MAAM,OAAO,MAAM,IAAI,OAAO,CAAC;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AC1GA,SAAS,WAAAC,UAAS,YAAY;AAC9B,SAAS,SAAAC,cAAa;AACtB;AAAA,EACE,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,eAAAC;AAAA,OAEK;AAWP,eAAsB,cAAc,SAGlB;AAChB,QAAM,cAAcC,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AACzD,QAAM,eAAeC,iBAAgB,WAAW;AAChD,QAAM,SAAwB,CAAC;AAE/B,UAAQ;AAAA,IACN;AAAA,MACE,GAAG,MAAM,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,MAAMC,cAAa,WAAW;AAChD,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,YACL,yBACA;AAAA,EACN,CAAC;AAED,MAAI,CAAC,WAAW;AACd,iBAAa,MAAM;AACnB;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACF,aAAS,MAAMC,YAAW,WAAW;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,mBAAmB,OAAO,OAAO,WAAW,OAAO,IAAI;AAAA,IAClE,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAClF,CAAC;AACD,iBAAa,MAAM;AACnB;AAAA,EACF;AAGA,QAAM,OAAO;AAAA,IACX,EAAE,MAAM,KAAK,cAAc,SAAS,GAAG,MAAM,WAAW;AAAA,IACxD,EAAE,MAAM,KAAK,cAAc,WAAW,SAAS,GAAG,MAAM,mBAAmB;AAAA,IAC3E,EAAE,MAAM,KAAK,cAAc,WAAW,GAAG,MAAM,aAAa;AAAA,IAC5D,EAAE,MAAM,KAAK,cAAc,aAAa,cAAc,GAAG,MAAM,0BAA0B;AAAA,IACzF,EAAE,MAAM,KAAK,cAAc,aAAa,WAAW,GAAG,MAAM,uBAAuB;AAAA,EACrF;AAEA,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,MAAMC,YAAW,IAAI,IAAI;AACxC,WAAO,KAAK;AAAA,MACV,MAAM,QAAQ,IAAI,IAAI;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS,SAAS,GAAG,IAAI,IAAI,YAAY,GAAG,IAAI,IAAI;AAAA,MACpD,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,UAAU,SAAS,KAAK;AAC3B,YAAMC,OAAM,IAAI,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,IACrB,EAAE,MAAM,KAAK,cAAc,aAAa,iBAAiB,GAAG,MAAM,kBAAkB;AAAA,IACpF,EAAE,MAAM,KAAK,cAAc,aAAa,aAAa,GAAG,MAAM,cAAc;AAAA,IAC5E,EAAE,MAAM,KAAK,cAAc,aAAa,aAAa,GAAG,MAAM,cAAc;AAAA,EAC9E;AAEA,aAAW,QAAQ,gBAAgB;AACjC,UAAM,SAAS,MAAMD,YAAW,KAAK,IAAI;AACzC,WAAO,KAAK;AAAA,MACV,MAAM,OAAO,KAAK,IAAI;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS,SAAS,GAAG,KAAK,IAAI,aAAa,GAAG,KAAK,IAAI;AAAA,IACzD,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,UAAU,MAAME,aAAY,aAAa,KAAK;AACpD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,QAAQ,MAAM,iBAAiB,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,IAC5E,CAAC;AAGD,eAAW,UAAU,SAAS;AAC5B,YAAM,cAAc,MAAMF,YAAW,KAAK,OAAO,MAAM,aAAa,CAAC;AACrE,UAAI,CAAC,aAAa;AAChB,eAAO,KAAK;AAAA,UACV,MAAM,WAAW,OAAO,IAAI;AAAA,UAC5B,QAAQ;AAAA,UACR,SAAS,GAAG,OAAO,IAAI;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,SAAS,WAAW,OAAO,QAAQ;AAC5C,UAAM,eAAe,MAAMA,YAAW,OAAO,OAAO,IAAI;AACxD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,eACL,6BAA6B,OAAO,OAAO,IAAI,KAC/C,6BAA6B,OAAO,OAAO,IAAI;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,eAAa,QAAQ,SAAS,GAAG;AACnC;AAEA,SAAS,aAAa,QAAuB,QAAwB;AACnE,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC9C,QAAM,QAAQ,OAAO;AACrB,QAAM,YAAY,WAAW;AAE7B,QAAM,QAAQ,OAAO;AAAA,IACnB,CAAC,MACC,KAAK,EAAE,SAAS,MAAM,UAAU,MAAM,KAAK,IAAI,OAAO,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,OAAO,MAAM,EAAE,OAAO,IAAI,OAAO,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,SAAS,OAAO,QAAQ,UAAU,IAAI,EAAE;AAAA,EAC/M;AAEA,QAAM,cAAc,YAAY,YAAY,SAAS,QAAQ,IAAI,YAAY;AAE7E,UAAQ;AAAA,IACN;AAAA,MACE,GAAG,YAAY,MAAM,UAAU,MAAM,OAAO,IAAI,MAAM,IAAI,KAAK;AAAA;AAAA,EAAqB,MAAM,KAAK,IAAI,CAAC;AAAA,MACpG;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE;AAC7D,QAAI,UAAU,GAAG;AACf,cAAQ;AAAA,QACN,OAAO,MAAM,SAAS,OAAO,QAAQ,wBAAwB,CAAC,gBAAgB,OAAO,SAAS,YAAY,IAAI,KAAK,GAAG,GAAG;AAAA,MAC3H;AAAA,IACF;AAAA,EACF;AACF;;;ACpLA,SAAS,WAAAG,iBAAe;AACxB,OAAOC,YAAW;AAClB;AAAA,EACE,gBAAAC;AAAA,EACA,oBAAAC;AAAA,OACK;AAKP,eAAsB,oBAAoB,SAGxB;AAChB,QAAM,cAAcC,UAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,eAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,MAAMC,kBAAiB,WAAW;AAEvD,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,IAAI;AAAA;AAAA;AAAA,kCAEwB,OAAO,QAAQ,4BAA4B,CAAC;AAAA;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAI,SAAS,MAAM;AACjB,YAAQ,IAAI,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AACjD;AAAA,EACF;AAGA,QAAM,QAAQ,IAAIC,OAAM;AAAA,IACtB,MAAM;AAAA,MACJ,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO,KAAK,aAAa;AAAA,MACzB,OAAO,KAAK,QAAQ;AAAA,MACpB,OAAO,KAAK,UAAU;AAAA,MACtB,OAAO,KAAK,MAAM;AAAA,IACpB,EAAE,IAAI,MAAM;AAAA,IACZ,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,IACpC,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,IAC9B,UAAU;AAAA,EACZ,CAAC;AAED,aAAW,OAAO,cAAc;AAC9B,UAAM,KAAK;AAAA,MACT,OAAO,MAAM,IAAI,IAAI;AAAA,MACrB,OAAO,MAAM,IAAI,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,MACzC,OAAO,UAAU,IAAI,YAAY;AAAA,MACjC,OAAO,IAAI,IAAI,WAAW,MAAM,GAAG,EAAE,CAAC;AAAA,MACtC,IAAI,MAAM,SAAS,OAAO,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,OAAO,MAAM,IAAI;AAAA,IAC3E,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,cAAc,gBAAgB,MAAM,SAAS,CAAC,CAAC;AAC3D,UAAQ;AAAA,IACN,OAAO;AAAA,MACL,KAAK,aAAa,MAAM,aAAa,aAAa,WAAW,IAAI,MAAM,KAAK;AAAA,IAC9E;AAAA,EACF;AACF;;;AC7EA,SAAS,WAAAC,iBAAe;AACxB;AAAA,EACE,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,eAAsB,cACpB,KACA,OACA,SACe;AACf,QAAM,cAAcC,UAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,eAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,SAAS,QAAS,CAAC,OAAO,CAAC,OAAQ;AACrC,UAAM,SAAS,MAAMC,YAAW,WAAW;AAC3C,UAAM,QAAQ,aAAa,QAAQ,EAAE;AAErC,YAAQ;AAAA,MACN,cAAc,iBAAiB,MAAM,KAAK,IAAI,CAAC;AAAA,IACjD;AACA;AAAA,EACF;AAGA,MAAI,OAAO,CAAC,OAAO;AACjB,UAAM,MAAM,MAAM,eAAe,aAAa,GAAG;AACjD,QAAI,QAAQ,QAAW;AACrB,cAAQ;AAAA,QACN,KAAK,MAAM,KAAK,QAAQ,OAAO,QAAQ,GAAG,CAAC;AAAA,MAC7C;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,YAAM,QAAQ,aAAa,KAAgC,EAAE;AAC7D,cAAQ,IAAI,cAAc,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,IAAI,KAAK,OAAO,QAAQ,GAAG,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE;AAAA,IAC1F;AACA;AAAA,EACF;AAGA,MAAI,OAAO,OAAO;AAEhB,QAAI,SAAkB;AACtB,QAAI,UAAU,OAAQ,UAAS;AAAA,aACtB,UAAU,QAAS,UAAS;AAAA,aAC5B,QAAQ,KAAK,KAAK,EAAG,UAAS,SAAS,OAAO,EAAE;AAAA,SACpD;AACH,UAAI;AACF,iBAAS,KAAK,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,eAAe,aAAa,KAAK,MAAM;AAC7C,YAAQ;AAAA,MACN,KAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,GAAG,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,IACpG;AAAA,EACF;AACF;AAEA,SAAS,aACP,KACA,QACU;AACV,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAM,UAAU,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK;AAC5C,QAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG;AAC5D,YAAM,KAAK,KAAK,OAAO,MAAM,UAAU,GAAG,CAAC,EAAE;AAC7C,YAAM,KAAK,GAAG,aAAa,GAA8B,OAAO,CAAC;AAAA,IACnE,OAAO;AACL,YAAM;AAAA,QACJ,KAAK,OAAO,QAAQ,OAAO,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AChGA,SAAS,WAAAC,iBAAyB;AAElC,OAAOC,YAAW;AAClB;AAAA,EACE,gBAAAC;AAAA,EAEA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AAAA,OAGK;AAUP,eAAsB,YACpB,YACA,SACe;AACf,QAAM,cAAcC,UAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEzD,MAAI,CAAE,MAAMC,eAAa,WAAW,GAAI;AACtC,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,KAAK;AAAA,MAAuC,OAAO,QAAQ,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAA0B,CAAC;AAEjC,MAAI,YAAY;AAEd,QAAI;AACF,YAAM,SAAS,MAAMC,YAAW,aAAa,UAAU;AACvD,YAAM,mBAAmB,aAAa,YAAY,UAAU;AAAA,IAC9D,QAAQ;AACN,cAAQ;AAAA,QACN;AAAA,UACE,GAAG,MAAM,KAAK,WAAW,OAAO,QAAQ,UAAU,CAAC;AAAA,UACnD;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AAEL,UAAM,UAAU,MAAMC,aAAY,aAAa,KAAK;AAEpD,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ;AAAA,QACN;AAAA,UACE,GAAG,MAAM,IAAI;AAAA,MAAuC,OAAO,QAAQ,mBAAmB,CAAC;AAAA,UACvF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,eAAW,UAAU,SAAS;AAC5B,YAAM,mBAAmB,aAAa,OAAO,MAAM,UAAU;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ;AAAA,MACN;AAAA,QACE,GAAG,MAAM,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAGA,QAAM,QAAQ,IAAIC,OAAM;AAAA,IACtB,MAAM;AAAA,MACJ,OAAO,KAAK,UAAU;AAAA,MACtB,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO,KAAK,SAAS;AAAA,IACvB,EAAE,IAAI,MAAM;AAAA,IACZ,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,IACpC,WAAW,CAAC,IAAI,IAAI,EAAE;AAAA,IACtB,UAAU;AAAA,EACZ,CAAC;AAED,aAAW,QAAQ,YAAY;AAC7B,UAAM,WACJ,KAAK,aAAa,aACd,OAAO,QACP,KAAK,aAAa,YAChB,OAAO,UACP,OAAO;AAEf,UAAM,KAAK;AAAA,MACT,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO,MAAM,KAAK,IAAI;AAAA,MACtB,OAAO,MAAM,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE;AACrE,QAAM,WAAW,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE;AACpE,QAAM,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE;AAE7D,QAAM,eAAe,CAAC;AACtB,MAAI,WAAW,EAAG,cAAa,KAAK,OAAO,MAAM,GAAG,QAAQ,WAAW,CAAC;AACxE,MAAI,WAAW,EAAG,cAAa,KAAK,OAAO,QAAQ,GAAG,QAAQ,WAAW,CAAC;AAC1E,MAAI,OAAO,EAAG,cAAa,KAAK,OAAO,MAAM,GAAG,IAAI,OAAO,CAAC;AAE5D,UAAQ;AAAA,IACN,cAAc,gBAAgB,MAAM,SAAS,CAAC;AAAA,EAChD;AACA,UAAQ;AAAA,IACN;AAAA,MACE,GAAG,WAAW,IAAI,MAAM,QAAQ,MAAM,OAAO,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA,MACxE;AAAA,MACA,WAAW,IAAI,YAAY;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,eAAe,mBACb,aACA,YACA,OACe;AAEf,MAAI;AACF,UAAM,SAAS,MAAMF,YAAW,aAAa,UAAU;AACvD,UAAM,YAAY,IAAI,KAAK,OAAO,SAAS;AAC3C,UAAM,YAAY,KAAK;AAAA,OACpB,KAAK,IAAI,IAAI,UAAU,QAAQ,MAAM,MAAO,KAAK,KAAK;AAAA,IACzD;AAEA,QAAI,YAAY,MAAM,OAAO,WAAW,YAAY;AAClD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,IAAI,UAAU,cAAc,SAAS;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,KAAK,OAAO,WAAW,eAAe;AACpD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,IAAI,UAAU,qBAAqB,SAAS;AAAA,MACvD,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,CAAC,eAAe,yBAAyB,sBAAsB,aAAa,UAAU;AACxG,eAAW,QAAQ,WAAW;AAC5B,UAAI;AACF,cAAM,UAAU,MAAMG,gBAAe,aAAa,YAAY,IAAI;AAClE,cAAM,WAAW,QAAQ,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAC1D,YAAI,SAAS,SAAS,IAAI;AACxB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,UAAU,OAAO,WAAW,gBAAgB,YAAY;AAAA,YACxD,SAAS,IAAI,UAAU,IAAI,IAAI;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AACN,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,IAAI,UAAU,IAAI,IAAI;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QACE,OAAO,WAAW,iBAClB,OAAO,MAAM,SAAS,KACtB,OAAO,MAAM,MAAM,CAAC,MAAM,EAAE,WAAW,SAAS,GAChD;AACA,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,IAAI,UAAU,4BAA4B,OAAO,MAAM,MAAM;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AACN,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,0BAA0B,UAAU;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;;;Ad5LA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,WAAW,EAChB,YAAY,kFAA6E,EACzF,QAAQ,OAAO;AAGlB,QACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,YAAY,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGlD,QACG,QAAQ,gBAAgB,EACxB,YAAY,8BAA8B,EAC1C,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,MAAM,SAAS,eAAe,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGjE,QACG,QAAQ,kBAAkB,EAC1B,YAAY,6CAA6C,EACzD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,QAAQ,SAAS,eAAe,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGrE,QACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,cAAc,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGpD,QACG,QAAQ,MAAM,EACd,YAAY,kBAAkB,EAC9B,OAAO,kBAAkB,0BAA0B,EACnD,OAAO,yBAAyB,kBAAkB,EAClD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,YAAY,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC;AAGhG,QACG,QAAQ,iBAAiB,EACzB,YAAY,sDAAsD,EAClE,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,QAAQ,SAAS,cAAc,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGpE,QACG,QAAQ,kBAAkB,EAC1B,YAAY,qDAAqD,EACjE,OAAO,kBAAkB,iCAAiC,EAC1D,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,QAAQ,SAAS,eAAe,QAAQ,EAAE,aAAa,KAAK,aAAa,KAAK,KAAK,IAAI,CAAC,CAAC;AAGpG,QACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,WAAW,wCAAwC,EAC1D,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,YAAY,EAAE,OAAO,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAGrE,QACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,OAAO,SAAS,gCAAgC,EAChD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,cAAc,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAGnE,QACG,QAAQ,cAAc,EACtB,MAAM,MAAM,EACZ,YAAY,kCAAkC,EAC9C,OAAO,UAAU,gBAAgB,EACjC,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,SAAS,oBAAoB,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC;AAG3E,QACG,QAAQ,sBAAsB,EAC9B,YAAY,iCAAiC,EAC7C,OAAO,UAAU,wBAAwB,EACzC,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,KAAK,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC;AAG7F,QACG,QAAQ,eAAe,EACvB,YAAY,6CAA6C,EACzD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,CAAC,QAAQ,SAAS,YAAY,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAGlE,QAAQ,OAAO,YAAY;AACzB,QAAM,qBAAqB;AAC3B,UAAQ,WAAW;AACrB,CAAC;AAED,QAAQ,MAAM;","names":["chalk","gradient","gradient","chalk","gradient","p","ora","resolve","configExists","text","resolve","configExists","ora","resolve","configExists","resolve","configExists","p","resolve","configExists","resolve","configExists","resolve","Table","configExists","resolve","configExists","Table","resolve","configExists","readChangeFile","listChanges","getChangePath","getChangePath","readChangeFile","resolve","configExists","listChanges","p","ora","resolve","configExists","readChange","getChangePath","resolve","configExists","readChange","getChangePath","ora","ora","resolve","configExists","readConfig","resolve","configExists","readConfig","ora","resolve","mkdir","configExists","readConfig","fileExists","getForgeloreDir","listChanges","resolve","getForgeloreDir","configExists","readConfig","fileExists","mkdir","listChanges","resolve","Table","configExists","listCapabilities","resolve","configExists","listCapabilities","Table","resolve","configExists","readConfig","resolve","configExists","readConfig","resolve","Table","configExists","listChanges","readChange","readChangeFile","resolve","configExists","readChange","listChanges","Table","readChangeFile"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgelore/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Beautiful CLI for spec-driven development — forge knowledge, shape code",
5
5
  "type": "module",
6
6
  "bin": {