scripts/ was holding two unrelated kinds of thing: install-this-machine, and run-this-occasionally. The eight installers now live in scripts/setup/; what stays at the top level is the build steps (gen-index, prebuild, build/) and the two maintenance scripts (reindex-music, rebuild-soulseek-tree). The move is not just a rename. Three of these derive the repo root from their own location: setup.sh:51 PROJECT_DIR="$(dirname "$SCRIPT_DIR")" setup_mac_light.sh:51 same cleanup-desktop.sh:134 ENV_FILE="$(dirname "$0")/../.env" Left alone, all three would now resolve to scripts/ — and nothing downstream complains. PROJECT_DIR is where .env is written, where `bun install`, `gen:index` and `db:push` run, and what pm2 is pointed at, so a fresh install would have quietly provisioned scripts/ and reported success. cleanup-desktop.sh fails the other way: it would find no .env, print "No .env — skipping", and leave the real VNC_PASSWORD in the real file. All three are now `../..` with a comment saying why the level matters. provision-user-dirs.ts imports data-path.ts relatively; that one tsgo caught. Also disambiguated `setup.sh` where it had become two files. app-store/templates/<name>/setup.sh is a per-sidecar installer with its own contract, and preflight.ts + docs/sidecar-app-store.md discussed both in the same paragraph. The host one is now spelled with its full path at those sites. Verified: bash -n on all six shell scripts, tsgo clean, os-user tests pass, both derivations resolve to the repo root, starship.toml still resolves from os-user-shell.ts, and provision-user-dirs.ts runs under DRY_RUN. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
3.9 KiB
JavaScript
69 lines
3.9 KiB
JavaScript
// macOS light profile — the same process set as the Linux light profile, on a laptop.
|
|
//
|
|
// Paired with scripts/setup/setup_mac_light.sh. Runs the file browser, the terminal and Claude/opencode
|
|
// chat; nothing else.
|
|
//
|
|
// This is a subset of ecosystem.config.cjs, not a copy of it. That distinction is here because of this
|
|
// file specifically: written on 2026-07-28 as a hand-copied process list, it was broken within days by
|
|
// two changes it could not see. It ran `officer-claude` against the Anthropic proxy's entry point
|
|
// while the process that actually spawns `claude` was never started, and it pointed at a pty sidecar
|
|
// that had moved. Both failures were silent — the processes simply did not come up. See
|
|
// ecosystem.profile.cjs for the checks that now make that loud.
|
|
//
|
|
// WHY THIS IS SEPARATE FROM ecosystem.light.config.cjs, given both currently run the same five apps:
|
|
// the exclusions mean different things. On macOS officer-vnc cannot run — there is no Xorg to mirror.
|
|
// On a Linux light install it could run perfectly well; you have chosen not to. Those diverge as soon
|
|
// as one profile gains something the other cannot have, and collapsing them would lose the reason.
|
|
//
|
|
// Start with: pm2 startOrRestart ecosystem.mac.light.config.cjs
|
|
|
|
const { defineProfile } = require('./ecosystem.profile.cjs');
|
|
|
|
module.exports = defineProfile({
|
|
file: 'ecosystem.mac.light.config.cjs',
|
|
|
|
include: [
|
|
'officer', // the app: SPA, /api, websockets
|
|
'officer-anthropic-proxy', // holds the Anthropic credential, forwards to api.anthropic.com
|
|
// Spawns `claude`. Reads the proxy secret from disk, so it needs no ordering against the proxy
|
|
// above: if the secret is not written yet it warns and re-reads before the next spawn.
|
|
'officer-agent',
|
|
'officer-opencode', // the alternative agent
|
|
// The terminal. Runs under node rather than bun — node-pty binds a native addon built against
|
|
// node's ABI. That detail lives in ecosystem.config.cjs, not here.
|
|
'officer-pty',
|
|
],
|
|
|
|
excluded: {
|
|
// Cannot run on macOS at all.
|
|
'officer-vnc': 'mirrors an Xorg display with x11vnc; macOS has no Xorg',
|
|
|
|
// Left the baseline on 2026-08-11, on both light profiles together. It genuinely needs nothing installed
|
|
// locally — it points at a remote instance over the network — but a baseline process shows up in the dock
|
|
// and the Permissions screen whether or not a URL was ever given, so "is Gitea here" had two answers. It
|
|
// is an app-store install now: `existing` mode, URL and token, same as any other remote service.
|
|
'officer-gitea': 'fronts a remote instance; installed from the app store with its URL and token',
|
|
|
|
// Would run, but needs something setup_mac_light.sh deliberately does not install.
|
|
'officer-email': 'needs the mbsync/IMAP stack setup_mac_light.sh does not install',
|
|
'officer-caldav': 'supervises Radicale, which setup_mac_light.sh does not install',
|
|
'officer-music': 'the ffprobe indexer works, but a full ~/Music index is expensive to start by default',
|
|
|
|
// Fronts a container or daemon a laptop is not running.
|
|
'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-jellyfin': 'fronts a Jellyfin container',
|
|
|
|
// Needs an owner-configured external service.
|
|
'officer-memos': 'needs an owner-configured Memos instance URL and token',
|
|
'officer-photos': 'needs an owner-configured Immich instance URL and API key',
|
|
|
|
// Deliberate, for what it holds or who feeds it.
|
|
'officer-notify': 'its producers are the queue and the email/agent sidecars; nothing to notify about',
|
|
'officer-wallet': 'holds seed and node credentials; not on a laptop',
|
|
},
|
|
});
|