maxsimcli 4.4.0 → 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.
Files changed (53) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/assets/CHANGELOG.md +19 -0
  3. package/dist/assets/dashboard/server.js +248 -240
  4. package/dist/assets/templates/agents/AGENTS.md +1 -0
  5. package/dist/assets/templates/agents/maxsim-drift-checker.md +522 -0
  6. package/dist/assets/templates/commands/maxsim/check-drift.md +56 -0
  7. package/dist/assets/templates/commands/maxsim/discuss.md +70 -0
  8. package/dist/assets/templates/commands/maxsim/realign.md +39 -0
  9. package/dist/assets/templates/workflows/check-drift.md +248 -0
  10. package/dist/assets/templates/workflows/discuss.md +343 -0
  11. package/dist/assets/templates/workflows/progress.md +8 -0
  12. package/dist/assets/templates/workflows/realign.md +288 -0
  13. package/dist/assets/templates/workflows/roadmap.md +69 -20
  14. package/dist/backend-server.cjs +52 -29
  15. package/dist/backend-server.cjs.map +1 -1
  16. package/dist/cli.cjs +261 -5
  17. package/dist/cli.cjs.map +1 -1
  18. package/dist/cli.js +20 -1
  19. package/dist/cli.js.map +1 -1
  20. package/dist/core/core.d.ts.map +1 -1
  21. package/dist/core/core.js +1 -0
  22. package/dist/core/core.js.map +1 -1
  23. package/dist/core/drift.d.ts +37 -0
  24. package/dist/core/drift.d.ts.map +1 -0
  25. package/dist/core/drift.js +213 -0
  26. package/dist/core/drift.js.map +1 -0
  27. package/dist/core/frontmatter.d.ts.map +1 -1
  28. package/dist/core/frontmatter.js +3 -0
  29. package/dist/core/frontmatter.js.map +1 -1
  30. package/dist/core/index.d.ts +3 -2
  31. package/dist/core/index.d.ts.map +1 -1
  32. package/dist/core/index.js +12 -2
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/init.d.ts +5 -3
  35. package/dist/core/init.d.ts.map +1 -1
  36. package/dist/core/init.js +89 -0
  37. package/dist/core/init.js.map +1 -1
  38. package/dist/core/types.d.ts +50 -1
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/core/types.js.map +1 -1
  41. package/dist/core-RRjCSt0G.cjs.map +1 -1
  42. package/dist/{lifecycle-0M4VqOMm.cjs → lifecycle-DxCru7rk.cjs} +2 -2
  43. package/dist/{lifecycle-0M4VqOMm.cjs.map → lifecycle-DxCru7rk.cjs.map} +1 -1
  44. package/dist/mcp/phase-tools.d.ts.map +1 -1
  45. package/dist/mcp/phase-tools.js +17 -4
  46. package/dist/mcp/phase-tools.js.map +1 -1
  47. package/dist/mcp-server.cjs +20 -5
  48. package/dist/mcp-server.cjs.map +1 -1
  49. package/dist/{server-G1MIg_Oe.cjs → server-By0TN-nC.cjs} +21 -6
  50. package/dist/server-By0TN-nC.cjs.map +1 -0
  51. package/dist/skills-MYlMkYNt.cjs.map +1 -1
  52. package/package.json +1 -1
  53. 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-G1MIg_Oe.cjs"));
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-0M4VqOMm.cjs.map
136
+ //# sourceMappingURL=lifecycle-DxCru7rk.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-0M4VqOMm.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
+ {"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,CA2M1D"}
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"}
@@ -53,13 +53,23 @@ function registerPhaseTools(server) {
53
53
  }
54
54
  });
55
55
  // ── mcp_list_phases ─────────────────────────────────────────────────────────
56
- server.tool('mcp_list_phases', 'List all phase directories, sorted correctly. Optionally include archived phases from milestones.', {
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
- }, async ({ include_archived }) => {
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
- return (0, utils_js_1.mcpSuccess)({ directories: dirs, count: dirs.length }, `Found ${dirs.length} phase(s)`);
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":"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"}
1
+ {"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"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"}
@@ -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 all phase directories, sorted correctly. Optionally include archived phases from milestones.", { include_archived: booleanType().optional().default(false).describe("Include archived phases from completed milestones") }, async ({ include_archived }) => {
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: dirs,
34101
- count: dirs.length
34102
- }, `Found ${dirs.length} phase(s)`);
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
  }