baa-conductor

git clone 

commit
642929e
parent
e4bbe2e
author
im_wower
date
2026-03-21 19:42:07 +0800 CST
docs: define launchd runtime layout
8 files changed,  +497, -12
M coordination/tasks/T-011-launchd-runtime.md
+20, -7
 1@@ -1,7 +1,7 @@
 2 ---
 3 task_id: T-011
 4 title: launchd 与本地 Runtime 布局
 5-status: todo
 6+status: review
 7 branch: feat/T-011-launchd-runtime
 8 repo: /Users/george/code/baa-conductor
 9 base_ref: main
10@@ -10,7 +10,7 @@ depends_on:
11 write_scope:
12   - ops/launchd/**
13   - docs/runtime/**
14-updated_at: 2026-03-21
15+updated_at: 2026-03-21T19:41:24+0800
16 ---
17 
18 # T-011 launchd 与本地 Runtime 布局
19@@ -48,23 +48,36 @@ updated_at: 2026-03-21
20 
21 ## files_changed
22 
23-- 待填写
24+- `coordination/tasks/T-011-launchd-runtime.md`
25+- `docs/runtime/README.md`
26+- `docs/runtime/layout.md`
27+- `docs/runtime/environment.md`
28+- `docs/runtime/launchd.md`
29+- `ops/launchd/so.makefile.baa-conductor.plist`
30+- `ops/launchd/so.makefile.baa-worker-runner.plist`
31+- `ops/launchd/so.makefile.baa-status-api.plist`
32 
33 ## commands_run
34 
35-- 待填写
36+- `git worktree add /Users/george/code/baa-conductor-T011 -b feat/T-011-launchd-runtime main`
37+- `plutil -lint ops/launchd/so.makefile.baa-conductor.plist`
38+- `plutil -lint ops/launchd/so.makefile.baa-worker-runner.plist`
39+- `plutil -lint ops/launchd/so.makefile.baa-status-api.plist`
40+- `git diff --check`
41 
42 ## result
43 
44-- 待填写
45+- 已补全 `launchd` plist 模板,加入 runtime 目录、日志路径、环境变量和 mini 默认值
46+- 已新增 runtime 文档,明确 `mini` / `mac` 的安装方式、`LaunchAgents` / `LaunchDaemons` 差异,以及 `runs/`、`worktrees/`、`logs/`、`tmp/` 的初始化规则
47 
48 ## risks
49 
50-- 待填写
51+- 当前仓库的 app 构建脚本仍不产出真实 `dist/index.js`,因此本任务只能静态校验 plist 和文档,不能验证真实 `launchctl bootstrap` 启动成功
52+- `BAA_SHARED_TOKEN` 仍需在安装副本中手工替换,真实部署时如果漏改会直接导致鉴权失败
53 
54 ## next_handoff
55 
56-- 给真实部署阶段使用
57+- 后续接入真实服务产物后,按 `docs/runtime/launchd.md` 在 `mini` 与 `mac` 上分别复制、改写并加载 plist,再做一次端到端启动验证
58 
59 ## notes
60 
M docs/runtime/README.md
+20, -2
 1@@ -1,6 +1,24 @@
 2 # runtime
 3 
 4-这个目录预留给 launchd、运行目录、环境变量和本地节点初始化说明。
 5+本目录定义 `mini` 与 `mac` 上的本地 runtime 约定:目录布局、环境变量和 `launchd` 安装方式。
 6 
 7-当前只建立目录边界,具体内容由 `T-011` 完成。
 8+当前仓库里的 app 仍是骨架实现,`pnpm build` 只做 TypeScript 校验,不生成 `apps/*/dist/index.js`。因此 `ops/launchd/*.plist` 现在是部署模板,先把路径和环境约定固定下来,等真实产物接上后继续沿用同一套安装步骤。
 9 
10+## 内容
11+
12+- [`layout.md`](./layout.md): `runs/`、`worktrees/`、`logs/`、`tmp/` 与 `state/` 的初始化方式和生命周期
13+- [`environment.md`](./environment.md): `launchd` 下必须显式写入的环境变量
14+- [`launchd.md`](./launchd.md): `mini` 与 `mac` 的安装步骤,以及 `LaunchAgents` / `LaunchDaemons` 的差异
15+
16+## 统一约定
17+
18+- `mini` 是首选 leader,默认跑 `so.makefile.baa-conductor` 的 `primary` 配置。
19+- `mac` 使用同一组服务,但 conductor 默认角色是 `standby`。
20+- 两台机器都推荐把仓库放在 `/Users/george/code/baa-conductor`,这样 repo 内的 plist 源模板可以直接复用设计里的绝对路径。
21+- repo 中的 plist 只作为源模板;真正加载的是复制到 `~/Library/LaunchAgents/` 或 `/Library/LaunchDaemons/` 的副本。
22+
23+## 最短路径
24+
25+1. 先按 [`layout.md`](./layout.md) 初始化 runtime 根目录。
26+2. 再按 [`environment.md`](./environment.md) 准备共享变量和节点变量,特别是 `BAA_SHARED_TOKEN`。
27+3. 最后按 [`launchd.md`](./launchd.md) 复制、调整并加载 plist。
A docs/runtime/environment.md
+58, -0
 1@@ -0,0 +1,58 @@
 2+# environment
 3+
 4+## 原则
 5+
 6+- `launchd` 不会自动读取 `.zshrc`、`.zprofile` 或 repo 根目录下的 `.env`。
 7+- plist 里出现的路径都必须是绝对路径,不能依赖 `~`、`$HOME` 或 shell 展开。
 8+- `BAA_SHARED_TOKEN` 必须在安装副本里替换成真实值,repo 内源模板保持 `replace-me`。
 9+- 如果 `mini` 与 `mac` 都使用 `/Users/george/code/baa-conductor`,目录变量可以完全一致,只有节点身份变量需要区分。
10+
11+## 应用层变量
12+
13+| 变量 | `mini` | `mac` | 说明 |
14+| --- | --- | --- | --- |
15+| `BAA_CONDUCTOR_HOST` | `mini` | `mac` | 节点标识;应与节点域名和故障切换语义一致 |
16+| `BAA_CONDUCTOR_ROLE` | `primary` | `standby` | conductor 期望角色;切回主节点前不要让 `mac` 默认成 `primary` |
17+| `BAA_CONTROL_API_BASE` | `https://control-api.makefile.so` | `https://control-api.makefile.so` | 控制平面统一入口 |
18+| `BAA_CONDUCTOR_LOCAL_API` | `http://127.0.0.1:4317` | `http://127.0.0.1:4317` | 本机 loopback 地址;两台机器可以相同 |
19+| `BAA_RUNS_DIR` | `/Users/george/code/baa-conductor/runs` | `/Users/george/code/baa-conductor/runs` | run 根目录 |
20+| `BAA_WORKTREES_DIR` | `/Users/george/code/baa-conductor/worktrees` | `/Users/george/code/baa-conductor/worktrees` | task worktree 根目录 |
21+| `BAA_LOGS_DIR` | `/Users/george/code/baa-conductor/logs` | `/Users/george/code/baa-conductor/logs` | 服务日志根目录 |
22+| `BAA_TMP_DIR` | `/Users/george/code/baa-conductor/tmp` | `/Users/george/code/baa-conductor/tmp` | 临时目录根 |
23+| `BAA_NODE_ID` | `mini-main` | `mac-standby` | 节点实例 ID;应稳定且可用于 lease/日志归因 |
24+| `BAA_SHARED_TOKEN` | 安装时注入 | 安装时注入 | 节点到 control API 的共享认证口令 |
25+
26+当前设计已经把 `state/` 纳入本地目录布局,但还没有单独定义 `BAA_STATE_DIR`。在真实 daemon 代码需要它之前,保持 `state/` 固定在 repo 根目录下即可。
27+
28+## launchd 辅助变量
29+
30+| 变量 | 推荐值 | 说明 |
31+| --- | --- | --- |
32+| `PATH` | `/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/george/.local/bin:/Users/george/bin` | 让 `node`、`git`、`pnpm`、`codex` 等命令在 `launchd` 环境里可发现 |
33+| `HOME` | `/Users/george` | 给后续子进程一个稳定的 home 目录 |
34+| `LANG` | `en_US.UTF-8` | 保证日志和文本处理统一用 UTF-8 |
35+| `LC_ALL` | `en_US.UTF-8` | 避免不同 locale 造成命令输出差异 |
36+
37+这些变量属于 `launchd` 安装层面的补充,不代表当前应用代码已经消费了全部字段。模板里统一保留它们,是为了避免后续服务落地时再拆分不同的 plist 版本。
38+
39+## 节点最小差异集
40+
41+如果两台机器的 repo 路径一致,`mac` 相对 `mini` 最少只要改这三项:
42+
43+```text
44+BAA_CONDUCTOR_HOST=mac
45+BAA_CONDUCTOR_ROLE=standby
46+BAA_NODE_ID=mac-standby
47+```
48+
49+此外,conductor plist 里的 CLI 参数也要同步从:
50+
51+```text
52+--host mini --role primary
53+```
54+
55+改成:
56+
57+```text
58+--host mac --role standby
59+```
A docs/runtime/launchd.md
+153, -0
  1@@ -0,0 +1,153 @@
  2+# launchd
  3+
  4+## 服务集合
  5+
  6+推荐长期守护的本地服务:
  7+
  8+- `so.makefile.baa-conductor`
  9+- `so.makefile.baa-worker-runner`
 10+- 可选 `so.makefile.baa-status-api`
 11+
 12+repo 内的三个 plist 源模板都默认写成 `mini` 的 canonical 配置:
 13+
 14+- repo 根目录:`/Users/george/code/baa-conductor`
 15+- 登录用户:`/Users/george`
 16+- conductor 参数:`--host mini --role primary`
 17+- token:`replace-me`
 18+
 19+安装前至少检查:
 20+
 21+- `BAA_SHARED_TOKEN` 已替换成真实值
 22+- `logs/launchd/` 已按 [`layout.md`](./layout.md) 创建
 23+- 如果 repo 不在 `/Users/george/code/baa-conductor`,同步改 `WorkingDirectory`、`ProgramArguments`、`HOME`、`StandardOutPath`、`StandardErrorPath`
 24+
 25+## `LaunchAgents` 与 `LaunchDaemons`
 26+
 27+| 目标路径 | 适合场景 | 优点 | 额外要求 |
 28+| --- | --- | --- | --- |
 29+| `~/Library/LaunchAgents/` | 开发机、自用节点、登录后再启动即可 | 不需要 `sudo`,调试最直接 | 只会在用户登录后启动 |
 30+| `/Library/LaunchDaemons/` | 需要开机登录前就启动 | 适合 headless 常驻 | plist 必须 `root:wheel` 且通常要额外加 `UserName` |
 31+
 32+默认推荐先用 `LaunchAgents` 跑通,再按需切到 `LaunchDaemons`。
 33+
 34+## mini 安装
 35+
 36+`mini` 可以直接复用 repo 模板的大部分默认值,只需要先在复制后的副本里替换真实 token,并确认 control API 与本地端口设置正确。
 37+
 38+### 1. 复制模板
 39+
 40+```bash
 41+REPO_DIR=/Users/george/code/baa-conductor
 42+AGENTS_DIR="$HOME/Library/LaunchAgents"
 43+
 44+install -d "$AGENTS_DIR"
 45+cp "$REPO_DIR/ops/launchd/so.makefile.baa-conductor.plist" "$AGENTS_DIR/"
 46+cp "$REPO_DIR/ops/launchd/so.makefile.baa-worker-runner.plist" "$AGENTS_DIR/"
 47+cp "$REPO_DIR/ops/launchd/so.makefile.baa-status-api.plist" "$AGENTS_DIR/"
 48+```
 49+
 50+### 2. 修改安装副本
 51+
 52+最少检查这些字段:
 53+
 54+- 所有 plist 里的 `BAA_SHARED_TOKEN`
 55+- 所有 plist 里的 `BAA_CONTROL_API_BASE`
 56+- 所有 plist 里的 `BAA_CONDUCTOR_LOCAL_API`
 57+
 58+如果 `status-api` 暂时不部署,可以删掉或不加载 `so.makefile.baa-status-api.plist`。
 59+
 60+### 3. 加载服务
 61+
 62+```bash
 63+launchctl bootout "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-conductor.plist" 2>/dev/null || true
 64+launchctl bootout "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-worker-runner.plist" 2>/dev/null || true
 65+launchctl bootout "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-status-api.plist" 2>/dev/null || true
 66+
 67+launchctl bootstrap "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-conductor.plist"
 68+launchctl bootstrap "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-worker-runner.plist"
 69+launchctl bootstrap "gui/$(id -u)" "$AGENTS_DIR/so.makefile.baa-status-api.plist"
 70+
 71+launchctl kickstart -k "gui/$(id -u)/so.makefile.baa-conductor"
 72+launchctl kickstart -k "gui/$(id -u)/so.makefile.baa-worker-runner"
 73+launchctl kickstart -k "gui/$(id -u)/so.makefile.baa-status-api"
 74+```
 75+
 76+如果 `status-api` 没启用,把对应三行删掉即可。
 77+
 78+## mac 安装
 79+
 80+`mac` 与 `mini` 用同一组模板,但需要先把节点身份改成 standby。
 81+
 82+### 1. 复制模板
 83+
 84+复制命令与 `mini` 相同,只是目标机器改成 `mac` 本机的 `~/Library/LaunchAgents/`。
 85+
 86+### 2. 修改节点差异项
 87+
 88+在三个 plist 的 `EnvironmentVariables` 里统一改:
 89+
 90+- `BAA_CONDUCTOR_HOST=mac`
 91+- `BAA_CONDUCTOR_ROLE=standby`
 92+- `BAA_NODE_ID=mac-standby`
 93+- `BAA_SHARED_TOKEN=<真实共享口令>`
 94+
 95+只在 conductor plist 里额外改:
 96+
 97+- `--host mini` -> `--host mac`
 98+- `--role primary` -> `--role standby`
 99+
100+如果 `mac` 的 repo 路径、home 目录或本地端口与 `mini` 不同,也在复制后的副本里同步改绝对路径与 `BAA_CONDUCTOR_LOCAL_API`。
101+
102+### 3. 加载服务
103+
104+`launchctl bootstrap` 与 `kickstart` 命令和 `mini` 完全相同,只是执行机器换成 `mac`。
105+
106+## 切到 `LaunchDaemons`
107+
108+如果需要登录前启动,流程改成:
109+
110+1. 把编辑好的 plist 复制到 `/Library/LaunchDaemons/`
111+2. 在每个 plist 中增加 `UserName`,例如 `george`
112+3. 设置权限为 `root:wheel` 和 `0644`
113+4. 用 `sudo launchctl bootstrap system ...`
114+
115+示例:
116+
117+```bash
118+PLIST_SRC="$HOME/Library/LaunchAgents/so.makefile.baa-conductor.plist"
119+
120+sudo cp "$PLIST_SRC" /Library/LaunchDaemons/
121+sudo chown root:wheel /Library/LaunchDaemons/so.makefile.baa-conductor.plist
122+sudo chmod 644 /Library/LaunchDaemons/so.makefile.baa-conductor.plist
123+
124+sudo launchctl bootout system /Library/LaunchDaemons/so.makefile.baa-conductor.plist 2>/dev/null || true
125+sudo launchctl bootstrap system /Library/LaunchDaemons/so.makefile.baa-conductor.plist
126+sudo launchctl kickstart -k system/so.makefile.baa-conductor
127+```
128+
129+使用 `LaunchDaemons` 时尤其要注意:
130+
131+- plist 里的 `HOME`、repo 路径和日志路径不能依赖当前登录用户的 shell
132+- runtime 根目录必须对 `UserName` 指定的账号可写
133+- 不要把 repo 源模板直接 `sudo cp` 过去后立刻加载,先改安装副本
134+
135+## 校验与排障
136+
137+静态校验:
138+
139+```bash
140+plutil -lint ops/launchd/so.makefile.baa-conductor.plist
141+plutil -lint ops/launchd/so.makefile.baa-worker-runner.plist
142+plutil -lint ops/launchd/so.makefile.baa-status-api.plist
143+```
144+
145+运行时排障常用命令:
146+
147+```bash
148+launchctl print "gui/$(id -u)/so.makefile.baa-conductor"
149+launchctl print "gui/$(id -u)/so.makefile.baa-worker-runner"
150+tail -n 50 /Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-conductor.err.log
151+tail -n 50 /Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-worker-runner.err.log
152+```
153+
154+当前仓库还没有真实的 `dist/index.js` 产物,因此真正执行 `bootstrap` 后,服务进程仍可能因为入口文件不存在而启动失败。这不影响本任务交付的部署约定;后续只要服务构建产物落到约定路径,安装方式不需要再改。
A docs/runtime/layout.md
+92, -0
 1@@ -0,0 +1,92 @@
 2+# runtime layout
 3+
 4+## 根路径
 5+
 6+推荐 `mini` 与 `mac` 都把仓库放在:
 7+
 8+```text
 9+/Users/george/code/baa-conductor
10+```
11+
12+这样 `launchd` 模板里的绝对路径可以保持一致,只有节点身份变量需要区分。
13+
14+## 目录树
15+
16+```text
17+/Users/george/code/baa-conductor/
18+  state/
19+  runs/
20+  worktrees/
21+  logs/
22+    launchd/
23+  tmp/
24+```
25+
26+`state/` 是本地状态镜像目录,`runs/`、`worktrees/`、`logs/`、`tmp/` 是本任务需要先落地的 runtime 根目录。
27+
28+## 一次性初始化
29+
30+在两台机器上都先创建 runtime 根目录:
31+
32+```bash
33+REPO_DIR=/Users/george/code/baa-conductor
34+
35+install -d -m 700 \
36+  "$REPO_DIR/state" \
37+  "$REPO_DIR/runs" \
38+  "$REPO_DIR/worktrees" \
39+  "$REPO_DIR/logs" \
40+  "$REPO_DIR/logs/launchd" \
41+  "$REPO_DIR/tmp"
42+```
43+
44+如果服务通过 `LaunchDaemons` 以专门账号运行,再把这些目录的 owner 改成该账号,而不是当前登录用户:
45+
46+```bash
47+sudo chown -R george:staff \
48+  "$REPO_DIR/state" \
49+  "$REPO_DIR/runs" \
50+  "$REPO_DIR/worktrees" \
51+  "$REPO_DIR/logs" \
52+  "$REPO_DIR/tmp"
53+```
54+
55+## 目录职责
56+
57+| 路径 | 初始化方式 | 后续创建者 | 说明 |
58+| --- | --- | --- | --- |
59+| `state/` | 手工预创建根目录 | conductor | 本地状态镜像,便于恢复与对账 |
60+| `runs/` | 手工预创建根目录 | conductor/worker | 每个 run 在 `runs/<task-id>/<run-id>/` 下落本地元数据与日志 |
61+| `worktrees/` | 手工预创建根目录 | conductor | 每个 task 一个确定性的 worktree,worker 不负责清理 |
62+| `logs/` | 手工预创建根目录 | `launchd` 与服务进程 | `logs/launchd/` 放服务 stdout/stderr,其它运行期日志仍按 run 归档 |
63+| `tmp/` | 手工预创建根目录 | conductor/worker | 临时文件和中间产物,整机停服后才允许清空 |
64+
65+## `runs/` 的细化约定
66+
67+每个 run 的目录建议保持:
68+
69+```text
70+runs/<task-id>/<run-id>/
71+  meta.json
72+  state.json
73+  stdout.log
74+  stderr.log
75+  worker.log
76+  checkpoints/
77+  artifacts/
78+```
79+
80+根目录只预创建到 `runs/`。`<task-id>`、`<run-id>`、`checkpoints/` 与 `artifacts/` 都应由 conductor/worker 在实际执行时创建。
81+
82+## `worktrees/` 的细化约定
83+
84+- `worktrees/<task-id>/` 只在有活跃 task 时创建。
85+- 同一 task 只保留一个 worktree 路径,避免恢复时找错目录。
86+- 陈旧 worktree 只能由 conductor 或后续专门的清理流程回收,worker 不应自行删除。
87+
88+## `logs/` 与 `tmp/` 的边界
89+
90+- `logs/launchd/*.out.log` 与 `logs/launchd/*.err.log` 只记录长期服务级日志。
91+- step 级 stdout/stderr 仍写回各自的 `runs/<task-id>/<run-id>/`。
92+- `tmp/` 只放临时 scratch 数据,不应作为 checkpoint 或 durable 状态目录。
93+- 任何清理 `tmp/` 或 `logs/` 的脚本都应在停服后执行,避免误删活跃 run 依赖的文件。
M ops/launchd/so.makefile.baa-conductor.plist
+53, -1
 1@@ -1,9 +1,53 @@
 2 <?xml version="1.0" encoding="UTF-8"?>
 3 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 4+<!--
 5+  Source template kept in the repo.
 6+  Default values target the mini node at /Users/george/code/baa-conductor.
 7+  For mac, change BAA_CONDUCTOR_HOST, BAA_CONDUCTOR_ROLE, BAA_NODE_ID,
 8+  BAA_SHARED_TOKEN, and keep the CLI args aligned with those values.
 9+  If this file is installed under /Library/LaunchDaemons, add UserName and keep
10+  every path absolute; launchd will not read shell rc files for you.
11+-->
12 <plist version="1.0">
13   <dict>
14     <key>Label</key>
15     <string>so.makefile.baa-conductor</string>
16+
17+    <key>WorkingDirectory</key>
18+    <string>/Users/george/code/baa-conductor</string>
19+
20+    <key>EnvironmentVariables</key>
21+    <dict>
22+      <key>PATH</key>
23+      <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/george/.local/bin:/Users/george/bin</string>
24+      <key>HOME</key>
25+      <string>/Users/george</string>
26+      <key>LANG</key>
27+      <string>en_US.UTF-8</string>
28+      <key>LC_ALL</key>
29+      <string>en_US.UTF-8</string>
30+      <key>BAA_CONDUCTOR_HOST</key>
31+      <string>mini</string>
32+      <key>BAA_CONDUCTOR_ROLE</key>
33+      <string>primary</string>
34+      <key>BAA_CONTROL_API_BASE</key>
35+      <string>https://control-api.makefile.so</string>
36+      <key>BAA_CONDUCTOR_LOCAL_API</key>
37+      <string>http://127.0.0.1:4317</string>
38+      <key>BAA_RUNS_DIR</key>
39+      <string>/Users/george/code/baa-conductor/runs</string>
40+      <key>BAA_WORKTREES_DIR</key>
41+      <string>/Users/george/code/baa-conductor/worktrees</string>
42+      <key>BAA_LOGS_DIR</key>
43+      <string>/Users/george/code/baa-conductor/logs</string>
44+      <key>BAA_TMP_DIR</key>
45+      <string>/Users/george/code/baa-conductor/tmp</string>
46+      <key>BAA_NODE_ID</key>
47+      <string>mini-main</string>
48+      <key>BAA_SHARED_TOKEN</key>
49+      <string>replace-me</string>
50+    </dict>
51+
52     <key>ProgramArguments</key>
53     <array>
54       <string>/usr/bin/env</string>
55@@ -14,10 +58,18 @@
56       <string>--role</string>
57       <string>primary</string>
58     </array>
59+
60+    <key>ProcessType</key>
61+    <string>Background</string>
62     <key>RunAtLoad</key>
63     <true/>
64     <key>KeepAlive</key>
65     <true/>
66+    <key>ThrottleInterval</key>
67+    <integer>10</integer>
68+    <key>StandardOutPath</key>
69+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-conductor.out.log</string>
70+    <key>StandardErrorPath</key>
71+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-conductor.err.log</string>
72   </dict>
73 </plist>
74-
M ops/launchd/so.makefile.baa-status-api.plist
+50, -1
 1@@ -1,19 +1,68 @@
 2 <?xml version="1.0" encoding="UTF-8"?>
 3 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 4+<!--
 5+  Optional local status API.
 6+  Keep the same runtime paths as conductor and worker-runner so that service
 7+  logs and temporary files stay under one repo-owned runtime root.
 8+-->
 9 <plist version="1.0">
10   <dict>
11     <key>Label</key>
12     <string>so.makefile.baa-status-api</string>
13+
14+    <key>WorkingDirectory</key>
15+    <string>/Users/george/code/baa-conductor</string>
16+
17+    <key>EnvironmentVariables</key>
18+    <dict>
19+      <key>PATH</key>
20+      <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/george/.local/bin:/Users/george/bin</string>
21+      <key>HOME</key>
22+      <string>/Users/george</string>
23+      <key>LANG</key>
24+      <string>en_US.UTF-8</string>
25+      <key>LC_ALL</key>
26+      <string>en_US.UTF-8</string>
27+      <key>BAA_CONDUCTOR_HOST</key>
28+      <string>mini</string>
29+      <key>BAA_CONDUCTOR_ROLE</key>
30+      <string>primary</string>
31+      <key>BAA_CONTROL_API_BASE</key>
32+      <string>https://control-api.makefile.so</string>
33+      <key>BAA_CONDUCTOR_LOCAL_API</key>
34+      <string>http://127.0.0.1:4317</string>
35+      <key>BAA_RUNS_DIR</key>
36+      <string>/Users/george/code/baa-conductor/runs</string>
37+      <key>BAA_WORKTREES_DIR</key>
38+      <string>/Users/george/code/baa-conductor/worktrees</string>
39+      <key>BAA_LOGS_DIR</key>
40+      <string>/Users/george/code/baa-conductor/logs</string>
41+      <key>BAA_TMP_DIR</key>
42+      <string>/Users/george/code/baa-conductor/tmp</string>
43+      <key>BAA_NODE_ID</key>
44+      <string>mini-main</string>
45+      <key>BAA_SHARED_TOKEN</key>
46+      <string>replace-me</string>
47+    </dict>
48+
49     <key>ProgramArguments</key>
50     <array>
51       <string>/usr/bin/env</string>
52       <string>node</string>
53       <string>/Users/george/code/baa-conductor/apps/status-api/dist/index.js</string>
54     </array>
55+
56+    <key>ProcessType</key>
57+    <string>Background</string>
58     <key>RunAtLoad</key>
59     <true/>
60     <key>KeepAlive</key>
61     <true/>
62+    <key>ThrottleInterval</key>
63+    <integer>10</integer>
64+    <key>StandardOutPath</key>
65+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-status-api.out.log</string>
66+    <key>StandardErrorPath</key>
67+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-status-api.err.log</string>
68   </dict>
69 </plist>
70-
M ops/launchd/so.makefile.baa-worker-runner.plist
+51, -1
 1@@ -1,19 +1,69 @@
 2 <?xml version="1.0" encoding="UTF-8"?>
 3 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 4+<!--
 5+  Source template kept in the repo.
 6+  Defaults target the mini node and share the same runtime tree as conductor.
 7+  For mac, change BAA_CONDUCTOR_HOST, BAA_CONDUCTOR_ROLE, BAA_NODE_ID, and
 8+  BAA_SHARED_TOKEN before copying the file into the launchd install path.
 9+-->
10 <plist version="1.0">
11   <dict>
12     <key>Label</key>
13     <string>so.makefile.baa-worker-runner</string>
14+
15+    <key>WorkingDirectory</key>
16+    <string>/Users/george/code/baa-conductor</string>
17+
18+    <key>EnvironmentVariables</key>
19+    <dict>
20+      <key>PATH</key>
21+      <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/george/.local/bin:/Users/george/bin</string>
22+      <key>HOME</key>
23+      <string>/Users/george</string>
24+      <key>LANG</key>
25+      <string>en_US.UTF-8</string>
26+      <key>LC_ALL</key>
27+      <string>en_US.UTF-8</string>
28+      <key>BAA_CONDUCTOR_HOST</key>
29+      <string>mini</string>
30+      <key>BAA_CONDUCTOR_ROLE</key>
31+      <string>primary</string>
32+      <key>BAA_CONTROL_API_BASE</key>
33+      <string>https://control-api.makefile.so</string>
34+      <key>BAA_CONDUCTOR_LOCAL_API</key>
35+      <string>http://127.0.0.1:4317</string>
36+      <key>BAA_RUNS_DIR</key>
37+      <string>/Users/george/code/baa-conductor/runs</string>
38+      <key>BAA_WORKTREES_DIR</key>
39+      <string>/Users/george/code/baa-conductor/worktrees</string>
40+      <key>BAA_LOGS_DIR</key>
41+      <string>/Users/george/code/baa-conductor/logs</string>
42+      <key>BAA_TMP_DIR</key>
43+      <string>/Users/george/code/baa-conductor/tmp</string>
44+      <key>BAA_NODE_ID</key>
45+      <string>mini-main</string>
46+      <key>BAA_SHARED_TOKEN</key>
47+      <string>replace-me</string>
48+    </dict>
49+
50     <key>ProgramArguments</key>
51     <array>
52       <string>/usr/bin/env</string>
53       <string>node</string>
54       <string>/Users/george/code/baa-conductor/apps/worker-runner/dist/index.js</string>
55     </array>
56+
57+    <key>ProcessType</key>
58+    <string>Background</string>
59     <key>RunAtLoad</key>
60     <true/>
61     <key>KeepAlive</key>
62     <true/>
63+    <key>ThrottleInterval</key>
64+    <integer>10</integer>
65+    <key>StandardOutPath</key>
66+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-worker-runner.out.log</string>
67+    <key>StandardErrorPath</key>
68+    <string>/Users/george/code/baa-conductor/logs/launchd/so.makefile.baa-worker-runner.err.log</string>
69   </dict>
70 </plist>
71-