@devcxl/opencode-cabbage 1.0.0 → 1.2.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 +19 -25
- package/README.zh.md +17 -23
- package/assets/agents/dev-lifecycle.md +208 -68
- package/assets/agents/team/architect.md +22 -4
- 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/dist/kernel/context.js +12 -1
- package/dist/kernel/context.js.map +1 -1
- package/dist/kernel/permission.d.ts +1 -1
- package/dist/kernel/permission.js +9 -1
- package/dist/kernel/permission.js.map +1 -1
- package/dist/kernel/profile.js +5 -2
- package/dist/kernel/profile.js.map +1 -1
- package/dist/kernel/session-index.d.ts +12 -27
- package/dist/kernel/session-index.js +46 -80
- 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.d.ts +57 -6
- package/dist/plugin/goal.js +234 -86
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +3 -12
- 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 +2 -5
- package/dist/plugin/server.js +260 -136
- 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 +3 -9
- package/dist/util/gh.js +9 -11
- package/dist/util/gh.js.map +1 -1
- package/dist/util/paths.d.ts +6 -14
- package/dist/util/paths.js +12 -67
- package/dist/util/paths.js.map +1 -1
- package/package.json +5 -5
- 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 -166
- package/dist/kernel/flow.js +0 -387
- 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 -87
- package/dist/kernel/records.js +0 -197
- package/dist/kernel/records.js.map +0 -1
- package/dist/kernel/release.d.ts +0 -104
- package/dist/kernel/release.js +0 -229
- package/dist/kernel/release.js.map +0 -1
- package/dist/kernel/review.d.ts +0 -34
- package/dist/kernel/review.js +0 -81
- package/dist/kernel/review.js.map +0 -1
- package/dist/kernel/setup.d.ts +0 -70
- package/dist/kernel/setup.js +0 -324
- 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 -208
- package/dist/kernel/task.js +0 -788
- package/dist/kernel/task.js.map +0 -1
- package/dist/kernel/tdd/adapter.d.ts +0 -49
- package/dist/kernel/tdd/adapter.js +0 -293
- package/dist/kernel/tdd/adapter.js.map +0 -1
- package/dist/kernel/tdd/digest.d.ts +0 -17
- package/dist/kernel/tdd/digest.js +0 -301
- 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 -127
- package/dist/kernel/worktree.js.map +0 -1
- package/dist/plugin/flow-control.d.ts +0 -80
- package/dist/plugin/flow-control.js +0 -254
- package/dist/plugin/flow-control.js.map +0 -1
- package/dist/plugin/release-control.d.ts +0 -37
- package/dist/plugin/release-control.js +0 -304
- package/dist/plugin/release-control.js.map +0 -1
- package/dist/plugin/setup-control.d.ts +0 -45
- package/dist/plugin/setup-control.js +0 -80
- 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 -201
- package/dist/plugin/task-control.js.map +0 -1
- package/dist/plugin/tdd-checkpoint.d.ts +0 -118
- package/dist/plugin/tdd-checkpoint.js +0 -581
- 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,166 +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): 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:高风险 Flow(cabbage:risk:high)需 user_confirmed 确认
|
|
35
|
-
* - 已完成阶段重复 start/complete → 幂等通过
|
|
36
|
-
*/
|
|
37
|
-
export declare function checkStageGate(op: StageOp, stage: FlowStage, completed: FlowStage[], highRisk: boolean, userConfirmed: boolean): StageGateResult;
|
|
38
|
-
export interface FlowRecordSummary {
|
|
39
|
-
number: number;
|
|
40
|
-
title: string;
|
|
41
|
-
state: string;
|
|
42
|
-
labels: string[];
|
|
43
|
-
}
|
|
44
|
-
export interface SubtaskSummary {
|
|
45
|
-
number: number;
|
|
46
|
-
title: string;
|
|
47
|
-
state: string;
|
|
48
|
-
}
|
|
49
|
-
export interface CheckSummary {
|
|
50
|
-
name: string;
|
|
51
|
-
state: string;
|
|
52
|
-
}
|
|
53
|
-
export interface RelatedPrSummary {
|
|
54
|
-
number: number;
|
|
55
|
-
title: string;
|
|
56
|
-
state: string;
|
|
57
|
-
headRefName: string;
|
|
58
|
-
checks: CheckSummary[];
|
|
59
|
-
}
|
|
60
|
-
export interface FlowStatusReport {
|
|
61
|
-
flow: FlowRecordSummary;
|
|
62
|
-
stages: {
|
|
63
|
-
completed: FlowStage[];
|
|
64
|
-
current: FlowStage | null;
|
|
65
|
-
};
|
|
66
|
-
subtasks: SubtaskSummary[];
|
|
67
|
-
pullRequests: RelatedPrSummary[];
|
|
68
|
-
}
|
|
69
|
-
export type FlowStatusResult = {
|
|
70
|
-
ok: true;
|
|
71
|
-
status: FlowStatusReport;
|
|
72
|
-
} | {
|
|
73
|
-
ok: false;
|
|
74
|
-
code: "NOT_FOUND" | "GITHUB_ERROR";
|
|
75
|
-
message: string;
|
|
76
|
-
};
|
|
77
|
-
/** 关联 PR:PR body 引用了 Flow 或任一子任务 Issue 号(保留 PR 原始字段) */
|
|
78
|
-
export declare function filterRelatedPrs<T extends {
|
|
79
|
-
number: number;
|
|
80
|
-
body?: string;
|
|
81
|
-
}>(prs: T[], parentIssueNumber: number, subtaskNumbers: number[]): T[];
|
|
82
|
-
/** 把 statusCheckRollup 精简为 {name, state} 列表(name 兼容 .name/.context) */
|
|
83
|
-
export declare function summarizeChecks(rollup: Array<{
|
|
84
|
-
name?: string;
|
|
85
|
-
context?: string;
|
|
86
|
-
state: string;
|
|
87
|
-
}>): CheckSummary[];
|
|
88
|
-
/** 读 Flow Record + 子任务 + 关联 PR checks 汇总(spec §2.3 status) */
|
|
89
|
-
export declare function readFlowStatus(parentIssueNumber: number): Promise<FlowStatusResult>;
|
|
90
|
-
export type PlanningResult = {
|
|
91
|
-
ok: true;
|
|
92
|
-
worktreePath: string;
|
|
93
|
-
branch: string;
|
|
94
|
-
prNumber?: number;
|
|
95
|
-
reused?: boolean;
|
|
96
|
-
} | {
|
|
97
|
-
ok: false;
|
|
98
|
-
code: string;
|
|
99
|
-
message: string;
|
|
100
|
-
};
|
|
101
|
-
/** 创建 planning worktree `.worktree/planning-<slug>`(architect 在此写文档) */
|
|
102
|
-
export declare function planningStart(projectDir: string, parentIssueNumber: number): Promise<PlanningResult>;
|
|
103
|
-
/** 对 planning worktree 的变更创建 Planning PR(Planning Baseline) */
|
|
104
|
-
export declare function planningPr(projectDir: string, parentIssueNumber: number): Promise<PlanningResult>;
|
|
105
|
-
export interface CreateFlowInput {
|
|
106
|
-
projectDir: string;
|
|
107
|
-
title: string;
|
|
108
|
-
sessionID: string;
|
|
109
|
-
/** 提供时对已有 Issue 建立 Flow 绑定(不新建)——legacy 检测 + 双 session 检查 */
|
|
110
|
-
parentIssueNumber?: number;
|
|
111
|
-
}
|
|
112
|
-
export type CreateFlowResult = {
|
|
113
|
-
ok: true;
|
|
114
|
-
ref: {
|
|
115
|
-
parentIssueNumber: number;
|
|
116
|
-
slug: string;
|
|
117
|
-
};
|
|
118
|
-
} | {
|
|
119
|
-
ok: false;
|
|
120
|
-
code: string;
|
|
121
|
-
message: string;
|
|
122
|
-
};
|
|
123
|
-
/**
|
|
124
|
-
* create-flow:
|
|
125
|
-
* - 新建模式:validateTitle → Profile 门禁 → Draft Parent Issue(body 含目标/验收/阶段 checklist)→ bindSession
|
|
126
|
-
* - 绑定模式(提供 parentIssueNumber):legacy 检测(§11.2)→ bindSession 双 session 检查(§10.3)
|
|
127
|
-
*/
|
|
128
|
-
export declare function createFlow(input: CreateFlowInput): Promise<CreateFlowResult>;
|
|
129
|
-
export type FlowLifecycleResult = {
|
|
130
|
-
ok: true;
|
|
131
|
-
parentIssueNumber: number;
|
|
132
|
-
} | {
|
|
133
|
-
ok: false;
|
|
134
|
-
code: string;
|
|
135
|
-
message: string;
|
|
136
|
-
};
|
|
137
|
-
/** complete-flow(仅 goal-verify 调用,goal 已验证):关闭 Parent Issue + 标记 completed */
|
|
138
|
-
export declare function completeFlow(projectDir: string, parentIssueNumber: number): Promise<FlowLifecycleResult>;
|
|
139
|
-
/** cancel-flow:受控取消(user_confirmed)→ 关闭 Issue + 标记 cancelled */
|
|
140
|
-
export declare function cancelFlow(projectDir: string, parentIssueNumber: number, userConfirmed: boolean): Promise<FlowLifecycleResult>;
|
|
141
|
-
export type TakeoverFlowResult = {
|
|
142
|
-
ok: true;
|
|
143
|
-
parentIssueNumber: number;
|
|
144
|
-
oldSessionID: string | null;
|
|
145
|
-
} | {
|
|
146
|
-
ok: false;
|
|
147
|
-
code: string;
|
|
148
|
-
message: string;
|
|
149
|
-
};
|
|
150
|
-
/** takeover:双 session 接管(user_confirmed)→ 旧 session 置 paused + 新 session 绑定(§10.3) */
|
|
151
|
-
export declare function takeoverFlow(projectDir: string, parentIssueNumber: number, newSessionID: string, userConfirmed: boolean): Promise<TakeoverFlowResult>;
|
|
152
|
-
export type ApplyStageResult = {
|
|
153
|
-
ok: true;
|
|
154
|
-
stage: FlowStage;
|
|
155
|
-
completedStages: FlowStage[];
|
|
156
|
-
highRisk: boolean;
|
|
157
|
-
} | {
|
|
158
|
-
ok: false;
|
|
159
|
-
code: string;
|
|
160
|
-
message: string;
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* stage-start / stage-complete:
|
|
164
|
-
* 门禁(checkStageGate)→ stage-complete 更新 body checklist(乐观锁)→ setStageLabel。
|
|
165
|
-
*/
|
|
166
|
-
export declare function applyStageOp(projectDir: string, parentIssueNumber: number, op: StageOp, stage: FlowStage, userConfirmed: boolean): Promise<ApplyStageResult>;
|
package/dist/kernel/flow.js
DELETED
|
@@ -1,387 +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 } 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, 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) {
|
|
52
|
-
const stages = FLOW_STAGES.map(stage => `- [ ] ${stage}`).join("\n");
|
|
53
|
-
return [
|
|
54
|
-
`# Flow: ${slug}`,
|
|
55
|
-
"",
|
|
56
|
-
"## Goal",
|
|
57
|
-
"",
|
|
58
|
-
"<!-- 目标:由模型在 requirements 阶段填充 -->",
|
|
59
|
-
"",
|
|
60
|
-
"## Acceptance Criteria",
|
|
61
|
-
"",
|
|
62
|
-
"- [ ] TBD",
|
|
63
|
-
"",
|
|
64
|
-
"## Stages",
|
|
65
|
-
"",
|
|
66
|
-
stages,
|
|
67
|
-
"",
|
|
68
|
-
].join("\n");
|
|
69
|
-
}
|
|
70
|
-
/** 从 body checklist 提取已完成阶段(按流程顺序) */
|
|
71
|
-
export function getCompletedStages(body) {
|
|
72
|
-
const completed = [];
|
|
73
|
-
for (const line of body.split("\n")) {
|
|
74
|
-
const match = /^-\s+\[x\]\s+(\w+)/i.exec(line.trim());
|
|
75
|
-
if (match && isFlowStage(match[1]))
|
|
76
|
-
completed.push(match[1]);
|
|
77
|
-
}
|
|
78
|
-
return FLOW_STAGES.filter(stage => completed.includes(stage));
|
|
79
|
-
}
|
|
80
|
-
/** 把 stage 的 checkbox 标记为完成;已标记或缺失时幂等返回原 body */
|
|
81
|
-
export function markStageComplete(body, stage) {
|
|
82
|
-
return body.replace(new RegExp(`^- \\[ \\] ${stage}$`, "m"), `- [x] ${stage}`);
|
|
83
|
-
}
|
|
84
|
-
/** 从 issue labels 提取当前阶段(阶段序号最大的 cabbage:stage:* 标签) */
|
|
85
|
-
export function getCurrentStage(labels) {
|
|
86
|
-
let current = null;
|
|
87
|
-
for (const label of labels) {
|
|
88
|
-
if (!label.startsWith(STAGE_LABEL_PREFIX))
|
|
89
|
-
continue;
|
|
90
|
-
const stage = label.slice(STAGE_LABEL_PREFIX.length);
|
|
91
|
-
if (!isFlowStage(stage))
|
|
92
|
-
continue;
|
|
93
|
-
if (current === null || STAGE_ORDER[stage] > STAGE_ORDER[current])
|
|
94
|
-
current = stage;
|
|
95
|
-
}
|
|
96
|
-
return current;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 前置门禁判定:
|
|
100
|
-
* - stage-start X:前驱阶段须已 completed(requirements 无前置)
|
|
101
|
-
* - stage-complete X:X 未完成时前驱须已 completed;requirements 完成需 user_confirmed 一次
|
|
102
|
-
* - stage-start tasks:高风险 Flow(cabbage:risk:high)需 user_confirmed 确认
|
|
103
|
-
* - 已完成阶段重复 start/complete → 幂等通过
|
|
104
|
-
*/
|
|
105
|
-
export function checkStageGate(op, stage, completed, highRisk, userConfirmed) {
|
|
106
|
-
const done = completed.includes(stage);
|
|
107
|
-
if (op === "stage-complete") {
|
|
108
|
-
if (done)
|
|
109
|
-
return { ok: true };
|
|
110
|
-
if (stage === "requirements") {
|
|
111
|
-
return userConfirmed ? { ok: true } : requirementConfirmationError();
|
|
112
|
-
}
|
|
113
|
-
if (!completed.includes(FLOW_STAGES[STAGE_ORDER[stage] - 1])) {
|
|
114
|
-
return previousStageError(stage);
|
|
115
|
-
}
|
|
116
|
-
return { ok: true };
|
|
117
|
-
}
|
|
118
|
-
// stage-start
|
|
119
|
-
if (done)
|
|
120
|
-
return { ok: true };
|
|
121
|
-
if (stage !== "requirements" && !completed.includes(FLOW_STAGES[STAGE_ORDER[stage] - 1])) {
|
|
122
|
-
return previousStageError(stage);
|
|
123
|
-
}
|
|
124
|
-
if (stage === "tasks" && highRisk && !userConfirmed) {
|
|
125
|
-
return {
|
|
126
|
-
ok: false,
|
|
127
|
-
code: "RISK_CONFIRMATION_REQUIRED",
|
|
128
|
-
message: "This flow is marked as high-risk; the design-to-tasks handoff requires user confirmation (user_confirmed: true)",
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
return { ok: true };
|
|
132
|
-
}
|
|
133
|
-
function requirementConfirmationError() {
|
|
134
|
-
return {
|
|
135
|
-
ok: false,
|
|
136
|
-
code: "REQUIREMENTS_CONFIRMATION_REQUIRED",
|
|
137
|
-
message: "The requirements baseline must be confirmed once by the user (user_confirmed: true)",
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
function previousStageError(stage) {
|
|
141
|
-
const prev = FLOW_STAGES[STAGE_ORDER[stage] - 1];
|
|
142
|
-
const code = `${prev.toUpperCase()}_NOT_COMPLETE`;
|
|
143
|
-
return { ok: false, code, message: `Stage "${prev}" must be completed before stage "${stage}"` };
|
|
144
|
-
}
|
|
145
|
-
/** 关联 PR:PR body 引用了 Flow 或任一子任务 Issue 号(保留 PR 原始字段) */
|
|
146
|
-
export function filterRelatedPrs(prs, parentIssueNumber, subtaskNumbers) {
|
|
147
|
-
const refs = new Set([String(parentIssueNumber), ...subtaskNumbers.map(String)]);
|
|
148
|
-
return prs.filter(pr => {
|
|
149
|
-
const mentioned = (pr.body ?? "").match(/#(\d+)/g)?.map(s => s.slice(1)) ?? [];
|
|
150
|
-
return mentioned.some(n => refs.has(n));
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
/** 把 statusCheckRollup 精简为 {name, state} 列表(name 兼容 .name/.context) */
|
|
154
|
-
export function summarizeChecks(rollup) {
|
|
155
|
-
return rollup.map(check => ({ name: check.name ?? check.context ?? "unknown", state: check.state }));
|
|
156
|
-
}
|
|
157
|
-
/** 读 Flow Record + 子任务 + 关联 PR checks 汇总(spec §2.3 status) */
|
|
158
|
-
export async function readFlowStatus(parentIssueNumber) {
|
|
159
|
-
try {
|
|
160
|
-
const { stdout: flowOut } = await flowGh(`issue view ${parentIssueNumber} --json number,title,state,labels,body --jq '{number, title, state, labels: [.labels[].name], body}'`);
|
|
161
|
-
const flow = JSON.parse(flowOut);
|
|
162
|
-
const { stdout: subtasksOut } = await flowGh(`issue list --parent ${parentIssueNumber} --json number,title,state --jq '[.[] | {number, title, state}]'`);
|
|
163
|
-
const subtasks = JSON.parse(subtasksOut);
|
|
164
|
-
const { stdout: prsOut } = await flowGh(`pr list --state all --json number,title,state,headRefName,body --jq '[.[] | {number, title, state, headRefName, body}]'`);
|
|
165
|
-
const related = filterRelatedPrs(JSON.parse(prsOut), parentIssueNumber, [...subtasks.map(s => s.number)]);
|
|
166
|
-
const pullRequests = [];
|
|
167
|
-
for (const pr of related) {
|
|
168
|
-
const { stdout: rollupOut } = await flowGh(`pr view ${pr.number} --json statusCheckRollup --jq '[.[] | {name, context, state}]'`);
|
|
169
|
-
const rollup = JSON.parse(rollupOut);
|
|
170
|
-
pullRequests.push({ ...pr, checks: summarizeChecks(rollup) });
|
|
171
|
-
}
|
|
172
|
-
return {
|
|
173
|
-
ok: true,
|
|
174
|
-
status: {
|
|
175
|
-
flow: { number: flow.number, title: flow.title, state: flow.state, labels: flow.labels },
|
|
176
|
-
stages: { completed: getCompletedStages(flow.body), current: getCurrentStage(flow.labels) },
|
|
177
|
-
subtasks,
|
|
178
|
-
pullRequests,
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
catch (err) {
|
|
183
|
-
const message = String(err);
|
|
184
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
185
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
186
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/** 读 Flow Record 标题(即 flow slug) */
|
|
190
|
-
async function readFlowSlug(parentIssueNumber) {
|
|
191
|
-
const { stdout } = await flowGh(`issue view ${parentIssueNumber} --json title --jq .title`);
|
|
192
|
-
return stdout.trim();
|
|
193
|
-
}
|
|
194
|
-
/** 读仓库默认分支 */
|
|
195
|
-
async function readDefaultBranch() {
|
|
196
|
-
const { stdout } = await flowGh(`repo view --json defaultBranchRef --jq .defaultBranchRef.name`);
|
|
197
|
-
return stdout.trim();
|
|
198
|
-
}
|
|
199
|
-
function planningBranch(slug) {
|
|
200
|
-
return `docs/planning-${slug}`;
|
|
201
|
-
}
|
|
202
|
-
function planningWorktreePath(projectDir, slug) {
|
|
203
|
-
return path.join(projectDir, ".worktree", `planning-${slug}`);
|
|
204
|
-
}
|
|
205
|
-
/** 创建 planning worktree `.worktree/planning-<slug>`(architect 在此写文档) */
|
|
206
|
-
export async function planningStart(projectDir, parentIssueNumber) {
|
|
207
|
-
try {
|
|
208
|
-
const slug = await readFlowSlug(parentIssueNumber);
|
|
209
|
-
const base = await readDefaultBranch();
|
|
210
|
-
const result = await worktreeStart({
|
|
211
|
-
projectDir,
|
|
212
|
-
slug: `planning-${slug}`,
|
|
213
|
-
base,
|
|
214
|
-
branchType: "docs",
|
|
215
|
-
});
|
|
216
|
-
if (!result.ok) {
|
|
217
|
-
return { ok: false, code: result.code, message: result.message };
|
|
218
|
-
}
|
|
219
|
-
return { ok: true, worktreePath: result.path, branch: result.branch, reused: result.reused };
|
|
220
|
-
}
|
|
221
|
-
catch (err) {
|
|
222
|
-
const message = String(err);
|
|
223
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
224
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
225
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/** 对 planning worktree 的变更创建 Planning PR(Planning Baseline) */
|
|
229
|
-
export async function planningPr(projectDir, parentIssueNumber) {
|
|
230
|
-
try {
|
|
231
|
-
const slug = await readFlowSlug(parentIssueNumber);
|
|
232
|
-
const branch = planningBranch(slug);
|
|
233
|
-
const worktreeDir = planningWorktreePath(projectDir, slug);
|
|
234
|
-
if (!(await pathExists(worktreeDir))) {
|
|
235
|
-
return {
|
|
236
|
-
ok: false,
|
|
237
|
-
code: "PLANNING_WORKTREE_NOT_FOUND",
|
|
238
|
-
message: `Planning worktree ${worktreeDir} does not exist; run planning-start first`,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
const { stdout: statusOut } = await flowGit(`-C '${escapeShellArg(worktreeDir)}' status --porcelain`);
|
|
242
|
-
if (statusOut.trim() === "") {
|
|
243
|
-
return { ok: false, code: "NOTHING_TO_COMMIT", message: "Planning worktree has no changes to commit" };
|
|
244
|
-
}
|
|
245
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' add -A`);
|
|
246
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' commit -m 'docs: planning baseline for ${slug}'`);
|
|
247
|
-
await flowGit(`-C '${escapeShellArg(worktreeDir)}' push -u origin ${branch}`);
|
|
248
|
-
const base = await readDefaultBranch();
|
|
249
|
-
const prTitle = `docs: planning baseline for ${slug}`;
|
|
250
|
-
const prBody = `Planning Baseline for Flow #${parentIssueNumber}: CONTEXT.md + PRD + Design + ADR (spec PRD R11).`;
|
|
251
|
-
const { stdout } = await flowGh(`pr create --title '${escapeShellArg(prTitle)}' --body '${escapeShellArg(prBody)}' --base ${base} --head ${branch} --json number --jq .number`);
|
|
252
|
-
const prNumber = Number(stdout.trim());
|
|
253
|
-
return { ok: true, worktreePath: worktreeDir, branch, prNumber };
|
|
254
|
-
}
|
|
255
|
-
catch (err) {
|
|
256
|
-
const message = String(err);
|
|
257
|
-
return message.includes("Could not resolve") || message.includes("not found")
|
|
258
|
-
? { ok: false, code: "NOT_FOUND", message }
|
|
259
|
-
: { ok: false, code: "GITHUB_ERROR", message };
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* create-flow:
|
|
264
|
-
* - 新建模式:validateTitle → Profile 门禁 → Draft Parent Issue(body 含目标/验收/阶段 checklist)→ bindSession
|
|
265
|
-
* - 绑定模式(提供 parentIssueNumber):legacy 检测(§11.2)→ bindSession 双 session 检查(§10.3)
|
|
266
|
-
*/
|
|
267
|
-
export async function createFlow(input) {
|
|
268
|
-
if (input.parentIssueNumber === undefined) {
|
|
269
|
-
const validated = validateTitle(input.title);
|
|
270
|
-
if (!validated.ok) {
|
|
271
|
-
return { ok: false, code: validated.code, message: validated.message };
|
|
272
|
-
}
|
|
273
|
-
const profile = await readProjectProfile(input.projectDir);
|
|
274
|
-
if (profile.testCommand === null) {
|
|
275
|
-
return {
|
|
276
|
-
ok: false,
|
|
277
|
-
code: "SETUP_REQUIRED",
|
|
278
|
-
message: "Project Profile is not confirmed; run setup_control confirm-profile first (spec §9.3)",
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
const created = await createFlowRecord({ slug: validated.slug, body: buildFlowBody(validated.slug) });
|
|
282
|
-
if (!created.ok) {
|
|
283
|
-
return { ok: false, code: "ISSUE_CREATE_FAILED", message: created.error };
|
|
284
|
-
}
|
|
285
|
-
const bound = await bindSession(input.projectDir, created.ref.parentIssueNumber, input.sessionID);
|
|
286
|
-
if (!bound.ok) {
|
|
287
|
-
return { ok: false, code: bound.code, message: bound.message };
|
|
288
|
-
}
|
|
289
|
-
return { ok: true, ref: created.ref };
|
|
290
|
-
}
|
|
291
|
-
// 绑定已有 Issue:legacy 检测 → 双 session 检查
|
|
292
|
-
const n = input.parentIssueNumber;
|
|
293
|
-
const legacy = await detectLegacyFlowRun(n, flowGh);
|
|
294
|
-
if (legacy.legacy) {
|
|
295
|
-
return {
|
|
296
|
-
ok: false,
|
|
297
|
-
code: "LEGACY_FLOW_DETECTED",
|
|
298
|
-
message: "This issue is a legacy-architecture FlowRun; complete it with the old plugin version (0.x). New versions do not auto-migrate.",
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
const bound = await bindSession(input.projectDir, n, input.sessionID);
|
|
302
|
-
if (!bound.ok) {
|
|
303
|
-
return { ok: false, code: bound.code, message: bound.message };
|
|
304
|
-
}
|
|
305
|
-
let slug = input.title;
|
|
306
|
-
try {
|
|
307
|
-
slug = await readFlowSlug(n);
|
|
308
|
-
}
|
|
309
|
-
catch {
|
|
310
|
-
// 读不到标题时退化为传入 title
|
|
311
|
-
}
|
|
312
|
-
return { ok: true, ref: { parentIssueNumber: n, slug } };
|
|
313
|
-
}
|
|
314
|
-
/** complete-flow(仅 goal-verify 调用,goal 已验证):关闭 Parent Issue + 标记 completed */
|
|
315
|
-
export async function completeFlow(projectDir, parentIssueNumber) {
|
|
316
|
-
try {
|
|
317
|
-
await flowGh(`issue close ${parentIssueNumber}`);
|
|
318
|
-
await updateFlowSession(projectDir, parentIssueNumber, { status: "completed" });
|
|
319
|
-
return { ok: true, parentIssueNumber };
|
|
320
|
-
}
|
|
321
|
-
catch (err) {
|
|
322
|
-
return { ok: false, code: "GITHUB_ERROR", message: String(err) };
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/** cancel-flow:受控取消(user_confirmed)→ 关闭 Issue + 标记 cancelled */
|
|
326
|
-
export async function cancelFlow(projectDir, parentIssueNumber, userConfirmed) {
|
|
327
|
-
if (!userConfirmed) {
|
|
328
|
-
return {
|
|
329
|
-
ok: false,
|
|
330
|
-
code: "USER_CONFIRMATION_REQUIRED",
|
|
331
|
-
message: "Cancelling a flow requires user confirmation (user_confirmed: true)",
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
try {
|
|
335
|
-
await flowGh(`issue close ${parentIssueNumber}`);
|
|
336
|
-
await updateFlowSession(projectDir, parentIssueNumber, { status: "cancelled" });
|
|
337
|
-
return { ok: true, parentIssueNumber };
|
|
338
|
-
}
|
|
339
|
-
catch (err) {
|
|
340
|
-
return { ok: false, code: "GITHUB_ERROR", message: String(err) };
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
/** takeover:双 session 接管(user_confirmed)→ 旧 session 置 paused + 新 session 绑定(§10.3) */
|
|
344
|
-
export async function takeoverFlow(projectDir, parentIssueNumber, newSessionID, userConfirmed) {
|
|
345
|
-
const index = await readIndex(projectDir);
|
|
346
|
-
const old = getFlowSession(index, parentIssueNumber);
|
|
347
|
-
const result = await takeoverSession(projectDir, parentIssueNumber, newSessionID, userConfirmed);
|
|
348
|
-
if (!result.ok) {
|
|
349
|
-
return { ok: false, code: result.code, message: result.message };
|
|
350
|
-
}
|
|
351
|
-
return { ok: true, parentIssueNumber, oldSessionID: old?.sessionID ?? null };
|
|
352
|
-
}
|
|
353
|
-
/** 读 Flow Record 的 labels(字符串数组) */
|
|
354
|
-
async function readIssueLabels(parentIssueNumber) {
|
|
355
|
-
const { stdout } = await flowGh(`issue view ${parentIssueNumber} --json labels --jq '[.labels[].name]'`);
|
|
356
|
-
return JSON.parse(stdout);
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* stage-start / stage-complete:
|
|
360
|
-
* 门禁(checkStageGate)→ stage-complete 更新 body checklist(乐观锁)→ setStageLabel。
|
|
361
|
-
*/
|
|
362
|
-
export async function applyStageOp(projectDir, parentIssueNumber, op, stage, userConfirmed) {
|
|
363
|
-
const record = await readFlowRecord(parentIssueNumber);
|
|
364
|
-
if (!record.ok) {
|
|
365
|
-
return { ok: false, code: "NOT_FOUND", message: record.error };
|
|
366
|
-
}
|
|
367
|
-
const completed = getCompletedStages(record.body);
|
|
368
|
-
const labels = await readIssueLabels(parentIssueNumber);
|
|
369
|
-
const highRisk = labels.includes(RISK_LABEL);
|
|
370
|
-
const gate = checkStageGate(op, stage, completed, highRisk, userConfirmed);
|
|
371
|
-
if (!gate.ok) {
|
|
372
|
-
return { ok: false, code: gate.code, message: gate.message };
|
|
373
|
-
}
|
|
374
|
-
if (op === "stage-complete") {
|
|
375
|
-
const updated = await updateFlowRecord(parentIssueNumber, record.body, body => markStageComplete(body, stage));
|
|
376
|
-
if (!updated.ok) {
|
|
377
|
-
return { ok: false, code: "BODY_UPDATE_FAILED", message: updated.error };
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
const labelResult = await setStageLabel(parentIssueNumber, stage);
|
|
381
|
-
if (!labelResult.ok) {
|
|
382
|
-
return { ok: false, code: "LABEL_UPDATE_FAILED", message: labelResult.error ?? "label update failed" };
|
|
383
|
-
}
|
|
384
|
-
const newCompleted = op === "stage-complete" ? [...completed, stage] : completed;
|
|
385
|
-
return { ok: true, stage, completedStages: newCompleted, highRisk };
|
|
386
|
-
}
|
|
387
|
-
//# 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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"}
|
package/dist/kernel/legacy.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/** 旧 FlowRun cabinet 标记(flowrun/types.ts 同款) */
|
|
2
|
-
export declare const CABINET_START_MARKER = "<!-- cabbage-flow-run:start -->";
|
|
3
|
-
export declare const CABINET_END_MARKER = "<!-- cabbage-flow-run:end -->";
|
|
4
|
-
export type LegacyFlowDetection = {
|
|
5
|
-
legacy: true;
|
|
6
|
-
flowRunId?: string;
|
|
7
|
-
} | {
|
|
8
|
-
legacy: false;
|
|
9
|
-
};
|
|
10
|
-
/** Issue body 同时含 start/end 标记 → 判定为旧架构 FlowRun(不自动迁移) */
|
|
11
|
-
export declare function containsLegacyMarker(body: string): boolean;
|
|
12
|
-
/**
|
|
13
|
-
* 检测指定 Issue 是否为旧架构 FlowRun。
|
|
14
|
-
* @param ghFn gh 执行器(测试可注入;默认宿主 gh CLI)
|
|
15
|
-
*/
|
|
16
|
-
export declare function detectLegacyFlowRun(parentIssueNumber: number, ghFn?: (args: string) => Promise<{
|
|
17
|
-
stdout: string;
|
|
18
|
-
stderr: string;
|
|
19
|
-
}>): Promise<LegacyFlowDetection>;
|
package/dist/kernel/legacy.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 旧 FlowRun 检测(spec §11.2,自 flowrun/github.ts 只读部分迁移)。
|
|
3
|
-
* 不迁移、不读取旧状态——只判断 Issue body 是否仍是旧架构的 FlowRun cabinet。
|
|
4
|
-
*/
|
|
5
|
-
import { gh as ghCli } from "../util/gh.js";
|
|
6
|
-
/** 旧 FlowRun cabinet 标记(flowrun/types.ts 同款) */
|
|
7
|
-
export const CABINET_START_MARKER = "<!-- cabbage-flow-run:start -->";
|
|
8
|
-
export const CABINET_END_MARKER = "<!-- cabbage-flow-run:end -->";
|
|
9
|
-
/** Issue body 同时含 start/end 标记 → 判定为旧架构 FlowRun(不自动迁移) */
|
|
10
|
-
export function containsLegacyMarker(body) {
|
|
11
|
-
return body.includes(CABINET_START_MARKER) && body.includes(CABINET_END_MARKER);
|
|
12
|
-
}
|
|
13
|
-
/** 从 cabinet JSON 块提取 flowRunId;缺失返回 null */
|
|
14
|
-
function extractFlowRunId(body) {
|
|
15
|
-
const match = /"flowRunId"\s*:\s*"([^"]+)"/.exec(body);
|
|
16
|
-
return match ? match[1] : null;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 检测指定 Issue 是否为旧架构 FlowRun。
|
|
20
|
-
* @param ghFn gh 执行器(测试可注入;默认宿主 gh CLI)
|
|
21
|
-
*/
|
|
22
|
-
export async function detectLegacyFlowRun(parentIssueNumber, ghFn = ghCli) {
|
|
23
|
-
try {
|
|
24
|
-
const { stdout } = await ghFn(`issue view ${parentIssueNumber} --json body --jq .body`);
|
|
25
|
-
if (!containsLegacyMarker(stdout))
|
|
26
|
-
return { legacy: false };
|
|
27
|
-
const flowRunId = extractFlowRunId(stdout);
|
|
28
|
-
return flowRunId ? { legacy: true, flowRunId } : { legacy: true };
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return { legacy: false };
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=legacy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/kernel/legacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAE3C,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAA;AAIjE,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;AACjF,CAAC;AAED,6CAA6C;AAC7C,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,iBAAyB,EACzB,OAAsE,KAAK;IAE3E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,iBAAiB,yBAAyB,CAAC,CAAA;QACvF,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC1C,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC1B,CAAC;AACH,CAAC"}
|