guardian-framework 0.1.60 → 0.1.61

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/cli.js CHANGED
@@ -475,6 +475,25 @@ function findTextCursor(s, o, l2, i) {
475
475
  h += t[r].length + 1;
476
476
  return h + e;
477
477
  }
478
+ function updateSettings(n) {
479
+ if (n.aliases !== undefined) {
480
+ const e = n.aliases;
481
+ for (const s in e) {
482
+ if (!Object.hasOwn(e, s))
483
+ continue;
484
+ const i = e[s];
485
+ i === undefined || !settings.actions.has(i) || settings.aliases.has(s) || settings.aliases.set(s, i);
486
+ }
487
+ }
488
+ if (n.messages !== undefined) {
489
+ const e = n.messages;
490
+ e.cancel !== undefined && (settings.messages.cancel = e.cancel), e.error !== undefined && (settings.messages.error = e.error);
491
+ }
492
+ if (n.withGuide !== undefined && (settings.withGuide = n.withGuide !== false), n.date !== undefined) {
493
+ const e = n.date;
494
+ e.monthNames !== undefined && (settings.date.monthNames = [...e.monthNames]), e.messages !== undefined && (e.messages.required !== undefined && (settings.date.messages.required = e.messages.required), e.messages.invalidMonth !== undefined && (settings.date.messages.invalidMonth = e.messages.invalidMonth), e.messages.invalidDay !== undefined && (settings.date.messages.invalidDay = e.messages.invalidDay), e.messages.afterMin !== undefined && (settings.date.messages.afterMin = e.messages.afterMin), e.messages.beforeMax !== undefined && (settings.date.messages.beforeMax = e.messages.beforeMax));
495
+ }
496
+ }
478
497
  function isActionKey(n, e) {
479
498
  if (typeof n == "string")
480
499
  return settings.aliases.get(n) === e;
@@ -768,7 +787,7 @@ function T2(r2, t2, i, s) {
768
787
  max: e && t2.year === e.year && t2.month === e.month ? e.day : c(t2.year, t2.month)
769
788
  };
770
789
  }
771
- var import_sisteransi, a$1, t, settings, R, CANCEL_SYMBOL, getColumns = (e) => ("columns" in e) && typeof e.columns == "number" ? e.columns : 80, getRows = (e) => ("rows" in e) && typeof e.rows == "number" ? e.rows : 20, T$1, r, _, U, u$2, o, h, a, n$1, n2;
790
+ var import_sisteransi, a$1, t, settings, R, CANCEL_SYMBOL, getColumns = (e) => ("columns" in e) && typeof e.columns == "number" ? e.columns : 80, getRows = (e) => ("rows" in e) && typeof e.rows == "number" ? e.rows : 20, T$1, r, _, U, u$2, o, h, a, u$1, n$1, u3, n2;
772
791
  var init_dist3 = __esm(() => {
773
792
  init_main();
774
793
  import_sisteransi = __toESM(require_src(), 1);
@@ -1244,6 +1263,34 @@ ${i}` : `${s}${styleText("inverse", r2)}${i}`;
1244
1263
  });
1245
1264
  }
1246
1265
  };
1266
+ u$1 = class u2 extends V {
1267
+ _mask = "\u2022";
1268
+ get cursor() {
1269
+ return this._cursor;
1270
+ }
1271
+ get masked() {
1272
+ return this.userInput.replaceAll(/./g, this._mask);
1273
+ }
1274
+ get userInputWithCursor() {
1275
+ if (this.state === "submit" || this.state === "cancel")
1276
+ return this.masked;
1277
+ const t2 = this.userInput;
1278
+ if (this.cursor >= t2.length)
1279
+ return `${this.masked}${styleText(["inverse", "hidden"], "_")}`;
1280
+ const s = this.masked, r2 = s.slice(0, this.cursor), i = s.slice(this.cursor, this.cursor + 1), o2 = s.slice(this.cursor + 1);
1281
+ return `${r2}${styleText("inverse", i)}${o2}`;
1282
+ }
1283
+ clear() {
1284
+ this._clearUserInput();
1285
+ }
1286
+ constructor({ mask: t2, ...s }) {
1287
+ super(s), this._mask = t2 ?? "\u2022", this.on("userInput", (r2) => {
1288
+ this._setValue(r2);
1289
+ }), this.on("finalize", () => {
1290
+ this.value === undefined && (this.value = "");
1291
+ });
1292
+ }
1293
+ };
1247
1294
  n$1 = class n extends V {
1248
1295
  options;
1249
1296
  cursor = 0;
@@ -1272,6 +1319,23 @@ ${i}` : `${s}${styleText("inverse", r2)}${i}`;
1272
1319
  });
1273
1320
  }
1274
1321
  };
1322
+ u3 = class u3 extends V {
1323
+ options;
1324
+ cursor = 0;
1325
+ constructor(t2) {
1326
+ super(t2, false), this.options = t2.options;
1327
+ const s = t2.caseSensitive === true, i = this.options.map(({ value: [e] }) => s ? e : e?.toLowerCase());
1328
+ this.cursor = Math.max(i.indexOf(t2.initialValue), 0), this.on("key", (e) => {
1329
+ if (!e)
1330
+ return;
1331
+ const o2 = s ? e : e.toLowerCase();
1332
+ if (!i.includes(o2))
1333
+ return;
1334
+ const n2 = this.options.find(({ value: [r2] }) => s ? r2 === o2 : r2?.toLowerCase() === o2);
1335
+ n2 && (this.value = n2.value, this.state = "submit", this.emit("submit"));
1336
+ });
1337
+ }
1338
+ };
1275
1339
  n2 = class n2 extends V {
1276
1340
  get userInputWithCursor() {
1277
1341
  if (this.state === "submit")
@@ -1299,8 +1363,75 @@ ${i}` : `${s}${styleText("inverse", r2)}${i}`;
1299
1363
  });
1300
1364
 
1301
1365
  // node_modules/@clack/prompts/dist/index.mjs
1366
+ var exports_dist = {};
1367
+ __export(exports_dist, {
1368
+ updateSettings: () => updateSettings,
1369
+ unicodeOr: () => unicodeOr,
1370
+ unicode: () => unicode,
1371
+ text: () => text,
1372
+ tasks: () => tasks,
1373
+ taskLog: () => taskLog,
1374
+ symbolBar: () => symbolBar,
1375
+ symbol: () => symbol,
1376
+ stream: () => stream,
1377
+ spinner: () => spinner,
1378
+ settings: () => settings,
1379
+ selectKey: () => selectKey,
1380
+ select: () => select,
1381
+ progress: () => progress,
1382
+ path: () => path,
1383
+ password: () => password,
1384
+ outro: () => outro,
1385
+ note: () => note,
1386
+ multiselect: () => multiselect,
1387
+ multiline: () => multiline,
1388
+ log: () => log,
1389
+ limitOptions: () => limitOptions,
1390
+ isTTY: () => isTTY,
1391
+ isCancel: () => isCancel,
1392
+ isCI: () => isCI,
1393
+ intro: () => intro,
1394
+ groupMultiselect: () => groupMultiselect,
1395
+ group: () => group,
1396
+ formatInstructionFooter: () => formatInstructionFooter,
1397
+ date: () => date,
1398
+ confirm: () => confirm,
1399
+ cancel: () => cancel,
1400
+ box: () => box,
1401
+ autocompleteMultiselect: () => autocompleteMultiselect,
1402
+ autocomplete: () => autocomplete,
1403
+ S_WARN: () => S_WARN,
1404
+ S_SUCCESS: () => S_SUCCESS,
1405
+ S_STEP_SUBMIT: () => S_STEP_SUBMIT,
1406
+ S_STEP_ERROR: () => S_STEP_ERROR,
1407
+ S_STEP_CANCEL: () => S_STEP_CANCEL,
1408
+ S_STEP_ACTIVE: () => S_STEP_ACTIVE,
1409
+ S_RADIO_INACTIVE: () => S_RADIO_INACTIVE,
1410
+ S_RADIO_ACTIVE: () => S_RADIO_ACTIVE,
1411
+ S_PASSWORD_MASK: () => S_PASSWORD_MASK,
1412
+ S_INFO: () => S_INFO,
1413
+ S_ERROR: () => S_ERROR,
1414
+ S_CORNER_TOP_RIGHT: () => S_CORNER_TOP_RIGHT,
1415
+ S_CORNER_TOP_LEFT: () => S_CORNER_TOP_LEFT,
1416
+ S_CORNER_BOTTOM_RIGHT: () => S_CORNER_BOTTOM_RIGHT,
1417
+ S_CORNER_BOTTOM_LEFT: () => S_CORNER_BOTTOM_LEFT,
1418
+ S_CONNECT_LEFT: () => S_CONNECT_LEFT,
1419
+ S_CHECKBOX_SELECTED: () => S_CHECKBOX_SELECTED,
1420
+ S_CHECKBOX_INACTIVE: () => S_CHECKBOX_INACTIVE,
1421
+ S_CHECKBOX_ACTIVE: () => S_CHECKBOX_ACTIVE,
1422
+ S_BAR_START_RIGHT: () => S_BAR_START_RIGHT,
1423
+ S_BAR_START: () => S_BAR_START,
1424
+ S_BAR_H: () => S_BAR_H,
1425
+ S_BAR_END_RIGHT: () => S_BAR_END_RIGHT,
1426
+ S_BAR_END: () => S_BAR_END,
1427
+ S_BAR: () => S_BAR,
1428
+ SELECT_INSTRUCTIONS: () => SELECT_INSTRUCTIONS,
1429
+ MULTISELECT_INSTRUCTIONS: () => MULTISELECT_INSTRUCTIONS
1430
+ });
1302
1431
  import { styleText as styleText2, stripVTControlCharacters } from "util";
1303
1432
  import process$1 from "process";
1433
+ import { existsSync, lstatSync, readdirSync } from "fs";
1434
+ import { dirname, join } from "path";
1304
1435
  function isUnicodeSupported() {
1305
1436
  if (process$1.platform !== "win32") {
1306
1437
  return process$1.env.TERM !== "linux";
@@ -1311,7 +1442,80 @@ function formatInstructionFooter(o2, e) {
1311
1442
  const r2 = [`${e ? `${styleText2("cyan", S_BAR)} ` : ""}${o2.join(" \u2022 ")}`];
1312
1443
  return e && r2.push(styleText2("cyan", S_BAR_END)), r2;
1313
1444
  }
1314
- var import_sisteransi2, unicode, isCI = () => process.env.CI === "true", unicodeOr = (o2, e) => unicode ? o2 : e, S_STEP_ACTIVE, S_STEP_CANCEL, S_STEP_ERROR, S_STEP_SUBMIT, S_BAR_START, S_BAR, S_BAR_END, S_BAR_START_RIGHT, S_BAR_END_RIGHT, S_RADIO_ACTIVE, S_RADIO_INACTIVE, S_CHECKBOX_ACTIVE, S_CHECKBOX_SELECTED, S_CHECKBOX_INACTIVE, S_PASSWORD_MASK, S_BAR_H, S_CORNER_TOP_RIGHT, S_CONNECT_LEFT, S_CORNER_BOTTOM_RIGHT, S_CORNER_BOTTOM_LEFT, S_CORNER_TOP_LEFT, S_INFO, S_SUCCESS, S_WARN, S_ERROR, symbol = (o2) => {
1445
+ function P2(t2) {
1446
+ return t2.label ?? String(t2.value ?? "");
1447
+ }
1448
+ function E(t2, c2) {
1449
+ if (!t2)
1450
+ return true;
1451
+ const n3 = (c2.label ?? String(c2.value ?? "")).toLowerCase(), i = (c2.hint ?? "").toLowerCase(), l2 = String(c2.value).toLowerCase(), o2 = t2.toLowerCase();
1452
+ return n3.includes(o2) || i.includes(o2) || l2.includes(o2);
1453
+ }
1454
+ function N(t2, c2) {
1455
+ const n3 = [];
1456
+ for (const i of c2)
1457
+ t2.includes(i.value) && n3.push(i);
1458
+ return n3;
1459
+ }
1460
+ function A$1(n3, e, t2, o2) {
1461
+ let i = t2, f2 = t2;
1462
+ return o2 === "center" ? i = Math.floor((e - n3) / 2) : o2 === "right" && (i = e - n3 - t2), f2 = e - i - n3, [i, f2];
1463
+ }
1464
+ function b2(e, r2) {
1465
+ const { segmentValues: t2, segmentCursor: o2 } = e;
1466
+ if (r2 === "submit" || r2 === "cancel")
1467
+ return e.formattedValue;
1468
+ const i = styleText2("gray", e.separator);
1469
+ return e.segments.map((l2, d) => {
1470
+ const c2 = d === o2.segmentIndex && !["submit", "cancel"].includes(r2), a2 = p2[l2.type];
1471
+ return x(t2[l2.type], { isActive: c2, label: a2 });
1472
+ }).join(i);
1473
+ }
1474
+ function x(e, r2) {
1475
+ const t2 = !e || e.replace(/_/g, "") === "";
1476
+ return r2.isActive ? styleText2("inverse", t2 ? r2.label : e.replace(/_/g, " ")) : t2 ? styleText2("dim", r2.label) : e.replace(/_/g, styleText2("dim", " "));
1477
+ }
1478
+ function progress({
1479
+ style: o2 = "heavy",
1480
+ max: d = 100,
1481
+ size: v = 40,
1482
+ ...x2
1483
+ } = {}) {
1484
+ const r2 = spinner(x2);
1485
+ let a2 = 0, n3 = "";
1486
+ const c2 = Math.max(1, d), l2 = Math.max(1, v), S = (t2) => {
1487
+ switch (t2) {
1488
+ case "initial":
1489
+ case "active":
1490
+ return (e) => styleText2("magenta", e);
1491
+ case "error":
1492
+ case "cancel":
1493
+ return (e) => styleText2("red", e);
1494
+ case "submit":
1495
+ return (e) => styleText2("green", e);
1496
+ default:
1497
+ return (e) => styleText2("magenta", e);
1498
+ }
1499
+ }, p3 = (t2, e) => {
1500
+ const m3 = Math.floor(a2 / c2 * l2);
1501
+ return `${S(t2)(u4[o2].repeat(m3))}${styleText2("dim", u4[o2].repeat(l2 - m3))} ${e}`;
1502
+ }, h2 = (t2 = "") => {
1503
+ n3 = t2, r2.start(p3("initial", t2));
1504
+ }, g2 = (t2 = 1, e) => {
1505
+ a2 = Math.min(c2, t2 + a2), r2.message(p3("active", e ?? n3)), n3 = e ?? n3;
1506
+ };
1507
+ return {
1508
+ start: h2,
1509
+ stop: r2.stop,
1510
+ cancel: r2.cancel,
1511
+ error: r2.error,
1512
+ clear: r2.clear,
1513
+ advance: g2,
1514
+ isCancelled: r2.isCancelled,
1515
+ message: (t2) => g2(0, t2)
1516
+ };
1517
+ }
1518
+ var import_sisteransi2, unicode, isCI = () => process.env.CI === "true", isTTY = (o2) => o2.isTTY === true, unicodeOr = (o2, e) => unicode ? o2 : e, S_STEP_ACTIVE, S_STEP_CANCEL, S_STEP_ERROR, S_STEP_SUBMIT, S_BAR_START, S_BAR, S_BAR_END, S_BAR_START_RIGHT, S_BAR_END_RIGHT, S_RADIO_ACTIVE, S_RADIO_INACTIVE, S_CHECKBOX_ACTIVE, S_CHECKBOX_SELECTED, S_CHECKBOX_INACTIVE, S_PASSWORD_MASK, S_BAR_H, S_CORNER_TOP_RIGHT, S_CONNECT_LEFT, S_CORNER_BOTTOM_RIGHT, S_CORNER_BOTTOM_LEFT, S_CORNER_TOP_LEFT, S_INFO, S_SUCCESS, S_WARN, S_ERROR, symbol = (o2) => {
1315
1519
  switch (o2) {
1316
1520
  case "initial":
1317
1521
  case "active":
@@ -1378,9 +1582,9 @@ var import_sisteransi2, unicode, isCI = () => process.env.CI === "true", unicode
1378
1582
  if (g2 > v) {
1379
1583
  let t2 = 0, n3 = 0, o2 = g2;
1380
1584
  const h2 = l2 - T3;
1381
- let u3 = v;
1382
- const L = () => I(s, o2, 0, h2, u3), E = () => I(s, o2, h2 + 1, s.length, u3, true);
1383
- d ? ({ lineCount: o2, removals: t2 } = L(), o2 > u3 && (c2 || (u3 -= 1), { lineCount: o2, removals: n3 } = E())) : (c2 || (u3 -= 1), { lineCount: o2, removals: n3 } = E(), o2 > u3 && (u3 -= 1, { lineCount: o2, removals: t2 } = L())), t2 > 0 && (d = true, s.splice(0, t2)), n3 > 0 && (c2 = true, s.splice(s.length - n3, n3));
1585
+ let u4 = v;
1586
+ const L = () => I(s, o2, 0, h2, u4), E = () => I(s, o2, h2 + 1, s.length, u4, true);
1587
+ d ? ({ lineCount: o2, removals: t2 } = L(), o2 > u4 && (c2 || (u4 -= 1), { lineCount: o2, removals: n3 } = E())) : (c2 || (u4 -= 1), { lineCount: o2, removals: n3 } = E(), o2 > u4 && (u4 -= 1, { lineCount: o2, removals: t2 } = L())), t2 > 0 && (d = true, s.splice(0, t2)), n3 > 0 && (c2 = true, s.splice(s.length - n3, n3));
1384
1588
  }
1385
1589
  const x = [];
1386
1590
  d && x.push(M2);
@@ -1388,6 +1592,160 @@ var import_sisteransi2, unicode, isCI = () => process.env.CI === "true", unicode
1388
1592
  for (const n3 of t2)
1389
1593
  x.push(n3);
1390
1594
  return c2 && x.push(M2), x;
1595
+ }, autocomplete = (t2) => new T$1({
1596
+ options: t2.options,
1597
+ initialValue: t2.initialValue ? [t2.initialValue] : undefined,
1598
+ initialUserInput: t2.initialUserInput,
1599
+ placeholder: t2.placeholder,
1600
+ filter: t2.filter ?? ((n3, i) => E(n3, i)),
1601
+ signal: t2.signal,
1602
+ input: t2.input,
1603
+ output: t2.output,
1604
+ validate: t2.validate,
1605
+ render() {
1606
+ const n3 = t2.withGuide ?? settings.withGuide, i = n3 ? [`${styleText2("gray", S_BAR)}`, `${symbol(this.state)} ${t2.message}`] : [`${symbol(this.state)} ${t2.message}`], l2 = this.userInput, o2 = this.options, m2 = t2.placeholder, p2 = l2 === "" && m2 !== undefined, $ = (r2, s) => {
1607
+ const a2 = P2(r2), u4 = r2.hint && r2.value === this.focusedValue ? styleText2("dim", ` (${r2.hint})`) : "";
1608
+ switch (s) {
1609
+ case "active":
1610
+ return `${styleText2("green", S_RADIO_ACTIVE)} ${a2}${u4}`;
1611
+ case "inactive":
1612
+ return `${styleText2("dim", S_RADIO_INACTIVE)} ${styleText2("dim", a2)}`;
1613
+ case "disabled":
1614
+ return `${styleText2("gray", S_RADIO_INACTIVE)} ${styleText2(["strikethrough", "gray"], a2)}`;
1615
+ }
1616
+ };
1617
+ switch (this.state) {
1618
+ case "submit": {
1619
+ const r2 = N(this.selectedValues, o2), s = r2.length > 0 ? ` ${styleText2("dim", r2.map(P2).join(", "))}` : "", a2 = n3 ? styleText2("gray", S_BAR) : "";
1620
+ return `${i.join(`
1621
+ `)}
1622
+ ${a2}${s}`;
1623
+ }
1624
+ case "cancel": {
1625
+ const r2 = l2 ? ` ${styleText2(["strikethrough", "dim"], l2)}` : "", s = n3 ? styleText2("gray", S_BAR) : "";
1626
+ return `${i.join(`
1627
+ `)}
1628
+ ${s}${r2}`;
1629
+ }
1630
+ default: {
1631
+ const r2 = this.state === "error" ? "yellow" : "cyan", s = n3 ? `${styleText2(r2, S_BAR)} ` : "", a2 = n3 ? styleText2(r2, S_BAR_END) : "";
1632
+ let u4 = "";
1633
+ if (this.isNavigating || p2) {
1634
+ const d = p2 ? m2 : l2;
1635
+ u4 = d !== "" ? ` ${styleText2("dim", d)}` : "";
1636
+ } else
1637
+ u4 = ` ${this.userInputWithCursor}`;
1638
+ const V2 = this.filteredOptions.length !== o2.length ? styleText2("dim", ` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? "" : "es"})`) : "", y = this.filteredOptions.length === 0 && l2 ? [`${s}${styleText2("yellow", "No matches found")}`] : [], b2 = this.state === "error" ? [`${s}${styleText2("yellow", this.error)}`] : [];
1639
+ n3 && i.push(`${s.trimEnd()}`), i.push(`${s}${styleText2("dim", "Search:")}${u4}${V2}`, ...y, ...b2);
1640
+ const v = [
1641
+ `${styleText2("dim", "\u2191/\u2193")} to select`,
1642
+ `${styleText2("dim", "Enter:")} confirm`,
1643
+ `${styleText2("dim", "Type:")} to search`
1644
+ ], g2 = [`${s}${v.join(" \u2022 ")}`, a2], O = this.filteredOptions.length === 0 ? [] : limitOptions({
1645
+ cursor: this.cursor,
1646
+ options: this.filteredOptions,
1647
+ columnPadding: n3 ? 3 : 0,
1648
+ rowPadding: i.length + g2.length,
1649
+ style: (d, f2) => $(d, d.disabled ? "disabled" : f2 ? "active" : "inactive"),
1650
+ maxItems: t2.maxItems,
1651
+ output: t2.output
1652
+ });
1653
+ return [
1654
+ ...i,
1655
+ ...O.map((d) => `${s}${d}`),
1656
+ ...g2
1657
+ ].join(`
1658
+ `);
1659
+ }
1660
+ }
1661
+ }
1662
+ }).prompt(), autocompleteMultiselect = (t2) => {
1663
+ const c2 = (i, l2, o2, m2) => {
1664
+ const p2 = o2.includes(i.value), $ = i.label ?? String(i.value ?? ""), r2 = i.hint && m2 !== undefined && i.value === m2 ? styleText2("dim", ` (${i.hint})`) : "", s = p2 ? styleText2("green", S_CHECKBOX_SELECTED) : styleText2("dim", S_CHECKBOX_INACTIVE);
1665
+ return i.disabled ? `${styleText2("gray", S_CHECKBOX_INACTIVE)} ${styleText2(["strikethrough", "gray"], $)}` : l2 ? `${s} ${$}${r2}` : `${s} ${styleText2("dim", $)}`;
1666
+ }, n3 = new T$1({
1667
+ options: t2.options,
1668
+ multiple: true,
1669
+ placeholder: t2.placeholder,
1670
+ filter: t2.filter ?? ((i, l2) => E(i, l2)),
1671
+ validate: () => {
1672
+ if (t2.required && n3.selectedValues.length === 0)
1673
+ return "Please select at least one item";
1674
+ },
1675
+ initialValue: t2.initialValues,
1676
+ signal: t2.signal,
1677
+ input: t2.input,
1678
+ output: t2.output,
1679
+ render() {
1680
+ const i = t2.withGuide ?? settings.withGuide, l2 = `${i ? `${styleText2("gray", S_BAR)}
1681
+ ` : ""}${symbol(this.state)} ${t2.message}
1682
+ `, o2 = this.userInput, m2 = t2.placeholder, p2 = o2 === "" && m2 !== undefined, $ = this.isNavigating || p2 ? styleText2("dim", p2 ? m2 : o2) : this.userInputWithCursor, r2 = this.options, s = this.filteredOptions.length !== r2.length ? styleText2("dim", ` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? "" : "es"})`) : "";
1683
+ switch (this.state) {
1684
+ case "submit":
1685
+ return `${l2}${i ? `${styleText2("gray", S_BAR)} ` : ""}${styleText2("dim", `${this.selectedValues.length} items selected`)}`;
1686
+ case "cancel":
1687
+ return `${l2}${i ? `${styleText2("gray", S_BAR)} ` : ""}${styleText2(["strikethrough", "dim"], o2)}`;
1688
+ default: {
1689
+ const a2 = this.state === "error" ? "yellow" : "cyan", u4 = i ? `${styleText2(a2, S_BAR)} ` : "", V2 = i ? styleText2(a2, S_BAR_END) : "", y = [
1690
+ `${styleText2("dim", "\u2191/\u2193")} to navigate`,
1691
+ `${styleText2("dim", this.isNavigating ? "Space/Tab:" : "Tab:")} select`,
1692
+ `${styleText2("dim", "Enter:")} confirm`,
1693
+ `${styleText2("dim", "Type:")} to search`
1694
+ ], b2 = this.filteredOptions.length === 0 && o2 ? [`${u4}${styleText2("yellow", "No matches found")}`] : [], v = this.state === "error" ? [`${u4}${styleText2("yellow", this.error)}`] : [], g2 = [
1695
+ ...`${l2}${i ? styleText2(a2, S_BAR) : ""}`.split(`
1696
+ `),
1697
+ `${u4}${styleText2("dim", "Search:")} ${$}${s}`,
1698
+ ...b2,
1699
+ ...v
1700
+ ], O = [`${u4}${y.join(" \u2022 ")}`, V2], d = limitOptions({
1701
+ cursor: this.cursor,
1702
+ options: this.filteredOptions,
1703
+ style: (f2, _2) => c2(f2, _2, this.selectedValues, this.focusedValue),
1704
+ maxItems: t2.maxItems,
1705
+ output: t2.output,
1706
+ rowPadding: g2.length + O.length
1707
+ });
1708
+ return [
1709
+ ...g2,
1710
+ ...d.map((f2) => `${u4}${f2}`),
1711
+ ...O
1712
+ ].join(`
1713
+ `);
1714
+ }
1715
+ }
1716
+ }
1717
+ });
1718
+ return n3.prompt();
1719
+ }, J, K, Q = (n3) => n3, box = (n3 = "", e = "", t2) => {
1720
+ const o2 = t2?.output ?? process.stdout, i = getColumns(o2), R2 = 1 * 2, u4 = t2?.titlePadding ?? 1, h2 = t2?.contentPadding ?? 2, w = t2?.width === undefined || t2.width === "auto" ? 1 : Math.min(1, t2.width), m2 = t2?.withGuide ?? settings.withGuide ? `${S_BAR} ` : "", b2 = t2?.formatBorder ?? Q, a2 = ((t2?.rounded) ? J : K).map(b2), _2 = b2(S_BAR_H), B = b2(S_BAR), p2 = dist_default2(m2), x = dist_default2(e), O = i - p2;
1721
+ let r2 = Math.floor(i * w) - p2;
1722
+ if (t2?.width === "auto") {
1723
+ const c2 = n3.split(`
1724
+ `);
1725
+ let s = x + u4 * 2;
1726
+ for (const G of c2) {
1727
+ const P3 = dist_default2(G) + h2 * 2;
1728
+ P3 > s && (s = P3);
1729
+ }
1730
+ const g2 = s + R2;
1731
+ g2 < r2 && (r2 = g2);
1732
+ }
1733
+ r2 % 2 !== 0 && (r2 < O ? r2++ : r2--);
1734
+ const d = r2 - R2, S = d - u4 * 2, T3 = x > S ? `${e.slice(0, S - 3)}...` : e, [y, W] = A$1(dist_default2(T3), d, u4, t2?.titleAlign), L = wrapAnsi(n3, d - h2 * 2, {
1735
+ hard: true,
1736
+ trim: false
1737
+ });
1738
+ o2.write(`${m2}${a2[0]}${_2.repeat(y)}${T3}${_2.repeat(W)}${a2[1]}
1739
+ `);
1740
+ const E2 = L.split(`
1741
+ `);
1742
+ for (const c2 of E2) {
1743
+ const [s, g2] = A$1(dist_default2(c2), d, h2, t2?.contentAlign);
1744
+ o2.write(`${m2}${B}${" ".repeat(s)}${c2}${" ".repeat(g2)}${B}
1745
+ `);
1746
+ }
1747
+ o2.write(`${m2}${a2[2]}${_2.repeat(d)}${a2[3]}
1748
+ `);
1391
1749
  }, confirm = (i) => {
1392
1750
  const a2 = i.active ?? "Yes", s = i.inactive ?? "No";
1393
1751
  return new r({
@@ -1398,7 +1756,7 @@ var import_sisteransi2, unicode, isCI = () => process.env.CI === "true", unicode
1398
1756
  output: i.output,
1399
1757
  initialValue: i.initialValue ?? true,
1400
1758
  render() {
1401
- const e = i.withGuide ?? settings.withGuide, u3 = `${symbol(this.state)} `, l2 = e ? `${styleText2("gray", S_BAR)} ` : "", f2 = wrapTextWithPrefix(i.output, i.message, l2, u3), o2 = `${e ? `${styleText2("gray", S_BAR)}
1759
+ const e = i.withGuide ?? settings.withGuide, u4 = `${symbol(this.state)} `, l2 = e ? `${styleText2("gray", S_BAR)} ` : "", f2 = wrapTextWithPrefix(i.output, i.message, l2, u4), o2 = `${e ? `${styleText2("gray", S_BAR)}
1402
1760
  ` : ""}${f2}
1403
1761
  `, c2 = this.value ? a2 : s;
1404
1762
  switch (this.state) {
@@ -1422,10 +1780,69 @@ ${g2}
1422
1780
  }
1423
1781
  }
1424
1782
  }).prompt();
1425
- }, MULTISELECT_INSTRUCTIONS, m2 = (i, u3) => i.split(`
1426
- `).map((d) => u3(d)).join(`
1783
+ }, date = (e) => {
1784
+ const r2 = e.validate;
1785
+ return new U({
1786
+ ...e,
1787
+ validate(t2) {
1788
+ if (t2 === undefined)
1789
+ return e.defaultValue !== undefined ? undefined : r2 ? runValidation(r2, t2) : settings.date.messages.required;
1790
+ const o2 = (i) => i.toISOString().slice(0, 10);
1791
+ if (e.minDate && o2(t2) < o2(e.minDate))
1792
+ return settings.date.messages.afterMin(e.minDate);
1793
+ if (e.maxDate && o2(t2) > o2(e.maxDate))
1794
+ return settings.date.messages.beforeMax(e.maxDate);
1795
+ if (r2)
1796
+ return runValidation(r2, t2);
1797
+ },
1798
+ render() {
1799
+ const t2 = (e?.withGuide ?? settings.withGuide) !== false, i = `${`${t2 ? `${styleText2("gray", S_BAR)}
1800
+ ` : ""}${symbol(this.state)} `}${e.message}
1801
+ `, l2 = this.state !== "initial" ? this.state : "active", d = b2(this, l2), c2 = this.value instanceof Date ? this.formattedValue : "";
1802
+ switch (this.state) {
1803
+ case "error": {
1804
+ const a2 = this.error ? ` ${styleText2("yellow", this.error)}` : "", s = t2 ? `${styleText2("yellow", S_BAR)} ` : "", f2 = t2 ? styleText2("yellow", S_BAR_END) : "";
1805
+ return `${i.trim()}
1806
+ ${s}${d}
1807
+ ${f2}${a2}
1808
+ `;
1809
+ }
1810
+ case "submit": {
1811
+ const a2 = c2 ? ` ${styleText2("dim", c2)}` : "", s = t2 ? styleText2("gray", S_BAR) : "";
1812
+ return `${i}${s}${a2}`;
1813
+ }
1814
+ case "cancel": {
1815
+ const a2 = c2 ? ` ${styleText2(["strikethrough", "dim"], c2)}` : "", s = t2 ? styleText2("gray", S_BAR) : "";
1816
+ return `${i}${s}${a2}${c2.trim() ? `
1817
+ ${s}` : ""}`;
1818
+ }
1819
+ default: {
1820
+ const a2 = t2 ? `${styleText2("cyan", S_BAR)} ` : "", s = t2 ? styleText2("cyan", S_BAR_END) : "", f2 = t2 ? `${styleText2("cyan", S_BAR)} ` : "", g2 = this.inlineError ? `
1821
+ ${f2}${styleText2("yellow", this.inlineError)}` : "";
1822
+ return `${i}${a2}${d}${g2}
1823
+ ${s}
1824
+ `;
1825
+ }
1826
+ }
1827
+ }
1828
+ }).prompt();
1829
+ }, p2, group = async (o2, r2) => {
1830
+ const t2 = {}, p3 = Object.keys(o2);
1831
+ for (const e of p3) {
1832
+ const i = o2[e], n3 = await i({ results: t2 })?.catch((a2) => {
1833
+ throw a2;
1834
+ });
1835
+ if (typeof r2?.onCancel == "function" && isCancel(n3)) {
1836
+ t2[e] = "canceled", r2.onCancel({ results: t2 });
1837
+ continue;
1838
+ }
1839
+ t2[e] = n3;
1840
+ }
1841
+ return t2;
1842
+ }, MULTISELECT_INSTRUCTIONS, m2 = (i, u4) => i.split(`
1843
+ `).map((d) => u4(d)).join(`
1427
1844
  `), multiselect = (i) => {
1428
- const u3 = (t2, a2) => {
1845
+ const u4 = (t2, a2) => {
1429
1846
  const r2 = t2.label ?? String(t2.value);
1430
1847
  return a2 === "disabled" ? `${styleText2("gray", S_CHECKBOX_INACTIVE)} ${m2(r2, (o2) => styleText2(["strikethrough", "gray"], o2))}${t2.hint ? ` ${styleText2("dim", `(${t2.hint ?? "disabled"})`)}` : ""}` : a2 === "active" ? `${styleText2("cyan", S_CHECKBOX_ACTIVE)} ${r2}${t2.hint ? ` ${styleText2("dim", `(${t2.hint})`)}` : ""}` : a2 === "selected" ? `${styleText2("green", S_CHECKBOX_SELECTED)} ${m2(r2, (o2) => styleText2("dim", o2))}${t2.hint ? ` ${styleText2("dim", `(${t2.hint})`)}` : ""}` : a2 === "cancelled" ? `${m2(r2, (o2) => styleText2(["strikethrough", "dim"], o2))}` : a2 === "active-selected" ? `${styleText2("green", S_CHECKBOX_SELECTED)} ${r2}${t2.hint ? ` ${styleText2("dim", `(${t2.hint})`)}` : ""}` : a2 === "submitted" ? `${m2(r2, (o2) => styleText2("dim", o2))}` : `${styleText2("dim", S_CHECKBOX_INACTIVE)} ${m2(r2, (o2) => styleText2("dim", o2))}`;
1431
1848
  }, d = i.required ?? true, v = i.showInstructions ?? true;
@@ -1445,19 +1862,19 @@ ${styleText2("reset", styleText2("dim", `Press ${styleText2(["gray", "bgWhite",
1445
1862
  render() {
1446
1863
  const t2 = i.withGuide ?? settings.withGuide, a2 = wrapTextWithPrefix(i.output, i.message, t2 ? `${symbolBar(this.state)} ` : "", `${symbol(this.state)} `), r2 = `${t2 ? `${styleText2("gray", S_BAR)}
1447
1864
  ` : ""}${a2}
1448
- `, o2 = this.value ?? [], p2 = (n3, l2) => {
1865
+ `, o2 = this.value ?? [], p3 = (n3, l2) => {
1449
1866
  if (n3.disabled)
1450
- return u3(n3, "disabled");
1867
+ return u4(n3, "disabled");
1451
1868
  const s = o2.includes(n3.value);
1452
- return l2 && s ? u3(n3, "active-selected") : s ? u3(n3, "selected") : u3(n3, l2 ? "active" : "inactive");
1869
+ return l2 && s ? u4(n3, "active-selected") : s ? u4(n3, "selected") : u4(n3, l2 ? "active" : "inactive");
1453
1870
  };
1454
1871
  switch (this.state) {
1455
1872
  case "submit": {
1456
- const n3 = this.options.filter(({ value: s }) => o2.includes(s)).map((s) => u3(s, "submitted")).join(styleText2("dim", ", ")) || styleText2("dim", "none"), l2 = wrapTextWithPrefix(i.output, n3, t2 ? `${styleText2("gray", S_BAR)} ` : "");
1873
+ const n3 = this.options.filter(({ value: s }) => o2.includes(s)).map((s) => u4(s, "submitted")).join(styleText2("dim", ", ")) || styleText2("dim", "none"), l2 = wrapTextWithPrefix(i.output, n3, t2 ? `${styleText2("gray", S_BAR)} ` : "");
1457
1874
  return `${r2}${l2}`;
1458
1875
  }
1459
1876
  case "cancel": {
1460
- const n3 = this.options.filter(({ value: s }) => o2.includes(s)).map((s) => u3(s, "cancelled")).join(styleText2("dim", ", "));
1877
+ const n3 = this.options.filter(({ value: s }) => o2.includes(s)).map((s) => u4(s, "cancelled")).join(styleText2("dim", ", "));
1461
1878
  if (n3.trim() === "")
1462
1879
  return `${r2}${styleText2("gray", S_BAR)}`;
1463
1880
  const l2 = wrapTextWithPrefix(i.output, n3, t2 ? `${styleText2("gray", S_BAR)} ` : "");
@@ -1477,7 +1894,7 @@ ${styleText2("gray", S_BAR)}` : ""}`;
1477
1894
  maxItems: i.maxItems,
1478
1895
  columnPadding: n3.length,
1479
1896
  rowPadding: s + h2,
1480
- style: p2
1897
+ style: p3
1481
1898
  }).join(`
1482
1899
  ${n3}`)}
1483
1900
  ${l2}
@@ -1494,7 +1911,7 @@ ${l2}
1494
1911
  maxItems: i.maxItems,
1495
1912
  columnPadding: n3.length,
1496
1913
  rowPadding: l2 + $,
1497
- style: p2
1914
+ style: p3
1498
1915
  }).join(`
1499
1916
  ${n3}`)}
1500
1917
  ${h2}
@@ -1503,7 +1920,103 @@ ${h2}
1503
1920
  }
1504
1921
  }
1505
1922
  }).prompt();
1506
- }, cancel = (o2 = "", t2) => {
1923
+ }, groupMultiselect = (o2) => {
1924
+ const { selectableGroups: h2 = true, groupSpacing: x2 = 0 } = o2, m3 = (n3, l2, g2 = []) => {
1925
+ const a2 = n3.label ?? String(n3.value), t2 = typeof n3.group == "string", s = t2 && (g2[g2.indexOf(n3) + 1] ?? { group: true }), u4 = t2 && s && s.group === true;
1926
+ let r2 = "", c2 = "";
1927
+ t2 && (h2 ? (r2 = u4 ? `${S_BAR_END} ` : `${S_BAR} `, c2 = u4 ? " " : `${S_BAR} `) : r2 = " ");
1928
+ let i = "";
1929
+ if (x2 > 0 && !t2 && (i = `
1930
+ `.repeat(x2)), l2 === "active")
1931
+ return wrapTextWithPrefix(o2.output, `${a2}${n3.hint ? ` ${styleText2("dim", `(${n3.hint})`)}` : ""}`, `${i}${styleText2("dim", r2)} `, `${i}${styleText2("dim", r2)}${styleText2("cyan", S_CHECKBOX_ACTIVE)} `, `${i}${styleText2("dim", c2)} `);
1932
+ if (l2 === "group-active")
1933
+ return wrapTextWithPrefix(o2.output, a2, `${i}${r2} `, `${i}${r2}${styleText2("cyan", S_CHECKBOX_ACTIVE)} `, `${i}${c2} `, (d) => styleText2("dim", d));
1934
+ if (l2 === "group-active-selected")
1935
+ return wrapTextWithPrefix(o2.output, a2, `${i}${r2} `, `${i}${r2}${styleText2("green", S_CHECKBOX_SELECTED)} `, `${i}${c2} `, (d) => styleText2("dim", d));
1936
+ if (l2 === "selected") {
1937
+ const d = t2 || h2 ? styleText2("green", S_CHECKBOX_SELECTED) : "";
1938
+ return wrapTextWithPrefix(o2.output, `${a2}${n3.hint ? ` (${n3.hint})` : ""}`, `${i}${styleText2("dim", r2)} `, `${i}${styleText2("dim", r2)}${d} `, `${i}${styleText2("dim", c2)} `, (S) => styleText2("dim", S));
1939
+ }
1940
+ if (l2 === "cancelled")
1941
+ return `${styleText2(["strikethrough", "dim"], a2)}`;
1942
+ if (l2 === "active-selected")
1943
+ return wrapTextWithPrefix(o2.output, `${a2}${n3.hint ? ` ${styleText2("dim", `(${n3.hint})`)}` : ""}`, `${i}${styleText2("dim", r2)} `, `${i}${styleText2("dim", r2)}${styleText2("green", S_CHECKBOX_SELECTED)} `, `${i}${styleText2("dim", c2)} `);
1944
+ if (l2 === "submitted")
1945
+ return `${styleText2("dim", a2)}`;
1946
+ const f2 = t2 || h2 ? styleText2("dim", S_CHECKBOX_INACTIVE) : "";
1947
+ return wrapTextWithPrefix(o2.output, a2, `${i}${styleText2("dim", r2)} `, `${i}${styleText2("dim", r2)}${f2} `, `${i}${styleText2("dim", c2)} `, (d) => styleText2("dim", d));
1948
+ }, y = o2.required ?? true, I2 = o2.showInstructions ?? true;
1949
+ return new u$2({
1950
+ options: o2.options,
1951
+ signal: o2.signal,
1952
+ input: o2.input,
1953
+ output: o2.output,
1954
+ initialValues: o2.initialValues,
1955
+ required: y,
1956
+ cursorAt: o2.cursorAt,
1957
+ selectableGroups: h2,
1958
+ validate(n3) {
1959
+ if (y && (n3 === undefined || n3.length === 0))
1960
+ return `Please select at least one option.
1961
+ ${styleText2("reset", styleText2("dim", `Press ${styleText2(["gray", "bgWhite", "inverse"], " space ")} to select, ${styleText2("gray", styleText2(["bgWhite", "inverse"], " enter "))} to submit`))}`;
1962
+ },
1963
+ render() {
1964
+ const n3 = o2.withGuide ?? settings.withGuide, l2 = `${n3 ? `${styleText2("gray", S_BAR)}
1965
+ ` : ""}${symbol(this.state)} ${o2.message}
1966
+ `, g2 = this.value ?? [], a2 = (t2, s) => {
1967
+ const u4 = this.options, r2 = g2.includes(t2.value) || t2.group === true && this.isGroupSelected(`${t2.value}`);
1968
+ return !s && typeof t2.group == "string" && this.options[this.cursor]?.value === t2.group ? m3(t2, r2 ? "group-active-selected" : "group-active", u4) : s && r2 ? m3(t2, "active-selected", u4) : r2 ? m3(t2, "selected", u4) : m3(t2, s ? "active" : "inactive", u4);
1969
+ };
1970
+ switch (this.state) {
1971
+ case "submit": {
1972
+ const t2 = this.options.filter(({ value: u4 }) => g2.includes(u4)).map((u4) => m3(u4, "submitted")), s = t2.length === 0 ? "" : ` ${t2.join(styleText2("dim", ", "))}`;
1973
+ return `${l2}${n3 ? styleText2("gray", S_BAR) : ""}${s}`;
1974
+ }
1975
+ case "cancel": {
1976
+ const t2 = this.options.filter(({ value: s }) => g2.includes(s)).map((s) => m3(s, "cancelled")).join(styleText2("dim", ", "));
1977
+ return `${l2}${n3 ? `${styleText2("gray", S_BAR)} ` : ""}${t2.trim() ? `${t2}${n3 ? `
1978
+ ${styleText2("gray", S_BAR)}` : ""}` : ""}`;
1979
+ }
1980
+ case "error": {
1981
+ const t2 = n3 ? `${styleText2("yellow", S_BAR)} ` : "", s = this.error.split(`
1982
+ `).map((i, f2) => f2 === 0 ? `${n3 ? `${styleText2("yellow", S_BAR_END)} ` : ""}${styleText2("yellow", i)}` : ` ${i}`).join(`
1983
+ `), u4 = l2.split(`
1984
+ `).length, r2 = s.split(`
1985
+ `).length + 1, c2 = limitOptions({
1986
+ output: o2.output,
1987
+ options: this.options,
1988
+ cursor: this.cursor,
1989
+ maxItems: o2.maxItems,
1990
+ columnPadding: t2.length,
1991
+ rowPadding: u4 + r2,
1992
+ style: a2
1993
+ }).join(`
1994
+ ${t2}`);
1995
+ return `${l2}${t2}${c2}
1996
+ ${s}
1997
+ `;
1998
+ }
1999
+ default: {
2000
+ const t2 = n3 ? `${styleText2("cyan", S_BAR)} ` : "", s = l2.split(`
2001
+ `).length, u4 = I2 ? formatInstructionFooter(MULTISELECT_INSTRUCTIONS, n3) : n3 ? [styleText2("cyan", S_BAR_END)] : [], r2 = u4.join(`
2002
+ `), c2 = u4.length + 1, i = limitOptions({
2003
+ output: o2.output,
2004
+ options: this.options,
2005
+ cursor: this.cursor,
2006
+ maxItems: o2.maxItems,
2007
+ columnPadding: t2.length,
2008
+ rowPadding: s + c2,
2009
+ style: a2
2010
+ }).join(`
2011
+ ${t2}`);
2012
+ return `${l2}${t2}${i}
2013
+ ${r2}
2014
+ `;
2015
+ }
2016
+ }
2017
+ }
2018
+ }).prompt();
2019
+ }, log, cancel = (o2 = "", t2) => {
1507
2020
  const i = t2?.output ?? process.stdout, e = t2?.withGuide ?? settings.withGuide ? `${styleText2("gray", S_BAR_END)} ` : "";
1508
2021
  i.write(`${e}${styleText2("red", o2)}
1509
2022
 
@@ -1518,20 +2031,148 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1518
2031
  i.write(`${e}${o2}
1519
2032
 
1520
2033
  `);
2034
+ }, multiline = (e) => new h({
2035
+ validate: e.validate,
2036
+ placeholder: e.placeholder,
2037
+ defaultValue: e.defaultValue,
2038
+ initialValue: e.initialValue,
2039
+ showSubmit: e.showSubmit,
2040
+ output: e.output,
2041
+ signal: e.signal,
2042
+ input: e.input,
2043
+ render() {
2044
+ const i = e?.withGuide ?? settings.withGuide, o2 = `${`${i ? `${styleText2("gray", S_BAR)}
2045
+ ` : ""}${symbol(this.state)} `}${e.message}
2046
+ `, m3 = e.placeholder && e.placeholder.length > 0 ? styleText2("inverse", e.placeholder[0]) + styleText2("dim", e.placeholder.slice(1)) : styleText2(["inverse", "hidden"], "_"), a2 = this.userInput ? this.userInputWithCursor : m3, l2 = this.value ?? "", c2 = e.showSubmit ? `
2047
+ ${styleText2(this.focused === "submit" ? "cyan" : "dim", "[ submit ]")}` : "";
2048
+ switch (this.state) {
2049
+ case "error": {
2050
+ const n3 = `${styleText2("yellow", S_BAR)} `, r2 = i ? wrapTextWithPrefix(e.output, a2, n3, undefined) : a2, u4 = styleText2("yellow", S_BAR_END);
2051
+ return `${o2}${r2}
2052
+ ${u4} ${styleText2("yellow", this.error)}${c2}
2053
+ `;
2054
+ }
2055
+ case "submit": {
2056
+ const n3 = `${styleText2("gray", S_BAR)} `, r2 = i ? wrapTextWithPrefix(e.output, l2, n3, undefined, undefined, (u4) => styleText2("dim", u4)) : l2 ? styleText2("dim", l2) : "";
2057
+ return `${o2}${r2}`;
2058
+ }
2059
+ case "cancel": {
2060
+ const n3 = `${styleText2("gray", S_BAR)} `, r2 = i ? wrapTextWithPrefix(e.output, l2, n3, undefined, undefined, (u4) => styleText2(["strikethrough", "dim"], u4)) : l2 ? styleText2(["strikethrough", "dim"], l2) : "";
2061
+ return `${o2}${r2}`;
2062
+ }
2063
+ default: {
2064
+ const n3 = i ? `${styleText2("cyan", S_BAR)} ` : "", r2 = i ? styleText2("cyan", S_BAR_END) : "", u4 = i ? wrapTextWithPrefix(e.output, a2, n3) : a2;
2065
+ return `${o2}${u4}
2066
+ ${r2}${c2}
2067
+ `;
2068
+ }
2069
+ }
2070
+ }
2071
+ }).prompt(), W$1 = (o2) => o2, C2 = (o2, e, s) => {
2072
+ const a2 = {
2073
+ hard: true,
2074
+ trim: false
2075
+ }, i = wrapAnsi(o2, e, a2).split(`
2076
+ `), c2 = i.reduce((n3, t2) => Math.max(dist_default2(t2), n3), 0), u4 = i.map(s).reduce((n3, t2) => Math.max(dist_default2(t2), n3), 0), g2 = e - (u4 - c2);
2077
+ return wrapAnsi(o2, g2, a2);
2078
+ }, note = (o2 = "", e = "", s) => {
2079
+ const a2 = s?.output ?? process$1.stdout, i = s?.withGuide ?? settings.withGuide, c2 = s?.format ?? W$1, g2 = ["", ...C2(o2, getColumns(a2) - 6, c2).split(`
2080
+ `).map(c2), ""], n3 = dist_default2(e), t2 = Math.max(g2.reduce((m3, F) => {
2081
+ const O = dist_default2(F);
2082
+ return O > m3 ? O : m3;
2083
+ }, 0), n3) + 2, h2 = g2.map((m3) => `${styleText2("gray", S_BAR)} ${m3}${" ".repeat(t2 - dist_default2(m3))}${styleText2("gray", S_BAR)}`).join(`
2084
+ `), T3 = i ? `${styleText2("gray", S_BAR)}
2085
+ ` : "", l$1 = i ? S_CONNECT_LEFT : S_CORNER_BOTTOM_LEFT;
2086
+ a2.write(`${T3}${styleText2("green", S_STEP_SUBMIT)} ${styleText2("reset", e)} ${styleText2("gray", S_BAR_H.repeat(Math.max(t2 - n3 - 1, 1)) + S_CORNER_TOP_RIGHT)}
2087
+ ${h2}
2088
+ ${styleText2("gray", l$1 + S_BAR_H.repeat(t2 + 2) + S_CORNER_BOTTOM_RIGHT)}
2089
+ `);
2090
+ }, password = (r2) => new u$1({
2091
+ validate: r2.validate,
2092
+ mask: r2.mask ?? S_PASSWORD_MASK,
2093
+ signal: r2.signal,
2094
+ input: r2.input,
2095
+ output: r2.output,
2096
+ render() {
2097
+ const e = r2.withGuide ?? settings.withGuide, o2 = `${e ? `${styleText2("gray", S_BAR)}
2098
+ ` : ""}${symbol(this.state)} ${r2.message}
2099
+ `, c2 = this.userInputWithCursor, i = this.masked;
2100
+ switch (this.state) {
2101
+ case "error": {
2102
+ const s = e ? `${styleText2("yellow", S_BAR)} ` : "", n3 = e ? `${styleText2("yellow", S_BAR_END)} ` : "", l2 = i ?? "";
2103
+ return r2.clearOnError && this.clear(), `${o2.trim()}
2104
+ ${s}${l2}
2105
+ ${n3}${styleText2("yellow", this.error)}
2106
+ `;
2107
+ }
2108
+ case "submit": {
2109
+ const s = e ? `${styleText2("gray", S_BAR)} ` : "", n3 = i ? styleText2("dim", i) : "";
2110
+ return `${o2}${s}${n3}`;
2111
+ }
2112
+ case "cancel": {
2113
+ const s = e ? `${styleText2("gray", S_BAR)} ` : "", n3 = i ? styleText2(["strikethrough", "dim"], i) : "";
2114
+ return `${o2}${s}${n3}${i && e ? `
2115
+ ${styleText2("gray", S_BAR)}` : ""}`;
2116
+ }
2117
+ default: {
2118
+ const s = e ? `${styleText2("cyan", S_BAR)} ` : "", n3 = e ? styleText2("cyan", S_BAR_END) : "";
2119
+ return `${o2}${s}${c2}
2120
+ ${n3}
2121
+ `;
2122
+ }
2123
+ }
2124
+ }
2125
+ }).prompt(), path = (e) => {
2126
+ const a2 = e.validate;
2127
+ return autocomplete({
2128
+ ...e,
2129
+ initialUserInput: e.initialValue ?? e.root ?? process.cwd(),
2130
+ maxItems: 5,
2131
+ validate(t2) {
2132
+ if (!Array.isArray(t2)) {
2133
+ if (!t2)
2134
+ return "Please select a path";
2135
+ if (a2)
2136
+ return runValidation(a2, t2);
2137
+ }
2138
+ },
2139
+ options() {
2140
+ const t2 = this.userInput;
2141
+ if (t2 === "")
2142
+ return [];
2143
+ try {
2144
+ let i;
2145
+ existsSync(t2) ? lstatSync(t2).isDirectory() && (!e.directory || t2.endsWith("/")) ? i = t2 : i = dirname(t2) : i = dirname(t2);
2146
+ const c2 = t2.length > 1 && t2.endsWith("/") ? t2.slice(0, -1) : t2;
2147
+ return readdirSync(i).map((r2) => {
2148
+ const n3 = join(i, r2), m3 = lstatSync(n3);
2149
+ return {
2150
+ name: r2,
2151
+ path: n3,
2152
+ isDirectory: m3.isDirectory()
2153
+ };
2154
+ }).filter(({ path: r2, isDirectory: n3 }) => r2.startsWith(c2) && (n3 || !e.directory)).map((r2) => ({
2155
+ value: r2.path
2156
+ }));
2157
+ } catch {
2158
+ return [];
2159
+ }
2160
+ }
2161
+ });
1521
2162
  }, W = (l2) => styleText2("magenta", l2), spinner = ({
1522
2163
  indicator: l2 = "dots",
1523
2164
  onCancel: h2,
1524
2165
  output: n3 = process.stdout,
1525
2166
  cancelMessage: G,
1526
2167
  errorMessage: O,
1527
- frames: E = unicode ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"],
2168
+ frames: E2 = unicode ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"],
1528
2169
  delay: F = unicode ? 80 : 120,
1529
2170
  signal: m3,
1530
2171
  ...I2
1531
2172
  } = {}) => {
1532
- const u3 = isCI();
1533
- let M2, T3, d = false, S = false, s = "", p2, w = performance.now();
1534
- const x = getColumns(n3), k = I2?.styleFrame ?? W, g2 = (e) => {
2173
+ const u4 = isCI();
2174
+ let M2, T3, d = false, S = false, s = "", p3, w = performance.now();
2175
+ const x2 = getColumns(n3), k = I2?.styleFrame ?? W, g2 = (e) => {
1535
2176
  const r2 = e > 1 ? O ?? settings.messages.error : G ?? settings.messages.cancel;
1536
2177
  S = e === 1, d && (a2(r2, e), S && typeof h2 == "function" && h2());
1537
2178
  }, f2 = () => g2(2), i = () => g2(1), A = () => {
@@ -1539,30 +2180,30 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1539
2180
  }, H = () => {
1540
2181
  process.removeListener("uncaughtExceptionMonitor", f2), process.removeListener("unhandledRejection", f2), process.removeListener("SIGINT", i), process.removeListener("SIGTERM", i), process.removeListener("exit", g2), m3 && m3.removeEventListener("abort", i);
1541
2182
  }, y = () => {
1542
- if (p2 === undefined)
2183
+ if (p3 === undefined)
1543
2184
  return;
1544
- u3 && n3.write(`
2185
+ u4 && n3.write(`
1545
2186
  `);
1546
- const r2 = wrapAnsi(p2, x, {
2187
+ const r2 = wrapAnsi(p3, x2, {
1547
2188
  hard: true,
1548
2189
  trim: false
1549
2190
  }).split(`
1550
2191
  `);
1551
2192
  r2.length > 1 && n3.write(import_sisteransi2.cursor.up(r2.length - 1)), n3.write(import_sisteransi2.cursor.to(0)), n3.write(import_sisteransi2.erase.down());
1552
- }, C2 = (e) => e.replace(/\.+$/, ""), _2 = (e) => {
2193
+ }, C3 = (e) => e.replace(/\.+$/, ""), _2 = (e) => {
1553
2194
  const r2 = (performance.now() - e) / 1000, t2 = Math.floor(r2 / 60), o2 = Math.floor(r2 % 60);
1554
2195
  return t2 > 0 ? `[${t2}m ${o2}s]` : `[${o2}s]`;
1555
- }, N = I2.withGuide ?? settings.withGuide, P2 = (e = "") => {
1556
- d = true, M2 = block({ output: n3 }), s = C2(e), w = performance.now(), N && n3.write(`${styleText2("gray", S_BAR)}
2196
+ }, N2 = I2.withGuide ?? settings.withGuide, P3 = (e = "") => {
2197
+ d = true, M2 = block({ output: n3 }), s = C3(e), w = performance.now(), N2 && n3.write(`${styleText2("gray", S_BAR)}
1557
2198
  `);
1558
2199
  let r2 = 0, t2 = 0;
1559
2200
  A(), T3 = setInterval(() => {
1560
- if (u3 && s === p2)
2201
+ if (u4 && s === p3)
1561
2202
  return;
1562
- y(), p2 = s;
1563
- const o2 = k(E[r2]);
2203
+ y(), p3 = s;
2204
+ const o2 = k(E2[r2]);
1564
2205
  let v;
1565
- if (u3)
2206
+ if (u4)
1566
2207
  v = `${o2} ${s}...`;
1567
2208
  else if (l2 === "timer")
1568
2209
  v = `${o2} ${s} ${_2(w)}`;
@@ -1570,11 +2211,11 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1570
2211
  const B = ".".repeat(Math.floor(t2)).slice(0, 3);
1571
2212
  v = `${o2} ${s}${B}`;
1572
2213
  }
1573
- const j = wrapAnsi(v, x, {
2214
+ const j = wrapAnsi(v, x2, {
1574
2215
  hard: true,
1575
2216
  trim: false
1576
2217
  });
1577
- n3.write(j), r2 = r2 + 1 < E.length ? r2 + 1 : 0, t2 = t2 < 4 ? t2 + 0.125 : 0;
2218
+ n3.write(j), r2 = r2 + 1 < E2.length ? r2 + 1 : 0, t2 = t2 < 4 ? t2 + 0.125 : 0;
1578
2219
  }, F);
1579
2220
  }, a2 = (e = "", r2 = 0, t2 = false) => {
1580
2221
  if (!d)
@@ -1586,10 +2227,10 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1586
2227
  `)), H(), M2();
1587
2228
  };
1588
2229
  return {
1589
- start: P2,
2230
+ start: P3,
1590
2231
  stop: (e = "") => a2(e, 0),
1591
2232
  message: (e = "") => {
1592
- s = C2(e ?? s);
2233
+ s = C3(e ?? s);
1593
2234
  },
1594
2235
  cancel: (e = "") => a2(e, 1),
1595
2236
  error: (e = "") => a2(e, 2),
@@ -1598,7 +2239,7 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1598
2239
  return S;
1599
2240
  }
1600
2241
  };
1601
- }, u3, SELECT_INSTRUCTIONS, c2 = (t2, o2) => t2.includes(`
2242
+ }, u4, SELECT_INSTRUCTIONS, c2 = (t2, o2) => t2.includes(`
1602
2243
  `) ? t2.split(`
1603
2244
  `).map((d) => o2(d)).join(`
1604
2245
  `) : o2(t2), select = (t2) => {
@@ -1626,40 +2267,196 @@ ${styleText2("gray", S_BAR_END)} ` : "";
1626
2267
  output: t2.output,
1627
2268
  initialValue: t2.initialValue,
1628
2269
  render() {
1629
- const n3 = t2.withGuide ?? settings.withGuide, m3 = `${symbol(this.state)} `, s = `${symbolBar(this.state)} `, i = wrapTextWithPrefix(t2.output, t2.message, s, m3), u4 = `${n3 ? `${styleText2("gray", S_BAR)}
2270
+ const n3 = t2.withGuide ?? settings.withGuide, m3 = `${symbol(this.state)} `, s = `${symbolBar(this.state)} `, i = wrapTextWithPrefix(t2.output, t2.message, s, m3), u5 = `${n3 ? `${styleText2("gray", S_BAR)}
1630
2271
  ` : ""}${i}
1631
2272
  `;
1632
2273
  switch (this.state) {
1633
2274
  case "submit": {
1634
2275
  const r2 = n3 ? `${styleText2("gray", S_BAR)} ` : "", a2 = wrapTextWithPrefix(t2.output, o2(this.options[this.cursor], "selected"), r2);
1635
- return `${u4}${a2}`;
2276
+ return `${u5}${a2}`;
1636
2277
  }
1637
2278
  case "cancel": {
1638
2279
  const r2 = n3 ? `${styleText2("gray", S_BAR)} ` : "", a2 = wrapTextWithPrefix(t2.output, o2(this.options[this.cursor], "cancelled"), r2);
1639
- return `${u4}${a2}${n3 ? `
2280
+ return `${u5}${a2}${n3 ? `
1640
2281
  ${styleText2("gray", S_BAR)}` : ""}`;
1641
2282
  }
1642
2283
  default: {
1643
- const r2 = n3 ? `${styleText2("cyan", S_BAR)} ` : "", a2 = u4.split(`
1644
- `).length, p2 = d ? formatInstructionFooter(SELECT_INSTRUCTIONS, n3) : n3 ? [styleText2("cyan", S_BAR_END)] : [], b2 = p2.join(`
1645
- `), f2 = p2.length + 1;
1646
- return `${u4}${r2}${limitOptions({
2284
+ const r2 = n3 ? `${styleText2("cyan", S_BAR)} ` : "", a2 = u5.split(`
2285
+ `).length, p3 = d ? formatInstructionFooter(SELECT_INSTRUCTIONS, n3) : n3 ? [styleText2("cyan", S_BAR_END)] : [], b3 = p3.join(`
2286
+ `), f2 = p3.length + 1;
2287
+ return `${u5}${r2}${limitOptions({
1647
2288
  output: t2.output,
1648
2289
  cursor: this.cursor,
1649
2290
  options: this.options,
1650
2291
  maxItems: t2.maxItems,
1651
2292
  columnPadding: r2.length,
1652
2293
  rowPadding: a2 + f2,
1653
- style: (g2, x) => o2(g2, g2.disabled ? "disabled" : x ? "active" : "inactive")
2294
+ style: (g2, x2) => o2(g2, g2.disabled ? "disabled" : x2 ? "active" : "inactive")
1654
2295
  }).join(`
1655
2296
  ${r2}`)}
1656
- ${b2}
2297
+ ${b3}
2298
+ `;
2299
+ }
2300
+ }
2301
+ }
2302
+ }).prompt();
2303
+ }, selectKey = (t2) => {
2304
+ const l2 = (e, a2 = "inactive") => {
2305
+ if (e === undefined)
2306
+ return "";
2307
+ const n3 = e.label ?? String(e.value);
2308
+ return a2 === "selected" ? `${styleText2("dim", n3)}` : a2 === "cancelled" ? `${styleText2(["strikethrough", "dim"], n3)}` : a2 === "active" ? `${styleText2(["bgCyan", "gray"], ` ${e.value} `)} ${n3}${e.hint ? ` ${styleText2("dim", `(${e.hint})`)}` : ""}` : `${styleText2(["gray", "bgWhite", "inverse"], ` ${e.value} `)} ${n3}${e.hint ? ` ${styleText2("dim", `(${e.hint})`)}` : ""}`;
2309
+ };
2310
+ return new u3({
2311
+ options: t2.options,
2312
+ signal: t2.signal,
2313
+ input: t2.input,
2314
+ output: t2.output,
2315
+ initialValue: t2.initialValue,
2316
+ caseSensitive: t2.caseSensitive,
2317
+ render() {
2318
+ const e = t2.withGuide ?? settings.withGuide, a2 = `${e ? `${styleText2("gray", S_BAR)}
2319
+ ` : ""}${symbol(this.state)} ${t2.message}
2320
+ `;
2321
+ switch (this.state) {
2322
+ case "submit": {
2323
+ const n3 = e ? `${styleText2("gray", S_BAR)} ` : "", s = this.options.find((u5) => u5.value === this.value) ?? t2.options[0], c3 = wrapTextWithPrefix(t2.output, l2(s, "selected"), n3);
2324
+ return `${a2}${c3}`;
2325
+ }
2326
+ case "cancel": {
2327
+ const n3 = e ? `${styleText2("gray", S_BAR)} ` : "", s = wrapTextWithPrefix(t2.output, l2(this.options[0], "cancelled"), n3);
2328
+ return `${a2}${s}${e ? `
2329
+ ${styleText2("gray", S_BAR)}` : ""}`;
2330
+ }
2331
+ default: {
2332
+ const n3 = e ? `${styleText2("cyan", S_BAR)} ` : "", s = e ? styleText2("cyan", S_BAR_END) : "", c3 = this.options.map((u5, d) => wrapTextWithPrefix(t2.output, l2(u5, d === this.cursor ? "active" : "inactive"), n3)).join(`
2333
+ `);
2334
+ return `${a2}${c3}
2335
+ ${s}
1657
2336
  `;
1658
2337
  }
1659
2338
  }
1660
2339
  }
1661
2340
  }).prompt();
1662
- }, i, text = (e) => new n2({
2341
+ }, i, stream, tasks = async (o2, e) => {
2342
+ for (const t2 of o2) {
2343
+ if (t2.enabled === false)
2344
+ continue;
2345
+ const s = spinner(e);
2346
+ s.start(t2.title);
2347
+ const n3 = await t2.task(s.message);
2348
+ s.stop(n3 || t2.title);
2349
+ }
2350
+ }, A = (l2) => l2.replace(/\x1b\[(?:\d+;)*\d*[ABCDEFGHfJKSTsu]|\x1b\[(s|u)/g, ""), taskLog = (l2) => {
2351
+ const r2 = l2.output ?? process.stdout, O = getColumns(r2), i2 = styleText2("gray", S_BAR), p3 = l2.spacing ?? 1, k = 3, m3 = l2.retainLog === true, d = !isCI() && isTTY(r2);
2352
+ r2.write(`${i2}
2353
+ `), r2.write(`${styleText2("green", S_STEP_SUBMIT)} ${l2.title}
2354
+ `);
2355
+ for (let e = 0;e < p3; e++)
2356
+ r2.write(`${i2}
2357
+ `);
2358
+ const n3 = [
2359
+ {
2360
+ value: "",
2361
+ full: ""
2362
+ }
2363
+ ];
2364
+ let v = false;
2365
+ const f2 = (e) => {
2366
+ if (n3.length === 0)
2367
+ return;
2368
+ let s = 0;
2369
+ e && (s += p3 + 2);
2370
+ for (const t2 of n3) {
2371
+ const { value: o2, result: a2 } = t2;
2372
+ let g2 = a2?.message ?? o2;
2373
+ if (g2.length === 0)
2374
+ continue;
2375
+ a2 === undefined && t2.header !== undefined && t2.header !== "" && (g2 += `
2376
+ ${t2.header}`);
2377
+ const E2 = g2.split(`
2378
+ `).reduce((b3, w) => w === "" ? b3 + 1 : b3 + Math.ceil((w.length + k) / O), 0);
2379
+ s += E2;
2380
+ }
2381
+ s > 0 && (s += 1, r2.write(import_sisteransi2.erase.lines(s)));
2382
+ }, h2 = (e, s, t2) => {
2383
+ const o2 = t2 ? `${e.full}
2384
+ ${e.value}` : e.value;
2385
+ e.header !== undefined && e.header !== "" && log.message(e.header.split(`
2386
+ `).map((a2) => styleText2("bold", a2)), {
2387
+ output: r2,
2388
+ secondarySymbol: i2,
2389
+ symbol: i2,
2390
+ spacing: 0
2391
+ }), log.message(o2.split(`
2392
+ `).map((a2) => styleText2("dim", a2)), {
2393
+ output: r2,
2394
+ secondarySymbol: i2,
2395
+ symbol: i2,
2396
+ spacing: s ?? p3
2397
+ });
2398
+ }, T3 = () => {
2399
+ for (const e of n3) {
2400
+ const { header: s, value: t2, full: o2 } = e;
2401
+ (s === undefined || s.length === 0) && t2.length === 0 || h2(e, undefined, m3 === true && o2.length > 0);
2402
+ }
2403
+ }, L = (e, s, t2) => {
2404
+ if (f2(false), (t2?.raw !== true || !v) && e.value !== "" && (e.value += `
2405
+ `), e.value += A(s), v = t2?.raw === true, l2.limit !== undefined) {
2406
+ const o2 = e.value.split(`
2407
+ `), a2 = o2.length - l2.limit;
2408
+ if (a2 > 0) {
2409
+ const g2 = o2.splice(0, a2);
2410
+ m3 && (e.full += (e.full === "" ? "" : `
2411
+ `) + g2.join(`
2412
+ `));
2413
+ }
2414
+ e.value = o2.join(`
2415
+ `);
2416
+ }
2417
+ d && y();
2418
+ }, y = () => {
2419
+ for (const e of n3)
2420
+ e.result ? e.result.status === "error" ? log.error(e.result.message, { output: r2, secondarySymbol: i2, spacing: 0 }) : log.success(e.result.message, { output: r2, secondarySymbol: i2, spacing: 0 }) : e.value !== "" && h2(e, 0);
2421
+ }, B = (e, s) => {
2422
+ f2(false), e.result = s, d && y();
2423
+ };
2424
+ return {
2425
+ message(e, s) {
2426
+ L(n3[0], e, s);
2427
+ },
2428
+ group(e) {
2429
+ const s = {
2430
+ header: e,
2431
+ value: "",
2432
+ full: ""
2433
+ };
2434
+ return n3.push(s), {
2435
+ message(t2, o2) {
2436
+ L(s, t2, o2);
2437
+ },
2438
+ error(t2) {
2439
+ B(s, {
2440
+ status: "error",
2441
+ message: t2
2442
+ });
2443
+ },
2444
+ success(t2) {
2445
+ B(s, {
2446
+ status: "success",
2447
+ message: t2
2448
+ });
2449
+ }
2450
+ };
2451
+ },
2452
+ error(e, s) {
2453
+ f2(true), log.error(e, { output: r2, secondarySymbol: i2, spacing: 1 }), s?.showLog !== false && T3(), n3.splice(1, n3.length - 1), n3[0].value = "", n3[0].full = "";
2454
+ },
2455
+ success(e, s) {
2456
+ f2(true), log.success(e, { output: r2, secondarySymbol: i2, spacing: 1 }), s?.showLog === true && T3(), n3.splice(1, n3.length - 1), n3[0].value = "", n3[0].full = "";
2457
+ }
2458
+ };
2459
+ }, text = (e) => new n2({
1663
2460
  validate: e.validate,
1664
2461
  placeholder: e.placeholder,
1665
2462
  defaultValue: e.defaultValue,
@@ -1729,12 +2526,66 @@ var init_dist4 = __esm(() => {
1729
2526
  S_SUCCESS = unicodeOr("\u25C6", "*");
1730
2527
  S_WARN = unicodeOr("\u25B2", "!");
1731
2528
  S_ERROR = unicodeOr("\u25A0", "x");
2529
+ J = [
2530
+ S_CORNER_TOP_LEFT,
2531
+ S_CORNER_TOP_RIGHT,
2532
+ S_CORNER_BOTTOM_LEFT,
2533
+ S_CORNER_BOTTOM_RIGHT
2534
+ ];
2535
+ K = [S_BAR_START, S_BAR_START_RIGHT, S_BAR_END, S_BAR_END_RIGHT];
2536
+ p2 = {
2537
+ year: "yyyy",
2538
+ month: "mm",
2539
+ day: "dd"
2540
+ };
1732
2541
  MULTISELECT_INSTRUCTIONS = [
1733
2542
  `${styleText2("dim", "\u2191/\u2193")} to navigate`,
1734
2543
  `${styleText2("dim", "Space:")} select`,
1735
2544
  `${styleText2("dim", "Enter:")} confirm`
1736
2545
  ];
1737
- u3 = {
2546
+ log = {
2547
+ message: (s = [], {
2548
+ symbol: e = styleText2("gray", S_BAR),
2549
+ secondarySymbol: r2 = styleText2("gray", S_BAR),
2550
+ output: m3 = process.stdout,
2551
+ spacing: l2 = 1,
2552
+ withGuide: c2
2553
+ } = {}) => {
2554
+ const t2 = [], o2 = c2 ?? settings.withGuide, f2 = o2 ? r2 : "", O = o2 ? `${e} ` : "", u4 = o2 ? `${r2} ` : "";
2555
+ for (let i = 0;i < l2; i++)
2556
+ t2.push(f2);
2557
+ const g2 = Array.isArray(s) ? s : s.split(`
2558
+ `);
2559
+ if (g2.length > 0) {
2560
+ const [i, ...y] = g2;
2561
+ i.length > 0 ? t2.push(`${O}${i}`) : t2.push(o2 ? e : "");
2562
+ for (const p3 of y)
2563
+ p3.length > 0 ? t2.push(`${u4}${p3}`) : t2.push(o2 ? r2 : "");
2564
+ }
2565
+ m3.write(`${t2.join(`
2566
+ `)}
2567
+ `);
2568
+ },
2569
+ info: (s, e) => {
2570
+ log.message(s, { ...e, symbol: styleText2("blue", S_INFO) });
2571
+ },
2572
+ success: (s, e) => {
2573
+ log.message(s, { ...e, symbol: styleText2("green", S_SUCCESS) });
2574
+ },
2575
+ step: (s, e) => {
2576
+ log.message(s, { ...e, symbol: styleText2("green", S_STEP_SUBMIT) });
2577
+ },
2578
+ warn: (s, e) => {
2579
+ log.message(s, { ...e, symbol: styleText2("yellow", S_WARN) });
2580
+ },
2581
+ warning: (s, e) => {
2582
+ log.warn(s, e);
2583
+ },
2584
+ error: (s, e) => {
2585
+ log.message(s, { ...e, symbol: styleText2("red", S_ERROR) });
2586
+ }
2587
+ };
2588
+ u4 = {
1738
2589
  light: unicodeOr("\u2500", "-"),
1739
2590
  heavy: unicodeOr("\u2501", "="),
1740
2591
  block: unicodeOr("\u2588", "#")
@@ -1744,6 +2595,30 @@ var init_dist4 = __esm(() => {
1744
2595
  `${styleText2("dim", "Enter:")} confirm`
1745
2596
  ];
1746
2597
  i = `${styleText2("gray", S_BAR)} `;
2598
+ stream = {
2599
+ message: async (e, { symbol: l2 = styleText2("gray", S_BAR) } = {}) => {
2600
+ process.stdout.write(`${styleText2("gray", S_BAR)}
2601
+ ${l2} `);
2602
+ let s = 3;
2603
+ for await (let r2 of e) {
2604
+ r2 = r2.replace(/\n/g, `
2605
+ ${i}`), r2.includes(`
2606
+ `) && (s = 3 + stripVTControlCharacters(r2.slice(r2.lastIndexOf(`
2607
+ `))).length);
2608
+ const o2 = stripVTControlCharacters(r2).length;
2609
+ s + o2 < process.stdout.columns ? (s += o2, process.stdout.write(r2)) : (process.stdout.write(`
2610
+ ${i}${r2.trimStart()}`), s = 3 + stripVTControlCharacters(r2.trimStart()).length);
2611
+ }
2612
+ process.stdout.write(`
2613
+ `);
2614
+ },
2615
+ info: (e) => stream.message(e, { symbol: styleText2("blue", S_INFO) }),
2616
+ success: (e) => stream.message(e, { symbol: styleText2("green", S_SUCCESS) }),
2617
+ step: (e) => stream.message(e, { symbol: styleText2("green", S_STEP_SUBMIT) }),
2618
+ warn: (e) => stream.message(e, { symbol: styleText2("yellow", S_WARN) }),
2619
+ warning: (e) => stream.warn(e),
2620
+ error: (e) => stream.message(e, { symbol: styleText2("red", S_ERROR) })
2621
+ };
1747
2622
  });
1748
2623
 
1749
2624
  // src/lib/export-mappings.ts
@@ -2053,7 +2928,7 @@ Generated by Guardian
2053
2928
  // src/lib/manifest.ts
2054
2929
  import * as crypto2 from "crypto";
2055
2930
  import * as fs3 from "fs";
2056
- import * as path3 from "path";
2931
+ import * as path4 from "path";
2057
2932
  import { fileURLToPath } from "url";
2058
2933
  function hashFile(filePath) {
2059
2934
  if (!fs3.existsSync(filePath)) {
@@ -2069,7 +2944,7 @@ function hashDirectory(dirPath) {
2069
2944
  const hashes = [];
2070
2945
  const files = getAllFiles(dirPath);
2071
2946
  for (const file of files.sort()) {
2072
- const relativePath = path3.relative(dirPath, file);
2947
+ const relativePath = path4.relative(dirPath, file);
2073
2948
  const fileHash = hashFile(file);
2074
2949
  hashes.push(`${relativePath}:${fileHash}`);
2075
2950
  }
@@ -2081,7 +2956,7 @@ function getAllFiles(dirPath) {
2081
2956
  function walk(dir) {
2082
2957
  const entries = fs3.readdirSync(dir, { withFileTypes: true });
2083
2958
  for (const entry of entries) {
2084
- const fullPath = path3.join(dir, entry.name);
2959
+ const fullPath = path4.join(dir, entry.name);
2085
2960
  if (entry.isDirectory()) {
2086
2961
  walk(fullPath);
2087
2962
  } else if (entry.isFile()) {
@@ -2093,11 +2968,11 @@ function getAllFiles(dirPath) {
2093
2968
  return files;
2094
2969
  }
2095
2970
  function manifestExists(targetDir) {
2096
- const manifestPath = path3.join(targetDir, MANIFEST_FILE);
2971
+ const manifestPath = path4.join(targetDir, MANIFEST_FILE);
2097
2972
  return fs3.existsSync(manifestPath);
2098
2973
  }
2099
2974
  function readManifest(targetDir) {
2100
- const manifestPath = path3.join(targetDir, MANIFEST_FILE);
2975
+ const manifestPath = path4.join(targetDir, MANIFEST_FILE);
2101
2976
  if (!fs3.existsSync(manifestPath)) {
2102
2977
  return null;
2103
2978
  }
@@ -2109,7 +2984,7 @@ function readManifest(targetDir) {
2109
2984
  }
2110
2985
  }
2111
2986
  function writeManifest(targetDir, manifest) {
2112
- const manifestPath = path3.join(targetDir, MANIFEST_FILE);
2987
+ const manifestPath = path4.join(targetDir, MANIFEST_FILE);
2113
2988
  const tempPath = `${manifestPath}.tmp`;
2114
2989
  fs3.writeFileSync(tempPath, JSON.stringify(manifest, null, 2), "utf-8");
2115
2990
  fs3.renameSync(tempPath, manifestPath);
@@ -2157,7 +3032,7 @@ function updateManifestAfterScaffold(targetDir, manifest, scaffoldedFiles) {
2157
3032
  for (const tool of manifest.tools) {
2158
3033
  if (tool !== "pi") {
2159
3034
  const exportPath = `.${tool}/`;
2160
- addExportRecord(manifest, tool, exportPath, path3.join(targetDir, ".pi"));
3035
+ addExportRecord(manifest, tool, exportPath, path4.join(targetDir, ".pi"));
2161
3036
  }
2162
3037
  }
2163
3038
  manifest.lastUpdatedAt = new Date().toISOString();
@@ -2181,7 +3056,7 @@ function getStoredHash(record) {
2181
3056
  }
2182
3057
  function categorizeFile(relativePath) {
2183
3058
  const userEditable = ["agent/AGENTS.md", "context/project.md", "context/patterns.md", "domain/"];
2184
- if (userEditable.some((p2) => relativePath.includes(p2))) {
3059
+ if (userEditable.some((p3) => relativePath.includes(p3))) {
2185
3060
  return "user";
2186
3061
  }
2187
3062
  const frameworkPatterns = [
@@ -2192,7 +3067,7 @@ function categorizeFile(relativePath) {
2192
3067
  "context/checklists.md",
2193
3068
  "context/output-formats.md"
2194
3069
  ];
2195
- if (frameworkPatterns.some((p2) => relativePath.startsWith(p2))) {
3070
+ if (frameworkPatterns.some((p3) => relativePath.startsWith(p3))) {
2196
3071
  return "framework";
2197
3072
  }
2198
3073
  if (relativePath.startsWith(".claude/") || relativePath.startsWith(".opencode/") || relativePath.startsWith(".agents/")) {
@@ -2208,7 +3083,7 @@ function calculateTokenStats(targetDir, manifest) {
2208
3083
  const byFile = {};
2209
3084
  let totalTokens = 0;
2210
3085
  for (const [filePath, record] of Object.entries(manifest.files)) {
2211
- const fullPath = path3.join(targetDir, filePath);
3086
+ const fullPath = path4.join(targetDir, filePath);
2212
3087
  if (!fs3.existsSync(fullPath))
2213
3088
  continue;
2214
3089
  const content = fs3.readFileSync(fullPath, "utf-8");
@@ -2224,10 +3099,10 @@ function calculateTokenStats(targetDir, manifest) {
2224
3099
  lastCalculatedAt: new Date().toISOString()
2225
3100
  };
2226
3101
  }
2227
- var _filename, _dirname, MANIFEST_FILE = "guardian-manifest.json", FRAMEWORK_VERSION = "0.1.60", SCHEMA_VERSION = "0.1";
3102
+ var _filename, _dirname, MANIFEST_FILE = "guardian-manifest.json", FRAMEWORK_VERSION = "0.1.61", SCHEMA_VERSION = "0.1";
2228
3103
  var init_manifest = __esm(() => {
2229
3104
  _filename = fileURLToPath(import.meta.url);
2230
- _dirname = path3.dirname(_filename);
3105
+ _dirname = path4.dirname(_filename);
2231
3106
  });
2232
3107
 
2233
3108
  // src/lib/retry.ts
@@ -2303,7 +3178,7 @@ __export(exports_package, {
2303
3178
  bin: () => bin,
2304
3179
  author: () => author
2305
3180
  });
2306
- var name = "guardian-framework", version = "0.1.60", description = "Token-optimized agentic framework scaffolder with pi-first architecture", type = "module", main = "dist/exports.js", exports, types = "dist/exports.d.ts", bin, files, engines, scripts, publishConfig, pi, repository, homepage = "https://github.com/arman-jalili/guardian-framework#readme", bugs, dependencies, devDependencies, keywords, author = "Arman Wolkensteiner-Jalili", license = "MIT", package_default;
3181
+ var name = "guardian-framework", version = "0.1.61", description = "Token-optimized agentic framework scaffolder with pi-first architecture", type = "module", main = "dist/exports.js", exports, types = "dist/exports.d.ts", bin, files, engines, scripts, publishConfig, pi, repository, homepage = "https://github.com/arman-jalili/guardian-framework#readme", bugs, dependencies, devDependencies, keywords, author = "Arman Wolkensteiner-Jalili", license = "MIT", package_default;
2307
3182
  var init_package = __esm(() => {
2308
3183
  exports = {
2309
3184
  ".": {
@@ -2400,22 +3275,22 @@ var init_package = __esm(() => {
2400
3275
 
2401
3276
  // src/lib/templates.ts
2402
3277
  import * as fs4 from "fs";
2403
- import * as path4 from "path";
3278
+ import * as path5 from "path";
2404
3279
  import { fileURLToPath as fileURLToPath2 } from "url";
2405
3280
  function findTemplateDir() {
2406
3281
  const possiblePaths = [
2407
- path4.join(__dirname2, "..", "..", "templates"),
2408
- path4.join(__dirname2, "..", "..", "..", "templates"),
2409
- path4.resolve(path4.dirname(fs4.realpathSync(__filename2)), "..", "templates")
3282
+ path5.join(__dirname2, "..", "..", "templates"),
3283
+ path5.join(__dirname2, "..", "..", "..", "templates"),
3284
+ path5.resolve(path5.dirname(fs4.realpathSync(__filename2)), "..", "templates")
2410
3285
  ];
2411
- for (const p2 of possiblePaths) {
2412
- if (fs4.existsSync(p2) && isPathInPackage(p2)) {
2413
- return p2;
3286
+ for (const p3 of possiblePaths) {
3287
+ if (fs4.existsSync(p3) && isPathInPackage(p3)) {
3288
+ return p3;
2414
3289
  }
2415
3290
  }
2416
3291
  try {
2417
3292
  const pkgPath = __require.resolve("/Users/arman/project/guardian-framework/package.json");
2418
- const resolved = path4.join(path4.dirname(pkgPath), "templates");
3293
+ const resolved = path5.join(path5.dirname(pkgPath), "templates");
2419
3294
  if (isPathInPackage(resolved)) {
2420
3295
  return resolved;
2421
3296
  }
@@ -2424,9 +3299,9 @@ function findTemplateDir() {
2424
3299
  }
2425
3300
  function isPathInPackage(resolvedPath) {
2426
3301
  try {
2427
- const resolved = path4.resolve(resolvedPath);
2428
- const root = path4.resolve(PACKAGE_ROOT);
2429
- return resolved.startsWith(root + path4.sep) || resolved === root;
3302
+ const resolved = path5.resolve(resolvedPath);
3303
+ const root = path5.resolve(PACKAGE_ROOT);
3304
+ return resolved.startsWith(root + path5.sep) || resolved === root;
2430
3305
  } catch {
2431
3306
  return false;
2432
3307
  }
@@ -2439,11 +3314,11 @@ function getPiTemplateFiles() {
2439
3314
  function walk(dir) {
2440
3315
  const entries = fs4.readdirSync(dir, { withFileTypes: true });
2441
3316
  for (const entry of entries) {
2442
- const fullPath = path4.join(dir, entry.name);
3317
+ const fullPath = path5.join(dir, entry.name);
2443
3318
  if (entry.isDirectory()) {
2444
3319
  walk(fullPath);
2445
3320
  } else {
2446
- const relativePath = path4.relative(PI_TEMPLATE_DIR, fullPath);
3321
+ const relativePath = path5.relative(PI_TEMPLATE_DIR, fullPath);
2447
3322
  files2.push(relativePath);
2448
3323
  }
2449
3324
  }
@@ -2454,14 +3329,14 @@ function getPiTemplateFiles() {
2454
3329
  return files2;
2455
3330
  }
2456
3331
  function readTemplate(relativePath) {
2457
- const fullPath = path4.join(PI_TEMPLATE_DIR, relativePath);
3332
+ const fullPath = path5.join(PI_TEMPLATE_DIR, relativePath);
2458
3333
  if (!fs4.existsSync(fullPath)) {
2459
3334
  return { ok: false, error: new Error(`Template not found: ${relativePath}`) };
2460
3335
  }
2461
3336
  return tryCatch(() => fs4.readFileSync(fullPath, "utf-8"));
2462
3337
  }
2463
3338
  function readLanguagePatterns(language) {
2464
- const fullPath = path4.join(LANGUAGES_DIR, `${language}-patterns.md`);
3339
+ const fullPath = path5.join(LANGUAGES_DIR, `${language}-patterns.md`);
2465
3340
  if (!fs4.existsSync(fullPath)) {
2466
3341
  return { ok: false, error: new Error(`Language patterns not found: ${language}`) };
2467
3342
  }
@@ -2533,11 +3408,11 @@ function getDefaultContext(language, projectName, repoTool, buildTool, groupId)
2533
3408
  var __filename2, __dirname2, PACKAGE_ROOT, TEMPLATE_DIR, PI_TEMPLATE_DIR, LANGUAGES_DIR, SUPPORTED_LANGUAGES, AVAILABLE_VALIDATORS, AVAILABLE_WORKFLOWS, PROJECT_DEFAULTS, LANGUAGE_DEFAULTS, GRADLE_COMMANDS;
2534
3409
  var init_templates = __esm(() => {
2535
3410
  __filename2 = fileURLToPath2(import.meta.url);
2536
- __dirname2 = path4.dirname(__filename2);
2537
- PACKAGE_ROOT = path4.resolve(__dirname2, "..", "..");
3411
+ __dirname2 = path5.dirname(__filename2);
3412
+ PACKAGE_ROOT = path5.resolve(__dirname2, "..", "..");
2538
3413
  TEMPLATE_DIR = findTemplateDir();
2539
- PI_TEMPLATE_DIR = path4.join(TEMPLATE_DIR, "pi");
2540
- LANGUAGES_DIR = path4.join(TEMPLATE_DIR, "languages");
3414
+ PI_TEMPLATE_DIR = path5.join(TEMPLATE_DIR, "pi");
3415
+ LANGUAGES_DIR = path5.join(TEMPLATE_DIR, "languages");
2541
3416
  SUPPORTED_LANGUAGES = ["typescript", "rust", "python", "go", "java", "nextjs", "angular"];
2542
3417
  AVAILABLE_VALIDATORS = [
2543
3418
  "ci",
@@ -2752,17 +3627,17 @@ var require_visit = __commonJS((exports2) => {
2752
3627
  visit.BREAK = BREAK;
2753
3628
  visit.SKIP = SKIP;
2754
3629
  visit.REMOVE = REMOVE;
2755
- function visit_(key, node, visitor, path5) {
2756
- const ctrl = callVisitor(key, node, visitor, path5);
3630
+ function visit_(key, node, visitor, path6) {
3631
+ const ctrl = callVisitor(key, node, visitor, path6);
2757
3632
  if (identity.isNode(ctrl) || identity.isPair(ctrl)) {
2758
- replaceNode(key, path5, ctrl);
2759
- return visit_(key, ctrl, visitor, path5);
3633
+ replaceNode(key, path6, ctrl);
3634
+ return visit_(key, ctrl, visitor, path6);
2760
3635
  }
2761
3636
  if (typeof ctrl !== "symbol") {
2762
3637
  if (identity.isCollection(node)) {
2763
- path5 = Object.freeze(path5.concat(node));
3638
+ path6 = Object.freeze(path6.concat(node));
2764
3639
  for (let i2 = 0;i2 < node.items.length; ++i2) {
2765
- const ci = visit_(i2, node.items[i2], visitor, path5);
3640
+ const ci = visit_(i2, node.items[i2], visitor, path6);
2766
3641
  if (typeof ci === "number")
2767
3642
  i2 = ci - 1;
2768
3643
  else if (ci === BREAK)
@@ -2773,13 +3648,13 @@ var require_visit = __commonJS((exports2) => {
2773
3648
  }
2774
3649
  }
2775
3650
  } else if (identity.isPair(node)) {
2776
- path5 = Object.freeze(path5.concat(node));
2777
- const ck = visit_("key", node.key, visitor, path5);
3651
+ path6 = Object.freeze(path6.concat(node));
3652
+ const ck = visit_("key", node.key, visitor, path6);
2778
3653
  if (ck === BREAK)
2779
3654
  return BREAK;
2780
3655
  else if (ck === REMOVE)
2781
3656
  node.key = null;
2782
- const cv = visit_("value", node.value, visitor, path5);
3657
+ const cv = visit_("value", node.value, visitor, path6);
2783
3658
  if (cv === BREAK)
2784
3659
  return BREAK;
2785
3660
  else if (cv === REMOVE)
@@ -2800,17 +3675,17 @@ var require_visit = __commonJS((exports2) => {
2800
3675
  visitAsync.BREAK = BREAK;
2801
3676
  visitAsync.SKIP = SKIP;
2802
3677
  visitAsync.REMOVE = REMOVE;
2803
- async function visitAsync_(key, node, visitor, path5) {
2804
- const ctrl = await callVisitor(key, node, visitor, path5);
3678
+ async function visitAsync_(key, node, visitor, path6) {
3679
+ const ctrl = await callVisitor(key, node, visitor, path6);
2805
3680
  if (identity.isNode(ctrl) || identity.isPair(ctrl)) {
2806
- replaceNode(key, path5, ctrl);
2807
- return visitAsync_(key, ctrl, visitor, path5);
3681
+ replaceNode(key, path6, ctrl);
3682
+ return visitAsync_(key, ctrl, visitor, path6);
2808
3683
  }
2809
3684
  if (typeof ctrl !== "symbol") {
2810
3685
  if (identity.isCollection(node)) {
2811
- path5 = Object.freeze(path5.concat(node));
3686
+ path6 = Object.freeze(path6.concat(node));
2812
3687
  for (let i2 = 0;i2 < node.items.length; ++i2) {
2813
- const ci = await visitAsync_(i2, node.items[i2], visitor, path5);
3688
+ const ci = await visitAsync_(i2, node.items[i2], visitor, path6);
2814
3689
  if (typeof ci === "number")
2815
3690
  i2 = ci - 1;
2816
3691
  else if (ci === BREAK)
@@ -2821,13 +3696,13 @@ var require_visit = __commonJS((exports2) => {
2821
3696
  }
2822
3697
  }
2823
3698
  } else if (identity.isPair(node)) {
2824
- path5 = Object.freeze(path5.concat(node));
2825
- const ck = await visitAsync_("key", node.key, visitor, path5);
3699
+ path6 = Object.freeze(path6.concat(node));
3700
+ const ck = await visitAsync_("key", node.key, visitor, path6);
2826
3701
  if (ck === BREAK)
2827
3702
  return BREAK;
2828
3703
  else if (ck === REMOVE)
2829
3704
  node.key = null;
2830
- const cv = await visitAsync_("value", node.value, visitor, path5);
3705
+ const cv = await visitAsync_("value", node.value, visitor, path6);
2831
3706
  if (cv === BREAK)
2832
3707
  return BREAK;
2833
3708
  else if (cv === REMOVE)
@@ -2854,23 +3729,23 @@ var require_visit = __commonJS((exports2) => {
2854
3729
  }
2855
3730
  return visitor;
2856
3731
  }
2857
- function callVisitor(key, node, visitor, path5) {
3732
+ function callVisitor(key, node, visitor, path6) {
2858
3733
  if (typeof visitor === "function")
2859
- return visitor(key, node, path5);
3734
+ return visitor(key, node, path6);
2860
3735
  if (identity.isMap(node))
2861
- return visitor.Map?.(key, node, path5);
3736
+ return visitor.Map?.(key, node, path6);
2862
3737
  if (identity.isSeq(node))
2863
- return visitor.Seq?.(key, node, path5);
3738
+ return visitor.Seq?.(key, node, path6);
2864
3739
  if (identity.isPair(node))
2865
- return visitor.Pair?.(key, node, path5);
3740
+ return visitor.Pair?.(key, node, path6);
2866
3741
  if (identity.isScalar(node))
2867
- return visitor.Scalar?.(key, node, path5);
3742
+ return visitor.Scalar?.(key, node, path6);
2868
3743
  if (identity.isAlias(node))
2869
- return visitor.Alias?.(key, node, path5);
3744
+ return visitor.Alias?.(key, node, path6);
2870
3745
  return;
2871
3746
  }
2872
- function replaceNode(key, path5, node) {
2873
- const parent = path5[path5.length - 1];
3747
+ function replaceNode(key, path6, node) {
3748
+ const parent = path6[path6.length - 1];
2874
3749
  if (identity.isCollection(parent)) {
2875
3750
  parent.items[key] = node;
2876
3751
  } else if (identity.isPair(parent)) {
@@ -3429,10 +4304,10 @@ var require_Collection = __commonJS((exports2) => {
3429
4304
  var createNode = require_createNode();
3430
4305
  var identity = require_identity();
3431
4306
  var Node = require_Node();
3432
- function collectionFromPath(schema, path5, value) {
4307
+ function collectionFromPath(schema, path6, value) {
3433
4308
  let v = value;
3434
- for (let i2 = path5.length - 1;i2 >= 0; --i2) {
3435
- const k = path5[i2];
4309
+ for (let i2 = path6.length - 1;i2 >= 0; --i2) {
4310
+ const k = path6[i2];
3436
4311
  if (typeof k === "number" && Number.isInteger(k) && k >= 0) {
3437
4312
  const a2 = [];
3438
4313
  a2[k] = v;
@@ -3451,7 +4326,7 @@ var require_Collection = __commonJS((exports2) => {
3451
4326
  sourceObjects: new Map
3452
4327
  });
3453
4328
  }
3454
- var isEmptyPath = (path5) => path5 == null || typeof path5 === "object" && !!path5[Symbol.iterator]().next().done;
4329
+ var isEmptyPath = (path6) => path6 == null || typeof path6 === "object" && !!path6[Symbol.iterator]().next().done;
3455
4330
 
3456
4331
  class Collection extends Node.NodeBase {
3457
4332
  constructor(type2, schema) {
@@ -3472,11 +4347,11 @@ var require_Collection = __commonJS((exports2) => {
3472
4347
  copy.range = this.range.slice();
3473
4348
  return copy;
3474
4349
  }
3475
- addIn(path5, value) {
3476
- if (isEmptyPath(path5))
4350
+ addIn(path6, value) {
4351
+ if (isEmptyPath(path6))
3477
4352
  this.add(value);
3478
4353
  else {
3479
- const [key, ...rest] = path5;
4354
+ const [key, ...rest] = path6;
3480
4355
  const node = this.get(key, true);
3481
4356
  if (identity.isCollection(node))
3482
4357
  node.addIn(rest, value);
@@ -3486,8 +4361,8 @@ var require_Collection = __commonJS((exports2) => {
3486
4361
  throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);
3487
4362
  }
3488
4363
  }
3489
- deleteIn(path5) {
3490
- const [key, ...rest] = path5;
4364
+ deleteIn(path6) {
4365
+ const [key, ...rest] = path6;
3491
4366
  if (rest.length === 0)
3492
4367
  return this.delete(key);
3493
4368
  const node = this.get(key, true);
@@ -3496,8 +4371,8 @@ var require_Collection = __commonJS((exports2) => {
3496
4371
  else
3497
4372
  throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);
3498
4373
  }
3499
- getIn(path5, keepScalar) {
3500
- const [key, ...rest] = path5;
4374
+ getIn(path6, keepScalar) {
4375
+ const [key, ...rest] = path6;
3501
4376
  const node = this.get(key, true);
3502
4377
  if (rest.length === 0)
3503
4378
  return !keepScalar && identity.isScalar(node) ? node.value : node;
@@ -3512,15 +4387,15 @@ var require_Collection = __commonJS((exports2) => {
3512
4387
  return n3 == null || allowScalar && identity.isScalar(n3) && n3.value == null && !n3.commentBefore && !n3.comment && !n3.tag;
3513
4388
  });
3514
4389
  }
3515
- hasIn(path5) {
3516
- const [key, ...rest] = path5;
4390
+ hasIn(path6) {
4391
+ const [key, ...rest] = path6;
3517
4392
  if (rest.length === 0)
3518
4393
  return this.has(key);
3519
4394
  const node = this.get(key, true);
3520
4395
  return identity.isCollection(node) ? node.hasIn(rest) : false;
3521
4396
  }
3522
- setIn(path5, value) {
3523
- const [key, ...rest] = path5;
4397
+ setIn(path6, value) {
4398
+ const [key, ...rest] = path6;
3524
4399
  if (rest.length === 0) {
3525
4400
  this.set(key, value);
3526
4401
  } else {
@@ -4326,7 +5201,7 @@ var require_merge = __commonJS((exports2) => {
4326
5201
 
4327
5202
  // node_modules/yaml/dist/nodes/addPairToJSMap.js
4328
5203
  var require_addPairToJSMap = __commonJS((exports2) => {
4329
- var log = require_log();
5204
+ var log2 = require_log();
4330
5205
  var merge = require_merge();
4331
5206
  var stringify = require_stringify();
4332
5207
  var identity = require_identity();
@@ -4375,7 +5250,7 @@ var require_addPairToJSMap = __commonJS((exports2) => {
4375
5250
  let jsonStr = JSON.stringify(strKey);
4376
5251
  if (jsonStr.length > 40)
4377
5252
  jsonStr = jsonStr.substring(0, 36) + '..."';
4378
- log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);
5253
+ log2.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);
4379
5254
  ctx.mapKeyWarned = true;
4380
5255
  }
4381
5256
  return strKey;
@@ -5526,7 +6401,7 @@ var require_timestamp = __commonJS((exports2) => {
5526
6401
  const sign = str[0];
5527
6402
  const parts = sign === "-" || sign === "+" ? str.substring(1) : str;
5528
6403
  const num = (n3) => asBigInt ? BigInt(n3) : Number(n3);
5529
- const res = parts.replace(/_/g, "").split(":").reduce((res2, p2) => res2 * num(60) + num(p2), num(0));
6404
+ const res = parts.replace(/_/g, "").split(":").reduce((res2, p3) => res2 * num(60) + num(p3), num(0));
5530
6405
  return sign === "-" ? num(-1) * res : res;
5531
6406
  }
5532
6407
  function stringifySexagesimal(node) {
@@ -5584,15 +6459,15 @@ var require_timestamp = __commonJS((exports2) => {
5584
6459
  throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");
5585
6460
  const [, year, month, day, hour, minute, second] = match.map(Number);
5586
6461
  const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0;
5587
- let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);
6462
+ let date2 = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);
5588
6463
  const tz = match[8];
5589
6464
  if (tz && tz !== "Z") {
5590
6465
  let d = parseSexagesimal(tz, false);
5591
6466
  if (Math.abs(d) < 30)
5592
6467
  d *= 60;
5593
- date -= 60000 * d;
6468
+ date2 -= 60000 * d;
5594
6469
  }
5595
- return new Date(date);
6470
+ return new Date(date2);
5596
6471
  },
5597
6472
  stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\.000Z$/, "") ?? ""
5598
6473
  };
@@ -5740,7 +6615,7 @@ var require_Schema = __commonJS((exports2) => {
5740
6615
  var seq = require_seq();
5741
6616
  var string = require_string();
5742
6617
  var tags = require_tags();
5743
- var sortMapEntriesByKey = (a2, b2) => a2.key < b2.key ? -1 : a2.key > b2.key ? 1 : 0;
6618
+ var sortMapEntriesByKey = (a2, b3) => a2.key < b3.key ? -1 : a2.key > b3.key ? 1 : 0;
5744
6619
 
5745
6620
  class Schema {
5746
6621
  constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {
@@ -5913,9 +6788,9 @@ var require_Document = __commonJS((exports2) => {
5913
6788
  if (assertCollection(this.contents))
5914
6789
  this.contents.add(value);
5915
6790
  }
5916
- addIn(path5, value) {
6791
+ addIn(path6, value) {
5917
6792
  if (assertCollection(this.contents))
5918
- this.contents.addIn(path5, value);
6793
+ this.contents.addIn(path6, value);
5919
6794
  }
5920
6795
  createAlias(node, name2) {
5921
6796
  if (!node.anchor) {
@@ -5964,30 +6839,30 @@ var require_Document = __commonJS((exports2) => {
5964
6839
  delete(key) {
5965
6840
  return assertCollection(this.contents) ? this.contents.delete(key) : false;
5966
6841
  }
5967
- deleteIn(path5) {
5968
- if (Collection.isEmptyPath(path5)) {
6842
+ deleteIn(path6) {
6843
+ if (Collection.isEmptyPath(path6)) {
5969
6844
  if (this.contents == null)
5970
6845
  return false;
5971
6846
  this.contents = null;
5972
6847
  return true;
5973
6848
  }
5974
- return assertCollection(this.contents) ? this.contents.deleteIn(path5) : false;
6849
+ return assertCollection(this.contents) ? this.contents.deleteIn(path6) : false;
5975
6850
  }
5976
6851
  get(key, keepScalar) {
5977
6852
  return identity.isCollection(this.contents) ? this.contents.get(key, keepScalar) : undefined;
5978
6853
  }
5979
- getIn(path5, keepScalar) {
5980
- if (Collection.isEmptyPath(path5))
6854
+ getIn(path6, keepScalar) {
6855
+ if (Collection.isEmptyPath(path6))
5981
6856
  return !keepScalar && identity.isScalar(this.contents) ? this.contents.value : this.contents;
5982
- return identity.isCollection(this.contents) ? this.contents.getIn(path5, keepScalar) : undefined;
6857
+ return identity.isCollection(this.contents) ? this.contents.getIn(path6, keepScalar) : undefined;
5983
6858
  }
5984
6859
  has(key) {
5985
6860
  return identity.isCollection(this.contents) ? this.contents.has(key) : false;
5986
6861
  }
5987
- hasIn(path5) {
5988
- if (Collection.isEmptyPath(path5))
6862
+ hasIn(path6) {
6863
+ if (Collection.isEmptyPath(path6))
5989
6864
  return this.contents !== undefined;
5990
- return identity.isCollection(this.contents) ? this.contents.hasIn(path5) : false;
6865
+ return identity.isCollection(this.contents) ? this.contents.hasIn(path6) : false;
5991
6866
  }
5992
6867
  set(key, value) {
5993
6868
  if (this.contents == null) {
@@ -5996,13 +6871,13 @@ var require_Document = __commonJS((exports2) => {
5996
6871
  this.contents.set(key, value);
5997
6872
  }
5998
6873
  }
5999
- setIn(path5, value) {
6000
- if (Collection.isEmptyPath(path5)) {
6874
+ setIn(path6, value) {
6875
+ if (Collection.isEmptyPath(path6)) {
6001
6876
  this.contents = value;
6002
6877
  } else if (this.contents == null) {
6003
- this.contents = Collection.collectionFromPath(this.schema, Array.from(path5), value);
6878
+ this.contents = Collection.collectionFromPath(this.schema, Array.from(path6), value);
6004
6879
  } else if (assertCollection(this.contents)) {
6005
- this.contents.setIn(path5, value);
6880
+ this.contents.setIn(path6, value);
6006
6881
  }
6007
6882
  }
6008
6883
  setSchema(version2, options = {}) {
@@ -6335,7 +7210,7 @@ var require_util_map_includes = __commonJS((exports2) => {
6335
7210
  const { uniqueKeys } = ctx.options;
6336
7211
  if (uniqueKeys === false)
6337
7212
  return false;
6338
- const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a2, b2) => a2 === b2 || identity.isScalar(a2) && identity.isScalar(b2) && a2.value === b2.value;
7213
+ const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a2, b3) => a2 === b3 || identity.isScalar(a2) && identity.isScalar(b3) && a2.value === b3.value;
6339
7214
  return items.some((pair) => isEqual(pair.key, search));
6340
7215
  }
6341
7216
  exports2.mapIncludes = mapIncludes;
@@ -7899,9 +8774,9 @@ var require_cst_visit = __commonJS((exports2) => {
7899
8774
  visit.BREAK = BREAK;
7900
8775
  visit.SKIP = SKIP;
7901
8776
  visit.REMOVE = REMOVE;
7902
- visit.itemAtPath = (cst, path5) => {
8777
+ visit.itemAtPath = (cst, path6) => {
7903
8778
  let item = cst;
7904
- for (const [field, index] of path5) {
8779
+ for (const [field, index] of path6) {
7905
8780
  const tok = item?.[field];
7906
8781
  if (tok && "items" in tok) {
7907
8782
  item = tok.items[index];
@@ -7910,23 +8785,23 @@ var require_cst_visit = __commonJS((exports2) => {
7910
8785
  }
7911
8786
  return item;
7912
8787
  };
7913
- visit.parentCollection = (cst, path5) => {
7914
- const parent = visit.itemAtPath(cst, path5.slice(0, -1));
7915
- const field = path5[path5.length - 1][0];
8788
+ visit.parentCollection = (cst, path6) => {
8789
+ const parent = visit.itemAtPath(cst, path6.slice(0, -1));
8790
+ const field = path6[path6.length - 1][0];
7916
8791
  const coll = parent?.[field];
7917
8792
  if (coll && "items" in coll)
7918
8793
  return coll;
7919
8794
  throw new Error("Parent collection not found");
7920
8795
  };
7921
- function _visit(path5, item, visitor) {
7922
- let ctrl = visitor(item, path5);
8796
+ function _visit(path6, item, visitor) {
8797
+ let ctrl = visitor(item, path6);
7923
8798
  if (typeof ctrl === "symbol")
7924
8799
  return ctrl;
7925
8800
  for (const field of ["key", "value"]) {
7926
8801
  const token = item[field];
7927
8802
  if (token && "items" in token) {
7928
8803
  for (let i2 = 0;i2 < token.items.length; ++i2) {
7929
- const ci = _visit(Object.freeze(path5.concat([[field, i2]])), token.items[i2], visitor);
8804
+ const ci = _visit(Object.freeze(path6.concat([[field, i2]])), token.items[i2], visitor);
7930
8805
  if (typeof ci === "number")
7931
8806
  i2 = ci - 1;
7932
8807
  else if (ci === BREAK)
@@ -7937,10 +8812,10 @@ var require_cst_visit = __commonJS((exports2) => {
7937
8812
  }
7938
8813
  }
7939
8814
  if (typeof ctrl === "function" && field === "key")
7940
- ctrl = ctrl(item, path5);
8815
+ ctrl = ctrl(item, path6);
7941
8816
  }
7942
8817
  }
7943
- return typeof ctrl === "function" ? ctrl(item, path5) : ctrl;
8818
+ return typeof ctrl === "function" ? ctrl(item, path6) : ctrl;
7944
8819
  }
7945
8820
  exports2.visit = visit;
7946
8821
  });
@@ -9532,7 +10407,7 @@ var require_public_api = __commonJS((exports2) => {
9532
10407
  var composer = require_composer();
9533
10408
  var Document = require_Document();
9534
10409
  var errors = require_errors();
9535
- var log = require_log();
10410
+ var log2 = require_log();
9536
10411
  var identity = require_identity();
9537
10412
  var lineCounter = require_line_counter();
9538
10413
  var parser = require_parser();
@@ -9584,7 +10459,7 @@ var require_public_api = __commonJS((exports2) => {
9584
10459
  const doc = parseDocument(src, options);
9585
10460
  if (!doc)
9586
10461
  return null;
9587
- doc.warnings.forEach((warning) => log.warn(doc.options.logLevel, warning));
10462
+ doc.warnings.forEach((warning) => log2.warn(doc.options.logLevel, warning));
9588
10463
  if (doc.errors.length > 0) {
9589
10464
  if (doc.options.logLevel !== "silent")
9590
10465
  throw doc.errors[0];
@@ -9672,9 +10547,9 @@ var require_dist = __commonJS((exports2) => {
9672
10547
 
9673
10548
  // src/lib/workflow-config.ts
9674
10549
  import * as fs5 from "fs";
9675
- import * as path5 from "path";
10550
+ import * as path6 from "path";
9676
10551
  function loadWorkflowConfig(piDir) {
9677
- const agentsPath = path5.join(piDir, "agent", "AGENTS.md");
10552
+ const agentsPath = path6.join(piDir, "agent", "AGENTS.md");
9678
10553
  let frontMatter = {};
9679
10554
  if (fs5.existsSync(agentsPath)) {
9680
10555
  const content = fs5.readFileSync(agentsPath, "utf-8");
@@ -9910,7 +10785,7 @@ var init_workspace_hooks = () => {};
9910
10785
 
9911
10786
  // src/commands/generate.ts
9912
10787
  import * as fs7 from "fs";
9913
- import * as path6 from "path";
10788
+ import * as path7 from "path";
9914
10789
  async function runGenerate(targetDir, options) {
9915
10790
  if (!templatesExist()) {
9916
10791
  outro("Templates not found. Ensure templates/pi/ exists in package.");
@@ -9929,7 +10804,7 @@ async function runGenerate(targetDir, options) {
9929
10804
  const s = spinner();
9930
10805
  s.start("Generating exports from .pi/ source...");
9931
10806
  try {
9932
- const piDir = path6.join(targetDir, ".pi");
10807
+ const piDir = path7.join(targetDir, ".pi");
9933
10808
  const config = loadWorkflowConfig(piDir);
9934
10809
  const onConflict = config.generate.on_conflict;
9935
10810
  const modifiedExports = detectExternallyModifiedExports(targetDir, manifest, toolsToGenerate, onConflict);
@@ -9950,7 +10825,7 @@ Run with --force to overwrite.`);
9950
10825
  console.log();
9951
10826
  }
9952
10827
  }
9953
- const workspacePath = path6.join(piDir, "workspaces");
10828
+ const workspacePath = path7.join(piDir, "workspaces");
9954
10829
  const wsResult = await ensureWorkspace(workspacePath, config.workspace.hooks);
9955
10830
  if (!wsResult.ok) {
9956
10831
  s.stop();
@@ -9965,7 +10840,7 @@ Run with --force to overwrite.`);
9965
10840
  }
9966
10841
  const generatedFiles = {};
9967
10842
  for (const tool of toolsToGenerate) {
9968
- const exportDir = tool === "pi" ? path6.join(targetDir, ".agents") : path6.join(targetDir, `.${tool}`);
10843
+ const exportDir = tool === "pi" ? path7.join(targetDir, ".agents") : path7.join(targetDir, `.${tool}`);
9969
10844
  if (options.dryRun) {
9970
10845
  if (s)
9971
10846
  s.stop(`Dry run: Would generate .${tool}/ from .pi/`);
@@ -10016,31 +10891,31 @@ Next steps:
10016
10891
  function generateExport(exportDir, tool, piDir, manifest, generatedFiles) {
10017
10892
  const structure = getExportStructure(tool);
10018
10893
  for (const dir of structure) {
10019
- fs7.mkdirSync(path6.join(exportDir, dir), { recursive: true });
10894
+ fs7.mkdirSync(path7.join(exportDir, dir), { recursive: true });
10020
10895
  }
10021
10896
  const mappings = getExportMappings(tool);
10022
10897
  for (const mapping of mappings) {
10023
- const sourcePath = path6.join(piDir, mapping.source);
10024
- const targetPath = path6.join(exportDir, mapping.dest);
10898
+ const sourcePath = path7.join(piDir, mapping.source);
10899
+ const targetPath = path7.join(exportDir, mapping.dest);
10025
10900
  if (!fs7.existsSync(sourcePath)) {
10026
10901
  continue;
10027
10902
  }
10028
10903
  const content = fs7.readFileSync(sourcePath, "utf-8");
10029
10904
  const transformed = mapping.transform ? mapping.transform(content) : content;
10030
10905
  const withHeader = addCanonicalHeader(transformed, mapping.source);
10031
- fs7.mkdirSync(path6.dirname(targetPath), { recursive: true });
10906
+ fs7.mkdirSync(path7.dirname(targetPath), { recursive: true });
10032
10907
  fs7.writeFileSync(targetPath, withHeader, "utf-8");
10033
10908
  const manifestPath = `.${tool}/${mapping.dest}`;
10034
10909
  generatedFiles[manifestPath] = { category: "generated", content: withHeader };
10035
10910
  }
10036
- const scriptsDir = path6.join(piDir, "scripts");
10911
+ const scriptsDir = path7.join(piDir, "scripts");
10037
10912
  if (fs7.existsSync(scriptsDir)) {
10038
- const scriptsTargetDir = path6.join(exportDir, "scripts");
10913
+ const scriptsTargetDir = path7.join(exportDir, "scripts");
10039
10914
  fs7.mkdirSync(scriptsTargetDir, { recursive: true });
10040
10915
  for (const validator of manifest.validators) {
10041
10916
  const scriptFile = `validate-${normalizeValidatorName(validator)}.sh`;
10042
- const sourceScript = path6.join(scriptsDir, scriptFile);
10043
- const targetScript = path6.join(scriptsTargetDir, scriptFile);
10917
+ const sourceScript = path7.join(scriptsDir, scriptFile);
10918
+ const targetScript = path7.join(scriptsTargetDir, scriptFile);
10044
10919
  if (fs7.existsSync(sourceScript)) {
10045
10920
  const scriptContent = fs7.readFileSync(sourceScript, "utf-8");
10046
10921
  fs7.writeFileSync(targetScript, scriptContent, "utf-8");
@@ -10050,9 +10925,9 @@ function generateExport(exportDir, tool, piDir, manifest, generatedFiles) {
10050
10925
  };
10051
10926
  }
10052
10927
  }
10053
- const cacheScript = path6.join(scriptsDir, "validation-cache.sh");
10928
+ const cacheScript = path7.join(scriptsDir, "validation-cache.sh");
10054
10929
  if (fs7.existsSync(cacheScript)) {
10055
- const targetCacheScript = path6.join(scriptsTargetDir, "validation-cache.sh");
10930
+ const targetCacheScript = path7.join(scriptsTargetDir, "validation-cache.sh");
10056
10931
  const cacheContent = fs7.readFileSync(cacheScript, "utf-8");
10057
10932
  fs7.writeFileSync(targetCacheScript, cacheContent, "utf-8");
10058
10933
  generatedFiles[`.${tool}/scripts/validation-cache.sh`] = {
@@ -10061,7 +10936,7 @@ function generateExport(exportDir, tool, piDir, manifest, generatedFiles) {
10061
10936
  };
10062
10937
  }
10063
10938
  }
10064
- const readmePath = path6.join(exportDir, "README.md");
10939
+ const readmePath = path7.join(exportDir, "README.md");
10065
10940
  const readmeContent = generateExportReadme(tool);
10066
10941
  fs7.writeFileSync(readmePath, readmeContent, "utf-8");
10067
10942
  generatedFiles[`.${tool}/README.md`] = {
@@ -10098,13 +10973,13 @@ function detectExternallyModifiedExports(targetDir, manifest, toolsToGenerate, o
10098
10973
  return [];
10099
10974
  const modified = [];
10100
10975
  for (const tool of toolsToGenerate) {
10101
- const exportDir = path6.join(targetDir, `.${tool}`);
10976
+ const exportDir = path7.join(targetDir, `.${tool}`);
10102
10977
  if (!fs7.existsSync(exportDir))
10103
10978
  continue;
10104
10979
  for (const [filePath, record] of Object.entries(manifest.files)) {
10105
10980
  if (!filePath.startsWith(`.${tool}/`))
10106
10981
  continue;
10107
- const fullPath = path6.join(targetDir, filePath);
10982
+ const fullPath = path7.join(targetDir, filePath);
10108
10983
  if (!fs7.existsSync(fullPath))
10109
10984
  continue;
10110
10985
  const currentContent = fs7.readFileSync(fullPath, "utf-8");
@@ -10130,7 +11005,7 @@ __export(exports_update, {
10130
11005
  runUpdate: () => runUpdate
10131
11006
  });
10132
11007
  import * as fs10 from "fs";
10133
- import * as path8 from "path";
11008
+ import * as path9 from "path";
10134
11009
  async function runUpdate(targetDir, options) {
10135
11010
  if (!templatesExist()) {
10136
11011
  outro("Templates not found. Ensure templates/pi/ exists in package.");
@@ -10185,7 +11060,7 @@ function analyzeChanges(targetDir, manifest, templateFiles, context, options) {
10185
11060
  for (const [filePath, record] of Object.entries(manifest.files)) {
10186
11061
  if (!filePath.startsWith(".pi/"))
10187
11062
  continue;
10188
- const fullPath = path8.join(targetDir, filePath);
11063
+ const fullPath = path9.join(targetDir, filePath);
10189
11064
  if (!templatePaths.has(filePath.replace(".pi/", ""))) {
10190
11065
  changes.push({
10191
11066
  path: filePath,
@@ -10291,13 +11166,13 @@ function applyChanges(targetDir, manifest, changes, context, options) {
10291
11166
  return result;
10292
11167
  }
10293
11168
  function addFile(targetDir, manifest, filePath, context) {
10294
- const fullPath = path8.join(targetDir, filePath);
11169
+ const fullPath = path9.join(targetDir, filePath);
10295
11170
  const relativePath = filePath.replace(".pi/", "");
10296
11171
  const tmplResult = readTemplate(relativePath);
10297
11172
  if (!tmplResult.ok)
10298
11173
  return;
10299
11174
  const content = renderTemplate(tmplResult.value, context);
10300
- fs10.mkdirSync(path8.dirname(fullPath), { recursive: true });
11175
+ fs10.mkdirSync(path9.dirname(fullPath), { recursive: true });
10301
11176
  fs10.writeFileSync(fullPath, content, "utf-8");
10302
11177
  manifest.files[filePath] = {
10303
11178
  category: categorizeFile(relativePath),
@@ -10306,13 +11181,13 @@ function addFile(targetDir, manifest, filePath, context) {
10306
11181
  };
10307
11182
  }
10308
11183
  function updateFile(targetDir, manifest, filePath, context) {
10309
- const fullPath = path8.join(targetDir, filePath);
11184
+ const fullPath = path9.join(targetDir, filePath);
10310
11185
  const relativePath = filePath.replace(".pi/", "");
10311
11186
  const tmplResult = readTemplate(relativePath);
10312
11187
  if (!tmplResult.ok)
10313
11188
  return;
10314
11189
  const content = renderTemplate(tmplResult.value, context);
10315
- fs10.mkdirSync(path8.dirname(fullPath), { recursive: true });
11190
+ fs10.mkdirSync(path9.dirname(fullPath), { recursive: true });
10316
11191
  fs10.writeFileSync(fullPath, content, "utf-8");
10317
11192
  manifest.files[filePath] = {
10318
11193
  category: categorizeFile(relativePath),
@@ -10326,7 +11201,7 @@ function preserveFile(targetDir, manifest, filePath) {
10326
11201
  }
10327
11202
  }
10328
11203
  function mergeFrontMatterFile(targetDir, manifest, filePath, context) {
10329
- const fullPath = path8.join(targetDir, filePath);
11204
+ const fullPath = path9.join(targetDir, filePath);
10330
11205
  const relativePath = filePath.replace(".pi/", "");
10331
11206
  const userContent = fs10.readFileSync(fullPath, "utf-8");
10332
11207
  const tmplResult = readTemplate(relativePath);
@@ -10366,11 +11241,11 @@ function isFrontMatterFile(userContent, newContent) {
10366
11241
  `);
10367
11242
  }
10368
11243
  function regenerateAllExports(targetDir, manifest) {
10369
- const piDir = path8.join(targetDir, ".pi");
11244
+ const piDir = path9.join(targetDir, ".pi");
10370
11245
  for (const tool of manifest.tools) {
10371
11246
  if (tool === "pi")
10372
11247
  continue;
10373
- const exportDir = path8.join(targetDir, `.${tool}`);
11248
+ const exportDir = path9.join(targetDir, `.${tool}`);
10374
11249
  generateExport(exportDir, tool, piDir, manifest, {});
10375
11250
  }
10376
11251
  }
@@ -10507,13 +11382,13 @@ __export(exports_trust, {
10507
11382
  });
10508
11383
  import * as crypto3 from "crypto";
10509
11384
  import * as fs17 from "fs";
10510
- import * as path15 from "path";
11385
+ import * as path16 from "path";
10511
11386
  function hashFile2(filePath) {
10512
11387
  const content = fs17.readFileSync(filePath, "utf-8");
10513
11388
  return crypto3.createHash("sha256").update(content).digest("hex");
10514
11389
  }
10515
11390
  function loadTrustFile(cwd) {
10516
- const trustPath = path15.join(cwd, TRUST_FILE);
11391
+ const trustPath = path16.join(cwd, TRUST_FILE);
10517
11392
  if (!fs17.existsSync(trustPath))
10518
11393
  return [];
10519
11394
  try {
@@ -10523,9 +11398,9 @@ function loadTrustFile(cwd) {
10523
11398
  }
10524
11399
  }
10525
11400
  function saveTrustFile(cwd, records) {
10526
- const trustPath = path15.join(cwd, TRUST_FILE);
11401
+ const trustPath = path16.join(cwd, TRUST_FILE);
10527
11402
  const tmpPath = `${trustPath}.tmp`;
10528
- fs17.mkdirSync(path15.dirname(trustPath), { recursive: true });
11403
+ fs17.mkdirSync(path16.dirname(trustPath), { recursive: true });
10529
11404
  fs17.writeFileSync(tmpPath, JSON.stringify(records, null, 2), "utf-8");
10530
11405
  fs17.renameSync(tmpPath, trustPath);
10531
11406
  }
@@ -10585,7 +11460,7 @@ __export(exports_integrity, {
10585
11460
  });
10586
11461
  import * as crypto4 from "crypto";
10587
11462
  import * as fs18 from "fs";
10588
- import * as path16 from "path";
11463
+ import * as path17 from "path";
10589
11464
  function hashFile3(filePath) {
10590
11465
  const content = fs18.readFileSync(filePath, "utf-8");
10591
11466
  return crypto4.createHash("sha256").update(content).digest("hex");
@@ -10593,7 +11468,7 @@ function hashFile3(filePath) {
10593
11468
  function hashPathFor(filePath) {
10594
11469
  const rel = filePath.replace(/^\.\//, "");
10595
11470
  const hashName = rel.replace(/[/\\]/g, "_") + HASH_EXT;
10596
- return path16.join(HASH_DIR, hashName);
11471
+ return path17.join(HASH_DIR, hashName);
10597
11472
  }
10598
11473
  function storeHash(filePath) {
10599
11474
  const hash = hashFile3(filePath);
@@ -10635,22 +11510,22 @@ function verifyFile(filePath) {
10635
11510
  }
10636
11511
  function verifyDirectory(dirPath) {
10637
11512
  const results = [];
10638
- const hashDir = path16.join(dirPath, HASH_DIR);
11513
+ const hashDir = path17.join(dirPath, HASH_DIR);
10639
11514
  if (fs18.existsSync(hashDir)) {
10640
11515
  const hashFiles = fs18.readdirSync(hashDir).filter((f2) => f2.endsWith(HASH_EXT));
10641
11516
  for (const hf of hashFiles) {
10642
- const hashPath = path16.join(hashDir, hf);
11517
+ const hashPath = path17.join(hashDir, hf);
10643
11518
  const content = fs18.readFileSync(hashPath, "utf-8");
10644
11519
  const filePath = content.split(" ")[1]?.trim() ?? hf.replace(HASH_EXT, "");
10645
- const fullPath = path16.isAbsolute(filePath) ? filePath : path16.join(dirPath, filePath);
11520
+ const fullPath = path17.isAbsolute(filePath) ? filePath : path17.join(dirPath, filePath);
10646
11521
  results.push(verifyFile(fullPath));
10647
11522
  }
10648
11523
  }
10649
- const manifestPath = path16.join(dirPath, "guardian-manifest.json");
11524
+ const manifestPath = path17.join(dirPath, "guardian-manifest.json");
10650
11525
  if (fs18.existsSync(manifestPath)) {
10651
11526
  const manifest = JSON.parse(fs18.readFileSync(manifestPath, "utf-8"));
10652
11527
  for (const filePath of Object.keys(manifest.files ?? {})) {
10653
- const fullPath = path16.join(dirPath, filePath);
11528
+ const fullPath = path17.join(dirPath, filePath);
10654
11529
  const alreadyChecked = results.some((r2) => r2.filePath === fullPath);
10655
11530
  if (!alreadyChecked) {
10656
11531
  results.push(verifyFile(fullPath));
@@ -10681,18 +11556,19 @@ var HASH_DIR = ".guardian", HASH_EXT = ".sha256";
10681
11556
  var init_integrity = () => {};
10682
11557
 
10683
11558
  // src/index.ts
11559
+ init_dist4();
10684
11560
  import { execFileSync } from "child_process";
10685
11561
  import { parseArgs } from "util";
10686
11562
 
10687
11563
  // src/commands/domain.ts
10688
11564
  init_dist4();
10689
11565
  import * as fs2 from "fs";
10690
- import * as path2 from "path";
11566
+ import * as path3 from "path";
10691
11567
 
10692
11568
  // src/lib/domain-explorer.ts
10693
11569
  import * as crypto from "crypto";
10694
11570
  import * as fs from "fs";
10695
- import * as path from "path";
11571
+ import * as path2 from "path";
10696
11572
  var __dirname = "/Users/arman/project/guardian-framework/src/lib", __filename = "/Users/arman/project/guardian-framework/src/lib/domain-explorer.ts";
10697
11573
  var MAX_BUSINESS_CONTEXT_LENGTH = 5000;
10698
11574
  function sanitizeBusinessContext(context) {
@@ -11071,14 +11947,14 @@ async function exploreDomain(context, options) {
11071
11947
  const projectDir = options?.projectDir ?? process.cwd();
11072
11948
  const dryRun = options?.dryRun ?? false;
11073
11949
  const sessionId = options?.sessionId ?? crypto.randomUUID();
11074
- const explorationDir = path.join(projectDir, ".pi", "domain", "exploration");
11950
+ const explorationDir = path2.join(projectDir, ".pi", "domain", "exploration");
11075
11951
  if (!fs.existsSync(explorationDir)) {
11076
11952
  fs.mkdirSync(explorationDir, { recursive: true });
11077
11953
  }
11078
11954
  let lang = options?.language;
11079
11955
  if (!lang) {
11080
11956
  try {
11081
- const manifestPath = path.join(projectDir, "guardian-manifest.json");
11957
+ const manifestPath = path2.join(projectDir, "guardian-manifest.json");
11082
11958
  if (fs.existsSync(manifestPath)) {
11083
11959
  const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
11084
11960
  if (manifest.language)
@@ -11101,7 +11977,7 @@ async function exploreDomain(context, options) {
11101
11977
  prompt
11102
11978
  ].join(`
11103
11979
  `);
11104
- const promptPath = path.join(explorationDir, `${sessionId}.prompt.md`);
11980
+ const promptPath = path2.join(explorationDir, `${sessionId}.prompt.md`);
11105
11981
  if (!dryRun) {
11106
11982
  fs.writeFileSync(promptPath, promptContent, "utf-8");
11107
11983
  console.error("[domain-explore] Prompt written to: ${promptPath}");
@@ -11134,7 +12010,7 @@ function answerExploration(sessionId, responseJson, options) {
11134
12010
  }
11135
12011
  function readExplorationSession(sessionId, projectDir) {
11136
12012
  const root = projectDir ?? process.cwd();
11137
- const filePath = path.join(root, ".pi", "domain", "exploration", `${sessionId}.md`);
12013
+ const filePath = path2.join(root, ".pi", "domain", "exploration", `${sessionId}.md`);
11138
12014
  if (!fs.existsSync(filePath)) {
11139
12015
  return null;
11140
12016
  }
@@ -11247,7 +12123,7 @@ function scaffoldFromExploration(sessionId, options) {
11247
12123
  let lang = options?.language;
11248
12124
  if (!lang) {
11249
12125
  try {
11250
- const manifestPath = path.join(projectDir, "guardian-manifest.json");
12126
+ const manifestPath = path2.join(projectDir, "guardian-manifest.json");
11251
12127
  if (fs.existsSync(manifestPath)) {
11252
12128
  const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
11253
12129
  if (manifest.language)
@@ -11261,7 +12137,7 @@ function scaffoldFromExploration(sessionId, options) {
11261
12137
  throw new Error(`Exploration session not found: ${sessionId}`);
11262
12138
  }
11263
12139
  const result = sessionResult;
11264
- const modulesDir = path.join(projectDir, ".pi", "architecture", "modules");
12140
+ const modulesDir = path2.join(projectDir, ".pi", "architecture", "modules");
11265
12141
  const modules = [];
11266
12142
  const warnings = [];
11267
12143
  const timestamp = new Date().toISOString().split("T")[0];
@@ -11314,7 +12190,7 @@ function scaffoldFromExploration(sessionId, options) {
11314
12190
  for (const bc of result.boundedContexts) {
11315
12191
  const moduleName = contextToModule(bc.name);
11316
12192
  const fileName = `${moduleName}.md`;
11317
- const filePath = path.join(modulesDir, fileName);
12193
+ const filePath = path2.join(modulesDir, fileName);
11318
12194
  const contextEntities = entitiesByContext[bc.name] || [];
11319
12195
  const contextEvents = result.domainEvents.filter((ev) => ev.context === bc.name);
11320
12196
  const contextTerms = result.ubiquitousLanguage.filter((t2) => t2.boundedContext === bc.name);
@@ -11759,13 +12635,13 @@ ${bc.description}
11759
12635
  }
11760
12636
  function loadExplorationTemplate() {
11761
12637
  const possiblePaths = [
11762
- path.join(__dirname, "..", "..", "templates", "pi", "domain", "exploration.md"),
11763
- path.join(__dirname, "..", "..", "..", "templates", "pi", "domain", "exploration.md"),
11764
- path.resolve(path.dirname(fs.realpathSync(__filename)), "..", "..", "..", "templates", "pi", "domain", "exploration.md")
12638
+ path2.join(__dirname, "..", "..", "templates", "pi", "domain", "exploration.md"),
12639
+ path2.join(__dirname, "..", "..", "..", "templates", "pi", "domain", "exploration.md"),
12640
+ path2.resolve(path2.dirname(fs.realpathSync(__filename)), "..", "..", "..", "templates", "pi", "domain", "exploration.md")
11765
12641
  ];
11766
- for (const p2 of possiblePaths) {
11767
- if (fs.existsSync(p2)) {
11768
- return fs.readFileSync(p2, "utf-8");
12642
+ for (const p3 of possiblePaths) {
12643
+ if (fs.existsSync(p3)) {
12644
+ return fs.readFileSync(p3, "utf-8");
11769
12645
  }
11770
12646
  }
11771
12647
  throw new Error("Exploration template not found in templates/pi/domain/exploration.md");
@@ -11857,7 +12733,7 @@ function parseTableRow(row) {
11857
12733
  var GLOSSARY_TABLE_HEADER = `| Term | Definition | Bounded Context | Aliases/Synonyms | Examples |
11858
12734
  |------|-----------|----------------|-----------------|---------|`;
11859
12735
  function renderGlossaryTable(terms) {
11860
- const sorted = [...terms].sort((a2, b2) => a2.term.localeCompare(b2.term));
12736
+ const sorted = [...terms].sort((a2, b3) => a2.term.localeCompare(b3.term));
11861
12737
  const rows = sorted.map((t2) => {
11862
12738
  const aliasesStr = t2.aliases.length > 0 ? t2.aliases.join(", ") : "";
11863
12739
  return `| ${t2.term} | ${t2.definition} | ${t2.boundedContext} | ${aliasesStr} | ${t2.examples} |`;
@@ -11867,14 +12743,14 @@ function renderGlossaryTable(terms) {
11867
12743
  }
11868
12744
  function updateUbiquitousLanguage(newTerms, options = {}) {
11869
12745
  const projectDir = options.projectDir ?? process.cwd();
11870
- const glossaryPath = options.glossaryPath ?? path.join(projectDir, ".pi", "domain", "ubiquitous-language.md");
12746
+ const glossaryPath = options.glossaryPath ?? path2.join(projectDir, ".pi", "domain", "ubiquitous-language.md");
11871
12747
  const dryRun = options.dryRun ?? false;
11872
12748
  const existingTerms = parseUbiquitousLanguageGlossary(glossaryPath);
11873
12749
  const existingNames = new Set(existingTerms.map((t2) => t2.term.toLowerCase()));
11874
12750
  const uniqueNewTerms = newTerms.filter((t2) => !existingNames.has(t2.term.toLowerCase()));
11875
12751
  const skipped = newTerms.length - uniqueNewTerms.length;
11876
12752
  const mergedTerms = [...existingTerms, ...uniqueNewTerms];
11877
- mergedTerms.sort((a2, b2) => a2.term.localeCompare(b2.term));
12753
+ mergedTerms.sort((a2, b3) => a2.term.localeCompare(b3.term));
11878
12754
  const addedLines = uniqueNewTerms.map((t2) => ` + ${t2.term}`);
11879
12755
  const diff = addedLines.length > 0 ? `Would add ${addedLines.length} term(s):
11880
12756
  ${addedLines.join(`
@@ -11921,7 +12797,7 @@ ${originalForAppend.slice(addingSectionIndex)}`;
11921
12797
  }
11922
12798
  }
11923
12799
  const tempPath = `${glossaryPath}.tmp`;
11924
- fs.mkdirSync(path.dirname(glossaryPath), { recursive: true });
12800
+ fs.mkdirSync(path2.dirname(glossaryPath), { recursive: true });
11925
12801
  fs.writeFileSync(tempPath, fullContent, "utf-8");
11926
12802
  fs.renameSync(tempPath, glossaryPath);
11927
12803
  return {
@@ -11933,8 +12809,8 @@ ${originalForAppend.slice(addingSectionIndex)}`;
11933
12809
  }
11934
12810
  function writeExplorationSession(result, projectDir, dryRun) {
11935
12811
  const root = projectDir ?? process.cwd();
11936
- const explorationDir = path.join(root, ".pi", "domain", "exploration");
11937
- const outputPath = path.join(explorationDir, `${result.sessionId}.md`);
12812
+ const explorationDir = path2.join(root, ".pi", "domain", "exploration");
12813
+ const outputPath = path2.join(explorationDir, `${result.sessionId}.md`);
11938
12814
  const content = renderExplorationTemplate(result);
11939
12815
  if (dryRun) {
11940
12816
  return `[dry-run] Would write to ${outputPath}
@@ -12022,7 +12898,7 @@ async function runAnswer(targetDir, sessionId, responseFile, options) {
12022
12898
  return;
12023
12899
  }
12024
12900
  try {
12025
- const responsePath = path2.resolve(targetDir, responseFile);
12901
+ const responsePath = path3.resolve(targetDir, responseFile);
12026
12902
  if (!fs2.existsSync(responsePath)) {
12027
12903
  outro(`Response file not found: ${responsePath}`);
12028
12904
  return;
@@ -12084,7 +12960,7 @@ async function runScaffold(targetDir, sessionId, options) {
12084
12960
  }
12085
12961
  }
12086
12962
  function runList(targetDir) {
12087
- const explorationDir = path2.join(targetDir, ".pi", "domain", "exploration");
12963
+ const explorationDir = path3.join(targetDir, ".pi", "domain", "exploration");
12088
12964
  if (!fs2.existsSync(explorationDir)) {
12089
12965
  outro("No exploration sessions found");
12090
12966
  return;
@@ -12097,12 +12973,12 @@ function runList(targetDir) {
12097
12973
  }
12098
12974
  console.log("Exploration sessions:");
12099
12975
  for (const file of files) {
12100
- const filePath = path2.join(explorationDir, file);
12976
+ const filePath = path3.join(explorationDir, file);
12101
12977
  const stats = fs2.statSync(filePath);
12102
12978
  const sessionId = file.replace(".md", "");
12103
12979
  const modified = stats.mtime.toISOString().split("T")[0];
12104
12980
  const size = stats.size;
12105
- const promptFile = path2.join(explorationDir, `${sessionId}.prompt.md`);
12981
+ const promptFile = path3.join(explorationDir, `${sessionId}.prompt.md`);
12106
12982
  const status = fs2.existsSync(promptFile) ? "awaiting-response" : "complete";
12107
12983
  console.log(` ${sessionId.padEnd(40)}${String(size).padStart(6)}B ${modified} [${status}]`);
12108
12984
  }
@@ -12121,7 +12997,7 @@ import * as nodePath from "path";
12121
12997
  // src/lib/tracking.ts
12122
12998
  import * as fs8 from "fs";
12123
12999
  import * as os from "os";
12124
- import * as path7 from "path";
13000
+ import * as path8 from "path";
12125
13001
  var DEFAULT_PRICING = {
12126
13002
  openai: { name: "OpenAI", inputPerM: 5, outputPerM: 15 },
12127
13003
  anthropic: { name: "Anthropic", inputPerM: 3, outputPerM: 15 },
@@ -12130,11 +13006,11 @@ var DEFAULT_PRICING = {
12130
13006
  };
12131
13007
  var HISTORY_DAYS = 90;
12132
13008
  function getDbPath() {
12133
- const dataDir = path7.join(os.homedir(), ".local", "share", "guardian");
13009
+ const dataDir = path8.join(os.homedir(), ".local", "share", "guardian");
12134
13010
  if (!fs8.existsSync(dataDir)) {
12135
13011
  fs8.mkdirSync(dataDir, { recursive: true });
12136
13012
  }
12137
- return path7.join(dataDir, "history.json");
13013
+ return path8.join(dataDir, "history.json");
12138
13014
  }
12139
13015
  function loadRecords() {
12140
13016
  const dbPath = getDbPath();
@@ -12200,15 +13076,15 @@ function getStats(sinceDays = 30) {
12200
13076
  for (const r2 of recent) {
12201
13077
  validatorCounts.set(r2.validator, (validatorCounts.get(r2.validator) ?? 0) + 1);
12202
13078
  }
12203
- const topValidators = [...validatorCounts.entries()].sort((a2, b2) => b2[1] - a2[1]).slice(0, 10).map(([validator, count]) => ({ validator, count }));
13079
+ const topValidators = [...validatorCounts.entries()].sort((a2, b3) => b3[1] - a2[1]).slice(0, 10).map(([validator, count]) => ({ validator, count }));
12204
13080
  const dailyMap = new Map;
12205
13081
  for (const r2 of recent) {
12206
- const date = r2.timestamp.split("T")[0];
12207
- const entry = dailyMap.get(date) ?? { tokens: 0, usd: 0 };
13082
+ const date2 = r2.timestamp.split("T")[0];
13083
+ const entry = dailyMap.get(date2) ?? { tokens: 0, usd: 0 };
12208
13084
  entry.tokens += r2.savedTokens;
12209
- dailyMap.set(date, entry);
13085
+ dailyMap.set(date2, entry);
12210
13086
  }
12211
- const dailyBreakdown = [...dailyMap.entries()].sort((a2, b2) => a2[0].localeCompare(b2[0])).map(([date, { tokens, usd }]) => ({ date, tokens, usd: estimateUsdSaved(tokens) }));
13087
+ const dailyBreakdown = [...dailyMap.entries()].sort((a2, b3) => a2[0].localeCompare(b3[0])).map(([date2, { tokens, usd }]) => ({ date: date2, tokens, usd: estimateUsdSaved(tokens) }));
12212
13088
  return {
12213
13089
  totalCommands,
12214
13090
  totalInputTokens: totalInput,
@@ -12351,7 +13227,7 @@ ${Object.entries(exportSyncStatus).map(([tool, synced]) => `\u2502 .${tool.padEn
12351
13227
  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
12352
13228
 
12353
13229
  ${modifiedFiles.length > 0 ? `Modified files:
12354
- ${modifiedFiles.map(([p2]) => p2).join(`
13230
+ ${modifiedFiles.map(([p3]) => p3).join(`
12355
13231
  `)}` : "No modified files."}
12356
13232
 
12357
13233
  ${Object.entries(exportSyncStatus).some(([_2, s]) => !s) ? "\u26A0\uFE0F Some exports out of sync. Run: guardian-framework generate" : "\u2705 All exports in sync."}
@@ -12362,7 +13238,7 @@ ${Object.entries(exportSyncStatus).some(([_2, s]) => !s) ? "\u26A0\uFE0F Some e
12362
13238
  init_dist4();
12363
13239
  init_manifest();
12364
13240
  import * as fs11 from "fs";
12365
- import * as path9 from "path";
13241
+ import * as path10 from "path";
12366
13242
 
12367
13243
  // src/lib/prompts.ts
12368
13244
  init_dist4();
@@ -12636,25 +13512,25 @@ async function scaffoldFramework(targetDir, options) {
12636
13512
  templateContext: context
12637
13513
  });
12638
13514
  const scaffoldedFiles = {};
12639
- const piDir = path9.join(targetDir, PI_DIR);
13515
+ const piDir = path10.join(targetDir, PI_DIR);
12640
13516
  const scaffoldErrors = scaffoldPiDirectory(piDir, context, scaffoldedFiles);
12641
13517
  const generatedFiles = {};
12642
13518
  for (const tool of options.tools) {
12643
- const exportDir = tool === "pi" ? path9.join(targetDir, AGENTS_DIR) : path9.join(targetDir, `.${tool}`);
13519
+ const exportDir = tool === "pi" ? path10.join(targetDir, AGENTS_DIR) : path10.join(targetDir, `.${tool}`);
12644
13520
  generateExport(exportDir, tool, piDir, manifest, generatedFiles);
12645
13521
  }
12646
13522
  for (const [filePath, record] of Object.entries(generatedFiles)) {
12647
13523
  scaffoldedFiles[filePath] = record;
12648
13524
  }
12649
- const gitignorePath = path9.join(targetDir, ".gitignore");
12650
- const gitignoreTemplatePath = path9.join(TEMPLATE_DIR, ".gitignore");
13525
+ const gitignorePath = path10.join(targetDir, ".gitignore");
13526
+ const gitignoreTemplatePath = path10.join(TEMPLATE_DIR, ".gitignore");
12651
13527
  if (fs11.existsSync(gitignoreTemplatePath)) {
12652
13528
  const gitignoreContent = fs11.readFileSync(gitignoreTemplatePath, "utf-8");
12653
13529
  await fs11.promises.writeFile(gitignorePath, gitignoreContent);
12654
13530
  scaffoldedFiles[".gitignore"] = { category: "framework", content: gitignoreContent };
12655
13531
  }
12656
- const workflowPath = path9.join(targetDir, "WORKFLOW.md");
12657
- const workflowTemplatePath = path9.join(TEMPLATE_DIR, "workflow.md");
13532
+ const workflowPath = path10.join(targetDir, "WORKFLOW.md");
13533
+ const workflowTemplatePath = path10.join(TEMPLATE_DIR, "workflow.md");
12658
13534
  if (fs11.existsSync(workflowTemplatePath)) {
12659
13535
  let workflowContent = fs11.readFileSync(workflowTemplatePath, "utf-8");
12660
13536
  workflowContent = workflowContent.replace(/\[Project Name\]/g, options.projectName).replace(/\[FrameworkVersion\]/g, FRAMEWORK_VERSION).replace(/\[Date\]/g, new Date().toISOString().split("T")[0]);
@@ -12700,12 +13576,12 @@ function scaffoldPiDirectory(piDir, context, scaffoldedFiles) {
12700
13576
  "extensions"
12701
13577
  ];
12702
13578
  for (const dir of directories) {
12703
- const fullPath = path9.join(piDir, dir);
13579
+ const fullPath = path10.join(piDir, dir);
12704
13580
  fs11.mkdirSync(fullPath, { recursive: true });
12705
13581
  }
12706
13582
  const templateFiles = getPiTemplateFiles();
12707
13583
  for (const relativePath of templateFiles) {
12708
- const targetPath = path9.join(piDir, relativePath);
13584
+ const targetPath = path10.join(piDir, relativePath);
12709
13585
  if (shouldSkipFile(relativePath, context.language)) {
12710
13586
  continue;
12711
13587
  }
@@ -12715,13 +13591,13 @@ function scaffoldPiDirectory(piDir, context, scaffoldedFiles) {
12715
13591
  continue;
12716
13592
  }
12717
13593
  const rendered = renderTemplate(templateResult.value, context);
12718
- fs11.mkdirSync(path9.dirname(targetPath), { recursive: true });
13594
+ fs11.mkdirSync(path10.dirname(targetPath), { recursive: true });
12719
13595
  fs11.writeFileSync(targetPath, rendered, "utf-8");
12720
13596
  const manifestPath = `${PI_DIR}/${relativePath}`;
12721
13597
  const category = categorizeFile(relativePath);
12722
13598
  scaffoldedFiles[manifestPath] = { category, content: rendered };
12723
13599
  }
12724
- const patternsPath = path9.join(piDir, "context/patterns.md");
13600
+ const patternsPath = path10.join(piDir, "context/patterns.md");
12725
13601
  const patternsResult = readLanguagePatterns(context.language);
12726
13602
  if (patternsResult.ok) {
12727
13603
  const renderedPatterns = renderTemplate(patternsResult.value, context);
@@ -12733,8 +13609,8 @@ function scaffoldPiDirectory(piDir, context, scaffoldedFiles) {
12733
13609
  } else {
12734
13610
  errors.push(`context/patterns.md: ${patternsResult.error.message}`);
12735
13611
  }
12736
- const explorationPath = path9.join(piDir, "domain", "exploration.md");
12737
- const domainDir = path9.dirname(explorationPath);
13612
+ const explorationPath = path10.join(piDir, "domain", "exploration.md");
13613
+ const domainDir = path10.dirname(explorationPath);
12738
13614
  if (!fs11.existsSync(domainDir)) {
12739
13615
  fs11.mkdirSync(domainDir, { recursive: true });
12740
13616
  }
@@ -12827,7 +13703,7 @@ function scaffoldPiDirectory(piDir, context, scaffoldedFiles) {
12827
13703
  content: placeholder
12828
13704
  };
12829
13705
  }
12830
- const indexPath = path9.join(piDir, "INDEX.md");
13706
+ const indexPath = path10.join(piDir, "INDEX.md");
12831
13707
  const indexResult = readTemplate("INDEX.md");
12832
13708
  if (indexResult.ok) {
12833
13709
  fs11.writeFileSync(indexPath, indexResult.value, "utf-8");
@@ -12874,12 +13750,12 @@ async function confirmOverwrite(targetDir) {
12874
13750
 
12875
13751
  // src/commands/project.ts
12876
13752
  import * as fs15 from "fs";
12877
- import * as path13 from "path";
13753
+ import * as path14 from "path";
12878
13754
 
12879
13755
  // src/lib/build-config.ts
12880
13756
  init_templates();
12881
13757
  import * as fs12 from "fs";
12882
- import * as path10 from "path";
13758
+ import * as path11 from "path";
12883
13759
  function getSubLayerDeps(layers, language) {
12884
13760
  const deps = [];
12885
13761
  if (language === "java") {
@@ -13062,18 +13938,18 @@ test {
13062
13938
  finalizedBy jacocoTestReport
13063
13939
  }
13064
13940
  `;
13065
- files2.push({ path: path10.join(targetDir, "build.gradle"), content: gradleContent });
13941
+ files2.push({ path: path11.join(targetDir, "build.gradle"), content: gradleContent });
13066
13942
  } else {
13067
13943
  const pomContent = generateJavaMavenPom(groupId, projectName, version2, layers);
13068
- files2.push({ path: path10.join(targetDir, "pom.xml"), content: pomContent });
13944
+ files2.push({ path: path11.join(targetDir, "pom.xml"), content: pomContent });
13069
13945
  }
13070
13946
  } else if (language === "typescript") {
13071
13947
  const packageJson = generateTypeScriptPackageJson(projectName, version2, layers);
13072
- files2.push({ path: path10.join(targetDir, "package.json"), content: packageJson });
13948
+ files2.push({ path: path11.join(targetDir, "package.json"), content: packageJson });
13073
13949
  }
13074
13950
  if (!dryRun) {
13075
13951
  for (const file of files2) {
13076
- fs12.mkdirSync(path10.dirname(file.path), { recursive: true });
13952
+ fs12.mkdirSync(path11.dirname(file.path), { recursive: true });
13077
13953
  fs12.writeFileSync(file.path, file.content, "utf-8");
13078
13954
  }
13079
13955
  }
@@ -13082,7 +13958,7 @@ test {
13082
13958
 
13083
13959
  // src/lib/ci-generator.ts
13084
13960
  import * as fs13 from "fs";
13085
- import * as path11 from "path";
13961
+ import * as path12 from "path";
13086
13962
  function generateCiPipeline(targetDir, options) {
13087
13963
  const { language, buildTool, repoTool, validators, dryRun } = options;
13088
13964
  const files2 = [];
@@ -13101,7 +13977,7 @@ jobs:
13101
13977
  - name: Run Guardian hardening pipeline
13102
13978
  run: bash .pi/scripts/local-ci.sh
13103
13979
  `;
13104
- files2.push({ path: path11.join(targetDir, ".github/workflows/ci.yml"), content: ciYaml });
13980
+ files2.push({ path: path12.join(targetDir, ".github/workflows/ci.yml"), content: ciYaml });
13105
13981
  } else {
13106
13982
  const ciYaml = `stages:
13107
13983
  - validate
@@ -13114,13 +13990,13 @@ validate:
13114
13990
  only:
13115
13991
  - branches
13116
13992
  `;
13117
- files2.push({ path: path11.join(targetDir, ".gitlab-ci.yml"), content: ciYaml });
13993
+ files2.push({ path: path12.join(targetDir, ".gitlab-ci.yml"), content: ciYaml });
13118
13994
  }
13119
13995
  const stageScripts = generateStageScripts(language, validators);
13120
13996
  files2.push(...stageScripts);
13121
13997
  if (!dryRun) {
13122
13998
  for (const file of files2) {
13123
- fs13.mkdirSync(path11.dirname(file.path), { recursive: true });
13999
+ fs13.mkdirSync(path12.dirname(file.path), { recursive: true });
13124
14000
  fs13.writeFileSync(file.path, file.content, "utf-8");
13125
14001
  }
13126
14002
  }
@@ -13170,9 +14046,9 @@ exit 0
13170
14046
 
13171
14047
  // src/lib/project-generator.ts
13172
14048
  import * as fs14 from "fs";
13173
- import * as path12 from "path";
14049
+ import * as path13 from "path";
13174
14050
  function discoverModules(archDir) {
13175
- const modulesDir = path12.join(archDir, "modules");
14051
+ const modulesDir = path13.join(archDir, "modules");
13176
14052
  if (!fs14.existsSync(modulesDir)) {
13177
14053
  return [];
13178
14054
  }
@@ -13184,7 +14060,7 @@ function discoverModules(archDir) {
13184
14060
  continue;
13185
14061
  if (file === "module-template.md")
13186
14062
  continue;
13187
- const content = fs14.readFileSync(path12.join(modulesDir, file), "utf-8");
14063
+ const content = fs14.readFileSync(path13.join(modulesDir, file), "utf-8");
13188
14064
  const match = content.match(/^#\s+(.+)/m);
13189
14065
  if (match) {
13190
14066
  const name2 = match[1].trim();
@@ -13195,14 +14071,14 @@ function discoverModules(archDir) {
13195
14071
  return modules;
13196
14072
  }
13197
14073
  function resolveLayers(archDir, language, defaults) {
13198
- const modulesDir = path12.join(archDir, "modules");
14074
+ const modulesDir = path13.join(archDir, "modules");
13199
14075
  if (fs14.existsSync(modulesDir)) {
13200
14076
  try {
13201
14077
  const files2 = fs14.readdirSync(modulesDir);
13202
14078
  for (const file of files2) {
13203
14079
  if (!file.endsWith(".md"))
13204
14080
  continue;
13205
- const content = fs14.readFileSync(path12.join(modulesDir, file), "utf-8");
14081
+ const content = fs14.readFileSync(path13.join(modulesDir, file), "utf-8");
13206
14082
  const layersMatch = content.match(/^layers:\s*\[(.*?)\]/m);
13207
14083
  if (layersMatch) {
13208
14084
  return layersMatch[1].split(",").map((s) => s.trim().replace(/['"]/g, "")).filter(Boolean);
@@ -13210,7 +14086,7 @@ function resolveLayers(archDir, language, defaults) {
13210
14086
  }
13211
14087
  } catch {}
13212
14088
  }
13213
- const decisionsDir = path12.join(archDir, "decisions");
14089
+ const decisionsDir = path13.join(archDir, "decisions");
13214
14090
  const adrLayers = new Set;
13215
14091
  adrLayers.add("domain");
13216
14092
  adrLayers.add("application");
@@ -13221,7 +14097,7 @@ function resolveLayers(archDir, language, defaults) {
13221
14097
  for (const file of files2) {
13222
14098
  if (!file.endsWith(".md"))
13223
14099
  continue;
13224
- const content = fs14.readFileSync(path12.join(decisionsDir, file), "utf-8").toLowerCase();
14100
+ const content = fs14.readFileSync(path13.join(decisionsDir, file), "utf-8").toLowerCase();
13225
14101
  if (content.includes("rest") || content.includes("http") || content.includes("grpc")) {
13226
14102
  adrLayers.add("interfaces/http");
13227
14103
  }
@@ -13246,12 +14122,12 @@ function resolveLayers(archDir, language, defaults) {
13246
14122
  function generateProjectStructure(targetDir, options) {
13247
14123
  const { language, groupId, modules, layers, dryRun } = options;
13248
14124
  const files2 = [];
13249
- const srcPrefix = language === "java" ? path12.join("src", "main", "java") : "src";
14125
+ const srcPrefix = language === "java" ? path13.join("src", "main", "java") : "src";
13250
14126
  const groupPath = groupId.replace(/\./g, "/");
13251
14127
  for (const moduleName of modules) {
13252
14128
  for (const layer of layers) {
13253
- const dirPath = path12.join(targetDir, srcPrefix, groupPath, moduleName, layer);
13254
- const gitkeepPath = path12.join(dirPath, ".gitkeep");
14129
+ const dirPath = path13.join(targetDir, srcPrefix, groupPath, moduleName, layer);
14130
+ const gitkeepPath = path13.join(dirPath, ".gitkeep");
13255
14131
  files2.push({
13256
14132
  path: gitkeepPath,
13257
14133
  content: ""
@@ -13262,7 +14138,7 @@ function generateProjectStructure(targetDir, options) {
13262
14138
  }
13263
14139
  const ext = language === "java" ? ".java" : ".ts";
13264
14140
  const placeholderFileName = `${moduleName}_${layer.replace(/[/ ]/g, "_")}${ext}`;
13265
- const placeholderPath = path12.join(dirPath, placeholderFileName);
14141
+ const placeholderPath = path13.join(dirPath, placeholderFileName);
13266
14142
  const moduleDocName = moduleName.toLowerCase().replace(/\s+/g, "-");
13267
14143
  const canonicalRef = `// Canonical Reference: .pi/architecture/modules/${moduleDocName}.md#${layer}`;
13268
14144
  files2.push({
@@ -13295,7 +14171,7 @@ function runProjectGenerator(targetDir, archDir, options) {
13295
14171
  init_templates();
13296
14172
  var PI_DIR2 = ".pi";
13297
14173
  function existingProjectDetected(targetDir) {
13298
- const srcDir = path13.join(targetDir, "src");
14174
+ const srcDir = path14.join(targetDir, "src");
13299
14175
  return fs15.existsSync(srcDir);
13300
14176
  }
13301
14177
  async function runProjectCreate(targetDir, options) {
@@ -13311,7 +14187,7 @@ async function runProjectCreate(targetDir, options) {
13311
14187
  `);
13312
14188
  return;
13313
14189
  }
13314
- const archDir = path13.join(targetDir, PI_DIR2, "architecture");
14190
+ const archDir = path14.join(targetDir, PI_DIR2, "architecture");
13315
14191
  if (!fs15.existsSync(archDir)) {
13316
14192
  console.log(`
13317
14193
  \u2139\uFE0F No .pi/architecture/ directory found. Using defaults.
@@ -13357,14 +14233,14 @@ async function runProjectCreate(targetDir, options) {
13357
14233
  language,
13358
14234
  buildTool: buildTool ?? "maven",
13359
14235
  groupId,
13360
- projectName: path13.basename(targetDir),
14236
+ projectName: path14.basename(targetDir),
13361
14237
  version: "0.1.0",
13362
14238
  layers: structurePlan.layers,
13363
14239
  dryRun
13364
14240
  });
13365
14241
  if (dryRun) {
13366
14242
  for (const file of buildPlan.files) {
13367
- console.log(` - ${path13.relative(targetDir, file.path)}`);
14243
+ console.log(` - ${path14.relative(targetDir, file.path)}`);
13368
14244
  }
13369
14245
  console.log("");
13370
14246
  } else {
@@ -13381,7 +14257,7 @@ async function runProjectCreate(targetDir, options) {
13381
14257
  });
13382
14258
  if (dryRun) {
13383
14259
  for (const file of ciPlan.files) {
13384
- console.log(` - ${path13.relative(targetDir, file.path)}`);
14260
+ console.log(` - ${path14.relative(targetDir, file.path)}`);
13385
14261
  }
13386
14262
  console.log(`
13387
14263
  \uD83D\uDCCB Dry run complete. Pass --dryRun to see this plan before creating files.
@@ -13454,7 +14330,7 @@ Estimated USD savings based on average API pricing ($3/M input, $10/M output).
13454
14330
  init_dist4();
13455
14331
  init_manifest();
13456
14332
  import * as fs16 from "fs";
13457
- import * as path14 from "path";
14333
+ import * as path15 from "path";
13458
14334
  var MANAGED_ROOTS = [".pi", ".claude", ".opencode", ".agents", ".github", ".omp"];
13459
14335
  async function runUninstall(targetDir, options = {}) {
13460
14336
  const manifest = readManifest(targetDir);
@@ -13510,7 +14386,7 @@ function createUninstallPlan(targetDir) {
13510
14386
  if (!safePath) {
13511
14387
  continue;
13512
14388
  }
13513
- const fullPath = path14.join(targetDir, safePath);
14389
+ const fullPath = path15.join(targetDir, safePath);
13514
14390
  if (!fs16.existsSync(fullPath) || !fs16.statSync(fullPath).isFile()) {
13515
14391
  continue;
13516
14392
  }
@@ -13531,13 +14407,13 @@ function createUninstallPlan(targetDir) {
13531
14407
  }
13532
14408
  function applyUninstallPlan(targetDir, plan) {
13533
14409
  for (const filePath of plan.filesToRemove) {
13534
- const fullPath = path14.join(targetDir, filePath);
14410
+ const fullPath = path15.join(targetDir, filePath);
13535
14411
  if (fs16.existsSync(fullPath) && fs16.statSync(fullPath).isFile()) {
13536
14412
  fs16.rmSync(fullPath);
13537
14413
  }
13538
14414
  }
13539
14415
  for (const dirPath of plan.directoriesToPrune) {
13540
- const fullPath = path14.join(targetDir, dirPath);
14416
+ const fullPath = path15.join(targetDir, dirPath);
13541
14417
  if (fs16.existsSync(fullPath) && fs16.statSync(fullPath).isDirectory()) {
13542
14418
  try {
13543
14419
  fs16.rmdirSync(fullPath);
@@ -13546,30 +14422,30 @@ function applyUninstallPlan(targetDir, plan) {
13546
14422
  }
13547
14423
  }
13548
14424
  function normalizeManagedPath(filePath) {
13549
- const normalized = path14.normalize(filePath);
13550
- if (normalized.startsWith("..") || path14.isAbsolute(normalized)) {
14425
+ const normalized = path15.normalize(filePath);
14426
+ if (normalized.startsWith("..") || path15.isAbsolute(normalized)) {
13551
14427
  return null;
13552
14428
  }
13553
14429
  if (normalized === MANIFEST_FILE) {
13554
14430
  return normalized;
13555
14431
  }
13556
- return MANAGED_ROOTS.some((root) => normalized === root || normalized.startsWith(`${root}${path14.sep}`)) ? normalized : null;
14432
+ return MANAGED_ROOTS.some((root) => normalized === root || normalized.startsWith(`${root}${path15.sep}`)) ? normalized : null;
13557
14433
  }
13558
14434
  function collectDirectoriesToPrune(files2) {
13559
14435
  const directories = new Set;
13560
14436
  for (const file of files2) {
13561
- let dir = path14.dirname(file);
13562
- while (dir !== "." && dir !== path14.dirname(dir)) {
13563
- if (MANAGED_ROOTS.some((root) => dir === root || dir.startsWith(`${root}${path14.sep}`))) {
14437
+ let dir = path15.dirname(file);
14438
+ while (dir !== "." && dir !== path15.dirname(dir)) {
14439
+ if (MANAGED_ROOTS.some((root) => dir === root || dir.startsWith(`${root}${path15.sep}`))) {
13564
14440
  directories.add(dir);
13565
14441
  }
13566
- dir = path14.dirname(dir);
14442
+ dir = path15.dirname(dir);
13567
14443
  }
13568
14444
  }
13569
14445
  for (const root of MANAGED_ROOTS) {
13570
14446
  directories.add(root);
13571
14447
  }
13572
- return [...directories].sort((a2, b2) => b2.length - a2.length);
14448
+ return [...directories].sort((a2, b3) => b3.length - a2.length);
13573
14449
  }
13574
14450
 
13575
14451
  // src/index.ts
@@ -13652,7 +14528,7 @@ function migrateSchemaV0ToV1(manifest) {
13652
14528
  init_dist4();
13653
14529
  import * as child_process2 from "child_process";
13654
14530
  import * as fs19 from "fs";
13655
- import * as path17 from "path";
14531
+ import * as path18 from "path";
13656
14532
 
13657
14533
  // src/lib/toml-filter.ts
13658
14534
  function parseTomlValue(raw) {
@@ -13869,23 +14745,23 @@ function applyFilter(filter, stdout2) {
13869
14745
  }
13870
14746
  }
13871
14747
  if (filter.strip_lines_matching?.length) {
13872
- const patterns = filter.strip_lines_matching.map((p2) => {
14748
+ const patterns = filter.strip_lines_matching.map((p3) => {
13873
14749
  try {
13874
- return new RegExp(p2);
14750
+ return new RegExp(p3);
13875
14751
  } catch {
13876
14752
  return null;
13877
14753
  }
13878
14754
  });
13879
- lines = lines.filter((l2) => !patterns.some((p2) => p2?.test(l2)));
14755
+ lines = lines.filter((l2) => !patterns.some((p3) => p3?.test(l2)));
13880
14756
  } else if (filter.keep_lines_matching?.length) {
13881
- const patterns = filter.keep_lines_matching.map((p2) => {
14757
+ const patterns = filter.keep_lines_matching.map((p3) => {
13882
14758
  try {
13883
- return new RegExp(p2);
14759
+ return new RegExp(p3);
13884
14760
  } catch {
13885
14761
  return null;
13886
14762
  }
13887
14763
  });
13888
- lines = lines.filter((l2) => patterns.some((p2) => p2?.test(l2)));
14764
+ lines = lines.filter((l2) => patterns.some((p3) => p3?.test(l2)));
13889
14765
  }
13890
14766
  if (filter.truncate_lines_at) {
13891
14767
  lines = lines.map((l2) => truncateUnicode(l2, filter.truncate_lines_at));
@@ -13964,15 +14840,15 @@ function calculateSavings(filter, input) {
13964
14840
  init_trust();
13965
14841
  var __dirname = "/Users/arman/project/guardian-framework/src/commands";
13966
14842
  var PI_VALIDATORS_DIR = ".pi/validators";
13967
- var USER_GLOBAL_PATH = path17.join(process.env.HOME ?? process.env.USERPROFILE ?? "", ".config", "guardian", "filters.toml");
13968
- var BUILTIN_PATH = path17.join(__dirname, "..", "..", "templates", "pi", "validators", "default.toml");
14843
+ var USER_GLOBAL_PATH = path18.join(process.env.HOME ?? process.env.USERPROFILE ?? "", ".config", "guardian", "filters.toml");
14844
+ var BUILTIN_PATH = path18.join(__dirname, "..", "..", "templates", "pi", "validators", "default.toml");
13969
14845
  function loadFilters(targetDir) {
13970
14846
  const filters = [];
13971
14847
  const warnings = [];
13972
- const projectDir = path17.join(targetDir, PI_VALIDATORS_DIR);
14848
+ const projectDir = path18.join(targetDir, PI_VALIDATORS_DIR);
13973
14849
  if (fs19.existsSync(projectDir)) {
13974
14850
  for (const file of fs19.readdirSync(projectDir).filter((f2) => f2.endsWith(".toml"))) {
13975
- const filePath = path17.join(projectDir, file);
14851
+ const filePath = path18.join(projectDir, file);
13976
14852
  const trustStatus = checkTrust(targetDir, filePath);
13977
14853
  if (trustStatus === "untrusted" || trustStatus === "content-changed") {
13978
14854
  warnings.push(trustStatusMessage(trustStatus, filePath));
@@ -14209,7 +15085,7 @@ async function runVerify(targetDir = process.cwd()) {
14209
15085
 
14210
15086
  // src/index.ts
14211
15087
  init_manifest();
14212
- var VERSION = "0.1.60";
15088
+ var VERSION = "0.1.61";
14213
15089
  var PKG_NAME = "guardian-framework";
14214
15090
  var _newerVersion = null;
14215
15091
  function checkForUpdateSync() {
@@ -14220,14 +15096,30 @@ function checkForUpdateSync() {
14220
15096
  }
14221
15097
  } catch {}
14222
15098
  }
14223
- function printUpdateNotice() {
14224
- if (_newerVersion) {
14225
- console.log(`
14226
- \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E` + `
14227
- \u2502 \u2728 Update available: v${VERSION} \u2192 v${_newerVersion.padEnd(8)} \u2502` + `
14228
- \u2502 Run \`npm install -g ${PKG_NAME}@latest\` to update. \u2502` + `
14229
- \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F
14230
- `);
15099
+ async function askAndUpdate() {
15100
+ if (!_newerVersion)
15101
+ return;
15102
+ const shouldUpdate = await confirm({
15103
+ message: `\u2728 Update available: v${VERSION} \u2192 v${_newerVersion}. Update now?`
15104
+ });
15105
+ if (isCancel(shouldUpdate) || !shouldUpdate) {
15106
+ outro(`Run \`npm install -g ${PKG_NAME}@latest\` to update later.`);
15107
+ return;
15108
+ }
15109
+ const s = (await Promise.resolve().then(() => (init_dist4(), exports_dist))).spinner();
15110
+ s.start("Updating...");
15111
+ try {
15112
+ execFileSync("npm", ["install", "-g", `${PKG_NAME}@latest`], {
15113
+ timeout: 60000,
15114
+ encoding: "utf-8",
15115
+ stdio: ["ignore", "pipe", "pipe"]
15116
+ });
15117
+ s.stop("Update complete! \u2705");
15118
+ outro(`Updated to v${_newerVersion}. Run \`guardian-framework update\` to sync project files.`);
15119
+ } catch (e) {
15120
+ s.stop("Update failed!");
15121
+ const err = e;
15122
+ outro(`Error: ${err.stderr || err.message || "Unknown error"}`);
14231
15123
  }
14232
15124
  }
14233
15125
  async function runCli() {
@@ -14258,7 +15150,9 @@ async function runCli() {
14258
15150
  }
14259
15151
  if (args.values.version) {
14260
15152
  console.log(`guardian-framework v${VERSION}`);
14261
- printUpdateNotice();
15153
+ if (_newerVersion) {
15154
+ outro(`Update available: v${_newerVersion} \u2014 run \`npm install -g ${PKG_NAME}@latest\``);
15155
+ }
14262
15156
  return;
14263
15157
  }
14264
15158
  if (args.values.help) {
@@ -14423,7 +15317,7 @@ async function runCommand(command, args) {
14423
15317
  console.error(`Unknown command: ${command}`);
14424
15318
  console.log("Run 'guardian-framework --help' for usage");
14425
15319
  }
14426
- printUpdateNotice();
15320
+ await askAndUpdate();
14427
15321
  }
14428
15322
 
14429
15323
  // src/cli.ts