im_wower
·
2026-03-22
T-013-build-runtime.md
1---
2task_id: T-013
3title: Build 与 dist 产物
4status: done
5branch: feat/T-013-build-runtime
6repo: /Users/george/code/baa-conductor
7base_ref: main@c5e007b
8depends_on:
9 - T-011
10write_scope:
11 - package.json
12 - tsconfig.base.json
13 - apps/conductor-daemon/package.json
14 - apps/conductor-daemon/tsconfig.json
15 - apps/control-api-worker/package.json
16 - apps/control-api-worker/tsconfig.json
17 - apps/status-api/package.json
18 - apps/status-api/tsconfig.json
19 - apps/worker-runner/package.json
20 - apps/worker-runner/tsconfig.json
21 - docs/runtime/**
22updated_at: 2026-03-22
23---
24
25# T-013 Build 与 dist 产物
26
27## 目标
28
29把当前仓库从“只有 typecheck,没有真实产物”推进到“至少 apps 能产出 `dist/index.js`”,让 launchd 模板不再只是静态占位。
30
31## 统一开工要求
32
33- 必须从当前最新 `origin/main` 切出该分支
34- 新 worktree 进入后先执行 `npx --yes pnpm install`
35- 不允许从其他任务分支切分支
36
37## 本任务包含
38
39- 修正根 `build` 脚本
40- 让 `apps/*` 的 `build` 真正输出 JS
41- 调整必要的 tsconfig,使 `dist/` 可生成
42- 如果需要,补最小的 build 使用说明到 `docs/runtime/**`
43
44## 本任务不包含
45
46- 真正运行 launchd
47- 真实业务逻辑接线
48- 包级发布配置
49
50## 建议起始文件
51
52- `package.json`
53- `tsconfig.base.json`
54- `apps/*/package.json`
55- `apps/*/tsconfig.json`
56- `docs/runtime/launchd.md`
57
58## 交付物
59
60- `pnpm -r build` 可用
61- apps 产出 `dist/index.js`
62
63## 验收
64
65- `npx --yes pnpm -r build` 通过
66- `apps/conductor-daemon/dist/index.js` 存在
67- `apps/worker-runner/dist/index.js` 存在
68- `apps/status-api/dist/index.js` 存在
69
70## files_changed
71
72- `coordination/tasks/T-013-build-runtime.md`
73- `package.json`
74- `apps/conductor-daemon/package.json`
75- `apps/control-api-worker/package.json`
76- `apps/status-api/package.json`
77- `apps/worker-runner/package.json`
78- `docs/runtime/README.md`
79- `docs/runtime/launchd.md`
80
81## commands_run
82
83- `git worktree add /Users/george/code/baa-conductor-T013 -b feat/T-013-build-runtime c5e007b082772d085a030217691f6b88da9b3ee4`
84- `npx --yes pnpm install`
85- `npx --yes pnpm -r build`
86- `node --input-type=module -e "await import('./apps/conductor-daemon/dist/index.js'); console.log('ok conductor-daemon');"`
87- `node --input-type=module -e "await import('./apps/control-api-worker/dist/index.js'); console.log('ok control-api-worker');"`
88- `node --input-type=module -e "await import('./apps/status-api/dist/index.js'); console.log('ok status-api');"`
89- `node --input-type=module -e "await import('./apps/worker-runner/dist/index.js'); console.log('ok worker-runner');"`
90
91## result
92
93- 四个 app 的 `build` 已从 `tsc --noEmit` 改成真实 emit,其中 `conductor-daemon` 直接输出 `dist/index.js`
94- 为 `control-api-worker`、`status-api`、`worker-runner` 增加了统一 postbuild 处理:固定根入口到 `dist/index.js`,并在需要时改写编译后 import specifier
95- `control-api-worker` 与 `worker-runner` 的编译产物已改写为引用同一 `dist/` 下同步生成的 package JS 文件,`worker-runner` 产物里的相对 import 也已补齐 `.js` 扩展
96- `npx --yes pnpm -r build` 通过,四个 `apps/*/dist/index.js` 均存在,且可被 `node` 直接 `import(...)`
97- `docs/runtime` 已更新为“先 build 再 launchd bootstrap”的当前约定,不再声明仓库缺少 `dist/index.js`
98
99## risks
100
101- 目前 package 自身仍然只做 typecheck,没有形成独立发布级 `dist/`;`control-api-worker` 与 `worker-runner` 依赖 app build 阶段的产物改写
102- 根 `package.json` 中的 postbuild helper 目前以内联脚本维护,后续如果构建规则继续变复杂,最好拆成独立脚本文件
103- 本任务解决的是“产物路径稳定且可加载”,不是“服务运行时逻辑全部接好”;`T-014`、`T-015`、`T-017` 仍需补真正启动流程
104
105## next_handoff
106
107- `T-014` 可以直接把 `apps/control-api-worker/dist/index.js` 当作稳定入口做运行时接线,不必再解决 bare workspace import 问题
108- `T-015` 可以基于 `apps/conductor-daemon/dist/index.js` 继续补 CLI/daemon 启动逻辑,并复用文档里“先 build 再 bootstrap”的流程
109- `T-017` 可以直接围绕 `apps/status-api/dist/index.js` 挂 HTTP 启动入口;若后续需要 package 级独立 dist,可另拆构建任务
110
111## notes
112
113- `2026-03-21`: 创建第三波任务卡