@haiyangbg/buildbeat 2.0.2 → 3.0.1

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 (113) hide show
  1. package/CHANGELOG.md +25 -301
  2. package/README.en.md +9 -22
  3. package/README.md +6 -19
  4. package/SKILL.md +169 -220
  5. package/bin/buildbeat.js +14 -2
  6. package/docs/CAPABILITY-MATRIX.md +13 -55
  7. package/docs/README.md +13 -14
  8. package/docs/RELEASING.md +10 -9
  9. package/docs/v2/RFC-0001-product-definition.md +2 -0
  10. package/docs/v2/RFC-0003-workflow-policy.md +2 -0
  11. package/docs/v2/guide/00-how-to-talk.md +3 -3
  12. package/docs/v2/guide/01-quickstart.en.md +163 -0
  13. package/docs/v2/guide/01-quickstart.md +15 -13
  14. package/docs/v2/guide/03-policy-guide.md +1 -1
  15. package/docs/v2/guide/06-evidence-guide.en.md +51 -0
  16. package/docs/v2/guide/06-evidence-guide.md +5 -3
  17. package/docs/v2/guide/07-approval-guide.en.md +115 -0
  18. package/docs/v2/guide/07-approval-guide.md +12 -10
  19. package/docs/v2/guide/10-recovery.en.md +83 -0
  20. package/docs/v2/guide/10-recovery.md +8 -6
  21. package/docs/v2/guide/11-session-handoff.en.md +2 -2
  22. package/docs/v2/guide/11-session-handoff.md +2 -2
  23. package/docs/v2/guide/README.md +4 -10
  24. package/example/.buildbeat/notify.yaml +13 -0
  25. package/example/.buildbeat/observe.yaml +31 -0
  26. package/example/AGENTS.md +67 -13
  27. package/example/BUILDBEAT.md +8 -11
  28. package/example/CLAUDE.md +1 -1
  29. package/example/README.md +17 -67
  30. package/example/delivery/envelope/prompts/builder.md +10 -0
  31. package/example/delivery/envelope/prompts/fixer.md +10 -0
  32. package/example/delivery/envelope/prompts/reviewer.md +13 -0
  33. package/example/delivery/envelope/worker.sh +70 -0
  34. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/decisions.jsonl +3 -0
  35. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/intent.md +24 -0
  36. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/plan.md +20 -0
  37. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/run-config.yaml +66 -0
  38. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/runs/RUN-EXPORT-01/run-record.json +108 -0
  39. package/example/delivery/work/WORK-EXPORT-DATE-FILTER/workflow.yaml +44 -0
  40. package/example/gitignore.template +20 -0
  41. package/example/package.json +13 -0
  42. package/example/pm/decisions.md +3 -15
  43. package/example/src/export.js +25 -0
  44. package/example/src/ledger.js +16 -0
  45. package/example/tests/export.test.js +35 -0
  46. package/example//346/214/207/346/214/245/345/217/260.md +40 -0
  47. package/lessons.md +52 -71
  48. package/package.json +3 -7
  49. package/src/v2/cli/run.js +33 -23
  50. package/src/v2/engine/risk-preset.js +1 -1
  51. package/src/v2/runtime/notify.js +5 -5
  52. package/src/v2/runtime/overview.js +7 -7
  53. package/templates/ARCHITECTURE.md +1 -1
  54. package/templates/contracts/PROTOCOL.md +2 -10
  55. package/templates/gitignore.template +0 -3
  56. package/templates/pm/adr/README.md +1 -1
  57. package/templates/pm/decisions.md +4 -5
  58. package/templates/standards/CODE.md +1 -1
  59. package/templates/standards/DESIGN.md +1 -1
  60. package/templates/standards/REVIEW.md +2 -2
  61. package/templates/standards/STACK.md +2 -8
  62. package/templates/v2/AGENTS.md +18 -18
  63. package/templates/v2/BUILDBEAT.md +2 -3
  64. package/templates/v2/CLAUDE.md +1 -1
  65. package/templates/v2/run-config.example.yaml +1 -1
  66. package/templates/v2//346/214/207/346/214/245/345/217/260.md +6 -6
  67. package/bin/buildbeat-v2.js +0 -18
  68. package/bin/solobaton.js +0 -6
  69. package/docs/CHECKS.md +0 -326
  70. package/docs/CLI.md +0 -245
  71. package/docs/LEGACY-V1.16-MIGRATION.md +0 -54
  72. package/docs/v2/guide/08-migration-v1.md +0 -72
  73. package/example/.buildbeat/manifest.json +0 -45
  74. package/example/ARCHITECTURE.md +0 -39
  75. package/example/contracts/PROTOCOL.md +0 -38
  76. package/example/pm/NOW.md +0 -22
  77. package/example/pm/adr/ADR-0001-local-first-sqlite.md +0 -25
  78. package/example/pm/adr/README.md +0 -7
  79. package/example/pm/archive//344/270/200/346/234/237/evidence/gate1.md +0 -5
  80. package/example/pm/archive//344/270/200/346/234/237/evidence/gate2.md +0 -5
  81. package/example/pm/archive//344/270/200/346/234/237/evidence/gate3.md +0 -5
  82. package/example/pm/archive//344/270/200/346/234/237/evidence/gate4.md +0 -5
  83. package/example/pm/archive//344/270/200/346/234/237/evidence/implementation.md +0 -5
  84. package/example/pm/status//344/272/247/345/223/201.md +0 -20
  85. package/example/pm/status//345/205/250/346/240/210.md +0 -15
  86. package/example/pm/status//346/265/213/350/257/225.md +0 -15
  87. package/example/pm//344/270/200/346/234/237-/347/234/213/346/235/277.md +0 -97
  88. package/example/standards/CODE.md +0 -18
  89. package/example/standards/DESIGN.md +0 -34
  90. package/example/standards/REVIEW.md +0 -16
  91. package/example/standards/STACK.md +0 -31
  92. package/src/cli.js +0 -323
  93. package/src/constants.js +0 -202
  94. package/src/doctor.js +0 -267
  95. package/src/planner.js +0 -251
  96. package/src/project.js +0 -844
  97. package/src/upgrader.js +0 -1249
  98. package/src/v2/presets/risk/legacy-four-gates.yaml +0 -44
  99. package/src/writer.js +0 -534
  100. package/templates/.claude/agents/reviewer.md +0 -62
  101. package/templates/AGENTS.md +0 -85
  102. package/templates/BUILDBEAT.md +0 -13
  103. package/templates/CLAUDE.md +0 -7
  104. package/templates/pm/NOW.md +0 -26
  105. package/templates/pm/changes/README.md +0 -44
  106. package/templates/pm/status/README.md +0 -32
  107. package/templates/pm//345/275/223/346/234/237/347/234/213/346/235/277.md +0 -62
  108. package/templates/scripts/bus-check.sh +0 -1875
  109. package/templates/scripts/design-preview.sh +0 -44
  110. package/templates/scripts/drift-check.sh +0 -112
  111. package/templates/scripts/pre-commit.sh +0 -74
  112. package/templates/scripts/verify-status.sh +0 -105
  113. package/templates//346/214/207/346/214/245/345/217/260.md +0 -58
@@ -1,54 +0,0 @@
1
- # v1.16 legacy 拷出项目迁移指南
2
-
3
- > 适用于已把 BuildBeat/Solobaton v1.16 模板拷进业务仓、但没有真实 schema 2 `.buildbeat/manifest.json` 基线的项目。本页是迁移手册,不是执行授权。
4
-
5
- ## 先判定你在哪条路
6
-
7
- | 现状 | 路径 | 结果 |
8
- |---|---|---|
9
- | 只有 `SOLOBATON.md` / `BUILDBEAT.md`,无真实 schema 2 manifest | **A. 继续 legacy 手工维护(默认推荐)** | 不改变所有权;以后继续按 CHANGELOG 手工合并 |
10
- | 已确认要让后续版本进入机械 `upgrade` | **B. 受控重建 schema 2 基线** | 专用 Git 分支上重走 `adopt`,审查后才合并 |
11
- | 已有 CLI 真实写入的有效 schema 2 manifest | 不属本页 | 待有更新且已验证的 bundle 时才可按 [`CLI.md`](CLI.md) 运行 `upgrade` |
12
-
13
- 已发布的 `solobaton@1.16.3` v0 仍只读。scoped BuildBeat `1.20.0` 已完成“真实旧 schema 2 版本 → 新 bundle”的独立项目试点,见 [`PHASE4-V1.20-PILOT-2026-08-25.md`](PHASE4-V1.20-PILOT-2026-08-25.md);但该试点不把没有真实 manifest 的 v1.16 legacy 项目自动变成可升级项目,registry artifact 也仍须独立回读。
14
-
15
- ## 红线:不猜历史所有权
16
-
17
- - 不得把 `.solobaton/manifest.json` 直接改名为 `.buildbeat/manifest.json`;历史 schema/namespace 不会因改名变成新基线。
18
- - 不得手写 manifest、复制 `example/.buildbeat/manifest.json`,或把当前已改过的文件 hash 当成“安装时 baseline”。
19
- - 不得同时保留 BuildBeat 与 Solobaton 两份 marker/manifest;混合安装必须 fail-closed。
20
- - 不把 `doctor`、绿测试、manifest 或 `bus-check --strict` 单独当成人工 Gate、部署或线上健康证据。
21
-
22
- ## A. 继续 legacy 手工维护
23
-
24
- 1. 保留现有 marker 与项目文件,不生成 manifest。
25
- 2. 从已安装版本往后逐版阅读 `CHANGELOG.md` 的“拷出项目升级”,按下表处理。
26
- 3. 更改前保留 clean Git checkpoint;更改后运行项目自身测试、`bus-check --format=json --strict` 与人工 Gate。
27
- 4. 将“无 manifest,后续机械 upgrade 不可用”作为明示边界,而不是待修的假阻塞。
28
-
29
- | 类别 | legacy 迁移动作 |
30
- |---|---|
31
- | `replace-if-unmodified` | 只有确认项目从未修改时才可整文件替换;无法证明就停下做语义合并 |
32
- | `project-owned` | 只人工合并必要的新字段/规则;不覆盖项目事实、契约、看板、决策、status 和已配置验证命令 |
33
- | `merge-only` | 只审查并维护 `.gitignore` 中唯一明确标记的片段;不覆盖 host 文件 |
34
- | optional standards / ADR | 未启用保持缺失;启用时只复制选中模板并填项目事实,已有同名文件不覆盖 |
35
- | Hook | 始终在 manifest 之外;检查并保留既有 Hook 链后手工安装 |
36
-
37
- ## B. 受控重建 schema 2 基线
38
-
39
- 只在项目所有者明确批准“重建基线”后执行;这不是 `upgrade` 的自动降级路径。
40
-
41
- 1. 确认目标仓已有可回退的 clean commit,新建专用迁移分支;记录旧 marker、布局、协调文件、脚本改写、`.gitignore` 片段、Hook 链和未验证范围。
42
- 2. 将旧协调层的规划目标路径从原位移出,保留在 Git 历史或明确备份位置。`.gitignore` 只在 marker 唯一且边界可确认时移除旧的 BuildBeat/Solobaton 片段,逐字节保留片段外内容;marker 重复/不完整就停下人工核对。把这些变更形成一个单独可审查、worktree clean 的 checkpoint;不删业务代码,不清空未知目录。
43
- 3. 仅从已锁定的 BuildBeat checkout 运行 `node <verified-buildbeat-checkout>/bin/buildbeat.js adopt <project-root> --dry-run --json`;若 scoped registry artifact 已独立回读,也可锁定 `@haiyangbg/buildbeat` 的精确版本。复核 layout、全部 collision/blocker、Git 状态、`.gitignore` 与 `pendingPlaceholders`。不将 `npx solobaton@latest` 当成可写命令。
44
- 4. 同一屏计划获明确确认且 dry-run 无 blocker 后,才在该分支执行交互 apply;非交互 `--yes` 只能复用这次确认。CLI 最后写入 schema 2 manifest,不安装 Hook,不跨 Gate。
45
- 5. 从迁移前 checkpoint 人工回灌项目事实、契约、决策、status、已配置测试和必要的自定义脚本。被项目改写的 `replace-if-unmodified` 文件以后可能进入冲突报告,这是正常的所有权保护。
46
- 6. 可选 standards/ADR 按需手工恢复;填完 `pendingPlaceholders`,配置真实 `verify-status.sh` 与保留既有链的 pre-commit Hook。
47
- 7. 运行项目自身验证、`buildbeat doctor`、`bus-check --format=json --strict`、manifest/hash 回读和 Git diff 审查。`coverage.complete=false` 时保留未验证边界,不得报“全绿”。
48
- 8. 只在同一候选、人工 Gate 和回退方案都齐备后合并迁移分支。本流程不授权部署、push、tag、GitHub Release、npm publish 或远端改名。
49
-
50
- ## 回退与完成口径
51
-
52
- - 回退优先放弃未合并的迁移分支,或用新的 revert 提交撤销已合并变更;不用破坏性 reset 覆盖其他人工作。
53
- - “建立 schema 2 基线”只表示生命周期所有权可被机械读取。它不证明业务正确、L3/L4 足够、Gate 已批、已部署或线上正常。
54
- - 后续只有在“真实 schema 2 基线 + 更新且已验证的 bundle + clean Git”同时成立时,才进入机械 `upgrade`;跨 major 仍需额外显式确认。
@@ -1,72 +0,0 @@
1
- # v1 → v2 迁移指南(手工 runbook)
2
-
3
- 按收尾修正三:装机量 N=1,**不做 importer 工具**,人工走完。各步括号里的耗时是作者一次迁移的估算,不是承诺。
4
-
5
- 先分清两件事:**升级 CLI** 与 **迁移项目状态**。`npm install --global @haiyangbg/buildbeat@latest` 只是前者——它把 `buildbeat-v2` 装到机器上,对项目文件零改动;v1 的 `buildbeat doctor / init / adopt / upgrade` 原样保留,schema 仍是 2,`buildbeat upgrade` 对 1.21 骨架报 up-to-date。后者才是本文:把"哪些工作在途"从 v1 看板搬进 `delivery/work/`,并冻结旧入口。三条铁律全程有效:
6
-
7
- 1. **不猜旧状态有效性**——v1 看板/状态文件里没有证据支撑的行,一律当"待人工确认",不自动翻译成 v2 状态;
8
- 2. **单向迁移**——v1 只冻结不删除,历史归档可查;
9
- 3. **禁止双写**——切换日之后新工作只进 v2,任何"两边都记一下"都是回退。
10
-
11
- ## 前提(约 30 分钟)
12
-
13
- - [ ] 安装稳定版(`npm install --global @haiyangbg/buildbeat@latest`,2.0.0 起 `latest` 即 v2;`buildbeat-v2` 无参运行能打印用法);
14
- - [ ] 读完 [快速开始](01-quickstart.md) 与 [Approval 指南](07-approval-guide.md);
15
- - [ ] 目标仓库工作树干净、基线已提交。
16
-
17
- ## 第 1 步:只读分析 v1(约 1 小时)
18
-
19
- 盘点现有 v1 资产,只读不改:
20
-
21
- - 看板/状态文件(`pm/status/*.md` 或等价物):列出**声称在途**的工作项;
22
- - 提案与决策台账(`pm/changes/`、`pm/decisions.md`):找出已批准未完成的事项;
23
- - 契约(`contracts/*.md`)与探测器(`drift-check.sh` / `live-status.sh`):记录现状与调用方式。
24
-
25
- 产出一张三栏清单:`确认在途 / 疑似过期 / 已完成未归档`。判断依据只认证据(提交、部署记录、生产事实),不认状态文件自述。
26
-
27
- ## 第 2 步:生成 v2 Work 草稿(约 1 小时)
28
-
29
- 只为"确认在途"的事项建 v2 工作项:
30
-
31
- ```bash
32
- mkdir -p delivery/work/WORK-<名字>
33
- # intent.md:这件事为什么存在(从 v1 提案摘录+核对)
34
- # plan.md:接下来真实要做的步骤(不是 v1 计划的搬运——过期部分当场砍掉)
35
- ```
36
-
37
- "疑似过期"的行**不迁移**,在清单上标注理由留档;"已完成未归档"的补归档到 v1 历史区。
38
-
39
- ## 第 3 步:人工确认当前活动 Work(约 30 分钟)
40
-
41
- 项目所有者逐项过草稿清单,拍板哪些 Work 开(accept intent/plan 即 digest 绑定确认)。没被拍板的草稿删掉或留在未接受状态——**未接受的草稿不产生任何义务**。
42
-
43
- ## 第 4 步:冻结旧看板(约 15 分钟)
44
-
45
- 在 v1 看板/状态文件顶部加冻结声明(日期 + "新工作见 delivery/,本文件停止更新"),提交。不删除、不再写入。
46
-
47
- ## 第 5 步:探测器重挂到 observe(约 30 分钟,可选先行)
48
-
49
- 把 drift-check/live-status 挂为 observe Provider([Evidence 指南 §observe](06-evidence-guide.md)):
50
-
51
- ```bash
52
- cp <buildbeat>/src/v2/presets/observe.yaml .buildbeat/observe.yaml # 改 command/subject
53
- buildbeat-v2 observe run --config .buildbeat/observe.yaml # 跑一个周期验证
54
- ```
55
-
56
- v1 脚本本体不用改——它们的权威边界(各查什么、不证什么)原样保留。
57
-
58
- ## 第 6 步:真实 Run 验收(约 1 小时)
59
-
60
- 选一个已确认的 Work,用 v2 跑完一个真实 Run 到 `WAITING_HUMAN` 并完成决定。**这个 Run 成功之前不算切换完成**——期间发现的问题修完再宣布切换。
61
-
62
- 人批习惯迁移:v1 四 Gate 用户可先用 `riskPreset: legacy-four-gates`(四 Gate 完整形态),跑顺后再降到 `standard`。
63
-
64
- ## 完成定义
65
-
66
- - 冻结声明已提交;所有新工作走 `delivery/` + v2 Runner;
67
- - 至少一个真实 Run 走完 Build→Verify→Review→人批闭环;
68
- - 三栏清单与拍板结果留档(就是迁移的证据)。
69
-
70
- 迁移前后可核对的目录:迁移前 `pm/NOW.md`、`pm/status/*`、`pm/changes/*` 可写;迁移后它们只读并带冻结声明,`delivery/work/<ID>/` 每个在途事项一个目录,`buildbeat-v2 overview --repo .` 能列出全部活动 Work 且没有重复。旧文件不删,任何时候可读;不要为旧 Run 伪造 run-record 或 manifest。
71
-
72
- 回退:v1 全部原样在 Git 里,去掉冻结声明即可回去——但双写永远禁止,回去就是整个回去。已经跑出的 v2 Run 台账保留在 `delivery/work/*/runs/`,回退不需要删它。
@@ -1,45 +0,0 @@
1
- {
2
- "schemaVersion": 2,
3
- "scaffoldVersion": "v1.21",
4
- "cliVersion": "2.0.2",
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": "d411b53917a12e9d53f2b02e8a16292a90570d743943b183316ab0b4c69b254f"
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
- }
@@ -1,39 +0,0 @@
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`。)
@@ -1,38 +0,0 @@
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 只读核两端代码,字段名/类型/错误码一致 |
package/example/pm/NOW.md DELETED
@@ -1,22 +0,0 @@
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 一致,沙盘从略;二期立项时逐条执行。
@@ -1,25 +0,0 @@
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`。
@@ -1,7 +0,0 @@
1
- # 简账 ADR 索引
2
-
3
- 只有长期、难回退的技术决定进入本目录。普通产品拍板、Gate 确认和短期可逆选择继续记录在 `pm/decisions.md`。
4
-
5
- 当前 ADR:
6
-
7
- - [ADR-0001:账本采用本地优先 SQLite](ADR-0001-local-first-sqlite.md)
@@ -1,5 +0,0 @@
1
- # Gate1 证据(沙盘)
2
-
3
- - 决策落点:`pm/decisions.md`
4
- - 验收结果:一期规格、范围与非目标已确认。
5
- - 边界:本文为虚构教学证据,不是真实项目或线上验收。
@@ -1,5 +0,0 @@
1
- # Gate2 证据(沙盘)
2
-
3
- - 决策落点:`pm/decisions.md`
4
- - 走查结果:柱状图与移动端单列方案按真渲染原型收敛。
5
- - 边界:沙盘不携带真实截图/原型,仅展示证据路径和可追溯格式。
@@ -1,5 +0,0 @@
1
- # Gate3 证据(沙盘)
2
-
3
- - 决策落点:`pm/decisions.md`
4
- - 候选结论:review-ready 条件齐备,milestone 与 P1 closure 已收敛。
5
- - 边界:本文不授权真实合并。
@@ -1,5 +0,0 @@
1
- # Gate4 证据(沙盘)
2
-
3
- - 决策落点:`pm/decisions.md`
4
- - 收尾结果:沙盘表达一期上线、L4 复核与挂账移交的文件形态。
5
- - 边界:这是虚构证据,不能外推为任何真实部署状态。
@@ -1,5 +0,0 @@
1
- # 实现候选证据(沙盘)
2
-
3
- - 范围:`jz-web` + `jz-api` + `contracts/PROTOCOL.md`。
4
- - 自动化:示意 E2E 12 例通过;candidate hash 见各 AI 视角 status。
5
- - 边界:example 中的 hash 为教学占位,不得引用为真实 L3 证据。
@@ -1,20 +0,0 @@
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 阶段① · ✅
@@ -1,15 +0,0 @@
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 + 单测 · ✅
@@ -1,15 +0,0 @@
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 行 · ✅
@@ -1,97 +0,0 @@
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 后再核。
@@ -1,18 +0,0 @@
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
- 不得用浮点数持久化金额;不得在前端日志输出完整账目内容。
@@ -1,34 +0,0 @@
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
- 月度报表移动端使用单列柱状图;不复用桌面双列布局。
@@ -1,16 +0,0 @@
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` 为准。
@@ -1,31 +0,0 @@
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`: 版本结论必须能回到仓库配置或运行平台证据。