cc-devflow 4.5.11 → 4.5.12
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.
- package/.claude/skills/cc-act/CHANGELOG.md +18 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +17 -269
- package/.claude/skills/cc-act/SKILL.md +38 -425
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +2 -13
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +1 -9
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +21 -177
- package/.claude/skills/cc-act/references/closure-contract.md +12 -63
- package/.claude/skills/cc-act/references/git-commit-guidelines.md +5 -5
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +5 -322
- package/.claude/skills/cc-act/scripts/detect-ship-target.sh +11 -2
- package/.claude/skills/cc-act/scripts/inspect-git-index.sh +58 -0
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +40 -440
- package/.claude/skills/cc-act/scripts/verify-act-gate.sh +10 -50
- package/.claude/skills/cc-check/CHANGELOG.md +18 -0
- package/.claude/skills/cc-check/PLAYBOOK.md +19 -273
- package/.claude/skills/cc-check/SKILL.md +33 -456
- package/.claude/skills/cc-check/references/review-contract.md +12 -147
- package/.claude/skills/cc-dev/CHANGELOG.md +15 -0
- package/.claude/skills/cc-dev/PLAYBOOK.md +1 -1
- package/.claude/skills/cc-dev/SKILL.md +52 -137
- package/.claude/skills/cc-dev/scripts/resolve-cc-devflow.sh +181 -0
- package/.claude/skills/cc-do/CHANGELOG.md +11 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +19 -113
- package/.claude/skills/cc-do/SKILL.md +39 -245
- package/.claude/skills/cc-do/references/execution-recovery.md +15 -109
- package/.claude/skills/cc-do/scripts/cc-do-common.sh +5 -57
- package/.claude/skills/cc-do/scripts/check-task-status.sh +35 -65
- package/.claude/skills/cc-do/scripts/mark-task-complete.sh +9 -46
- package/.claude/skills/cc-do/scripts/select-ready-tasks.sh +29 -97
- package/.claude/skills/cc-investigate/CHANGELOG.md +16 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +20 -180
- package/.claude/skills/cc-investigate/SKILL.md +64 -246
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +48 -98
- package/.claude/skills/cc-investigate/references/investigation-contract.md +14 -218
- package/.claude/skills/cc-next/CHANGELOG.md +6 -0
- package/.claude/skills/cc-next/PLAYBOOK.md +12 -8
- package/.claude/skills/cc-next/SKILL.md +34 -140
- package/.claude/skills/cc-plan/CHANGELOG.md +16 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +22 -161
- package/.claude/skills/cc-plan/SKILL.md +45 -295
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +30 -228
- package/.claude/skills/cc-plan/references/planning-contract.md +24 -161
- package/.claude/skills/cc-plan/scripts/next-change-key.sh +8 -44
- package/.claude/skills/cc-plan/scripts/parse-task-dependencies.js +2 -2
- package/.claude/skills/cc-plan/scripts/validate-scope.sh +1 -1
- package/.claude/skills/cc-pr-land/SKILL.md +14 -114
- package/.claude/skills/cc-pr-review/CHANGELOG.md +4 -0
- package/.claude/skills/cc-pr-review/SKILL.md +20 -103
- package/.claude/skills/cc-review/CHANGELOG.md +17 -0
- package/.claude/skills/cc-review/PLAYBOOK.md +13 -86
- package/.claude/skills/cc-review/SKILL.md +53 -241
- package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +2 -2
- package/.claude/skills/cc-review/references/implementation-review-branch.md +7 -147
- package/.claude/skills/cc-review/references/plan-review-branch.md +5 -147
- package/.claude/skills/cc-review/references/review-methods.md +10 -218
- package/.claude/skills/cc-review/scripts/collect-review-context.sh +4 -63
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +1 -1
- package/.claude/skills/cc-roadmap/SKILL.md +3 -3
- package/.claude/skills/cc-simplify/CHANGELOG.md +7 -0
- package/.claude/skills/cc-simplify/SKILL.md +26 -21
- package/.claude/skills/cc-spec-init/PLAYBOOK.md +12 -48
- package/.claude/skills/cc-spec-init/SKILL.md +29 -132
- package/.claude/skills/cc-spec-init/references/spec-contract.md +8 -17
- package/CHANGELOG.md +13 -0
- package/bin/cc-devflow-cli.js +20 -260
- package/bin/cc-devflow.js +44 -7
- package/docs/commands/README.md +1 -1
- package/docs/commands/README.zh-CN.md +1 -1
- package/docs/examples/README.md +1 -1
- package/docs/examples/START-HERE.md +14 -15
- package/docs/examples/example-bindings.json +11 -11
- package/docs/examples/full-design-blocked/README.md +4 -6
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/{planning/tasks.md → task.md} +20 -15
- package/docs/examples/local-handoff/README.md +8 -11
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/pr-brief.md +31 -0
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/{planning/tasks.md → task.md} +18 -13
- package/docs/examples/pdca-loop/README.md +6 -9
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +9 -11
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/{planning/tasks.md → task.md} +18 -13
- package/docs/examples/scripts/check-example-bindings.sh +11 -62
- package/docs/guides/artifact-contract.md +10 -40
- package/docs/guides/getting-started.md +8 -8
- package/docs/guides/getting-started.zh-CN.md +8 -8
- package/docs/guides/minimize-artifacts.md +16 -130
- package/docs/guides/project-postmortem.md +14 -71
- package/lib/compiler/__tests__/skills-registry.test.js +9 -8
- package/lib/compiler/resource-copier.js +29 -0
- package/lib/skill-runtime/__tests__/archive-change.test.js +2 -2
- package/lib/skill-runtime/__tests__/benchmark-skills.test.js +3 -3
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +14 -4
- package/lib/skill-runtime/errors.js +3 -3
- package/lib/skill-runtime/index.js +5 -23
- package/lib/skill-runtime/paths.js +5 -52
- package/lib/skill-runtime/query-registry.js +4 -4
- package/lib/skill-runtime/query.js +89 -201
- package/lib/skill-runtime/store.js +4 -40
- package/lib/skill-runtime/trace.js +2 -2
- package/package.json +2 -5
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +0 -29
- package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +0 -54
- package/.claude/skills/cc-act/scripts/generate-status-report.sh +0 -92
- package/.claude/skills/cc-act/scripts/sync-act-docs.sh +0 -355
- package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +0 -234
- package/.claude/skills/cc-check/scripts/render-report-card.js +0 -438
- package/.claude/skills/cc-check/scripts/verify-gate.sh +0 -85
- package/.claude/skills/cc-do/scripts/build-task-context.sh +0 -175
- package/.claude/skills/cc-do/scripts/record-review-decision.sh +0 -88
- package/.claude/skills/cc-do/scripts/recover-workflow.sh +0 -82
- package/.claude/skills/cc-do/scripts/run-problem-analysis.sh +0 -70
- package/.claude/skills/cc-do/scripts/verify-task-gates.sh +0 -109
- package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +0 -92
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +0 -224
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +0 -178
- package/.claude/skills/cc-spec-init/assets/CHANGE_META_TEMPLATE.json +0 -28
- package/.claude/skills/cc-spec-init/scripts/validate-spec-links.sh +0 -45
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +0 -234
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +0 -488
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +0 -189
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/resume-index.md +0 -39
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/status.md +0 -29
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +0 -123
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +0 -292
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +0 -136
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/status.md +0 -29
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +0 -124
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +0 -292
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +0 -136
- package/docs/get-shit-done-strategy-audit.md +0 -518
- package/docs/skill-runtime-migration.md +0 -46
- package/lib/skill-runtime/__tests__/approve.test.js +0 -92
- package/lib/skill-runtime/__tests__/autopilot.test.js +0 -253
- package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +0 -165
- package/lib/skill-runtime/__tests__/delegation.test.js +0 -97
- package/lib/skill-runtime/__tests__/dispatch.test.js +0 -237
- package/lib/skill-runtime/__tests__/intent.test.js +0 -203
- package/lib/skill-runtime/__tests__/lifecycle.test.js +0 -169
- package/lib/skill-runtime/__tests__/planner.tdd.test.js +0 -331
- package/lib/skill-runtime/__tests__/prepare-pr.test.js +0 -126
- package/lib/skill-runtime/__tests__/query.test.js +0 -860
- package/lib/skill-runtime/__tests__/readiness.test.js +0 -53
- package/lib/skill-runtime/__tests__/release.test.js +0 -85
- package/lib/skill-runtime/__tests__/review-check-integration.test.js +0 -148
- package/lib/skill-runtime/__tests__/review-records.test.js +0 -619
- package/lib/skill-runtime/__tests__/runtime.integration.test.js +0 -351
- package/lib/skill-runtime/__tests__/schemas.test.js +0 -337
- package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +0 -137
- package/lib/skill-runtime/__tests__/task-contract.test.js +0 -874
- package/lib/skill-runtime/__tests__/team-state.test.js +0 -51
- package/lib/skill-runtime/__tests__/verify-artifacts.test.js +0 -203
- package/lib/skill-runtime/__tests__/worker-run.test.js +0 -275
- package/lib/skill-runtime/__tests__/worker.test.js +0 -56
- package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +0 -31
- package/lib/skill-runtime/__tests__/workflow-context.test.js +0 -98
- package/lib/skill-runtime/artifacts.js +0 -88
- package/lib/skill-runtime/context-index.js +0 -545
- package/lib/skill-runtime/delegation.js +0 -533
- package/lib/skill-runtime/intent.js +0 -309
- package/lib/skill-runtime/lifecycle.js +0 -294
- package/lib/skill-runtime/operations/CLAUDE.md +0 -19
- package/lib/skill-runtime/operations/approve.js +0 -81
- package/lib/skill-runtime/operations/autopilot-core.js +0 -337
- package/lib/skill-runtime/operations/autopilot-execution.js +0 -307
- package/lib/skill-runtime/operations/autopilot-shared.js +0 -48
- package/lib/skill-runtime/operations/autopilot.js +0 -163
- package/lib/skill-runtime/operations/dispatch.js +0 -416
- package/lib/skill-runtime/operations/init.js +0 -60
- package/lib/skill-runtime/operations/janitor.js +0 -61
- package/lib/skill-runtime/operations/plan.js +0 -59
- package/lib/skill-runtime/operations/prepare-pr.js +0 -25
- package/lib/skill-runtime/operations/release.js +0 -99
- package/lib/skill-runtime/operations/resume.js +0 -126
- package/lib/skill-runtime/operations/review-records.js +0 -265
- package/lib/skill-runtime/operations/snapshot.js +0 -45
- package/lib/skill-runtime/operations/task-contract.js +0 -593
- package/lib/skill-runtime/operations/verify.js +0 -170
- package/lib/skill-runtime/operations/worker-run.js +0 -531
- package/lib/skill-runtime/operations/worker.js +0 -33
- package/lib/skill-runtime/planner.js +0 -539
- package/lib/skill-runtime/readiness.js +0 -84
- package/lib/skill-runtime/review-records.js +0 -123
- package/lib/skill-runtime/review.js +0 -855
- package/lib/skill-runtime/schemas.js +0 -746
- package/lib/skill-runtime/task-contract.js +0 -188
- package/lib/skill-runtime/team-state.js +0 -122
- package/lib/skill-runtime/workflow-context.js +0 -748
|
@@ -1,197 +1,41 @@
|
|
|
1
1
|
# PR Brief
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
- Output language:
|
|
6
|
-
|
|
7
|
-
## Decision
|
|
8
|
-
|
|
9
|
-
- Recommended mode:
|
|
10
|
-
- Why now:
|
|
11
|
-
- Why not others:
|
|
12
|
-
|
|
13
|
-
## Requirement
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
## Ship Mode
|
|
18
|
-
|
|
19
|
-
- `create-pr` / `update-pr` / `local-handoff` / `post-merge-closeout`
|
|
20
|
-
|
|
21
|
-
## Branch Context
|
|
22
|
-
|
|
23
|
-
- Current branch:
|
|
24
|
-
- Base branch:
|
|
25
|
-
- PR / MR:
|
|
26
|
-
|
|
27
|
-
## Ship Preflight
|
|
3
|
+
## Change
|
|
28
4
|
|
|
5
|
+
- Change key:
|
|
29
6
|
- Branch:
|
|
30
|
-
-
|
|
31
|
-
- Remote:
|
|
32
|
-
- Local / remote HEAD:
|
|
33
|
-
- Auth:
|
|
34
|
-
- Clean tree:
|
|
35
|
-
- Review freshness:
|
|
36
|
-
- Ship mode:
|
|
37
|
-
- `ShipPreflightError`:
|
|
38
|
-
- Rescue action:
|
|
39
|
-
|
|
40
|
-
## PR Branch Hygiene
|
|
41
|
-
|
|
42
|
-
- Existing PR / MR:
|
|
43
|
-
- Duplicate PR risk:
|
|
44
|
-
- Commit split:
|
|
45
|
-
- Push idempotency:
|
|
46
|
-
- Body source:
|
|
47
|
-
|
|
48
|
-
## Review Range
|
|
49
|
-
|
|
50
|
-
- Reviewed base SHA:
|
|
51
|
-
- Reviewed head SHA:
|
|
52
|
-
- Review packet:
|
|
53
|
-
- Finding triage:
|
|
54
|
-
- QA / claim evidence:
|
|
55
|
-
|
|
56
|
-
## Readiness Dashboard
|
|
57
|
-
|
|
58
|
-
- Review freshness:
|
|
59
|
-
- Review quality:
|
|
60
|
-
- Specialist review facets:
|
|
61
|
-
- QA coverage:
|
|
62
|
-
- Browser QA:
|
|
63
|
-
- Feedback loop:
|
|
64
|
-
- Behavior evidence:
|
|
65
|
-
- Failure ownership:
|
|
66
|
-
- Documentation release:
|
|
67
|
-
- PR body accuracy:
|
|
68
|
-
|
|
69
|
-
## Pull Request Body Contract
|
|
70
|
-
|
|
71
|
-
- Language source: `Output language: <value from report-card>`
|
|
72
|
-
- PR body language: `中文` / `English`
|
|
73
|
-
- Title rule: same language as the PR body after the Conventional Commits `type(scope)` prefix; keep identifiers, paths, commands, and issue keys unchanged.
|
|
74
|
-
- Body source: current `pr-brief.md`, current diff, current `review/report-card.json`, doc sync output, and roadmap/backlog writeback.
|
|
75
|
-
- Required sections: summary, problem, changes, validation, review/gate evidence, risk/rollback, docs/writeback, follow-ups.
|
|
76
|
-
- Completeness gate: no empty headings, no stale inherited PR body, no generic "tests passed" without command or evidence, and no `<placeholder>` text before `gh pr create` or `gh pr edit`.
|
|
77
|
-
|
|
78
|
-
## Pull Request Body Draft
|
|
7
|
+
- Head:
|
|
79
8
|
|
|
80
|
-
|
|
81
|
-
## Summary / 摘要
|
|
82
|
-
|
|
83
|
-
- TBD
|
|
84
|
-
|
|
85
|
-
## Problem / 问题
|
|
86
|
-
|
|
87
|
-
- Requirement / 需求:
|
|
88
|
-
- User-visible gap / 用户可见缺口:
|
|
89
|
-
|
|
90
|
-
## Changes / 变更
|
|
9
|
+
## Task Summary
|
|
91
10
|
|
|
92
|
-
-
|
|
11
|
+
- Done:
|
|
93
12
|
|
|
94
|
-
##
|
|
13
|
+
## Recent Commits
|
|
95
14
|
|
|
96
|
-
-
|
|
97
|
-
- Commands / 命令:
|
|
98
|
-
- Key observations / 关键观察:
|
|
15
|
+
- <task summary>
|
|
99
16
|
|
|
100
|
-
##
|
|
17
|
+
## Current Diff
|
|
101
18
|
|
|
102
|
-
-
|
|
103
|
-
- Reviewed head SHA:
|
|
104
|
-
- Review packet:
|
|
105
|
-
- Finding triage:
|
|
106
|
-
- QA / claim evidence:
|
|
107
|
-
- Readiness:
|
|
19
|
+
- <diff summary>
|
|
108
20
|
|
|
109
|
-
##
|
|
21
|
+
## Validation
|
|
110
22
|
|
|
111
|
-
-
|
|
112
|
-
-
|
|
23
|
+
- Command:
|
|
24
|
+
- Result:
|
|
25
|
+
- Key observation:
|
|
113
26
|
|
|
114
|
-
##
|
|
115
|
-
|
|
116
|
-
- `CLAUDE.md`:
|
|
117
|
-
- `README.md`:
|
|
118
|
-
- Roadmap progress:
|
|
119
|
-
|
|
120
|
-
## Follow-ups / 后续事项
|
|
121
|
-
|
|
122
|
-
- TBD
|
|
123
|
-
```
|
|
27
|
+
## PR Body Draft
|
|
124
28
|
|
|
29
|
+
```markdown
|
|
125
30
|
## Summary
|
|
126
31
|
|
|
127
|
-
-
|
|
32
|
+
- <summary>
|
|
128
33
|
|
|
129
|
-
##
|
|
34
|
+
## Validation
|
|
130
35
|
|
|
131
|
-
-
|
|
36
|
+
- <validation evidence>
|
|
132
37
|
|
|
133
|
-
##
|
|
38
|
+
## Risk / Rollback
|
|
134
39
|
|
|
135
|
-
-
|
|
136
|
-
|
|
137
|
-
- Merged-result verification:
|
|
138
|
-
|
|
139
|
-
## Rollback Guard
|
|
140
|
-
|
|
141
|
-
- Safe state:
|
|
142
|
-
- Rollback command / manual steps:
|
|
143
|
-
- Side effects:
|
|
144
|
-
- Owner:
|
|
145
|
-
|
|
146
|
-
## QA Behavior Evidence
|
|
147
|
-
|
|
148
|
-
- Feedback loop:
|
|
149
|
-
- Expected behavior:
|
|
150
|
-
- Actual behavior:
|
|
151
|
-
- Reproduction steps:
|
|
152
|
-
- Consistency:
|
|
153
|
-
|
|
154
|
-
## Documentation Sync
|
|
155
|
-
|
|
156
|
-
- `CLAUDE.md`:
|
|
157
|
-
- `README.md`:
|
|
158
|
-
- `release-note.md`:
|
|
159
|
-
- `resume-index.md`:
|
|
160
|
-
|
|
161
|
-
## Roadmap Progress Sync
|
|
162
|
-
|
|
163
|
-
- Source RM:
|
|
164
|
-
- Roadmap files: `devflow/roadmap.json`, `devflow/ROADMAP.md`, optional `devflow/BACKLOG.md`
|
|
165
|
-
- Sync command:
|
|
166
|
-
- Status after sync:
|
|
167
|
-
- Progress after sync:
|
|
168
|
-
- Follow-up writeback:
|
|
169
|
-
- No-op reason:
|
|
170
|
-
|
|
171
|
-
## Consolidated Memory
|
|
172
|
-
|
|
173
|
-
- `handoff path`:
|
|
174
|
-
- latest task-state / review summary:
|
|
175
|
-
- handoff entry for the next maintainer:
|
|
176
|
-
|
|
177
|
-
## Minimum Landing Pack
|
|
178
|
-
|
|
179
|
-
- Required for this mode:
|
|
180
|
-
- Intentionally omitted:
|
|
181
|
-
|
|
182
|
-
## How To Verify
|
|
183
|
-
|
|
184
|
-
- TBD
|
|
185
|
-
|
|
186
|
-
## Follow-Ups
|
|
187
|
-
|
|
188
|
-
- Current behavior:
|
|
189
|
-
- Desired behavior:
|
|
190
|
-
- Key interfaces:
|
|
191
|
-
- Acceptance criteria:
|
|
192
|
-
- Out of scope:
|
|
193
|
-
- Learning extraction target:
|
|
194
|
-
|
|
195
|
-
## Risks
|
|
196
|
-
|
|
197
|
-
- TBD
|
|
40
|
+
- <risk and rollback>
|
|
41
|
+
```
|
|
@@ -1,70 +1,19 @@
|
|
|
1
1
|
# Closure Contract
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
1. `report-card.json` 必须是 `pass`
|
|
6
|
-
2. `reroute` 必须是 `none`
|
|
7
|
-
3. `evidence` 必须非空
|
|
8
|
-
4. `planning/tasks.md` 不能还有未完成项
|
|
9
|
-
5. 交付材料必须只总结现实,不补编故事
|
|
10
|
-
6. 如果文件结构变了,就同步对应目录的 `CLAUDE.md`
|
|
11
|
-
7. PR / handoff 必须记录 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要
|
|
12
|
-
8. readiness dashboard 必须说明 review freshness、QA coverage、browser evidence、failure ownership、documentation release、PR body accuracy
|
|
13
|
-
9. behavior handoff 必须带上 QA feedback loop、expected / actual / reproduction steps,以及 durable follow-up brief
|
|
14
|
-
10. source RM 必须已从 `devflow/roadmap.json` 定位,且 roadmap progress 与 verified reality 一致;没有 source RM 时记录 no-op reason
|
|
15
|
-
11. `post-merge-closeout` 必须预先冻结 archive target;最终只能是已归档,或带 `ArchiveSkip` blocker 的未完成 closeout
|
|
16
|
-
|
|
17
|
-
## Ship Decision Contract
|
|
18
|
-
|
|
19
|
-
收尾动作必须归入且只归入下列模式之一:
|
|
20
|
-
|
|
21
|
-
1. `create-pr`
|
|
22
|
-
2. `update-pr`
|
|
23
|
-
3. `local-handoff`
|
|
24
|
-
4. `post-merge-closeout`
|
|
25
|
-
|
|
26
|
-
如果当前状态不属于这 4 类之一,说明事实还没搞清,不准继续 ship。
|
|
27
|
-
|
|
28
|
-
detached HEAD 是分支事实,不是第 5 种 ship 模式。若远端可用且用户目标是
|
|
29
|
-
继续 / 提交远程 PR,必须先运行 `scripts/ensure-ship-branch.sh --dir <requirement-dir>`
|
|
30
|
-
在当前 HEAD 创建命名分支,再回到 `create-pr` 流程。
|
|
31
|
-
|
|
32
|
-
## During Act
|
|
33
|
-
|
|
34
|
-
1. 如果 Act 阶段修改了代码、测试、验证口径,必须回 `cc-check`
|
|
35
|
-
2. 已存在 PR / MR 时优先更新,不重复创建
|
|
36
|
-
3. 文档不同构时,ship 不算完成
|
|
37
|
-
4. follow-up 只允许回写到系统真相源,不允许停留在聊天记录里
|
|
38
|
-
5. VERSION / package / changelog 漂移必须先分类处理,不能重复 bump 或覆盖发布历史
|
|
39
|
-
6. PR / MR body 必须从当前事实重建,不能沿用旧验证输出
|
|
40
|
-
7. push / PR 创建必须具备幂等检查:已同步则跳过,已存在 PR 则更新
|
|
41
|
-
8. 本地合并或 post-merge closeout 后必须在 merged result 上重跑必要 gate
|
|
42
|
-
9. 删除 branch、worktree、未合并提交、归档 requirement 前必须列出对象;丢弃未合并工作需要显式确认
|
|
43
|
-
10. verification 每次进入 `cc-act` 都必须重新跑;只有 push、PR 更新、文档生成等动作可以因为幂等状态跳过
|
|
44
|
-
11. PR body accuracy 必须对照当前 report-card、当前 diff、当前 commits;旧 body 不能作为证据源
|
|
45
|
-
12. follow-up 回写必须用行为契约表达,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不能只写文件路径或聊天 TODO
|
|
46
|
-
13. roadmap 回写只更新 `devflow/roadmap.json`,并通过 `sync-roadmap-progress.sh` 重新生成 `devflow/ROADMAP.md` / `devflow/BACKLOG.md`
|
|
47
|
-
14. `post-merge-closeout` 的归档必须真实执行:`cc-devflow archive-change <change-key>`,不能只把“可归档”写进 next action
|
|
48
|
-
|
|
49
|
-
## Memory Consolidation
|
|
50
|
-
|
|
51
|
-
进入 ship 动作前,先把分散事实压缩进:
|
|
3
|
+
## Allowed Durable Outputs
|
|
52
4
|
|
|
53
5
|
- `handoff/pr-brief.md`
|
|
54
|
-
- `
|
|
55
|
-
- `
|
|
6
|
+
- `devflow/postmortems/INDEX.md`
|
|
7
|
+
- `devflow/postmortems/incidents/<date>-<change-key>.md`
|
|
8
|
+
|
|
9
|
+
## Hard Rules
|
|
56
10
|
|
|
57
|
-
|
|
11
|
+
1. Git commits are the process record.
|
|
12
|
+
2. PR text is rebuilt from current commits, diff, `task.md`, and fresh validation.
|
|
13
|
+
3. Incident postmortems are factual and evidence-backed.
|
|
14
|
+
4. No process file beyond the allowed durable outputs.
|
|
15
|
+
5. If verification changes during Act, return to `cc-check`.
|
|
58
16
|
|
|
59
|
-
##
|
|
17
|
+
## Exit
|
|
60
18
|
|
|
61
|
-
|
|
62
|
-
- maintainer 知道怎么验证
|
|
63
|
-
- PR / handoff / release 材料反映同一套事实
|
|
64
|
-
- readiness dashboard 没有 blocker,PR body accuracy 已检查或明确阻塞
|
|
65
|
-
- QA behavior evidence 和 feedback loop 已进入 PR / handoff / release 材料
|
|
66
|
-
- post-merge closeout 反映 merged result 的验证事实,而不是只反映合并前事实
|
|
67
|
-
- source RM 的 status、REQ/FIX 绑定、progress 和 follow-up 已经落入 roadmap truth
|
|
68
|
-
- closed change 已经移动到 `devflow/changes/archive/YYYY-MM/<change-key>`;如果没有,必须有 `ArchiveSkip` blocker、原因、受影响路径和 retry command
|
|
69
|
-
- 下一轮计划入口更清楚
|
|
70
|
-
- 文档入口可发现,changelog 不丢历史,TODO / backlog 只记录有证据的事项
|
|
19
|
+
Close with commit hashes, validation commands, PR/handoff state, and any incident postmortem path.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
1. `git log --oneline` 能看懂变更类型和范围。
|
|
10
10
|
2. `git show` 能解释问题、取舍、验证和风险。
|
|
11
11
|
3. 每个 commit 边界足够小,后续可以独立 review、cherry-pick 或 revert。
|
|
12
|
-
4. PR body、
|
|
12
|
+
4. PR body、handoff 和 commit history 讲同一套事实。
|
|
13
13
|
5. 后续维护者不需要聊天记录,也能知道为什么这么改。
|
|
14
14
|
|
|
15
15
|
## Research Baseline
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
2. 改变用户可见行为、公共 API、CLI、schema、prompt、skill contract、验证脚本或发布流程。
|
|
66
66
|
3. 修 bug、回归、flaky、性能、安全、权限、数据一致性或 trust boundary。
|
|
67
67
|
4. 引入或改变测试策略、mock 边界、fixture、golden artifact。
|
|
68
|
-
5. 触碰 roadmap /
|
|
69
|
-
6.
|
|
68
|
+
5. 触碰 roadmap / task.md / PR brief / handoff 等 durable artifact。
|
|
69
|
+
6. 有兼容性、迁移、回滚或 follow-up 风险。
|
|
70
70
|
|
|
71
71
|
单行 commit 仅适合:
|
|
72
72
|
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
- <影响范围和回滚路径>
|
|
157
157
|
|
|
158
158
|
关联:
|
|
159
|
-
- <FIX/issue/
|
|
159
|
+
- <FIX/issue/root-cause/verification evidence>
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
### `refactor`
|
|
@@ -383,6 +383,6 @@ fix(auth): 拒绝过期 refresh token
|
|
|
383
383
|
5. `fix` commit 是否写了 `根因`,且不是只描述 symptom。
|
|
384
384
|
6. `验证` 是否是实际命令 / artifact / explicit skip reason,而不是 “tested locally”。
|
|
385
385
|
7. footer 是否使用 trailer 风格,issue closing keyword 是否符合目标平台语义。
|
|
386
|
-
8. push、PR body、
|
|
386
|
+
8. push、PR body、handoff 是否与最终 commit history 表达同一套事实。
|
|
387
387
|
|
|
388
388
|
如果无法满足这些条件,停在 `local-handoff` 或 reroute,不要制造粗糙历史。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
3
|
# ------------------------------------------------------------
|
|
4
|
-
# cc-act:
|
|
4
|
+
# cc-act: task.md + pr-brief path helpers
|
|
5
5
|
# ------------------------------------------------------------
|
|
6
6
|
|
|
7
7
|
req_act_change_dir() {
|
|
@@ -9,7 +9,7 @@ req_act_change_dir() {
|
|
|
9
9
|
local normalized="${input%/}"
|
|
10
10
|
|
|
11
11
|
case "$(basename "$normalized")" in
|
|
12
|
-
|
|
12
|
+
handoff)
|
|
13
13
|
dirname "$normalized"
|
|
14
14
|
;;
|
|
15
15
|
*)
|
|
@@ -18,335 +18,18 @@ req_act_change_dir() {
|
|
|
18
18
|
esac
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
req_act_planning_dir() {
|
|
22
|
-
printf '%s/planning\n' "$(req_act_change_dir "$1")"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
req_act_review_dir() {
|
|
26
|
-
printf '%s/review\n' "$(req_act_change_dir "$1")"
|
|
27
|
-
}
|
|
28
|
-
|
|
29
21
|
req_act_handoff_dir() {
|
|
30
22
|
printf '%s/handoff\n' "$(req_act_change_dir "$1")"
|
|
31
23
|
}
|
|
32
24
|
|
|
33
|
-
req_act_manifest_path() {
|
|
34
|
-
printf '%s/task-manifest.json\n' "$(req_act_planning_dir "$1")"
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
req_act_change_meta_path() {
|
|
38
|
-
printf '%s/change-meta.json\n' "$(req_act_change_dir "$1")"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
25
|
req_act_tasks_path() {
|
|
42
|
-
printf '%s/
|
|
26
|
+
printf '%s/task.md\n' "$(req_act_change_dir "$1")"
|
|
43
27
|
}
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
local design_file
|
|
48
|
-
local analysis_file
|
|
49
|
-
|
|
50
|
-
planning_dir="$(req_act_planning_dir "$1")"
|
|
51
|
-
design_file="$planning_dir/design.md"
|
|
52
|
-
analysis_file="$planning_dir/analysis.md"
|
|
53
|
-
|
|
54
|
-
if [[ -f "$analysis_file" && ! -f "$design_file" ]]; then
|
|
55
|
-
printf '%s\n' "$analysis_file"
|
|
56
|
-
return 0
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
printf '%s\n' "$design_file"
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
req_act_report_path() {
|
|
63
|
-
printf '%s/report-card.json\n' "$(req_act_review_dir "$1")"
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
req_act_release_note_path() {
|
|
67
|
-
printf '%s/release-note.md\n' "$(req_act_handoff_dir "$1")"
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
req_act_resume_index_path() {
|
|
71
|
-
printf '%s/resume-index.md\n' "$(req_act_handoff_dir "$1")"
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
req_act_doc_sync_report_path() {
|
|
75
|
-
printf '%s/doc-sync-report.md\n' "$(req_act_handoff_dir "$1")"
|
|
29
|
+
req_act_pr_brief_path() {
|
|
30
|
+
printf '%s/pr-brief.md\n' "$(req_act_handoff_dir "$1")"
|
|
76
31
|
}
|
|
77
32
|
|
|
78
33
|
req_act_repo_root() {
|
|
79
34
|
git rev-parse --show-toplevel 2>/dev/null || pwd
|
|
80
35
|
}
|
|
81
|
-
|
|
82
|
-
req_act_requirement_id() {
|
|
83
|
-
local manifest="$1"
|
|
84
|
-
local req_dir="$2"
|
|
85
|
-
local requirement_id=""
|
|
86
|
-
|
|
87
|
-
requirement_id="$(jq -r '.requirementId // .changeId // empty' "$manifest" 2>/dev/null || true)"
|
|
88
|
-
if [[ -z "$requirement_id" ]]; then
|
|
89
|
-
requirement_id="$(basename "$req_dir")"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
printf '%s\n' "$requirement_id"
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
req_act_report_summary() {
|
|
96
|
-
local report_card="$1"
|
|
97
|
-
jq -r '.summary // ""' "$report_card" 2>/dev/null || true
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
req_act_report_verdict() {
|
|
101
|
-
local report_card="$1"
|
|
102
|
-
jq -r '.verdict // "unknown"' "$report_card" 2>/dev/null || echo unknown
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
req_act_spec_sync_ready() {
|
|
106
|
-
local report_card="$1"
|
|
107
|
-
jq -r '.specSyncReady // false' "$report_card" 2>/dev/null || echo false
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
req_act_output_language() {
|
|
111
|
-
local report_card="$1"
|
|
112
|
-
jq -r '.outputPolicy.documentLanguage // "en"' "$report_card" 2>/dev/null || echo en
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
req_act_design_goal() {
|
|
116
|
-
local design_file="$1"
|
|
117
|
-
awk -F': ' '/^- Deliver:/{print $2; exit} /^- Change:/{print $2; exit}' "$design_file" 2>/dev/null || true
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
req_act_main_risk() {
|
|
121
|
-
local design_file="$1"
|
|
122
|
-
local risk=""
|
|
123
|
-
|
|
124
|
-
risk="$(awk -F': ' '/^- Main risk:/{print $2; exit}' "$design_file" 2>/dev/null || true)"
|
|
125
|
-
if [[ -n "$risk" ]]; then
|
|
126
|
-
printf '%s\n' "$risk"
|
|
127
|
-
return 0
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
awk -F'|' '
|
|
131
|
-
/^\|/ {
|
|
132
|
-
risk=$2
|
|
133
|
-
gsub(/^[[:space:]]+|[[:space:]]+$/, "", risk)
|
|
134
|
-
if (risk != "" && risk != "Risk" && risk !~ /^-+$/) {
|
|
135
|
-
print risk
|
|
136
|
-
exit
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
' "$design_file" 2>/dev/null || true
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
req_act_dedup_file() {
|
|
143
|
-
local file="$1"
|
|
144
|
-
awk 'NF && !seen[$0]++' "$file" > "${file}.dedup"
|
|
145
|
-
mv "${file}.dedup" "$file"
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
req_act_collect_completed_titles() {
|
|
149
|
-
local manifest="$1"
|
|
150
|
-
local tasks_file="$2"
|
|
151
|
-
local out_file="$3"
|
|
152
|
-
|
|
153
|
-
: > "$out_file"
|
|
154
|
-
|
|
155
|
-
if [[ -f "$manifest" ]]; then
|
|
156
|
-
jq -r '
|
|
157
|
-
(.tasks // [])
|
|
158
|
-
| map(select((.status // "") | test("done|completed"; "i")))
|
|
159
|
-
| .[]
|
|
160
|
-
| .title // empty
|
|
161
|
-
' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
162
|
-
fi
|
|
163
|
-
|
|
164
|
-
if [[ ! -s "$out_file" && -f "$tasks_file" ]]; then
|
|
165
|
-
awk '/^- \[[xX]\] /{sub(/^- \[[xX]\] /, "", $0); print}' "$tasks_file" > "$out_file" || true
|
|
166
|
-
fi
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
req_act_collect_verification_commands() {
|
|
170
|
-
local manifest="$1"
|
|
171
|
-
local out_file="$2"
|
|
172
|
-
|
|
173
|
-
: > "$out_file"
|
|
174
|
-
|
|
175
|
-
if [[ -f "$manifest" ]]; then
|
|
176
|
-
jq -r '
|
|
177
|
-
(.tasks // [])
|
|
178
|
-
| map(.verification // [])
|
|
179
|
-
| add
|
|
180
|
-
| .[]?
|
|
181
|
-
' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
182
|
-
fi
|
|
183
|
-
|
|
184
|
-
req_act_dedup_file "$out_file"
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
req_act_collect_followups() {
|
|
188
|
-
local report_card="$1"
|
|
189
|
-
local manifest="$2"
|
|
190
|
-
local out_file="$3"
|
|
191
|
-
|
|
192
|
-
: > "$out_file"
|
|
193
|
-
|
|
194
|
-
if [[ -f "$report_card" ]]; then
|
|
195
|
-
jq -r '(.gaps // [])[]?' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
196
|
-
jq -r '
|
|
197
|
-
(.followupBriefs // .review.followupBriefs // [])[]?
|
|
198
|
-
| [
|
|
199
|
-
("summary: " + (.summary // .title // "follow-up")),
|
|
200
|
-
("current: " + (.currentBehavior // "not recorded")),
|
|
201
|
-
("desired: " + (.desiredBehavior // "not recorded")),
|
|
202
|
-
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
203
|
-
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
204
|
-
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
205
|
-
]
|
|
206
|
-
| join(" | ")
|
|
207
|
-
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
208
|
-
jq -r '
|
|
209
|
-
(.qa.architectureFollowUps // [])[]?
|
|
210
|
-
| [
|
|
211
|
-
("summary: " + (.summary // .title // "architecture follow-up")),
|
|
212
|
-
("current: " + (.currentBehavior // "not recorded")),
|
|
213
|
-
("desired: " + (.desiredBehavior // "not recorded")),
|
|
214
|
-
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
215
|
-
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
216
|
-
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
217
|
-
]
|
|
218
|
-
| join(" | ")
|
|
219
|
-
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
220
|
-
fi
|
|
221
|
-
|
|
222
|
-
if [[ -f "$manifest" ]]; then
|
|
223
|
-
jq -r '(.openQuestions // [])[]?, (.deferredQuestions // [])[]?' "$manifest" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
224
|
-
fi
|
|
225
|
-
|
|
226
|
-
req_act_dedup_file "$out_file"
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
req_act_collect_touched_files() {
|
|
230
|
-
local manifest="$1"
|
|
231
|
-
local out_file="$2"
|
|
232
|
-
|
|
233
|
-
: > "$out_file"
|
|
234
|
-
|
|
235
|
-
if [[ -f "$manifest" ]]; then
|
|
236
|
-
jq -r '
|
|
237
|
-
(.tasks // [])
|
|
238
|
-
| map((.files // []) + (.touches // []))
|
|
239
|
-
| add
|
|
240
|
-
| .[]?
|
|
241
|
-
' "$manifest" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
242
|
-
fi
|
|
243
|
-
|
|
244
|
-
req_act_dedup_file "$out_file"
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
req_act_collect_spec_files() {
|
|
248
|
-
local manifest="$1"
|
|
249
|
-
local out_file="$2"
|
|
250
|
-
local change_dir=""
|
|
251
|
-
local change_meta=""
|
|
252
|
-
|
|
253
|
-
: > "$out_file"
|
|
254
|
-
|
|
255
|
-
if [[ -f "$manifest" ]]; then
|
|
256
|
-
change_dir="$(req_act_change_dir "$(dirname "$manifest")")"
|
|
257
|
-
change_meta="$(req_act_change_meta_path "$change_dir")"
|
|
258
|
-
fi
|
|
259
|
-
|
|
260
|
-
if [[ -n "$change_meta" && -f "$change_meta" ]]; then
|
|
261
|
-
jq -r '(.spec.specFiles // [])[]?' "$change_meta" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
262
|
-
fi
|
|
263
|
-
|
|
264
|
-
if [[ -f "$manifest" ]]; then
|
|
265
|
-
jq -r '(.spec.specFiles // [])[]?' "$manifest" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
266
|
-
fi
|
|
267
|
-
|
|
268
|
-
req_act_dedup_file "$out_file"
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
req_act_roadmap_sync_summary() {
|
|
272
|
-
local manifest="$1"
|
|
273
|
-
local repo_root="${2:-$(req_act_repo_root)}"
|
|
274
|
-
local item_id=""
|
|
275
|
-
local sync_status=""
|
|
276
|
-
local sync_command=""
|
|
277
|
-
local no_op_reason=""
|
|
278
|
-
local updated_files=""
|
|
279
|
-
local existing_files=""
|
|
280
|
-
local change_dir=""
|
|
281
|
-
local change_meta=""
|
|
282
|
-
|
|
283
|
-
if [[ -f "$manifest" ]]; then
|
|
284
|
-
change_dir="$(req_act_change_dir "$(dirname "$manifest")")"
|
|
285
|
-
change_meta="$(req_act_change_meta_path "$change_dir")"
|
|
286
|
-
fi
|
|
287
|
-
|
|
288
|
-
if [[ -n "$change_meta" && -f "$change_meta" ]]; then
|
|
289
|
-
item_id="$(jq -r '.sourceRoadmap.itemId // empty' "$change_meta" 2>/dev/null || true)"
|
|
290
|
-
sync_status="$(jq -r '.roadmapSync.status // .sourceRoadmap.syncStatus // "not recorded"' "$change_meta" 2>/dev/null || true)"
|
|
291
|
-
sync_command="$(jq -r '.roadmapSync.command // .sourceRoadmap.syncCommand // empty' "$change_meta" 2>/dev/null || true)"
|
|
292
|
-
no_op_reason="$(jq -r '.roadmapSync.noOpReason // .sourceRoadmap.noOpReason // empty' "$change_meta" 2>/dev/null || true)"
|
|
293
|
-
updated_files="$(jq -r '(.roadmapSync.updatedFiles // .sourceRoadmap.updatedFiles // []) | join(", ")' "$change_meta" 2>/dev/null || true)"
|
|
294
|
-
elif [[ -f "$manifest" ]]; then
|
|
295
|
-
item_id="$(jq -r '.sourceRoadmap.itemId // empty' "$manifest" 2>/dev/null || true)"
|
|
296
|
-
sync_status="$(jq -r '.sourceRoadmap.syncStatus // .roadmapSync.status // "not recorded"' "$manifest" 2>/dev/null || true)"
|
|
297
|
-
sync_command="$(jq -r '.sourceRoadmap.syncCommand // .roadmapSync.command // empty' "$manifest" 2>/dev/null || true)"
|
|
298
|
-
no_op_reason="$(jq -r '.sourceRoadmap.noOpReason // .roadmapSync.noOpReason // empty' "$manifest" 2>/dev/null || true)"
|
|
299
|
-
updated_files="$(jq -r '(.sourceRoadmap.updatedFiles // .roadmapSync.updatedFiles // []) | join(", ")' "$manifest" 2>/dev/null || true)"
|
|
300
|
-
fi
|
|
301
|
-
|
|
302
|
-
for candidate in devflow/roadmap.json devflow/ROADMAP.md devflow/BACKLOG.md devflow/roadmap-tracking.json; do
|
|
303
|
-
if [[ -f "$repo_root/$candidate" ]]; then
|
|
304
|
-
if [[ -n "$existing_files" ]]; then
|
|
305
|
-
existing_files+=", "
|
|
306
|
-
fi
|
|
307
|
-
existing_files+="$candidate"
|
|
308
|
-
fi
|
|
309
|
-
done
|
|
310
|
-
|
|
311
|
-
[[ -n "$existing_files" ]] || existing_files="no roadmap files found"
|
|
312
|
-
[[ -n "$updated_files" ]] || updated_files="not recorded"
|
|
313
|
-
[[ -n "$sync_command" ]] || sync_command="not recorded"
|
|
314
|
-
[[ -n "$sync_status" ]] || sync_status="not recorded"
|
|
315
|
-
|
|
316
|
-
if [[ -z "$item_id" ]]; then
|
|
317
|
-
[[ -n "$no_op_reason" ]] || no_op_reason="no-source-rm"
|
|
318
|
-
printf 'source=none; status=no-op; files=%s; no-op=%s\n' "$existing_files" "$no_op_reason"
|
|
319
|
-
return 0
|
|
320
|
-
fi
|
|
321
|
-
|
|
322
|
-
printf 'source=%s; status=%s; files=%s; updated=%s; command=%s' \
|
|
323
|
-
"$item_id" "$sync_status" "$existing_files" "$updated_files" "$sync_command"
|
|
324
|
-
|
|
325
|
-
if [[ -n "$no_op_reason" ]]; then
|
|
326
|
-
printf '; no-op=%s' "$no_op_reason"
|
|
327
|
-
fi
|
|
328
|
-
|
|
329
|
-
printf '\n'
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
req_act_collect_evidence() {
|
|
333
|
-
local report_card="$1"
|
|
334
|
-
local out_file="$2"
|
|
335
|
-
|
|
336
|
-
: > "$out_file"
|
|
337
|
-
jq -r '
|
|
338
|
-
(.evidence // [])[]?,
|
|
339
|
-
((.claimEvidence // [])[]? | "- " + (.claim // "claim") + ": " + (.status // "unknown") + " via " + (.commandOrArtifact // "artifact") + " - " + (.keyObservation // "")),
|
|
340
|
-
(if .qa.coverageAudit then "- qa.coverage: " + (.qa.coverageAudit.status // "unknown") + ", gaps=" + (((.qa.coverageAudit.gaps // []) | length) | tostring) else empty end),
|
|
341
|
-
(if .qa.browserEvidence then "- qa.browser: " + (.qa.browserEvidence.status // "unknown") + ", mode=" + (.qa.browserEvidence.mode // "unknown") else empty end),
|
|
342
|
-
(if .qa.feedbackLoop then "- qa.feedbackLoop: " + (.qa.feedbackLoop.status // "unknown") + ", mode=" + (.qa.feedbackLoop.mode // "unknown") + ", signal=" + (.qa.feedbackLoop.signalSharpness // "not recorded") else empty end),
|
|
343
|
-
(if .qa.behaviorEvidence then "- qa.behavior: " + (.qa.behaviorEvidence.status // "unknown") + ", expected=" + (.qa.behaviorEvidence.expectedBehavior // "not recorded") + ", actual=" + (.qa.behaviorEvidence.actualBehavior // "not recorded") else empty end)
|
|
344
|
-
' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
345
|
-
req_act_dedup_file "$out_file"
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
req_act_ship_field() {
|
|
349
|
-
local ship_context="$1"
|
|
350
|
-
local key="$2"
|
|
351
|
-
printf '%s\n' "$ship_context" | awk -F= -v key="$key" '$1 == key {print substr($0, index($0, "=") + 1)}'
|
|
352
|
-
}
|