maxsimcli 1.0.9 → 1.0.10

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.cjs CHANGED
@@ -107,6 +107,7 @@ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
107
107
  exports.execGit = execGit;
108
108
  exports.normalizePhaseName = normalizePhaseName;
109
109
  exports.comparePhaseNum = comparePhaseNum;
110
+ exports.getPhasePattern = getPhasePattern;
110
111
  exports.findPhaseInternal = findPhaseInternal;
111
112
  exports.getArchivedPhaseDirs = getArchivedPhaseDirs;
112
113
  exports.getRoadmapPhaseInternal = getRoadmapPhaseInternal;
@@ -329,6 +330,25 @@ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
329
330
  }
330
331
  return (pa[3] ? parseFloat(pa[3]) : -1) - (pb[3] ? parseFloat(pb[3]) : -1);
331
332
  }
333
+ /**
334
+ * Returns the canonical regex for matching Phase heading lines in ROADMAP.md.
335
+ *
336
+ * General form (no escapedPhaseNum):
337
+ * Matches: ## Phase 03: Name Here
338
+ * Group 1: phase number string (e.g. "03", "3A", "2.1")
339
+ * Group 2: phase name string (e.g. "Name Here")
340
+ *
341
+ * Specific form (with escapedPhaseNum):
342
+ * Matches: ## Phase 03: Name Here
343
+ * Group 1: phase name string only
344
+ *
345
+ * @param escapedPhaseNum - regex-escaped phase number string to match a specific phase
346
+ * @param flags - regex flags (default: 'gi')
347
+ */
348
+ function getPhasePattern(escapedPhaseNum, flags = "gi") {
349
+ if (escapedPhaseNum) return new RegExp(`#{2,4}\\s*Phase\\s+${escapedPhaseNum}:\\s*([^\\n]+)`, flags);
350
+ return new RegExp(`#{2,4}\\s*Phase\\s+(\\d+[A-Z]?(?:\\.\\d+)?)\\s*:\\s*([^\\n]+)`, flags);
351
+ }
332
352
  function searchPhaseInDir(baseDir, relBase, normalized) {
333
353
  try {
334
354
  const match = node_fs_1$10.default.readdirSync(baseDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort((a, b) => comparePhaseNum(a, b)).find((d) => d.startsWith(normalized));
@@ -385,7 +405,9 @@ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
385
405
  return result;
386
406
  }
387
407
  }
388
- } catch {}
408
+ } catch (e) {
409
+ if (process.env.MAXSIM_DEBUG) console.error(e);
410
+ }
389
411
  return null;
390
412
  }
391
413
  function getArchivedPhaseDirs(cwd) {
@@ -407,7 +429,9 @@ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
407
429
  fullPath: node_path_1$10.default.join(archivePath, dir)
408
430
  });
409
431
  }
410
- } catch {}
432
+ } catch (e) {
433
+ if (process.env.MAXSIM_DEBUG) console.error(e);
434
+ }
411
435
  return results;
412
436
  }
413
437
  function getRoadmapPhaseInternal(cwd, phaseNum) {
@@ -416,8 +440,7 @@ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
416
440
  if (!node_fs_1$10.default.existsSync(roadmapPath)) return null;
417
441
  try {
418
442
  const content = node_fs_1$10.default.readFileSync(roadmapPath, "utf-8");
419
- const escapedPhase = phaseNum.toString().replace(/\./g, "\\.");
420
- const phasePattern = new RegExp(`#{2,4}\\s*Phase\\s+${escapedPhase}:\\s*([^\\n]+)`, "i");
443
+ const phasePattern = getPhasePattern(phaseNum.toString().replace(/\./g, "\\."), "i");
421
444
  const headerMatch = content.match(phasePattern);
422
445
  if (!headerMatch) return null;
423
446
  const phaseName = headerMatch[1].trim();
@@ -968,7 +991,9 @@ var require_state = /* @__PURE__ */ __commonJSMin(((exports) => {
968
991
  let stateRaw = "";
969
992
  try {
970
993
  stateRaw = node_fs_1$7.default.readFileSync(node_path_1$7.default.join(planningDir, "STATE.md"), "utf-8");
971
- } catch {}
994
+ } catch (e) {
995
+ if (process.env.MAXSIM_DEBUG) console.error(e);
996
+ }
972
997
  const configExists = node_fs_1$7.default.existsSync(node_path_1$7.default.join(planningDir, "config.json"));
973
998
  const roadmapExists = node_fs_1$7.default.existsSync(node_path_1$7.default.join(planningDir, "ROADMAP.md"));
974
999
  const stateExists = stateRaw.length > 0;
@@ -1446,7 +1471,7 @@ var require_roadmap = /* @__PURE__ */ __commonJSMin(((exports) => {
1446
1471
  try {
1447
1472
  const content = node_fs_1$6.default.readFileSync(roadmapPath, "utf-8");
1448
1473
  const escapedPhase = phaseNum.replace(/\./g, "\\.");
1449
- const phasePattern = new RegExp(`#{2,4}\\s*Phase\\s+${escapedPhase}:\\s*([^\\n]+)`, "i");
1474
+ const phasePattern = (0, core_js_1.getPhasePattern)(escapedPhase, "i");
1450
1475
  const headerMatch = content.match(phasePattern);
1451
1476
  if (!headerMatch) {
1452
1477
  const checklistPattern = new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${escapedPhase}:\\s*([^*]+)\\*\\*`, "i");
@@ -1501,7 +1526,7 @@ var require_roadmap = /* @__PURE__ */ __commonJSMin(((exports) => {
1501
1526
  }
1502
1527
  const content = node_fs_1$6.default.readFileSync(roadmapPath, "utf-8");
1503
1528
  const phasesDir = node_path_1$6.default.join(cwd, ".planning", "phases");
1504
- const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)?)\s*:\s*([^\n]+)/gi;
1529
+ const phasePattern = (0, core_js_1.getPhasePattern)();
1505
1530
  const phases = [];
1506
1531
  let match;
1507
1532
  while ((match = phasePattern.exec(content)) !== null) {
@@ -1536,7 +1561,9 @@ var require_roadmap = /* @__PURE__ */ __commonJSMin(((exports) => {
1536
1561
  else if (hasContext) diskStatus = "discussed";
1537
1562
  else diskStatus = "empty";
1538
1563
  }
1539
- } catch {}
1564
+ } catch (e) {
1565
+ if (process.env.MAXSIM_DEBUG) console.error(e);
1566
+ }
1540
1567
  const checkboxPattern = new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${phaseNum.replace(".", "\\.")}`, "i");
1541
1568
  const checkboxMatch = content.match(checkboxPattern);
1542
1569
  const roadmapComplete = checkboxMatch ? checkboxMatch[1] === "x" : false;
@@ -1850,8 +1877,12 @@ var require_commands = /* @__PURE__ */ __commonJSMin(((exports) => {
1850
1877
  area: todoArea,
1851
1878
  path: node_path_1$4.default.join(".planning", "todos", "pending", file)
1852
1879
  });
1853
- } catch {}
1854
- } catch {}
1880
+ } catch (e) {
1881
+ if (process.env.MAXSIM_DEBUG) console.error(e);
1882
+ }
1883
+ } catch (e) {
1884
+ if (process.env.MAXSIM_DEBUG) console.error(e);
1885
+ }
1855
1886
  const result = {
1856
1887
  count,
1857
1888
  todos
@@ -1896,7 +1927,9 @@ var require_commands = /* @__PURE__ */ __commonJSMin(((exports) => {
1896
1927
  fullPath: node_path_1$4.default.join(phasesDir, dir),
1897
1928
  milestone: null
1898
1929
  });
1899
- } catch {}
1930
+ } catch (e) {
1931
+ if (process.env.MAXSIM_DEBUG) console.error(e);
1932
+ }
1900
1933
  if (allPhaseDirs.length === 0) {
1901
1934
  (0, core_js_1.output)({
1902
1935
  phases: {},
@@ -1931,7 +1964,9 @@ var require_commands = /* @__PURE__ */ __commonJSMin(((exports) => {
1931
1964
  });
1932
1965
  const techStack = fm["tech-stack"];
1933
1966
  if (techStack && techStack.added) techStack.added.forEach((t) => digest.tech_stack.add(typeof t === "string" ? t : t.name));
1934
- } catch {}
1967
+ } catch (e) {
1968
+ if (process.env.MAXSIM_DEBUG) console.error(e);
1969
+ }
1935
1970
  }
1936
1971
  const outputDigest = {
1937
1972
  phases: {},
@@ -2162,7 +2197,9 @@ var require_commands = /* @__PURE__ */ __commonJSMin(((exports) => {
2162
2197
  status
2163
2198
  });
2164
2199
  }
2165
- } catch {}
2200
+ } catch (e) {
2201
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2202
+ }
2166
2203
  const percent = totalPlans > 0 ? Math.min(100, Math.round(totalSummaries / totalPlans * 100)) : 0;
2167
2204
  if (format === "table") {
2168
2205
  const barWidth = 10;
@@ -2662,7 +2699,7 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2662
2699
  }
2663
2700
  const roadmapContent = node_fs_1$3.default.readFileSync(roadmapPath, "utf-8");
2664
2701
  const roadmapPhases = /* @__PURE__ */ new Set();
2665
- const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)?)\s*:/gi;
2702
+ const phasePattern = (0, core_js_1.getPhasePattern)();
2666
2703
  let m;
2667
2704
  while ((m = phasePattern.exec(roadmapContent)) !== null) roadmapPhases.add(m[1]);
2668
2705
  const diskPhases = /* @__PURE__ */ new Set();
@@ -2672,7 +2709,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2672
2709
  const dm = dir.match(/^(\d+[A-Z]?(?:\.\d+)?)/i);
2673
2710
  if (dm) diskPhases.add(dm[1]);
2674
2711
  }
2675
- } catch {}
2712
+ } catch (e) {
2713
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2714
+ }
2676
2715
  for (const p of roadmapPhases) if (!diskPhases.has(p) && !diskPhases.has((0, core_js_1.normalizePhaseName)(p))) warnings.push(`Phase ${p} in ROADMAP.md but no directory on disk`);
2677
2716
  for (const p of diskPhases) {
2678
2717
  const unpadded = String(parseInt(p, 10));
@@ -2695,7 +2734,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2695
2734
  const summaryIdsSet = new Set(summaries.map((s) => s.replace("-SUMMARY.md", "")));
2696
2735
  for (const sid of summaryIdsSet) if (!planIdsSet.has(sid)) warnings.push(`Summary ${sid}-SUMMARY.md in ${dir} has no matching PLAN.md`);
2697
2736
  }
2698
- } catch {}
2737
+ } catch (e) {
2738
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2739
+ }
2699
2740
  try {
2700
2741
  const dirs = node_fs_1$3.default.readdirSync(phasesDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
2701
2742
  for (const dir of dirs) {
@@ -2705,7 +2746,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2705
2746
  if (!(0, frontmatter_js_1.extractFrontmatter)(content).wave) warnings.push(`${dir}/${plan}: missing 'wave' in frontmatter`);
2706
2747
  }
2707
2748
  }
2708
- } catch {}
2749
+ } catch (e) {
2750
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2751
+ }
2709
2752
  const passed = errors.length === 0;
2710
2753
  const result = {
2711
2754
  passed,
@@ -2770,7 +2813,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2770
2813
  const dm = e.name.match(/^(\d+(?:\.\d+)?)/);
2771
2814
  if (dm) diskPhases.add(dm[1]);
2772
2815
  }
2773
- } catch {}
2816
+ } catch (e) {
2817
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2818
+ }
2774
2819
  for (const ref of phaseRefs) {
2775
2820
  const normalizedRef = String(parseInt(ref, 10)).padStart(2, "0");
2776
2821
  if (!diskPhases.has(ref) && !diskPhases.has(normalizedRef) && !diskPhases.has(String(parseInt(ref, 10)))) {
@@ -2800,7 +2845,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2800
2845
  try {
2801
2846
  const entries = node_fs_1$3.default.readdirSync(phasesDir, { withFileTypes: true });
2802
2847
  for (const e of entries) if (e.isDirectory() && !e.name.match(/^\d{2}(?:\.\d+)?-[\w-]+$/)) addIssue("warning", "W005", `Phase directory "${e.name}" doesn't follow NN-name format`, "Rename to match pattern (e.g., 01-setup)");
2803
- } catch {}
2848
+ } catch (e) {
2849
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2850
+ }
2804
2851
  try {
2805
2852
  const entries = node_fs_1$3.default.readdirSync(phasesDir, { withFileTypes: true });
2806
2853
  for (const e of entries) {
@@ -2814,11 +2861,13 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2814
2861
  if (!summaryBases.has(planBase)) addIssue("info", "I001", `${e.name}/${plan} has no SUMMARY.md`, "May be in progress");
2815
2862
  }
2816
2863
  }
2817
- } catch {}
2864
+ } catch (e) {
2865
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2866
+ }
2818
2867
  if (node_fs_1$3.default.existsSync(roadmapPath)) {
2819
2868
  const roadmapContent = node_fs_1$3.default.readFileSync(roadmapPath, "utf-8");
2820
2869
  const roadmapPhases = /* @__PURE__ */ new Set();
2821
- const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)?)\s*:/gi;
2870
+ const phasePattern = (0, core_js_1.getPhasePattern)();
2822
2871
  let m;
2823
2872
  while ((m = phasePattern.exec(roadmapContent)) !== null) roadmapPhases.add(m[1]);
2824
2873
  const diskPhases = /* @__PURE__ */ new Set();
@@ -2828,7 +2877,9 @@ var require_verify = /* @__PURE__ */ __commonJSMin(((exports) => {
2828
2877
  const dm = e.name.match(/^(\d+[A-Z]?(?:\.\d+)?)/i);
2829
2878
  if (dm) diskPhases.add(dm[1]);
2830
2879
  }
2831
- } catch {}
2880
+ } catch (e) {
2881
+ if (process.env.MAXSIM_DEBUG) console.error(e);
2882
+ }
2832
2883
  for (const p of roadmapPhases) {
2833
2884
  const padded = String(parseInt(p, 10)).padStart(2, "0");
2834
2885
  if (!diskPhases.has(p) && !diskPhases.has(padded)) addIssue("warning", "W006", `Phase ${p} in ROADMAP.md but no directory on disk`, "Create phase directory or remove from roadmap");
@@ -3085,7 +3136,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3085
3136
  try {
3086
3137
  const match = node_fs_1$2.default.readdirSync(phasesDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort((a, b) => (0, core_js_1.comparePhaseNum)(a, b)).find((d) => d.startsWith(normalized));
3087
3138
  if (match) phaseDir = node_path_1$2.default.join(phasesDir, match);
3088
- } catch {}
3139
+ } catch (e) {
3140
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3141
+ }
3089
3142
  if (!phaseDir) {
3090
3143
  (0, core_js_1.output)({
3091
3144
  phase: normalized,
@@ -3147,7 +3200,7 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3147
3200
  if (!node_fs_1$2.default.existsSync(roadmapPath)) (0, core_js_1.error)("ROADMAP.md not found");
3148
3201
  const content = node_fs_1$2.default.readFileSync(roadmapPath, "utf-8");
3149
3202
  const slug = (0, core_js_1.generateSlugInternal)(description);
3150
- const phasePattern = /#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)?:/gi;
3203
+ const phasePattern = (0, core_js_1.getPhasePattern)();
3151
3204
  let maxPhase = 0;
3152
3205
  let m;
3153
3206
  while ((m = phasePattern.exec(content)) !== null) {
@@ -3181,7 +3234,7 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3181
3234
  const content = node_fs_1$2.default.readFileSync(roadmapPath, "utf-8");
3182
3235
  const slug = (0, core_js_1.generateSlugInternal)(description);
3183
3236
  const afterPhaseEscaped = (0, core_js_1.normalizePhaseName)(afterPhase).replace(/^0+/, "").replace(/\./g, "\\.");
3184
- if (!new RegExp(`#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:`, "i").test(content)) (0, core_js_1.error)(`Phase ${afterPhase} not found in ROADMAP.md`);
3237
+ if (!(0, core_js_1.getPhasePattern)(afterPhaseEscaped, "i").test(content)) (0, core_js_1.error)(`Phase ${afterPhase} not found in ROADMAP.md`);
3185
3238
  const phasesDir = node_path_1$2.default.join(cwd, ".planning", "phases");
3186
3239
  const normalizedBase = (0, core_js_1.normalizePhaseName)(afterPhase);
3187
3240
  const existingDecimals = [];
@@ -3192,7 +3245,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3192
3245
  const dm = dir.match(decimalPattern);
3193
3246
  if (dm) existingDecimals.push(parseInt(dm[1], 10));
3194
3247
  }
3195
- } catch {}
3248
+ } catch (e) {
3249
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3250
+ }
3196
3251
  const decimalPhase = `${normalizedBase}.${existingDecimals.length === 0 ? 1 : Math.max(...existingDecimals) + 1}`;
3197
3252
  const dirName = `${decimalPhase}-${slug}`;
3198
3253
  const dirPath = node_path_1$2.default.join(cwd, ".planning", "phases", dirName);
@@ -3228,7 +3283,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3228
3283
  let targetDir = null;
3229
3284
  try {
3230
3285
  targetDir = node_fs_1$2.default.readdirSync(phasesDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort((a, b) => (0, core_js_1.comparePhaseNum)(a, b)).find((d) => d.startsWith(normalized + "-") || d === normalized) || null;
3231
- } catch {}
3286
+ } catch (e) {
3287
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3288
+ }
3232
3289
  if (targetDir && !force) {
3233
3290
  const targetPath = node_path_1$2.default.join(phasesDir, targetDir);
3234
3291
  const summaries = node_fs_1$2.default.readdirSync(targetPath).filter((f) => f.endsWith("-SUMMARY.md") || f === "SUMMARY.md");
@@ -3277,7 +3334,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3277
3334
  });
3278
3335
  }
3279
3336
  }
3280
- } catch {}
3337
+ } catch (e) {
3338
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3339
+ }
3281
3340
  } else {
3282
3341
  const removedInt = parseInt(normalized, 10);
3283
3342
  try {
@@ -3323,7 +3382,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3323
3382
  });
3324
3383
  }
3325
3384
  }
3326
- } catch {}
3385
+ } catch (e) {
3386
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3387
+ }
3327
3388
  }
3328
3389
  let roadmapContent = node_fs_1$2.default.readFileSync(roadmapPath, "utf-8");
3329
3390
  const targetEscaped = targetPhase.replace(/\./g, "\\.");
@@ -3426,7 +3487,9 @@ var require_phase = /* @__PURE__ */ __commonJSMin(((exports) => {
3426
3487
  }
3427
3488
  }
3428
3489
  }
3429
- } catch {}
3490
+ } catch (e) {
3491
+ if (process.env.MAXSIM_DEBUG) console.error(e);
3492
+ }
3430
3493
  if (node_fs_1$2.default.existsSync(statePath)) {
3431
3494
  let stateContent = node_fs_1$2.default.readFileSync(statePath, "utf-8");
3432
3495
  stateContent = stateContent.replace(/(\*\*Current Phase:\*\*\s*).*/, `$1${nextPhaseNum || phaseNum}`);
@@ -4154,8 +4217,8 @@ var require_dist = /* @__PURE__ */ __commonJSMin(((exports) => {
4154
4217
  * @maxsim/core — Shared utilities, constants, and type definitions
4155
4218
  */
4156
4219
  Object.defineProperty(exports, "__esModule", { value: true });
4157
- exports.cmdRoadmapAnalyze = exports.cmdRoadmapGetPhase = exports.cmdStateSnapshot = exports.cmdStateRecordSession = exports.cmdStateResolveBlocker = exports.cmdStateAddBlocker = exports.cmdStateAddDecision = exports.cmdStateUpdateProgress = exports.cmdStateRecordMetric = exports.cmdStateAdvancePlan = exports.cmdStateUpdate = exports.cmdStatePatch = exports.cmdStateGet = exports.cmdStateLoad = exports.stateReplaceField = exports.stateExtractField = exports.cmdConfigGet = exports.cmdConfigSet = exports.cmdConfigEnsureSection = exports.cmdFrontmatterValidate = exports.cmdFrontmatterMerge = exports.cmdFrontmatterSet = exports.cmdFrontmatterGet = exports.FRONTMATTER_SCHEMAS = exports.parseMustHavesBlock = exports.spliceFrontmatter = exports.reconstructFrontmatter = exports.extractFrontmatter = exports.getMilestoneInfo = exports.generateSlugInternal = exports.pathExistsInternal = exports.resolveModelInternal = exports.getRoadmapPhaseInternal = exports.getArchivedPhaseDirs = exports.findPhaseInternal = exports.comparePhaseNum = exports.normalizePhaseName = exports.execGit = exports.isGitIgnored = exports.loadConfig = exports.safeReadFile = exports.error = exports.output = exports.MODEL_PROFILES = exports.PLANNING_CONFIG_DEFAULTS = exports.err = exports.ok = exports.phaseSlug = exports.phasePath = exports.phaseNumber = void 0;
4158
- exports.cmdInitProgress = exports.cmdInitMapCodebase = exports.cmdInitMilestoneOp = exports.cmdInitTodos = exports.cmdInitPhaseOp = exports.cmdInitVerifyWork = exports.cmdInitResume = exports.cmdInitQuick = exports.cmdInitNewMilestone = exports.cmdInitNewProject = exports.cmdInitPlanPhase = exports.cmdInitExecutePhase = exports.cmdTemplateFill = exports.cmdTemplateSelect = exports.cmdPhaseComplete = exports.cmdPhaseRemove = exports.cmdPhaseInsert = exports.cmdPhaseAdd = exports.cmdPhasePlanIndex = exports.cmdFindPhase = exports.cmdPhaseNextDecimal = exports.cmdPhasesList = exports.cmdValidateHealth = exports.cmdValidateConsistency = exports.cmdVerifyKeyLinks = exports.cmdVerifyArtifacts = exports.cmdVerifyCommits = exports.cmdVerifyReferences = exports.cmdVerifyPhaseCompleteness = exports.cmdVerifyPlanStructure = exports.cmdVerifySummary = exports.cmdScaffold = exports.cmdTodoComplete = exports.cmdProgressRender = exports.cmdWebsearch = exports.cmdSummaryExtract = exports.cmdCommit = exports.cmdResolveModel = exports.cmdHistoryDigest = exports.cmdVerifyPathExists = exports.cmdListTodos = exports.cmdCurrentTimestamp = exports.cmdGenerateSlug = exports.cmdMilestoneComplete = exports.cmdRequirementsMarkComplete = exports.cmdRoadmapUpdatePlanProgress = void 0;
4220
+ exports.cmdRoadmapGetPhase = exports.cmdStateSnapshot = exports.cmdStateRecordSession = exports.cmdStateResolveBlocker = exports.cmdStateAddBlocker = exports.cmdStateAddDecision = exports.cmdStateUpdateProgress = exports.cmdStateRecordMetric = exports.cmdStateAdvancePlan = exports.cmdStateUpdate = exports.cmdStatePatch = exports.cmdStateGet = exports.cmdStateLoad = exports.stateReplaceField = exports.stateExtractField = exports.cmdConfigGet = exports.cmdConfigSet = exports.cmdConfigEnsureSection = exports.cmdFrontmatterValidate = exports.cmdFrontmatterMerge = exports.cmdFrontmatterSet = exports.cmdFrontmatterGet = exports.FRONTMATTER_SCHEMAS = exports.parseMustHavesBlock = exports.spliceFrontmatter = exports.reconstructFrontmatter = exports.extractFrontmatter = exports.getMilestoneInfo = exports.generateSlugInternal = exports.pathExistsInternal = exports.resolveModelInternal = exports.getRoadmapPhaseInternal = exports.getArchivedPhaseDirs = exports.findPhaseInternal = exports.getPhasePattern = exports.comparePhaseNum = exports.normalizePhaseName = exports.execGit = exports.isGitIgnored = exports.loadConfig = exports.safeReadFile = exports.error = exports.output = exports.MODEL_PROFILES = exports.PLANNING_CONFIG_DEFAULTS = exports.err = exports.ok = exports.phaseSlug = exports.phasePath = exports.phaseNumber = void 0;
4221
+ exports.cmdInitProgress = exports.cmdInitMapCodebase = exports.cmdInitMilestoneOp = exports.cmdInitTodos = exports.cmdInitPhaseOp = exports.cmdInitVerifyWork = exports.cmdInitResume = exports.cmdInitQuick = exports.cmdInitNewMilestone = exports.cmdInitNewProject = exports.cmdInitPlanPhase = exports.cmdInitExecutePhase = exports.cmdTemplateFill = exports.cmdTemplateSelect = exports.cmdPhaseComplete = exports.cmdPhaseRemove = exports.cmdPhaseInsert = exports.cmdPhaseAdd = exports.cmdPhasePlanIndex = exports.cmdFindPhase = exports.cmdPhaseNextDecimal = exports.cmdPhasesList = exports.cmdValidateHealth = exports.cmdValidateConsistency = exports.cmdVerifyKeyLinks = exports.cmdVerifyArtifacts = exports.cmdVerifyCommits = exports.cmdVerifyReferences = exports.cmdVerifyPhaseCompleteness = exports.cmdVerifyPlanStructure = exports.cmdVerifySummary = exports.cmdScaffold = exports.cmdTodoComplete = exports.cmdProgressRender = exports.cmdWebsearch = exports.cmdSummaryExtract = exports.cmdCommit = exports.cmdResolveModel = exports.cmdHistoryDigest = exports.cmdVerifyPathExists = exports.cmdListTodos = exports.cmdCurrentTimestamp = exports.cmdGenerateSlug = exports.cmdMilestoneComplete = exports.cmdRequirementsMarkComplete = exports.cmdRoadmapUpdatePlanProgress = exports.cmdRoadmapAnalyze = void 0;
4159
4222
  var types_js_1 = require_types();
4160
4223
  Object.defineProperty(exports, "phaseNumber", {
4161
4224
  enumerable: true,
@@ -4248,6 +4311,12 @@ var require_dist = /* @__PURE__ */ __commonJSMin(((exports) => {
4248
4311
  return core_js_1.comparePhaseNum;
4249
4312
  }
4250
4313
  });
4314
+ Object.defineProperty(exports, "getPhasePattern", {
4315
+ enumerable: true,
4316
+ get: function() {
4317
+ return core_js_1.getPhasePattern;
4318
+ }
4319
+ });
4251
4320
  Object.defineProperty(exports, "findPhaseInternal", {
4252
4321
  enumerable: true,
4253
4322
  get: function() {