@devcxl/opencode-cabbage 0.3.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -19
- package/README.zh.md +34 -19
- package/assets/agents/dev-lifecycle.md +60 -41
- package/assets/agents/team/architect.md +36 -1
- package/assets/agents/team/developer.md +89 -0
- package/assets/agents/team/goal-verify.md +5 -1
- package/assets/agents/team/reviewer.md +42 -1
- package/assets/commands/code.md +3 -2
- package/assets/commands/design.md +3 -2
- package/assets/commands/release.md +3 -2
- package/assets/commands/requirements.md +3 -2
- package/assets/commands/review.md +3 -2
- package/assets/commands/setup.md +3 -2
- package/assets/commands/tasks.md +2 -1
- package/assets/prompts/bootstrap.md +9 -8
- package/assets/prompts/stage-contract.md +55 -0
- package/assets/skills/flow-code/SKILL.md +38 -140
- package/assets/skills/flow-design/SKILL.md +33 -74
- package/assets/skills/flow-release/SKILL.md +31 -51
- package/assets/skills/flow-requirements/SKILL.md +47 -45
- package/assets/skills/flow-review/SKILL.md +26 -112
- package/assets/skills/flow-setup/SKILL.md +40 -43
- package/assets/skills/flow-tasks/SKILL.md +30 -139
- package/assets/skills/flow-tdd/SKILL.md +30 -31
- package/dist/kernel/caller.d.ts +48 -0
- package/dist/kernel/caller.js +88 -0
- package/dist/kernel/caller.js.map +1 -0
- package/dist/kernel/context.d.ts +27 -0
- package/dist/kernel/context.js +73 -0
- package/dist/kernel/context.js.map +1 -0
- package/dist/kernel/flow.d.ts +166 -0
- package/dist/kernel/flow.js +387 -0
- package/dist/kernel/flow.js.map +1 -0
- package/dist/kernel/legacy.d.ts +19 -0
- package/dist/kernel/legacy.js +34 -0
- package/dist/kernel/legacy.js.map +1 -0
- package/dist/kernel/mutex.d.ts +8 -0
- package/dist/kernel/mutex.js +23 -0
- package/dist/kernel/mutex.js.map +1 -0
- package/dist/kernel/permission.d.ts +21 -0
- package/dist/kernel/permission.js +37 -0
- package/dist/kernel/permission.js.map +1 -0
- package/dist/kernel/profile.d.ts +35 -0
- package/dist/kernel/profile.js +144 -0
- package/dist/kernel/profile.js.map +1 -0
- package/dist/kernel/records.d.ts +87 -0
- package/dist/kernel/records.js +197 -0
- package/dist/kernel/records.js.map +1 -0
- package/dist/kernel/release.d.ts +104 -0
- package/dist/kernel/release.js +229 -0
- package/dist/kernel/release.js.map +1 -0
- package/dist/kernel/review.d.ts +34 -0
- package/dist/kernel/review.js +81 -0
- package/dist/kernel/review.js.map +1 -0
- package/dist/kernel/session-index.d.ts +43 -0
- package/dist/kernel/session-index.js +120 -0
- package/dist/kernel/session-index.js.map +1 -0
- package/dist/kernel/setup.d.ts +70 -0
- package/dist/kernel/setup.js +324 -0
- package/dist/kernel/setup.js.map +1 -0
- package/dist/kernel/slug.d.ts +23 -0
- package/dist/kernel/slug.js +67 -0
- package/dist/kernel/slug.js.map +1 -0
- package/dist/kernel/task.d.ts +208 -0
- package/dist/kernel/task.js +788 -0
- package/dist/kernel/task.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
- package/dist/kernel/tdd/adapter.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/digest.d.ts +1 -1
- package/dist/kernel/tdd/digest.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
- package/dist/kernel/tdd/evaluator.js.map +1 -0
- package/dist/kernel/tdd/evidence.d.ts +42 -0
- package/dist/kernel/tdd/evidence.js +48 -0
- package/dist/kernel/tdd/evidence.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/state.d.ts +1 -1
- package/dist/kernel/tdd/state.js.map +1 -0
- package/dist/kernel/types.d.ts +180 -0
- package/dist/kernel/types.js +2 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/worktree.d.ts +45 -0
- package/dist/kernel/worktree.js +127 -0
- package/dist/kernel/worktree.js.map +1 -0
- package/dist/plugin/agents.d.ts +5 -17
- package/dist/plugin/agents.js +0 -23
- package/dist/plugin/agents.js.map +1 -1
- package/dist/plugin/flow-control.d.ts +80 -0
- package/dist/plugin/flow-control.js +254 -0
- package/dist/plugin/flow-control.js.map +1 -0
- package/dist/plugin/goal.d.ts +7 -46
- package/dist/plugin/goal.js +32 -116
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +78 -5
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/release-control.d.ts +37 -0
- package/dist/plugin/release-control.js +304 -0
- package/dist/plugin/release-control.js.map +1 -0
- package/dist/plugin/server.d.ts +19 -0
- package/dist/plugin/server.js +147 -302
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/setup-control.d.ts +45 -0
- package/dist/plugin/setup-control.js +80 -0
- package/dist/plugin/setup-control.js.map +1 -0
- package/dist/plugin/shell.d.ts +7 -34
- package/dist/plugin/shell.js +12 -137
- package/dist/plugin/shell.js.map +1 -1
- package/dist/plugin/skills.d.ts +1 -1
- package/dist/plugin/skills.js +16 -17
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin/task-control.d.ts +90 -0
- package/dist/plugin/task-control.js +201 -0
- package/dist/plugin/task-control.js.map +1 -0
- package/dist/plugin/tdd-checkpoint.d.ts +118 -0
- package/dist/plugin/tdd-checkpoint.js +581 -0
- package/dist/plugin/tdd-checkpoint.js.map +1 -0
- package/dist/util/paths.d.ts +0 -2
- package/dist/util/paths.js +1 -7
- package/dist/util/paths.js.map +1 -1
- package/package.json +1 -1
- package/assets/agents/team/backend.md +0 -66
- package/assets/agents/team/frontend.md +0 -63
- package/assets/commands/handoff.md +0 -4
- package/assets/commands/test.md +0 -4
- package/assets/context/CONTEXT.md +0 -40
- package/assets/skills/flow-handoff/SKILL.md +0 -76
- package/assets/skills/flow-requirements/references/interview-guide.md +0 -35
- package/assets/skills/flow-test/SKILL.md +0 -75
- package/dist/flowrun/adapter.js.map +0 -1
- package/dist/flowrun/audit.d.ts +0 -5
- package/dist/flowrun/audit.js +0 -67
- package/dist/flowrun/audit.js.map +0 -1
- package/dist/flowrun/ci.d.ts +0 -64
- package/dist/flowrun/ci.js +0 -184
- package/dist/flowrun/ci.js.map +0 -1
- package/dist/flowrun/coverage.d.ts +0 -70
- package/dist/flowrun/coverage.js +0 -207
- package/dist/flowrun/coverage.js.map +0 -1
- package/dist/flowrun/digest.js.map +0 -1
- package/dist/flowrun/evaluator.js.map +0 -1
- package/dist/flowrun/gate.d.ts +0 -28
- package/dist/flowrun/gate.js +0 -139
- package/dist/flowrun/gate.js.map +0 -1
- package/dist/flowrun/github.d.ts +0 -24
- package/dist/flowrun/github.js +0 -154
- package/dist/flowrun/github.js.map +0 -1
- package/dist/flowrun/index.d.ts +0 -14
- package/dist/flowrun/index.js +0 -15
- package/dist/flowrun/index.js.map +0 -1
- package/dist/flowrun/merge.d.ts +0 -57
- package/dist/flowrun/merge.js +0 -180
- package/dist/flowrun/merge.js.map +0 -1
- package/dist/flowrun/migration.d.ts +0 -11
- package/dist/flowrun/migration.js +0 -276
- package/dist/flowrun/migration.js.map +0 -1
- package/dist/flowrun/resilience.d.ts +0 -18
- package/dist/flowrun/resilience.js +0 -80
- package/dist/flowrun/resilience.js.map +0 -1
- package/dist/flowrun/state.js.map +0 -1
- package/dist/flowrun/transitions.d.ts +0 -66
- package/dist/flowrun/transitions.js +0 -168
- package/dist/flowrun/transitions.js.map +0 -1
- package/dist/flowrun/types.d.ts +0 -356
- package/dist/flowrun/types.js +0 -21
- package/dist/flowrun/types.js.map +0 -1
- package/dist/flowrun/validator.d.ts +0 -19
- package/dist/flowrun/validator.js +0 -209
- package/dist/flowrun/validator.js.map +0 -1
- package/dist/plugin/broker.d.ts +0 -73
- package/dist/plugin/broker.js +0 -140
- package/dist/plugin/broker.js.map +0 -1
- package/dist/plugin/tdd-tool.d.ts +0 -62
- package/dist/plugin/tdd-tool.js +0 -336
- package/dist/plugin/tdd-tool.js.map +0 -1
- /package/dist/{flowrun → kernel/tdd}/adapter.js +0 -0
- /package/dist/{flowrun → kernel/tdd}/digest.js +0 -0
- /package/dist/{flowrun → kernel/tdd}/evaluator.js +0 -0
- /package/dist/{flowrun → kernel/tdd}/state.js +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
|
+
import { gh as ghCli } from "../util/gh.js";
|
|
7
|
+
import { escapeShellArg } from "../util/shell.js";
|
|
8
|
+
import { readProjectProfile } from "../kernel/profile.js";
|
|
9
|
+
import { requireCaller } from "../kernel/caller.js";
|
|
10
|
+
import { classifyChanges, buildTag, buildReleaseNotes, parseVersion, parseVersionFileSpec, proposeVersion, readVersionFromJson, updateVersionInJson, latestTag, listCommitsSinceTag, validateTagImmutability, } from "../kernel/release.js";
|
|
11
|
+
let releaseGhExecutor = null;
|
|
12
|
+
let releaseGitExecutor = null;
|
|
13
|
+
export function setReleaseControlGhExecutor(fn) {
|
|
14
|
+
releaseGhExecutor = fn;
|
|
15
|
+
}
|
|
16
|
+
export function setReleaseControlGitExecutor(fn) {
|
|
17
|
+
releaseGitExecutor = fn;
|
|
18
|
+
}
|
|
19
|
+
const execAsync = promisify(exec);
|
|
20
|
+
async function runGh(args) {
|
|
21
|
+
if (releaseGhExecutor)
|
|
22
|
+
return releaseGhExecutor(args);
|
|
23
|
+
return ghCli(args);
|
|
24
|
+
}
|
|
25
|
+
async function runGit(cwd, args) {
|
|
26
|
+
if (releaseGitExecutor)
|
|
27
|
+
return releaseGitExecutor(args, cwd);
|
|
28
|
+
return execAsync(`git ${args}`, { cwd });
|
|
29
|
+
}
|
|
30
|
+
function releaseBranch(version) {
|
|
31
|
+
return `release/v${version}`;
|
|
32
|
+
}
|
|
33
|
+
/** 聚合上一 tag 后 main 的变更并分类;无 tag 时返回空变更集 */
|
|
34
|
+
async function collectChanges(profile) {
|
|
35
|
+
const tag = await latestTag(runGh);
|
|
36
|
+
if (!tag)
|
|
37
|
+
return { tag: null, changes: [] };
|
|
38
|
+
const commits = await listCommitsSinceTag(tag, "main", runGh);
|
|
39
|
+
return { tag, changes: classifyChanges(commits) };
|
|
40
|
+
}
|
|
41
|
+
async function readCurrentVersion(profile, projectDir) {
|
|
42
|
+
const spec = parseVersionFileSpec(profile.versionFile ?? "");
|
|
43
|
+
if (!spec)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
const raw = await readFile(join(projectDir, spec.path), "utf8");
|
|
47
|
+
return readVersionFromJson(raw, spec.key);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function writeVersionFile(profile, projectDir, version) {
|
|
54
|
+
const spec = parseVersionFileSpec(profile.versionFile ?? "");
|
|
55
|
+
if (!spec)
|
|
56
|
+
return "Error: Profile version file 配置无效(期望 `path[ $.key]`,如 `package.json $.version`)";
|
|
57
|
+
try {
|
|
58
|
+
const path = join(projectDir, spec.path);
|
|
59
|
+
const raw = await readFile(path, "utf8");
|
|
60
|
+
await writeFile(path, updateVersionInJson(raw, spec.key, version));
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return `Error: 无法更新版本文件:${String(err)}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ─── 工具 ───
|
|
68
|
+
/**
|
|
69
|
+
* release_control — 版本提议 / Release PR / 合并打 tag / release workflow 监控。
|
|
70
|
+
* 技术栈无关:版本读写规则与 tag 格式全部来自 Profile(§9.1),不硬编码 npm。
|
|
71
|
+
*/
|
|
72
|
+
export function createReleaseControlTool(deps) {
|
|
73
|
+
return tool({
|
|
74
|
+
description: `Control the release lifecycle (R9, tech-stack agnostic).
|
|
75
|
+
|
|
76
|
+
Ops:
|
|
77
|
+
- propose-version: aggregate all changes on main since the last tag, classify them
|
|
78
|
+
(feature/fix/maintenance/docs + breaking), and propose a SemVer bump.
|
|
79
|
+
Unclassified changes block the proposal until classified. Returns the proposed
|
|
80
|
+
version and its tag.
|
|
81
|
+
- open-release-pr: create the release branch, bump the version file (per Profile
|
|
82
|
+
version write rule), generate Release Notes, push, and open a Release PR.
|
|
83
|
+
- merge-release-pr: after CI passes and human approval, merge the Release PR,
|
|
84
|
+
verify the merge SHA, and push the tag (tags are immutable, never re-pointed).
|
|
85
|
+
- monitor: poll the project GitHub Actions release workflow run until success;
|
|
86
|
+
a failed run is rerun once.`,
|
|
87
|
+
args: {
|
|
88
|
+
op: tool.schema.enum(["propose-version", "open-release-pr", "merge-release-pr", "monitor"])
|
|
89
|
+
.describe("Release control operation"),
|
|
90
|
+
proposed_version: tool.schema.string().describe("Proposed semantic version (x.y.z), required for open-release-pr / merge-release-pr"),
|
|
91
|
+
release_notes: tool.schema.string().describe("Optional override for the Release Notes body"),
|
|
92
|
+
user_confirmed: tool.schema.boolean().describe("Human approval — required for merge-release-pr (release is a manual flow)"),
|
|
93
|
+
},
|
|
94
|
+
async execute(args, ctx) {
|
|
95
|
+
try {
|
|
96
|
+
const op = args.op;
|
|
97
|
+
// caller 门禁:release 为人工流程,仅 primary 可调用(§2.2/§2.3),fail-closed
|
|
98
|
+
const denied = await requireCaller({ agent: ctx.agent, sessionID: ctx.sessionID }, ["primary"], op, deps.sessionClient);
|
|
99
|
+
if (denied)
|
|
100
|
+
return `Error: ${denied}`;
|
|
101
|
+
const profile = await readProjectProfile(deps.projectDir);
|
|
102
|
+
switch (op) {
|
|
103
|
+
case "propose-version":
|
|
104
|
+
return proposeVersionOp(profile, deps.projectDir);
|
|
105
|
+
case "open-release-pr":
|
|
106
|
+
return openReleasePrOp(profile, args, deps.projectDir);
|
|
107
|
+
case "merge-release-pr":
|
|
108
|
+
return mergeReleasePrOp(profile, args);
|
|
109
|
+
case "monitor":
|
|
110
|
+
return monitorOp(profile);
|
|
111
|
+
default:
|
|
112
|
+
return `Error: unknown operation "${op}"`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return `Error: INTERNAL_ERROR — ${String(err)}`;
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async function proposeVersionOp(profile, projectDir) {
|
|
122
|
+
if (!profile.versionFile) {
|
|
123
|
+
return "Error: Profile 缺少 version file 配置(先运行 /setup 确认 Release Profile)";
|
|
124
|
+
}
|
|
125
|
+
const current = await readCurrentVersion(profile, projectDir);
|
|
126
|
+
if (current === null) {
|
|
127
|
+
return `Error: 无法从版本文件(${profile.versionFile})读取当前版本`;
|
|
128
|
+
}
|
|
129
|
+
const { tag, changes } = await collectChanges(profile);
|
|
130
|
+
if (!tag) {
|
|
131
|
+
return "Error: 仓库尚无 tag,无法聚合上一 tag 后的变更;请先人工创建基线 tag";
|
|
132
|
+
}
|
|
133
|
+
const unclassified = changes.filter(c => c.category === "unclassified");
|
|
134
|
+
if (unclassified.length > 0) {
|
|
135
|
+
const list = unclassified.map(c => `${c.sha.slice(0, 7)} ${c.title}`).join("\n");
|
|
136
|
+
return `Error: ${unclassified.length} 个未分类变更,版本提议前必须分类(propose-version 不产出版本号):\n${list}`;
|
|
137
|
+
}
|
|
138
|
+
const result = proposeVersion(current, changes);
|
|
139
|
+
if (!result.ok) {
|
|
140
|
+
return `Error: ${result.message}`;
|
|
141
|
+
}
|
|
142
|
+
const tagFormat = profile.tagFormat ?? "v{version}";
|
|
143
|
+
const nextTag = buildTag(result.proposed, tagFormat);
|
|
144
|
+
const summary = changes
|
|
145
|
+
.filter(c => c.category !== "unclassified")
|
|
146
|
+
.reduce((acc, c) => {
|
|
147
|
+
acc[c.category] = (acc[c.category] ?? 0) + 1;
|
|
148
|
+
return acc;
|
|
149
|
+
}, {});
|
|
150
|
+
return [
|
|
151
|
+
`Version proposal: ${current} → ${result.proposed} (${result.type} bump)`,
|
|
152
|
+
`Tag: ${nextTag}`,
|
|
153
|
+
`Changes since ${tag}: ${changes.length} (${Object.entries(summary).map(([k, v]) => `${k}: ${v}`).join(", ")})`,
|
|
154
|
+
"",
|
|
155
|
+
buildReleaseNotes(result.proposed, changes),
|
|
156
|
+
].join("\n");
|
|
157
|
+
}
|
|
158
|
+
async function openReleasePrOp(profile, args, projectDir) {
|
|
159
|
+
const version = String(args.proposed_version ?? "");
|
|
160
|
+
const parsed = parseVersion(version);
|
|
161
|
+
if (!parsed) {
|
|
162
|
+
return "Error: proposed_version 必填且必须为 x.y.z(先调用 propose-version 获取提议版本)";
|
|
163
|
+
}
|
|
164
|
+
if (!profile.versionFile) {
|
|
165
|
+
return "Error: Profile 缺少 version file 配置(先运行 /setup 确认 Release Profile)";
|
|
166
|
+
}
|
|
167
|
+
const tagFormat = profile.tagFormat ?? "v{version}";
|
|
168
|
+
const tag = buildTag(version, tagFormat);
|
|
169
|
+
const branch = releaseBranch(version);
|
|
170
|
+
const mainSha = (await runGh(`api repos/{owner}/{repo}/commits/main --jq .sha`)).stdout.trim();
|
|
171
|
+
const immutability = await validateTagImmutability(tag, mainSha, runGh);
|
|
172
|
+
if (!immutability.ok) {
|
|
173
|
+
return `Error: ${immutability.message}`;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
await runGit(projectDir, "fetch origin");
|
|
177
|
+
await runGit(projectDir, `checkout -b ${branch} origin/main`);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return `Error: 创建 release branch 失败:${String(err)}`;
|
|
181
|
+
}
|
|
182
|
+
const writeError = await writeVersionFile(profile, projectDir, version);
|
|
183
|
+
if (writeError)
|
|
184
|
+
return writeError;
|
|
185
|
+
try {
|
|
186
|
+
await runGit(projectDir, `add ${parseVersionFileSpec(profile.versionFile)?.path}`);
|
|
187
|
+
await runGit(projectDir, `commit -m "release: ${tag}"`);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
return `Error: 提交版本更新失败:${String(err)}`;
|
|
191
|
+
}
|
|
192
|
+
let notes = String(args.release_notes ?? "");
|
|
193
|
+
if (notes === "") {
|
|
194
|
+
const { changes } = await collectChanges(profile);
|
|
195
|
+
notes = buildReleaseNotes(version, changes);
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
await runGit(projectDir, `push -u origin ${branch}`);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
return `Error: push release branch 失败:${String(err)}`;
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
const { stdout } = await runGh(`pr create --base main --head ${branch} --title 'release: ${tag}' --body '${escapeShellArg(notes)}' --json number --jq .number`);
|
|
205
|
+
return `Release PR created: #${stdout.trim()} (branch ${branch}, tag ${tag})`;
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return `Error: 创建 Release PR 失败:${String(err)}`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async function mergeReleasePrOp(profile, args) {
|
|
212
|
+
const version = String(args.proposed_version ?? "");
|
|
213
|
+
if (!parseVersion(version)) {
|
|
214
|
+
return "Error: proposed_version 必填且必须为 x.y.z";
|
|
215
|
+
}
|
|
216
|
+
// 人工批准门禁:release 为人工流程(R9),必须显式 user_confirmed
|
|
217
|
+
if (args.user_confirmed !== true) {
|
|
218
|
+
return "Error: merge-release-pr 需要人工批准(user_confirmed: true)。请先审查 Release PR 与版本提议后再确认。";
|
|
219
|
+
}
|
|
220
|
+
const branch = releaseBranch(version);
|
|
221
|
+
const prNumber = (await runGh(`pr list --head ${branch} --json number --jq '.[0].number'`)).stdout.trim();
|
|
222
|
+
if (!prNumber || prNumber === "null") {
|
|
223
|
+
return "Error: 未找到对应 Release PR(branch: " + branch + ")";
|
|
224
|
+
}
|
|
225
|
+
// CI 校验:读取 statusCheckRollup;进行中项显式标记 IN_PROGRESS,不得放行
|
|
226
|
+
const rollup = (await runGh(`pr view ${prNumber} --json statusCheckRollup --jq '[.statusCheckRollup[] | if .conclusion == null then "IN_PROGRESS" else .conclusion end] | unique'`)).stdout.trim();
|
|
227
|
+
let conclusions;
|
|
228
|
+
try {
|
|
229
|
+
conclusions = JSON.parse(rollup);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return `Error: 无法解析 PR #${prNumber} 的 CI checks 状态`;
|
|
233
|
+
}
|
|
234
|
+
if (conclusions.length === 0) {
|
|
235
|
+
return `Error: PR #${prNumber} 没有任何 CI checks 报告,无法自动合并(需要 CI 或人工介入)`;
|
|
236
|
+
}
|
|
237
|
+
if (conclusions.includes("IN_PROGRESS")) {
|
|
238
|
+
return `Error: PR #${prNumber} 的 CI checks 尚未全部完成,请等待完成后再重试`;
|
|
239
|
+
}
|
|
240
|
+
if (conclusions.includes("FAILURE") || conclusions.includes("CANCELLED") || conclusions.includes("ACTION_REQUIRED")) {
|
|
241
|
+
return `Error: PR #${prNumber} 的 CI checks 存在失败项(${conclusions.join(", ")}),无法合并`;
|
|
242
|
+
}
|
|
243
|
+
if (!conclusions.every(c => c === "SUCCESS" || c === "NEUTRAL" || c === "SKIPPED")) {
|
|
244
|
+
return `Error: PR #${prNumber} 的 CI checks 存在未知结论(${conclusions.join(", ")}),无法合并`;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
await runGh(`pr merge ${prNumber} --squash --delete-branch`);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
return `Error: 合并 Release PR 失败:${String(err)}`;
|
|
251
|
+
}
|
|
252
|
+
const mergeSha = (await runGh(`pr view ${prNumber} --json mergeCommit --jq '.mergeCommit.oid'`)).stdout.trim();
|
|
253
|
+
if (!mergeSha || mergeSha === "null") {
|
|
254
|
+
return "Error: 无法读取 merge commit SHA";
|
|
255
|
+
}
|
|
256
|
+
const tagFormat = profile.tagFormat ?? "v{version}";
|
|
257
|
+
const tag = buildTag(version, tagFormat);
|
|
258
|
+
const immutability = await validateTagImmutability(tag, mergeSha, runGh);
|
|
259
|
+
if (!immutability.ok) {
|
|
260
|
+
return `Error: ${immutability.message}`;
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
await runGh(`api repos/{owner}/{repo}/git/refs -f ref=refs/tags/${tag} -f sha=${mergeSha}`);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
return `Error: 打 tag 失败(可能已存在):${String(err)}`;
|
|
267
|
+
}
|
|
268
|
+
return `Merged #${prNumber} and tagged ${tag} @ ${mergeSha.slice(0, 7)}`;
|
|
269
|
+
}
|
|
270
|
+
async function monitorOp(profile) {
|
|
271
|
+
const workflow = profile.releaseWorkflowPath;
|
|
272
|
+
if (!workflow) {
|
|
273
|
+
return "Error: Profile 缺少 release workflow 配置(release-ready 未满足,先运行 /setup)";
|
|
274
|
+
}
|
|
275
|
+
const { stdout } = await runGh(`run list --workflow ${workflow} --limit 1 --json databaseId,status,conclusion,headBranch --jq '.[0]'`);
|
|
276
|
+
const runJson = stdout.trim();
|
|
277
|
+
if (!runJson || runJson === "null") {
|
|
278
|
+
return "No release workflow runs found yet.";
|
|
279
|
+
}
|
|
280
|
+
let run;
|
|
281
|
+
try {
|
|
282
|
+
run = JSON.parse(runJson);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return "Error: 无法解析 release workflow run 状态(gh 输出异常)";
|
|
286
|
+
}
|
|
287
|
+
if (run.status !== "completed") {
|
|
288
|
+
return `Release workflow run #${run.databaseId} is ${run.status} (branch ${run.headBranch}) — not finished, check again later`;
|
|
289
|
+
}
|
|
290
|
+
if (run.conclusion === "success") {
|
|
291
|
+
return `Release workflow run #${run.databaseId} succeeded — release complete`;
|
|
292
|
+
}
|
|
293
|
+
if (run.conclusion === "failure") {
|
|
294
|
+
try {
|
|
295
|
+
await runGh(`run rerun ${run.databaseId}`);
|
|
296
|
+
return `Release workflow run #${run.databaseId} failed — rerun triggered, check again later`;
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return `Release workflow run #${run.databaseId} failed and rerun failed: ${String(err)}`;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return `Release workflow run #${run.databaseId} ${run.conclusion} — needs human intervention (Corrective Flow + new version)`;
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=release-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-control.js","sourceRoot":"","sources":["../../src/plugin/release-control.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin/server.d.ts
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
import type { ContextBlock } from "../kernel/context.js";
|
|
3
|
+
export interface FirstUserInjectionInput {
|
|
4
|
+
hasGoal: boolean;
|
|
5
|
+
isSubAgent: boolean;
|
|
6
|
+
contextBlock: ContextBlock | null;
|
|
7
|
+
bootstrap: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 决定首条 user 消息注入内容:
|
|
11
|
+
* - Primary(goal 激活)→ bootstrap + Project Context 块
|
|
12
|
+
* - 子 agent → 仅 Project Context 块
|
|
13
|
+
* - 其他 → 不注入
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildFirstUserInjection(input: FirstUserInjectionInput): string | null;
|
|
2
16
|
interface AgentToolConfig {
|
|
3
17
|
tools?: Record<string, boolean>;
|
|
4
18
|
}
|
|
@@ -6,5 +20,10 @@ interface GoalToolConfig extends AgentToolConfig {
|
|
|
6
20
|
agent?: Record<string, unknown>;
|
|
7
21
|
}
|
|
8
22
|
export declare function configureGoalTools(config: GoalToolConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* config 层第二道门(spec §2.2):按 caller 矩阵把 5 个生命周期工具
|
|
25
|
+
* 对每个 agent 置 true/false。agent 名 → 角色映射与 caller.ts ROLE_BY_AGENT 一致。
|
|
26
|
+
*/
|
|
27
|
+
export declare function configureLifecycleTools(config: GoalToolConfig): void;
|
|
9
28
|
export declare function createOpencodeCabbage(packageRoot: string): Plugin;
|
|
10
29
|
export {};
|