maxsimcli 4.3.1 → 4.5.0
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/.tsbuildinfo +1 -1
- package/dist/assets/CHANGELOG.md +26 -0
- package/dist/assets/dashboard/server.js +248 -240
- package/dist/assets/templates/agents/AGENTS.md +68 -0
- package/dist/assets/templates/agents/maxsim-code-reviewer.md +138 -4
- package/dist/assets/templates/agents/maxsim-codebase-mapper.md +94 -7
- package/dist/assets/templates/agents/maxsim-debugger.md +124 -0
- package/dist/assets/templates/agents/maxsim-drift-checker.md +522 -0
- package/dist/assets/templates/agents/maxsim-executor.md +213 -8
- package/dist/assets/templates/agents/maxsim-integration-checker.md +99 -1
- package/dist/assets/templates/agents/maxsim-phase-researcher.md +83 -4
- package/dist/assets/templates/agents/maxsim-plan-checker.md +99 -4
- package/dist/assets/templates/agents/maxsim-planner.md +97 -0
- package/dist/assets/templates/agents/maxsim-project-researcher.md +82 -0
- package/dist/assets/templates/agents/maxsim-research-synthesizer.md +81 -0
- package/dist/assets/templates/agents/maxsim-roadmapper.md +85 -0
- package/dist/assets/templates/agents/maxsim-spec-reviewer.md +141 -4
- package/dist/assets/templates/agents/maxsim-verifier.md +102 -4
- package/dist/assets/templates/commands/maxsim/check-drift.md +56 -0
- package/dist/assets/templates/commands/maxsim/discuss.md +70 -0
- package/dist/assets/templates/commands/maxsim/realign.md +39 -0
- package/dist/assets/templates/workflows/check-drift.md +248 -0
- package/dist/assets/templates/workflows/discuss.md +343 -0
- package/dist/assets/templates/workflows/execute-phase.md +10 -6
- package/dist/assets/templates/workflows/progress.md +8 -0
- package/dist/assets/templates/workflows/quick.md +110 -0
- package/dist/assets/templates/workflows/realign.md +288 -0
- package/dist/assets/templates/workflows/roadmap.md +69 -20
- package/dist/backend-server.cjs +52 -29
- package/dist/backend-server.cjs.map +1 -1
- package/dist/cli.cjs +407 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +26 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.js +1 -0
- package/dist/core/core.js.map +1 -1
- package/dist/core/drift.d.ts +37 -0
- package/dist/core/drift.d.ts.map +1 -0
- package/dist/core/drift.js +213 -0
- package/dist/core/drift.js.map +1 -0
- package/dist/core/frontmatter.d.ts.map +1 -1
- package/dist/core/frontmatter.js +6 -0
- package/dist/core/frontmatter.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +18 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/init.d.ts +15 -3
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +251 -0
- package/dist/core/init.js.map +1 -1
- package/dist/core/types.d.ts +132 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core-RRjCSt0G.cjs.map +1 -1
- package/dist/{lifecycle-0M4VqOMm.cjs → lifecycle-DxCru7rk.cjs} +2 -2
- package/dist/{lifecycle-0M4VqOMm.cjs.map → lifecycle-DxCru7rk.cjs.map} +1 -1
- package/dist/mcp/phase-tools.d.ts.map +1 -1
- package/dist/mcp/phase-tools.js +17 -4
- package/dist/mcp/phase-tools.js.map +1 -1
- package/dist/mcp-server.cjs +20 -5
- package/dist/mcp-server.cjs.map +1 -1
- package/dist/{server-G1MIg_Oe.cjs → server-By0TN-nC.cjs} +21 -6
- package/dist/server-By0TN-nC.cjs.map +1 -0
- package/dist/skills-MYlMkYNt.cjs.map +1 -1
- package/package.json +1 -1
- package/dist/server-G1MIg_Oe.cjs.map +0 -1
|
@@ -84,7 +84,7 @@ async function startBackend(projectCwd, opts) {
|
|
|
84
84
|
writeLockFile(projectCwd, lockData);
|
|
85
85
|
return lockData;
|
|
86
86
|
} else {
|
|
87
|
-
const { createBackendServer } = await Promise.resolve().then(() => require("./server-
|
|
87
|
+
const { createBackendServer } = await Promise.resolve().then(() => require("./server-By0TN-nC.cjs"));
|
|
88
88
|
const server = createBackendServer({
|
|
89
89
|
port,
|
|
90
90
|
host: "127.0.0.1",
|
|
@@ -133,4 +133,4 @@ async function getBackendStatus(projectCwd) {
|
|
|
133
133
|
exports.getBackendStatus = getBackendStatus;
|
|
134
134
|
exports.startBackend = startBackend;
|
|
135
135
|
exports.stopBackend = stopBackend;
|
|
136
|
-
//# sourceMappingURL=lifecycle-
|
|
136
|
+
//# sourceMappingURL=lifecycle-DxCru7rk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-
|
|
1
|
+
{"version":3,"file":"lifecycle-DxCru7rk.cjs","names":["path","fs"],"sources":["../src/backend/lifecycle.ts"],"sourcesContent":["/**\n * Backend Lifecycle — Start, stop, health check, discovery\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { BackendLockFile, BackendStatus } from './types.js';\n\nconst LOCK_FILE = '.planning/.backend-lock';\n\n/**\n * Derive a deterministic port for a project path (range 3100-3199).\n * Simple hash mapped to 100-port range.\n */\nfunction projectPort(projectCwd: string): number {\n let hash = 0;\n for (const ch of projectCwd) {\n hash = ((hash << 5) - hash + ch.charCodeAt(0)) | 0;\n }\n return 3100 + (Math.abs(hash) % 100);\n}\n\nfunction lockFilePath(projectCwd: string): string {\n return path.join(projectCwd, LOCK_FILE);\n}\n\nfunction readLockFile(projectCwd: string): BackendLockFile | null {\n try {\n return JSON.parse(fs.readFileSync(lockFilePath(projectCwd), 'utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction writeLockFile(projectCwd: string, data: BackendLockFile): void {\n const lockPath = lockFilePath(projectCwd);\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n fs.writeFileSync(lockPath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nfunction removeLockFile(projectCwd: string): void {\n const lockPath = lockFilePath(projectCwd);\n try {\n fs.unlinkSync(lockPath);\n } catch {\n // may not exist\n }\n}\n\n/**\n * Make an HTTP request and return the parsed JSON body.\n * Uses native fetch (Node 22+).\n */\nasync function httpJson(\n method: string,\n url: string,\n timeoutMs: number = 5000,\n): Promise<Record<string, unknown> | null> {\n try {\n const res = await fetch(url, {\n method,\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return null;\n return await res.json() as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function startBackend(\n projectCwd: string,\n opts?: { port?: number; background?: boolean },\n): Promise<BackendLockFile> {\n // 1. Check if already running\n const existing = await getBackendStatus(projectCwd);\n if (existing && existing.status === 'ok') {\n return readLockFile(projectCwd)!;\n }\n\n // 2. Choose port\n const port = opts?.port ?? projectPort(projectCwd);\n const background = opts?.background ?? true;\n\n if (background) {\n // Spawn detached child process running backend-server.cjs\n const serverScript = path.join(__dirname, 'backend-server.cjs');\n const child = spawn(process.execPath, [serverScript], {\n cwd: projectCwd,\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n MAXSIM_PORT: String(port),\n MAXSIM_PROJECT_CWD: projectCwd,\n },\n ...(process.platform === 'win32' ? { shell: true } : {}),\n });\n child.unref();\n\n const lockData: BackendLockFile = {\n pid: child.pid ?? 0,\n port,\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n } else {\n // Foreground mode — import and start directly\n const { createBackendServer } = await import('./server.js');\n const server = createBackendServer({\n port,\n host: '127.0.0.1',\n projectCwd,\n enableTerminal: true,\n enableFileWatcher: true,\n enableMcp: true,\n logDir: path.join(projectCwd, '.planning', 'logs'),\n });\n\n await server.start();\n\n const lockData: BackendLockFile = {\n pid: process.pid,\n port: server.getPort(),\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n }\n}\n\nexport async function stopBackend(projectCwd: string): Promise<boolean> {\n const lock = readLockFile(projectCwd);\n if (!lock) return false;\n\n // Try graceful shutdown via HTTP\n const result = await httpJson('POST', `http://127.0.0.1:${lock.port}/api/shutdown`);\n if (result) {\n removeLockFile(projectCwd);\n return true;\n }\n\n // Fallback: kill by PID\n try {\n process.kill(lock.pid, 'SIGTERM');\n } catch {\n // Process may already be dead\n }\n\n removeLockFile(projectCwd);\n return true;\n}\n\nexport async function getBackendStatus(projectCwd: string): Promise<BackendStatus | null> {\n const lock = readLockFile(projectCwd);\n if (!lock) return null;\n\n const data = await httpJson('GET', `http://127.0.0.1:${lock.port}/api/health`);\n if (!data || data.status !== 'ok') {\n // Stale lock file — clean up\n removeLockFile(projectCwd);\n return null;\n }\n\n return data as unknown as BackendStatus;\n}\n\nexport async function isBackendRunning(projectCwd: string): Promise<boolean> {\n const status = await getBackendStatus(projectCwd);\n return status !== null && status.status === 'ok';\n}\n\nexport function findBackendPort(projectCwd: string): number | null {\n const lock = readLockFile(projectCwd);\n return lock ? lock.port : null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phase-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"phase-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyN1D"}
|
package/dist/mcp/phase-tools.js
CHANGED
|
@@ -53,13 +53,23 @@ function registerPhaseTools(server) {
|
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
// ── mcp_list_phases ─────────────────────────────────────────────────────────
|
|
56
|
-
server.tool('mcp_list_phases', 'List
|
|
56
|
+
server.tool('mcp_list_phases', 'List phase directories with pagination. Returns sorted phases with offset/limit support.', {
|
|
57
57
|
include_archived: zod_1.z
|
|
58
58
|
.boolean()
|
|
59
59
|
.optional()
|
|
60
60
|
.default(false)
|
|
61
61
|
.describe('Include archived phases from completed milestones'),
|
|
62
|
-
|
|
62
|
+
offset: zod_1.z
|
|
63
|
+
.number()
|
|
64
|
+
.optional()
|
|
65
|
+
.default(0)
|
|
66
|
+
.describe('Number of phases to skip (for pagination)'),
|
|
67
|
+
limit: zod_1.z
|
|
68
|
+
.number()
|
|
69
|
+
.optional()
|
|
70
|
+
.default(20)
|
|
71
|
+
.describe('Maximum number of phases to return'),
|
|
72
|
+
}, async ({ include_archived, offset, limit }) => {
|
|
63
73
|
try {
|
|
64
74
|
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
65
75
|
if (!cwd) {
|
|
@@ -67,7 +77,7 @@ function registerPhaseTools(server) {
|
|
|
67
77
|
}
|
|
68
78
|
const phasesDir = (0, core_js_1.phasesPath)(cwd);
|
|
69
79
|
if (!node_fs_1.default.existsSync(phasesDir)) {
|
|
70
|
-
return (0, utils_js_1.mcpSuccess)({ directories: [], count: 0 }, 'No phases directory found');
|
|
80
|
+
return (0, utils_js_1.mcpSuccess)({ directories: [], count: 0, total_count: 0, offset, limit, has_more: false }, 'No phases directory found');
|
|
71
81
|
}
|
|
72
82
|
let dirs = (0, core_js_1.listSubDirs)(phasesDir);
|
|
73
83
|
if (include_archived) {
|
|
@@ -77,7 +87,10 @@ function registerPhaseTools(server) {
|
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
89
|
dirs.sort((a, b) => (0, core_js_1.comparePhaseNum)(a, b));
|
|
80
|
-
|
|
90
|
+
const total_count = dirs.length;
|
|
91
|
+
const paginated = dirs.slice(offset, offset + limit);
|
|
92
|
+
const has_more = offset + limit < total_count;
|
|
93
|
+
return (0, utils_js_1.mcpSuccess)({ directories: paginated, count: paginated.length, total_count, offset, limit, has_more }, `Showing ${paginated.length} of ${total_count} phase(s)`);
|
|
81
94
|
}
|
|
82
95
|
catch (e) {
|
|
83
96
|
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AAyBH,
|
|
1
|
+
{"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.cjs
CHANGED
|
@@ -34081,14 +34081,22 @@ function registerPhaseTools(server) {
|
|
|
34081
34081
|
return mcpError(e.message, "Operation failed");
|
|
34082
34082
|
}
|
|
34083
34083
|
});
|
|
34084
|
-
server.tool("mcp_list_phases", "List
|
|
34084
|
+
server.tool("mcp_list_phases", "List phase directories with pagination. Returns sorted phases with offset/limit support.", {
|
|
34085
|
+
include_archived: booleanType().optional().default(false).describe("Include archived phases from completed milestones"),
|
|
34086
|
+
offset: numberType().optional().default(0).describe("Number of phases to skip (for pagination)"),
|
|
34087
|
+
limit: numberType().optional().default(20).describe("Maximum number of phases to return")
|
|
34088
|
+
}, async ({ include_archived, offset, limit }) => {
|
|
34085
34089
|
try {
|
|
34086
34090
|
const cwd = detectProjectRoot();
|
|
34087
34091
|
if (!cwd) return mcpError("No .planning/ directory found", "Project not detected");
|
|
34088
34092
|
const phasesDir = phasesPath(cwd);
|
|
34089
34093
|
if (!node_fs.default.existsSync(phasesDir)) return mcpSuccess({
|
|
34090
34094
|
directories: [],
|
|
34091
|
-
count: 0
|
|
34095
|
+
count: 0,
|
|
34096
|
+
total_count: 0,
|
|
34097
|
+
offset,
|
|
34098
|
+
limit,
|
|
34099
|
+
has_more: false
|
|
34092
34100
|
}, "No phases directory found");
|
|
34093
34101
|
let dirs = listSubDirs(phasesDir);
|
|
34094
34102
|
if (include_archived) {
|
|
@@ -34096,10 +34104,17 @@ function registerPhaseTools(server) {
|
|
|
34096
34104
|
for (const a of archived) dirs.push(`${a.name} [${a.milestone}]`);
|
|
34097
34105
|
}
|
|
34098
34106
|
dirs.sort((a, b) => comparePhaseNum(a, b));
|
|
34107
|
+
const total_count = dirs.length;
|
|
34108
|
+
const paginated = dirs.slice(offset, offset + limit);
|
|
34109
|
+
const has_more = offset + limit < total_count;
|
|
34099
34110
|
return mcpSuccess({
|
|
34100
|
-
directories:
|
|
34101
|
-
count:
|
|
34102
|
-
|
|
34111
|
+
directories: paginated,
|
|
34112
|
+
count: paginated.length,
|
|
34113
|
+
total_count,
|
|
34114
|
+
offset,
|
|
34115
|
+
limit,
|
|
34116
|
+
has_more
|
|
34117
|
+
}, `Showing ${paginated.length} of ${total_count} phase(s)`);
|
|
34103
34118
|
} catch (e) {
|
|
34104
34119
|
return mcpError(e.message, "Operation failed");
|
|
34105
34120
|
}
|