@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
package/dist/kernel/release.js
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import { gh as ghCli } from "../util/gh.js";
|
|
2
|
-
/**
|
|
3
|
-
* 解析版本文件规则(Profile `version file` 值):
|
|
4
|
-
* 形如 `package.json`(默认 $.version)或 `lib/version.json $.version`;
|
|
5
|
-
* json 路径必须为 `$.<key>` 形式,否则返回 null。
|
|
6
|
-
*/
|
|
7
|
-
export function parseVersionFileSpec(spec) {
|
|
8
|
-
const trimmed = spec.trim();
|
|
9
|
-
if (trimmed === "")
|
|
10
|
-
return null;
|
|
11
|
-
const parts = trimmed.split(/\s+/);
|
|
12
|
-
if (parts.length === 1) {
|
|
13
|
-
return { path: parts[0], key: "version" };
|
|
14
|
-
}
|
|
15
|
-
const jsonPath = parts[parts.length - 1];
|
|
16
|
-
const key = jsonPath.startsWith("$.") ? jsonPath.slice(2) : "";
|
|
17
|
-
if (key === "")
|
|
18
|
-
return null;
|
|
19
|
-
return { path: parts.slice(0, -1).join(" "), key };
|
|
20
|
-
}
|
|
21
|
-
/** 从 JSON 文本按 key 读取版本字符串;非字符串或解析失败返回 null */
|
|
22
|
-
export function readVersionFromJson(json, key) {
|
|
23
|
-
try {
|
|
24
|
-
const value = JSON.parse(json)?.[key];
|
|
25
|
-
return typeof value === "string" ? value : null;
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/** 更新 JSON 文本中指定 key 的版本;保留缩进风格与结尾换行 */
|
|
32
|
-
export function updateVersionInJson(json, key, version) {
|
|
33
|
-
const parsed = JSON.parse(json);
|
|
34
|
-
parsed[key] = version;
|
|
35
|
-
const updated = JSON.stringify(parsed, null, 2);
|
|
36
|
-
return json.endsWith("\n") ? `${updated}\n` : updated;
|
|
37
|
-
}
|
|
38
|
-
// ─── 版本纯函数 ───
|
|
39
|
-
const VERSION_PATTERN = /^(\d+)\.(\d+)\.(\d+)$/;
|
|
40
|
-
export function parseVersion(raw) {
|
|
41
|
-
const match = VERSION_PATTERN.exec(raw.trim());
|
|
42
|
-
if (!match)
|
|
43
|
-
return null;
|
|
44
|
-
return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };
|
|
45
|
-
}
|
|
46
|
-
export function formatVersion(v) {
|
|
47
|
-
return `${v.major}.${v.minor}.${v.patch}`;
|
|
48
|
-
}
|
|
49
|
-
/** SemVer bump:major 重置 minor/patch,minor 重置 patch,patch +1 */
|
|
50
|
-
export function bumpVersion(current, type) {
|
|
51
|
-
switch (type) {
|
|
52
|
-
case "major":
|
|
53
|
-
return { major: current.major + 1, minor: 0, patch: 0 };
|
|
54
|
-
case "minor":
|
|
55
|
-
return { major: current.major, minor: current.minor + 1, patch: 0 };
|
|
56
|
-
case "patch":
|
|
57
|
-
return { major: current.major, minor: current.minor, patch: current.patch + 1 };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** 取最高 bump 级别:major > minor > patch */
|
|
61
|
-
export function highestBumpType(types) {
|
|
62
|
-
if (types.includes("major"))
|
|
63
|
-
return "major";
|
|
64
|
-
if (types.includes("minor"))
|
|
65
|
-
return "minor";
|
|
66
|
-
return "patch";
|
|
67
|
-
}
|
|
68
|
-
const CONVENTIONAL_PATTERN = /^([a-z]+)(!)?(\([^)]*\))?:/;
|
|
69
|
-
const MAINTENANCE_TYPES = new Set(["chore", "refactor", "build", "ci", "perf", "test", "merge"]);
|
|
70
|
-
/**
|
|
71
|
-
* 从 commit message 分类(conventional commits,关联 Flow/Task type):
|
|
72
|
-
* - breaking:`type!:` 或 body 含 `BREAKING CHANGE`
|
|
73
|
-
* - feat→feature、fix→fix、docs→docs、chore/refactor/build/ci/perf/test/merge→maintenance
|
|
74
|
-
* - 其余 → unclassified
|
|
75
|
-
*/
|
|
76
|
-
export function classifyCommitTitle(title) {
|
|
77
|
-
const firstLine = title.split("\n")[0];
|
|
78
|
-
const breaking = /^[a-z]+!(:|\()/.test(firstLine) || title.includes("BREAKING CHANGE");
|
|
79
|
-
if (firstLine.startsWith("Merge ")) {
|
|
80
|
-
return { category: "maintenance", breaking };
|
|
81
|
-
}
|
|
82
|
-
const match = CONVENTIONAL_PATTERN.exec(firstLine);
|
|
83
|
-
if (!match)
|
|
84
|
-
return { category: "unclassified", breaking };
|
|
85
|
-
const type = match[1];
|
|
86
|
-
switch (type) {
|
|
87
|
-
case "feat":
|
|
88
|
-
return { category: "feature", breaking };
|
|
89
|
-
case "fix":
|
|
90
|
-
return { category: "fix", breaking };
|
|
91
|
-
case "docs":
|
|
92
|
-
return { category: "docs", breaking };
|
|
93
|
-
default:
|
|
94
|
-
if (MAINTENANCE_TYPES.has(type))
|
|
95
|
-
return { category: "maintenance", breaking };
|
|
96
|
-
return { category: "unclassified", breaking };
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export function classifyChanges(commits) {
|
|
100
|
-
return commits.map(commit => {
|
|
101
|
-
const { category, breaking } = classifyCommitTitle(commit.title);
|
|
102
|
-
return { sha: commit.sha, title: commit.title.split("\n")[0], category, breaking };
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* SemVer 提议:breaking→major(含 0.x)、feature→minor、fix/maintenance/docs→patch;
|
|
107
|
-
* 多变更取最高级别;存在未分类变更时拒绝(版本提议前必须分类)。
|
|
108
|
-
*/
|
|
109
|
-
export function proposeVersion(currentVersion, changes) {
|
|
110
|
-
const current = parseVersion(currentVersion);
|
|
111
|
-
if (!current) {
|
|
112
|
-
return { ok: false, code: "INVALID_VERSION", message: `Invalid current version: ${currentVersion}` };
|
|
113
|
-
}
|
|
114
|
-
const unclassified = changes
|
|
115
|
-
.filter(c => c.category === "unclassified")
|
|
116
|
-
.map(c => ({ sha: c.sha, title: c.title }));
|
|
117
|
-
if (unclassified.length > 0) {
|
|
118
|
-
return {
|
|
119
|
-
ok: false,
|
|
120
|
-
code: "UNCLASSIFIED_CHANGES",
|
|
121
|
-
unclassified,
|
|
122
|
-
message: `Unclassified changes must be classified before proposing a version (${unclassified.length} change(s))`,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
const breaking = changes.some(c => c.breaking);
|
|
126
|
-
const types = [];
|
|
127
|
-
for (const c of changes) {
|
|
128
|
-
if (c.category === "feature")
|
|
129
|
-
types.push("minor");
|
|
130
|
-
else if (c.category === "fix" || c.category === "maintenance" || c.category === "docs")
|
|
131
|
-
types.push("patch");
|
|
132
|
-
}
|
|
133
|
-
if (breaking)
|
|
134
|
-
types.push("major");
|
|
135
|
-
const type = highestBumpType(types);
|
|
136
|
-
return { ok: true, proposed: formatVersion(bumpVersion(current, type)), type };
|
|
137
|
-
}
|
|
138
|
-
// ─── tag ───
|
|
139
|
-
/** 按 tag 格式(如 v{version})构建 tag;缺省 v{version} */
|
|
140
|
-
export function buildTag(version, tagFormat) {
|
|
141
|
-
if (tagFormat.includes("{version}")) {
|
|
142
|
-
return tagFormat.replace("{version}", version);
|
|
143
|
-
}
|
|
144
|
-
return `v${version}`;
|
|
145
|
-
}
|
|
146
|
-
/** git tag 名安全白名单(git ref 合法字符子集,杜绝 shell 元字符/引号/分号) */
|
|
147
|
-
const TAG_SAFE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
148
|
-
/** tag 名是否可安全进入 shell 命令;非法(含 tagFormat 注入)→ false */
|
|
149
|
-
export function validateTagName(tag) {
|
|
150
|
-
return TAG_SAFE.test(tag);
|
|
151
|
-
}
|
|
152
|
-
/** tag 是否匹配格式(替换 {version} 为语义版本正则后整体匹配) */
|
|
153
|
-
export function validateTagFormat(tag, tagFormat) {
|
|
154
|
-
const escaped = tagFormat.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace("\\{version\\}", "(\\d+\\.\\d+\\.\\d+)");
|
|
155
|
-
return new RegExp(`^${escaped}$`).test(tag);
|
|
156
|
-
}
|
|
157
|
-
// ─── Release Notes ───
|
|
158
|
-
const SECTION_TITLES = [
|
|
159
|
-
["feature", "Features"],
|
|
160
|
-
["fix", "Fixes"],
|
|
161
|
-
["maintenance", "Maintenance"],
|
|
162
|
-
["docs", "Documentation"],
|
|
163
|
-
];
|
|
164
|
-
/** 按分类聚合生成 Release Notes markdown;breaking 变更单独列出 */
|
|
165
|
-
export function buildReleaseNotes(version, changes) {
|
|
166
|
-
const lines = [`## ${version}`];
|
|
167
|
-
const breaking = changes.filter(c => c.breaking);
|
|
168
|
-
if (breaking.length > 0) {
|
|
169
|
-
lines.push("", "### BREAKING CHANGES");
|
|
170
|
-
for (const c of breaking)
|
|
171
|
-
lines.push(`- ${c.title}`);
|
|
172
|
-
}
|
|
173
|
-
for (const [category, title] of SECTION_TITLES) {
|
|
174
|
-
const group = changes.filter(c => c.category === category);
|
|
175
|
-
if (group.length === 0)
|
|
176
|
-
continue;
|
|
177
|
-
lines.push("", `### ${title}`);
|
|
178
|
-
for (const c of group)
|
|
179
|
-
lines.push(`- ${c.title}`);
|
|
180
|
-
}
|
|
181
|
-
return lines.join("\n");
|
|
182
|
-
}
|
|
183
|
-
let releaseGhExecutor = null;
|
|
184
|
-
export function setReleaseGhExecutor(fn) {
|
|
185
|
-
releaseGhExecutor = fn;
|
|
186
|
-
}
|
|
187
|
-
/** 解析实际 gh 执行函数:显式 executor > 模块级 mock > 真实 gh CLI */
|
|
188
|
-
function ghFn(executor) {
|
|
189
|
-
return executor ?? releaseGhExecutor ?? ghCli;
|
|
190
|
-
}
|
|
191
|
-
/** 仓库上一 tag 名(tags 列表第一个);无 tag 返回 null */
|
|
192
|
-
export async function latestTag(executor) {
|
|
193
|
-
const { stdout } = await ghFn(executor)(`api repos/{owner}/{repo}/tags --jq '.[0].name'`);
|
|
194
|
-
const trimmed = stdout.trim();
|
|
195
|
-
if (trimmed === "" || trimmed === "null")
|
|
196
|
-
return null;
|
|
197
|
-
return trimmed;
|
|
198
|
-
}
|
|
199
|
-
/** 聚合上一 tag 之后 base 分支的全部 commit(sha + 首行标题) */
|
|
200
|
-
export async function listCommitsSinceTag(tag, baseBranch, executor) {
|
|
201
|
-
if (!validateTagName(tag)) {
|
|
202
|
-
throw new Error(`Invalid tag name: ${tag}`);
|
|
203
|
-
}
|
|
204
|
-
const { stdout } = await ghFn(executor)(`api repos/{owner}/{repo}/compare/${tag}...${baseBranch} --jq '.commits[] | {sha: .sha, title: (.commit.message | split("\\n")[0])}'`);
|
|
205
|
-
const trimmed = stdout.trim();
|
|
206
|
-
if (trimmed === "" || trimmed === "null")
|
|
207
|
-
return [];
|
|
208
|
-
const commits = JSON.parse(trimmed);
|
|
209
|
-
// jq 已截断首行,这里再截断一次(mock/调用方绕过 jq 时兜底)
|
|
210
|
-
return commits.map(c => ({ sha: c.sha, title: c.title.split("\n")[0] }));
|
|
211
|
-
}
|
|
212
|
-
/** 远程已存在 tag 指向的 commit SHA;不存在返回 null */
|
|
213
|
-
export async function existingTagSha(tag, executor) {
|
|
214
|
-
if (!validateTagName(tag)) {
|
|
215
|
-
throw new Error(`Invalid tag name: ${tag}`);
|
|
216
|
-
}
|
|
217
|
-
const { stdout } = await ghFn(executor)(`api repos/{owner}/{repo}/tags --jq '.[] | select(.name == ${JSON.stringify(tag)}) | .commit.sha'`);
|
|
218
|
-
const trimmed = stdout.trim();
|
|
219
|
-
if (trimmed === "" || trimmed === "null")
|
|
220
|
-
return null;
|
|
221
|
-
return trimmed;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* tag 不可变校验:不得删除重打。
|
|
225
|
-
* 远程已存在且指向不同 SHA → 拒绝;指向同一 SHA → 幂等通过;不存在 → 可创建。
|
|
226
|
-
*/
|
|
227
|
-
export async function validateTagImmutability(tag, expectedSha, executor) {
|
|
228
|
-
const existing = await existingTagSha(tag, executor);
|
|
229
|
-
if (existing === null) {
|
|
230
|
-
return { ok: true };
|
|
231
|
-
}
|
|
232
|
-
if (existing === expectedSha) {
|
|
233
|
-
return { ok: true, reason: "tag already points at the expected commit (idempotent)" };
|
|
234
|
-
}
|
|
235
|
-
return {
|
|
236
|
-
ok: false,
|
|
237
|
-
code: "TAG_ALREADY_EXISTS",
|
|
238
|
-
message: `Tag ${tag} already exists at ${existing}, refusing to re-point it to ${expectedSha} (tags are immutable)`,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=release.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/kernel/release.ts"],"names":[],"mappings":"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"}
|
package/dist/kernel/review.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 审查与合并 kernel 逻辑(spec §4.1,自 flowrun/merge.ts + ci.ts 迁入,逻辑不变)。
|
|
3
|
-
* - mergeTaskPR:标准化合并 PR(--match-head-commit 防偷换)
|
|
4
|
-
* - checkBranchProtection:默认分支保护探测
|
|
5
|
-
* - createRevertPR:回滚 PR
|
|
6
|
-
*/
|
|
7
|
-
export type GhFn = (args: string) => Promise<{
|
|
8
|
-
stdout: string;
|
|
9
|
-
stderr: string;
|
|
10
|
-
}>;
|
|
11
|
-
export declare function setMergeGhExecutor(fn: GhFn | null): void;
|
|
12
|
-
export interface BranchProtectionStatus {
|
|
13
|
-
exists: boolean;
|
|
14
|
-
requiredChecks: string[];
|
|
15
|
-
requiresPR: boolean;
|
|
16
|
-
dismissesStale: boolean;
|
|
17
|
-
}
|
|
18
|
-
export declare function checkBranchProtection(owner: string, repo: string): Promise<BranchProtectionStatus>;
|
|
19
|
-
/**
|
|
20
|
-
* Task PR 合并(带 --match-head-commit 安全检查)。
|
|
21
|
-
*
|
|
22
|
-
* 步骤:
|
|
23
|
-
* 1. 验证 verifiedSha 非空
|
|
24
|
-
* 2. 使用 gh pr merge --squash --delete-branch --match-head-commit <verifiedSha>
|
|
25
|
-
* 3. 失败时返回错误
|
|
26
|
-
*/
|
|
27
|
-
export declare function mergeTaskPR(prNumber: number, verifiedSha: string): Promise<{
|
|
28
|
-
success: boolean;
|
|
29
|
-
error?: string;
|
|
30
|
-
}>;
|
|
31
|
-
export declare function createRevertPR(prNumber: number, reason: string): Promise<{
|
|
32
|
-
prNumber?: number;
|
|
33
|
-
error?: string;
|
|
34
|
-
}>;
|
package/dist/kernel/review.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 审查与合并 kernel 逻辑(spec §4.1,自 flowrun/merge.ts + ci.ts 迁入,逻辑不变)。
|
|
3
|
-
* - mergeTaskPR:标准化合并 PR(--match-head-commit 防偷换)
|
|
4
|
-
* - checkBranchProtection:默认分支保护探测
|
|
5
|
-
* - createRevertPR:回滚 PR
|
|
6
|
-
*/
|
|
7
|
-
import { gh as ghCli, parsePrUrlNumber } from "../util/gh.js";
|
|
8
|
-
import { escapeShellArg } from "../util/shell.js";
|
|
9
|
-
let mergeGhExecutor = null;
|
|
10
|
-
export function setMergeGhExecutor(fn) {
|
|
11
|
-
mergeGhExecutor = fn;
|
|
12
|
-
}
|
|
13
|
-
async function gh(args) {
|
|
14
|
-
if (mergeGhExecutor) {
|
|
15
|
-
return mergeGhExecutor(args);
|
|
16
|
-
}
|
|
17
|
-
return ghCli(args);
|
|
18
|
-
}
|
|
19
|
-
// ─── Branch Protection ───
|
|
20
|
-
export async function checkBranchProtection(owner, repo) {
|
|
21
|
-
try {
|
|
22
|
-
const { stdout } = await gh(`api repos/${owner}/${repo}/branches/main/protection`);
|
|
23
|
-
const data = JSON.parse(stdout);
|
|
24
|
-
const checks = [];
|
|
25
|
-
const requiredPulls = data?.required_pull_request_reviews ?? null;
|
|
26
|
-
const requiredChecks = data?.required_status_checks?.checks ?? [];
|
|
27
|
-
for (const c of requiredChecks) {
|
|
28
|
-
checks.push(c.context);
|
|
29
|
-
}
|
|
30
|
-
return {
|
|
31
|
-
exists: true,
|
|
32
|
-
requiredChecks: checks,
|
|
33
|
-
requiresPR: !!requiredPulls,
|
|
34
|
-
dismissesStale: requiredPulls?.dismiss_stale_reviews ?? false,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return {
|
|
39
|
-
exists: false,
|
|
40
|
-
requiredChecks: [],
|
|
41
|
-
requiresPR: false,
|
|
42
|
-
dismissesStale: false,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// ─── PR 合并操作 ───
|
|
47
|
-
/**
|
|
48
|
-
* Task PR 合并(带 --match-head-commit 安全检查)。
|
|
49
|
-
*
|
|
50
|
-
* 步骤:
|
|
51
|
-
* 1. 验证 verifiedSha 非空
|
|
52
|
-
* 2. 使用 gh pr merge --squash --delete-branch --match-head-commit <verifiedSha>
|
|
53
|
-
* 3. 失败时返回错误
|
|
54
|
-
*/
|
|
55
|
-
export async function mergeTaskPR(prNumber, verifiedSha) {
|
|
56
|
-
if (!verifiedSha) {
|
|
57
|
-
return { success: false, error: "verifiedSha is required for merge --match-head-commit" };
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
// --match-head-commit 确保只有 verified 的 commit 才会被合并
|
|
61
|
-
await gh(`pr merge ${prNumber} --squash --delete-branch --match-head-commit '${verifiedSha}'`);
|
|
62
|
-
return { success: true };
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
return { success: false, error: String(err) };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// ─── Revert ───
|
|
69
|
-
export async function createRevertPR(prNumber, reason) {
|
|
70
|
-
try {
|
|
71
|
-
const { stdout } = await gh(`pr view ${prNumber} --json headRefName,headRepository,body,title`);
|
|
72
|
-
const pr = JSON.parse(stdout);
|
|
73
|
-
const revertTitle = `revert: ${pr.title}`;
|
|
74
|
-
const revertBody = `Reverts #${prNumber}\n\nReason: ${reason}\n\nAuto-generated by opencode-cabbage.`;
|
|
75
|
-
const { stdout: newPR } = await gh(`pr create --title '${escapeShellArg(revertTitle)}' --body '${escapeShellArg(revertBody)}' --base main --head main`);
|
|
76
|
-
return { prNumber: parsePrUrlNumber(newPR) ?? 0 };
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
return { error: String(err) };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=review.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/kernel/review.ts"],"names":[],"mappings":"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"}
|
package/dist/kernel/setup.d.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
export type CmdResult = {
|
|
2
|
-
stdout: string;
|
|
3
|
-
stderr: string;
|
|
4
|
-
};
|
|
5
|
-
export type CmdFn = (args: string, cwd?: string) => Promise<CmdResult>;
|
|
6
|
-
export declare function setSetupGitExecutor(fn: CmdFn | null): void;
|
|
7
|
-
export declare function setSetupGhExecutor(fn: CmdFn | null): void;
|
|
8
|
-
export interface SetupProbeReport {
|
|
9
|
-
gitAvailable: boolean;
|
|
10
|
-
ghAuthenticated: boolean;
|
|
11
|
-
hasRemote: boolean;
|
|
12
|
-
defaultBranch: string | null;
|
|
13
|
-
profileConfirmed: boolean;
|
|
14
|
-
tddCommandExecutable: boolean;
|
|
15
|
-
ciWorkflow: string | null;
|
|
16
|
-
releaseWorkflow: string | null;
|
|
17
|
-
contextMdPresent: boolean;
|
|
18
|
-
branchProtection: boolean;
|
|
19
|
-
versionRuleConfirmed: boolean;
|
|
20
|
-
developmentReady: boolean;
|
|
21
|
-
releaseReady: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* 探测项目 setup 就绪度(PRD R10)。
|
|
25
|
-
* development-ready:git/gh + Profile 确认 + TDD 命令可执行 + CI workflow + 分支保护;
|
|
26
|
-
* release-ready:额外版本规则 + release workflow。
|
|
27
|
-
*/
|
|
28
|
-
export declare function probe(projectDir: string): Promise<SetupProbeReport>;
|
|
29
|
-
/** 从 git remote URL 解析 GitHub owner/repo;非 GitHub 仓库返回 null */
|
|
30
|
-
export declare function parseGithubRemote(url: string): {
|
|
31
|
-
owner: string;
|
|
32
|
-
repo: string;
|
|
33
|
-
} | null;
|
|
34
|
-
export interface InitRepoInput {
|
|
35
|
-
/** 创建 GitHub 远端(gh repo create --source . --push) */
|
|
36
|
-
createRemote?: boolean;
|
|
37
|
-
/** 远端仓库名(缺省用目录名) */
|
|
38
|
-
remoteName?: string;
|
|
39
|
-
/** 远端仓库私有 */
|
|
40
|
-
private?: boolean;
|
|
41
|
-
}
|
|
42
|
-
export interface InitRepoResult {
|
|
43
|
-
ok: boolean;
|
|
44
|
-
initialized: boolean;
|
|
45
|
-
committed: boolean;
|
|
46
|
-
remoteCreated: boolean;
|
|
47
|
-
error?: string;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 初始化 git 仓库(空目录场景):git init → 首次提交 → 可选 gh repo create + push。
|
|
51
|
-
* 已初始化的仓库跳过对应步骤(幂等)。
|
|
52
|
-
*/
|
|
53
|
-
export declare function initRepo(projectDir: string, input: InitRepoInput): Promise<InitRepoResult>;
|
|
54
|
-
export interface GenerateWorkflowsInput {
|
|
55
|
-
prTitle: string;
|
|
56
|
-
defaultBranch?: string | null;
|
|
57
|
-
testCommand?: string | null;
|
|
58
|
-
tagFormat?: string | null;
|
|
59
|
-
releaseWorkflowPath?: string | null;
|
|
60
|
-
}
|
|
61
|
-
export interface GenerateWorkflowsResult {
|
|
62
|
-
ok: boolean;
|
|
63
|
-
created: string[];
|
|
64
|
-
updated: string[];
|
|
65
|
-
existing: string[];
|
|
66
|
-
branch: string | null;
|
|
67
|
-
prNumber: number | null;
|
|
68
|
-
error?: string;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* 缺失时生成 CI/release workflow 草案(技术栈无关,不硬编码包管理器),
|
|
72
|
-
* 创建 chore/setup-workflows 分支 + commit + push + Setup PR(人工合入)。
|
|
73
|
-
* 幂等增强:
|
|
74
|
-
* - 已存在的 workflow 含占位符(Profile 未确认时生成)→ 更新注入 test command(updated)
|
|
75
|
-
* - 分支已存在(上次 PR 创建失败残留的 orphan 分支)→ 复用分支,不重复 checkout -b
|
|
76
|
-
* - 分支已有 open PR → 复用 PR 编号,不重复创建(补建场景)
|
|
77
|
-
*/
|
|
78
|
-
export declare function generateWorkflows(projectDir: string, input: GenerateWorkflowsInput): Promise<GenerateWorkflowsResult>;
|
|
79
|
-
/** CI workflow 草案:PR check 触发,运行 Profile 的测试命令(无则占位);纯文档 PR 不触发(paths-ignore,技术栈无关) */
|
|
80
|
-
export declare function buildCiWorkflow(testCommand: string | null, defaultBranch: string | null): string;
|
|
81
|
-
/** release workflow 草案:tag 触发,技术栈无关占位步骤 */
|
|
82
|
-
export declare function buildReleaseWorkflow(tagFormat: string | null): string;
|
|
83
|
-
export interface ConfirmProfileResult {
|
|
84
|
-
ok: boolean;
|
|
85
|
-
block?: string;
|
|
86
|
-
code?: string;
|
|
87
|
-
message?: string;
|
|
88
|
-
}
|
|
89
|
-
/** 由用户确认的 overrides 生成完整 `## Project Profile` 区块(未提供的键省略) */
|
|
90
|
-
export declare function buildProfileBlock(overrides: Record<string, unknown>): string;
|
|
91
|
-
/**
|
|
92
|
-
* 用户确认后把 Profile 区块写回根 AGENTS.md(§9.3)。
|
|
93
|
-
* 先读后写,按 key 串行(mutex);testCommand 为必需键。
|
|
94
|
-
*/
|
|
95
|
-
export declare function confirmProjectProfile(projectDir: string, overridesJson: string): Promise<ConfirmProfileResult>;
|