diff --git a/.task/delivery-mechanism.md b/.task/archive/delivery-mechanism.md similarity index 80% rename from .task/delivery-mechanism.md rename to .task/archive/delivery-mechanism.md index ee0186a5..bfdee679 100644 --- a/.task/delivery-mechanism.md +++ b/.task/archive/delivery-mechanism.md @@ -1,6 +1,6 @@ # feature/delivery-mechanism 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #1 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/1(merge ef89fc8281);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -34,3 +34,9 @@ | 同步前验收 | a58f85e0d0ade6e8b4da3afe9985985a38bae47a | 3e1cdbda1e7c7f218743132908dfdd2b39c71afc | 2026-09-30T04:44:49Z | | 同步前验收 | f20c634fea9e4316db664b4da7b4a6c772dd855e | 15f0da63742d68036accdf9a6a5fffd445eb63a3 | 2026-09-30T05:56:09Z | | 同步前验收 | 69e9471dafd275f98928ff005732b94c4b18b638 | 24b45a26672015c84e6754f900ba2a6a3ede6f2c | 2026-09-30T06:30:25Z | + +## 闭合记录(card-autoclose 回填) + +- 依据:merge ef89fc8281761eb64413ad5fd9be68a0bd08755e(PR #1)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Add the task-startup gate: precheck/task-start/task-sync/task-finish and local hooks' (#1) from feature/delivery-mechanism into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-adopt-draft9.md b/.task/archive/feature-adopt-draft9.md similarity index 55% rename from .task/feature-adopt-draft9.md rename to .task/archive/feature-adopt-draft9.md index 5c6044d1..f8534dd3 100644 --- a/.task/feature-adopt-draft9.md +++ b/.task/archive/feature-adopt-draft9.md @@ -1,6 +1,6 @@ # feature/adopt-draft9 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #10 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/10(merge 05a5ae1e1a);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | e85d1ee49f5fb6659d83a3ed3c17ba42a93d5926 | e85d1ee49f5fb6659d83a3ed3c17ba42a93d5926 | 2026-09-30T03:56:09Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 05a5ae1e1ac8ef8d341170c236e9b38570e48947(PR #10)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Adopt the draft.9 hierarchy and memory rules; pin the records archive' (#10) from feature/adopt-draft9 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-core-cards-commands-r1.md b/.task/archive/feature-core-cards-commands-r1.md similarity index 72% rename from .task/feature-core-cards-commands-r1.md rename to .task/archive/feature-core-cards-commands-r1.md index 40dc01dd..f3068419 100644 --- a/.task/feature-core-cards-commands-r1.md +++ b/.task/archive/feature-core-cards-commands-r1.md @@ -1,6 +1,6 @@ # feature/core-cards-commands-r1 任务卡 -任务主记录:Dev PR(feature/core-cards-commands-r1);状态:待合入;owner:weichen +任务主记录:PR #15 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/15(merge 69fd335dea);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 69e9471dafd275f98928ff005732b94c4b18b638 | 69e9471dafd275f98928ff005732b94c4b18b638 | 2026-09-30T06:17:08Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果:完成。Core 契约扩展(ActivityCard/card 事件/HITL 锚定阻断/UI 七词汇/manifest commands+workspaces/工作流 card 步骤)PR#2 合入;Agent-Command v0(spec/registry/四态回执/审计信封+conformance)PR#2 合入;frontend 与 ui contracts 再生成 PR#3 合入;backend 消费适配(嵌套 pin 升级)PR#7 合入;documents 验证记录 PR#9 合入;task.sh finish 增加 cwd 防护(T0 误删主检出事故的修复)。 - 验证(synced head):PASS make test(core ok;backend 13 包 ok;frontend 9/9;ui tsc+6/6;agent-command vet+tests);PASS make build(版本串含 agentcmd);黄金样本逐字节一致(core 新增 5 份 + 扩展 1 份;agent-command 2 份);全变更为增量、既有样本不变。 - 影响与剩余项:组合版本串纳入 agentcmd;task-finish 必须在 worktree 内运行(已写入 AGENTS.md + 脚本防护)。剩余:T2 收件箱(backend cardsvc + 卡片组件 + mock 演示)。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 69fd335deac237f5291298cb06a50bf03d11add7(PR #15)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'T1: pin contracts combo (core cards/commands, agent-command v0) and guard task-finish' (#15) from feature/core-cards-commands-r1 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-gate-hardening.md b/.task/archive/feature-gate-hardening.md similarity index 55% rename from .task/feature-gate-hardening.md rename to .task/archive/feature-gate-hardening.md index f76fa5b2..34b7b083 100644 --- a/.task/feature-gate-hardening.md +++ b/.task/archive/feature-gate-hardening.md @@ -1,6 +1,6 @@ # feature/gate-hardening 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #8 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/8(merge 8f7cf2d9b9);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 20727a8fd3adeafee6fb37383948e2a9c5a004b0 | 20727a8fd3adeafee6fb37383948e2a9c5a004b0 | 2026-09-30T03:47:05Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 8f7cf2d9b9f45ab7c498b753e436e38fbc7726b1(PR #8)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Harden the gate: uninitialized-submodule detection and platform protection registration' (#8) from feature/gate-hardening into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-hardening-batch.md b/.task/archive/feature-hardening-batch.md similarity index 55% rename from .task/feature-hardening-batch.md rename to .task/archive/feature-hardening-batch.md index 8b6fac16..c0a471fa 100644 --- a/.task/feature-hardening-batch.md +++ b/.task/archive/feature-hardening-batch.md @@ -1,6 +1,6 @@ # feature/hardening-batch 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #11 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/11(merge dca932c6da);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 05a5ae1e1ac8ef8d341170c236e9b38570e48947 | 05a5ae1e1ac8ef8d341170c236e9b38570e48947 | 2026-09-30T04:04:26Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge dca932c6da3aea34af722f2a6772e621cf6143f5(PR #11)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Add CI, version stamping, and the high-consequence two-key rule' (#11) from feature/hardening-batch into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-pin-config-surface.md b/.task/archive/feature-pin-config-surface.md similarity index 55% rename from .task/feature-pin-config-surface.md rename to .task/archive/feature-pin-config-surface.md index 3e76f900..6810792e 100644 --- a/.task/feature-pin-config-surface.md +++ b/.task/archive/feature-pin-config-surface.md @@ -1,6 +1,6 @@ # feature/pin-config-surface 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #12 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/12(merge a58f85e0d0);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | dca932c6da3aea34af722f2a6772e621cf6143f5 | dca932c6da3aea34af722f2a6772e621cf6143f5 | 2026-09-30T04:20:47Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge a58f85e0d0ade6e8b4da3afe9985985a38bae47a(PR #12)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin backend with the configuration pipe and documents with its design' (#12) from feature/pin-config-surface into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-pin-documents-lessons.md b/.task/archive/feature-pin-documents-lessons.md similarity index 56% rename from .task/feature-pin-documents-lessons.md rename to .task/archive/feature-pin-documents-lessons.md index 3b6fa777..9b7d12a6 100644 --- a/.task/feature-pin-documents-lessons.md +++ b/.task/archive/feature-pin-documents-lessons.md @@ -1,6 +1,6 @@ # feature/pin-documents-lessons 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #9 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/9(merge e85d1ee49f);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 8f7cf2d9b9f45ab7c498b753e436e38fbc7726b1 | 8f7cf2d9b9f45ab7c498b753e436e38fbc7726b1 | 2026-09-30T03:49:31Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge e85d1ee49f5fb6659d83a3ed3c17ba42a93d5926(PR #9)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Pin the documents gitlink to the delivery lessons; align gate guards' (#9) from feature/pin-documents-lessons into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-tool-adaptation-standard.md b/.task/archive/feature-tool-adaptation-standard.md similarity index 56% rename from .task/feature-tool-adaptation-standard.md rename to .task/archive/feature-tool-adaptation-standard.md index 4a61cc9b..89dfacb5 100644 --- a/.task/feature-tool-adaptation-standard.md +++ b/.task/archive/feature-tool-adaptation-standard.md @@ -1,6 +1,6 @@ # feature/tool-adaptation-standard 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #5 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/5(merge ff931e5f70);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 428628ffe2a1b73a86299716853f52abdbd16291 | 428628ffe2a1b73a86299716853f52abdbd16291 | 2026-09-30T03:34:16Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge ff931e5f70cdf4d725d86f7925b067261a70c8bd(PR #5)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Adopt the tool adaptation standard and register the first instance matrix' (#5) from feature/tool-adaptation-standard into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-ui-foundation-r0.md b/.task/archive/feature-ui-foundation-r0.md similarity index 84% rename from .task/feature-ui-foundation-r0.md rename to .task/archive/feature-ui-foundation-r0.md index 636575ec..579dab73 100644 --- a/.task/feature-ui-foundation-r0.md +++ b/.task/archive/feature-ui-foundation-r0.md @@ -1,6 +1,6 @@ # feature/ui-foundation-r0 任务卡 -任务主记录:Dev PR #14 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/14;状态:待合入(合入权在仓库所有者);owner:weichen +任务主记录:Dev PR #14 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/14;状态:已完成(回填);owner:weichen ## 基线与授权 @@ -20,7 +20,7 @@ | 启动 | f20c634fea9e4316db664b4da7b4a6c772dd855e | f20c634fea9e4316db664b4da7b4a6c772dd855e | 2026-09-30T05:38:41Z | | 合入前验收 | f20c634fea9e4316db664b4da7b4a6c772dd855e | 15f0da6374f7ad0f53d0988080208ee1e46ff032 | 2026-09-30T05:56:09Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果:完成。两新仓上线(各 2 个 PR 合入 main:agent-command #1 骨架、ui #1 骨架 + #2 渲染器/令牌迁移);documents 提案 PR#8、frontend @ui 改造 PR#2、backend 接线 PR#6 均合入;Dev 组合 PR #14 待合入(gitlink:core=4ee1979 backend=a72c45f frontend=ab38738 ui=77c4bac documents=023daef agent-command=50f99d9)。 - 验证(tested_head=c9e8e29,即 PR #14 head): @@ -29,3 +29,9 @@ - PASS 零行为变化核查:新 tokens.css+ui.css+styles.css 按 import 顺序与迁移前 styles.css 规则逐字一致(仅注释与无碰撞的块位移);UIRenderer 原 store 直连改为 DocBridge 注入,两个调用点行为等价。 - PASS contracts 双份生成后 ui/frontend 子模块均无脏 diff。 - 影响与剩余项:组合从 10 子模块扩至 12;frontend 构建新增对 modules/ui 的依赖(Makefile 已编排 npm ci);已知权衡:ui 源码组合下 vite 以 dedupe 保证 react/marked 单副本。剩余:T1 Core 契约扩展 + Agent-Command v0(新任务)。 + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 69e9471dafd275f98928ff005732b94c4b18b638(PR #14)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Wire Agent-System-UI and Agent-Command into the Dev combo (T0)' (#14) from feature/ui-foundation-r0 into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-zcode-hooks.md b/.task/archive/feature-zcode-hooks.md similarity index 55% rename from .task/feature-zcode-hooks.md rename to .task/archive/feature-zcode-hooks.md index 0c0fc237..6215f592 100644 --- a/.task/feature-zcode-hooks.md +++ b/.task/archive/feature-zcode-hooks.md @@ -1,6 +1,6 @@ # feature/zcode-hooks 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #7 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/7(merge 20727a8fd3);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 1e08eb6ba22c82a1e87afbabe9a15f3e0a46a671 | 1e08eb6ba22c82a1e87afbabe9a15f3e0a46a671 | 2026-09-30T03:41:53Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 20727a8fd3adeafee6fb37383948e2a9c5a004b0(PR #7)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Add the zcode write-path guard instance with its adaptation matrix' (#7) from feature/zcode-hooks into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/fix-empty-list-json.md b/.task/archive/fix-empty-list-json.md similarity index 55% rename from .task/fix-empty-list-json.md rename to .task/archive/fix-empty-list-json.md index 20d26a83..09f5a9a5 100644 --- a/.task/fix-empty-list-json.md +++ b/.task/archive/fix-empty-list-json.md @@ -1,6 +1,6 @@ # fix/empty-list-json 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:PR #3 https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/3(merge 36d1393bd2);状态:已完成(回填);owner:weichen ## 基线与授权 @@ -18,8 +18,14 @@ |---|---|---|---| | 启动 | 923591feda367bc8ceaf809ed7c294e5245a3a3a | 923591feda367bc8ceaf809ed7c294e5245a3a3a | 2026-09-30T03:18:51Z | -## 结果与验证(完成后填写) +## 结果与验证 - 结果: - 验证: - 影响与剩余项: + +## 闭合记录(card-autoclose 回填) + +- 依据:merge 36d1393bd2806e8dddb69b1fc8850b5dbc3982d2(PR #3)已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:Merge pull request 'Advance the backend gitlink with the empty-list serialization fix' (#3) from fix/empty-list-json into main +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 diff --git a/.task/feature-card-autoclose-r1.md b/.task/feature-card-autoclose-r1.md new file mode 100644 index 00000000..cd80dfd2 --- /dev/null +++ b/.task/feature-card-autoclose-r1.md @@ -0,0 +1,30 @@ +# feature/card-autoclose-r1 任务卡 + +任务主记录:;状态:进行中;owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 69fd335deac237f5291298cb06a50bf03d11add7 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-card-autoclose-r1(worktree);分支:feature/card-autoclose-r1 +- 授权与交付终点:用户指示"把 11 张已合入的回填归档,并针对这种情况完善规范和 rules 还有 hooks(增加 script,合入成功后自动清理)";2026-09-30 追加授权"执行这些,不要让人工来操作,人工只负责给你提案和审核"——Agent 自主创建并合入本 PR、执行合入后回收与钩子启用。终点 = PR 合入 + task-finish 回收 + 本任务卡经新机制自动闭合。未授权:改写历史、解除/变更分支保护、删除归档引用、发布版本(双钥匙边界不变)、跨仓 guidelines 内容变更(记为后续任务)、动 inbox-r2 在途任务的现场。 + +## 目标与非目标 + +- 目标:① 回填 11 张已合入卡片(状态→已完成、主记录回填 PR 链接与合并 SHA、结果栏如实标注事后回填依据)并归档至 `.task/archive/`;② task.sh 新增 `close` 子命令——检测"分支已合入 origin/main 但卡片未闭合"的任务卡,自动回填+归档,变更经 `feature/card-close-*` 分支+PR 进 main(main 受保护,不直推);③ 新增 post-merge 钩子(仅主检出 main 分支触发)+ task-finish 收尾接线 + precheck 报告项;④ AGENTS.md 增补卡片闭合规则。 +- 非目标:不改子仓(modules/*、deps/*)、不动 gitlink;不改 guidelines 仓内容;不自动合入任何 PR(闭合 PR 仍由所有者合入);不处置 delivery-mechanism 卡中记录的历史偏差。 + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 69fd335deac237f5291298cb06a50bf03d11add7 | 69fd335deac237f5291298cb06a50bf03d11add7 | 2026-09-30T07:02:09Z | +| 同步前验收 | 69fd335deac237f5291298cb06a50bf03d11add7 | beaefb75492bca6282163c208f18ff8c0ac01db0 | 2026-09-30T07:13:03Z | + +## 结果与验证 + +- 结果:① 11 张已合入卡片经 `task.sh close --fold` 狗粮运行回填(状态→已完成(回填)、主记录 PR 链接+merge SHA、追加闭合记录)并归档 `.task/archive/`(commit 6f6b670;首轮暴露 PR 号正则与 URL 模板两 bug,已修并修正归档内容,commit beaefb7);② `task.sh close` 子命令(按合并提交检测、pending 幂等防重复闭合分支、主检出→`feature/card-close-*` 分支+推送、`--fold` 并入当前任务 PR、GITEA_TOKEN 可选自动建 PR);③ precheck 新增 `[cards]` 欠账报告(跳过 pending);task-finish 收尾自动触发 close;新增 post-merge 钩子(仅主检出+main 的 merge 型 pull 触发,ff-only 不触发由前两者兜底);④ Makefile `task-close` 目标与 setup chmod;AGENTS.md 增补闭合规则。 +- 验证(synced head=beaefb7): + - PASS 临时真实仓库正负例矩阵 33/33(bare origin+clone+Gitea 风格合并提交):precheck 欠账报告只报已合入未闭合卡(不报未合入/已完成/pending);close 树脏拒绝、任务分支无 --fold 拒绝;主检出 close 建分支推送且内容含 PR# 回填与合规提交主题;幂等重跑无欠账且不新建分支;--fold 归档落当前任务分支且不误闭本任务卡;post-merge 钩子 merge 型 pull 自动闭合、不阻断 pull、结束后回到 main;闭合 PR 合入后主检出卡片真正移入 archive 且已完成卡不动;worktree 内 merge 不触发钩子。 + - PASS 狗粮:真实 11 卡一次识别闭合(PR#1/3/5/7/8/9/10/11/12/14/15,merge SHA 见归档卡)。 + - PASS `make test`(core ok;backend 13 包 ok 含 server 4.08s;frontend 9/9;ui tsc+6/6;agent-command vet+tests);PASS `make task-sync`(sync_base=69fd335dea tested_head=beaefb7549)。 +- 影响与剩余项:仅 Dev 仓治理面(task.sh/hooks/Makefile/AGENTS.md/.task),无子仓与 gitlink 变更。剩余:① 需 `make setup` 重新 chmod 启用 post-merge 钩子(主检出);② guidelines 仓 standards 层的对应条目更新(跨仓,后续任务);③ close 的自动建 PR 需 GITEA_TOKEN,缺失时打印手工链接。 diff --git a/AGENTS.md b/AGENTS.md index 947074ea..cdedc04f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,6 +14,11 @@ - 合入后**在 worktree 内**运行 `make task-finish` 回收 worktree 与分支(脚本会把 当前目录当 worktree 回收——在主检出运行会误删主检出,已加防护);放弃未合入 工作用 `make task-finish ABANDON="--abandon <原因>"` 并记录原因。 +- **任务卡闭合(防欠账)**:分支合入 main 后,其任务卡须回填"已完成"+主记录 PR 链接并 + 归档至 `.task/archive/`。自动路径:`make task-finish` 收尾触发、主检出 merge 型 pull 触发 + post-merge 钩子(ff-only 不触发,由前两者兜底);手动为 `make task-close`(主检出运行→建 + `feature/card-close-*` 分支+PR,任务分支内加 `FOLD=--fold` 随当前 PR 合入)。 + precheck 的 `[cards]` 行报告欠账,验收前应清零;闭合 PR 由所有者合入。 ## 提交与 PR diff --git a/Makefile b/Makefile index cbd8e6b2..0d1212b8 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ PLUGINS := plugins COMBO := core=$(shell git -C $(CORE) rev-parse --short HEAD 2>/dev/null)+backend=$(shell git -C $(BACKEND) rev-parse --short HEAD 2>/dev/null)+frontend=$(shell git -C $(FRONTEND) rev-parse --short HEAD 2>/dev/null)+ui=$(shell git -C $(UI) rev-parse --short HEAD 2>/dev/null)+agentcmd=$(shell git -C deps/agent-command rev-parse --short HEAD 2>/dev/null)+documents=$(shell git -C modules/documents rev-parse --short HEAD 2>/dev/null) VERSION := $(shell git describe --tags --always --dirty 2>/dev/null)+$(COMBO) -.PHONY: help sync status build frontend test test-backend test-frontend test-ui test-core test-agentcmd dev pin clean setup precheck task-start task-sync task-finish version +.PHONY: help sync status build frontend test test-backend test-frontend test-ui test-core test-agentcmd dev pin clean setup precheck task-start task-sync task-close task-finish version version: @echo "agent-system $(VERSION)" @@ -22,8 +22,8 @@ TASK := scripts/task.sh setup: git config core.hooksPath scripts/hooks - chmod +x scripts/hooks/pre-commit scripts/task.sh - @echo "OK: pre-commit 钩子已启用(core.hooksPath=scripts/hooks)" + chmod +x scripts/hooks/pre-commit scripts/hooks/post-merge scripts/task.sh + @echo "OK: pre-commit/post-merge 钩子已启用(core.hooksPath=scripts/hooks)" precheck: @bash $(TASK) precheck @@ -35,6 +35,9 @@ task-start: task-sync: @bash $(TASK) sync +task-close: + @bash $(TASK) close $(FOLD) + task-finish: @bash $(TASK) finish $(ABANDON) diff --git a/scripts/hooks/post-merge b/scripts/hooks/post-merge new file mode 100644 index 00000000..740e8616 --- /dev/null +++ b/scripts/hooks/post-merge @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# 本地钩子(post-merge):merge 型 pull/merge 落地后自动闭合已合入任务卡(ff-only 不触发 +# 本钩子——由 task-finish 收尾与 precheck [cards] 报告兜底)。 +# 触发条件收紧到"主检出 + 集成分支 main"——任务 worktree 里 task-sync 的 merge 不触发, +# 防止把卡片闭合混进任务分支现场。失败只警告,绝不阻断 pull。 +# 注意:task.sh close 在主检出会另建 feature/card-close-* 分支提交(集成分支不直推), +# 结束后切回 main;PR 由所有者合入。 +common=$(git rev-parse --git-common-dir) && common=$(cd "$common" 2>/dev/null && pwd) || exit 0 +mainrepo=$(dirname "$common") +[ "$mainrepo" = "$PWD" ] || exit 0 +[ "$(git rev-parse --abbrev-ref HEAD)" = "main" ] || exit 0 +[ -f "$mainrepo/scripts/task.sh" ] || exit 0 +bash "$mainrepo/scripts/task.sh" close \ + || echo "[warn] post-merge 卡片自动闭合失败——在主检出手动运行 make task-close" >&2 +exit 0 diff --git a/scripts/task.sh b/scripts/task.sh index 2e7a302b..587074dd 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# 任务启动门禁:precheck / start / sync / finish(配套 Makefile 同名目标)。 +# 任务启动门禁:precheck / start / sync / close / finish(配套 Makefile 同名目标)。 # 规范依据:collaboration.md 共同基线与同步节点、治理清理;delivery.md §1/§5。 set -euo pipefail @@ -31,6 +31,17 @@ cmd_precheck() { [ "${sub_uninit:-0}" -gt 0 ] && echo "[warn] ${sub_uninit} 个子模块未初始化——构建/测试前需物化(不阻断写入)" echo "[worktrees] linked=${wt}" [ -n "$merged" ] && echo "[recycle] merged un-recycled branches: $(echo $merged)" + local open_cards="" pc pb pst + for pc in .task/*.md; do + [ -f "$pc" ] || continue + pb=$(card_of_branch "$pc"); [ -n "$pb" ] || continue + pst=$(card_status "$pc"); case "$pst" in 已完成*) continue ;; esac + card_pending "${pc##*/}" && continue + if git log --merges --format='%s' "origin/${TARGET_BRANCH}" 2>/dev/null | grep -qF " from $pb into ${TARGET_BRANCH}"; then + open_cards="${open_cards} ${pc##*/}" + fi + done + [ -n "$open_cards" ] && echo "[cards] 已合入未闭合任务卡:$(echo $open_cards)——make task-close 回填归档(主检出运行)" echo "[required-reading] core/baseline.md, workflows/delivery.md §1$([ "$dirty" -gt 0 ] && echo ", standards/collaboration.md(树脏=他人或未收尾现场,不得写入)")" echo "[R0] $(echo "$rmain" | cut -c1-10)(完整:$rmain)" if [ "$dirty" -gt 0 ] || [ "${sub_drift:-0}" -gt 0 ]; then @@ -110,6 +121,127 @@ cmd_sync() { echo "[next] 跑正式验收(make test 等),证据写入任务卡" } +# ---- 卡片闭合(防欠账)---- +# 依据:delivery.md §5 治理清理;机制化 2026-09-30 治理缺口(11 张已合入卡片未闭合)。 +# 检测 .task/*.md 中"分支已合入 origin/ 但状态非已完成"的卡片:回填状态、主记录 +# (PR 链接+合并 SHA)与闭合记录,并 git mv 到 .task/archive/。变更落点:主检出运行→ +# 新建 feature/card-close-* 分支推送(集成分支受保护,不直推);任务分支内运行须 --fold +# (随当前任务 PR 合入)。合并判定用合并提交主题(分支删除后仍可追溯),不依赖分支存活。 + +card_of_branch() { sed -n 's/^- 工作区:.*分支:\([A-Za-z0-9._/-]\+\).*/\1/p' "$1" | head -1; } +card_status() { sed -n 's/^.*;状态:\([^;]*\).*/\1/p' "$1" | head -1; } +card_merge() { # $1=branch → "sha|subject"(该分支合入 origin/ 的合并提交) + git log --merges --format='%H|%s' "origin/${TARGET_BRANCH}" 2>/dev/null \ + | grep -F " from $1 into ${TARGET_BRANCH}" | head -1 +} +card_pending() { # $1=卡片文件名——闭合是否已在某 origin/feature/card-close-* 分支待合入 + local cb + for cb in $(git for-each-ref --format='%(refname:short)' "refs/remotes/origin/feature/card-close-*"); do + git cat-file -e "${cb}:.task/archive/$1" 2>/dev/null && return 0 + done + return 1 +} +card_backfill() { # $1=card $2=pr_num $3=merge_sha $4=merge_subject $5=web_base(原地改写) + python3 - "$1" "$2" "$3" "$4" "$5" <<'PY' +import re, sys +path, pr, sha, subject, base = sys.argv[1:6] +s = open(path, encoding='utf-8').read() +s = re.sub(r'状态:[^;\n]*', '状态:已完成(回填)', s, count=1) +m = re.search(r'任务主记录:([^;\n]*)', s) +if m and 'pulls/' not in m.group(1): + s = s.replace(m.group(1), f'PR #{pr} {base}/pulls/{pr}(merge {sha[:10]})', 1) +s = s.replace('## 结果与验证(完成后填写)', '## 结果与验证', 1) +s = s.rstrip('\n') + f''' + +## 闭合记录(card-autoclose 回填) + +- 依据:merge {sha}(PR #{pr})已包含于 origin/main,分支成果已落盘;本段为合入后回填。 +- 合并主题:{subject} +- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。 +''' +open(path, 'w', encoding='utf-8').write(s) +PY +} + +cmd_close() { + need_repo + local fold=0 + [ "${1:-}" = "--fold" ] && fold=1 + git fetch -q origin "${TARGET_BRANCH}" 2>/dev/null || true + # 默认值取远端通告的 Web 面(git push 输出的 PR 建议链接);可用 TASK_CARD_WEB_BASE 覆盖 + local web_base="${TASK_CARD_WEB_BASE:-https://git-panel.u1680832.nyat.app:30319}" + local url owner repo + url=$(git remote get-url origin); url="${url%.git}" + repo=$(basename "$url"); owner=$(basename "$(dirname "$url")") + local branch c b st m cards="" + branch=$(git rev-parse --abbrev-ref HEAD) + for c in .task/*.md; do + [ -f "$c" ] || continue + b=$(card_of_branch "$c"); [ -n "$b" ] || continue + st=$(card_status "$c"); case "$st" in 已完成*) continue ;; esac + if card_pending "${c##*/}"; then + echo "[close] ${c##*/} 已有待合入的闭合分支,跳过(等其 PR 合入)" + continue + fi + m=$(card_merge "$b") || m="" + [ -n "$m" ] || continue + cards="$cards +$c|$b|$m" + done + [ -n "$cards" ] || { echo "[close] 无已合入未闭合的任务卡"; exit 0; } + # 落点:主检出→feature/card-close-* 分支(提交过 pre-commit 分支闸);任务分支须显式 --fold + local newbranch="" + if [ "$branch" = "${TARGET_BRANCH}" ]; then + [ -z "$(git status --porcelain | grep -v '^.. \.zcode/' || true)" ] || die "主检出树脏——先收尾再 close(防混入未提交现场)" + newbranch="feature/card-close-$(date -u +%Y%m%d-%H%M%SZ)" + git rev-parse --verify -q "refs/heads/${newbranch}" >/dev/null && die "分支已存在:${newbranch}" + git checkout -q -b "$newbranch" "origin/${TARGET_BRANCH}" + elif [ "$fold" != "1" ]; then + die "close 在任务分支内须加 --fold(并入当前任务 PR);或到主检出运行(将建 feature/card-close-* 分支+PR)" + fi + local n=0 sha subject pr closed_list="" + while IFS='|' read -r c b m; do + [ -n "$c" ] || continue + sha="${m%%|*}"; subject="${m#*|}" + pr=$(printf '%s' "$subject" | sed -n 's/.*(#\([0-9]\+\)) from.*/\1/p') + [ -n "$pr" ] || pr=unknown + card_backfill "$c" "$pr" "$sha" "$subject" "${web_base}/${owner}/${repo}" + mkdir -p .task/archive + git mv "$c" ".task/archive/${c##*/}" + closed_list="$closed_list ${c##*/}(PR#${pr})" + n=$((n+1)) + done < "$msg" + git add .task + git commit -q -F "$msg"; rm -f "$msg" + git push -q -u origin HEAD + local headbr pr_url="" + headbr=$(git rev-parse --abbrev-ref HEAD) + if [ -n "${GITEA_TOKEN:-}" ]; then + local resp + resp=$(curl -sS -X POST -H "Authorization: token ${GITEA_TOKEN}" -H 'Content-Type: application/json' \ + "${web_base}/api/v1/repos/${owner}/${repo}/pulls" \ + -d "{\"head\":\"${headbr}\",\"base\":\"${TARGET_BRANCH}\",\"title\":\"Close merged task cards (${headbr})\",\"body\":\"Auto-generated by task.sh close; see commit message for evidence.\"}" 2>/dev/null || true) + pr_url=$(printf '%s' "$resp" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("html_url",""))' 2>/dev/null || true) + fi + if [ -n "$newbranch" ]; then git checkout -q "${TARGET_BRANCH}"; fi + if [ -n "$pr_url" ]; then + echo "[pr] ${pr_url}(合入权在所有者)" + else + echo "[next] 建 PR:${web_base}/${owner}/${repo}/pulls/new?head=${headbr}(合入权在所有者)" + fi + echo "[closed] ${n} 张已合入卡片已回填归档,提交于 ${headbr} 并推送" +} + cmd_finish() { need_repo local abandon="${1:-}" @@ -140,12 +272,16 @@ cmd_finish() { git -C "$mainrepo" worktree prune git push -q --delete origin "$branch" 2>/dev/null || true echo "[recycled] worktree 与分支 ${branch} 已回收(本地+远端,$(date -u +%FT%TZ))" + # 合入成功→自动闭合任务卡(含本任务卡;经 feature/card-close-* 分支+PR,合入权在所有者) + ( cd "$mainrepo" && bash scripts/task.sh close ) \ + || echo "[next] 卡片自动闭合未完成——在主检出运行 make task-close" } case "${1:-}" in precheck) shift; cmd_precheck "$@" ;; start) shift; cmd_start "$@" ;; sync) shift; cmd_sync "$@" ;; + close) shift; cmd_close "$@" ;; finish) shift; cmd_finish "$@" ;; - *) echo "usage: task.sh [args]"; exit 2 ;; + *) echo "usage: task.sh [args]"; exit 2 ;; esac