Renamed for parity now that Linux has a light profile too: scripts/setup_mac.sh -> scripts/setup_mac_light.sh ecosystem.mac.config.cjs -> ecosystem.mac.light.config.cjs The macOS process list was still a hand-copied subset, which is the shape that broke it: written 2026-07-28, within days it was running the Anthropic proxy under the name officer-claude with nothing spawning `claude`, and pointing at a pty entry point that had moved. Both silent. It now declares names and reasons and reads script/args from ecosystem.config.cjs, so a launch change on the host reaches it for free. The include/exclude checks moved into ecosystem.profile.cjs rather than being copied into the second profile — duplicating the guard rails would have repeated the mistake they exist to catch. Both profiles were re-tested against a mutated host ecosystem: renaming an included app and adding an unclassified sidecar each throw in both, and an unmodified host loads five apps in both. Kept as two files rather than collapsed into one, even though they currently produce identical output. The exclusions do not mean the same thing: on macOS officer-vnc CANNOT run, there being no Xorg; on a Linux light install it could run fine and you have chosen not to. Merging them would lose that, and they diverge the moment one profile gains something the other cannot have. setup_mac_light.sh's verification loop now reads app names with node instead of grepping for `name:` — the derived profile has no literal keys, so the grep would have silently listed no services at all, which reads the same as a healthy install with nothing configured. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
49 lines
2.5 KiB
JavaScript
49 lines
2.5 KiB
JavaScript
// Linux light profile — the platform without the self-hosted estate around it.
|
|
//
|
|
// For a machine that should run the file browser, the terminal and Claude/opencode chat, and nothing
|
|
// else. Paired with `OFFICER_PROFILE=light bash scripts/setup.sh`, which installs only what these
|
|
// processes need: node, bun, ffmpeg, Postgres, pm2 and the two agent CLIs.
|
|
//
|
|
// This is a subset of ecosystem.config.cjs, not a copy of it — see ecosystem.profile.cjs for why, and
|
|
// for the two checks that make a drifted profile fail loudly instead of silently starting less than it
|
|
// claims. To change what runs, edit INCLUDE. To change HOW something runs, edit ecosystem.config.cjs
|
|
// and every profile follows.
|
|
//
|
|
// The app itself is unchanged: every API route stays mounted, so features whose sidecars are absent
|
|
// report themselves unavailable rather than disappearing. A profile decides which processes start, not
|
|
// which code ships.
|
|
//
|
|
// Start with: pm2 startOrRestart ecosystem.light.config.cjs
|
|
|
|
const { defineProfile } = require('./ecosystem.profile.cjs');
|
|
|
|
module.exports = defineProfile({
|
|
file: 'ecosystem.light.config.cjs',
|
|
|
|
include: [
|
|
'officer', // the app: SPA, /api, websockets
|
|
'officer-anthropic-proxy', // holds the Anthropic credential, forwards upstream
|
|
'officer-agent', // spawns `claude` — chat is dead without it
|
|
'officer-opencode', // the alternative agent
|
|
'officer-pty', // the terminal
|
|
],
|
|
|
|
// Excluded by CHOICE rather than by platform limits — every one of these would run on a Linux host.
|
|
// A light install simply is not running the thing behind it.
|
|
excluded: {
|
|
'officer-vnc': 'no desktop to mirror on a light install',
|
|
'officer-email': 'needs the mbsync/IMAP stack the light profile does not install',
|
|
'officer-music': 'the ffprobe indexer works, but a full library index is not a light-install concern',
|
|
'officer-vault': 'reverse-proxies a self-hosted Vaultwarden container',
|
|
'officer-slskd': 'supervises the slskd daemon',
|
|
'officer-headscale': 'fronts a headscale server',
|
|
'officer-transmission': 'fronts a transmission daemon',
|
|
'officer-invoiceshelf': 'fronts an InvoiceShelf container',
|
|
'officer-memos': 'needs an owner-configured Memos instance URL and token',
|
|
'officer-photos': 'needs an owner-configured Immich instance URL and API key',
|
|
'officer-caldav': 'supervises Radicale, which the light profile does not install',
|
|
'officer-notify': 'its producers are the queue and the email/agent sidecars; nothing to notify about',
|
|
'officer-wallet': 'holds seed and node credentials',
|
|
},
|
|
});
|