baa-conductor

git clone 

baa-conductor / coordination / tasks / done
im_wower  ·  2026-03-22

T-021-runtime-bootstrap.md

  1---
  2task_id: T-021
  3title: launchd 安装脚本与 Runtime Bootstrap
  4status: done
  5branch: feat/T-021-runtime-bootstrap
  6repo: /Users/george/code/baa-conductor
  7base_ref: main@458d7cf
  8depends_on:
  9  - T-011
 10  - T-013
 11  - T-015
 12  - T-017
 13write_scope:
 14  - ops/launchd/**
 15  - docs/runtime/**
 16  - scripts/runtime/**
 17updated_at: 2026-03-22T01:08:59+0800
 18---
 19
 20# T-021 launchd 安装脚本与 Runtime Bootstrap
 21
 22## 目标
 23
 24把现有 launchd 模板和 runtime 文档推进到“有实际 bootstrap/install/check 脚本可执行”的程度,减少手工部署步骤。
 25
 26## 本任务包含
 27
 28-`scripts/runtime/**` 下补 runtime 目录初始化脚本
 29- 补 launchd 安装、重载、检查的辅助脚本
 30-`docs/runtime/**` 与脚本行为保持一致
 31- 如有必要,小幅修正 `ops/launchd/**` 模板中的占位项说明
 32
 33## 本任务不包含
 34
 35- 修改 app 业务代码
 36- 实际在本机加载 launchd 服务
 37- 修改 Nginx 或 Cloudflare DNS
 38
 39## 建议起始文件
 40
 41- `docs/runtime/README.md`
 42- `docs/runtime/launchd.md`
 43- `docs/runtime/layout.md`
 44- `ops/launchd/*.plist`
 45- `scripts/runtime/`
 46
 47## 交付物
 48
 49- 可执行的 bootstrap/install/check 脚本
 50- 与脚本一致的 runtime / launchd 文档
 51- 更低摩擦的本地部署流程
 52
 53## 验收
 54
 55- `plutil -lint ops/launchd/so.makefile.baa-conductor.plist`
 56- `plutil -lint ops/launchd/so.makefile.baa-worker-runner.plist`
 57- `plutil -lint ops/launchd/so.makefile.baa-status-api.plist`
 58- 如果新增 shell 脚本:`bash -n scripts/runtime/*.sh`
 59
 60## 更新要求
 61
 62完成时更新 frontmatter 的:
 63
 64- `status`
 65- `base_ref`
 66- `updated_at`
 67
 68并补充下面这些内容:
 69
 70## files_changed
 71
 72- `coordination/tasks/T-021-runtime-bootstrap.md`
 73- `docs/runtime/README.md`
 74- `docs/runtime/environment.md`
 75- `docs/runtime/launchd.md`
 76- `docs/runtime/layout.md`
 77- `ops/launchd/so.makefile.baa-conductor.plist`
 78- `ops/launchd/so.makefile.baa-worker-runner.plist`
 79- `ops/launchd/so.makefile.baa-status-api.plist`
 80- `scripts/runtime/bootstrap.sh`
 81- `scripts/runtime/check-launchd.sh`
 82- `scripts/runtime/common.sh`
 83- `scripts/runtime/install-launchd.sh`
 84- `scripts/runtime/reload-launchd.sh`
 85
 86## commands_run
 87
 88- `npx --yes pnpm install`
 89- `chmod +x scripts/runtime/bootstrap.sh scripts/runtime/install-launchd.sh scripts/runtime/reload-launchd.sh scripts/runtime/check-launchd.sh`
 90- `bash -n scripts/runtime/*.sh`
 91- `plutil -lint ops/launchd/so.makefile.baa-conductor.plist ops/launchd/so.makefile.baa-worker-runner.plist ops/launchd/so.makefile.baa-status-api.plist`
 92- `git diff --check`
 93- `./scripts/runtime/bootstrap.sh --repo-dir "$TMP_REPO"`
 94- `./scripts/runtime/install-launchd.sh --repo-dir "$TMP_REPO" --home-dir "$TMP_HOME" --install-dir "$TMP_INSTALL" --node mini --all-services --shared-token test-token`
 95- `./scripts/runtime/check-launchd.sh --repo-dir "$TMP_REPO" --home-dir "$TMP_HOME" --install-dir "$TMP_INSTALL" --node mini --all-services --shared-token test-token`
 96- `./scripts/runtime/reload-launchd.sh --install-dir "$TMP_INSTALL" --all-services --dry-run`
 97
 98## result
 99
100- 已新增 `scripts/runtime/bootstrap.sh`、`install-launchd.sh`、`check-launchd.sh`、`reload-launchd.sh` 与共享 helper,使 runtime 目录初始化、plist 安装副本渲染、静态校验、`launchctl` 重载都有可执行脚本。
101- 已把 `docs/runtime/**` 改为以脚本驱动流程为准,补充 `--node`、`--repo-dir`、`--shared-token`、`--scope` 等输入约定,并明确默认只安装 `conductor`、其它模板需显式 opt-in。
102- 已小幅修正 `ops/launchd/*.plist` 说明并补入 `BAA_STATE_DIR`,同时在临时 repo 上完成 bootstrap -> install -> check -> reload(dry-run) 的整链验证。
103
104## risks
105
106- 本任务只验证了 plist 渲染、静态检查和 dry-run `launchctl` 命令,没有在本机真实 `bootstrap` 任何 launchd 服务;实际目标机上仍需再做一次权限和 domain 验证。
107- `worker-runner``status-api` 模板现在可以被脚本渲染和校验,但是否作为常驻服务启用仍取决于各自宿主进程接线进度;默认流程因此只安装 `conductor`108
109## next_handoff
110
111- 在真实 `mini` / `mac` 节点上按文档顺序执行 `bootstrap.sh`、`npx --yes pnpm -r build`、`install-launchd.sh`、`check-launchd.sh`,确认安装副本和 runtime 目录都落在预期路径。
112- 真正准备加载服务时,先运行 `reload-launchd.sh --dry-run` 复核命令;确认无误后再去掉 `--dry-run`。若后续 runner/status 宿主进程落地,可再显式加 `--service worker-runner``--service status-api`113
114开始时建议直接把 `status` 改为 `in_progress`115
116做完并推送后:
117
118- 如果等待整合,改为 `review`
119- 如果确认结束,改为 `done`