@devcxl/opencode-cabbage 1.1.0 → 1.3.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.
- package/.codex-plugin/plugin.json +36 -0
- package/README.md +53 -25
- package/README.zh.md +23 -23
- package/assets/agents/dev-lifecycle.md +208 -68
- package/assets/agents/team/architect.md +22 -7
- package/assets/agents/team/developer.md +13 -6
- package/assets/agents/team/goal-verify.md +4 -1
- package/assets/agents/team/researcher.md +59 -0
- package/assets/agents/team/reviewer.md +34 -18
- package/assets/commands/setup.md +1 -1
- package/assets/prompts/bootstrap.md +10 -9
- package/assets/prompts/stage-contract.md +25 -25
- package/assets/skills/flow-code/SKILL.md +23 -25
- package/assets/skills/flow-design/SKILL.md +94 -26
- package/assets/skills/flow-release/SKILL.md +41 -17
- package/assets/skills/flow-requirements/SKILL.md +19 -13
- package/assets/skills/flow-research/SKILL.md +77 -0
- package/assets/skills/flow-review/SKILL.md +55 -25
- package/assets/skills/flow-setup/SKILL.md +27 -24
- package/assets/skills/flow-tasks/SKILL.md +178 -35
- package/assets/skills/flow-tdd/SKILL.md +68 -40
- package/codex-skills/agent-architect/SKILL.md +79 -0
- package/codex-skills/agent-dev-lifecycle/SKILL.md +309 -0
- package/codex-skills/agent-developer/SKILL.md +51 -0
- package/codex-skills/agent-goal-verify/SKILL.md +45 -0
- package/codex-skills/agent-researcher/SKILL.md +32 -0
- package/codex-skills/agent-reviewer/SKILL.md +109 -0
- package/codex-skills/flow-code/SKILL.md +71 -0
- package/codex-skills/flow-design/SKILL.md +146 -0
- package/codex-skills/flow-release/SKILL.md +90 -0
- package/codex-skills/flow-requirements/SKILL.md +90 -0
- package/codex-skills/flow-research/SKILL.md +77 -0
- package/codex-skills/flow-review/SKILL.md +110 -0
- package/codex-skills/flow-setup/SKILL.md +75 -0
- package/codex-skills/flow-tasks/SKILL.md +220 -0
- package/codex-skills/flow-tdd/SKILL.md +235 -0
- package/dist/hooks/session-start.d.ts +1 -0
- package/dist/hooks/session-start.js +72 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/kernel/session-index.d.ts +8 -25
- package/dist/kernel/session-index.js +5 -55
- package/dist/kernel/session-index.js.map +1 -1
- package/dist/plugin/bootstrap.d.ts +0 -1
- package/dist/plugin/bootstrap.js +0 -3
- package/dist/plugin/bootstrap.js.map +1 -1
- package/dist/plugin/goal-store.d.ts +71 -0
- package/dist/plugin/goal-store.js +54 -0
- package/dist/plugin/goal-store.js.map +1 -0
- package/dist/plugin/goal.d.ts +47 -13
- package/dist/plugin/goal.js +228 -128
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +3 -11
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/prompts.d.ts +0 -1
- package/dist/plugin/prompts.js +0 -4
- package/dist/plugin/prompts.js.map +1 -1
- package/dist/plugin/server.d.ts +3 -5
- package/dist/plugin/server.js +247 -155
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/skills.d.ts +7 -1
- package/dist/plugin/skills.js +75 -12
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +1 -4
- package/dist/plugin.js.map +1 -1
- package/dist/util/gh.d.ts +0 -11
- package/dist/util/gh.js +0 -14
- package/dist/util/gh.js.map +1 -1
- package/dist/util/paths.d.ts +0 -14
- package/dist/util/paths.js +0 -69
- package/dist/util/paths.js.map +1 -1
- package/hooks/hooks.json +17 -0
- package/package.json +12 -4
- package/assets/prompts/ADR-FORMAT.md +0 -45
- package/assets/prompts/PRD-FORMAT.md +0 -17
- package/assets/templates/gitignore +0 -5
- package/dist/kernel/caller.d.ts +0 -48
- package/dist/kernel/caller.js +0 -88
- package/dist/kernel/caller.js.map +0 -1
- package/dist/kernel/flow.d.ts +0 -175
- package/dist/kernel/flow.js +0 -467
- package/dist/kernel/flow.js.map +0 -1
- package/dist/kernel/legacy.d.ts +0 -19
- package/dist/kernel/legacy.js +0 -34
- package/dist/kernel/legacy.js.map +0 -1
- package/dist/kernel/records.d.ts +0 -103
- package/dist/kernel/records.js +0 -240
- package/dist/kernel/records.js.map +0 -1
- package/dist/kernel/release.d.ts +0 -106
- package/dist/kernel/release.js +0 -241
- package/dist/kernel/release.js.map +0 -1
- package/dist/kernel/review.d.ts +0 -34
- package/dist/kernel/review.js +0 -82
- package/dist/kernel/review.js.map +0 -1
- package/dist/kernel/setup.d.ts +0 -95
- package/dist/kernel/setup.js +0 -401
- package/dist/kernel/setup.js.map +0 -1
- package/dist/kernel/slug.d.ts +0 -23
- package/dist/kernel/slug.js +0 -67
- package/dist/kernel/slug.js.map +0 -1
- package/dist/kernel/task.d.ts +0 -213
- package/dist/kernel/task.js +0 -873
- package/dist/kernel/task.js.map +0 -1
- package/dist/kernel/tdd/adapter.d.ts +0 -49
- package/dist/kernel/tdd/adapter.js +0 -294
- package/dist/kernel/tdd/adapter.js.map +0 -1
- package/dist/kernel/tdd/digest.d.ts +0 -18
- package/dist/kernel/tdd/digest.js +0 -303
- package/dist/kernel/tdd/digest.js.map +0 -1
- package/dist/kernel/tdd/evaluator.d.ts +0 -38
- package/dist/kernel/tdd/evaluator.js +0 -185
- package/dist/kernel/tdd/evaluator.js.map +0 -1
- package/dist/kernel/tdd/evidence.d.ts +0 -42
- package/dist/kernel/tdd/evidence.js +0 -48
- package/dist/kernel/tdd/evidence.js.map +0 -1
- package/dist/kernel/tdd/state.d.ts +0 -79
- package/dist/kernel/tdd/state.js +0 -363
- package/dist/kernel/tdd/state.js.map +0 -1
- package/dist/kernel/types.d.ts +0 -180
- package/dist/kernel/types.js +0 -2
- package/dist/kernel/types.js.map +0 -1
- package/dist/kernel/worktree.d.ts +0 -45
- package/dist/kernel/worktree.js +0 -156
- package/dist/kernel/worktree.js.map +0 -1
- package/dist/plugin/flow-control.d.ts +0 -91
- package/dist/plugin/flow-control.js +0 -287
- package/dist/plugin/flow-control.js.map +0 -1
- package/dist/plugin/release-control.d.ts +0 -39
- package/dist/plugin/release-control.js +0 -343
- package/dist/plugin/release-control.js.map +0 -1
- package/dist/plugin/setup-control.d.ts +0 -59
- package/dist/plugin/setup-control.js +0 -111
- package/dist/plugin/setup-control.js.map +0 -1
- package/dist/plugin/task-control.d.ts +0 -90
- package/dist/plugin/task-control.js +0 -208
- package/dist/plugin/task-control.js.map +0 -1
- package/dist/plugin/tdd-checkpoint.d.ts +0 -128
- package/dist/plugin/tdd-checkpoint.js +0 -664
- package/dist/plugin/tdd-checkpoint.js.map +0 -1
- package/dist/util/shell.d.ts +0 -1
- package/dist/util/shell.js +0 -4
- package/dist/util/shell.js.map +0 -1
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import type { TddEvidence, TddCycleEvidence, TddCommandEvidence, AcceptanceCriterion, VersionedDigest } from "../types.js";
|
|
2
|
-
export interface StateError {
|
|
3
|
-
code: string;
|
|
4
|
-
message: string;
|
|
5
|
-
}
|
|
6
|
-
export type StateResult<T> = {
|
|
7
|
-
ok: true;
|
|
8
|
-
value: T;
|
|
9
|
-
} | {
|
|
10
|
-
ok: false;
|
|
11
|
-
error: StateError;
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* 创建初始 TddEvidence(status=not-recorded, revision=0)。
|
|
15
|
-
*/
|
|
16
|
-
export declare function createTaskEvidence(): TddEvidence;
|
|
17
|
-
/**
|
|
18
|
-
* 启动一个新的 TDD cycle。
|
|
19
|
-
*
|
|
20
|
-
* 验证:
|
|
21
|
-
* - criterion 存在且 verification=tdd
|
|
22
|
-
* - testPaths 匹配 testFilePatterns
|
|
23
|
-
* - 同 cycleId + 同 workspace digest → 幂等返回原 evidence
|
|
24
|
-
* - 同 cycleId + 不同 workspace digest → CYCLE_CONFLICT
|
|
25
|
-
*/
|
|
26
|
-
export declare function startCycle(evidence: TddEvidence, cycleId: string, criterionId: string, testPaths: string[], _testSelector: string, workspaceDigest: VersionedDigest, acceptanceCriteria: AcceptanceCriterion[], testFilePatterns: string[]): StateResult<{
|
|
27
|
-
evidence: TddEvidence;
|
|
28
|
-
cycle: TddCycleEvidence;
|
|
29
|
-
}>;
|
|
30
|
-
/**
|
|
31
|
-
* 记录 RED 尝试。
|
|
32
|
-
*
|
|
33
|
-
* 验证:
|
|
34
|
-
* - cycle 存在且 status ∈ {started, red}
|
|
35
|
-
* - failureKind 为 assertion 或 missing-behavior(有效 RED)
|
|
36
|
-
* - 幂等:相同 outputDigest → 返回原结果
|
|
37
|
-
*/
|
|
38
|
-
export declare function recordRed(evidence: TddEvidence, cycleId: string, redEvidence: TddCommandEvidence): StateResult<{
|
|
39
|
-
evidence: TddEvidence;
|
|
40
|
-
cycle: TddCycleEvidence;
|
|
41
|
-
}>;
|
|
42
|
-
/**
|
|
43
|
-
* 记录 GREEN 尝试。
|
|
44
|
-
*
|
|
45
|
-
* 验证:
|
|
46
|
-
* - cycle 存在且已有有效 RED(redTestDigest !== null)
|
|
47
|
-
* - GREEN exitCode === 0
|
|
48
|
-
* - implementation files 有变化
|
|
49
|
-
* - 幂等:相同 outputDigest → 返回原结果
|
|
50
|
-
*/
|
|
51
|
-
export declare function recordGreen(evidence: TddEvidence, cycleId: string, greenEvidence: TddCommandEvidence, implementationFilesChanged: boolean): StateResult<{
|
|
52
|
-
evidence: TddEvidence;
|
|
53
|
-
cycle: TddCycleEvidence;
|
|
54
|
-
}>;
|
|
55
|
-
/**
|
|
56
|
-
* 记录最终 regression 结果。
|
|
57
|
-
*
|
|
58
|
-
* 验证:
|
|
59
|
-
* - runs 非空
|
|
60
|
-
* - 所有 run exitCode === 0 且无 timeout 则 pass,否则 fail
|
|
61
|
-
*/
|
|
62
|
-
export declare function recordFinalRegression(evidence: TddEvidence, headSha: string, treeSha: string, runs: TddCommandEvidence[]): StateResult<TddEvidence>;
|
|
63
|
-
/**
|
|
64
|
-
* 记录最终 verification 结果。
|
|
65
|
-
*
|
|
66
|
-
* 规则:
|
|
67
|
-
* - runs 为空 → pass(未配置 verifyCommands)
|
|
68
|
-
* - 所有 run exitCode === 0 则 pass,否则 fail
|
|
69
|
-
*/
|
|
70
|
-
export declare function recordFinalVerification(evidence: TddEvidence, headSha: string, treeSha: string, runs: TddCommandEvidence[]): StateResult<TddEvidence>;
|
|
71
|
-
/**
|
|
72
|
-
* 放弃一个 cycle。
|
|
73
|
-
*
|
|
74
|
-
* 规则:
|
|
75
|
-
* - cycle 必须存在
|
|
76
|
-
* - cycle 状态不能是 "pass"(已通过的 cycle 不能放弃)
|
|
77
|
-
* - 保留审计记录,reason 写入 warnings
|
|
78
|
-
*/
|
|
79
|
-
export declare function abandonCycle(evidence: TddEvidence, cycleId: string, reason: string): StateResult<TddEvidence>;
|
package/dist/kernel/tdd/state.js
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
// ─── 辅助函数 ───
|
|
2
|
-
function findCycle(evidence, cycleId) {
|
|
3
|
-
return evidence.cycles.find(c => c.cycleId === cycleId);
|
|
4
|
-
}
|
|
5
|
-
function replaceCycle(evidence, updated) {
|
|
6
|
-
return evidence.cycles.map(c => c.cycleId === updated.cycleId ? updated : c);
|
|
7
|
-
}
|
|
8
|
-
function bumpRevision(evidence) {
|
|
9
|
-
return { ...evidence, revision: evidence.revision + 1, updatedAt: new Date().toISOString() };
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* 简单 glob 匹配(支持 *、**)
|
|
13
|
-
*/
|
|
14
|
-
function matchSimpleGlob(filePath, pattern) {
|
|
15
|
-
const normalized = filePath.split("/").join("/");
|
|
16
|
-
let regexStr = "";
|
|
17
|
-
let i = 0;
|
|
18
|
-
while (i < pattern.length) {
|
|
19
|
-
if (pattern[i] === "*" && pattern[i + 1] === "*") {
|
|
20
|
-
i += 2;
|
|
21
|
-
if (i < pattern.length && pattern[i] === "/") {
|
|
22
|
-
regexStr += "(.*/)?";
|
|
23
|
-
i++;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
regexStr += ".*";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
else if (pattern[i] === "*") {
|
|
30
|
-
regexStr += "[^/]*";
|
|
31
|
-
i++;
|
|
32
|
-
}
|
|
33
|
-
else if (pattern[i] === ".") {
|
|
34
|
-
regexStr += "\\.";
|
|
35
|
-
i++;
|
|
36
|
-
}
|
|
37
|
-
else if (pattern[i] === "?") {
|
|
38
|
-
regexStr += "[^/]";
|
|
39
|
-
i++;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
if ("+^$(){}[]|\\".includes(pattern[i])) {
|
|
43
|
-
regexStr += "\\" + pattern[i];
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
regexStr += pattern[i];
|
|
47
|
-
}
|
|
48
|
-
i++;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return new RegExp(`^${regexStr}$`).test(normalized);
|
|
52
|
-
}
|
|
53
|
-
function matchesAnyPattern(path, patterns) {
|
|
54
|
-
if (patterns.length === 0)
|
|
55
|
-
return false;
|
|
56
|
-
return patterns.some(p => matchSimpleGlob(path, p));
|
|
57
|
-
}
|
|
58
|
-
function digestEqual(a, b) {
|
|
59
|
-
if (a === null || b === null)
|
|
60
|
-
return a === b;
|
|
61
|
-
return a.algorithm === b.algorithm && a.value === b.value;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 判断 RED failure 是否有效:
|
|
65
|
-
* 只有 assertion 和 missing-behavior 才是有效的 RED failure。
|
|
66
|
-
*/
|
|
67
|
-
function isValidRedFailure(failureKind) {
|
|
68
|
-
return failureKind === "assertion" || failureKind === "missing-behavior";
|
|
69
|
-
}
|
|
70
|
-
// ─── 公开函数 ───
|
|
71
|
-
/**
|
|
72
|
-
* 创建初始 TddEvidence(status=not-recorded, revision=0)。
|
|
73
|
-
*/
|
|
74
|
-
export function createTaskEvidence() {
|
|
75
|
-
return {
|
|
76
|
-
revision: 0,
|
|
77
|
-
reworkRevision: 0,
|
|
78
|
-
status: "not-recorded",
|
|
79
|
-
taskStart: { status: "pending", headSha: null, treeSha: null, startedAt: null },
|
|
80
|
-
cycles: [],
|
|
81
|
-
regression: { status: "pending", headSha: null, treeSha: null, reworkRevision: 0, runs: [] },
|
|
82
|
-
verification: { status: "pending", headSha: null, treeSha: null, runs: [] },
|
|
83
|
-
alternativeValidation: [],
|
|
84
|
-
reworks: [],
|
|
85
|
-
warnings: [],
|
|
86
|
-
updatedAt: null,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 启动一个新的 TDD cycle。
|
|
91
|
-
*
|
|
92
|
-
* 验证:
|
|
93
|
-
* - criterion 存在且 verification=tdd
|
|
94
|
-
* - testPaths 匹配 testFilePatterns
|
|
95
|
-
* - 同 cycleId + 同 workspace digest → 幂等返回原 evidence
|
|
96
|
-
* - 同 cycleId + 不同 workspace digest → CYCLE_CONFLICT
|
|
97
|
-
*/
|
|
98
|
-
export function startCycle(evidence, cycleId, criterionId, testPaths, _testSelector, workspaceDigest, acceptanceCriteria, testFilePatterns) {
|
|
99
|
-
// ── 验证 criterion 存在且为 tdd ──
|
|
100
|
-
const criterion = acceptanceCriteria.find(c => c.id === criterionId);
|
|
101
|
-
if (!criterion || criterion.verification !== "tdd") {
|
|
102
|
-
return {
|
|
103
|
-
ok: false,
|
|
104
|
-
error: { code: "CRITERION_NOT_FOUND", message: `Criterion "${criterionId}" not found or not verification=tdd` },
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
// ── 验证 testPaths 匹配 testFilePatterns ──
|
|
108
|
-
for (const tp of testPaths) {
|
|
109
|
-
if (!matchesAnyPattern(tp, testFilePatterns)) {
|
|
110
|
-
return {
|
|
111
|
-
ok: false,
|
|
112
|
-
error: { code: "POLICY_INVALID", message: `Test path "${tp}" does not match testFilePatterns` },
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// ── 检查已有 cycle ──
|
|
117
|
-
const existing = findCycle(evidence, cycleId);
|
|
118
|
-
if (existing) {
|
|
119
|
-
// 幂等:相同 workspace digest
|
|
120
|
-
if (digestEqual(existing.startWorkspaceDigest, workspaceDigest)) {
|
|
121
|
-
return { ok: true, value: { evidence, cycle: existing } };
|
|
122
|
-
}
|
|
123
|
-
// 冲突
|
|
124
|
-
return {
|
|
125
|
-
ok: false,
|
|
126
|
-
error: { code: "CYCLE_CONFLICT", message: `Cycle "${cycleId}" already exists with different workspace digest` },
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// ── 创建新 cycle ──
|
|
130
|
-
const cycle = {
|
|
131
|
-
cycleId,
|
|
132
|
-
criterionId,
|
|
133
|
-
reworkRevision: evidence.reworkRevision,
|
|
134
|
-
status: "started",
|
|
135
|
-
startWorkspaceDigest: workspaceDigest,
|
|
136
|
-
testFiles: testPaths,
|
|
137
|
-
redTestDigest: null,
|
|
138
|
-
redAttempts: [],
|
|
139
|
-
greenAttempts: [],
|
|
140
|
-
};
|
|
141
|
-
const newEvidence = bumpRevision({
|
|
142
|
-
...evidence,
|
|
143
|
-
status: evidence.status === "not-recorded" ? "in-progress" : evidence.status,
|
|
144
|
-
cycles: [...evidence.cycles, cycle],
|
|
145
|
-
});
|
|
146
|
-
return { ok: true, value: { evidence: newEvidence, cycle } };
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* 记录 RED 尝试。
|
|
150
|
-
*
|
|
151
|
-
* 验证:
|
|
152
|
-
* - cycle 存在且 status ∈ {started, red}
|
|
153
|
-
* - failureKind 为 assertion 或 missing-behavior(有效 RED)
|
|
154
|
-
* - 幂等:相同 outputDigest → 返回原结果
|
|
155
|
-
*/
|
|
156
|
-
export function recordRed(evidence, cycleId, redEvidence) {
|
|
157
|
-
const existing = findCycle(evidence, cycleId);
|
|
158
|
-
if (!existing) {
|
|
159
|
-
return {
|
|
160
|
-
ok: false,
|
|
161
|
-
error: { code: "CYCLE_CONFLICT", message: `Cycle "${cycleId}" not found` },
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
// cycle 必须处于 started 或 red 状态
|
|
165
|
-
if (existing.status !== "started" && existing.status !== "red") {
|
|
166
|
-
return {
|
|
167
|
-
ok: false,
|
|
168
|
-
error: { code: "INVALID_TRANSITION", message: `Cycle "${cycleId}" is in "${existing.status}" state, cannot record RED` },
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
// ── 失败分类校验 ──
|
|
172
|
-
const exitCode = redEvidence.exitCode;
|
|
173
|
-
// 测试通过(exitCode === 0)→ RED_EXPECTED_FAILURE
|
|
174
|
-
if (exitCode === 0) {
|
|
175
|
-
return {
|
|
176
|
-
ok: false,
|
|
177
|
-
error: { code: "RED_EXPECTED_FAILURE", message: "RED requires test failure (exitCode !== 0)" },
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
// timeout
|
|
181
|
-
if (redEvidence.failureKind === "timeout") {
|
|
182
|
-
return {
|
|
183
|
-
ok: false,
|
|
184
|
-
error: { code: "COMMAND_TIMEOUT", message: "Test execution timed out" },
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
// infrastructure 或 unknown → 不算 RED
|
|
188
|
-
if (!isValidRedFailure(redEvidence.failureKind)) {
|
|
189
|
-
return {
|
|
190
|
-
ok: false,
|
|
191
|
-
error: { code: "RED_INFRASTRUCTURE_FAILURE", message: `Failure kind "${redEvidence.failureKind}" is not a valid RED failure (expected assertion or missing-behavior)` },
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
// ── 幂等检查:相同 outputDigest ──
|
|
195
|
-
const dup = existing.redAttempts.find(a => digestEqual(a.outputDigest, redEvidence.outputDigest));
|
|
196
|
-
if (dup) {
|
|
197
|
-
// 已经记录过相同的 RED,返回原 evidence(不修改)
|
|
198
|
-
return { ok: true, value: { evidence, cycle: existing } };
|
|
199
|
-
}
|
|
200
|
-
// ── 记录 RED ──
|
|
201
|
-
const updatedCycle = {
|
|
202
|
-
...existing,
|
|
203
|
-
status: "red",
|
|
204
|
-
redTestDigest: redEvidence.executionInputDigest,
|
|
205
|
-
redAttempts: [...existing.redAttempts, redEvidence],
|
|
206
|
-
};
|
|
207
|
-
const newEvidence = bumpRevision({
|
|
208
|
-
...evidence,
|
|
209
|
-
cycles: replaceCycle(evidence, updatedCycle),
|
|
210
|
-
});
|
|
211
|
-
return { ok: true, value: { evidence: newEvidence, cycle: updatedCycle } };
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* 记录 GREEN 尝试。
|
|
215
|
-
*
|
|
216
|
-
* 验证:
|
|
217
|
-
* - cycle 存在且已有有效 RED(redTestDigest !== null)
|
|
218
|
-
* - GREEN exitCode === 0
|
|
219
|
-
* - implementation files 有变化
|
|
220
|
-
* - 幂等:相同 outputDigest → 返回原结果
|
|
221
|
-
*/
|
|
222
|
-
export function recordGreen(evidence, cycleId, greenEvidence, implementationFilesChanged) {
|
|
223
|
-
const existing = findCycle(evidence, cycleId);
|
|
224
|
-
if (!existing) {
|
|
225
|
-
return {
|
|
226
|
-
ok: false,
|
|
227
|
-
error: { code: "CYCLE_CONFLICT", message: `Cycle "${cycleId}" not found` },
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
// 必须有 RED
|
|
231
|
-
if (existing.redTestDigest === null || existing.redAttempts.length === 0) {
|
|
232
|
-
return {
|
|
233
|
-
ok: false,
|
|
234
|
-
error: { code: "INVALID_TRANSITION", message: `Cycle "${cycleId}" has no RED recorded` },
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
// GREEN 测试必须通过
|
|
238
|
-
if (greenEvidence.exitCode !== 0) {
|
|
239
|
-
return {
|
|
240
|
-
ok: false,
|
|
241
|
-
error: { code: "GREEN_EXPECTED_PASS", message: "GREEN requires all tests to pass (exitCode === 0)" },
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
// 必须有实现变化
|
|
245
|
-
if (!implementationFilesChanged) {
|
|
246
|
-
return {
|
|
247
|
-
ok: false,
|
|
248
|
-
error: { code: "IMPLEMENTATION_CHANGE_REQUIRED", message: "GREEN requires implementation file changes" },
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
// ── 幂等检查:相同 outputDigest ──
|
|
252
|
-
const dup = existing.greenAttempts.find(a => digestEqual(a.outputDigest, greenEvidence.outputDigest));
|
|
253
|
-
if (dup) {
|
|
254
|
-
return { ok: true, value: { evidence, cycle: existing } };
|
|
255
|
-
}
|
|
256
|
-
// ── 记录 GREEN ──
|
|
257
|
-
const updatedCycle = {
|
|
258
|
-
...existing,
|
|
259
|
-
status: "pass",
|
|
260
|
-
greenAttempts: [...existing.greenAttempts, greenEvidence],
|
|
261
|
-
};
|
|
262
|
-
const newEvidence = bumpRevision({
|
|
263
|
-
...evidence,
|
|
264
|
-
cycles: replaceCycle(evidence, updatedCycle),
|
|
265
|
-
});
|
|
266
|
-
return { ok: true, value: { evidence: newEvidence, cycle: updatedCycle } };
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* 记录最终 regression 结果。
|
|
270
|
-
*
|
|
271
|
-
* 验证:
|
|
272
|
-
* - runs 非空
|
|
273
|
-
* - 所有 run exitCode === 0 且无 timeout 则 pass,否则 fail
|
|
274
|
-
*/
|
|
275
|
-
export function recordFinalRegression(evidence, headSha, treeSha, runs) {
|
|
276
|
-
if (runs.length === 0) {
|
|
277
|
-
return {
|
|
278
|
-
ok: false,
|
|
279
|
-
error: { code: "REGRESSION_FAILED", message: "Regression requires at least one run" },
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
const allPass = runs.every(r => r.exitCode === 0 && r.failureKind !== "timeout");
|
|
283
|
-
const status = allPass ? "pass" : "fail";
|
|
284
|
-
const newEvidence = bumpRevision({
|
|
285
|
-
...evidence,
|
|
286
|
-
regression: {
|
|
287
|
-
status,
|
|
288
|
-
headSha,
|
|
289
|
-
treeSha,
|
|
290
|
-
reworkRevision: evidence.reworkRevision,
|
|
291
|
-
runs,
|
|
292
|
-
},
|
|
293
|
-
});
|
|
294
|
-
return { ok: true, value: newEvidence };
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* 记录最终 verification 结果。
|
|
298
|
-
*
|
|
299
|
-
* 规则:
|
|
300
|
-
* - runs 为空 → pass(未配置 verifyCommands)
|
|
301
|
-
* - 所有 run exitCode === 0 则 pass,否则 fail
|
|
302
|
-
*/
|
|
303
|
-
export function recordFinalVerification(evidence, headSha, treeSha, runs) {
|
|
304
|
-
if (runs.length === 0) {
|
|
305
|
-
// 未配置 verifyCommands,视为 pass
|
|
306
|
-
const newEvidence = bumpRevision({
|
|
307
|
-
...evidence,
|
|
308
|
-
verification: {
|
|
309
|
-
status: "pass",
|
|
310
|
-
headSha,
|
|
311
|
-
treeSha,
|
|
312
|
-
runs: [],
|
|
313
|
-
},
|
|
314
|
-
});
|
|
315
|
-
return { ok: true, value: newEvidence };
|
|
316
|
-
}
|
|
317
|
-
const allPass = runs.every(r => r.exitCode === 0);
|
|
318
|
-
const status = allPass ? "pass" : "fail";
|
|
319
|
-
const newEvidence = bumpRevision({
|
|
320
|
-
...evidence,
|
|
321
|
-
verification: {
|
|
322
|
-
status,
|
|
323
|
-
headSha,
|
|
324
|
-
treeSha,
|
|
325
|
-
runs,
|
|
326
|
-
},
|
|
327
|
-
});
|
|
328
|
-
return { ok: true, value: newEvidence };
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* 放弃一个 cycle。
|
|
332
|
-
*
|
|
333
|
-
* 规则:
|
|
334
|
-
* - cycle 必须存在
|
|
335
|
-
* - cycle 状态不能是 "pass"(已通过的 cycle 不能放弃)
|
|
336
|
-
* - 保留审计记录,reason 写入 warnings
|
|
337
|
-
*/
|
|
338
|
-
export function abandonCycle(evidence, cycleId, reason) {
|
|
339
|
-
const existing = findCycle(evidence, cycleId);
|
|
340
|
-
if (!existing) {
|
|
341
|
-
return {
|
|
342
|
-
ok: false,
|
|
343
|
-
error: { code: "CYCLE_CONFLICT", message: `Cycle "${cycleId}" not found` },
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
if (existing.status === "pass") {
|
|
347
|
-
return {
|
|
348
|
-
ok: false,
|
|
349
|
-
error: { code: "INVALID_TRANSITION", message: `Cannot abandon cycle "${cycleId}" that has already passed` },
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
const updatedCycle = {
|
|
353
|
-
...existing,
|
|
354
|
-
status: "abandoned",
|
|
355
|
-
};
|
|
356
|
-
const newEvidence = bumpRevision({
|
|
357
|
-
...evidence,
|
|
358
|
-
cycles: replaceCycle(evidence, updatedCycle),
|
|
359
|
-
warnings: [...evidence.warnings, reason],
|
|
360
|
-
});
|
|
361
|
-
return { ok: true, value: newEvidence };
|
|
362
|
-
}
|
|
363
|
-
//# sourceMappingURL=state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/kernel/tdd/state.ts"],"names":[],"mappings":"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"}
|
package/dist/kernel/types.d.ts
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/** Flow Record 引用:GitHub Parent Issue 承载 Flow 生命周期与阶段状态 */
|
|
2
|
-
export interface FlowRecordRef {
|
|
3
|
-
parentIssueNumber: number;
|
|
4
|
-
slug: string;
|
|
5
|
-
}
|
|
6
|
-
/** Task Record 引用:GitHub Sub Issue 承载 Task 生命周期与 TDD 证据 */
|
|
7
|
-
export interface TaskRecordRef {
|
|
8
|
-
parentIssueNumber: number;
|
|
9
|
-
taskId: string;
|
|
10
|
-
issueNumber: number;
|
|
11
|
-
}
|
|
12
|
-
export interface AcceptanceCriterion {
|
|
13
|
-
id: string;
|
|
14
|
-
description: string;
|
|
15
|
-
verification: "tdd" | "regression" | "manual";
|
|
16
|
-
}
|
|
17
|
-
export type TddMode = "strict" | "relaxed" | "bypass";
|
|
18
|
-
export type TddEnforcement = "advisory" | "runtime";
|
|
19
|
-
export interface TddRunnerPolicy {
|
|
20
|
-
adapter: "vitest";
|
|
21
|
-
baseCommand: string;
|
|
22
|
-
timeoutMs: number;
|
|
23
|
-
executionInputPatterns: string[];
|
|
24
|
-
}
|
|
25
|
-
export interface VersionedDigest {
|
|
26
|
-
algorithm: "sha256-content-v1" | "sha256-output-v1" | "git-tree-v1";
|
|
27
|
-
value: string;
|
|
28
|
-
}
|
|
29
|
-
export type TddApproval = {
|
|
30
|
-
kind: "planning-pr";
|
|
31
|
-
repo: string;
|
|
32
|
-
prNumber: number;
|
|
33
|
-
reviewId: number;
|
|
34
|
-
approver: string;
|
|
35
|
-
mergedCommitSha: string;
|
|
36
|
-
policyDigest: string;
|
|
37
|
-
} | {
|
|
38
|
-
kind: "issue-comment";
|
|
39
|
-
repo: string;
|
|
40
|
-
issueNumber: number;
|
|
41
|
-
commentId: number;
|
|
42
|
-
approver: string;
|
|
43
|
-
commentBodyDigest: VersionedDigest;
|
|
44
|
-
policyDigest: string;
|
|
45
|
-
} | {
|
|
46
|
-
kind: "legacy-migration";
|
|
47
|
-
fromSchemaVersion: 1;
|
|
48
|
-
};
|
|
49
|
-
export interface TaskCommand {
|
|
50
|
-
command: string;
|
|
51
|
-
cwd: string;
|
|
52
|
-
timeoutMs: number;
|
|
53
|
-
env: Record<string, string>;
|
|
54
|
-
}
|
|
55
|
-
export type AlternativeValidation = {
|
|
56
|
-
validationId: string;
|
|
57
|
-
kind: "command";
|
|
58
|
-
command: TaskCommand;
|
|
59
|
-
} | {
|
|
60
|
-
validationId: string;
|
|
61
|
-
kind: "manual";
|
|
62
|
-
description: string;
|
|
63
|
-
};
|
|
64
|
-
export interface TddException {
|
|
65
|
-
reason: string;
|
|
66
|
-
alternativeValidation: AlternativeValidation[];
|
|
67
|
-
approval: TddApproval;
|
|
68
|
-
}
|
|
69
|
-
export interface TddPolicy {
|
|
70
|
-
mode: TddMode;
|
|
71
|
-
enforcement: TddEnforcement;
|
|
72
|
-
runner: TddRunnerPolicy | null;
|
|
73
|
-
testFilePatterns: string[];
|
|
74
|
-
implementationFilePatterns: string[];
|
|
75
|
-
generatedArtifactPatterns: string[];
|
|
76
|
-
exception: TddException | null;
|
|
77
|
-
source: {
|
|
78
|
-
manifestPath: string;
|
|
79
|
-
revisionSha: string;
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
export type TddFailureKind = "assertion" | "missing-behavior" | "infrastructure" | "timeout" | "unknown";
|
|
83
|
-
export interface TddCommandEvidence {
|
|
84
|
-
command: string;
|
|
85
|
-
testSelector: string | null;
|
|
86
|
-
exitCode: number | null;
|
|
87
|
-
failureKind: TddFailureKind | null;
|
|
88
|
-
testsCollected: number | null;
|
|
89
|
-
testsFailed: number | null;
|
|
90
|
-
startedAt: string;
|
|
91
|
-
finishedAt: string;
|
|
92
|
-
durationMs: number;
|
|
93
|
-
changedFiles: string[];
|
|
94
|
-
outputDigest: VersionedDigest;
|
|
95
|
-
workspaceDigest: VersionedDigest;
|
|
96
|
-
executionInputDigest: VersionedDigest;
|
|
97
|
-
summary: string;
|
|
98
|
-
}
|
|
99
|
-
export interface TddTaskStartEvidence {
|
|
100
|
-
status: "pending" | "pass" | "fail";
|
|
101
|
-
headSha: string | null;
|
|
102
|
-
treeSha: string | null;
|
|
103
|
-
startedAt: string | null;
|
|
104
|
-
}
|
|
105
|
-
export interface TddCycleEvidence {
|
|
106
|
-
cycleId: string;
|
|
107
|
-
criterionId: string;
|
|
108
|
-
reworkRevision: number;
|
|
109
|
-
status: "started" | "red" | "pass" | "failed" | "abandoned";
|
|
110
|
-
startWorkspaceDigest: VersionedDigest;
|
|
111
|
-
testFiles: string[];
|
|
112
|
-
redTestDigest: VersionedDigest | null;
|
|
113
|
-
redAttempts: TddCommandEvidence[];
|
|
114
|
-
greenAttempts: TddCommandEvidence[];
|
|
115
|
-
}
|
|
116
|
-
export interface TddRegressionEvidence {
|
|
117
|
-
status: "pending" | "pass" | "fail" | "skipped";
|
|
118
|
-
headSha: string | null;
|
|
119
|
-
treeSha: string | null;
|
|
120
|
-
reworkRevision: number;
|
|
121
|
-
runs: TddCommandEvidence[];
|
|
122
|
-
}
|
|
123
|
-
export interface FinalVerificationEvidence {
|
|
124
|
-
status: "pending" | "pass" | "fail";
|
|
125
|
-
headSha: string | null;
|
|
126
|
-
treeSha: string | null;
|
|
127
|
-
runs: TddCommandEvidence[];
|
|
128
|
-
}
|
|
129
|
-
export type AlternativeValidationEvidence = {
|
|
130
|
-
validationId: string;
|
|
131
|
-
kind: "command";
|
|
132
|
-
status: "pass" | "fail";
|
|
133
|
-
headSha: string;
|
|
134
|
-
treeSha: string;
|
|
135
|
-
reworkRevision: number;
|
|
136
|
-
evidence: TddCommandEvidence;
|
|
137
|
-
} | {
|
|
138
|
-
validationId: string;
|
|
139
|
-
kind: "manual";
|
|
140
|
-
status: "pass" | "fail";
|
|
141
|
-
headSha: string;
|
|
142
|
-
treeSha: string;
|
|
143
|
-
reworkRevision: number;
|
|
144
|
-
reviewRef: string;
|
|
145
|
-
reviewer: string;
|
|
146
|
-
contentDigest: VersionedDigest;
|
|
147
|
-
policyDigest: string;
|
|
148
|
-
summary: string;
|
|
149
|
-
};
|
|
150
|
-
export interface ReworkApproval {
|
|
151
|
-
reworkRevision: number;
|
|
152
|
-
kind: "refactor";
|
|
153
|
-
headSha: string;
|
|
154
|
-
treeSha: string;
|
|
155
|
-
reviewerSessionId: string;
|
|
156
|
-
reviewerMessageId: string;
|
|
157
|
-
contentDigest: VersionedDigest;
|
|
158
|
-
policyDigest: string;
|
|
159
|
-
}
|
|
160
|
-
export interface TddReworkEvidence {
|
|
161
|
-
reworkRevision: number;
|
|
162
|
-
kind: "behavior" | "refactor";
|
|
163
|
-
affectedCriterionIds: string[];
|
|
164
|
-
status: "started" | "evidence-ready" | "pass" | "fail";
|
|
165
|
-
startHeadSha: string;
|
|
166
|
-
approval: ReworkApproval | null;
|
|
167
|
-
}
|
|
168
|
-
export interface TddEvidence {
|
|
169
|
-
revision: number;
|
|
170
|
-
reworkRevision: number;
|
|
171
|
-
status: "not-recorded" | "pending" | "in-progress" | "pass" | "fail" | "waived";
|
|
172
|
-
taskStart: TddTaskStartEvidence;
|
|
173
|
-
cycles: TddCycleEvidence[];
|
|
174
|
-
regression: TddRegressionEvidence;
|
|
175
|
-
verification: FinalVerificationEvidence;
|
|
176
|
-
alternativeValidation: AlternativeValidationEvidence[];
|
|
177
|
-
reworks: TddReworkEvidence[];
|
|
178
|
-
warnings: string[];
|
|
179
|
-
updatedAt: string | null;
|
|
180
|
-
}
|
package/dist/kernel/types.js
DELETED
package/dist/kernel/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/kernel/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { BranchType } from "./slug.js";
|
|
2
|
-
type GitFn = (args: string) => Promise<{
|
|
3
|
-
stdout: string;
|
|
4
|
-
stderr: string;
|
|
5
|
-
}>;
|
|
6
|
-
export declare function setWorktreeGitExecutor(fn: GitFn | null): void;
|
|
7
|
-
export type WorktreeStartResult = {
|
|
8
|
-
ok: true;
|
|
9
|
-
branch: string;
|
|
10
|
-
path: string;
|
|
11
|
-
reused: boolean;
|
|
12
|
-
} | {
|
|
13
|
-
ok: false;
|
|
14
|
-
code: "BRANCH_EXISTS" | "BRANCH_EXISTS_UNMERGED" | "BRANCH_MISMATCH" | "INVALID_SLUG" | "GIT_FAILED";
|
|
15
|
-
message: string;
|
|
16
|
-
};
|
|
17
|
-
export interface WorktreeStartInput {
|
|
18
|
-
projectDir: string;
|
|
19
|
-
slug: string;
|
|
20
|
-
base: string;
|
|
21
|
-
branchType?: BranchType;
|
|
22
|
-
}
|
|
23
|
-
/** 分支已存在(本地 ref),未合并 → BRANCH_EXISTS_UNMERGED;已合并残留 → BRANCH_EXISTS */
|
|
24
|
-
export declare function worktreeStart(input: WorktreeStartInput): Promise<WorktreeStartResult>;
|
|
25
|
-
export type DestroyReason = "OK" | "DIRTY_WORKTREE" | "PR_NOT_MERGED" | "BRANCH_NOT_PUSHED" | "NOT_FOUND";
|
|
26
|
-
export type DestroyWorktreeResult = {
|
|
27
|
-
ok: true;
|
|
28
|
-
reason: "OK" | "NOT_FOUND";
|
|
29
|
-
} | {
|
|
30
|
-
ok: false;
|
|
31
|
-
reason: "DIRTY_WORKTREE" | "PR_NOT_MERGED" | "BRANCH_NOT_PUSHED" | "GIT_FAILED";
|
|
32
|
-
message: string;
|
|
33
|
-
};
|
|
34
|
-
export interface DestroyWorktreeInput {
|
|
35
|
-
worktreeDir: string;
|
|
36
|
-
branch: string;
|
|
37
|
-
prMerged: boolean;
|
|
38
|
-
userConfirmed: boolean;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* preflight 顺序:不存在 → 幂等跳过;脏 → 拒绝(不 --force);
|
|
42
|
-
* 未合并 → 需 user_confirmed 且分支已推送;合并且干净 → 自动删除。
|
|
43
|
-
*/
|
|
44
|
-
export declare function destroyWorktree(input: DestroyWorktreeInput): Promise<DestroyWorktreeResult>;
|
|
45
|
-
export {};
|