@haiyangbg/buildbeat 0.0.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +296 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +288 -0
  4. package/README.md +283 -4
  5. package/SKILL.md +303 -0
  6. package/bin/buildbeat.js +5 -0
  7. package/bin/solobaton.js +6 -0
  8. package/docs/CAPABILITY-MATRIX.md +50 -0
  9. package/docs/CHECKS.md +326 -0
  10. package/docs/CLI-PILOT-2026-08-23.md +25 -0
  11. package/docs/CLI-STRATEGY-2026-08.md +55 -0
  12. package/docs/CLI.md +233 -0
  13. package/docs/EXECUTION-PLAN.md +487 -0
  14. package/docs/LEGACY-V1.16-MIGRATION.md +54 -0
  15. package/docs/PHASE1-PILOT-2026-08-24.md +32 -0
  16. package/docs/PHASE2-BUILDBEAT-PILOT-2026-08-25.md +75 -0
  17. package/docs/PHASE2-PILOT-2026-08-25.md +88 -0
  18. package/docs/PHASE2-PILOT-PREFLIGHT-2026-08-25.md +42 -0
  19. package/docs/PHASE4-STABILITY-AUDIT-2026-08-25.md +33 -0
  20. package/docs/PHASE4-V1.20-PILOT-2026-08-25.md +52 -0
  21. package/docs/RELEASING.md +117 -0
  22. package/docs/ROADMAP.md +873 -0
  23. package/example/.buildbeat/manifest.json +45 -0
  24. package/example/AGENTS.md +19 -0
  25. package/example/ARCHITECTURE.md +39 -0
  26. package/example/BUILDBEAT.md +17 -0
  27. package/example/CLAUDE.md +7 -0
  28. package/example/README.md +53 -0
  29. package/example/contracts/PROTOCOL.md +38 -0
  30. package/example/pm/NOW.md +22 -0
  31. package/example/pm/adr/ADR-0001-local-first-sqlite.md +25 -0
  32. package/example/pm/adr/README.md +7 -0
  33. package/example/pm/archive//344/270/200/346/234/237/evidence/gate1.md +5 -0
  34. package/example/pm/archive//344/270/200/346/234/237/evidence/gate2.md +5 -0
  35. package/example/pm/archive//344/270/200/346/234/237/evidence/gate3.md +5 -0
  36. package/example/pm/archive//344/270/200/346/234/237/evidence/gate4.md +5 -0
  37. package/example/pm/archive//344/270/200/346/234/237/evidence/implementation.md +5 -0
  38. package/example/pm/decisions.md +20 -0
  39. package/example/pm/status//344/272/247/345/223/201.md +20 -0
  40. package/example/pm/status//345/205/250/346/240/210.md +15 -0
  41. package/example/pm/status//346/265/213/350/257/225.md +15 -0
  42. package/example/pm//344/270/200/346/234/237-/347/234/213/346/235/277.md +97 -0
  43. package/example/standards/CODE.md +18 -0
  44. package/example/standards/DESIGN.md +34 -0
  45. package/example/standards/REVIEW.md +16 -0
  46. package/example/standards/STACK.md +31 -0
  47. package/lessons.md +119 -0
  48. package/package.json +48 -7
  49. package/src/cli.js +323 -0
  50. package/src/constants.js +199 -0
  51. package/src/doctor.js +267 -0
  52. package/src/planner.js +251 -0
  53. package/src/project.js +839 -0
  54. package/src/upgrader.js +1249 -0
  55. package/src/writer.js +534 -0
  56. package/templates/.claude/agents/reviewer.md +62 -0
  57. package/templates/AGENTS.md +64 -0
  58. package/templates/ARCHITECTURE.md +50 -0
  59. package/templates/BUILDBEAT.md +13 -0
  60. package/templates/CLAUDE.md +7 -0
  61. package/templates/contracts/PROTOCOL.md +32 -0
  62. package/templates/gitignore.template +19 -0
  63. package/templates/pm/NOW.md +26 -0
  64. package/templates/pm/adr/ADR-0000-template.md +25 -0
  65. package/templates/pm/adr/README.md +15 -0
  66. package/templates/pm/changes/README.md +44 -0
  67. package/templates/pm/decisions.md +12 -0
  68. package/templates/pm/status/README.md +32 -0
  69. package/templates/pm//345/275/223/346/234/237/347/234/213/346/235/277.md +62 -0
  70. package/templates/scripts/bus-check.sh +1850 -0
  71. package/templates/scripts/design-preview.sh +44 -0
  72. package/templates/scripts/drift-check.sh +112 -0
  73. package/templates/scripts/pre-commit.sh +74 -0
  74. package/templates/scripts/verify-status.sh +105 -0
  75. package/templates/standards/CODE.md +23 -0
  76. package/templates/standards/DESIGN.md +36 -0
  77. package/templates/standards/REVIEW.md +20 -0
  78. package/templates/standards/STACK.md +37 -0
  79. package/templates//346/214/207/346/214/245/345/217/260.md +35 -0
@@ -0,0 +1,45 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "scaffoldVersion": "v1.20",
4
+ "cliVersion": "1.20.0",
5
+ "layout": "default",
6
+ "installedAt": "2026-08-25T00:00:00.000Z",
7
+ "files": {
8
+ "AGENTS.md": {
9
+ "policy": "replace-if-unmodified",
10
+ "baselineSha256": "b88c3a8f2763933ab7f3c2ebf983fb41f0b2fd4fe878983b94832774854d0e0d"
11
+ },
12
+ "ARCHITECTURE.md": {
13
+ "policy": "project-owned",
14
+ "baselineSha256": "4c9149a3af00c62f7b588501cf6325aea5be9e96051021c5cffc36d7c5d119b6"
15
+ },
16
+ "BUILDBEAT.md": {
17
+ "policy": "replace-if-unmodified",
18
+ "baselineSha256": "039ac488b5b3a06857e0c19002ba3fee027ba732aef23e3987c2983fb0c4358d"
19
+ },
20
+ "CLAUDE.md": {
21
+ "policy": "replace-if-unmodified",
22
+ "baselineSha256": "1947d9d2c20ce3ede4e24d4f28cedbde0298af53ab5b0e212163d966d28a7a0b"
23
+ },
24
+ "contracts/PROTOCOL.md": {
25
+ "policy": "project-owned",
26
+ "baselineSha256": "3c970768bed43fa42e4397e703bec4ecedff3a61509d3abcc7ad707e91df8eff"
27
+ },
28
+ "pm/NOW.md": {
29
+ "policy": "project-owned",
30
+ "baselineSha256": "e0404e1202d9f290d7c97273fc618b7f99f4448a7587898e06500fa0b5c72698"
31
+ },
32
+ "pm/decisions.md": {
33
+ "policy": "project-owned",
34
+ "baselineSha256": "fff21c36afbdd83132365f0657f54bca9efc5f1a7380c9478e0145ddbd0c8b60"
35
+ },
36
+ "pm/一期-看板.md": {
37
+ "policy": "project-owned",
38
+ "baselineSha256": "2b74f8a02d0cbdd5710300b2b2a99b101f5e336680edfbd8e30c2c37b542d0b8"
39
+ }
40
+ },
41
+ "integrations": {
42
+ "gitignore": null,
43
+ "hooks": null
44
+ }
45
+ }
@@ -0,0 +1,19 @@
1
+ # AGENTS.md — 简账 工作区 · 工作包路由 + 协作总线
2
+
3
+ > 沙盘说明:真项目此文件是完整版(路由表 + §1.5 审美红线 + 十条规则 + 红线,见 [templates/AGENTS.md](../templates/AGENTS.md));沙盘只展示**填好占位符的路由表**,其余段落与模板一致、此处从略。简账的同一 Builder 端到端拥有一期工作包,产品/全栈/测试只是 AI 视角。
4
+ > 根上另有一份 `CLAUDE.md`,只是指向本文件的一行指针(见 [templates/CLAUDE.md](../templates/CLAUDE.md))。
5
+
6
+ ## 1. 工作包路由 —— Builder 端到端负责,会话按 AI 视角隔离
7
+
8
+ | AI 视角 | cwd | 可写(拥有) | 只读 | 开工先读 | 状态写回 |
9
+ |---|---|---|---|---|---|
10
+ | **产品**(规格/编排) | `pm/` | `pm/**` | 全仓 | `pm/NOW.md` | 当期看板 + `pm/status/产品.md` |
11
+ | **全栈**(实现,含运维) | 工作区根(同持 jz-web、jz-api 两仓) | `jz-web/**` + `jz-api/**`(**按仓分别 stage,不 `git add -A`**) | `pm/*` 当期文件、契约 | 各代码仓自己的 `AGENTS.md` + `pm/NOW.md` | `pm/status/全栈.md`(带 hash)+ 各仓 `CHANGELOG.md` + `contracts/PROTOCOL.md` |
12
+ | **测试**(E2E·走查) | `jz-web/` | `tests/**` · 视觉基线 · 走查报告 | 实现 + spec + 设计稿 + 契约 | `pm/NOW.md` + `tests/README.md` | `pm/status/测试.md` + 核查门证据(E2E 报告/视觉 diff/对比图,**落 `pm/archive/<期>/evidence/`,换期零搬运**) |
13
+
14
+ > 🔴 同一 Builder 合并多视角的补偿控制:一期候选满足 review-ready(两仓 `HEAD=candidate`、工作树干净、L3/渲染证据绿、无待修)后由 reviewer 全核一次 + 测试视角独立核两端;首次 milestone 前写者自发现问题先自行收敛,只有修改冻结对外语义/不可逆副作用才提前 `risk-delta`。写者≠审者不变,但不边改边审。
15
+ > 开工/收工护栏:任意会话开工先跑 `bash scripts/bus-check.sh` + 各仓 `git pull`;收工前回写证据/状态并再跑 `bus-check --strict`,warning/unverified 仍需说明。
16
+
17
+ ## 1.5 UI 规范摘要 / 2. 十条规则 / 2.5 任务包与人批节奏 / 3. 红线
18
+
19
+ (与 [templates/AGENTS.md](../templates/AGENTS.md) 一致,沙盘从略。完整 UI 规范单点见 `standards/DESIGN.md`;规则⑥采用「机器闸常驻 + review-ready 后一次 milestone + P0/P1 合并 closure」;§2.5 规定会话按用户级工作包持续推进,审批分 `STOP_NOW / BATCH_AT_GATE / NO_APPROVAL`,不因每个小任务交还接力棒。)
@@ -0,0 +1,39 @@
1
+ # ARCHITECTURE.md — 简账 全栈总图(AI 会话接手按需读这份)
2
+
3
+ > 一句话:极简个人记账 Web 应用,单用户,先跑通「记一笔 → 看列表 → 月度报表」。
4
+ > 🔴 凭据一律**只标位置、不写值**。
5
+
6
+ ## 0. 架构链路
7
+
8
+ ```
9
+ 浏览器
10
+ ▼
11
+ jz-web(React + Vite,静态托管)
12
+ ▼
13
+ jz-api(Node + Express + SQLite,示例 PaaS 单实例)
14
+ ```
15
+
16
+ ## 1. 文件夹
17
+
18
+ ```
19
+ 简账/
20
+ ├── AGENTS.md / ARCHITECTURE.md / 指挥台.md / contracts/ / design/ / pm/ / scripts/
21
+ ├── jz-web/ # ★ 前端;详见其自己的 AGENTS.md
22
+ └── jz-api/ # ★ 后端 API + SQLite;详见其自己的 AGENTS.md
23
+ ```
24
+
25
+ ## 2. 基础设施标识(资源变动时更新本节)
26
+
27
+ | 项 | 值 | 说明 |
28
+ |---|---|---|
29
+ | 部署平台 | 示例 PaaS(沙盘虚构) | 真项目写平台/区域/应用 ID |
30
+ | 入口 | `https://jz.example.com` | 示意域名 |
31
+ | 数据库 | SQLite(随 jz-api 数据卷) | 每日备份挂账二期(看板挂账 #2) |
32
+
33
+ ### 凭据位置(🔴 只读取,不外泄、不写值)
34
+ - 示例 PaaS 部署 token → 本机 `~/.config/example-paas/token`(600 权限)
35
+ - jz-api 运行时 env 实查 → `paas env list jz-api`(示意命令)
36
+
37
+ ## 3. 红线 / 4. 子项目文档索引
38
+
39
+ (与 [templates/ARCHITECTURE.md](../templates/ARCHITECTURE.md) 一致,沙盘从略;改 jz-web 先读其自己的 `AGENTS.md`,改契约先读 `contracts/PROTOCOL.md`。)
@@ -0,0 +1,17 @@
1
+ # BUILDBEAT.md — 本项目的协作骨架版本标记
2
+
3
+ **本项目使用 BuildBeat `v1.20`**(2026-06-10 初次拷入;2026-08-22 升级;2026-08-25 scoped 分发迁移,沙盘示意)
4
+ **协调层布局:`默认`**(脚本在 `scripts/`;简账是从零起的项目,根上本来没别的东西 —— 接管存量项目才用紧凑布局)
5
+ 来源:<https://github.com/HaiYangBG1/BuildBeat>
6
+
7
+ ## 升级
8
+
9
+ 对照上游 [CHANGELOG.md](https://github.com/HaiYangBG1/BuildBeat/blob/main/CHANGELOG.md),从本文件记录的版本**往后**逐版看「拷出项目升级」标注的文件,同步后更新上面的版本行。拿不准就让 AI 会话对比上游 `templates/` 与本项目对应文件的差异。
10
+
11
+ ## 教学 manifest
12
+
13
+ `.buildbeat/manifest.json` 是为本仓文档回归维护的 schema 2 合成快照,它的 hash 锁定当前示例字节。它不证明 npm artifact 或真实 CLI 完成过写入,不是真实项目的安装证据,也不得作为 legacy 项目的复制/重命名来源。真实迁移见 [v1.16 legacy 迁移指南](../docs/LEGACY-V1.16-MIGRATION.md)。
14
+
15
+ ## 回灌(比升级更重要)
16
+
17
+ 本项目踩到 BuildBeat **没覆盖的新坑** → 回上游 `lessons.md` 登记一条(症状→根因→解药)。换期压缩仪式 checklist 里有"回灌一问",别跳过。
@@ -0,0 +1,7 @@
1
+ # CLAUDE.md — 指针(🔴 勿在此处写内容)
2
+
3
+ 本工作区的会话路由、协作总线十条规则、红线,**单点在同目录的 [`AGENTS.md`](AGENTS.md)** —— 请立即读取那份。
4
+
5
+ > 本文件只为兼容「只认 `CLAUDE.md` 这个文件名的工具」而存在,**永远保持这几行**。
6
+ > 往这里复制任何规则 = 两份文档必然漂移(上游 `lessons.md` 第 1 条:SSOT 腐烂)。
7
+ > 也不要改成符号链接:Windows 上 git 默认 `core.symlinks=false`,clone 出来会静默退化成一个内容是路径字符串的普通文件,装载即失效。
@@ -0,0 +1,53 @@
1
+ # example/ —— 教学沙盘:虚构项目「简账」跑完一期的快照
2
+
3
+ > 这里的协议骨架文件展示 `templates/` 对应模板**填好项目事实之后的样子**,status/evidence 则是虚构一期的教学产物;沙盘也刻意启用了可选 standards 与一个 ADR,用来展示“默认不生成、选择后由项目拥有”的完成态。
4
+ > 🔴 项目、数据、人物、决策全部虚构(已脱敏);commit hash 均为示意值——真项目里 hash 必须真实可查(`git cat-file -t <hash>`,见 [lessons.md](../lessons.md) 第 11 条)。
5
+ > [`.buildbeat/manifest.json`](.buildbeat/manifest.json) 是 schema 2 的**合成教学快照**:其 baseline hash 会由本仓机器检查锁定到当前示例字节,但它不证明 npm artifact 或真实 CLI 写过这些文件,也不是可复制到真实项目的受管基线。
6
+
7
+ ## 沙盘设定
8
+
9
+ - **项目**:「简账」—— 网页记账应用(就是主 README §2 举例的那个)
10
+ - **仓**:`jz-web`(前端 React)+ `jz-api`(后端 Node + SQLite),各自独立 git
11
+ - **工作包所有权**:同一 Builder 端到端负责;产品 / 全栈 / 测试是 AI 专业视角;**轨道**:标准轨;**部署**:示例 PaaS(沙盘不接真平台)
12
+ - **进度**:一期(记账主流程 + 月度报表)已跑完 Gate1→Gate4 上线,尚未换期
13
+
14
+ ## 怎么读(建议顺序)
15
+
16
+ 1. [pm/NOW.md](pm/NOW.md) —— 任何会话开工第一眼:当前期是什么、去看哪些文件
17
+ 2. [pm/一期-看板.md](pm/一期-看板.md) —— 当前工作包如何覆盖多个子项、决策收件箱如何批量收敛,以及阶段门/分工/挂账
18
+ 3. [pm/decisions.md](pm/decisions.md) —— 拍板台账:收敛后的真实决策包 + BuildBeat 升级记录(注意部分回答不单独记行)
19
+ 4. [pm/status/](pm/status/) —— 三个 AI 视角各写各的状态:带 hash、带证据指针,按工作包/里程碑更新而非每个子任务一条
20
+ 5. [pm/archive/一期/evidence/](pm/archive/一期/evidence/) —— 完成工作包和 Gate 令牌引用的可核验证据落点
21
+ 6. [contracts/PROTOCOL.md](contracts/PROTOCOL.md) —— 跨仓契约:快照 + 关键对齐点 + 变更记录(含"独立核查"列)
22
+ 7. [AGENTS.md](AGENTS.md) / [ARCHITECTURE.md](ARCHITECTURE.md) —— 路由表和全栈总图填好后的样子(根上另有 [CLAUDE.md](CLAUDE.md),只是指向 `AGENTS.md` 的一行指针)
23
+ 8. [standards/](standards/) —— 已确认的 STACK/CODE/REVIEW/DESIGN;普通项目可以完全没有此目录
24
+ 9. [pm/adr/](pm/adr/) —— 长期技术决定与替代链;普通拍板仍只进 decisions.md
25
+ 10. [.buildbeat/manifest.json](.buildbeat/manifest.json) —— schema 2 字段、所有权策略与 baseline hash 的教学快照
26
+
27
+ ## Gate 四态怎么写
28
+
29
+ `pm/一期-看板.md` 是已完成一期的 live 快照,因此四行都是 `passed`。下面只是语法对照,不要再追加到同一份看板:
30
+
31
+ ```md
32
+ - Gate1: pending
33
+ - Gate2: passed | 决策: `pm/decisions.md:16` | 证据: `pm/archive/一期/evidence/gate2.md`
34
+ - Gate3: blocked | 理由: `实现候选尚有 P1 待修`
35
+ - Gate4: n/a | 理由: `本工作包无部署或生产发布交付`
36
+ ```
37
+
38
+ `n/a` 必须同行带非占位的 `理由:`;`passed` 应同行指向已存在的决策表行或归档证据。`blocked` 也应说明真实阻塞,不把“还没做”包装成审批。
39
+
40
+ ## Manifest 的教学边界
41
+
42
+ - `files` 只记录这份合成快照声明的 8 个基线路径;当前文档字节与 `baselineSha256` 一致,是为了防止教材漂移,不是为 legacy 项目追认历史所有权。
43
+ - 可选 `standards/`、`pm/adr/`、业务 status 与 evidence 是基线后的 project-owned 教学内容,不进 manifest。
44
+ - 为避免复制可执行 SSOT,沙盘仍从上游引用 scripts/指挥台/Hook;所以这不是可用 `doctor` 证明健康的完整 CLI 安装。
45
+ - 真实 v1.16 拷出项目必须按 [legacy 迁移指南](../docs/LEGACY-V1.16-MIGRATION.md) 处理;不得复制本 manifest、重命名 `.solobaton` 文件,或把当前已改过的文件 hash 伪装成安装基线。
46
+
47
+ ## 拿它练手(公司内训用法)
48
+
49
+ 开一个 AI 会话,把本目录当项目根,说「你是当前工作包的产品视角,开工」——看它能否从 NOW 顺藤摸瓜讲清当前状态;再说「换期到二期」,对照 NOW.md 底部的压缩仪式 checklist,检查它做没做全。
50
+
51
+ 若把模板脚本复制进本目录运行 `bus-check --strict`,示意 commit 会按设计触发 `sync.ghost_hash`:这是给教学沙盘保留的负例,不是可发布候选的绿灯。真项目必须换成仓库中可解析的真实 hash;删除或豁免检查都不算修复。
52
+
53
+ > scripts/ 不在沙盘里:开工护栏等脚本直接用 [templates/scripts/](../templates/scripts/);指挥台操作卡见 [templates/指挥台.md](../templates/指挥台.md)。
@@ -0,0 +1,38 @@
1
+ # 简账 跨边界契约 · PROTOCOL(SSOT)
2
+
3
+ > **这是跨仓边界唯一的契约入口。** 谁改接口行为,先改这里;谁要接接口,先读这里。
4
+ > 🔴 协议变更不照单全收——独立核查后再信,并在 §3 登记一行。本文件不含任何凭据明文。
5
+
6
+ **契约快照对应版本:`v0.2.0`**(2026-06-20 上线)
7
+ > 🔴 线上实况唯一查询口 = `bash scripts/bus-check.sh`;本行只标「本快照写就时对应的版本」。
8
+
9
+ <!-- buildbeat-multirepo-map:v1
10
+ repo=jz-web|contract=contracts/PROTOCOL.md|deployment=n/a
11
+ repo=jz-api|contract=contracts/PROTOCOL.md|deployment=n/a
12
+ -->
13
+
14
+ ---
15
+
16
+ ## 1. 当前契约快照
17
+
18
+ ### 边界:jz-web ↔ jz-api(REST,JSON)
19
+
20
+ | 端点/字段 | 行为 | 备注 |
21
+ |---|---|---|
22
+ | `POST /api/entries` | 记一笔:`{amount, category, note?, ts}` → 201 | `amount` 一律**整数分**,前端负责展示为元 |
23
+ | `GET /api/entries?month=YYYY-MM` | 当月流水,按 `ts` 倒序 | 分页二期再说 |
24
+ | `GET /api/reports/monthly?month=YYYY-MM` | `{total, byCategory:[{category,sum}]}` | **按自然月**汇总(拍板 2026-06-12);空月返回 `{total:0, byCategory:[]}`,**不 404** |
25
+ | 鉴权 | 单用户:`Authorization: Bearer <token>` | token 位置见 `ARCHITECTURE.md` §凭据 |
26
+ | 错误 | `{error:{code,message}}` + 4xx/5xx | code 枚举:`INVALID_MONTH` / `UNAUTHORIZED` |
27
+
28
+ ## 2. 🔴 当前关键对齐点(开工前各域必须一致)
29
+
30
+ 1. 金额单位 = **分**(整数),序列化任何环节不得出现浮点——两端各有一条测试盯这条。
31
+ 2. 空月份返回空结构不 404——前端按"有数据/空数据"两态渲染,不做 404 分支。
32
+
33
+ ## 3. 契约变更记录(changelog · 倒序)
34
+
35
+ | 版本 | 日期 | 变更 | 独立核查 |
36
+ |---|---|---|---|
37
+ | v0.2.0 | 2026-06-18 | 新增 `GET /api/reports/monthly`;定「空月返回空结构不 404」 | 测试域实测 `curl …?month=2026-01` → 200 + 空结构;读 `jz-web` Report 页确认无 404 分支,两端一致 |
38
+ | v0.1.0 | 2026-06-13 | 首版:entries 两端点 + Bearer 鉴权 + 金额单位分 | reviewer 只读核两端代码,字段名/类型/错误码一致 |
@@ -0,0 +1,22 @@
1
+ # NOW — 当前冲刺指针(各工作包/AI 视角会话开工先读这里)
2
+
3
+ > 本文件**永远只是薄指针**:当前期 + 看哪些文件,🔴 禁堆流水日志。
4
+ > 🔴 线上版本不写在任何文档里:查 `bash scripts/bus-check.sh`。
5
+
6
+ **当前期:一期(记账主流程 + 月度报表)**(已收尾:Gate4 已过、上线复核完,待换期)
7
+ **本期轨道:标准轨**
8
+
9
+ | 看哪 | 文件 |
10
+ |---|---|
11
+ | 🧭 当期看板 | `一期-看板.md` |
12
+ | 🗳 拍板台账(决策单点) | `decisions.md` |
13
+ | 🔌 契约 | `contracts/PROTOCOL.md` |
14
+ | 📊 各 AI 视角状态(各写各的) | `status/产品.md` · `status/全栈.md` · `status/测试.md` |
15
+ | 🔁 在途变更提案 | `changes/`(本期无提案,目录未建) |
16
+ | 📦 历史期归档 | `archive/`(证据产物期中即写 `archive/一期/evidence/`;看板等文档换期时归档) |
17
+
18
+ ---
19
+
20
+ ### 换期 checklist(当前工作包 Builder / 产品视角)—— 含压缩仪式
21
+
22
+ > 与上游 NOW 模板的换期 checklist 一致,沙盘从略;二期立项时逐条执行。
@@ -0,0 +1,25 @@
1
+ # ADR-0001: 账本采用本地优先 SQLite
2
+
3
+ - Status: Accepted
4
+ - Date: 2026-06-13
5
+ - Superseded by: n/a
6
+
7
+ ## Context
8
+
9
+ 一期需要单用户快速记账、离线可用和低运维成本;当前没有多人实时协作或跨区域数据库需求。
10
+
11
+ ## Decision
12
+
13
+ API 使用 SQLite 作为一期账本存储,金额以整数分保存;数据库文件仅由 API 服务拥有,Web 不直连。
14
+
15
+ ## Consequences
16
+
17
+ 部署和备份简单,但多实例写入能力受限。若进入多人实时协作或水平扩容,必须另建 ADR,不把 SQLite 直接外推为长期通用方案。
18
+
19
+ ## Alternatives considered
20
+
21
+ PostgreSQL 能支持后续多实例,但一期运维成本与真实需求不匹配;浏览器本地存储无法满足服务端备份与 API 契约。
22
+
23
+ ## Related contracts / work packages / evidence
24
+
25
+ 一期记账主流程工作包;`contracts/PROTOCOL.md` 金额与账目字段;`pm/archive/一期/evidence/implementation.md`。
@@ -0,0 +1,7 @@
1
+ # 简账 ADR 索引
2
+
3
+ 只有长期、难回退的技术决定进入本目录。普通产品拍板、Gate 确认和短期可逆选择继续记录在 `pm/decisions.md`。
4
+
5
+ 当前 ADR:
6
+
7
+ - [ADR-0001:账本采用本地优先 SQLite](ADR-0001-local-first-sqlite.md)
@@ -0,0 +1,5 @@
1
+ # Gate1 证据(沙盘)
2
+
3
+ - 决策落点:`pm/decisions.md`
4
+ - 验收结果:一期规格、范围与非目标已确认。
5
+ - 边界:本文为虚构教学证据,不是真实项目或线上验收。
@@ -0,0 +1,5 @@
1
+ # Gate2 证据(沙盘)
2
+
3
+ - 决策落点:`pm/decisions.md`
4
+ - 走查结果:柱状图与移动端单列方案按真渲染原型收敛。
5
+ - 边界:沙盘不携带真实截图/原型,仅展示证据路径和可追溯格式。
@@ -0,0 +1,5 @@
1
+ # Gate3 证据(沙盘)
2
+
3
+ - 决策落点:`pm/decisions.md`
4
+ - 候选结论:review-ready 条件齐备,milestone 与 P1 closure 已收敛。
5
+ - 边界:本文不授权真实合并。
@@ -0,0 +1,5 @@
1
+ # Gate4 证据(沙盘)
2
+
3
+ - 决策落点:`pm/decisions.md`
4
+ - 收尾结果:沙盘表达一期上线、L4 复核与挂账移交的文件形态。
5
+ - 边界:这是虚构证据,不能外推为任何真实部署状态。
@@ -0,0 +1,5 @@
1
+ # 实现候选证据(沙盘)
2
+
3
+ - 范围:`jz-web` + `jz-api` + `contracts/PROTOCOL.md`。
4
+ - 自动化:示意 E2E 12 例通过;candidate hash 见各 AI 视角 status。
5
+ - 边界:example 中的 hash 为教学占位,不得引用为真实 L3 证据。
@@ -0,0 +1,20 @@
1
+ # decisions — 拍板台账(全工作区唯一决策单点)
2
+
3
+ > **规则(总线⑨)**:一个真实决策包收敛后,第一动作 = 在此追加一行(倒序),再回写受影响的 SSOT;「回写」列没销完 = 欠账可见。验收条目与部分回答不单独记拍板。
4
+ > v1.13 起新决策沿用看板收件箱包ID;历史行不追补编号。v1.14 起 reviewer 只在 review-ready 后启动。
5
+
6
+ | 日期 | 拍板人 | 决策包 | 回写(落点 → 状态) |
7
+ |---|---|---|---|
8
+ | 2026-08-25 | 你 | 【FLOW-BUILDBEAT-RENAME】协作骨架品牌从 Solobaton 迁移为 BuildBeat;历史升级记录不回改,后续只写 canonical 新名 | BUILDBEAT.md / README / 产品 status → ✅;旧名行保留为历史 |
9
+ | 2026-08-22 | 你 | 【FLOW-CLI-PREVIEW】升级 Solobaton v1.16:业务模板零替换;CLI v0 只读检查/规划,不允许写入、升级或卸载 | SOLOBATON.md / 产品 status → ✅;现有 Shell 护栏不变 |
10
+ | 2026-08-22 | 你 | 【FLOW-UPSTREAM-TESTS】升级 Solobaton v1.15:替换 3 个路径健壮性脚本;上游 README/CI/测试不拷入业务项目;流程语义不变 | SOLOBATON.md / 产品 status → ✅;历史决策与看板不回改 |
11
+ | 2026-08-22 | 你 | 【FLOW-REVIEW-READY】升级 Solobaton v1.14:候选满足 `HEAD=candidate`、干净、L3/渲染绿、无待修后才做一次 milestone;P0/P1 合并 closure;reviewer 静默返回 | AGENTS.md 规则⑥ / SOLOBATON.md / 一期-看板.md → ✅;历史报告不回改 |
12
+ | 2026-08-22 | 你 | 【FLOW-20260822】升级 Solobaton v1.13:会话按工作包持续推进;审批分 STOP_NOW/BATCH_AT_GATE/NO_APPROVAL;决策包收敛后只记一次 | AGENTS.md §2.5 / SOLOBATON.md / 一期-看板.md / status 口径 → ✅;历史部分记录不回改 |
13
+ | 2026-08-22 | 你 | 升级 Solobaton v1.12:机器闸常驻;高风险 delta 定向核;里程碑候选只全核一次;同一 hash 复用结论 | AGENTS.md 规则⑥ / SOLOBATON.md / 一期-看板.md 核查节奏 → ✅;历史报告不回改 |
14
+ | 2026-06-20 | 你 | 一期验收通过,批准上线(⛔Gate4);报表导出 CSV 挪二期 | 一期-看板.md ⑤ → ✅;看板挂账 #1 → ✅ |
15
+ | 2026-06-19 | 你 | ⛔Gate3 批准合并:月度报表(走查 P1「空月除零」已修复复验) | 一期-看板.md ⑤ 合并项 → ✅ |
16
+ | 2026-06-15 | 你 | ⛔Gate2 真渲染过:报表用柱状图不用折线;移动端两列改单列 | design brief → ✅;一期-看板.md ② → ✅ |
17
+ | 2026-06-13 | 你 | 【ADR-0001】一期账本采用本地优先 SQLite;多人实时协作或水平扩容时必须重开架构决策 | [ADR-0001](adr/ADR-0001-local-first-sqlite.md) / PROTOCOL.md / STACK.md → ✅ |
18
+ | 2026-06-12 | 你 | 月度报表**按自然月**汇总,不做滚动 30 天 | PROTOCOL.md §1 → ✅ |
19
+ | 2026-06-11 | 你 | ⛔Gate1 批准一期规格:记一笔 / 列表 / 月度报表;多币种不做 | 一期-看板.md → ✅ |
20
+ | 2026-06-10 | 你 | Bootstrap 结论:两仓(jz-web / jz-api),同一 Builder 端到端负责,按需调用三种 AI 视角,标准轨 | AGENTS.md §1 → ✅ |
@@ -0,0 +1,20 @@
1
+ # 状态 · 产品
2
+
3
+ > 只此域写,别人只读。倒序。hash 均为示意值(真项目必须可 `git cat-file` 核验)。
4
+
5
+ ## 当前基线
6
+
7
+ - 一期已收尾,待换期;二期候选:报表导出 CSV、SQLite 每日备份(看板挂账)
8
+ - 线上版本:查 bus-check(不写在这里)
9
+
10
+ ## 倒序日志
11
+
12
+ - **2026-08-25** 工作包:协作骨架品牌迁移为 BuildBeat,canonical marker/文档入口完成换名,历史 Solobaton 记录保留 · 证据:decisions.md FLOW-BUILDBEAT-RENAME · ✅
13
+ - **2026-08-22** 工作包:升级 Solobaton v1.16 CLI 生命周期预览 · candidate `meta e16c0de` · 证据:decisions.md FLOW-CLI-PREVIEW;模板零替换、写操作未开放 · ✅
14
+ - **2026-08-22** 工作包:升级 Solobaton v1.15 仓库测试与路径健壮性补丁 · candidate `meta d15c0de` · 证据:decisions.md FLOW-UPSTREAM-TESTS;业务流程语义不变 · ✅
15
+ - **2026-08-22** 工作包:升级 Solobaton v1.14 review-ready 与 reviewer 调用预算 · candidate `meta c14c0de` · 证据:decisions.md FLOW-REVIEW-READY + 一期-看板.md 核查口径 · ✅
16
+ - **2026-08-22** 工作包:升级 Solobaton v1.13 任务/审批节奏并同步看板、决策与状态口径 · candidate `meta b13c0de` · 证据:decisions.md v1.13 行 + 一期-看板.md 工作包快照/决策收件箱 · ✅
17
+ - **2026-08-22** 升级 Solobaton v1.12 核查节奏:高风险 delta 定向核 + 里程碑候选一次全核,历史不回改 · 证据:decisions.md 08-22 行 · ✅
18
+ - **2026-06-20** 一期收尾记账:Gate4 拍板落台账、挂账 3 条移交看板 · 证据:decisions.md 06-20 行 · ✅
19
+ - **2026-06-15** Gate2 组织真渲染走查,2 条修改意见拍板采纳 · 证据:decisions.md 06-15 行 · ✅
20
+ - **2026-06-11** 一期立项:规格三条,Gate1 已批;设计 brief 已交(要求单 HTML 可渲染) · 证据:一期-看板.md 阶段① · ✅
@@ -0,0 +1,15 @@
1
+ # 状态 · 全栈
2
+
3
+ > 只此域写,别人只读。倒序。hash 均为示意值(真项目必须可 `git cat-file` 核验)。
4
+
5
+ ## 当前基线
6
+
7
+ - 两仓:jz-web(React + Vite)/ jz-api(Node + SQLite);部署见 ARCHITECTURE.md §2
8
+ - 线上版本:查 bus-check(不写在这里)
9
+
10
+ ## 倒序日志
11
+
12
+ - **2026-06-20** 部署 v0.2.0(两仓)+ 更新两仓 CHANGELOG · commit `jz-api a3f21c9` / `jz-web 7be04d2` · 证据:bus-check 线上实况 v0.2.0 · ✅
13
+ - **2026-06-19** 修走查 P1:月报空月除零白屏 · commit `jz-web c91e77a` · 证据:`npx vitest run reports`(12/12)· ✅
14
+ - **2026-06-18** 月度报表 API + 前端页,**契约先行**改 PROTOCOL v0.2.0 再动代码(规则②)· commit `jz-api 5d8b310` / `jz-web 2fa9c44` · 证据:PROTOCOL §3 v0.2.0 行 + 两端测试 · ✅
15
+ - **2026-06-13** 记一笔 / 列表 两端点 + Bearer 鉴权(契约 v0.1.0) · commit `jz-api 9c07e12` / `jz-web e51ab08` · 证据:`curl` 实测 201/200 + 单测 · ✅
@@ -0,0 +1,15 @@
1
+ # 状态 · 测试
2
+
3
+ > 只此域写,别人只读。倒序。
4
+
5
+ ## 当前基线
6
+
7
+ - E2E:Playwright,12 例;证据产物:`pm/archive/一期/evidence/`(生成时即写归档位,换期零搬运;沙盘略)
8
+ - 契约核查:两端独立核(不信全栈自述,规则②)
9
+
10
+ ## 倒序日志
11
+
12
+ - **2026-06-19** 复验 P1 修复 + 全量回归:E2E 12/12 绿;一期候选 milestone 核查一次,P0/P1=0 · 证据:`npx playwright test` 报告 + 空月空态截图 · ✅
13
+ - **2026-06-19** 月报走查发现 **P1:空月份页面白屏**(分类占比除零),带图提 bug · 证据:实现⟷设计稿并排截图(规则⑧,沙盘略) · ✅
14
+ - **2026-06-18** 独立核契约两端:实测空月 `curl` 返回 200 空结构、读 Report 页无 404 分支,登记 PROTOCOL §3「独立核查」列 · ✅
15
+ - **2026-06-15** Gate2 前真渲染走查:提折线图改柱状、移动端两列改单列,均被拍板采纳 · 证据:decisions.md 06-15 行 · ✅
@@ -0,0 +1,97 @@
1
+ # 一期(记账主流程 + 月度报表) · 协调看板
2
+
3
+ > 谁做什么、什么顺序、卡点在哪。工作包完成口径 = **用户级结果 + commit hash + 可核验证据**(核查门);子任务完成不等于会话结束。
4
+ > 线上实况:`bash scripts/bus-check.sh`。拍板记 `decisions.md`。
5
+
6
+ ## 工作包快照(沙盘展示一期全程;live 看板只需保留在途 + 最近完成)
7
+
8
+ > 简账由同一 Builder 端到端拥有一期工作包;产品/全栈/测试是该 Builder 调用的 AI 专业视角,不是三个人类岗位接力。
9
+
10
+ ### WP-1 · Gate2 候选
11
+
12
+ - **objective**:把一期三条需求、契约和真渲染原型收敛到可拍板状态
13
+ - **AI视角**:产品 / 测试(设计稿由外部工具交付)
14
+ - **in_scope**:规格、契约、设计 brief、原型走查、Gate1/Gate2 决策包
15
+ - **terminal_condition**:Gate2 真渲染拍板完成并留证据;或出现范围冲突
16
+ - **状态**:✅完成(06-15)
17
+ - **证据**:`pm/archive/一期/evidence/gate2.md`
18
+
19
+ ### WP-2 · 实现候选
20
+
21
+ - **objective**:形成可测试的 jz-web + jz-api + 契约 v0.2.0 候选
22
+ - **AI视角**:全栈
23
+ - **in_scope**:一期三条需求实现、实现语义清单、受影响测试、两仓 CHANGELOG
24
+ - **terminal_condition**:候选 hash 集和机器证据齐备;或出现冻结契约 delta
25
+ - **状态**:✅完成(06-19)
26
+ - **证据**:`pm/archive/一期/evidence/implementation.md`
27
+
28
+ ### WP-3 · Gate3 候选
29
+
30
+ - **objective**:把实现候选验证到可合并状态
31
+ - **AI视角**:测试 / 产品
32
+ - **in_scope**:E2E 12 例、带图走查、review-ready 自检、一次 milestone reviewer、P0/P1 合并 closure
33
+ - **terminal_condition**:两仓 `HEAD=candidate`、工作树干净、L3/渲染证据绿且无待修后一次核查,P0/P1 清零再提交 Gate3;或发现需修改冻结语义的真实阻塞
34
+ - **状态**:✅完成(06-19)
35
+ - **证据**:`pm/archive/一期/evidence/gate3.md`
36
+
37
+ ### WP-4 · 上线收尾
38
+
39
+ - **objective**:完成受控上线、L4 复核与一期记账
40
+ - **AI视角**:全栈 / 测试 / 产品
41
+ - **in_scope**:Gate3 合并、部署、Gate4 上线、线上复核、挂账移交
42
+ - **terminal_condition**:Gate4 后 L4 证据与状态/看板收尾完成;或部署前真实阻塞
43
+ - **状态**:✅完成(06-20)
44
+ - **证据**:`pm/archive/一期/evidence/gate4.md`
45
+
46
+ > 每个工作包都覆盖多个需求 ID、文档、commit 或 reviewer 事件;子项完成只报中间进展,到用户级结果/Gate 候选才交接,没有让人反复说“继续”。
47
+
48
+ ## 决策收件箱
49
+
50
+ | 包ID | 变量ID | 真实取舍 | 推荐值 + 理由 | 另一选择的后果 | 截止 Gate | 状态 |
51
+ |---|---|---|---|---|---|---|
52
+ | WP1-G1 | D1 | 月度统计周期 | 自然月,与账期一致 | 滚动 30 天更实时但难对账 | Gate1 | ✅ 06-12 已收敛 |
53
+ | WP1-G2 | D1 | 报表图形 | 柱状图,真渲染下类别对比更清楚 | 折线更适合连续趋势,不适合本页类别比较 | Gate2 | ✅ 06-15 同包收敛 |
54
+ | WP1-G2 | D2 | 移动端布局 | 单列,小屏信息不拥挤 | 双列信息密度高但卡片过窄 | Gate2 | ✅ 06-15 同包收敛 |
55
+
56
+ > 验收清单的其余条目均由上述选择与契约推导,没有逐项要求人批。收敛结论只在 `decisions.md` 各记一次。
57
+
58
+ ## 阶段门
59
+
60
+ - Gate1: passed | 决策: `pm/decisions.md:19` | 证据: `pm/archive/一期/evidence/gate1.md`
61
+ - Gate2: passed | 决策: `pm/decisions.md:16` | 证据: `pm/archive/一期/evidence/gate2.md`
62
+ - Gate3: passed | 决策: `pm/decisions.md:15` | 证据: `pm/archive/一期/evidence/gate3.md`
63
+ - Gate4: passed | 决策: `pm/decisions.md:14` | 证据: `pm/archive/一期/evidence/gate4.md`
64
+
65
+ > 四行机器令牌是 Gate 状态权威;下表是给人的阶段摘要。
66
+
67
+ | 阶段 | 产出 | 负责 | 状态 |
68
+ |---|---|---|---|
69
+ | ① 需求(⛔Gate1 人批) | 一期规格:记一笔 / 列表 / 月度报表;多币种不做 | 产品 | ✅ 06-11 |
70
+ | ② 设计(⛔Gate2 人对**真渲染原型**批) | `design/design_1期/`(沙盘略) | 外部设计工具 | ✅ 06-15(改 2 处:柱状图、移动端单列) |
71
+ | ③ 实现 | jz-web + jz-api + 契约 v0.2.0 + 实现语义清单;机器闸每提交 | 全栈 | ✅ 06-19 |
72
+ | ④ 验证 + 核查门 | review-ready 候选 hash 集 + E2E 12 例 + 带图走查 + milestone 一次 + P1 合并 closure 一次 | 测试 + 产品 | ✅ 06-19(P1 空月除零已修复复验) |
73
+ | ⑤ 上线(⛔Gate3 合并 / ⛔Gate4 上线,人批) | 部署 + 两仓 CHANGELOG | 全栈 | ✅ 06-20 |
74
+
75
+ ## 能力视角表(需求 → 调用哪些 AI 视角)
76
+
77
+ | 需求 | 全栈 | 测试 | 备注 |
78
+ |---|---|---|---|
79
+ | 记一笔 + 列表 | ★ | E2E+走查 | 契约 v0.1.0 |
80
+ | 月度报表 | ★ | E2E+走查 | 按自然月(拍板 06-12) |
81
+
82
+ ## 🔴 关键对齐点(开工先定,别各做各的)
83
+
84
+ 1. 金额单位 = 分(整数)→ `contracts/PROTOCOL.md` §2
85
+ 2. 空月份返回空结构不 404 → PROTOCOL §1
86
+
87
+ ## 挂账(实时;工作包认领后各 AI 视角写回自己的 status,此处只改 ☐/✅)
88
+
89
+ | # | 项 | 域 | 状态 | 依据/出处 |
90
+ |---|---|---|---|---|
91
+ | 1 | 报表导出 CSV → 移交二期 | 产品 | ✅(已入二期候选) | 拍板 06-20 |
92
+ | 2 | SQLite 每日备份 | 全栈 | ☐ | ARCHITECTURE.md §2 |
93
+ | 3 | 上线 7 天数据回看 | 产品 | ☐ | BuildBeat lessons 第 8 条 |
94
+
95
+ ## 验收口径
96
+
97
+ 对照一期规格三条 + 设计稿逐屏;两仓 `HEAD=candidate` 且干净;E2E 全绿;无已知待修后 milestone reviewer 无 P0/P1;真渲染走查含移动端与空月空态。同一候选 hash 在 Gate3 前复用该结论;reviewer 返回前 hash 变化则旧审查 `SUPERSEDED`,重新 review-ready 后再核。
@@ -0,0 +1,18 @@
1
+ # CODE.md — 简账代码与安全规范
2
+
3
+ > **Optional**: 本文件由项目拥有;缺失时 BuildBeat 直接跳过,不作为告警或错误。
4
+ > **AI write boundary**: 默认只读;普通需求、修构建或装依赖不得顺手改规范。
5
+ > **Status**: Confirmed
6
+
7
+ ## Rules
8
+
9
+ - `CODE-MUST-001`: Secret、真实账本、身份数据和生产配置值不得进入 Git、日志、测试夹具或证据。
10
+ - `CODE-MUST-002`: API 输入先做 schema 校验;账目写入失败必须回滚,不返回伪成功。
11
+ - `CODE-MUST-003`: 前后端共享字段变化先同步 `contracts/PROTOCOL.md`,再分别实现。
12
+ - `CODE-MUST-004`: 新依赖必须提交 lockfile,并通过许可证与安全检查。
13
+ - `CODE-SHOULD-001`: 金额在 API 与存储层使用整数分,界面边界才格式化为元。
14
+ - `CODE-MAY-001`: 局部重构可随工作包完成,但不得趁机更换框架或持久化方案。
15
+
16
+ ## 项目禁止事项
17
+
18
+ 不得用浮点数持久化金额;不得在前端日志输出完整账目内容。
@@ -0,0 +1,34 @@
1
+ # DESIGN.md — 简账 UI / 视觉 / 交互规范
2
+
3
+ > **Optional**: 仅有 UI、视觉或交互交付的项目按需创建;缺失时 BuildBeat 直接跳过,不作为告警或错误。
4
+ > **AI write boundary**: 默认只读;普通页面实现不得顺手重写设计系统。
5
+ > **Status**: Confirmed
6
+
7
+ ## Principles
8
+
9
+ 清晰、克制、账目优先;不用装饰性渐变掩盖信息层级。
10
+
11
+ ## Tokens
12
+
13
+ 字体、颜色、间距与圆角统一来自 jz-web 的 CSS variables;页面不得自建平行 token。
14
+
15
+ ## Components
16
+
17
+ 金额输入、账目行、月份选择器和空态组件优先复用;差异通过 props 或明确变体表达。
18
+
19
+ ## Interaction Patterns
20
+
21
+ - `DESIGN-MUST-001`: 新增账目在 100ms 内给出按压或 loading 反馈,保存结果提供可访问确认。
22
+ - `DESIGN-MUST-002`: 上线界面不得出现调试信息、实现说明、mock 标记或开发者元注释。
23
+
24
+ ## States
25
+
26
+ - `DESIGN-MUST-003`: 账目列表和报表必须覆盖 loading、empty、error、disabled 与移动端状态。
27
+
28
+ ## Accessibility
29
+
30
+ - `DESIGN-MUST-004`: 表单标签、键盘路径、焦点、图表替代文本和颜色对比进入真渲染走查。
31
+
32
+ ## Project-specific exceptions
33
+
34
+ 月度报表移动端使用单列柱状图;不复用桌面双列布局。
@@ -0,0 +1,16 @@
1
+ # REVIEW.md — 简账 Review 规范
2
+
3
+ > **Optional**: 本文件由项目拥有;缺失时 BuildBeat 直接跳过,不作为告警或错误。
4
+ > **AI write boundary**: 默认只读;只在项目 Review 口径被明确改变时修改。
5
+ > **Status**: Confirmed
6
+
7
+ ## Rules
8
+
9
+ - `REVIEW-MUST-001`: 逐项核对一期范围、非目标、错误态与金额口径,不以测试绿替代需求覆盖。
10
+ - `REVIEW-MUST-002`: 核对跨仓契约、SQLite migration 与向后兼容边界。
11
+ - `REVIEW-MUST-003`: 核对单元、API 集成、主流程 E2E、真渲染和 evidence 路径。
12
+ - `REVIEW-MUST-004`: 核对输入校验、日志脱敏、账目持久化和回滚风险。
13
+ - `REVIEW-SHOULD-001`: 拒绝无需求支撑的抽象、依赖或复杂状态层。
14
+ - `REVIEW-SHOULD-002`: 确认看板、status、decisions 与同一候选一致。
15
+
16
+ review-ready 与 reviewer 调用节奏仍以 `AGENTS.md` 为准。
@@ -0,0 +1,31 @@
1
+ # STACK.md — 简账技术栈约束
2
+
3
+ > **Optional**: 本文件由项目拥有;缺失时 BuildBeat 直接跳过,不作为告警或错误。
4
+ > **AI write boundary**: 默认只读;用户确认或明确要求技术栈变化后才可修改。
5
+ > **Status**: Confirmed
6
+
7
+ ## 声明
8
+
9
+ | 维度 | 项目约束 | 事实来源 |
10
+ |---|---|---|
11
+ | Runtime | Node.js 22 LTS | 两仓 package engines 与 CI |
12
+ | 包管理器 | npm;各仓提交 package-lock.json | 两仓 lockfile |
13
+ | 语言与框架 | React + TypeScript;Node.js API | 两仓 package.json 与源码入口 |
14
+ | 数据设施 | SQLite 单机账本 | API schema 与 migration |
15
+ | 部署 | Web/API 两个独立 PaaS 服务 | 部署配置与 `ARCHITECTURE.md` |
16
+ | CI 与测试 | 单元、API 集成、主流程 E2E | 两仓 CI 与 verify-status suites |
17
+ | 供应链 | MIT;依赖必须锁定并过安全检查 | LICENSE、lockfile、CI |
18
+
19
+ ## 可核对基线(bus-check v1)
20
+
21
+ <!-- buildbeat-stack-baseline:v1
22
+ nodeConstraint=22
23
+ lockfileKind=package-lock.json
24
+ dockerFromImage=n/a
25
+ -->
26
+
27
+ ## Rules
28
+
29
+ - `STACK-MUST-001`: 声明与 package、lockfile、容器或部署配置冲突时只报告漂移,不自动选择一方。
30
+ - `STACK-MUST-002`: 更换 Node、React、SQLite、包管理器或部署平台前必须建立 ADR,并同步 `contracts/PROTOCOL.md`。
31
+ - `STACK-SHOULD-001`: 版本结论必须能回到仓库配置或运行平台证据。