mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-04 22:49:41 +02:00
Two ways to keep the server running, split by how long it should last. `codeman web -d` relaunches the same entry script detached (setsid), with `--stop` and `--status` alongside it. A pidfile and log live in the data dir. `nohup` is not what makes this work: Node re-arms SIGHUP to its default disposition even when it inherits "ignore", and cli.ts handles SIGHUP with a graceful shutdown, so a delivered HUP still stops the server. Removing the shell's ability to send one is the fix. `codeman service install|uninstall|status` writes and loads the systemd user unit or the LaunchAgent, with the installing shell's PATH baked in (launchd hands a job /usr/bin:/bin:/usr/sbin:/sbin, which finds neither a Homebrew/nvm node nor tmux/claude). install.sh already covers one-liner installs; this is for npm globals. Both refuse to start when a server is already up on the data dir, since a second instance on the shared tmux socket attaches PTYs to the first one's live sessions. Both poll /api/status until the child answers or dies rather than reporting a success they have not seen. `--stop` checks the pid still looks like a Codeman server before signalling it. The systemd unit name and launchd label move to config/service-names.ts so install.sh, detectSupervisor() and service install cannot drift into supervising two copies. Instance-scoped, unchanged for the default instance. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
33 lines
1.6 KiB
TypeScript
33 lines
1.6 KiB
TypeScript
/**
|
|
* @fileoverview Supervisor identity (systemd unit name / launchd job label).
|
|
*
|
|
* Three things now write or look for the same supervisor job: `install.sh`, the
|
|
* in-app self-updater (`web/self-update.ts` detects it to decide how to restart),
|
|
* and `codeman service install`. The names live here so they cannot drift apart,
|
|
* because a mismatch is silent in the worst way: `service install` would happily
|
|
* create a SECOND job alongside the installer's, and two servers sharing one data
|
|
* dir and one tmux socket attach PTYs to each other's live sessions
|
|
* (see config/instance.ts).
|
|
*
|
|
* The names are instance-scoped for exactly that reason: a `CODEMAN_INSTANCE=beta`
|
|
* build writing `com.codeman.web` would overwrite the production LaunchAgent. The
|
|
* DEFAULT instance keeps the historical names byte-identical, so existing installs
|
|
* and every unit install.sh has already written are unaffected.
|
|
*
|
|
* @module config/service-names
|
|
*/
|
|
|
|
import { CODEMAN_INSTANCE } from './instance.js';
|
|
|
|
/**
|
|
* Instance name reduced to characters that are safe in a filename and in a
|
|
* launchd label. `CODEMAN_INSTANCE` is arbitrary operator input.
|
|
*/
|
|
const SAFE_INSTANCE = CODEMAN_INSTANCE.replace(/[^A-Za-z0-9_-]/g, '').slice(0, 32);
|
|
|
|
/** systemd user unit: `codeman-web.service`, or `codeman-web-beta.service` for a beta. */
|
|
export const SYSTEMD_UNIT = `codeman-web${SAFE_INSTANCE ? `-${SAFE_INSTANCE}` : ''}.service`;
|
|
|
|
/** launchd job label: `com.codeman.web`, or `com.codeman.beta.web` for a beta. */
|
|
export const LAUNCHD_LABEL = SAFE_INSTANCE ? `com.codeman.${SAFE_INSTANCE}.web` : 'com.codeman.web';
|