aicodeman 1.13.0 → 1.14.1

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 (95) hide show
  1. package/README.md +38 -2
  2. package/dist/ai-checker-base.d.ts +2 -0
  3. package/dist/ai-checker-base.d.ts.map +1 -1
  4. package/dist/ai-checker-base.js +31 -3
  5. package/dist/ai-checker-base.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +249 -16
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config/service-names.d.ts +23 -0
  10. package/dist/config/service-names.d.ts.map +1 -0
  11. package/dist/config/service-names.js +29 -0
  12. package/dist/config/service-names.js.map +1 -0
  13. package/dist/daemon-control.d.ts +126 -0
  14. package/dist/daemon-control.d.ts.map +1 -0
  15. package/dist/daemon-control.js +433 -0
  16. package/dist/daemon-control.js.map +1 -0
  17. package/dist/hooks-config.d.ts +72 -8
  18. package/dist/hooks-config.d.ts.map +1 -1
  19. package/dist/hooks-config.js +358 -31
  20. package/dist/hooks-config.js.map +1 -1
  21. package/dist/service-installer.d.ts +96 -0
  22. package/dist/service-installer.d.ts.map +1 -0
  23. package/dist/service-installer.js +333 -0
  24. package/dist/service-installer.js.map +1 -0
  25. package/dist/web/ports/config-port.d.ts +2 -0
  26. package/dist/web/ports/config-port.d.ts.map +1 -1
  27. package/dist/web/public/admin-ui.js.gz +0 -0
  28. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  29. package/dist/web/public/app.b24f795e.js.gz +0 -0
  30. package/dist/web/public/constants.e7175b95.js.gz +0 -0
  31. package/dist/web/public/cron-ui.js.gz +0 -0
  32. package/dist/web/public/entrance-animations.js.gz +0 -0
  33. package/dist/web/public/i18n.da34cfaf.js.gz +0 -0
  34. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  35. package/dist/web/public/index.html +11 -3
  36. package/dist/web/public/index.html.br +0 -0
  37. package/dist/web/public/index.html.gz +0 -0
  38. package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
  39. package/dist/web/public/keyboard-accessory.9936227d.js.gz +0 -0
  40. package/dist/web/public/mobile-handlers.32fdd57f.js.gz +0 -0
  41. package/dist/web/public/mobile-overview.js.gz +0 -0
  42. package/dist/web/public/mobile.32cacde5.css.gz +0 -0
  43. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  44. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  45. package/dist/web/public/panels-ui.1d4203e0.js.gz +0 -0
  46. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  47. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  48. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  49. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  50. package/dist/web/public/session-ui.1356a4f4.js.gz +0 -0
  51. package/dist/web/public/{settings-ui.ea63d5db.js → settings-ui.b41d33a5.js} +2 -2
  52. package/dist/web/public/settings-ui.b41d33a5.js.br +0 -0
  53. package/dist/web/public/settings-ui.b41d33a5.js.gz +0 -0
  54. package/dist/web/public/styles.b10e5edd.css.gz +0 -0
  55. package/dist/web/public/subagent-windows.4cc8b005.js.gz +0 -0
  56. package/dist/web/public/sw.js.gz +0 -0
  57. package/dist/web/public/{terminal-ui.78c71f3a.js → terminal-ui.bc6819a9.js} +3 -3
  58. package/dist/web/public/terminal-ui.bc6819a9.js.br +0 -0
  59. package/dist/web/public/terminal-ui.bc6819a9.js.gz +0 -0
  60. package/dist/web/public/ultracode-panel.js.gz +0 -0
  61. package/dist/web/public/ultracode-windows.js.gz +0 -0
  62. package/dist/web/public/upload.html.gz +0 -0
  63. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  64. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  65. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  66. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  67. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  68. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  69. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  70. package/dist/web/public/vendor/xterm.css.gz +0 -0
  71. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  72. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  73. package/dist/web/public/webview-tabs.js.gz +0 -0
  74. package/dist/web/routes/session-routes.d.ts.map +1 -1
  75. package/dist/web/routes/session-routes.js +16 -1
  76. package/dist/web/routes/session-routes.js.map +1 -1
  77. package/dist/web/schemas.d.ts +1 -0
  78. package/dist/web/schemas.d.ts.map +1 -1
  79. package/dist/web/schemas.js +8 -0
  80. package/dist/web/schemas.js.map +1 -1
  81. package/dist/web/self-update.d.ts.map +1 -1
  82. package/dist/web/self-update.js +4 -4
  83. package/dist/web/self-update.js.map +1 -1
  84. package/dist/web/server.d.ts +1 -0
  85. package/dist/web/server.d.ts.map +1 -1
  86. package/dist/web/server.js +7 -0
  87. package/dist/web/server.js.map +1 -1
  88. package/package.json +1 -1
  89. package/skills/codeman/SKILL.md +94 -24
  90. package/skills/codeman/reference/endpoints.md +21 -6
  91. package/skills/codeman/reference/recipes.md +55 -25
  92. package/dist/web/public/settings-ui.ea63d5db.js.br +0 -0
  93. package/dist/web/public/settings-ui.ea63d5db.js.gz +0 -0
  94. package/dist/web/public/terminal-ui.78c71f3a.js.br +0 -0
  95. package/dist/web/public/terminal-ui.78c71f3a.js.gz +0 -0
package/README.md CHANGED
@@ -85,9 +85,29 @@ codeman web --multiuser # named logins + per-user case spaces
85
85
  Details in [Multi-User Mode](#multi-user-mode-opt-in) below.
86
86
 
87
87
  <details>
88
- <summary><strong>Run as a background service</strong></summary>
88
+ <summary><strong>Keep it running in the background</strong></summary>
89
89
 
90
- The installer's final menu sets this up for you (option 2) and verifies the service actually comes up before claiming success. To configure it manually instead:
90
+ To outlive the shell you started it in, without setting anything up:
91
+
92
+ ```bash
93
+ codeman web -d # detach; logs to ~/.codeman/web.log
94
+ codeman web --status # is it up, and on which pid
95
+ codeman web --stop # graceful SIGTERM; agents keep running in tmux
96
+ ```
97
+
98
+ `-d` waits until the server actually answers before reporting success, and refuses to start a second one on the same data dir (two servers sharing a tmux socket attach to each other's sessions).
99
+
100
+ To have it come back after a reboot, install it as a service instead. The installer's final menu does this for you (option 2); `codeman service` is the equivalent for an `npm i -g aicodeman` install:
101
+
102
+ ```bash
103
+ codeman service install # systemd user unit (Linux) or LaunchAgent (macOS)
104
+ codeman service status
105
+ codeman service uninstall
106
+ ```
107
+
108
+ `service install` writes the unit with your current PATH baked in, which matters more than it sounds: launchd hands a job `/usr/bin:/bin:/usr/sbin:/sbin`, so a Homebrew or nvm `node`, `tmux` or `claude` is invisible to a hand-written plist. It never copies `CODEMAN_PASSWORD` into the unit file; add that yourself if the service needs auth.
109
+
110
+ To write the unit by hand instead:
91
111
 
92
112
  **Linux (systemd):**
93
113
 
@@ -220,6 +240,8 @@ codeman web # localhost:3000 (loopback only — safe defau
220
240
  codeman web --port 8080 # custom port (or set CODEMAN_PORT)
221
241
  codeman web --https # self-signed TLS (only needed for remote access)
222
242
  codeman web -H 0.0.0.0 # bind LAN — REQUIRES CODEMAN_PASSWORD (see Security)
243
+ codeman web -d # detach: survives closing the shell (--status, --stop)
244
+ codeman service install # systemd/launchd service: comes back after reboots
223
245
  ```
224
246
 
225
247
  Open the printed URL. The page is a single dashboard; everything below happens there.
@@ -268,6 +290,7 @@ Hit start — Codeman spawns the CLI via a real PTY and streams it to your brows
268
290
  ### 7. Operate & maintain
269
291
 
270
292
  - **App Settings** — model, effort, permission startup mode, theme/skin, notifications, display toggles, per-CLI options, a synced custom display name, and per-device English/Simplified Chinese UI language.
293
+ - **Run it in the background** — `codeman web -d` detaches from your shell (`--status`, `--stop`); `codeman service install` makes it a systemd user unit / macOS LaunchAgent that survives reboots. Both verify the server actually answers before reporting success, and both refuse to start a second server on one data dir. See [Keep it running in the background](#quick-start---installation).
271
294
  - **Self-update** — git-clone installs update in place from **Settings → Updates**.
272
295
  - **Deploy your own changes** — see [Development](#development).
273
296
 
@@ -403,6 +426,7 @@ PTY Output → 16ms Server Batch → DEC 2026 Wrap → SSE → Client rAF → xt
403
426
 
404
427
  ## More Features
405
428
 
429
+ - **Background daemon & service install** — `codeman web -d` runs the server detached with a pidfile, `~/.codeman/web.log`, and verified startup (it polls the server until it answers, so a port clash never reads as success); `codeman service install` writes a systemd user unit (Linux) or LaunchAgent (macOS) with your shell's PATH baked in, so an nvm or Homebrew `node`, `tmux` and `claude` are actually found. Secrets are never written into unit files
406
430
  - **Self-update** — git-clone installs under systemd/launchd update in place from **App Settings → Updates**: it detects the latest release, auto-stashes a dirty tree, and streams build progress across the service restart (npm installs report as non-updatable)
407
431
  - **Multi-CLI** — run **Claude Code**, **OpenCode**, **Codex**, **Antigravity**, or **Gemini** per session; env-var prefixes auto-gate (`CLAUDE_CODE_*` vs `OPENCODE_*` vs `CODEX_*` vs `ANTIGRAVITY_*` vs `GEMINI_*`/`GOOGLE_*`). See [`docs/opencode-integration.md`](docs/opencode-integration.md)
408
432
  - **Docker sessions** — run a case inside an isolated, hardened container. One checkbox on **Create New** spins up a container with sensible defaults and starts the agent inside it; multiple sessions share one per-case container; export a container + its workspace to a portable `.tar.gz` to move it to another machine. See [`docs/docker-cases.md`](docs/docker-cases.md)
@@ -667,6 +691,18 @@ Single-digit selection (1-9), color-coded status, token counts, auto-refresh. De
667
691
 
668
692
  For AI agents and automation that control Codeman without a browser: an agent that spins up worker sessions, a CI bot, or **Claude Code running _inside_ a Codeman session orchestrating other sessions**. Everything the UI does is HTTP + a CLI, so an agent can do it too.
669
693
 
694
+ > **Shortcut: install the packaged agent skill.** Everything below (plus worked multi-worker recipes) ships as a Claude Code skill in [`skills/codeman`](skills/codeman/SKILL.md), so an agent inside a session can drive Codeman without you pasting docs into the prompt. Three ways to get it:
695
+ >
696
+ > - `npx skills add Ark0N/Codeman --skill codeman -g`: global, works for any skills-aware agent
697
+ > - `codeman skill install` (global) or `codeman skill install --case <name>`: for npm installs that never cloned the repo; `codeman skill uninstall` reverses it
698
+ > - **App Settings → Agent Skill** (`agentSkillEnabled`, default off): Codeman then injects the skill into each case on Claude session create; a user-authored `skills/codeman` in the case is never overwritten
699
+ >
700
+ > A global install (`codeman skill install`, or `npx skills add`) is picked up by **every new Claude Code session on the machine**, inside Codeman or not. The skill self-gates: outside a Codeman session (`CODEMAN_MUX` unset) it refuses to act, so a global install costs an idle session nothing.
701
+ >
702
+ > ⚠️ Turning `agentSkillEnabled` back off **does not remove already-injected copies** (a create-time sweep would yank the skill out from under other live sessions sharing that `.claude/` dir). Remove them per case with `codeman skill uninstall --case <name>`.
703
+
704
+
705
+
670
706
  ### Detect that you're inside Codeman
671
707
 
672
708
  When a CLI runs in a Codeman-managed session, these environment variables are set — read them instead of hardcoding anything:
@@ -82,6 +82,7 @@ export declare abstract class AiCheckerBase<V extends string, C extends AiChecke
82
82
  protected disabledReason: string | null;
83
83
  protected checkMuxName: string | null;
84
84
  protected checkTempFile: string | null;
85
+ protected checkStderrFile: string | null;
85
86
  protected checkPromptFile: string | null;
86
87
  protected checkPollTimer: NodeJS.Timeout | null;
87
88
  protected checkTimeoutTimer: NodeJS.Timeout | null;
@@ -165,6 +166,7 @@ export declare abstract class AiCheckerBase<V extends string, C extends AiChecke
165
166
  getConfig(): C;
166
167
  private runCheck;
167
168
  private parseOutput;
169
+ private readStderrDiagnostic;
168
170
  private cleanupCheck;
169
171
  private handleError;
170
172
  private startCooldown;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-checker-base.d.ts","sourceRoot":"","sources":["../src/ai-checker-base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-checker-base.d.ts","sourceRoot":"","sources":["../src/ai-checker-base.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,7 @@ export class AiCheckerBase extends EventEmitter {
80
80
  // Active check state
81
81
  checkMuxName = null;
82
82
  checkTempFile = null;
83
+ checkStderrFile = null;
83
84
  checkPromptFile = null;
84
85
  checkPollTimer = null;
85
86
  checkTimeoutTimer = null;
@@ -241,6 +242,7 @@ export class AiCheckerBase extends EventEmitter {
241
242
  const shortId = this.sessionId.slice(0, 8);
242
243
  const timestamp = Date.now();
243
244
  this.checkTempFile = join(tmpdir(), `${this.tempFilePrefix}-${shortId}-${timestamp}.txt`);
245
+ this.checkStderrFile = join(tmpdir(), `${this.tempFilePrefix}-stderr-${shortId}-${timestamp}.txt`);
244
246
  this.checkPromptFile = join(tmpdir(), `${this.tempFilePrefix}-prompt-${shortId}-${timestamp}.txt`);
245
247
  this.checkMuxName = `${this.muxNamePrefix}${shortId}`;
246
248
  // Security: Validate mux name before use in shell commands
@@ -249,6 +251,7 @@ export class AiCheckerBase extends EventEmitter {
249
251
  }
250
252
  // Ensure output temp file exists (empty) so we can poll it
251
253
  writeFileSync(this.checkTempFile, '');
254
+ writeFileSync(this.checkStderrFile, '');
252
255
  // Write prompt to file to avoid E2BIG error (argument list too long)
253
256
  // The prompt can be 16KB+ which exceeds shell argument limits
254
257
  writeFileSync(this.checkPromptFile, prompt);
@@ -257,7 +260,7 @@ export class AiCheckerBase extends EventEmitter {
257
260
  const modelArg = `--model "${this.config.model.replace(/"/g, '\\"')}"`;
258
261
  const augmentedPath = getAugmentedPath();
259
262
  const claudeCmd = `cat "${this.checkPromptFile}" | claude -p ${modelArg} --output-format text`;
260
- const fullCmd = `export PATH="${augmentedPath}"; ${claudeCmd} > "${this.checkTempFile}" 2>&1; echo "${this.doneMarker}" >> "${this.checkTempFile}"; rm -f "${this.checkPromptFile}"`;
263
+ const fullCmd = `export PATH="${augmentedPath}"; ${claudeCmd} > "${this.checkTempFile}" 2> "${this.checkStderrFile}"; echo "${this.doneMarker}" >> "${this.checkTempFile}"; rm -f "${this.checkPromptFile}"`;
261
264
  // Spawn tmux session
262
265
  try {
263
266
  // Kill any leftover session with this name first (mux name already validated above)
@@ -317,15 +320,29 @@ export class AiCheckerBase extends EventEmitter {
317
320
  // Remove the done marker and trim
318
321
  const output = content.replace(this.doneMarker, '').trim();
319
322
  if (!output) {
320
- return this.createErrorResult(`Empty output from ${this.checkDescription}`, durationMs);
323
+ const stderr = this.readStderrDiagnostic();
324
+ const detail = stderr ? `: ${stderr}` : '';
325
+ return this.createErrorResult(`Empty output from ${this.checkDescription}${detail}`, durationMs);
321
326
  }
322
327
  // Delegate to subclass for verdict parsing
323
328
  const parsed = this.parseVerdict(output);
324
329
  if (!parsed) {
325
- return this.createErrorResult(`Could not parse verdict from: "${output.substring(0, 100)}"`, durationMs);
330
+ const stderr = this.readStderrDiagnostic();
331
+ const detail = stderr ? `; stderr: "${stderr}"` : '';
332
+ return this.createErrorResult(`Could not parse verdict from: "${output.substring(0, 100)}"${detail}`, durationMs);
326
333
  }
327
334
  return this.createResult(parsed.verdict, parsed.reasoning, durationMs);
328
335
  }
336
+ readStderrDiagnostic() {
337
+ if (!this.checkStderrFile || !existsSync(this.checkStderrFile))
338
+ return '';
339
+ try {
340
+ return readFileSync(this.checkStderrFile, 'utf-8').trim().substring(0, 200);
341
+ }
342
+ catch {
343
+ return '';
344
+ }
345
+ }
329
346
  cleanupCheck() {
330
347
  // Clear poll timer
331
348
  if (this.checkPollTimer) {
@@ -360,6 +377,17 @@ export class AiCheckerBase extends EventEmitter {
360
377
  }
361
378
  this.checkTempFile = null;
362
379
  }
380
+ if (this.checkStderrFile) {
381
+ try {
382
+ if (existsSync(this.checkStderrFile)) {
383
+ unlinkSync(this.checkStderrFile);
384
+ }
385
+ }
386
+ catch {
387
+ // Best effort cleanup
388
+ }
389
+ this.checkStderrFile = null;
390
+ }
363
391
  if (this.checkPromptFile) {
364
392
  try {
365
393
  if (existsSync(this.checkPromptFile)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-checker-base.js","sourceRoot":"","sources":["../src/ai-checker-base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-checker-base.js","sourceRoot":"","sources":["../src/ai-checker-base.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA6xB9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAuiC9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/cli.js CHANGED
@@ -11,15 +11,20 @@ import chalk from 'chalk';
11
11
  import { createRequire } from 'module';
12
12
  import http from 'node:http';
13
13
  import https from 'node:https';
14
- import { readFileSync } from 'node:fs';
15
- import { isAbsolute } from 'node:path';
14
+ import { existsSync, readFileSync } from 'node:fs';
15
+ import { isAbsolute, join } from 'node:path';
16
+ import { homedir } from 'node:os';
16
17
  import { dataPath } from './config/instance.js';
18
+ import { installAgentSkillInto, removeAgentSkillFrom } from './hooks-config.js';
17
19
  import { getSessionManager } from './session-manager.js';
18
20
  import { getTaskQueue } from './task-queue.js';
19
21
  import { getRalphLoop } from './ralph-loop.js';
20
22
  import { getStore } from './state-store.js';
21
23
  import { getErrorMessage } from './types.js';
22
24
  import { isSupportedAttachmentExtension } from './attachment-registry.js';
25
+ import { daemonStatus, startDaemon, stopDaemon } from './daemon-control.js';
26
+ import { installService, serviceStatus, uninstallService } from './service-installer.js';
27
+ import { isLoopbackBindHost, isUnauthenticatedNetworkAcknowledged } from './web/network-auth-policy.js';
23
28
  const require = createRequire(import.meta.url);
24
29
  const pkg = require('../package.json');
25
30
  const program = new Command();
@@ -103,6 +108,109 @@ program
103
108
  }
104
109
  console.log(makeAttachmentMagicLink(filePath));
105
110
  });
111
+ // ============ Skill Commands ============
112
+ /** Same registry the server resolves case names through (mirrors `case-routes.ts`). */
113
+ const LINKED_CASES_FILE = dataPath('linked-cases.json');
114
+ /**
115
+ * Case name to directory, checking `linked-cases.json` FIRST and falling back to the
116
+ * shared single-user cases dir. Mirrors `resolveCasePath()` in `case-routes.ts`, which
117
+ * is what the web UI and `quick-start` use. Without the linked-cases lookup this
118
+ * command rejected every case linked in from outside `~/codeman-cases` with
119
+ * "Case not found", even though the server resolved the same name fine.
120
+ *
121
+ * Sync and tolerant on purpose: a missing or malformed registry means "no linked
122
+ * cases", never a crash.
123
+ */
124
+ function resolveCliCasePath(name) {
125
+ try {
126
+ const linked = JSON.parse(readFileSync(LINKED_CASES_FILE, 'utf-8'));
127
+ const target = linked?.[name];
128
+ if (typeof target === 'string' && target)
129
+ return target;
130
+ }
131
+ catch {
132
+ // no registry yet, or unreadable/invalid JSON: fall through to the cases dir
133
+ }
134
+ return join(homedir(), 'codeman-cases', name);
135
+ }
136
+ /**
137
+ * Resolve where `skill install` / `skill uninstall` operate. Global is
138
+ * `~/.claude/skills/codeman` (Claude Code's user-scope skill dir, read by every new
139
+ * session); `--case <name>` targets `<case>/.claude/skills/codeman`, resolved through
140
+ * `resolveCliCasePath()` above. The web server's automatic per-case injection
141
+ * (`agentSkillEnabled`) covers multi-user spaces; this CLI is a local operator tool
142
+ * and stays single-user.
143
+ */
144
+ function resolveSkillTarget(options) {
145
+ if (options.case) {
146
+ const casePath = resolveCliCasePath(options.case);
147
+ if (!existsSync(casePath)) {
148
+ console.error(chalk.red(`✗ Case not found: ${casePath}`));
149
+ process.exit(1);
150
+ }
151
+ return join(casePath, '.claude', 'skills', 'codeman');
152
+ }
153
+ return join(homedir(), '.claude', 'skills', 'codeman');
154
+ }
155
+ /** Print an AgentSkillApplyResult for humans; exit non-zero when nothing was done. */
156
+ function reportSkillResult(result, target) {
157
+ const messages = {
158
+ installed: { ok: true, text: `Agent skill installed: ${target}` },
159
+ refreshed: { ok: true, text: `Agent skill refreshed (was stale): ${target}` },
160
+ unchanged: { ok: true, text: `Agent skill already up to date: ${target}` },
161
+ removed: { ok: true, text: `Agent skill removed: ${target}` },
162
+ absent: { ok: true, text: `Nothing to remove at ${target}` },
163
+ foreign: {
164
+ ok: false,
165
+ text: `${target} exists but is not Codeman-managed (no marker), refusing to touch it. Remove it yourself if you want the packaged skill there.`,
166
+ },
167
+ symlink: {
168
+ ok: false,
169
+ text: `${target} (or its parent) is a symlink, refusing to write through it.`,
170
+ },
171
+ };
172
+ const message = messages[result];
173
+ if (message.ok) {
174
+ console.log(chalk.green(`✓ ${message.text}`));
175
+ }
176
+ else {
177
+ console.error(chalk.red(`✗ ${message.text}`));
178
+ process.exit(1);
179
+ }
180
+ }
181
+ const skillCmd = program
182
+ .command('skill')
183
+ .description('Manage the Codeman agent skill (lets an agent inside a session drive the API)');
184
+ skillCmd
185
+ .command('install')
186
+ .description('Install the agent skill globally (~/.claude/skills/codeman) or into one case')
187
+ .option('-g, --global', 'Install into ~/.claude/skills/codeman, picked up by every new session (the default)')
188
+ .option('-c, --case <name>', 'Install into <case>/.claude/skills/codeman instead (linked cases resolve too)')
189
+ .action(async (options) => {
190
+ try {
191
+ const target = resolveSkillTarget(options);
192
+ reportSkillResult(await installAgentSkillInto(target), target);
193
+ }
194
+ catch (err) {
195
+ console.error(chalk.red(`✗ Failed to install agent skill: ${getErrorMessage(err)}`));
196
+ process.exit(1);
197
+ }
198
+ });
199
+ skillCmd
200
+ .command('uninstall')
201
+ .description('Remove a Codeman-managed agent skill copy (never touches a user-authored one)')
202
+ .option('-g, --global', 'Remove from ~/.claude/skills/codeman (the default)')
203
+ .option('-c, --case <name>', 'Remove from <case>/.claude/skills/codeman instead (linked cases resolve too)')
204
+ .action(async (options) => {
205
+ try {
206
+ const target = resolveSkillTarget(options);
207
+ reportSkillResult(await removeAgentSkillFrom(target), target);
208
+ }
209
+ catch (err) {
210
+ console.error(chalk.red(`✗ Failed to remove agent skill: ${getErrorMessage(err)}`));
211
+ process.exit(1);
212
+ }
213
+ });
106
214
  // ============ Session Commands ============
107
215
  const sessionCmd = program.command('session').alias('s').description('Manage Claude sessions');
108
216
  sessionCmd
@@ -498,27 +606,107 @@ program
498
606
  }
499
607
  console.log('');
500
608
  });
609
+ // ============ Web / daemon / service Commands ============
610
+ /** Shared option set for the commands that can launch a web server. */
611
+ function addWebLaunchOptions(cmd) {
612
+ return cmd
613
+ .option('-H, --host <host>', 'Host to bind to', process.env.CODEMAN_HOST || '127.0.0.1')
614
+ .option('-p, --port <port>', 'Port to listen on (env: CODEMAN_PORT)', process.env.CODEMAN_PORT || '3000')
615
+ .option('--https', 'Enable HTTPS with self-signed certificate (only needed for remote access, not localhost)')
616
+ .option('--title-hostname <hostname>', 'Override the hostname shown in the browser title')
617
+ .option('--allow-unauthenticated-network', 'Allow non-loopback web access without CODEMAN_PASSWORD (dangerous; terminal control is exposed)')
618
+ .option('--multiuser', 'Enable opt-in multi-user mode (named users in ~/.codeman/users.json; env: CODEMAN_MULTIUSER)');
619
+ }
620
+ /** Normalize commander's strings into the shape daemon-control/service-installer take. */
621
+ function toWebLaunchOptions(options) {
622
+ const port = parseInt(options.port, 10);
623
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) {
624
+ console.error(chalk.red(`✗ Invalid port: ${options.port}`));
625
+ process.exit(1);
626
+ }
627
+ return {
628
+ host: options.host,
629
+ port,
630
+ https: !!options.https,
631
+ titleHostname: options.titleHostname,
632
+ allowUnauthenticatedNetwork: !!options.allowUnauthenticatedNetwork,
633
+ multiuser: !!options.multiuser,
634
+ };
635
+ }
636
+ /**
637
+ * The server prints this itself, but into a log file nobody reads when it is
638
+ * detached or supervised. Repeat it where the operator is actually looking.
639
+ */
640
+ function warnIfUnauthenticatedNetwork(launch) {
641
+ if (isLoopbackBindHost(launch.host))
642
+ return;
643
+ if (isUnauthenticatedNetworkAcknowledged(launch.allowUnauthenticatedNetwork))
644
+ return;
645
+ console.log(chalk.yellow(`⚠ Binding ${launch.host} without CODEMAN_PASSWORD: anyone who can reach this port gets terminal control.`));
646
+ console.log(chalk.yellow(' Set CODEMAN_PASSWORD, or bind 127.0.0.1 and front it with tailscale serve.'));
647
+ }
501
648
  // Web interface command
502
- program
503
- .command('web')
504
- .description('Start the web interface')
505
- .option('-H, --host <host>', 'Host to bind to', process.env.CODEMAN_HOST || '127.0.0.1')
506
- .option('-p, --port <port>', 'Port to listen on (env: CODEMAN_PORT)', process.env.CODEMAN_PORT || '3000')
507
- .option('--https', 'Enable HTTPS with self-signed certificate (only needed for remote access, not localhost)')
508
- .option('--title-hostname <hostname>', 'Override the hostname shown in the browser title')
509
- .option('--allow-unauthenticated-network', 'Allow non-loopback web access without CODEMAN_PASSWORD (dangerous; terminal control is exposed)')
510
- .option('--multiuser', 'Enable opt-in multi-user mode (named users in ~/.codeman/users.json; env: CODEMAN_MULTIUSER)')
511
- .action(async (options) => {
649
+ const webCmd = addWebLaunchOptions(program.command('web').description('Start the web interface'))
650
+ .option('-d, --daemon', 'Run detached in the background; survives the shell, logs to <data dir>/web.log')
651
+ .option('--stop', 'Stop a server started with --daemon')
652
+ .option('--status', 'Report whether a detached server is running');
653
+ webCmd.action(async (options) => {
512
654
  // The flag is surfaced to the rest of the process via the env var so
513
655
  // isMultiUserMode() has a single source of truth (see config/multiuser.ts).
514
656
  if (options.multiuser)
515
657
  process.env.CODEMAN_MULTIUSER = '1';
658
+ const launch = toWebLaunchOptions(options);
659
+ if (options.stop) {
660
+ const result = await stopDaemon(launch);
661
+ if (result.ok && result.reason === 'not-running') {
662
+ console.log(chalk.gray(`○ ${result.message}`));
663
+ return;
664
+ }
665
+ if (result.ok) {
666
+ console.log(chalk.green(`✓ ${result.message ?? `Stopped Codeman (pid ${result.pid})`}`));
667
+ console.log(chalk.gray(' Your agents keep running in tmux.'));
668
+ return;
669
+ }
670
+ console.error(chalk.red(`✗ ${result.message ?? 'Could not stop the server'}`));
671
+ process.exit(1);
672
+ }
673
+ if (options.status) {
674
+ const status = await daemonStatus(launch);
675
+ if (status.responding) {
676
+ const version = status.version ? ` (v${status.version})` : '';
677
+ console.log(chalk.green(`✓ Responding at ${status.url}${version}`));
678
+ }
679
+ else {
680
+ console.log(chalk.yellow(`○ Nothing answering at ${status.url}`));
681
+ }
682
+ console.log(` Daemon pid: ${status.running ? chalk.green(String(status.pid)) : chalk.gray('not running')}`);
683
+ console.log(chalk.gray(` Pidfile: ${status.pidFile}`));
684
+ console.log(chalk.gray(` Log: ${status.logPath}`));
685
+ if (!status.running && status.responding) {
686
+ console.log(chalk.gray(' (running, but not started with --daemon: probably a service or a foreground run)'));
687
+ }
688
+ return;
689
+ }
690
+ if (options.daemon) {
691
+ warnIfUnauthenticatedNetwork(launch);
692
+ console.log(chalk.cyan('Starting Codeman in the background...'));
693
+ const result = await startDaemon(launch);
694
+ if (result.ok) {
695
+ console.log(chalk.green(`\n✓ Codeman is running at ${result.url} (pid ${result.pid})`));
696
+ console.log(chalk.gray(` Logs: ${result.logPath}`));
697
+ console.log(chalk.gray(' Stop it with: codeman web --stop'));
698
+ console.log(chalk.gray(' Want it back after a reboot? codeman service install'));
699
+ return;
700
+ }
701
+ console.error(chalk.red(`\n✗ ${result.message ?? 'Failed to start'}`));
702
+ process.exit(1);
703
+ }
516
704
  const { startWebServer } = await import('./web/server.js');
517
- const host = options.host;
518
- const port = parseInt(options.port, 10);
519
- const https = !!options.https;
705
+ const host = launch.host;
706
+ const port = launch.port;
707
+ const https = launch.https;
520
708
  const titleHostname = options.titleHostname;
521
- const allowUnauthenticatedNetwork = !!options.allowUnauthenticatedNetwork;
709
+ const allowUnauthenticatedNetwork = launch.allowUnauthenticatedNetwork ?? false;
522
710
  const protocol = https ? 'https' : 'http';
523
711
  const displayHost = host === '0.0.0.0' ? 'localhost' : host;
524
712
  console.log(chalk.cyan(`Starting Codeman web interface on ${displayHost}:${port}${https ? ' (HTTPS)' : ''}...`));
@@ -553,6 +741,51 @@ program
553
741
  process.exit(1);
554
742
  }
555
743
  });
744
+ // Supervised service: the "still there after a reboot" answer, where `web -d` is
745
+ // the "still there after I close this shell" one (issue #231).
746
+ const serviceCmd = program
747
+ .command('service')
748
+ .description('Manage the background service (systemd user unit on Linux, LaunchAgent on macOS)');
749
+ addWebLaunchOptions(serviceCmd.command('install').description('Install and start the service, then verify it answers')).action(async (options) => {
750
+ const launch = toWebLaunchOptions(options);
751
+ warnIfUnauthenticatedNetwork(launch);
752
+ console.log(chalk.cyan('Installing the Codeman service...'));
753
+ const result = await installService(launch);
754
+ for (const warning of result.warnings ?? [])
755
+ console.log(chalk.yellow(`⚠ ${warning}`));
756
+ if (!result.ok) {
757
+ console.error(chalk.red(`✗ ${result.message}`));
758
+ process.exit(1);
759
+ }
760
+ console.log(chalk.green(`✓ ${result.message}`));
761
+ console.log(chalk.gray(` Unit: ${result.unitPath}`));
762
+ if (process.env.CODEMAN_PASSWORD) {
763
+ console.log(chalk.yellow(' Note: CODEMAN_PASSWORD was NOT copied into the unit file. Add it there yourself if the service needs auth.'));
764
+ }
765
+ });
766
+ serviceCmd
767
+ .command('uninstall')
768
+ .description('Stop the service and remove its unit file')
769
+ .action(() => {
770
+ const result = uninstallService();
771
+ if (!result.ok) {
772
+ console.error(chalk.red(`✗ ${result.message}`));
773
+ process.exit(1);
774
+ }
775
+ console.log(chalk.green(`✓ ${result.message}`));
776
+ });
777
+ addWebLaunchOptions(serviceCmd.command('status').description('Show whether the service is installed and running')).action(async (options) => {
778
+ const status = await serviceStatus(toWebLaunchOptions(options));
779
+ if (!status.kind) {
780
+ console.log(chalk.yellow(`No supported supervisor on ${process.platform}. Use \`codeman web -d\` instead.`));
781
+ return;
782
+ }
783
+ console.log(` Supervisor: ${status.kind} (${status.name})`);
784
+ console.log(` Unit file: ${status.installed ? chalk.green(status.unitPath) : chalk.gray('not installed')}`);
785
+ console.log(` Loaded: ${status.loaded ? chalk.green('yes') : chalk.gray('no')}`);
786
+ const version = status.version ? ` (v${status.version})` : '';
787
+ console.log(` Responding: ${status.responding ? chalk.green(`yes at ${status.url}${version}`) : chalk.gray(`no at ${status.url}`)}`);
788
+ });
556
789
  // ============ Multi-user Commands ============
557
790
  //
558
791
  // Operate directly on ~/.codeman/users.json (via user-store) with NO running