maxsimcli 4.15.2 → 4.15.4
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/assets/CHANGELOG.md +14 -0
- package/dist/assets/hooks/maxsim-statusline.cjs +46 -7
- package/dist/assets/hooks/maxsim-statusline.cjs.map +1 -1
- package/dist/assets/templates/references/git-planning-commit.md +1 -1
- package/dist/assets/templates/references/questioning.md +1 -1
- package/dist/assets/templates/templates/codebase/structure.md +1 -1
- package/dist/assets/templates/templates/milestone-archive.md +3 -3
- package/dist/assets/templates/workflows/batch.md +2 -3
- package/dist/assets/templates/workflows/diagnose-issues.md +6 -6
- package/dist/assets/templates/workflows/discovery-phase.md +6 -7
- package/dist/assets/templates/workflows/discuss-phase.md +8 -11
- package/dist/assets/templates/workflows/execute-phase.md +5 -49
- package/dist/assets/templates/workflows/execute-plan.md +0 -6
- package/dist/assets/templates/workflows/go.md +2 -2
- package/dist/assets/templates/workflows/help.md +1 -1
- package/dist/assets/templates/workflows/init-existing.md +4 -5
- package/dist/assets/templates/workflows/init.md +20 -2
- package/dist/assets/templates/workflows/new-milestone.md +2 -7
- package/dist/assets/templates/workflows/new-project.md +4 -5
- package/dist/assets/templates/workflows/quick.md +0 -1
- package/dist/assets/templates/workflows/sdd.md +0 -2
- package/dist/assets/templates/workflows/settings.md +2 -7
- package/dist/assets/templates/workflows/verify-work.md +2 -16
- package/dist/cli.cjs +11 -56
- package/dist/cli.cjs.map +1 -1
- package/dist/core-D5zUr9cb.cjs.map +1 -1
- package/dist/install.cjs +10 -26
- package/dist/install.cjs.map +1 -1
- package/dist/mcp-server.cjs +2 -38
- package/dist/mcp-server.cjs.map +1 -1
- package/dist/skills-CjFWZIGM.cjs.map +1 -1
- package/package.json +1 -1
- package/dist/assets/templates/references/dashboard-bridge.md +0 -59
- package/dist/assets/templates/workflows/plan-phase.md +0 -501
|
@@ -7,14 +7,9 @@ Start a new milestone cycle for an existing project. Loads project context, gath
|
|
|
7
7
|
<required_reading>
|
|
8
8
|
|
|
9
9
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
10
|
-
@./references/dashboard-bridge.md
|
|
11
10
|
|
|
12
11
|
</required_reading>
|
|
13
12
|
|
|
14
|
-
<tool_mandate>
|
|
15
|
-
**Question routing:** At workflow start, probe for the dashboard (see @dashboard-bridge). If `DASHBOARD_ACTIVE = true`, route ALL `AskUserQuestion` calls through `mcp__maxsim-dashboard__ask_question` using the schema translation rules from @dashboard-bridge. If `DASHBOARD_ACTIVE = false`, use `AskUserQuestion` as normal.
|
|
16
|
-
</tool_mandate>
|
|
17
|
-
|
|
18
13
|
<process>
|
|
19
14
|
|
|
20
15
|
## 1. Load Context
|
|
@@ -22,12 +17,12 @@ Read all files referenced by the invoking prompt's execution_context before star
|
|
|
22
17
|
- Read PROJECT.md (existing project, validated requirements, decisions)
|
|
23
18
|
- Read MILESTONES.md (what shipped previously)
|
|
24
19
|
- Read STATE.md (pending todos, blockers)
|
|
25
|
-
- Check for MILESTONE-CONTEXT.md (from /maxsim:
|
|
20
|
+
- Check for MILESTONE-CONTEXT.md (from /maxsim:plan)
|
|
26
21
|
|
|
27
22
|
## 2. Gather Milestone Goals
|
|
28
23
|
|
|
29
24
|
**If MILESTONE-CONTEXT.md exists:**
|
|
30
|
-
- Use features and scope from
|
|
25
|
+
- Use features and scope from plan
|
|
31
26
|
- Present summary for confirmation
|
|
32
27
|
|
|
33
28
|
**If no context file:**
|
|
@@ -4,15 +4,10 @@ Initialize a new project through unified flow: questioning, research (optional),
|
|
|
4
4
|
|
|
5
5
|
<required_reading>
|
|
6
6
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
7
|
-
@./references/dashboard-bridge.md
|
|
8
7
|
@./references/thinking-partner.md
|
|
9
8
|
@./references/questioning.md
|
|
10
9
|
</required_reading>
|
|
11
10
|
|
|
12
|
-
<tool_mandate>
|
|
13
|
-
**Question routing:** At workflow start, probe for the dashboard (see @dashboard-bridge). If `DASHBOARD_ACTIVE = true`, route ALL `AskUserQuestion` calls through `mcp__maxsim-dashboard__ask_question` using the schema translation rules from @dashboard-bridge. If `DASHBOARD_ACTIVE = false`, use `AskUserQuestion` as normal.
|
|
14
|
-
</tool_mandate>
|
|
15
|
-
|
|
16
11
|
<auto_mode>
|
|
17
12
|
## Auto Mode Detection
|
|
18
13
|
|
|
@@ -52,6 +47,10 @@ The document should describe what you want to build.
|
|
|
52
47
|
|
|
53
48
|
**MANDATORY FIRST STEP — Execute these checks before ANY user interaction:**
|
|
54
49
|
|
|
50
|
+
**If `INIT_CONTEXT` was already loaded by the router** (the init.md workflow runs this before delegating), use that JSON directly — do NOT re-run the CLI command.
|
|
51
|
+
|
|
52
|
+
**Otherwise**, run:
|
|
53
|
+
|
|
55
54
|
```bash
|
|
56
55
|
INIT=$(node ~/.claude/maxsim/bin/maxsim-tools.cjs init new-project)
|
|
57
56
|
```
|
|
@@ -16,7 +16,6 @@ With `--todo` flag (or trigger words): enters Todo Mode for listing, capturing,
|
|
|
16
16
|
|
|
17
17
|
<required_reading>
|
|
18
18
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
19
|
-
@./references/dashboard-bridge.md
|
|
20
19
|
</required_reading>
|
|
21
20
|
|
|
22
21
|
<process>
|
|
@@ -4,13 +4,8 @@ Interactive configuration of MAXSIM workflow agents (research, plan_checker, ver
|
|
|
4
4
|
|
|
5
5
|
<required_reading>
|
|
6
6
|
Read all files referenced by the invoking prompt's execution_context before starting.
|
|
7
|
-
@./references/dashboard-bridge.md
|
|
8
7
|
</required_reading>
|
|
9
8
|
|
|
10
|
-
<tool_mandate>
|
|
11
|
-
**Question routing:** At workflow start, probe for the dashboard (see @dashboard-bridge). If `DASHBOARD_ACTIVE = true`, route ALL `AskUserQuestion` calls through `mcp__maxsim-dashboard__ask_question` using the schema translation rules from @dashboard-bridge. If `DASHBOARD_ACTIVE = false`, use `AskUserQuestion` as normal.
|
|
12
|
-
</tool_mandate>
|
|
13
|
-
|
|
14
9
|
<process>
|
|
15
10
|
|
|
16
11
|
<step name="ensure_and_load_config">
|
|
@@ -33,7 +28,7 @@ Parse current values (default to `true` if not present):
|
|
|
33
28
|
- `workflow.research` — spawn researcher during /maxsim:plan
|
|
34
29
|
- `workflow.plan_checker` — spawn plan checker during /maxsim:plan
|
|
35
30
|
- `workflow.verifier` — spawn verifier during /maxsim:execute
|
|
36
|
-
- `workflow.nyquist_validation` — validation architecture research during
|
|
31
|
+
- `workflow.nyquist_validation` — validation architecture research during planning
|
|
37
32
|
- `model_profile` — which model each agent uses (default: `balanced`)
|
|
38
33
|
- `git.branching_strategy` — branching approach (default: `"none"`)
|
|
39
34
|
</step>
|
|
@@ -94,7 +89,7 @@ AskUserQuestion([
|
|
|
94
89
|
header: "Nyquist",
|
|
95
90
|
multiSelect: false,
|
|
96
91
|
options: [
|
|
97
|
-
{ label: "Yes (Recommended)", description: "Research automated test coverage during
|
|
92
|
+
{ label: "Yes (Recommended)", description: "Research automated test coverage during planning. Adds validation requirements to plans. Blocks approval if tasks lack automated verify." },
|
|
98
93
|
{ label: "No", description: "Skip validation research. Good for rapid prototyping or no-test phases." }
|
|
99
94
|
]
|
|
100
95
|
},
|
|
@@ -15,7 +15,6 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D
|
|
|
15
15
|
</philosophy>
|
|
16
16
|
|
|
17
17
|
<required_reading>
|
|
18
|
-
@./references/dashboard-bridge.md
|
|
19
18
|
</required_reading>
|
|
20
19
|
|
|
21
20
|
<template>
|
|
@@ -178,20 +177,7 @@ Proceed to `present_test`.
|
|
|
178
177
|
|
|
179
178
|
Read Current Test section from UAT file.
|
|
180
179
|
|
|
181
|
-
|
|
182
|
-
```
|
|
183
|
-
mcp__maxsim-dashboard__ask_question(
|
|
184
|
-
question: "**Test {number}: {name}**\n\n{expected}\n\n---\nSelect result or describe what's wrong:",
|
|
185
|
-
options: [
|
|
186
|
-
{ value: "pass", label: "Pass" },
|
|
187
|
-
{ value: "skip", label: "Skip" }
|
|
188
|
-
],
|
|
189
|
-
allow_free_text: true
|
|
190
|
-
)
|
|
191
|
-
```
|
|
192
|
-
Map response: "pass"/"skip" → handle as pass/skip. Any other text → logged as issue.
|
|
193
|
-
|
|
194
|
-
**If `DASHBOARD_ACTIVE = false`**: display using checkpoint box format:
|
|
180
|
+
Display using checkpoint box format:
|
|
195
181
|
|
|
196
182
|
```
|
|
197
183
|
╔══════════════════════════════════════════════════════════════╗
|
|
@@ -253,7 +239,7 @@ reported: "{verbatim user response}"
|
|
|
253
239
|
severity: {inferred}
|
|
254
240
|
```
|
|
255
241
|
|
|
256
|
-
Append to Gaps section (structured YAML for plan
|
|
242
|
+
Append to Gaps section (structured YAML for plan --gaps):
|
|
257
243
|
```yaml
|
|
258
244
|
- truth: "{expected behavior from test}"
|
|
259
245
|
status: failed
|
package/dist/cli.cjs
CHANGED
|
@@ -4688,6 +4688,12 @@ const MODEL_PROFILES = {
|
|
|
4688
4688
|
balanced: "sonnet",
|
|
4689
4689
|
budget: "haiku",
|
|
4690
4690
|
tokenburner: "opus"
|
|
4691
|
+
},
|
|
4692
|
+
"debugger": {
|
|
4693
|
+
quality: "sonnet",
|
|
4694
|
+
balanced: "sonnet",
|
|
4695
|
+
budget: "haiku",
|
|
4696
|
+
tokenburner: "opus"
|
|
4691
4697
|
}
|
|
4692
4698
|
};
|
|
4693
4699
|
/** Thrown by output() to signal successful command completion. */
|
|
@@ -5046,23 +5052,6 @@ async function findPhaseInternal(cwd, phase) {
|
|
|
5046
5052
|
} catch (e) {
|
|
5047
5053
|
debugLog("find-phase-async-archive-search-failed", e);
|
|
5048
5054
|
}
|
|
5049
|
-
const milestonesDir = planningPath(cwd, "milestones");
|
|
5050
|
-
if (!await pathExistsInternal(milestonesDir)) return null;
|
|
5051
|
-
try {
|
|
5052
|
-
const archiveDirs = (await node_fs.promises.readdir(milestonesDir, { withFileTypes: true })).filter((e) => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name)).map((e) => e.name).sort().reverse();
|
|
5053
|
-
for (const archiveName of archiveDirs) {
|
|
5054
|
-
const versionMatch = archiveName.match(/^(v[\d.]+)-phases$/);
|
|
5055
|
-
if (!versionMatch) continue;
|
|
5056
|
-
const version = versionMatch[1];
|
|
5057
|
-
const result = await searchPhaseInDir(node_path.default.join(milestonesDir, archiveName), node_path.default.join(".planning", "milestones", archiveName), normalized);
|
|
5058
|
-
if (result) {
|
|
5059
|
-
result.archived = version;
|
|
5060
|
-
return result;
|
|
5061
|
-
}
|
|
5062
|
-
}
|
|
5063
|
-
} catch (e) {
|
|
5064
|
-
debugLog("find-phase-async-milestone-search-failed", e);
|
|
5065
|
-
}
|
|
5066
5055
|
return null;
|
|
5067
5056
|
}
|
|
5068
5057
|
async function getArchivedPhaseDirs(cwd) {
|
|
@@ -5083,25 +5072,6 @@ async function getArchivedPhaseDirs(cwd) {
|
|
|
5083
5072
|
} catch (e) {
|
|
5084
5073
|
debugLog("get-archived-phase-dirs-async-archive-failed", e);
|
|
5085
5074
|
}
|
|
5086
|
-
const milestonesDir = planningPath(cwd, "milestones");
|
|
5087
|
-
try {
|
|
5088
|
-
const phaseDirs = (await node_fs.promises.readdir(milestonesDir, { withFileTypes: true })).filter((e) => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name)).map((e) => e.name).sort().reverse();
|
|
5089
|
-
for (const archiveName of phaseDirs) {
|
|
5090
|
-
const versionMatch = archiveName.match(/^(v[\d.]+)-phases$/);
|
|
5091
|
-
if (!versionMatch) continue;
|
|
5092
|
-
const version = versionMatch[1];
|
|
5093
|
-
const archiveMilestonePath = node_path.default.join(milestonesDir, archiveName);
|
|
5094
|
-
const dirs = await listSubDirs(archiveMilestonePath, true);
|
|
5095
|
-
for (const dir of dirs) results.push({
|
|
5096
|
-
name: dir,
|
|
5097
|
-
milestone: version,
|
|
5098
|
-
basePath: node_path.default.join(".planning", "milestones", archiveName),
|
|
5099
|
-
fullPath: node_path.default.join(archiveMilestonePath, dir)
|
|
5100
|
-
});
|
|
5101
|
-
}
|
|
5102
|
-
} catch (e) {
|
|
5103
|
-
debugLog("get-archived-phase-dirs-async-failed", e);
|
|
5104
|
-
}
|
|
5105
5075
|
return results;
|
|
5106
5076
|
}
|
|
5107
5077
|
async function getRoadmapPhaseInternal(cwd, phaseNum) {
|
|
@@ -12868,15 +12838,10 @@ async function cmdMilestoneComplete(cwd, version, options) {
|
|
|
12868
12838
|
const stateContent = await node_fs.promises.readFile(statePath$1, "utf-8");
|
|
12869
12839
|
await node_fs.promises.writeFile(node_path.default.join(archiveDir, "STATE.md"), stateContent, "utf-8");
|
|
12870
12840
|
}
|
|
12871
|
-
|
|
12872
|
-
if (roadmapExists) {
|
|
12841
|
+
if (await pathExistsInternal(roadmapPath$1)) {
|
|
12873
12842
|
const roadmapContent = await node_fs.promises.readFile(roadmapPath$1, "utf-8");
|
|
12874
12843
|
await node_fs.promises.writeFile(node_path.default.join(archiveDir, "ROADMAP.md"), roadmapContent, "utf-8");
|
|
12875
12844
|
}
|
|
12876
|
-
if (roadmapExists) {
|
|
12877
|
-
const roadmapContent = await node_fs.promises.readFile(roadmapPath$1, "utf-8");
|
|
12878
|
-
await node_fs.promises.writeFile(node_path.default.join(archiveDir, `${version}-ROADMAP.md`), roadmapContent, "utf-8");
|
|
12879
|
-
}
|
|
12880
12845
|
if (await pathExistsInternal(reqPath)) {
|
|
12881
12846
|
const reqContent = await node_fs.promises.readFile(reqPath, "utf-8");
|
|
12882
12847
|
const archiveHeader = `# Requirements Archive: ${version} ${milestoneName}\n\n**Archived:** ${today}\n**Status:** SHIPPED\n\nFor current requirements, see \`.planning/REQUIREMENTS.md\`.\n\n---\n\n`;
|
|
@@ -12947,7 +12912,7 @@ Last session: ${today}
|
|
|
12947
12912
|
tasks: totalTasks,
|
|
12948
12913
|
accomplishments,
|
|
12949
12914
|
archived: {
|
|
12950
|
-
roadmap: await pathExistsInternal(node_path.default.join(archiveDir,
|
|
12915
|
+
roadmap: await pathExistsInternal(node_path.default.join(archiveDir, "ROADMAP.md")),
|
|
12951
12916
|
requirements: await pathExistsInternal(node_path.default.join(archiveDir, `${version}-REQUIREMENTS.md`)),
|
|
12952
12917
|
audit: await pathExistsInternal(node_path.default.join(archiveDir, `${version}-MILESTONE-AUDIT.md`)),
|
|
12953
12918
|
phases: phasesArchived,
|
|
@@ -14740,7 +14705,7 @@ async function phaseAddCore(cwd, description, options) {
|
|
|
14740
14705
|
await node_fs.promises.mkdir(dirPath, { recursive: true });
|
|
14741
14706
|
await node_fs.promises.writeFile(node_path.default.join(dirPath, ".gitkeep"), "");
|
|
14742
14707
|
if (options?.includeStubs) await scaffoldPhaseStubs(dirPath, paddedNum, description);
|
|
14743
|
-
const phaseEntry = `\n### Phase ${newPhaseNum}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${maxPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan
|
|
14708
|
+
const phaseEntry = `\n### Phase ${newPhaseNum}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${maxPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan ${newPhaseNum} to break down)\n`;
|
|
14744
14709
|
let updatedContent;
|
|
14745
14710
|
const lastSeparator = content.lastIndexOf("\n---");
|
|
14746
14711
|
if (lastSeparator > 0) updatedContent = content.slice(0, lastSeparator) + phaseEntry + content.slice(lastSeparator);
|
|
@@ -14784,7 +14749,7 @@ async function phaseInsertCore(cwd, afterPhase, description, options) {
|
|
|
14784
14749
|
await node_fs.promises.mkdir(dirPath, { recursive: true });
|
|
14785
14750
|
await node_fs.promises.writeFile(node_path.default.join(dirPath, ".gitkeep"), "");
|
|
14786
14751
|
if (options?.includeStubs) await scaffoldPhaseStubs(dirPath, decimalPhase, description);
|
|
14787
|
-
const phaseEntry = `\n### Phase ${decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan
|
|
14752
|
+
const phaseEntry = `\n### Phase ${decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan ${decimalPhase} to break down)\n`;
|
|
14788
14753
|
const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:[^\\n]*\\n)`, "i");
|
|
14789
14754
|
const headerMatch = content.match(headerPattern);
|
|
14790
14755
|
if (!headerMatch) throw new Error(`Could not find Phase ${afterPhase} header`);
|
|
@@ -15416,16 +15381,6 @@ async function cmdGetArchivedPhase(cwd, phaseNum) {
|
|
|
15416
15381
|
const normalized = normalizePhaseName(phaseNum);
|
|
15417
15382
|
const found = await searchArchiveLocations(planningPath(cwd, "archive"), normalized);
|
|
15418
15383
|
if (found) return cmdOk(found);
|
|
15419
|
-
const milestonesDir = planningPath(cwd, "milestones");
|
|
15420
|
-
if (await pathExistsInternal(milestonesDir)) try {
|
|
15421
|
-
const phaseDirs = (await node_fs.promises.readdir(milestonesDir, { withFileTypes: true })).filter((e) => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name)).map((e) => e.name).sort().reverse();
|
|
15422
|
-
for (const archiveName of phaseDirs) {
|
|
15423
|
-
const result = await searchForPhaseInDir(node_path.default.join(milestonesDir, archiveName), normalized, archiveName);
|
|
15424
|
-
if (result) return cmdOk(result);
|
|
15425
|
-
}
|
|
15426
|
-
} catch (e) {
|
|
15427
|
-
debugLog("get-archived-phase-milestones-failed", e);
|
|
15428
|
-
}
|
|
15429
15384
|
return cmdErr(`Phase ${phaseNum} not found in archive`);
|
|
15430
15385
|
}
|
|
15431
15386
|
async function searchArchiveLocations(archiveDir, normalized) {
|
|
@@ -20667,7 +20622,7 @@ async function cmdInitDebugger(cwd, phase) {
|
|
|
20667
20622
|
const phaseInfo = phase ? await findPhaseInternal(cwd, phase) : null;
|
|
20668
20623
|
const codebaseDocs = listCodebaseDocs(cwd);
|
|
20669
20624
|
const result = {
|
|
20670
|
-
debugger_model: await resolveModelInternal(cwd, "
|
|
20625
|
+
debugger_model: await resolveModelInternal(cwd, "debugger"),
|
|
20671
20626
|
commit_docs: config.commit_docs,
|
|
20672
20627
|
phase_found: !!phaseInfo,
|
|
20673
20628
|
phase_dir: phaseInfo?.directory ?? null,
|