@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/flow.d.ts
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
export type CmdResult = {
|
|
2
|
-
stdout: string;
|
|
3
|
-
stderr: string;
|
|
4
|
-
};
|
|
5
|
-
export type CmdFn = (args: string) => Promise<CmdResult>;
|
|
6
|
-
export declare function setFlowGhExecutor(fn: CmdFn | null): void;
|
|
7
|
-
export declare function setFlowGitExecutor(fn: CmdFn | null): void;
|
|
8
|
-
export declare function flowGh(args: string): Promise<CmdResult>;
|
|
9
|
-
export declare function flowGit(args: string): Promise<CmdResult>;
|
|
10
|
-
export type FlowStage = "requirements" | "design" | "tasks" | "code" | "review";
|
|
11
|
-
export declare const FLOW_STAGES: FlowStage[];
|
|
12
|
-
/** 高风险 Flow 标签:design 与 tasks 之间需用户确认(PRD R11) */
|
|
13
|
-
export declare const RISK_LABEL = "cabbage:risk:high";
|
|
14
|
-
/** 新建 Flow Record 的 body:目标/验收/阶段 checklist(spec §2.3 create-flow) */
|
|
15
|
-
export declare function buildFlowBody(slug: string, goal?: string, criteria?: string[]): string;
|
|
16
|
-
/** 从 body checklist 提取已完成阶段(按流程顺序) */
|
|
17
|
-
export declare function getCompletedStages(body: string): FlowStage[];
|
|
18
|
-
/** 把 stage 的 checkbox 标记为完成;已标记或缺失时幂等返回原 body */
|
|
19
|
-
export declare function markStageComplete(body: string, stage: FlowStage): string;
|
|
20
|
-
/** 从 issue labels 提取当前阶段(阶段序号最大的 cabbage:stage:* 标签) */
|
|
21
|
-
export declare function getCurrentStage(labels: string[]): FlowStage | null;
|
|
22
|
-
export type StageGateResult = {
|
|
23
|
-
ok: true;
|
|
24
|
-
} | {
|
|
25
|
-
ok: false;
|
|
26
|
-
code: string;
|
|
27
|
-
message: string;
|
|
28
|
-
};
|
|
29
|
-
export type StageOp = "stage-start" | "stage-complete";
|
|
30
|
-
/**
|
|
31
|
-
* 前置门禁判定:
|
|
32
|
-
* - stage-start X:前驱阶段须已 completed(requirements 无前置)
|
|
33
|
-
* - stage-complete X:X 未完成时前驱须已 completed;requirements 完成需 user_confirmed 一次
|
|
34
|
-
* - stage-start tasks 与 stage-complete tasks:高风险 Flow(cabbage:risk:high)
|
|
35
|
-
* 均需 user_confirmed 确认(R11:design→tasks 交接,不可跳过 start 直接 complete 绕过)
|
|
36
|
-
* - 已完成阶段重复 start/complete → 幂等通过
|
|
37
|
-
*/
|
|
38
|
-
export declare function checkStageGate(op: StageOp, stage: FlowStage, completed: FlowStage[], highRisk: boolean, userConfirmed: boolean): StageGateResult;
|
|
39
|
-
export interface FlowRecordSummary {
|
|
40
|
-
number: number;
|
|
41
|
-
title: string;
|
|
42
|
-
state: string;
|
|
43
|
-
labels: string[];
|
|
44
|
-
}
|
|
45
|
-
export interface SubtaskSummary {
|
|
46
|
-
number: number;
|
|
47
|
-
title: string;
|
|
48
|
-
state: string;
|
|
49
|
-
}
|
|
50
|
-
export interface CheckSummary {
|
|
51
|
-
name: string;
|
|
52
|
-
state: string;
|
|
53
|
-
}
|
|
54
|
-
export interface RelatedPrSummary {
|
|
55
|
-
number: number;
|
|
56
|
-
title: string;
|
|
57
|
-
state: string;
|
|
58
|
-
headRefName: string;
|
|
59
|
-
checks: CheckSummary[];
|
|
60
|
-
}
|
|
61
|
-
export interface FlowStatusReport {
|
|
62
|
-
flow: FlowRecordSummary;
|
|
63
|
-
stages: {
|
|
64
|
-
completed: FlowStage[];
|
|
65
|
-
current: FlowStage | null;
|
|
66
|
-
};
|
|
67
|
-
subtasks: SubtaskSummary[];
|
|
68
|
-
pullRequests: RelatedPrSummary[];
|
|
69
|
-
}
|
|
70
|
-
export type FlowStatusResult = {
|
|
71
|
-
ok: true;
|
|
72
|
-
status: FlowStatusReport;
|
|
73
|
-
} | {
|
|
74
|
-
ok: false;
|
|
75
|
-
code: "NOT_FOUND" | "GITHUB_ERROR";
|
|
76
|
-
message: string;
|
|
77
|
-
};
|
|
78
|
-
/** 关联 PR:PR body 引用了 Flow 或任一子任务 Issue 号(保留 PR 原始字段) */
|
|
79
|
-
export declare function filterRelatedPrs<T extends {
|
|
80
|
-
number: number;
|
|
81
|
-
body?: string;
|
|
82
|
-
}>(prs: T[], parentIssueNumber: number, subtaskNumbers: number[]): T[];
|
|
83
|
-
/** 把 statusCheckRollup 精简为 {name, state} 列表(name 兼容 .name/.context) */
|
|
84
|
-
export declare function summarizeChecks(rollup: Array<{
|
|
85
|
-
name?: string;
|
|
86
|
-
context?: string;
|
|
87
|
-
state: string;
|
|
88
|
-
}>): CheckSummary[];
|
|
89
|
-
/** 读 Flow Record + 子任务 + 关联 PR checks 汇总(spec §2.3 status) */
|
|
90
|
-
export declare function readFlowStatus(parentIssueNumber: number): Promise<FlowStatusResult>;
|
|
91
|
-
export type PlanningResult = {
|
|
92
|
-
ok: true;
|
|
93
|
-
worktreePath: string;
|
|
94
|
-
branch: string;
|
|
95
|
-
prNumber?: number;
|
|
96
|
-
reused?: boolean;
|
|
97
|
-
} | {
|
|
98
|
-
ok: false;
|
|
99
|
-
code: string;
|
|
100
|
-
message: string;
|
|
101
|
-
};
|
|
102
|
-
/** 创建 planning worktree `.worktree/planning-<slug>`(architect 在此写文档) */
|
|
103
|
-
export declare function planningStart(projectDir: string, parentIssueNumber: number): Promise<PlanningResult>;
|
|
104
|
-
/** 对 planning worktree 的变更创建 Planning PR(Planning Baseline) */
|
|
105
|
-
export declare function planningPr(projectDir: string, parentIssueNumber: number): Promise<PlanningResult>;
|
|
106
|
-
export interface CreateFlowInput {
|
|
107
|
-
projectDir: string;
|
|
108
|
-
title: string;
|
|
109
|
-
sessionID: string;
|
|
110
|
-
/** 全自动模式:创建时打 cabbage:auto 标签,阶段确认门禁自动放行 */
|
|
111
|
-
autoMode?: boolean;
|
|
112
|
-
/** 初始目标(填充 Flow Record body Goal 区块;可选) */
|
|
113
|
-
goal?: string;
|
|
114
|
-
/** 初始验收标准列表(填充 Acceptance Criteria 区块;可选) */
|
|
115
|
-
acceptanceCriteria?: string[];
|
|
116
|
-
/** 提供时对已有 Issue 建立 Flow 绑定(不新建)——legacy 检测 + 双 session 检查 */
|
|
117
|
-
parentIssueNumber?: number;
|
|
118
|
-
}
|
|
119
|
-
export type CreateFlowResult = {
|
|
120
|
-
ok: true;
|
|
121
|
-
ref: {
|
|
122
|
-
parentIssueNumber: number;
|
|
123
|
-
slug: string;
|
|
124
|
-
};
|
|
125
|
-
} | {
|
|
126
|
-
ok: false;
|
|
127
|
-
code: string;
|
|
128
|
-
message: string;
|
|
129
|
-
};
|
|
130
|
-
/**
|
|
131
|
-
* create-flow:
|
|
132
|
-
* - 新建模式:validateTitle → Profile 门禁 → Draft Parent Issue(body 含目标/验收/阶段 checklist)→ bindSession
|
|
133
|
-
* - 绑定模式(提供 parentIssueNumber):legacy 检测(§11.2)→ bindSession 双 session 检查(§10.3)
|
|
134
|
-
*/
|
|
135
|
-
export declare function createFlow(input: CreateFlowInput): Promise<CreateFlowResult>;
|
|
136
|
-
export type FlowLifecycleResult = {
|
|
137
|
-
ok: true;
|
|
138
|
-
parentIssueNumber: number;
|
|
139
|
-
} | {
|
|
140
|
-
ok: false;
|
|
141
|
-
code: string;
|
|
142
|
-
message: string;
|
|
143
|
-
};
|
|
144
|
-
/** complete-flow(仅 goal-verify 调用,goal 已验证):关闭 Parent Issue + 标记 completed */
|
|
145
|
-
export declare function completeFlow(projectDir: string, parentIssueNumber: number): Promise<FlowLifecycleResult>;
|
|
146
|
-
/** cancel-flow:受控取消(user_confirmed)→ 关闭 Issue + 标记 cancelled */
|
|
147
|
-
export declare function cancelFlow(projectDir: string, parentIssueNumber: number, userConfirmed: boolean): Promise<FlowLifecycleResult>;
|
|
148
|
-
export type TakeoverFlowResult = {
|
|
149
|
-
ok: true;
|
|
150
|
-
parentIssueNumber: number;
|
|
151
|
-
oldSessionID: string | null;
|
|
152
|
-
} | {
|
|
153
|
-
ok: false;
|
|
154
|
-
code: string;
|
|
155
|
-
message: string;
|
|
156
|
-
};
|
|
157
|
-
/** takeover:双 session 接管(user_confirmed)→ 旧 session 置 paused + 新 session 绑定(§10.3) */
|
|
158
|
-
export declare function takeoverFlow(projectDir: string, parentIssueNumber: number, newSessionID: string, userConfirmed: boolean): Promise<TakeoverFlowResult>;
|
|
159
|
-
export type ApplyStageResult = {
|
|
160
|
-
ok: true;
|
|
161
|
-
stage: FlowStage;
|
|
162
|
-
completedStages: FlowStage[];
|
|
163
|
-
highRisk: boolean;
|
|
164
|
-
} | {
|
|
165
|
-
ok: false;
|
|
166
|
-
code: string;
|
|
167
|
-
message: string;
|
|
168
|
-
};
|
|
169
|
-
/**
|
|
170
|
-
* stage-start / stage-complete:
|
|
171
|
-
* 门禁(checkStageGate)→ stage-complete 更新 body checklist(乐观锁)→ setStageLabel。
|
|
172
|
-
* declaredRisk:模型显式声明高风险("high")时即使 Issue 无 cabbage:risk:high 标签,
|
|
173
|
-
* 同样触发 R11 确认门禁;确认通过后持久化 RISK_LABEL(后续环节可见)。
|
|
174
|
-
*/
|
|
175
|
-
export declare function applyStageOp(_projectDir: string, parentIssueNumber: number, op: StageOp, stage: FlowStage, userConfirmed: boolean, declaredRisk?: "high" | "low"): Promise<ApplyStageResult>;
|
package/dist/kernel/flow.js
DELETED
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flow 生命周期 kernel 逻辑(spec §2.3 flow_control)。
|
|
3
|
-
* 纯函数与 gh/git 执行分离;gh/git 调用走可注入 executor(测试用)。
|
|
4
|
-
*/
|
|
5
|
-
import { exec } from "node:child_process";
|
|
6
|
-
import { promisify } from "node:util";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { gh as ghCli, parsePrUrlNumber } from "../util/gh.js";
|
|
9
|
-
import { escapeShellArg } from "../util/shell.js";
|
|
10
|
-
import { pathExists } from "../util/fs.js";
|
|
11
|
-
import { validateTitle } from "./slug.js";
|
|
12
|
-
import { readProjectProfile } from "./profile.js";
|
|
13
|
-
import { STAGE_LABEL_PREFIX, AUTO_LABEL, createFlowRecord, readFlowRecord, updateFlowRecord, setStageLabel } from "./records.js";
|
|
14
|
-
import { worktreeStart } from "./worktree.js";
|
|
15
|
-
import { readIndex, getFlowSession, bindSession, takeoverSession, updateFlowSession, } from "./session-index.js";
|
|
16
|
-
import { detectLegacyFlowRun } from "./legacy.js";
|
|
17
|
-
const execAsync = promisify(exec);
|
|
18
|
-
let flowGhExecutor = null;
|
|
19
|
-
let flowGitExecutor = null;
|
|
20
|
-
export function setFlowGhExecutor(fn) {
|
|
21
|
-
flowGhExecutor = fn;
|
|
22
|
-
}
|
|
23
|
-
export function setFlowGitExecutor(fn) {
|
|
24
|
-
flowGitExecutor = fn;
|
|
25
|
-
}
|
|
26
|
-
export async function flowGh(args) {
|
|
27
|
-
if (flowGhExecutor)
|
|
28
|
-
return flowGhExecutor(args);
|
|
29
|
-
return ghCli(args);
|
|
30
|
-
}
|
|
31
|
-
export async function flowGit(args) {
|
|
32
|
-
if (flowGitExecutor)
|
|
33
|
-
return flowGitExecutor(args);
|
|
34
|
-
return execAsync(`git ${args}`);
|
|
35
|
-
}
|
|
36
|
-
export const FLOW_STAGES = ["requirements", "design", "tasks", "code", "review"];
|
|
37
|
-
const STAGE_ORDER = {
|
|
38
|
-
requirements: 0,
|
|
39
|
-
design: 1,
|
|
40
|
-
tasks: 2,
|
|
41
|
-
code: 3,
|
|
42
|
-
review: 4,
|
|
43
|
-
};
|
|
44
|
-
/** 高风险 Flow 标签:design 与 tasks 之间需用户确认(PRD R11) */
|
|
45
|
-
export const RISK_LABEL = "cabbage:risk:high";
|
|
46
|
-
function isFlowStage(value) {
|
|
47
|
-
return FLOW_STAGES.includes(value);
|
|
48
|
-
}
|
|
49
|
-
// ─── Flow Record body 模板与 stage checklist ───
|
|
50
|
-
/** 新建 Flow Record 的 body:目标/验收/阶段 checklist(spec §2.3 create-flow) */
|
|
51
|
-
export function buildFlowBody(slug, goal, criteria) {
|
|
52
|
-
const stages = FLOW_STAGES.map(stage => `- [ ] ${stage}`).join("\n");
|
|
53
|
-
const goalLines = goal && goal.trim() !== "" ? goal : "<!-- 目标:由模型在 requirements 阶段填充 -->";
|
|
54
|
-
const criteriaLines = criteria && criteria.length > 0
|
|
55
|
-
? criteria.map(c => `- [ ] ${c}`).join("\n")
|
|
56
|
-
: "- [ ] TBD";
|
|
57
|
-
return [
|
|
58
|
-
`# Flow: ${slug}`,
|
|
59
|
-
"",
|
|
60
|
-
"## Goal",
|
|
61
|
-
"",
|
|
62
|
-
goalLines,
|
|
63
|
-
"",
|
|
64
|
-
"## Acceptance Criteria",
|
|
65
|
-
"",
|
|
66
|
-
criteriaLines,
|
|
67
|
-
"",
|
|
68
|
-
"## Stages",
|
|
69
|
-
"",
|
|
70
|
-
stages,
|
|
71
|
-
"",
|
|
72
|
-
].join("\n");
|
|
73
|
-
}
|
|
74
|
-
/** 从 body checklist 提取已完成阶段(按流程顺序) */
|
|
75
|
-
export function getCompletedStages(body) {
|
|
76
|
-
const completed = [];
|
|
77
|
-
for (const line of body.split("\n")) {
|
|
78
|
-
const match = /^-\s+\[x\]\s+(\w+)/i.exec(line.trim());
|
|
79
|
-
if (match && isFlowStage(match[1]))
|
|
80
|
-
completed.push(match[1]);
|
|
81
|
-
}
|
|
82
|
-
return FLOW_STAGES.filter(stage => completed.includes(stage));
|
|
83
|
-
}
|
|
84
|
-
/** 把 stage 的 checkbox 标记为完成;已标记或缺失时幂等返回原 body */
|
|
85
|
-
export function markStageComplete(body, stage) {
|
|
86
|
-
return body.replace(new RegExp(`^- \\[ \\] ${stage}$`, "m"), `- [x] ${stage}`);
|
|
87
|
-
}
|
|
88
|
-
/** 从 issue labels 提取当前阶段(阶段序号最大的 cabbage:stage:* 标签) */
|
|
89
|
-
export function getCurrentStage(labels) {
|
|
90
|
-
let current = null;
|
|
91
|
-
for (const label of labels) {
|
|
92
|
-
if (!label.startsWith(STAGE_LABEL_PREFIX))
|
|
93
|
-
continue;
|
|
94
|
-
const stage = label.slice(STAGE_LABEL_PREFIX.length);
|
|
95
|
-
if (!isFlowStage(stage))
|
|
96
|
-
continue;
|
|
97
|
-
if (current === null || STAGE_ORDER[stage] > STAGE_ORDER[current])
|
|
98
|
-
current = stage;
|
|
99
|
-
}
|
|
100
|
-
return current;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 前置门禁判定:
|
|
104
|
-
* - stage-start X:前驱阶段须已 completed(requirements 无前置)
|
|
105
|
-
* - stage-complete X:X 未完成时前驱须已 completed;requirements 完成需 user_confirmed 一次
|
|
106
|
-
* - stage-start tasks 与 stage-complete tasks:高风险 Flow(cabbage:risk:high)
|
|
107
|
-
* 均需 user_confirmed 确认(R11:design→tasks 交接,不可跳过 start 直接 complete 绕过)
|
|
108
|
-
* - 已完成阶段重复 start/complete → 幂等通过
|
|
109
|
-
*/
|
|
110
|
-
export function checkStageGate(op, stage, completed, highRisk, userConfirmed) {
|
|
111
|
-
const done = completed.includes(stage);
|
|
112
|
-
if (op === "stage-complete") {
|
|
113
|
-
if (done)
|
|
114
|
-
return { ok: true };
|
|
115
|
-
if (stage === "requirements") {
|
|
116
|
-
return userConfirmed ? { ok: true } : requirementConfirmationError();
|
|
117
|
-
}
|
|
118
|
-
if (!completed.includes(FLOW_STAGES[STAGE_ORDER[stage] - 1])) {
|
|
119
|
-
return previousStageError(stage);
|
|
120
|
-
}
|
|
121
|
-
if (stage === "tasks" && highRisk && !userConfirmed) {
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
code: "RISK_CONFIRMATION_REQUIRED",
|
|
125
|
-
message: "This flow is marked as high-risk; the design-to-tasks handoff requires user confirmation (user_confirmed: true)",
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
return { ok: true };
|
|
129
|
-
}
|
|
130
|
-
// stage-start
|
|
131
|
-
if (done)
|
|
132
|
-
return { ok: true };
|
|
133
|
-
if (stage !== "requirements" && !completed.includes(FLOW_STAGES[STAGE_ORDER[stage] - 1])) {
|
|
134
|
-
return previousStageError(stage);
|
|
135
|
-
}
|
|
136
|
-
if (stage === "tasks" && highRisk && !userConfirmed) {
|
|
137
|
-
return {
|
|
138
|
-
ok: false,
|
|
139
|
-
code: "RISK_CONFIRMATION_REQUIRED",
|
|
140
|
-
message: "This flow is marked as high-risk; the design-to-tasks handoff requires user confirmation (user_confirmed: true)",
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
return { ok: true };
|
|
144
|
-
}
|
|
145
|
-
function requirementConfirmationError() {
|
|
146
|
-
return {
|
|
147
|
-
ok: false,
|
|
148
|
-
code: "REQUIREMENTS_CONFIRMATION_REQUIRED",
|
|
149
|
-
message: 'The requirements baseline must be confirmed once by the user. 解法:重试并传 user_confirmed: true(或给 Flow 打 cabbage:auto 标签全自动放行)',
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function previousStageError(stage) {
|
|
153
|
-
const prev = FLOW_STAGES[STAGE_ORDER[stage] - 1];
|
|
154
|
-
const code = `${prev.toUpperCase()}_NOT_COMPLETE`;
|
|
155
|
-
return { ok: false, code, message: `Stage "${prev}" must be completed before stage "${stage}"` };
|
|
156
|
-
}
|
|
157
|
-
/** 关联 PR:PR body 引用了 Flow 或任一子任务 Issue 号(保留 PR 原始字段) */
|
|
158
|
-
export function filterRelatedPrs(prs, parentIssueNumber, subtaskNumbers) {
|
|
159
|
-
const refs = new Set([String(parentIssueNumber), ...subtaskNumbers.map(String)]);
|
|
160
|
-
return prs.filter(pr => {
|
|
161
|
-
const mentioned = (pr.body ?? "").match(/#(\d+)/g)?.map(s => s.slice(1)) ?? [];
|
|
162
|
-
return mentioned.some(n => refs.has(n));
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
/** 把 statusCheckRollup 精简为 {name, state} 列表(name 兼容 .name/.context) */
|
|
166
|
-
export function summarizeChecks(rollup) {
|
|
167
|
-
return rollup.map(check => ({ name: check.name ?? check.context ?? "unknown", state: check.state }));
|
|
168
|
-
}
|
|
169
|
-
/** 读 Flow Record + 子任务 + 关联 PR checks 汇总(spec §2.3 status) */
|
|
170
|
-
export async function readFlowStatus(parentIssueNumber) {
|
|
171
|
-
try {
|
|
172
|
-
const { stdout: flowOut } = await flowGh(`issue view ${parentIssueNumber} --json number,title,state,labels,body --jq '{number, title, state, labels: [.labels[].name], body}'`);
|
|
173
|
-
const flow = JSON.parse(flowOut);
|
|
174
|
-
const { stdout: subtasksOut } = await flowGh(`issue list --state all --limit 100 --json number,title,state,parent --jq '[.[] | select(.parent.number == ${parentIssueNumber}) | {number, title, state}]'`);
|
|
175
|
-
const subtasks = JSON.parse(subtasksOut);
|
|
176
|
-
const { stdout: prsOut } = await flowGh(`pr list --state all --json number,title,state,headRefName,body --jq '[.[] | {number, title, state, headRefName, body}]'`);
|
|
177
|
-
const related = filterRelatedPrs(JSON.parse(prsOut), parentIssueNumber, [...subtasks.map(s => s.number)]);
|
|
178
|
-
const pullRequests = [];
|
|
179
|
-
for (const pr of related) {
|
|
180
|
-
const { stdout: rollupOut } = await flowGh(`pr view ${pr.number} --json statusCheckRollup --jq '[.statusCheckRollup[]? | {name: .name, context: .context, state: (.conclusion // .state)}]'`);
|
|
181
|
-
const rollup = JSON.parse(rollupOut);
|
|
182
|
-
pullRequests.push({ ...pr, checks: summarizeChecks(rollup) });
|
|
183
|
-
}
|
|
184
|
-
return {
|
|
185
|
-
ok: true,
|
|
186
|
-
status: {
|
|
187
|
-
flow: { number: flow.number, title: flow.title, state: flow.state, labels: flow.labels },
|
|
188
|
-
stages: { completed: getCompletedStages(flow.body), current: getCurrentStage(flow.labels) },
|
|
189
|
-
subtasks,
|
|
190
|
-
pullRequests,
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
const message = String(err);
|
|
196
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
197
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
198
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** 读 Flow Record 标题(即 flow slug),并强制校验为合法 kebab-case slug(防注入) */
|
|
202
|
-
async function readFlowSlug(parentIssueNumber) {
|
|
203
|
-
const { stdout } = await flowGh(`issue view ${parentIssueNumber} --json title --jq .title`);
|
|
204
|
-
const slug = stdout.trim();
|
|
205
|
-
const validated = validateTitle(slug);
|
|
206
|
-
if (!validated.ok) {
|
|
207
|
-
throw new Error(`INVALID_FLOW_SLUG: ${validated.message}`);
|
|
208
|
-
}
|
|
209
|
-
return slug;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* 读仓库默认分支。
|
|
213
|
-
* 优先 GitHub API(defaultBranchRef);API 未返回(defaultBranchRef 为 null)时
|
|
214
|
-
* 回退远端 HEAD 指针(refs/remotes/origin/HEAD);仍不可得 → 抛错拒绝(fail-closed,
|
|
215
|
-
* 不猜测分支名,防 PR base 误用临时分支)。
|
|
216
|
-
*/
|
|
217
|
-
async function readDefaultBranch() {
|
|
218
|
-
try {
|
|
219
|
-
const { stdout } = await flowGh(`repo view --json defaultBranchRef --jq .defaultBranchRef.name`);
|
|
220
|
-
const branch = stdout.trim();
|
|
221
|
-
if (branch !== "")
|
|
222
|
-
return branch;
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
// 查询失败 → 走回退
|
|
226
|
-
}
|
|
227
|
-
try {
|
|
228
|
-
const { stdout } = await flowGit(`symbolic-ref --short refs/remotes/origin/HEAD`);
|
|
229
|
-
const head = stdout.trim();
|
|
230
|
-
if (head !== "")
|
|
231
|
-
return head;
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
// 无远端 HEAD 指针 → 走失败
|
|
235
|
-
}
|
|
236
|
-
throw new Error("cannot determine default branch (repo view defaultBranchRef empty and no origin/HEAD)");
|
|
237
|
-
}
|
|
238
|
-
function planningBranch(slug) {
|
|
239
|
-
return `docs/planning-${slug}`;
|
|
240
|
-
}
|
|
241
|
-
function planningWorktreePath(projectDir, slug) {
|
|
242
|
-
return path.join(projectDir, ".worktree", `planning-${slug}`);
|
|
243
|
-
}
|
|
244
|
-
/** 创建 planning worktree `.worktree/planning-<slug>`(architect 在此写文档) */
|
|
245
|
-
export async function planningStart(projectDir, parentIssueNumber) {
|
|
246
|
-
try {
|
|
247
|
-
const slug = await readFlowSlug(parentIssueNumber);
|
|
248
|
-
const base = await readDefaultBranch();
|
|
249
|
-
const result = await worktreeStart({
|
|
250
|
-
projectDir,
|
|
251
|
-
slug: `planning-${slug}`,
|
|
252
|
-
base,
|
|
253
|
-
branchType: "docs",
|
|
254
|
-
});
|
|
255
|
-
if (!result.ok) {
|
|
256
|
-
return { ok: false, code: result.code, message: result.message };
|
|
257
|
-
}
|
|
258
|
-
return { ok: true, worktreePath: result.path, branch: result.branch, reused: result.reused };
|
|
259
|
-
}
|
|
260
|
-
catch (err) {
|
|
261
|
-
const message = String(err);
|
|
262
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
263
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
264
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
/** 对 planning worktree 的变更创建 Planning PR(Planning Baseline) */
|
|
268
|
-
export async function planningPr(projectDir, parentIssueNumber) {
|
|
269
|
-
try {
|
|
270
|
-
const slug = await readFlowSlug(parentIssueNumber);
|
|
271
|
-
const branch = planningBranch(slug);
|
|
272
|
-
const worktreeDir = planningWorktreePath(projectDir, slug);
|
|
273
|
-
if (!(await pathExists(worktreeDir))) {
|
|
274
|
-
return {
|
|
275
|
-
ok: false,
|
|
276
|
-
code: "PLANNING_WORKTREE_NOT_FOUND",
|
|
277
|
-
message: `Planning worktree ${worktreeDir} does not exist; run planning-start first`,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
// 幂等:分支已有 open PR → 复用编号(不重复创建)
|
|
281
|
-
const { stdout: existingPr } = await flowGh(`pr list --head '${escapeShellArg(branch)}' --state open --json number --jq '.[0].number'`);
|
|
282
|
-
const existingPrNumber = Number(existingPr.trim());
|
|
283
|
-
if (Number.isInteger(existingPrNumber) && existingPrNumber > 0) {
|
|
284
|
-
return { ok: true, worktreePath: worktreeDir, branch, prNumber: existingPrNumber };
|
|
285
|
-
}
|
|
286
|
-
// 有未提交变更 → 提交并推送;无变更(用户已手动 commit+push)→ 跳过提交,直接建 PR
|
|
287
|
-
const { stdout: statusOut } = await flowGit(`-C '${escapeShellArg(worktreeDir)}' status --porcelain`);
|
|
288
|
-
if (statusOut.trim() !== "") {
|
|
289
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' add -A`);
|
|
290
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' commit -m 'docs: planning baseline for ${slug}'`);
|
|
291
|
-
}
|
|
292
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' push -u origin '${escapeShellArg(branch)}'`);
|
|
293
|
-
const base = await readDefaultBranch();
|
|
294
|
-
const prTitle = `docs: planning baseline for ${slug}`;
|
|
295
|
-
const prBody = `Planning Baseline for Flow #${parentIssueNumber}: CONTEXT.md + PRD + Design + ADR (spec PRD R11).`;
|
|
296
|
-
const { stdout } = await flowGh(`pr create --title '${escapeShellArg(prTitle)}' --body '${escapeShellArg(prBody)}' --base '${escapeShellArg(base)}' --head '${escapeShellArg(branch)}'`);
|
|
297
|
-
// gh pr create 不支持 --json:解析 stdout 中的 PR URL
|
|
298
|
-
const prNumber = parsePrUrlNumber(stdout);
|
|
299
|
-
if (prNumber === null) {
|
|
300
|
-
return { ok: false, code: "GITHUB_ERROR", message: `invalid PR create output: ${stdout}` };
|
|
301
|
-
}
|
|
302
|
-
return { ok: true, worktreePath: worktreeDir, branch, prNumber };
|
|
303
|
-
}
|
|
304
|
-
catch (err) {
|
|
305
|
-
const message = String(err);
|
|
306
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
307
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
308
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* create-flow:
|
|
313
|
-
* - 新建模式:validateTitle → Profile 门禁 → Draft Parent Issue(body 含目标/验收/阶段 checklist)→ bindSession
|
|
314
|
-
* - 绑定模式(提供 parentIssueNumber):legacy 检测(§11.2)→ bindSession 双 session 检查(§10.3)
|
|
315
|
-
*/
|
|
316
|
-
export async function createFlow(input) {
|
|
317
|
-
if (input.parentIssueNumber === undefined) {
|
|
318
|
-
const validated = validateTitle(input.title);
|
|
319
|
-
if (!validated.ok) {
|
|
320
|
-
return { ok: false, code: validated.code, message: validated.message };
|
|
321
|
-
}
|
|
322
|
-
const profile = await readProjectProfile(input.projectDir);
|
|
323
|
-
if (profile.testCommand === null) {
|
|
324
|
-
return {
|
|
325
|
-
ok: false,
|
|
326
|
-
code: "SETUP_REQUIRED",
|
|
327
|
-
message: "Project Profile is not confirmed; run setup_control confirm-profile first (spec §9.3)",
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
const created = await createFlowRecord({
|
|
331
|
-
slug: validated.slug,
|
|
332
|
-
body: buildFlowBody(validated.slug, input.goal, input.acceptanceCriteria),
|
|
333
|
-
autoMode: input.autoMode,
|
|
334
|
-
});
|
|
335
|
-
if (!created.ok) {
|
|
336
|
-
return { ok: false, code: "ISSUE_CREATE_FAILED", message: created.error };
|
|
337
|
-
}
|
|
338
|
-
const bound = await bindSession(input.projectDir, created.ref.parentIssueNumber, input.sessionID);
|
|
339
|
-
if (!bound.ok) {
|
|
340
|
-
return { ok: false, code: bound.code, message: bound.message };
|
|
341
|
-
}
|
|
342
|
-
return { ok: true, ref: created.ref };
|
|
343
|
-
}
|
|
344
|
-
// 绑定已有 Issue:legacy 检测 → 双 session 检查
|
|
345
|
-
const n = input.parentIssueNumber;
|
|
346
|
-
const legacy = await detectLegacyFlowRun(n, flowGh);
|
|
347
|
-
if (legacy.legacy) {
|
|
348
|
-
return {
|
|
349
|
-
ok: false,
|
|
350
|
-
code: "LEGACY_FLOW_DETECTED",
|
|
351
|
-
message: "This issue is a legacy-architecture FlowRun; complete it with the old plugin version (0.x). New versions do not auto-migrate.",
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
const bound = await bindSession(input.projectDir, n, input.sessionID);
|
|
355
|
-
if (!bound.ok) {
|
|
356
|
-
return { ok: false, code: bound.code, message: bound.message };
|
|
357
|
-
}
|
|
358
|
-
let slug;
|
|
359
|
-
try {
|
|
360
|
-
slug = await readFlowSlug(n);
|
|
361
|
-
}
|
|
362
|
-
catch {
|
|
363
|
-
// 读不到标题或标题不是合法 slug:绑定必须可校验 slug,否则后续 shell 拼接有注入风险
|
|
364
|
-
const fallback = validateTitle(input.title);
|
|
365
|
-
if (!fallback.ok) {
|
|
366
|
-
return { ok: false, code: "INVALID_FLOW_SLUG", message: "Issue title is not a valid kebab-case slug" };
|
|
367
|
-
}
|
|
368
|
-
slug = fallback.slug;
|
|
369
|
-
}
|
|
370
|
-
return { ok: true, ref: { parentIssueNumber: n, slug } };
|
|
371
|
-
}
|
|
372
|
-
/** complete-flow(仅 goal-verify 调用,goal 已验证):关闭 Parent Issue + 标记 completed */
|
|
373
|
-
export async function completeFlow(projectDir, parentIssueNumber) {
|
|
374
|
-
try {
|
|
375
|
-
await flowGh(`issue close ${parentIssueNumber}`);
|
|
376
|
-
await updateFlowSession(projectDir, parentIssueNumber, { status: "completed" });
|
|
377
|
-
return { ok: true, parentIssueNumber };
|
|
378
|
-
}
|
|
379
|
-
catch (err) {
|
|
380
|
-
return { ok: false, code: "GITHUB_ERROR", message: String(err) };
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/** cancel-flow:受控取消(user_confirmed)→ 关闭 Issue + 标记 cancelled */
|
|
384
|
-
export async function cancelFlow(projectDir, parentIssueNumber, userConfirmed) {
|
|
385
|
-
if (!userConfirmed) {
|
|
386
|
-
return {
|
|
387
|
-
ok: false,
|
|
388
|
-
code: "USER_CONFIRMATION_REQUIRED",
|
|
389
|
-
message: "Cancelling a flow requires user confirmation (user_confirmed: true)",
|
|
390
|
-
};
|
|
391
|
-
}
|
|
392
|
-
try {
|
|
393
|
-
await flowGh(`issue close ${parentIssueNumber}`);
|
|
394
|
-
await updateFlowSession(projectDir, parentIssueNumber, { status: "cancelled" });
|
|
395
|
-
return { ok: true, parentIssueNumber };
|
|
396
|
-
}
|
|
397
|
-
catch (err) {
|
|
398
|
-
return { ok: false, code: "GITHUB_ERROR", message: String(err) };
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
/** takeover:双 session 接管(user_confirmed)→ 旧 session 置 paused + 新 session 绑定(§10.3) */
|
|
402
|
-
export async function takeoverFlow(projectDir, parentIssueNumber, newSessionID, userConfirmed) {
|
|
403
|
-
const index = await readIndex(projectDir);
|
|
404
|
-
const old = getFlowSession(index, parentIssueNumber);
|
|
405
|
-
const result = await takeoverSession(projectDir, parentIssueNumber, newSessionID, userConfirmed);
|
|
406
|
-
if (!result.ok) {
|
|
407
|
-
return { ok: false, code: result.code, message: result.message };
|
|
408
|
-
}
|
|
409
|
-
return { ok: true, parentIssueNumber, oldSessionID: old?.sessionID ?? null };
|
|
410
|
-
}
|
|
411
|
-
/** 读 Flow Record 的 labels(字符串数组) */
|
|
412
|
-
async function readIssueLabels(parentIssueNumber) {
|
|
413
|
-
const { stdout } = await flowGh(`issue view ${parentIssueNumber} --json labels --jq '[.labels[].name]'`);
|
|
414
|
-
return JSON.parse(stdout);
|
|
415
|
-
}
|
|
416
|
-
/**
|
|
417
|
-
* stage-start / stage-complete:
|
|
418
|
-
* 门禁(checkStageGate)→ stage-complete 更新 body checklist(乐观锁)→ setStageLabel。
|
|
419
|
-
* declaredRisk:模型显式声明高风险("high")时即使 Issue 无 cabbage:risk:high 标签,
|
|
420
|
-
* 同样触发 R11 确认门禁;确认通过后持久化 RISK_LABEL(后续环节可见)。
|
|
421
|
-
*/
|
|
422
|
-
export async function applyStageOp(_projectDir, parentIssueNumber, op, stage, userConfirmed, declaredRisk) {
|
|
423
|
-
const record = await readFlowRecord(parentIssueNumber);
|
|
424
|
-
if (!record.ok) {
|
|
425
|
-
return { ok: false, code: "NOT_FOUND", message: record.error };
|
|
426
|
-
}
|
|
427
|
-
const completed = getCompletedStages(record.body);
|
|
428
|
-
const labels = await readIssueLabels(parentIssueNumber);
|
|
429
|
-
const highRisk = labels.includes(RISK_LABEL) || declaredRisk === "high";
|
|
430
|
-
// 全自动授权:cabbage:auto 标签 = 用户全局授权,阶段确认门禁(requirements/高风险)自动放行
|
|
431
|
-
const autoApproved = labels.includes(AUTO_LABEL);
|
|
432
|
-
const effectiveConfirmed = userConfirmed || autoApproved;
|
|
433
|
-
const gate = checkStageGate(op, stage, completed, highRisk, effectiveConfirmed);
|
|
434
|
-
if (!gate.ok) {
|
|
435
|
-
return { ok: false, code: gate.code, message: gate.message };
|
|
436
|
-
}
|
|
437
|
-
if (op === "stage-complete") {
|
|
438
|
-
const updated = await updateFlowRecord(parentIssueNumber, record.body, body => markStageComplete(body, stage));
|
|
439
|
-
if (!updated.ok) {
|
|
440
|
-
return { ok: false, code: "BODY_UPDATE_FAILED", message: updated.error };
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
// 模型声明高风险且已确认:持久化 RISK_LABEL(R11 状态真实化,后续环节可见)
|
|
444
|
-
if (declaredRisk === "high" && !labels.includes(RISK_LABEL)) {
|
|
445
|
-
const riskLabel = await addRiskLabel(parentIssueNumber);
|
|
446
|
-
if (!riskLabel.ok) {
|
|
447
|
-
return { ok: false, code: "LABEL_UPDATE_FAILED", message: riskLabel.error ?? "risk label update failed" };
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
const labelResult = await setStageLabel(parentIssueNumber, stage);
|
|
451
|
-
if (!labelResult.ok) {
|
|
452
|
-
return { ok: false, code: "LABEL_UPDATE_FAILED", message: labelResult.error ?? "label update failed" };
|
|
453
|
-
}
|
|
454
|
-
const newCompleted = op === "stage-complete" ? [...completed, stage] : completed;
|
|
455
|
-
return { ok: true, stage, completedStages: newCompleted, highRisk };
|
|
456
|
-
}
|
|
457
|
-
/** 给 Parent Issue 打高风险标签(模型声明 + 用户确认后持久化) */
|
|
458
|
-
async function addRiskLabel(parentIssueNumber) {
|
|
459
|
-
try {
|
|
460
|
-
await flowGh(`issue edit ${parentIssueNumber} --add-label '${escapeShellArg(RISK_LABEL)}'`);
|
|
461
|
-
return { ok: true };
|
|
462
|
-
}
|
|
463
|
-
catch (err) {
|
|
464
|
-
return { ok: false, error: String(err) };
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
//# sourceMappingURL=flow.js.map
|
package/dist/kernel/flow.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/kernel/flow.ts"],"names":[],"mappings":"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"}
|