@devcxl/opencode-cabbage 0.3.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +34 -19
  2. package/README.zh.md +34 -19
  3. package/assets/agents/dev-lifecycle.md +60 -41
  4. package/assets/agents/team/architect.md +36 -1
  5. package/assets/agents/team/developer.md +89 -0
  6. package/assets/agents/team/goal-verify.md +5 -1
  7. package/assets/agents/team/reviewer.md +42 -1
  8. package/assets/commands/code.md +3 -2
  9. package/assets/commands/design.md +3 -2
  10. package/assets/commands/release.md +3 -2
  11. package/assets/commands/requirements.md +3 -2
  12. package/assets/commands/review.md +3 -2
  13. package/assets/commands/setup.md +3 -2
  14. package/assets/commands/tasks.md +2 -1
  15. package/assets/prompts/bootstrap.md +9 -8
  16. package/assets/prompts/stage-contract.md +55 -0
  17. package/assets/skills/flow-code/SKILL.md +38 -140
  18. package/assets/skills/flow-design/SKILL.md +33 -74
  19. package/assets/skills/flow-release/SKILL.md +31 -51
  20. package/assets/skills/flow-requirements/SKILL.md +47 -45
  21. package/assets/skills/flow-review/SKILL.md +26 -112
  22. package/assets/skills/flow-setup/SKILL.md +40 -43
  23. package/assets/skills/flow-tasks/SKILL.md +30 -139
  24. package/assets/skills/flow-tdd/SKILL.md +30 -31
  25. package/dist/kernel/caller.d.ts +48 -0
  26. package/dist/kernel/caller.js +88 -0
  27. package/dist/kernel/caller.js.map +1 -0
  28. package/dist/kernel/context.d.ts +27 -0
  29. package/dist/kernel/context.js +73 -0
  30. package/dist/kernel/context.js.map +1 -0
  31. package/dist/kernel/flow.d.ts +166 -0
  32. package/dist/kernel/flow.js +387 -0
  33. package/dist/kernel/flow.js.map +1 -0
  34. package/dist/kernel/legacy.d.ts +19 -0
  35. package/dist/kernel/legacy.js +34 -0
  36. package/dist/kernel/legacy.js.map +1 -0
  37. package/dist/kernel/mutex.d.ts +8 -0
  38. package/dist/kernel/mutex.js +23 -0
  39. package/dist/kernel/mutex.js.map +1 -0
  40. package/dist/kernel/permission.d.ts +21 -0
  41. package/dist/kernel/permission.js +37 -0
  42. package/dist/kernel/permission.js.map +1 -0
  43. package/dist/kernel/profile.d.ts +35 -0
  44. package/dist/kernel/profile.js +144 -0
  45. package/dist/kernel/profile.js.map +1 -0
  46. package/dist/kernel/records.d.ts +87 -0
  47. package/dist/kernel/records.js +197 -0
  48. package/dist/kernel/records.js.map +1 -0
  49. package/dist/kernel/release.d.ts +104 -0
  50. package/dist/kernel/release.js +229 -0
  51. package/dist/kernel/release.js.map +1 -0
  52. package/dist/kernel/review.d.ts +34 -0
  53. package/dist/kernel/review.js +81 -0
  54. package/dist/kernel/review.js.map +1 -0
  55. package/dist/kernel/session-index.d.ts +43 -0
  56. package/dist/kernel/session-index.js +120 -0
  57. package/dist/kernel/session-index.js.map +1 -0
  58. package/dist/kernel/setup.d.ts +70 -0
  59. package/dist/kernel/setup.js +324 -0
  60. package/dist/kernel/setup.js.map +1 -0
  61. package/dist/kernel/slug.d.ts +23 -0
  62. package/dist/kernel/slug.js +67 -0
  63. package/dist/kernel/slug.js.map +1 -0
  64. package/dist/kernel/task.d.ts +208 -0
  65. package/dist/kernel/task.js +788 -0
  66. package/dist/kernel/task.js.map +1 -0
  67. package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
  68. package/dist/kernel/tdd/adapter.js.map +1 -0
  69. package/dist/{flowrun → kernel/tdd}/digest.d.ts +1 -1
  70. package/dist/kernel/tdd/digest.js.map +1 -0
  71. package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
  72. package/dist/kernel/tdd/evaluator.js.map +1 -0
  73. package/dist/kernel/tdd/evidence.d.ts +42 -0
  74. package/dist/kernel/tdd/evidence.js +48 -0
  75. package/dist/kernel/tdd/evidence.js.map +1 -0
  76. package/dist/{flowrun → kernel/tdd}/state.d.ts +1 -1
  77. package/dist/kernel/tdd/state.js.map +1 -0
  78. package/dist/kernel/types.d.ts +180 -0
  79. package/dist/kernel/types.js +2 -0
  80. package/dist/kernel/types.js.map +1 -0
  81. package/dist/kernel/worktree.d.ts +45 -0
  82. package/dist/kernel/worktree.js +127 -0
  83. package/dist/kernel/worktree.js.map +1 -0
  84. package/dist/plugin/agents.d.ts +5 -17
  85. package/dist/plugin/agents.js +0 -23
  86. package/dist/plugin/agents.js.map +1 -1
  87. package/dist/plugin/flow-control.d.ts +80 -0
  88. package/dist/plugin/flow-control.js +254 -0
  89. package/dist/plugin/flow-control.js.map +1 -0
  90. package/dist/plugin/goal.d.ts +7 -46
  91. package/dist/plugin/goal.js +32 -116
  92. package/dist/plugin/goal.js.map +1 -1
  93. package/dist/plugin/prompt-lint.js +78 -5
  94. package/dist/plugin/prompt-lint.js.map +1 -1
  95. package/dist/plugin/release-control.d.ts +37 -0
  96. package/dist/plugin/release-control.js +304 -0
  97. package/dist/plugin/release-control.js.map +1 -0
  98. package/dist/plugin/server.d.ts +19 -0
  99. package/dist/plugin/server.js +147 -302
  100. package/dist/plugin/server.js.map +1 -1
  101. package/dist/plugin/setup-control.d.ts +45 -0
  102. package/dist/plugin/setup-control.js +80 -0
  103. package/dist/plugin/setup-control.js.map +1 -0
  104. package/dist/plugin/shell.d.ts +7 -34
  105. package/dist/plugin/shell.js +12 -137
  106. package/dist/plugin/shell.js.map +1 -1
  107. package/dist/plugin/skills.d.ts +1 -1
  108. package/dist/plugin/skills.js +16 -17
  109. package/dist/plugin/skills.js.map +1 -1
  110. package/dist/plugin/task-control.d.ts +90 -0
  111. package/dist/plugin/task-control.js +201 -0
  112. package/dist/plugin/task-control.js.map +1 -0
  113. package/dist/plugin/tdd-checkpoint.d.ts +118 -0
  114. package/dist/plugin/tdd-checkpoint.js +581 -0
  115. package/dist/plugin/tdd-checkpoint.js.map +1 -0
  116. package/dist/util/paths.d.ts +0 -2
  117. package/dist/util/paths.js +1 -7
  118. package/dist/util/paths.js.map +1 -1
  119. package/package.json +1 -1
  120. package/assets/agents/team/backend.md +0 -66
  121. package/assets/agents/team/frontend.md +0 -63
  122. package/assets/commands/handoff.md +0 -4
  123. package/assets/commands/test.md +0 -4
  124. package/assets/context/CONTEXT.md +0 -40
  125. package/assets/skills/flow-handoff/SKILL.md +0 -76
  126. package/assets/skills/flow-requirements/references/interview-guide.md +0 -35
  127. package/assets/skills/flow-test/SKILL.md +0 -75
  128. package/dist/flowrun/adapter.js.map +0 -1
  129. package/dist/flowrun/audit.d.ts +0 -5
  130. package/dist/flowrun/audit.js +0 -67
  131. package/dist/flowrun/audit.js.map +0 -1
  132. package/dist/flowrun/ci.d.ts +0 -64
  133. package/dist/flowrun/ci.js +0 -184
  134. package/dist/flowrun/ci.js.map +0 -1
  135. package/dist/flowrun/coverage.d.ts +0 -70
  136. package/dist/flowrun/coverage.js +0 -207
  137. package/dist/flowrun/coverage.js.map +0 -1
  138. package/dist/flowrun/digest.js.map +0 -1
  139. package/dist/flowrun/evaluator.js.map +0 -1
  140. package/dist/flowrun/gate.d.ts +0 -28
  141. package/dist/flowrun/gate.js +0 -139
  142. package/dist/flowrun/gate.js.map +0 -1
  143. package/dist/flowrun/github.d.ts +0 -24
  144. package/dist/flowrun/github.js +0 -154
  145. package/dist/flowrun/github.js.map +0 -1
  146. package/dist/flowrun/index.d.ts +0 -14
  147. package/dist/flowrun/index.js +0 -15
  148. package/dist/flowrun/index.js.map +0 -1
  149. package/dist/flowrun/merge.d.ts +0 -57
  150. package/dist/flowrun/merge.js +0 -180
  151. package/dist/flowrun/merge.js.map +0 -1
  152. package/dist/flowrun/migration.d.ts +0 -11
  153. package/dist/flowrun/migration.js +0 -276
  154. package/dist/flowrun/migration.js.map +0 -1
  155. package/dist/flowrun/resilience.d.ts +0 -18
  156. package/dist/flowrun/resilience.js +0 -80
  157. package/dist/flowrun/resilience.js.map +0 -1
  158. package/dist/flowrun/state.js.map +0 -1
  159. package/dist/flowrun/transitions.d.ts +0 -66
  160. package/dist/flowrun/transitions.js +0 -168
  161. package/dist/flowrun/transitions.js.map +0 -1
  162. package/dist/flowrun/types.d.ts +0 -356
  163. package/dist/flowrun/types.js +0 -21
  164. package/dist/flowrun/types.js.map +0 -1
  165. package/dist/flowrun/validator.d.ts +0 -19
  166. package/dist/flowrun/validator.js +0 -209
  167. package/dist/flowrun/validator.js.map +0 -1
  168. package/dist/plugin/broker.d.ts +0 -73
  169. package/dist/plugin/broker.js +0 -140
  170. package/dist/plugin/broker.js.map +0 -1
  171. package/dist/plugin/tdd-tool.d.ts +0 -62
  172. package/dist/plugin/tdd-tool.js +0 -336
  173. package/dist/plugin/tdd-tool.js.map +0 -1
  174. /package/dist/{flowrun → kernel/tdd}/adapter.js +0 -0
  175. /package/dist/{flowrun → kernel/tdd}/digest.js +0 -0
  176. /package/dist/{flowrun → kernel/tdd}/evaluator.js +0 -0
  177. /package/dist/{flowrun → kernel/tdd}/state.js +0 -0
@@ -1,73 +0,0 @@
1
- import type { FlowRun } from "../flowrun/types.js";
2
- export interface BrokerCredentials {
3
- /** 独立 GitHub API token(不传入 Agent shell) */
4
- token: string;
5
- }
6
- export interface MutateResult<R> {
7
- flowRun: FlowRun;
8
- result: R;
9
- shouldPersist: boolean;
10
- }
11
- export type WriteResult<R> = {
12
- ok: true;
13
- flowRun: FlowRun;
14
- result: R;
15
- persisted: boolean;
16
- } | {
17
- ok: false;
18
- code: "PERSIST_CONFLICT" | "READ_FAILED";
19
- message: string;
20
- };
21
- /**
22
- * 单进程 broker,负责:
23
- * 1. 按 parentIssueNumber 的 keyed mutex 串行所有 FlowRun 写入
24
- * 2. read-modify-write 循环(乐观锁)
25
- * 3. 检测外部 body 变化 → PERSIST_CONFLICT
26
- * 4. 持有独立 GitHub API 凭证,Agent shell 不可访问
27
- *
28
- * 所有 FlowRun/Task/Evidence 写入必须经过 broker,不直接暴露 GitHub API。
29
- *
30
- * 凭证安全:credentials 存储在闭包变量中,不挂载在 this 上,
31
- * JSON.stringify / Object.keys 无法访问。
32
- */
33
- export declare class FlowBroker {
34
- #private;
35
- private mutex;
36
- /**
37
- * @param credentials 可选。独立 GitHub API 凭证。
38
- * 传入时:所有 gh 操作使用该 token,而非 ambient 环境。
39
- * 不传时:降级使用 ambient 环境变量(GH_TOKEN etc.)。
40
- */
41
- constructor(credentials?: BrokerCredentials);
42
- /**
43
- * 获取凭证对应的环境变量覆盖(仅内部使用)。
44
- * 返回 undefined 表示无独立凭证,应使用 ambient 环境。
45
- */
46
- private get ghEnv();
47
- /**
48
- * 验证 broker 持有的 GitHub 凭证是否有效。
49
- *
50
- * 调用 `gh auth status` 检查 token 可用性。
51
- * 无凭证时返回 ok: false。
52
- */
53
- verifyCredentials(): Promise<{
54
- ok: boolean;
55
- message: string;
56
- }>;
57
- /**
58
- * 将操作加入 keyed mutex 队列。
59
- *
60
- * 用于需要串行化但对 FlowRun 无影响的通用操作。
61
- */
62
- enqueue<T>(parentIssueNumber: number, op: () => Promise<T>): Promise<T>;
63
- /**
64
- * read-modify-write 循环:读取 FlowRun → 应用 handler 变更 → 乐观锁写回。
65
- *
66
- * - handler 返回 { flowRun, result, shouldPersist }
67
- * - shouldPersist=false 时跳过写入(如校验失败)
68
- * - 自动增加 revision 和时间戳
69
- * - body 不匹配时返回 PERSIST_CONFLICT
70
- * - 使用 broker 独立凭证执行 gh 操作
71
- */
72
- writeFlowRunWithLock<R>(issueNumber: number, handler: (flowRun: FlowRun) => MutateResult<R>): Promise<WriteResult<R>>;
73
- }
@@ -1,140 +0,0 @@
1
- import { readFlowRunWithLock, writeFlowRunWithLock as ghWriteFlowRunWithLock } from "../flowrun/github.js";
2
- // ─── Keyed Mutex ───
3
- /**
4
- * 按 key 隔离的互斥锁,用于单进程内串行化并发操作。
5
- *
6
- * 每个 key(parentIssueNumber)维护独立的 promise 链,
7
- * 相同 key 的操作依次执行,不同 key 的操作可以并行。
8
- */
9
- class KeyedMutex {
10
- locks = new Map();
11
- async runExclusive(key, fn) {
12
- const prev = this.locks.get(key) ?? Promise.resolve();
13
- let release;
14
- const next = new Promise(r => {
15
- release = r;
16
- });
17
- this.locks.set(key, next);
18
- await prev;
19
- try {
20
- return await fn();
21
- }
22
- finally {
23
- release();
24
- }
25
- }
26
- }
27
- // ─── FlowBroker ───
28
- /**
29
- * 单进程 broker,负责:
30
- * 1. 按 parentIssueNumber 的 keyed mutex 串行所有 FlowRun 写入
31
- * 2. read-modify-write 循环(乐观锁)
32
- * 3. 检测外部 body 变化 → PERSIST_CONFLICT
33
- * 4. 持有独立 GitHub API 凭证,Agent shell 不可访问
34
- *
35
- * 所有 FlowRun/Task/Evidence 写入必须经过 broker,不直接暴露 GitHub API。
36
- *
37
- * 凭证安全:credentials 存储在闭包变量中,不挂载在 this 上,
38
- * JSON.stringify / Object.keys 无法访问。
39
- */
40
- export class FlowBroker {
41
- mutex = new KeyedMutex();
42
- #credentials;
43
- /**
44
- * @param credentials 可选。独立 GitHub API 凭证。
45
- * 传入时:所有 gh 操作使用该 token,而非 ambient 环境。
46
- * 不传时:降级使用 ambient 环境变量(GH_TOKEN etc.)。
47
- */
48
- constructor(credentials) {
49
- this.#credentials = credentials ?? null;
50
- }
51
- /**
52
- * 获取凭证对应的环境变量覆盖(仅内部使用)。
53
- * 返回 undefined 表示无独立凭证,应使用 ambient 环境。
54
- */
55
- get ghEnv() {
56
- if (!this.#credentials)
57
- return undefined;
58
- return {
59
- GH_TOKEN: this.#credentials.token,
60
- GITHUB_TOKEN: this.#credentials.token,
61
- };
62
- }
63
- /**
64
- * 验证 broker 持有的 GitHub 凭证是否有效。
65
- *
66
- * 调用 `gh auth status` 检查 token 可用性。
67
- * 无凭证时返回 ok: false。
68
- */
69
- async verifyCredentials() {
70
- if (!this.#credentials) {
71
- return { ok: false, message: "No broker credentials configured" };
72
- }
73
- try {
74
- const { gh } = await import("../util/gh.js");
75
- await gh("auth status", 15_000, this.ghEnv);
76
- return { ok: true, message: "Broker credentials are valid" };
77
- }
78
- catch (err) {
79
- return { ok: false, message: `Broker credentials verification failed: ${String(err)}` };
80
- }
81
- }
82
- /**
83
- * 将操作加入 keyed mutex 队列。
84
- *
85
- * 用于需要串行化但对 FlowRun 无影响的通用操作。
86
- */
87
- async enqueue(parentIssueNumber, op) {
88
- return this.mutex.runExclusive(parentIssueNumber, op);
89
- }
90
- /**
91
- * read-modify-write 循环:读取 FlowRun → 应用 handler 变更 → 乐观锁写回。
92
- *
93
- * - handler 返回 { flowRun, result, shouldPersist }
94
- * - shouldPersist=false 时跳过写入(如校验失败)
95
- * - 自动增加 revision 和时间戳
96
- * - body 不匹配时返回 PERSIST_CONFLICT
97
- * - 使用 broker 独立凭证执行 gh 操作
98
- */
99
- async writeFlowRunWithLock(issueNumber, handler) {
100
- return this.mutex.runExclusive(issueNumber, async () => {
101
- // ── 读取(broker 凭证) ──
102
- const { flowRunResult, currentBody } = await readFlowRunWithLock(issueNumber, this.ghEnv);
103
- if (!flowRunResult.ok || currentBody === null) {
104
- return {
105
- ok: false,
106
- code: "READ_FAILED",
107
- message: `Failed to read FlowRun from issue #${issueNumber}: ${flowRunResult.ok ? "missing body" : flowRunResult.code}`,
108
- };
109
- }
110
- // ── 修改 ──
111
- const { flowRun: updated, result, shouldPersist } = handler(flowRunResult.data);
112
- if (!shouldPersist) {
113
- return {
114
- ok: true,
115
- flowRun: flowRunResult.data,
116
- result,
117
- persisted: false,
118
- };
119
- }
120
- // ── 写入(乐观锁,broker 凭证) ──
121
- updated.revision += 1;
122
- updated.lastTickAt = new Date().toISOString();
123
- const writeResult = await ghWriteFlowRunWithLock(issueNumber, updated, currentBody, this.ghEnv);
124
- if (!writeResult.success) {
125
- return {
126
- ok: false,
127
- code: "PERSIST_CONFLICT",
128
- message: writeResult.error ?? "Issue body changed since last read — external modification detected",
129
- };
130
- }
131
- return {
132
- ok: true,
133
- flowRun: updated,
134
- result,
135
- persisted: true,
136
- };
137
- });
138
- }
139
- }
140
- //# sourceMappingURL=broker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/plugin/broker.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- import type { TaskState, TddEvidence, TddCycleEvidence, TddCommandEvidence } from "../flowrun/types.js";
2
- import { createTaskEvidence as createBaseEvidence } from "../flowrun/state.js";
3
- import type { FlowBroker } from "./broker.js";
4
- export type TddCheckpointOp = "cycle-start" | "red" | "green" | "final-regression" | "final-verification" | "status" | "alternative-command" | "abandon-cycle";
5
- export interface TddCheckpointRequest {
6
- op: TddCheckpointOp;
7
- parentIssueNumber: number;
8
- taskId: string;
9
- cycleId?: string;
10
- criterionId?: string;
11
- testPaths?: string[];
12
- testSelector?: string;
13
- redEvidence?: TddCommandEvidence;
14
- greenEvidence?: TddCommandEvidence;
15
- reason?: string;
16
- validationId?: string;
17
- regressionRuns?: TddCommandEvidence[];
18
- verificationRuns?: TddCommandEvidence[];
19
- }
20
- export interface TddCheckpointResponse {
21
- ok: boolean;
22
- evidence?: TddEvidence;
23
- cycle?: TddCycleEvidence;
24
- evidenceRevision?: number;
25
- error?: {
26
- code: string;
27
- message: string;
28
- };
29
- }
30
- /**
31
- * Broker-aware 响应:包含冲突暂停标志。
32
- * PERSIST_CONFLICT 时 conflictPause=true,调用方应暂停 FlowRun。
33
- */
34
- export interface TddCheckpointBrokerResponse extends TddCheckpointResponse {
35
- conflictPause: boolean;
36
- persisted: boolean;
37
- }
38
- export { createBaseEvidence as createTaskEvidence };
39
- /**
40
- * 处理 tdd_checkpoint 工具请求。
41
- *
42
- * 职责:
43
- * - 验证 Task 状态(running + executionBinding)
44
- * - 根据 op 分发到 state.ts 各纯函数
45
- * - 返回结构化 response(evidence revision + cycle/evidence)
46
- *
47
- * 注意:C2 只实现内存状态机。持久化由 C3 broker 负责。
48
- */
49
- export declare function handleTddCheckpoint(req: TddCheckpointRequest, task: TaskState): TddCheckpointResponse;
50
- /**
51
- * 通过 FlowBroker 执行 tdd_checkpoint 操作。
52
- *
53
- * 流程:
54
- * 1. 通过 broker.writeFlowRunWithLock 读取 FlowRun
55
- * 2. 提取目标 TaskState
56
- * 3. 调用 handleTddCheckpoint 执行状态机转换
57
- * 4. 成功时持久化回 Issue(broker 自动处理 revision + 乐观锁)
58
- * 5. PERSIST_CONFLICT 时设置 conflictPause=true
59
- *
60
- * @returns TddCheckpointBrokerResponse — 包含 conflictPause 标志
61
- */
62
- export declare function handleTddCheckpointWithBroker(broker: FlowBroker, req: TddCheckpointRequest): Promise<TddCheckpointBrokerResponse>;
@@ -1,336 +0,0 @@
1
- import { startCycle, recordRed, recordGreen, recordFinalRegression, recordFinalVerification, abandonCycle, createTaskEvidence as createBaseEvidence, } from "../flowrun/state.js";
2
- // ─── 内部辅助 ───
3
- const PLACEHOLDER_DIGEST = {
4
- algorithm: "sha256-content-v1",
5
- value: "0".repeat(64),
6
- };
7
- /**
8
- * 简单 glob 匹配(支持 *、**)
9
- */
10
- function matchSimpleGlob(filePath, pattern) {
11
- const normalized = filePath.split("/").join("/");
12
- let regexStr = "";
13
- let i = 0;
14
- while (i < pattern.length) {
15
- if (pattern[i] === "*" && pattern[i + 1] === "*") {
16
- i += 2;
17
- if (i < pattern.length && pattern[i] === "/") {
18
- regexStr += "(.*/)?";
19
- i++;
20
- }
21
- else {
22
- regexStr += ".*";
23
- }
24
- }
25
- else if (pattern[i] === "*") {
26
- regexStr += "[^/]*";
27
- i++;
28
- }
29
- else if (pattern[i] === ".") {
30
- regexStr += "\\.";
31
- i++;
32
- }
33
- else if (pattern[i] === "?") {
34
- regexStr += "[^/]";
35
- i++;
36
- }
37
- else {
38
- if ("+^$(){}[]|\\".includes(pattern[i])) {
39
- regexStr += "\\" + pattern[i];
40
- }
41
- else {
42
- regexStr += pattern[i];
43
- }
44
- i++;
45
- }
46
- }
47
- return new RegExp(`^${regexStr}$`).test(normalized);
48
- }
49
- function matchesAnyPattern(path, patterns) {
50
- if (patterns.length === 0)
51
- return false;
52
- return patterns.some(p => matchSimpleGlob(path, p));
53
- }
54
- // ─── 重新导出 createTaskEvidence ───
55
- export { createBaseEvidence as createTaskEvidence };
56
- // ─── 主处理函数 ───
57
- /**
58
- * 处理 tdd_checkpoint 工具请求。
59
- *
60
- * 职责:
61
- * - 验证 Task 状态(running + executionBinding)
62
- * - 根据 op 分发到 state.ts 各纯函数
63
- * - 返回结构化 response(evidence revision + cycle/evidence)
64
- *
65
- * 注意:C2 只实现内存状态机。持久化由 C3 broker 负责。
66
- */
67
- export function handleTddCheckpoint(req, task) {
68
- // ── 验证 Task 状态 ──
69
- if (task.status !== "running") {
70
- return {
71
- ok: false,
72
- error: { code: "TASK_NOT_RUNNING", message: `Task "${task.id}" is not running (status: ${task.status})` },
73
- };
74
- }
75
- if (!task.executionBinding) {
76
- return {
77
- ok: false,
78
- error: { code: "TASK_NOT_FOUND", message: `Task "${task.id}" has no execution binding` },
79
- };
80
- }
81
- const evidence = task.tddEvidence;
82
- // ── 分发 ──
83
- switch (req.op) {
84
- case "status":
85
- return {
86
- ok: true,
87
- evidence,
88
- evidenceRevision: evidence.revision,
89
- };
90
- case "cycle-start":
91
- return handleCycleStart(req, task, evidence);
92
- case "red":
93
- return handleRed(req, task, evidence);
94
- case "green":
95
- return handleGreen(req, task, evidence);
96
- case "final-regression":
97
- return handleFinalRegression(req, task, evidence);
98
- case "final-verification":
99
- return handleFinalVerification(req, task, evidence);
100
- case "abandon-cycle":
101
- return handleAbandonCycle(req, evidence);
102
- case "alternative-command":
103
- // C2 暂不实现 alternative-command,由 C3 broker 处理
104
- return {
105
- ok: false,
106
- error: { code: "POLICY_INVALID", message: "alternative-command not implemented in C2" },
107
- };
108
- default:
109
- return {
110
- ok: false,
111
- error: { code: "POLICY_INVALID", message: `Unknown op: "${req.op}"` },
112
- };
113
- }
114
- }
115
- function handleCycleStart(req, task, evidence) {
116
- const cycleId = req.cycleId;
117
- const criterionId = req.criterionId;
118
- if (!cycleId || !criterionId || !req.testPaths || !req.testSelector) {
119
- return {
120
- ok: false,
121
- error: { code: "POLICY_INVALID", message: "cycle-start requires cycleId, criterionId, testPaths, testSelector" },
122
- };
123
- }
124
- // workspace digest: 由 broker 计算,C2 阶段使用 placeholder
125
- // (实际运行时 broker 调用 computeWorkspaceDigest 获取)
126
- const wsDigest = PLACEHOLDER_DIGEST;
127
- const result = startCycle(evidence, cycleId, criterionId, req.testPaths, req.testSelector, wsDigest, task.acceptanceCriteria, task.tddPolicy.testFilePatterns);
128
- if (!result.ok) {
129
- return {
130
- ok: false,
131
- error: { code: result.error.code, message: result.error.message },
132
- };
133
- }
134
- // 更新 task.tddEvidence(内存变异,由调用方/C3 持久化)
135
- task.tddEvidence = result.value.evidence;
136
- return {
137
- ok: true,
138
- evidence: result.value.evidence,
139
- cycle: result.value.cycle,
140
- evidenceRevision: result.value.evidence.revision,
141
- };
142
- }
143
- function handleRed(req, task, evidence) {
144
- const cycleId = req.cycleId;
145
- if (!cycleId) {
146
- return {
147
- ok: false,
148
- error: { code: "POLICY_INVALID", message: "red requires cycleId" },
149
- };
150
- }
151
- // runner 必须存在
152
- if (!task.tddPolicy.runner) {
153
- return {
154
- ok: false,
155
- error: { code: "RUNNER_UNSUPPORTED", message: "RED requires a configured test runner" },
156
- };
157
- }
158
- // 使用内联 evidence(C2 测试模式)或由 broker 执行 vitest adapter
159
- const redEvidence = req.redEvidence;
160
- if (!redEvidence) {
161
- // 生产模式下由 broker 执行 vitest adapter 获取 evidence
162
- // C2 阶段不直接执行命令
163
- return {
164
- ok: false,
165
- error: { code: "POLICY_INVALID", message: "red requires redEvidence (in testing mode) or broker execution" },
166
- };
167
- }
168
- const result = recordRed(evidence, cycleId, redEvidence);
169
- if (!result.ok) {
170
- return {
171
- ok: false,
172
- error: { code: result.error.code, message: result.error.message },
173
- };
174
- }
175
- task.tddEvidence = result.value.evidence;
176
- return {
177
- ok: true,
178
- evidence: result.value.evidence,
179
- cycle: result.value.cycle,
180
- evidenceRevision: result.value.evidence.revision,
181
- };
182
- }
183
- function handleGreen(req, task, evidence) {
184
- const cycleId = req.cycleId;
185
- if (!cycleId) {
186
- return {
187
- ok: false,
188
- error: { code: "POLICY_INVALID", message: "green requires cycleId" },
189
- };
190
- }
191
- if (!task.tddPolicy.runner) {
192
- return {
193
- ok: false,
194
- error: { code: "RUNNER_UNSUPPORTED", message: "GREEN requires a configured test runner" },
195
- };
196
- }
197
- const greenEvidence = req.greenEvidence;
198
- if (!greenEvidence) {
199
- return {
200
- ok: false,
201
- error: { code: "POLICY_INVALID", message: "green requires greenEvidence (in testing mode) or broker execution" },
202
- };
203
- }
204
- // 检查实现文件是否有变化
205
- const implPatterns = task.tddPolicy.implementationFilePatterns;
206
- const implFilesChanged = greenEvidence.changedFiles.some(f => matchesAnyPattern(f, implPatterns));
207
- const result = recordGreen(evidence, cycleId, greenEvidence, implFilesChanged);
208
- if (!result.ok) {
209
- return {
210
- ok: false,
211
- error: { code: result.error.code, message: result.error.message },
212
- };
213
- }
214
- task.tddEvidence = result.value.evidence;
215
- return {
216
- ok: true,
217
- evidence: result.value.evidence,
218
- cycle: result.value.cycle,
219
- evidenceRevision: result.value.evidence.revision,
220
- };
221
- }
222
- function handleFinalRegression(req, task, evidence) {
223
- // 必须有 testCommands
224
- if (!req.regressionRuns && task.testCommands.length === 0) {
225
- return {
226
- ok: false,
227
- error: { code: "REGRESSION_FAILED", message: "No test commands configured for final regression" },
228
- };
229
- }
230
- // 使用内联 evidence 或占位
231
- const runs = req.regressionRuns ?? [];
232
- // headSha + treeSha 在生产模式下由 broker 通过 git 获取
233
- // C2 测试模式使用 placeholder
234
- const headSha = "placeholder-head";
235
- const treeSha = "placeholder-tree";
236
- const result = recordFinalRegression(evidence, headSha, treeSha, runs);
237
- if (!result.ok) {
238
- return {
239
- ok: false,
240
- error: { code: result.error.code, message: result.error.message },
241
- };
242
- }
243
- task.tddEvidence = result.value;
244
- return {
245
- ok: true,
246
- evidence: result.value,
247
- evidenceRevision: result.value.revision,
248
- };
249
- }
250
- function handleFinalVerification(req, task, evidence) {
251
- // 使用内联 evidence 或空数组(无 verifyCommands 时 pass)
252
- const runs = req.verificationRuns ?? [];
253
- const headSha = "placeholder-head";
254
- const treeSha = "placeholder-tree";
255
- const result = recordFinalVerification(evidence, headSha, treeSha, runs);
256
- if (!result.ok) {
257
- return {
258
- ok: false,
259
- error: { code: result.error.code, message: result.error.message },
260
- };
261
- }
262
- task.tddEvidence = result.value;
263
- return {
264
- ok: true,
265
- evidence: result.value,
266
- evidenceRevision: result.value.revision,
267
- };
268
- }
269
- function handleAbandonCycle(req, evidence) {
270
- const cycleId = req.cycleId;
271
- const reason = req.reason ?? "no reason given";
272
- if (!cycleId) {
273
- return {
274
- ok: false,
275
- error: { code: "POLICY_INVALID", message: "abandon-cycle requires cycleId" },
276
- };
277
- }
278
- const result = abandonCycle(evidence, cycleId, reason);
279
- if (!result.ok) {
280
- return {
281
- ok: false,
282
- error: { code: result.error.code, message: result.error.message },
283
- };
284
- }
285
- return {
286
- ok: true,
287
- evidence: result.value,
288
- evidenceRevision: result.value.revision,
289
- };
290
- }
291
- // ─── Broker-aware handler ───
292
- /**
293
- * 通过 FlowBroker 执行 tdd_checkpoint 操作。
294
- *
295
- * 流程:
296
- * 1. 通过 broker.writeFlowRunWithLock 读取 FlowRun
297
- * 2. 提取目标 TaskState
298
- * 3. 调用 handleTddCheckpoint 执行状态机转换
299
- * 4. 成功时持久化回 Issue(broker 自动处理 revision + 乐观锁)
300
- * 5. PERSIST_CONFLICT 时设置 conflictPause=true
301
- *
302
- * @returns TddCheckpointBrokerResponse — 包含 conflictPause 标志
303
- */
304
- export async function handleTddCheckpointWithBroker(broker, req) {
305
- const writeResult = await broker.writeFlowRunWithLock(req.parentIssueNumber, (flowRun) => {
306
- const task = flowRun.tasks[req.taskId];
307
- if (!task) {
308
- const resp = {
309
- ok: false,
310
- error: { code: "TASK_NOT_FOUND", message: `Task "${req.taskId}" not found in FlowRun` },
311
- };
312
- return { flowRun, result: resp, shouldPersist: false };
313
- }
314
- const tddResp = handleTddCheckpoint(req, task);
315
- return { flowRun, result: tddResp, shouldPersist: tddResp.ok };
316
- });
317
- if (!writeResult.ok) {
318
- // PERSIST_CONFLICT or READ_FAILED
319
- return {
320
- ok: false,
321
- conflictPause: writeResult.code === "PERSIST_CONFLICT",
322
- persisted: false,
323
- error: {
324
- code: writeResult.code,
325
- message: writeResult.message,
326
- },
327
- };
328
- }
329
- // 成功(或 shouldPersist=false)
330
- return {
331
- ...writeResult.result,
332
- conflictPause: false,
333
- persisted: writeResult.persisted,
334
- };
335
- }
336
- //# sourceMappingURL=tdd-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tdd-tool.js","sourceRoot":"","sources":["../../src/plugin/tdd-tool.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes