@devcxl/opencode-cabbage 0.3.2 → 1.1.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 (179) hide show
  1. package/README.md +34 -19
  2. package/README.zh.md +34 -19
  3. package/assets/agents/dev-lifecycle.md +60 -49
  4. package/assets/agents/team/architect.md +8 -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 +6 -0
  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 +28 -79
  19. package/assets/skills/flow-release/SKILL.md +31 -51
  20. package/assets/skills/flow-requirements/SKILL.md +31 -196
  21. package/assets/skills/flow-review/SKILL.md +26 -123
  22. package/assets/skills/flow-setup/SKILL.md +40 -43
  23. package/assets/skills/flow-tasks/SKILL.md +23 -153
  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 +84 -0
  30. package/dist/kernel/context.js.map +1 -0
  31. package/dist/kernel/flow.d.ts +175 -0
  32. package/dist/kernel/flow.js +467 -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 +45 -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 +147 -0
  45. package/dist/kernel/profile.js.map +1 -0
  46. package/dist/kernel/records.d.ts +103 -0
  47. package/dist/kernel/records.js +240 -0
  48. package/dist/kernel/records.js.map +1 -0
  49. package/dist/kernel/release.d.ts +106 -0
  50. package/dist/kernel/release.js +241 -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 +82 -0
  54. package/dist/kernel/review.js.map +1 -0
  55. package/dist/kernel/session-index.d.ts +45 -0
  56. package/dist/kernel/session-index.js +136 -0
  57. package/dist/kernel/session-index.js.map +1 -0
  58. package/dist/kernel/setup.d.ts +95 -0
  59. package/dist/kernel/setup.js +401 -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 +213 -0
  65. package/dist/kernel/task.js +873 -0
  66. package/dist/kernel/task.js.map +1 -0
  67. package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
  68. package/dist/{flowrun → kernel/tdd}/adapter.js +27 -26
  69. package/dist/kernel/tdd/adapter.js.map +1 -0
  70. package/dist/{flowrun → kernel/tdd}/digest.d.ts +2 -1
  71. package/dist/{flowrun → kernel/tdd}/digest.js +6 -4
  72. package/dist/kernel/tdd/digest.js.map +1 -0
  73. package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
  74. package/dist/{flowrun → kernel/tdd}/evaluator.js +1 -1
  75. package/dist/kernel/tdd/evaluator.js.map +1 -0
  76. package/dist/kernel/tdd/evidence.d.ts +42 -0
  77. package/dist/kernel/tdd/evidence.js +48 -0
  78. package/dist/kernel/tdd/evidence.js.map +1 -0
  79. package/dist/{flowrun → kernel/tdd}/state.d.ts +2 -2
  80. package/dist/{flowrun → kernel/tdd}/state.js +1 -1
  81. package/dist/kernel/tdd/state.js.map +1 -0
  82. package/dist/kernel/types.d.ts +180 -0
  83. package/dist/kernel/types.js +2 -0
  84. package/dist/kernel/types.js.map +1 -0
  85. package/dist/kernel/worktree.d.ts +45 -0
  86. package/dist/kernel/worktree.js +156 -0
  87. package/dist/kernel/worktree.js.map +1 -0
  88. package/dist/plugin/agents.d.ts +5 -17
  89. package/dist/plugin/agents.js +0 -23
  90. package/dist/plugin/agents.js.map +1 -1
  91. package/dist/plugin/flow-control.d.ts +91 -0
  92. package/dist/plugin/flow-control.js +287 -0
  93. package/dist/plugin/flow-control.js.map +1 -0
  94. package/dist/plugin/goal.d.ts +17 -46
  95. package/dist/plugin/goal.js +47 -117
  96. package/dist/plugin/goal.js.map +1 -1
  97. package/dist/plugin/prompt-lint.js +78 -6
  98. package/dist/plugin/prompt-lint.js.map +1 -1
  99. package/dist/plugin/release-control.d.ts +39 -0
  100. package/dist/plugin/release-control.js +343 -0
  101. package/dist/plugin/release-control.js.map +1 -0
  102. package/dist/plugin/server.d.ts +19 -0
  103. package/dist/plugin/server.js +198 -320
  104. package/dist/plugin/server.js.map +1 -1
  105. package/dist/plugin/setup-control.d.ts +59 -0
  106. package/dist/plugin/setup-control.js +111 -0
  107. package/dist/plugin/setup-control.js.map +1 -0
  108. package/dist/plugin/shell.d.ts +7 -34
  109. package/dist/plugin/shell.js +12 -137
  110. package/dist/plugin/shell.js.map +1 -1
  111. package/dist/plugin/skills.d.ts +1 -1
  112. package/dist/plugin/skills.js +1 -7
  113. package/dist/plugin/skills.js.map +1 -1
  114. package/dist/plugin/task-control.d.ts +90 -0
  115. package/dist/plugin/task-control.js +208 -0
  116. package/dist/plugin/task-control.js.map +1 -0
  117. package/dist/plugin/tdd-checkpoint.d.ts +128 -0
  118. package/dist/plugin/tdd-checkpoint.js +664 -0
  119. package/dist/plugin/tdd-checkpoint.js.map +1 -0
  120. package/dist/util/gh.d.ts +5 -0
  121. package/dist/util/gh.js +12 -0
  122. package/dist/util/gh.js.map +1 -1
  123. package/dist/util/paths.d.ts +6 -2
  124. package/dist/util/paths.js +15 -7
  125. package/dist/util/paths.js.map +1 -1
  126. package/package.json +4 -4
  127. package/assets/agents/team/backend.md +0 -100
  128. package/assets/agents/team/frontend.md +0 -98
  129. package/assets/commands/handoff.md +0 -4
  130. package/assets/commands/test.md +0 -4
  131. package/assets/context/CONTEXT.md +0 -41
  132. package/assets/skills/flow-handoff/SKILL.md +0 -76
  133. package/assets/skills/flow-test/SKILL.md +0 -75
  134. package/dist/flowrun/adapter.js.map +0 -1
  135. package/dist/flowrun/audit.d.ts +0 -5
  136. package/dist/flowrun/audit.js +0 -67
  137. package/dist/flowrun/audit.js.map +0 -1
  138. package/dist/flowrun/ci.d.ts +0 -64
  139. package/dist/flowrun/ci.js +0 -184
  140. package/dist/flowrun/ci.js.map +0 -1
  141. package/dist/flowrun/coverage.d.ts +0 -70
  142. package/dist/flowrun/coverage.js +0 -207
  143. package/dist/flowrun/coverage.js.map +0 -1
  144. package/dist/flowrun/digest.js.map +0 -1
  145. package/dist/flowrun/evaluator.js.map +0 -1
  146. package/dist/flowrun/gate.d.ts +0 -28
  147. package/dist/flowrun/gate.js +0 -139
  148. package/dist/flowrun/gate.js.map +0 -1
  149. package/dist/flowrun/github.d.ts +0 -24
  150. package/dist/flowrun/github.js +0 -154
  151. package/dist/flowrun/github.js.map +0 -1
  152. package/dist/flowrun/index.d.ts +0 -14
  153. package/dist/flowrun/index.js +0 -15
  154. package/dist/flowrun/index.js.map +0 -1
  155. package/dist/flowrun/merge.d.ts +0 -57
  156. package/dist/flowrun/merge.js +0 -180
  157. package/dist/flowrun/merge.js.map +0 -1
  158. package/dist/flowrun/migration.d.ts +0 -11
  159. package/dist/flowrun/migration.js +0 -276
  160. package/dist/flowrun/migration.js.map +0 -1
  161. package/dist/flowrun/resilience.d.ts +0 -18
  162. package/dist/flowrun/resilience.js +0 -80
  163. package/dist/flowrun/resilience.js.map +0 -1
  164. package/dist/flowrun/state.js.map +0 -1
  165. package/dist/flowrun/transitions.d.ts +0 -66
  166. package/dist/flowrun/transitions.js +0 -168
  167. package/dist/flowrun/transitions.js.map +0 -1
  168. package/dist/flowrun/types.d.ts +0 -356
  169. package/dist/flowrun/types.js +0 -21
  170. package/dist/flowrun/types.js.map +0 -1
  171. package/dist/flowrun/validator.d.ts +0 -19
  172. package/dist/flowrun/validator.js +0 -209
  173. package/dist/flowrun/validator.js.map +0 -1
  174. package/dist/plugin/broker.d.ts +0 -73
  175. package/dist/plugin/broker.js +0 -140
  176. package/dist/plugin/broker.js.map +0 -1
  177. package/dist/plugin/tdd-tool.d.ts +0 -62
  178. package/dist/plugin/tdd-tool.js +0 -336
  179. package/dist/plugin/tdd-tool.js.map +0 -1
@@ -1,28 +0,0 @@
1
- import { type FlowRun, type FlowStage, type TaskState } from "./types.js";
2
- export interface GateResult {
3
- allowed: boolean;
4
- reason?: string;
5
- missing: string[];
6
- failedChecks: string[];
7
- }
8
- export declare function canStartStage(flowRun: FlowRun, stage: FlowStage): GateResult;
9
- export declare function canCompleteStage(flowRun: FlowRun, stage: FlowStage): GateResult;
10
- export declare function canStartTask(flowRun: FlowRun, taskId: string): GateResult;
11
- export declare function canCompleteTask(flowRun: FlowRun, taskId: string): GateResult;
12
- /**
13
- * 检查 FlowRun 是否满足合并收尾条件。
14
- *
15
- * 新语义(v2):
16
- * - FlowRun 状态为 running 或 merging
17
- * - 所有 Task 状态均为 merged
18
- * - 不再要求 review Stage 为 pass(Task-local merge 已独立)
19
- *
20
- * 用于 flow_run finalize。
21
- */
22
- export declare function canMerge(flowRun: FlowRun): GateResult;
23
- export declare function allTasksComplete(flowRun: FlowRun): boolean;
24
- export declare function getReadyTasks(flowRun: FlowRun): TaskState[];
25
- export declare function determineNextStage(flowRun: FlowRun): {
26
- stage: FlowStage | null;
27
- reason: string;
28
- };
@@ -1,139 +0,0 @@
1
- import { FLOW_RUN_STAGES, TASK_STATUSES, } from "./types.js";
2
- function ok() {
3
- return { allowed: true, missing: [], failedChecks: [] };
4
- }
5
- function block(reason, missing = [], failedChecks = []) {
6
- return { allowed: false, reason, missing, failedChecks };
7
- }
8
- export function canStartStage(flowRun, stage) {
9
- const stageIdx = FLOW_RUN_STAGES.indexOf(stage);
10
- if (stageIdx === -1)
11
- return block(`Unknown stage: ${stage}`);
12
- if (flowRun.status !== "running") {
13
- return block(`FlowRun is ${flowRun.status}, not running`);
14
- }
15
- const prevStages = FLOW_RUN_STAGES.slice(0, stageIdx);
16
- for (const prev of prevStages) {
17
- const s = flowRun.stages[prev];
18
- if (s.status !== "pass") {
19
- return block(`Prerequisite stage "${prev}" is not complete (status: ${s.status})`, [prev]);
20
- }
21
- }
22
- const stageState = flowRun.stages[stage];
23
- if (!stageState)
24
- return block(`Stage state not found: ${stage}`);
25
- if (stageState.status === "pass") {
26
- return block(`Stage "${stage}" already completed`);
27
- }
28
- return ok();
29
- }
30
- export function canCompleteStage(flowRun, stage) {
31
- const stageState = flowRun.stages[stage];
32
- if (!stageState)
33
- return block(`Stage state not found: ${stage}`);
34
- const missingArtifacts = stageState.requiredArtifacts.filter(a => !a);
35
- const failedChecks = stageState.checks.filter(c => c.status === "fail").map(c => c.name);
36
- if (missingArtifacts.length > 0) {
37
- return block(`Stage "${stage}" has missing required artifacts`, missingArtifacts);
38
- }
39
- if (failedChecks.length > 0) {
40
- return block(`Stage "${stage}" has failed checks`, [], failedChecks);
41
- }
42
- const pendingChecks = stageState.checks.filter(c => c.status === "pending");
43
- if (pendingChecks.length > 0) {
44
- return block(`Stage "${stage}" has pending checks: ${pendingChecks.map(c => c.name).join(", ")}`);
45
- }
46
- if (stage === "merge") {
47
- return canMerge(flowRun);
48
- }
49
- return ok();
50
- }
51
- export function canStartTask(flowRun, taskId) {
52
- const task = flowRun.tasks[taskId];
53
- if (!task)
54
- return block(`Task not found: ${taskId}`);
55
- if (flowRun.status !== "running") {
56
- return block(`FlowRun is ${flowRun.status}, not running`);
57
- }
58
- const codeStage = flowRun.stages.code;
59
- if (codeStage.status !== "running" && codeStage.status !== "pass") {
60
- return block("Code stage is not active");
61
- }
62
- if (task.status === "merged")
63
- return block(`Task "${taskId}" already merged`);
64
- if (task.status === "running")
65
- return block(`Task "${taskId}" already running`);
66
- if (task.status === "blocked")
67
- return block(`Task "${taskId}" is blocked: ${task.blockedReason || "unknown reason"}`);
68
- for (const dep of task.dependsOn) {
69
- const depTask = flowRun.tasks[dep];
70
- if (!depTask)
71
- return block(`Dependency task "${dep}" not found`);
72
- if (depTask.status !== "merged") {
73
- return block(`Dependency "${dep}" is not merged (status: ${depTask.status})`, [], [dep]);
74
- }
75
- }
76
- return ok();
77
- }
78
- export function canCompleteTask(flowRun, taskId) {
79
- const task = flowRun.tasks[taskId];
80
- if (!task)
81
- return block(`Task not found: ${taskId}`);
82
- if (task.status !== "running") {
83
- return block(`Task "${taskId}" is not running (status: ${task.status})`);
84
- }
85
- return ok();
86
- }
87
- /**
88
- * 检查 FlowRun 是否满足合并收尾条件。
89
- *
90
- * 新语义(v2):
91
- * - FlowRun 状态为 running 或 merging
92
- * - 所有 Task 状态均为 merged
93
- * - 不再要求 review Stage 为 pass(Task-local merge 已独立)
94
- *
95
- * 用于 flow_run finalize。
96
- */
97
- export function canMerge(flowRun) {
98
- if (flowRun.status !== "running" && flowRun.status !== "merging") {
99
- return block("FlowRun is not in a mergeable state");
100
- }
101
- if (!allTasksComplete(flowRun)) {
102
- return block("Not all tasks merged (finalize requires all tasks to be merged first)");
103
- }
104
- return ok();
105
- }
106
- export function allTasksComplete(flowRun) {
107
- const taskIds = Object.keys(flowRun.tasks);
108
- if (taskIds.length === 0)
109
- return false;
110
- return taskIds.every(id => flowRun.tasks[id].status === "merged");
111
- }
112
- export function getReadyTasks(flowRun) {
113
- return Object.values(flowRun.tasks).filter(t => {
114
- if (t.status !== "pending" && t.status !== "ready")
115
- return false;
116
- const depsMet = t.dependsOn.every(dep => {
117
- const depTask = flowRun.tasks[dep];
118
- return depTask && depTask.status === "merged";
119
- });
120
- return depsMet;
121
- });
122
- }
123
- export function determineNextStage(flowRun) {
124
- for (const stage of FLOW_RUN_STAGES) {
125
- const s = flowRun.stages[stage];
126
- if (s.status === "pending" || s.status === "failed" || s.status === "blocked") {
127
- const gate = canStartStage(flowRun, stage);
128
- if (gate.allowed) {
129
- return { stage, reason: `Stage "${stage}" is ready to start` };
130
- }
131
- return { stage: null, reason: `Cannot start "${stage}": ${gate.reason}` };
132
- }
133
- if (s.status === "running") {
134
- return { stage, reason: `Stage "${stage}" is in progress` };
135
- }
136
- }
137
- return { stage: null, reason: "All stages complete" };
138
- }
139
- //# sourceMappingURL=gate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/flowrun/gate.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import { type FlowRun, type FlowRunReadResult } from "./types.js";
2
- /**
3
- * 从 Issue body 中提取 FlowRun,执行完整 v1→v2 读取管线:
4
- * JSON parse → detect version → migrate → validate → return FlowRunReadResult
5
- */
6
- export declare function extractFlowRunFromBody(body: string): FlowRunReadResult;
7
- export declare function replaceFlowRunInBody(body: string, flowRun: FlowRun): string;
8
- export declare function readFlowRun(issueNumber: number, ghEnv?: Record<string, string>): Promise<FlowRunReadResult>;
9
- export declare function writeFlowRun(issueNumber: number, flowRun: FlowRun, ghEnv?: Record<string, string>): Promise<{
10
- success: boolean;
11
- error?: string;
12
- }>;
13
- export declare function readFlowRunWithLock(issueNumber: number, ghEnv?: Record<string, string>): Promise<{
14
- flowRunResult: FlowRunReadResult;
15
- currentBody: string | null;
16
- }>;
17
- export declare function writeFlowRunWithLock(issueNumber: number, flowRun: FlowRun, previousBody: string, ghEnv?: Record<string, string>): Promise<{
18
- success: boolean;
19
- error?: string;
20
- conflict: boolean;
21
- }>;
22
- export declare function applyLabel(issueNumber: number, label: string, ghEnv?: Record<string, string>): Promise<boolean>;
23
- export declare function removeLabel(issueNumber: number, label: string, ghEnv?: Record<string, string>): Promise<boolean>;
24
- export declare function createInitialFlowRun(flowRunId: string, repo: string, parentIssueNumber: number): FlowRun;
@@ -1,154 +0,0 @@
1
- import { gh } from "../util/gh.js";
2
- import { escapeShellArg } from "../util/shell.js";
3
- import { CABINET_START_MARKER, CABINET_END_MARKER, CURRENT_SCHEMA_VERSION, } from "./types.js";
4
- import { validateFlowRun } from "./validator.js";
5
- import { migrateV1ToV2 } from "./migration.js";
6
- function buildFlowRunBlock(flowRun) {
7
- const json = JSON.stringify(flowRun, null, 2);
8
- return `${CABINET_START_MARKER}\n\`\`\`json\n${json}\n\`\`\`\n${CABINET_END_MARKER}`;
9
- }
10
- /**
11
- * 从 Issue body 中提取 FlowRun,执行完整 v1→v2 读取管线:
12
- * JSON parse → detect version → migrate → validate → return FlowRunReadResult
13
- */
14
- export function extractFlowRunFromBody(body) {
15
- const startIdx = body.indexOf(CABINET_START_MARKER);
16
- const endIdx = body.indexOf(CABINET_END_MARKER);
17
- if (startIdx === -1 || endIdx === -1) {
18
- return { ok: false, code: "NOT_FOUND", errors: [{ path: "", message: "FlowRun markers not found in issue body" }] };
19
- }
20
- const block = body.slice(startIdx + CABINET_START_MARKER.length, endIdx).trim();
21
- const jsonMatch = block.match(/```json\n?([\s\S]*?)```/);
22
- if (!jsonMatch) {
23
- return { ok: false, code: "INVALID_JSON", errors: [{ path: "", message: "JSON block not found" }] };
24
- }
25
- let parsed;
26
- try {
27
- parsed = JSON.parse(jsonMatch[1].trim());
28
- }
29
- catch {
30
- return { ok: false, code: "INVALID_JSON", errors: [{ path: "", message: "Failed to parse FlowRun JSON" }] };
31
- }
32
- // Step 1: version detection + migration
33
- const migrationResult = migrateV1ToV2(parsed);
34
- if (!migrationResult.ok)
35
- return migrationResult;
36
- // Step 2: validate v2
37
- const { errors } = validateFlowRun(migrationResult.data);
38
- if (errors.length > 0) {
39
- return { ok: false, code: "VALIDATION_FAILED", errors };
40
- }
41
- return { ok: true, data: migrationResult.data, migrated: migrationResult.migrated };
42
- }
43
- export function replaceFlowRunInBody(body, flowRun) {
44
- const startIdx = body.indexOf(CABINET_START_MARKER);
45
- const endIdx = body.indexOf(CABINET_END_MARKER);
46
- const block = buildFlowRunBlock(flowRun);
47
- if (startIdx === -1 || endIdx === -1) {
48
- return body + "\n\n" + block;
49
- }
50
- return body.slice(0, startIdx) + block + body.slice(endIdx + CABINET_END_MARKER.length);
51
- }
52
- export async function readFlowRun(issueNumber, ghEnv) {
53
- try {
54
- const { stdout } = await gh(`issue view ${issueNumber} --json body --jq .body`, 30_000, ghEnv);
55
- return extractFlowRunFromBody(stdout);
56
- }
57
- catch {
58
- return { ok: false, code: "NOT_FOUND", errors: [{ path: "", message: "Failed to read issue body" }] };
59
- }
60
- }
61
- export async function writeFlowRun(issueNumber, flowRun, ghEnv) {
62
- try {
63
- const { stdout } = await gh(`issue view ${issueNumber} --json body --jq .body`, 30_000, ghEnv);
64
- const body = stdout;
65
- const newBody = replaceFlowRunInBody(body, flowRun);
66
- const escaped = escapeShellArg(newBody);
67
- await gh(`issue edit ${issueNumber} --body '${escaped}'`, 30_000, ghEnv);
68
- return { success: true };
69
- }
70
- catch (err) {
71
- return { success: false, error: String(err) };
72
- }
73
- }
74
- export async function readFlowRunWithLock(issueNumber, ghEnv) {
75
- try {
76
- const { stdout } = await gh(`issue view ${issueNumber} --json body --jq .body`, 30_000, ghEnv);
77
- const flowRunResult = extractFlowRunFromBody(stdout);
78
- return { flowRunResult, currentBody: stdout };
79
- }
80
- catch {
81
- return { flowRunResult: { ok: false, code: "NOT_FOUND", errors: [{ path: "", message: "Failed to read issue body" }] }, currentBody: null };
82
- }
83
- }
84
- export async function writeFlowRunWithLock(issueNumber, flowRun, previousBody, ghEnv) {
85
- try {
86
- const { stdout } = await gh(`issue view ${issueNumber} --json body --jq .body`, 30_000, ghEnv);
87
- if (previousBody !== stdout) {
88
- return { success: false, error: "Conflict: body has changed since last read", conflict: true };
89
- }
90
- const newBody = replaceFlowRunInBody(stdout, flowRun);
91
- const escaped = escapeShellArg(newBody);
92
- await gh(`issue edit ${issueNumber} --body '${escaped}'`, 30_000, ghEnv);
93
- return { success: true, conflict: false };
94
- }
95
- catch (err) {
96
- return { success: false, error: String(err), conflict: false };
97
- }
98
- }
99
- export async function applyLabel(issueNumber, label, ghEnv) {
100
- try {
101
- await gh(`issue edit ${issueNumber} --add-label '${label}'`, 30_000, ghEnv);
102
- return true;
103
- }
104
- catch {
105
- return false;
106
- }
107
- }
108
- export async function removeLabel(issueNumber, label, ghEnv) {
109
- try {
110
- await gh(`issue edit ${issueNumber} --remove-label '${label}'`, 30_000, ghEnv);
111
- return true;
112
- }
113
- catch {
114
- return false;
115
- }
116
- }
117
- export function createInitialFlowRun(flowRunId, repo, parentIssueNumber) {
118
- const now = new Date().toISOString();
119
- const emptyStage = () => ({
120
- status: "pending",
121
- requiredArtifacts: [],
122
- checks: [],
123
- completedAt: null,
124
- evidence: [],
125
- });
126
- return {
127
- flowRunId,
128
- repo,
129
- parentIssueNumber,
130
- status: "planned",
131
- schemaVersion: CURRENT_SCHEMA_VERSION,
132
- revision: 0,
133
- stages: {
134
- requirements: emptyStage(),
135
- design: emptyStage(),
136
- tasks: emptyStage(),
137
- code: emptyStage(),
138
- test: emptyStage(),
139
- review: emptyStage(),
140
- merge: emptyStage(),
141
- },
142
- tasks: {},
143
- startedAt: now,
144
- lastTickAt: now,
145
- nextTickAfter: null,
146
- maxRuntime: 86_400_000,
147
- completedAt: null,
148
- repositoryQualityPolicy: {
149
- mode: "off",
150
- requiredChecks: [],
151
- },
152
- };
153
- }
154
- //# sourceMappingURL=github.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/flowrun/github.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export { type FlowRun, type FlowRunStatus, type FlowStage, type TaskState, type TaskStatus, type StageState, type StageStatus, type Checkpoint, type CheckpointStatus, type EvidenceEntry, type PRCheckpoints, FLOW_RUN_STAGES, FLOW_RUN_STATUSES, TASK_STATUSES, STAGE_STATUSES, CHECKPOINT_STATUSES, CURRENT_SCHEMA_VERSION, DEFAULT_MAX_RUNTIME_MS, CABINET_START_MARKER, CABINET_END_MARKER, LABEL_PREFIX, FLOW_RUN_LABELS, type AcceptanceCriterion, type TddMode, type TddEnforcement, type TddRunnerPolicy, type TddApproval, type AlternativeValidation, type TddException, type TddPolicy, type TddFailureKind, type TddCommandEvidence, type VersionedDigest, type TddTaskStartEvidence, type TaskExecutionBinding, type TddCycleEvidence, type TddRegressionEvidence, type FinalVerificationEvidence, type AlternativeValidationEvidence, type TddReworkEvidence, type ReworkApproval, type TddEvidence, type CoveragePolicy, type CoverageEvidence, type TddComplianceCheckpoint, type RepositoryQualityPolicy, type GoalFlowRunRef, type FlowRunReadResult, type TaskCommand, type ValidationError, type FlowControlRequest, type FlowControlResponse, type FlowControlOp, } from "./types.js";
2
- export { validateFlowRun, validateFlowRunDag, type DagValidationError, } from "./validator.js";
3
- export { migrateV1ToV2, } from "./migration.js";
4
- export { extractFlowRunFromBody, replaceFlowRunInBody, readFlowRun, writeFlowRun, readFlowRunWithLock, writeFlowRunWithLock, applyLabel, removeLabel, createInitialFlowRun, } from "./github.js";
5
- export { canStartStage, canCompleteStage, canStartTask, canCompleteTask, canMerge, allTasksComplete, getReadyTasks, determineNextStage, type GateResult, } from "./gate.js";
6
- export { flowRunStart, flowStageStart, flowStageComplete, flowTaskStart, flowRunFinalize, type TransitionError, type TransitionResult, } from "./transitions.js";
7
- export { checkBranchProtection, validateCheckpoint, validatePRCheckpoints, canMergeTaskPR, mergePR, mergeTaskPR, createRevertPR, setMergeGhExecutor, type MergeGateResult, } from "./merge.js";
8
- export { checkRuntime, hasRuntimeExpired, getRuntimeMs, checkBackpressure, buildContinuationContext, type RuntimeCheckResult, type BackpressureStatus, } from "./resilience.js";
9
- export { postAuditComment, postPRComment, buildStageAudit, buildMergeAudit, } from "./audit.js";
10
- export { evaluateTddCompliance, type EvaluationResult, } from "./evaluator.js";
11
- export { computeWorkspaceDigest, type DigestOptions, } from "./digest.js";
12
- export { executeRedCheck, validateSelector, classifyVitestFailure, buildVitestArgs, type VitestOutput, type FailureInput, } from "./adapter.js";
13
- export { validateCoveragePath, resolveCoveragePath, parseCoverageReport, buildCoverageEvidence, checkCoverageThreshold, computeReportDigest, verifySymlinkSafe, type ParsedCoverageData, type BuildCoverageEvidenceInput, } from "./coverage.js";
14
- export { checkRequiredChecks, validateRequiredWorkflow, computeQualityContractDigest, type PRCheckResult, type CICheckResult, type RequiredWorkflowValidation, } from "./ci.js";
@@ -1,15 +0,0 @@
1
- export { FLOW_RUN_STAGES, FLOW_RUN_STATUSES, TASK_STATUSES, STAGE_STATUSES, CHECKPOINT_STATUSES, CURRENT_SCHEMA_VERSION, DEFAULT_MAX_RUNTIME_MS, CABINET_START_MARKER, CABINET_END_MARKER, LABEL_PREFIX, FLOW_RUN_LABELS, } from "./types.js";
2
- export { validateFlowRun, validateFlowRunDag, } from "./validator.js";
3
- export { migrateV1ToV2, } from "./migration.js";
4
- export { extractFlowRunFromBody, replaceFlowRunInBody, readFlowRun, writeFlowRun, readFlowRunWithLock, writeFlowRunWithLock, applyLabel, removeLabel, createInitialFlowRun, } from "./github.js";
5
- export { canStartStage, canCompleteStage, canStartTask, canCompleteTask, canMerge, allTasksComplete, getReadyTasks, determineNextStage, } from "./gate.js";
6
- export { flowRunStart, flowStageStart, flowStageComplete, flowTaskStart, flowRunFinalize, } from "./transitions.js";
7
- export { checkBranchProtection, validateCheckpoint, validatePRCheckpoints, canMergeTaskPR, mergePR, mergeTaskPR, createRevertPR, setMergeGhExecutor, } from "./merge.js";
8
- export { checkRuntime, hasRuntimeExpired, getRuntimeMs, checkBackpressure, buildContinuationContext, } from "./resilience.js";
9
- export { postAuditComment, postPRComment, buildStageAudit, buildMergeAudit, } from "./audit.js";
10
- export { evaluateTddCompliance, } from "./evaluator.js";
11
- export { computeWorkspaceDigest, } from "./digest.js";
12
- export { executeRedCheck, validateSelector, classifyVitestFailure, buildVitestArgs, } from "./adapter.js";
13
- export { validateCoveragePath, resolveCoveragePath, parseCoverageReport, buildCoverageEvidence, checkCoverageThreshold, computeReportDigest, verifySymlinkSafe, } from "./coverage.js";
14
- export { checkRequiredChecks, validateRequiredWorkflow, computeQualityContractDigest, } from "./ci.js";
15
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flowrun/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EACtF,sBAAsB,EAAE,sBAAsB,EAC9C,oBAAoB,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,GAexE,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,eAAe,EAAE,kBAAkB,GAEpC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,aAAa,GACd,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,sBAAsB,EAAE,oBAAoB,EAC5C,WAAW,EAAE,YAAY,EACzB,mBAAmB,EAAE,oBAAoB,EACzC,UAAU,EAAE,WAAW,EAAE,oBAAoB,GAC9C,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAC9D,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,GAE9D,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAC9D,eAAe,GAEhB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,EAChE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,GAEzE,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAC7C,iBAAiB,EAAE,wBAAwB,GAE5C,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,gBAAgB,EAAE,aAAa,EAC/B,eAAe,EAAE,eAAe,GACjC,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,qBAAqB,GAEtB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,sBAAsB,GAEvB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAGhB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,GAI7B,MAAM,SAAS,CAAA"}
@@ -1,57 +0,0 @@
1
- import type { PRCheckpoints, Checkpoint, TaskState } from "./types.js";
2
- type GhFn = (args: string) => Promise<{
3
- stdout: string;
4
- stderr: string;
5
- }>;
6
- export declare function setMergeGhExecutor(fn: GhFn): void;
7
- export interface BranchProtectionStatus {
8
- exists: boolean;
9
- requiredChecks: string[];
10
- requiresPR: boolean;
11
- dismissesStale: boolean;
12
- }
13
- export interface MergeGateResult {
14
- allowed: boolean;
15
- reason?: string;
16
- checkpointResults: Record<string, "pending" | "pass" | "fail" | "skipped">;
17
- }
18
- export declare function checkBranchProtection(owner: string, repo: string): Promise<BranchProtectionStatus>;
19
- export declare function validateCheckpoint(cp: Checkpoint): "pending" | "pass" | "fail";
20
- export declare function validatePRCheckpoints(checkpoints: PRCheckpoints): MergeGateResult;
21
- /**
22
- * Task-local merge gate(不依赖全局 canMerge)。
23
- *
24
- * 检查条件(按顺序):
25
- * 1. Task 状态为 "reviewing"
26
- * 2. 存在 PR Checkpoints
27
- * 3. 所有 checkpoint 状态为 pass
28
- * 4. TDD compliance 为 pass / waived / null(无 TDD 要求)
29
- * 5. Branch Protection 已启用
30
- *
31
- * 不要求全局 review Stage 为 pass。
32
- */
33
- export declare function canMergeTaskPR(task: TaskState, hasBranchProtection: boolean): MergeGateResult;
34
- /**
35
- * 标准化合并 PR(无安全检查,向后兼容)。
36
- */
37
- export declare function mergePR(prNumber: number): Promise<{
38
- success: boolean;
39
- error?: string;
40
- }>;
41
- /**
42
- * Task-local PR 合并(带 --match-head-commit 安全检查)。
43
- *
44
- * 步骤:
45
- * 1. 验证 verifiedSha 非空
46
- * 2. 使用 gh pr merge --squash --delete-branch --match-head-commit <verifiedSha>
47
- * 3. 失败时返回错误
48
- */
49
- export declare function mergeTaskPR(prNumber: number, verifiedSha: string): Promise<{
50
- success: boolean;
51
- error?: string;
52
- }>;
53
- export declare function createRevertPR(prNumber: number, reason: string): Promise<{
54
- prNumber?: number;
55
- error?: string;
56
- }>;
57
- export {};
@@ -1,180 +0,0 @@
1
- let mergeGhExecutor = null;
2
- export function setMergeGhExecutor(fn) {
3
- mergeGhExecutor = fn;
4
- }
5
- async function gh(args) {
6
- if (mergeGhExecutor) {
7
- return mergeGhExecutor(args);
8
- }
9
- const mod = await import("../util/gh.js");
10
- return mod.gh(args);
11
- }
12
- // ─── Branch Protection ───
13
- export async function checkBranchProtection(owner, repo) {
14
- try {
15
- const { stdout } = await gh(`api repos/${owner}/${repo}/branches/main/protection`);
16
- const data = JSON.parse(stdout);
17
- const checks = [];
18
- const requiredPulls = data?.required_pull_request_reviews ?? null;
19
- const requiredChecks = data?.required_status_checks?.checks ?? [];
20
- for (const c of requiredChecks) {
21
- checks.push(c.context);
22
- }
23
- return {
24
- exists: true,
25
- requiredChecks: checks,
26
- requiresPR: !!requiredPulls,
27
- dismissesStale: requiredPulls?.dismiss_stale_reviews ?? false,
28
- };
29
- }
30
- catch {
31
- return {
32
- exists: false,
33
- requiredChecks: [],
34
- requiresPR: false,
35
- dismissesStale: false,
36
- };
37
- }
38
- }
39
- // ─── Checkpoint 验证 ───
40
- export function validateCheckpoint(cp) {
41
- if (cp.status === "pass")
42
- return "pass";
43
- if (cp.status === "fail")
44
- return "fail";
45
- return "pending";
46
- }
47
- export function validatePRCheckpoints(checkpoints) {
48
- const gates = {
49
- localChecks: checkpoints.localChecks,
50
- ciChecks: checkpoints.ciChecks,
51
- reviewerApproval: checkpoints.reviewerApproval,
52
- goalVerification: checkpoints.goalVerification,
53
- branchProtection: checkpoints.branchProtection,
54
- };
55
- const results = {};
56
- for (const [name, cp] of Object.entries(gates)) {
57
- results[name] = validateCheckpoint(cp);
58
- }
59
- const failures = Object.entries(gates).filter(([_, cp]) => cp.status === "fail");
60
- if (failures.length > 0) {
61
- return {
62
- allowed: false,
63
- reason: `Failed checkpoints: ${failures.map(([k]) => k).join(", ")}`,
64
- checkpointResults: results,
65
- };
66
- }
67
- const pending = Object.entries(gates).filter(([_, cp]) => cp.status === "pending");
68
- if (pending.length > 0) {
69
- return {
70
- allowed: false,
71
- reason: `Pending checkpoints: ${pending.map(([k]) => k).join(", ")}`,
72
- checkpointResults: results,
73
- };
74
- }
75
- return { allowed: true, checkpointResults: results };
76
- }
77
- // ─── Task-local Merge Gate ───
78
- /**
79
- * Task-local merge gate(不依赖全局 canMerge)。
80
- *
81
- * 检查条件(按顺序):
82
- * 1. Task 状态为 "reviewing"
83
- * 2. 存在 PR Checkpoints
84
- * 3. 所有 checkpoint 状态为 pass
85
- * 4. TDD compliance 为 pass / waived / null(无 TDD 要求)
86
- * 5. Branch Protection 已启用
87
- *
88
- * 不要求全局 review Stage 为 pass。
89
- */
90
- export function canMergeTaskPR(task, hasBranchProtection) {
91
- // 1. Task 状态检查
92
- if (task.status === "merged") {
93
- return { allowed: false, reason: "Task already merged", checkpointResults: {} };
94
- }
95
- if (task.status !== "reviewing") {
96
- return { allowed: false, reason: `Task status is ${task.status}, expected reviewing`, checkpointResults: {} };
97
- }
98
- // 2. PR Checkpoints 存在性
99
- if (!task.prCheckpoints) {
100
- return { allowed: false, reason: "No PR checkpoints recorded", checkpointResults: {} };
101
- }
102
- // 3. 标准 checkpoint 验证
103
- const prResult = validatePRCheckpoints(task.prCheckpoints);
104
- if (!prResult.allowed)
105
- return prResult;
106
- // 4. TDD compliance 验证
107
- const tdd = task.prCheckpoints.tddCompliance;
108
- if (tdd !== null && tdd.status === "fail") {
109
- prResult.checkpointResults["tddCompliance"] = "fail";
110
- return {
111
- allowed: false,
112
- reason: `TDD compliance failed: ${tdd.summary}`,
113
- checkpointResults: prResult.checkpointResults,
114
- };
115
- }
116
- // tdd === null → 无 TDD 要求,视为通过
117
- // tdd.status === "pass" / "waived" → 通过
118
- prResult.checkpointResults["tddCompliance"] =
119
- tdd === null ? "skipped" : tdd.status;
120
- // 5. Branch Protection
121
- if (!hasBranchProtection) {
122
- prResult.checkpointResults.branchProtection = "fail";
123
- return {
124
- allowed: false,
125
- reason: "Branch protection not enabled on main",
126
- checkpointResults: prResult.checkpointResults,
127
- };
128
- }
129
- prResult.checkpointResults.branchProtection = "pass";
130
- return prResult;
131
- }
132
- // ─── PR 合并操作 ───
133
- /**
134
- * 标准化合并 PR(无安全检查,向后兼容)。
135
- */
136
- export async function mergePR(prNumber) {
137
- try {
138
- await gh(`pr merge ${prNumber} --squash --delete-branch`);
139
- return { success: true };
140
- }
141
- catch (err) {
142
- return { success: false, error: String(err) };
143
- }
144
- }
145
- /**
146
- * Task-local PR 合并(带 --match-head-commit 安全检查)。
147
- *
148
- * 步骤:
149
- * 1. 验证 verifiedSha 非空
150
- * 2. 使用 gh pr merge --squash --delete-branch --match-head-commit <verifiedSha>
151
- * 3. 失败时返回错误
152
- */
153
- export async function mergeTaskPR(prNumber, verifiedSha) {
154
- if (!verifiedSha) {
155
- return { success: false, error: "verifiedSha is required for merge --match-head-commit" };
156
- }
157
- try {
158
- // --match-head-commit 确保只有 verified 的 commit 才会被合并
159
- await gh(`pr merge ${prNumber} --squash --delete-branch --match-head-commit ${verifiedSha}`);
160
- return { success: true };
161
- }
162
- catch (err) {
163
- return { success: false, error: String(err) };
164
- }
165
- }
166
- // ─── Revert ───
167
- export async function createRevertPR(prNumber, reason) {
168
- try {
169
- const { stdout } = await gh(`pr view ${prNumber} --json headRefName,headRepository,body,title`);
170
- const pr = JSON.parse(stdout);
171
- const revertTitle = `revert: ${pr.title}`;
172
- const revertBody = `Reverts #${prNumber}\n\nReason: ${reason}\n\nAuto-generated by opencode-cabbage.`;
173
- const { stdout: newPR } = await gh(`pr create --title '${revertTitle}' --body '${revertBody}' --base main --head main`);
174
- return { prNumber: parseInt(newPR.trim().split("/").pop() || "0", 10) };
175
- }
176
- catch (err) {
177
- return { error: String(err) };
178
- }
179
- }
180
- //# sourceMappingURL=merge.js.map