maxsimcli 4.5.0 → 4.7.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 (221) hide show
  1. package/dist/assets/CHANGELOG.md +38 -0
  2. package/dist/backend-server.cjs +2739 -41
  3. package/dist/backend-server.cjs.map +1 -1
  4. package/dist/cli.cjs +3 -3
  5. package/dist/{lifecycle-DxCru7rk.cjs → lifecycle-D8mcsEjy.cjs} +2 -2
  6. package/dist/{lifecycle-DxCru7rk.cjs.map → lifecycle-D8mcsEjy.cjs.map} +1 -1
  7. package/dist/mcp-server.cjs +2715 -16
  8. package/dist/mcp-server.cjs.map +1 -1
  9. package/dist/{server-By0TN-nC.cjs → server-BAHfh_vw.cjs} +2716 -17
  10. package/dist/server-BAHfh_vw.cjs.map +1 -0
  11. package/package.json +1 -1
  12. package/dist/.tsbuildinfo +0 -1
  13. package/dist/backend/index.d.ts +0 -4
  14. package/dist/backend/index.d.ts.map +0 -1
  15. package/dist/backend/index.js +0 -12
  16. package/dist/backend/index.js.map +0 -1
  17. package/dist/backend/lifecycle.d.ts +0 -13
  18. package/dist/backend/lifecycle.d.ts.map +0 -1
  19. package/dist/backend/lifecycle.js +0 -168
  20. package/dist/backend/lifecycle.js.map +0 -1
  21. package/dist/backend/server.d.ts +0 -13
  22. package/dist/backend/server.d.ts.map +0 -1
  23. package/dist/backend/server.js +0 -1013
  24. package/dist/backend/server.js.map +0 -1
  25. package/dist/backend/terminal.d.ts +0 -49
  26. package/dist/backend/terminal.d.ts.map +0 -1
  27. package/dist/backend/terminal.js +0 -209
  28. package/dist/backend/terminal.js.map +0 -1
  29. package/dist/backend/types.d.ts +0 -77
  30. package/dist/backend/types.d.ts.map +0 -1
  31. package/dist/backend/types.js +0 -6
  32. package/dist/backend/types.js.map +0 -1
  33. package/dist/backend-server.d.cts +0 -2
  34. package/dist/backend-server.d.ts +0 -11
  35. package/dist/backend-server.d.ts.map +0 -1
  36. package/dist/backend-server.js +0 -43
  37. package/dist/backend-server.js.map +0 -1
  38. package/dist/cli.d.cts +0 -2
  39. package/dist/cli.d.ts +0 -7
  40. package/dist/cli.d.ts.map +0 -1
  41. package/dist/cli.js +0 -510
  42. package/dist/cli.js.map +0 -1
  43. package/dist/core/artefakte.d.ts +0 -12
  44. package/dist/core/artefakte.d.ts.map +0 -1
  45. package/dist/core/artefakte.js +0 -152
  46. package/dist/core/artefakte.js.map +0 -1
  47. package/dist/core/commands.d.ts +0 -26
  48. package/dist/core/commands.d.ts.map +0 -1
  49. package/dist/core/commands.js +0 -550
  50. package/dist/core/commands.js.map +0 -1
  51. package/dist/core/config.d.ts +0 -10
  52. package/dist/core/config.d.ts.map +0 -1
  53. package/dist/core/config.js +0 -143
  54. package/dist/core/config.js.map +0 -1
  55. package/dist/core/context-loader.d.ts +0 -21
  56. package/dist/core/context-loader.d.ts.map +0 -1
  57. package/dist/core/context-loader.js +0 -212
  58. package/dist/core/context-loader.js.map +0 -1
  59. package/dist/core/core.d.ts +0 -91
  60. package/dist/core/core.d.ts.map +0 -1
  61. package/dist/core/core.js +0 -823
  62. package/dist/core/core.js.map +0 -1
  63. package/dist/core/dashboard-launcher.d.ts +0 -56
  64. package/dist/core/dashboard-launcher.d.ts.map +0 -1
  65. package/dist/core/dashboard-launcher.js +0 -246
  66. package/dist/core/dashboard-launcher.js.map +0 -1
  67. package/dist/core/drift.d.ts +0 -37
  68. package/dist/core/drift.d.ts.map +0 -1
  69. package/dist/core/drift.js +0 -213
  70. package/dist/core/drift.js.map +0 -1
  71. package/dist/core/frontmatter.d.ts +0 -33
  72. package/dist/core/frontmatter.d.ts.map +0 -1
  73. package/dist/core/frontmatter.js +0 -193
  74. package/dist/core/frontmatter.js.map +0 -1
  75. package/dist/core/index.d.ts +0 -28
  76. package/dist/core/index.d.ts.map +0 -1
  77. package/dist/core/index.js +0 -189
  78. package/dist/core/index.js.map +0 -1
  79. package/dist/core/init.d.ts +0 -287
  80. package/dist/core/init.d.ts.map +0 -1
  81. package/dist/core/init.js +0 -816
  82. package/dist/core/init.js.map +0 -1
  83. package/dist/core/milestone.d.ts +0 -9
  84. package/dist/core/milestone.d.ts.map +0 -1
  85. package/dist/core/milestone.js +0 -230
  86. package/dist/core/milestone.js.map +0 -1
  87. package/dist/core/phase.d.ts +0 -53
  88. package/dist/core/phase.d.ts.map +0 -1
  89. package/dist/core/phase.js +0 -891
  90. package/dist/core/phase.js.map +0 -1
  91. package/dist/core/roadmap.d.ts +0 -10
  92. package/dist/core/roadmap.d.ts.map +0 -1
  93. package/dist/core/roadmap.js +0 -165
  94. package/dist/core/roadmap.js.map +0 -1
  95. package/dist/core/skills.d.ts +0 -20
  96. package/dist/core/skills.d.ts.map +0 -1
  97. package/dist/core/skills.js +0 -144
  98. package/dist/core/skills.js.map +0 -1
  99. package/dist/core/start.d.ts +0 -15
  100. package/dist/core/start.d.ts.map +0 -1
  101. package/dist/core/start.js +0 -80
  102. package/dist/core/start.js.map +0 -1
  103. package/dist/core/state.d.ts +0 -32
  104. package/dist/core/state.d.ts.map +0 -1
  105. package/dist/core/state.js +0 -582
  106. package/dist/core/state.js.map +0 -1
  107. package/dist/core/template.d.ts +0 -30
  108. package/dist/core/template.d.ts.map +0 -1
  109. package/dist/core/template.js +0 -223
  110. package/dist/core/template.js.map +0 -1
  111. package/dist/core/types.d.ts +0 -519
  112. package/dist/core/types.d.ts.map +0 -1
  113. package/dist/core/types.js +0 -60
  114. package/dist/core/types.js.map +0 -1
  115. package/dist/core/verify.d.ts +0 -128
  116. package/dist/core/verify.d.ts.map +0 -1
  117. package/dist/core/verify.js +0 -754
  118. package/dist/core/verify.js.map +0 -1
  119. package/dist/hooks/index.d.ts +0 -11
  120. package/dist/hooks/index.d.ts.map +0 -1
  121. package/dist/hooks/index.js +0 -18
  122. package/dist/hooks/index.js.map +0 -1
  123. package/dist/hooks/maxsim-check-update.d.ts +0 -17
  124. package/dist/hooks/maxsim-check-update.d.ts.map +0 -1
  125. package/dist/hooks/maxsim-check-update.js +0 -101
  126. package/dist/hooks/maxsim-check-update.js.map +0 -1
  127. package/dist/hooks/maxsim-context-monitor.d.ts +0 -21
  128. package/dist/hooks/maxsim-context-monitor.d.ts.map +0 -1
  129. package/dist/hooks/maxsim-context-monitor.js +0 -131
  130. package/dist/hooks/maxsim-context-monitor.js.map +0 -1
  131. package/dist/hooks/maxsim-statusline.d.ts +0 -19
  132. package/dist/hooks/maxsim-statusline.d.ts.map +0 -1
  133. package/dist/hooks/maxsim-statusline.js +0 -146
  134. package/dist/hooks/maxsim-statusline.js.map +0 -1
  135. package/dist/hooks/shared.d.ts +0 -11
  136. package/dist/hooks/shared.d.ts.map +0 -1
  137. package/dist/hooks/shared.js +0 -29
  138. package/dist/hooks/shared.js.map +0 -1
  139. package/dist/index.d.ts +0 -2
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js +0 -3
  142. package/dist/index.js.map +0 -1
  143. package/dist/install/adapters.d.ts +0 -6
  144. package/dist/install/adapters.d.ts.map +0 -1
  145. package/dist/install/adapters.js +0 -65
  146. package/dist/install/adapters.js.map +0 -1
  147. package/dist/install/copy.d.ts +0 -6
  148. package/dist/install/copy.d.ts.map +0 -1
  149. package/dist/install/copy.js +0 -71
  150. package/dist/install/copy.js.map +0 -1
  151. package/dist/install/dashboard.d.ts +0 -16
  152. package/dist/install/dashboard.d.ts.map +0 -1
  153. package/dist/install/dashboard.js +0 -273
  154. package/dist/install/dashboard.js.map +0 -1
  155. package/dist/install/hooks.d.ts +0 -31
  156. package/dist/install/hooks.d.ts.map +0 -1
  157. package/dist/install/hooks.js +0 -260
  158. package/dist/install/hooks.js.map +0 -1
  159. package/dist/install/index.d.ts +0 -2
  160. package/dist/install/index.d.ts.map +0 -1
  161. package/dist/install/index.js +0 -534
  162. package/dist/install/index.js.map +0 -1
  163. package/dist/install/manifest.d.ts +0 -23
  164. package/dist/install/manifest.d.ts.map +0 -1
  165. package/dist/install/manifest.js +0 -133
  166. package/dist/install/manifest.js.map +0 -1
  167. package/dist/install/patches.d.ts +0 -10
  168. package/dist/install/patches.d.ts.map +0 -1
  169. package/dist/install/patches.js +0 -124
  170. package/dist/install/patches.js.map +0 -1
  171. package/dist/install/shared.d.ts +0 -56
  172. package/dist/install/shared.d.ts.map +0 -1
  173. package/dist/install/shared.js +0 -181
  174. package/dist/install/shared.js.map +0 -1
  175. package/dist/install/uninstall.d.ts +0 -5
  176. package/dist/install/uninstall.d.ts.map +0 -1
  177. package/dist/install/uninstall.js +0 -222
  178. package/dist/install/uninstall.js.map +0 -1
  179. package/dist/install/utils.d.ts +0 -27
  180. package/dist/install/utils.d.ts.map +0 -1
  181. package/dist/install/utils.js +0 -99
  182. package/dist/install/utils.js.map +0 -1
  183. package/dist/install.d.cts +0 -2
  184. package/dist/mcp/config-tools.d.ts +0 -13
  185. package/dist/mcp/config-tools.d.ts.map +0 -1
  186. package/dist/mcp/config-tools.js +0 -66
  187. package/dist/mcp/config-tools.js.map +0 -1
  188. package/dist/mcp/context-tools.d.ts +0 -13
  189. package/dist/mcp/context-tools.d.ts.map +0 -1
  190. package/dist/mcp/context-tools.js +0 -176
  191. package/dist/mcp/context-tools.js.map +0 -1
  192. package/dist/mcp/index.d.ts +0 -11
  193. package/dist/mcp/index.d.ts.map +0 -1
  194. package/dist/mcp/index.js +0 -26
  195. package/dist/mcp/index.js.map +0 -1
  196. package/dist/mcp/phase-tools.d.ts +0 -13
  197. package/dist/mcp/phase-tools.d.ts.map +0 -1
  198. package/dist/mcp/phase-tools.js +0 -177
  199. package/dist/mcp/phase-tools.js.map +0 -1
  200. package/dist/mcp/roadmap-tools.d.ts +0 -13
  201. package/dist/mcp/roadmap-tools.d.ts.map +0 -1
  202. package/dist/mcp/roadmap-tools.js +0 -79
  203. package/dist/mcp/roadmap-tools.js.map +0 -1
  204. package/dist/mcp/state-tools.d.ts +0 -13
  205. package/dist/mcp/state-tools.d.ts.map +0 -1
  206. package/dist/mcp/state-tools.js +0 -185
  207. package/dist/mcp/state-tools.js.map +0 -1
  208. package/dist/mcp/todo-tools.d.ts +0 -13
  209. package/dist/mcp/todo-tools.d.ts.map +0 -1
  210. package/dist/mcp/todo-tools.js +0 -143
  211. package/dist/mcp/todo-tools.js.map +0 -1
  212. package/dist/mcp/utils.d.ts +0 -27
  213. package/dist/mcp/utils.d.ts.map +0 -1
  214. package/dist/mcp/utils.js +0 -82
  215. package/dist/mcp/utils.js.map +0 -1
  216. package/dist/mcp-server.d.cts +0 -2
  217. package/dist/mcp-server.d.ts +0 -12
  218. package/dist/mcp-server.d.ts.map +0 -1
  219. package/dist/mcp-server.js +0 -31
  220. package/dist/mcp-server.js.map +0 -1
  221. package/dist/server-By0TN-nC.cjs.map +0 -1
package/dist/cli.cjs CHANGED
@@ -17387,7 +17387,7 @@ const COMMANDS = {
17387
17387
  (0, node_child_process.spawn)(process.execPath, [serverPath], { stdio: "inherit" }).on("exit", (code) => process.exit(code ?? 0));
17388
17388
  },
17389
17389
  "backend-start": async (args, cwd, raw) => {
17390
- const { startBackend } = await Promise.resolve().then(() => require("./lifecycle-DxCru7rk.cjs"));
17390
+ const { startBackend } = await Promise.resolve().then(() => require("./lifecycle-D8mcsEjy.cjs"));
17391
17391
  const portFlag = args.find((a) => a.startsWith("--port="))?.split("=")[1];
17392
17392
  const background = !args.includes("--foreground");
17393
17393
  output(await startBackend(cwd, {
@@ -17396,11 +17396,11 @@ const COMMANDS = {
17396
17396
  }), raw);
17397
17397
  },
17398
17398
  "backend-stop": async (_args, cwd, raw) => {
17399
- const { stopBackend } = await Promise.resolve().then(() => require("./lifecycle-DxCru7rk.cjs"));
17399
+ const { stopBackend } = await Promise.resolve().then(() => require("./lifecycle-D8mcsEjy.cjs"));
17400
17400
  output({ stopped: await stopBackend(cwd) }, raw);
17401
17401
  },
17402
17402
  "backend-status": async (_args, cwd, raw) => {
17403
- const { getBackendStatus } = await Promise.resolve().then(() => require("./lifecycle-DxCru7rk.cjs"));
17403
+ const { getBackendStatus } = await Promise.resolve().then(() => require("./lifecycle-D8mcsEjy.cjs"));
17404
17404
  output(await getBackendStatus(cwd) || { running: false }, raw);
17405
17405
  }
17406
17406
  };
@@ -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-By0TN-nC.cjs"));
87
+ const { createBackendServer } = await Promise.resolve().then(() => require("./server-BAHfh_vw.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-DxCru7rk.cjs.map
136
+ //# sourceMappingURL=lifecycle-D8mcsEjy.cjs.map
@@ -1 +1 @@
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
+ {"version":3,"file":"lifecycle-D8mcsEjy.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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"}