@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.
Files changed (142) hide show
  1. package/.codex-plugin/plugin.json +36 -0
  2. package/README.md +53 -25
  3. package/README.zh.md +23 -23
  4. package/assets/agents/dev-lifecycle.md +208 -68
  5. package/assets/agents/team/architect.md +22 -7
  6. package/assets/agents/team/developer.md +13 -6
  7. package/assets/agents/team/goal-verify.md +4 -1
  8. package/assets/agents/team/researcher.md +59 -0
  9. package/assets/agents/team/reviewer.md +34 -18
  10. package/assets/commands/setup.md +1 -1
  11. package/assets/prompts/bootstrap.md +10 -9
  12. package/assets/prompts/stage-contract.md +25 -25
  13. package/assets/skills/flow-code/SKILL.md +23 -25
  14. package/assets/skills/flow-design/SKILL.md +94 -26
  15. package/assets/skills/flow-release/SKILL.md +41 -17
  16. package/assets/skills/flow-requirements/SKILL.md +19 -13
  17. package/assets/skills/flow-research/SKILL.md +77 -0
  18. package/assets/skills/flow-review/SKILL.md +55 -25
  19. package/assets/skills/flow-setup/SKILL.md +27 -24
  20. package/assets/skills/flow-tasks/SKILL.md +178 -35
  21. package/assets/skills/flow-tdd/SKILL.md +68 -40
  22. package/codex-skills/agent-architect/SKILL.md +79 -0
  23. package/codex-skills/agent-dev-lifecycle/SKILL.md +309 -0
  24. package/codex-skills/agent-developer/SKILL.md +51 -0
  25. package/codex-skills/agent-goal-verify/SKILL.md +45 -0
  26. package/codex-skills/agent-researcher/SKILL.md +32 -0
  27. package/codex-skills/agent-reviewer/SKILL.md +109 -0
  28. package/codex-skills/flow-code/SKILL.md +71 -0
  29. package/codex-skills/flow-design/SKILL.md +146 -0
  30. package/codex-skills/flow-release/SKILL.md +90 -0
  31. package/codex-skills/flow-requirements/SKILL.md +90 -0
  32. package/codex-skills/flow-research/SKILL.md +77 -0
  33. package/codex-skills/flow-review/SKILL.md +110 -0
  34. package/codex-skills/flow-setup/SKILL.md +75 -0
  35. package/codex-skills/flow-tasks/SKILL.md +220 -0
  36. package/codex-skills/flow-tdd/SKILL.md +235 -0
  37. package/dist/hooks/session-start.d.ts +1 -0
  38. package/dist/hooks/session-start.js +72 -0
  39. package/dist/hooks/session-start.js.map +1 -0
  40. package/dist/kernel/session-index.d.ts +8 -25
  41. package/dist/kernel/session-index.js +5 -55
  42. package/dist/kernel/session-index.js.map +1 -1
  43. package/dist/plugin/bootstrap.d.ts +0 -1
  44. package/dist/plugin/bootstrap.js +0 -3
  45. package/dist/plugin/bootstrap.js.map +1 -1
  46. package/dist/plugin/goal-store.d.ts +71 -0
  47. package/dist/plugin/goal-store.js +54 -0
  48. package/dist/plugin/goal-store.js.map +1 -0
  49. package/dist/plugin/goal.d.ts +47 -13
  50. package/dist/plugin/goal.js +228 -128
  51. package/dist/plugin/goal.js.map +1 -1
  52. package/dist/plugin/prompt-lint.js +3 -11
  53. package/dist/plugin/prompt-lint.js.map +1 -1
  54. package/dist/plugin/prompts.d.ts +0 -1
  55. package/dist/plugin/prompts.js +0 -4
  56. package/dist/plugin/prompts.js.map +1 -1
  57. package/dist/plugin/server.d.ts +3 -5
  58. package/dist/plugin/server.js +247 -155
  59. package/dist/plugin/server.js.map +1 -1
  60. package/dist/plugin/skills.d.ts +7 -1
  61. package/dist/plugin/skills.js +75 -12
  62. package/dist/plugin/skills.js.map +1 -1
  63. package/dist/plugin.d.ts +0 -1
  64. package/dist/plugin.js +1 -4
  65. package/dist/plugin.js.map +1 -1
  66. package/dist/util/gh.d.ts +0 -11
  67. package/dist/util/gh.js +0 -14
  68. package/dist/util/gh.js.map +1 -1
  69. package/dist/util/paths.d.ts +0 -14
  70. package/dist/util/paths.js +0 -69
  71. package/dist/util/paths.js.map +1 -1
  72. package/hooks/hooks.json +17 -0
  73. package/package.json +12 -4
  74. package/assets/prompts/ADR-FORMAT.md +0 -45
  75. package/assets/prompts/PRD-FORMAT.md +0 -17
  76. package/assets/templates/gitignore +0 -5
  77. package/dist/kernel/caller.d.ts +0 -48
  78. package/dist/kernel/caller.js +0 -88
  79. package/dist/kernel/caller.js.map +0 -1
  80. package/dist/kernel/flow.d.ts +0 -175
  81. package/dist/kernel/flow.js +0 -467
  82. package/dist/kernel/flow.js.map +0 -1
  83. package/dist/kernel/legacy.d.ts +0 -19
  84. package/dist/kernel/legacy.js +0 -34
  85. package/dist/kernel/legacy.js.map +0 -1
  86. package/dist/kernel/records.d.ts +0 -103
  87. package/dist/kernel/records.js +0 -240
  88. package/dist/kernel/records.js.map +0 -1
  89. package/dist/kernel/release.d.ts +0 -106
  90. package/dist/kernel/release.js +0 -241
  91. package/dist/kernel/release.js.map +0 -1
  92. package/dist/kernel/review.d.ts +0 -34
  93. package/dist/kernel/review.js +0 -82
  94. package/dist/kernel/review.js.map +0 -1
  95. package/dist/kernel/setup.d.ts +0 -95
  96. package/dist/kernel/setup.js +0 -401
  97. package/dist/kernel/setup.js.map +0 -1
  98. package/dist/kernel/slug.d.ts +0 -23
  99. package/dist/kernel/slug.js +0 -67
  100. package/dist/kernel/slug.js.map +0 -1
  101. package/dist/kernel/task.d.ts +0 -213
  102. package/dist/kernel/task.js +0 -873
  103. package/dist/kernel/task.js.map +0 -1
  104. package/dist/kernel/tdd/adapter.d.ts +0 -49
  105. package/dist/kernel/tdd/adapter.js +0 -294
  106. package/dist/kernel/tdd/adapter.js.map +0 -1
  107. package/dist/kernel/tdd/digest.d.ts +0 -18
  108. package/dist/kernel/tdd/digest.js +0 -303
  109. package/dist/kernel/tdd/digest.js.map +0 -1
  110. package/dist/kernel/tdd/evaluator.d.ts +0 -38
  111. package/dist/kernel/tdd/evaluator.js +0 -185
  112. package/dist/kernel/tdd/evaluator.js.map +0 -1
  113. package/dist/kernel/tdd/evidence.d.ts +0 -42
  114. package/dist/kernel/tdd/evidence.js +0 -48
  115. package/dist/kernel/tdd/evidence.js.map +0 -1
  116. package/dist/kernel/tdd/state.d.ts +0 -79
  117. package/dist/kernel/tdd/state.js +0 -363
  118. package/dist/kernel/tdd/state.js.map +0 -1
  119. package/dist/kernel/types.d.ts +0 -180
  120. package/dist/kernel/types.js +0 -2
  121. package/dist/kernel/types.js.map +0 -1
  122. package/dist/kernel/worktree.d.ts +0 -45
  123. package/dist/kernel/worktree.js +0 -156
  124. package/dist/kernel/worktree.js.map +0 -1
  125. package/dist/plugin/flow-control.d.ts +0 -91
  126. package/dist/plugin/flow-control.js +0 -287
  127. package/dist/plugin/flow-control.js.map +0 -1
  128. package/dist/plugin/release-control.d.ts +0 -39
  129. package/dist/plugin/release-control.js +0 -343
  130. package/dist/plugin/release-control.js.map +0 -1
  131. package/dist/plugin/setup-control.d.ts +0 -59
  132. package/dist/plugin/setup-control.js +0 -111
  133. package/dist/plugin/setup-control.js.map +0 -1
  134. package/dist/plugin/task-control.d.ts +0 -90
  135. package/dist/plugin/task-control.js +0 -208
  136. package/dist/plugin/task-control.js.map +0 -1
  137. package/dist/plugin/tdd-checkpoint.d.ts +0 -128
  138. package/dist/plugin/tdd-checkpoint.js +0 -664
  139. package/dist/plugin/tdd-checkpoint.js.map +0 -1
  140. package/dist/util/shell.d.ts +0 -1
  141. package/dist/util/shell.js +0 -4
  142. package/dist/util/shell.js.map +0 -1
@@ -1,156 +0,0 @@
1
- import { exec } from "node:child_process";
2
- import { promisify } from "node:util";
3
- import path from "node:path";
4
- import { symlink } from "node:fs/promises";
5
- import { branchFor, worktreeFor } from "./slug.js";
6
- import { pathExists } from "../util/fs.js";
7
- import { escapeShellArg } from "../util/shell.js";
8
- const execAsync = promisify(exec);
9
- let worktreeGitExecutor = null;
10
- export function setWorktreeGitExecutor(fn) {
11
- worktreeGitExecutor = fn;
12
- }
13
- async function git(args) {
14
- if (worktreeGitExecutor) {
15
- return worktreeGitExecutor(args);
16
- }
17
- return execAsync(`git ${args}`);
18
- }
19
- /** 合法 kebab-case slug(与 slug.ts 一致;防御:从远端标题派生的 slug 也必须过此关) */
20
- const SLUG_SAFE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
21
- /** git 分支名安全白名单:仅允许分支名合法字符,杜绝 shell 元字符 */
22
- const BRANCH_SAFE = /^[A-Za-z0-9._/-]+$/;
23
- /** 分支已存在(本地 ref),未合并 → BRANCH_EXISTS_UNMERGED;已合并残留 → BRANCH_EXISTS */
24
- export async function worktreeStart(input) {
25
- if (!SLUG_SAFE.test(input.slug)) {
26
- return { ok: false, code: "INVALID_SLUG", message: `Invalid worktree slug format: ${input.slug}` };
27
- }
28
- if (!BRANCH_SAFE.test(input.base)) {
29
- return { ok: false, code: "INVALID_SLUG", message: `Invalid base branch name: ${input.base}` };
30
- }
31
- const branch = branchFor(input.slug, input.branchType ?? "feat");
32
- const worktreeDir = path.join(input.projectDir, worktreeFor(input.slug));
33
- if (await pathExists(worktreeDir)) {
34
- return reuseWorktree(worktreeDir, branch);
35
- }
36
- if (await branchExists(branch)) {
37
- const merged = await isMergedToBase(branch, input.base);
38
- return merged
39
- ? { ok: false, code: "BRANCH_EXISTS", message: `branch ${branch} already exists and is merged; remove leftover branch manually` }
40
- : { ok: false, code: "BRANCH_EXISTS_UNMERGED", message: `branch ${branch} already exists and is not merged into ${input.base}` };
41
- }
42
- try {
43
- await git(`worktree add -b '${escapeShellArg(branch)}' '${escapeShellArg(worktreeDir)}' '${escapeShellArg(input.base)}'`);
44
- await linkSharedNodeModules(input.projectDir, worktreeDir);
45
- return { ok: true, branch, path: worktreeDir, reused: false };
46
- }
47
- catch (err) {
48
- return { ok: false, code: "GIT_FAILED", message: String(err) };
49
- }
50
- }
51
- /**
52
- * worktree 依赖复用:主工作区已有 node_modules 且 worktree 无 → 符号链接
53
- * (避免每个 worktree 重新 npm install 约 1-2 分钟;非 Node 项目自然跳过)。
54
- * 失败不阻塞(模型可自行安装)。
55
- */
56
- async function linkSharedNodeModules(projectDir, worktreeDir) {
57
- try {
58
- const src = path.join(projectDir, "node_modules");
59
- const dst = path.join(worktreeDir, "node_modules");
60
- if ((await pathExists(src)) && !(await pathExists(dst))) {
61
- await symlink(src, dst, "dir");
62
- }
63
- }
64
- catch {
65
- // 链接失败(如跨文件系统/权限):忽略,worktree 可自行安装
66
- }
67
- }
68
- /** 目录已存在:HEAD 分支与期望分支一致才复用,否则报错 */
69
- async function reuseWorktree(worktreeDir, branch) {
70
- try {
71
- const { stdout } = await git(`-C '${escapeShellArg(worktreeDir)}' rev-parse --abbrev-ref HEAD`);
72
- const current = stdout.trim();
73
- if (current !== branch) {
74
- return {
75
- ok: false,
76
- code: "BRANCH_MISMATCH",
77
- message: `worktree at ${worktreeDir} is on branch ${current}, expected ${branch}`,
78
- };
79
- }
80
- return { ok: true, branch, path: worktreeDir, reused: true };
81
- }
82
- catch (err) {
83
- return { ok: false, code: "GIT_FAILED", message: String(err) };
84
- }
85
- }
86
- async function branchExists(branch) {
87
- try {
88
- const { stdout } = await git(`rev-parse --verify 'refs/heads/${escapeShellArg(branch)}'`);
89
- return stdout.trim() !== "";
90
- }
91
- catch {
92
- return false;
93
- }
94
- }
95
- /** branch 是否是 base 的祖先(已合并);非祖先或 git 失败 → false */
96
- async function isMergedToBase(branch, base) {
97
- try {
98
- await git(`merge-base --is-ancestor '${escapeShellArg(branch)}' '${escapeShellArg(base)}'`);
99
- return true;
100
- }
101
- catch {
102
- return false;
103
- }
104
- }
105
- /**
106
- * preflight 顺序:不存在 → 幂等跳过;脏 → 拒绝(不 --force);
107
- * 未合并 → 需 user_confirmed 且分支已推送;合并且干净 → 自动删除。
108
- */
109
- export async function destroyWorktree(input) {
110
- if (!(await pathExists(input.worktreeDir))) {
111
- return { ok: true, reason: "NOT_FOUND" };
112
- }
113
- if (await isDirty(input.worktreeDir)) {
114
- return { ok: false, reason: "DIRTY_WORKTREE", message: `worktree ${input.worktreeDir} has uncommitted changes; refusing to remove without --force` };
115
- }
116
- if (!input.prMerged) {
117
- if (!input.userConfirmed) {
118
- return { ok: false, reason: "PR_NOT_MERGED", message: "PR is not merged; require user_confirmed to destroy the worktree" };
119
- }
120
- if (!(await isBranchPushed(input.branch))) {
121
- return { ok: false, reason: "BRANCH_NOT_PUSHED", message: `branch ${input.branch} is not pushed to origin` };
122
- }
123
- }
124
- try {
125
- await git(`worktree remove '${escapeShellArg(input.worktreeDir)}'`);
126
- await removeLocalBranch(input.branch);
127
- return { ok: true, reason: "OK" };
128
- }
129
- catch (err) {
130
- return { ok: false, reason: "GIT_FAILED", message: String(err) };
131
- }
132
- }
133
- async function isDirty(worktreeDir) {
134
- const { stdout } = await git(`-C '${escapeShellArg(worktreeDir)}' status --porcelain`);
135
- return stdout.trim() !== "";
136
- }
137
- /** 分支是否已推送到 origin(ls-remote 命中 refs/heads/<branch>) */
138
- async function isBranchPushed(branch) {
139
- try {
140
- const { stdout } = await git(`ls-remote --heads origin '${escapeShellArg(branch)}'`);
141
- return stdout.includes(`refs/heads/${branch}`);
142
- }
143
- catch {
144
- return false;
145
- }
146
- }
147
- async function removeLocalBranch(branch) {
148
- try {
149
- await git(`rev-parse --verify 'refs/heads/${escapeShellArg(branch)}'`);
150
- }
151
- catch {
152
- return; // 本地分支不存在,跳过
153
- }
154
- await git(`branch -D '${escapeShellArg(branch)}'`);
155
- }
156
- //# sourceMappingURL=worktree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/kernel/worktree.ts"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- import { type FlowStage } from "../kernel/flow.js";
2
- /** session client 最小可见面:get(caller 判定 + goal 读取)+ update(goal 写入) */
3
- export interface FlowControlSessionClient {
4
- session: {
5
- get(input: {
6
- sessionID: string;
7
- }): Promise<{
8
- data?: {
9
- parentID?: string | null;
10
- metadata?: Record<string, unknown>;
11
- };
12
- }>;
13
- update(input: {
14
- sessionID: string;
15
- metadata: Record<string, unknown>;
16
- }): Promise<unknown>;
17
- };
18
- }
19
- /** flow_control 工具依赖 */
20
- export interface FlowControlDeps {
21
- projectDir: string;
22
- sessionClient: FlowControlSessionClient;
23
- }
24
- export type FlowControlResponse = {
25
- ok: boolean;
26
- flow?: {
27
- parentIssueNumber: number;
28
- slug?: string;
29
- };
30
- status?: unknown;
31
- stage?: FlowStage;
32
- completedStages?: FlowStage[];
33
- prNumber?: number;
34
- worktreePath?: string;
35
- branch?: string;
36
- oldSessionID?: string | null;
37
- error?: {
38
- code: string;
39
- message: string;
40
- };
41
- };
42
- /**
43
- * flow_control 工具工厂(spec §2.3)。
44
- * caller 门禁:primary(除 complete-flow 外);complete-flow 仅 goal-verify。
45
- */
46
- export declare function createFlowControlTool(deps: FlowControlDeps): {
47
- description: string;
48
- args: {
49
- op: import("zod").ZodEnum<{
50
- status: "status";
51
- "complete-flow": "complete-flow";
52
- "planning-pr": "planning-pr";
53
- "stage-start": "stage-start";
54
- "stage-complete": "stage-complete";
55
- "create-flow": "create-flow";
56
- "planning-start": "planning-start";
57
- "cancel-flow": "cancel-flow";
58
- takeover: "takeover";
59
- }>;
60
- title: import("zod").ZodOptional<import("zod").ZodString>;
61
- auto_mode: import("zod").ZodOptional<import("zod").ZodBoolean>;
62
- goal: import("zod").ZodOptional<import("zod").ZodString>;
63
- acceptance_criteria: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
64
- parent_issue_number: import("zod").ZodOptional<import("zod").ZodNumber>;
65
- stage: import("zod").ZodOptional<import("zod").ZodEnum<{
66
- tasks: "tasks";
67
- code: "code";
68
- requirements: "requirements";
69
- design: "design";
70
- review: "review";
71
- }>>;
72
- risk: import("zod").ZodOptional<import("zod").ZodEnum<{
73
- high: "high";
74
- low: "low";
75
- }>>;
76
- user_confirmed: import("zod").ZodOptional<import("zod").ZodBoolean>;
77
- };
78
- execute(args: {
79
- op: "status" | "complete-flow" | "planning-pr" | "stage-start" | "stage-complete" | "create-flow" | "planning-start" | "cancel-flow" | "takeover";
80
- title?: string | undefined;
81
- auto_mode?: boolean | undefined;
82
- goal?: string | undefined;
83
- acceptance_criteria?: string[] | undefined;
84
- parent_issue_number?: number | undefined;
85
- stage?: "tasks" | "code" | "requirements" | "design" | "review" | undefined;
86
- risk?: "high" | "low" | undefined;
87
- user_confirmed?: boolean | undefined;
88
- }, context: import("@opencode-ai/plugin/tool").ToolContext): Promise<import("@opencode-ai/plugin/tool").ToolResult>;
89
- };
90
- /** 独立注册辅助:把 flow_control 挂到工具注册表(后续接线批次使用) */
91
- export declare function registerFlowControl(registry: Record<string, unknown>, deps: FlowControlDeps): void;
@@ -1,287 +0,0 @@
1
- /**
2
- * flow_control 工具(spec §2.3):Flow Record 生命周期(替代旧 FlowRun 状态机)。
3
- * 九 op:create-flow / status / planning-start / planning-pr / stage-start / stage-complete /
4
- * complete-flow / cancel-flow / takeover。
5
- * caller:primary 全量(除 complete-flow);complete-flow 仅 goal-verify。
6
- * server.ts 接线由后续批次统一处理(本批不注册,避免文件冲突)。
7
- */
8
- import { tool } from "@opencode-ai/plugin/tool";
9
- import { resolveProjectDir } from "../util/paths.js";
10
- import { requireToolCaller, CALLER_NOT_AUTHORIZED } from "../kernel/caller.js";
11
- import { FLOW_STAGES, createFlow, readFlowStatus, planningStart, planningPr, applyStageOp, completeFlow, cancelFlow, takeoverFlow, } from "../kernel/flow.js";
12
- import { readIndex, getFlowSession } from "../kernel/session-index.js";
13
- import { detectLegacyFlowRun } from "../kernel/legacy.js";
14
- import { flowGh } from "../kernel/flow.js";
15
- /**
16
- * flow_control 工具工厂(spec §2.3)。
17
- * caller 门禁:primary(除 complete-flow 外);complete-flow 仅 goal-verify。
18
- */
19
- export function createFlowControlTool(deps) {
20
- return tool({
21
- description: `Control the Flow Record lifecycle (a Flow = one GitHub Parent Issue).
22
-
23
- Operations:
24
- - create-flow: Validate the functional title, derive the slug, create a Draft Parent Issue (body contains goal/acceptance/stage checklist, label cabbage:flow), bind the session, and write the minimal goal. When parent_issue_number is given, bind an existing issue instead (legacy FlowRun detection + double-session check).
25
- - status: Aggregate the Flow Record body, subtasks (issue list --json parent 过滤), and related PR checks into one report.
26
- - planning-start: Create the planning worktree .worktree/planning-<slug> for the architect.
27
- - planning-pr: Commit/push the planning worktree changes and open the Planning PR (Planning Baseline).
28
- - stage-start / stage-complete: Enforce stage gates (requirements baseline confirmed once; design must complete before tasks; high-risk flows pause between design and tasks) and update the Parent Issue checklist + cabbage:stage:* label.
29
- - complete-flow: goal-verify only. After independent verification, close the Parent Issue.
30
- - cancel-flow: Controlled cancellation (requires user_confirmed).
31
- - takeover: Take over a flow bound to another active session (requires user_confirmed; old session goal is paused).
32
-
33
- Caller: primary for all ops except complete-flow (goal-verify only).`,
34
- args: {
35
- op: tool.schema
36
- .enum(["create-flow", "status", "planning-start", "planning-pr", "stage-start", "stage-complete", "complete-flow", "cancel-flow", "takeover"])
37
- .describe("Flow control operation"),
38
- title: tool.schema.string().optional().describe("Functional title (kebab-case slug) for create-flow"),
39
- auto_mode: tool.schema
40
- .boolean()
41
- .optional()
42
- .describe("Full-auto mode: label the flow cabbage:auto so stage confirmation gates (requirements/high-risk) pass without user_confirmed"),
43
- goal: tool.schema.string().optional().describe("Initial objective to fill the Flow Record Goal block (create-flow)"),
44
- acceptance_criteria: tool.schema
45
- .array(tool.schema.string())
46
- .optional()
47
- .describe("Initial acceptance criteria list to fill the Flow Record Acceptance Criteria block (create-flow)"),
48
- parent_issue_number: tool.schema.number().optional().describe("Parent GitHub Issue number of the Flow Record"),
49
- stage: tool.schema
50
- .enum(["requirements", "design", "tasks", "code", "review"])
51
- .optional()
52
- .describe("Stage name (for stage-start/stage-complete)"),
53
- risk: tool.schema
54
- .enum(["high", "low"])
55
- .optional()
56
- .describe("Risk declaration for stage-start/stage-complete tasks handoff: high triggers the R11 user-confirmation gate (user_confirmed) and persists the cabbage:risk:high label"),
57
- user_confirmed: tool.schema.boolean().optional().describe("User confirmation (required for cancel-flow/takeover and high-risk gates)"),
58
- },
59
- async execute(args, ctx) {
60
- const op = args.op;
61
- // caller 门禁(矩阵单一来源,§2.2):complete-flow 仅 goal-verify;status 另开放 architect;其余仅 primary
62
- const denied = await requireToolCaller(ctx, "flow_control", op, deps.sessionClient);
63
- if (denied)
64
- return errorResponse(CALLER_NOT_AUTHORIZED, denied);
65
- // 会话级项目目录优先(workspace root 异常会话下插件级 projectDir 可能是 `/`)
66
- const runtimeDeps = { ...deps, projectDir: resolveProjectDir(ctx.directory, deps.projectDir) };
67
- try {
68
- switch (op) {
69
- case "create-flow":
70
- return handleCreateFlow(runtimeDeps, args, ctx.sessionID);
71
- case "status":
72
- return handleStatus(runtimeDeps, args);
73
- case "planning-start":
74
- return handlePlanningStart(runtimeDeps, args);
75
- case "planning-pr":
76
- return handlePlanningPr(runtimeDeps, args);
77
- case "stage-start":
78
- case "stage-complete":
79
- return handleStage(runtimeDeps, args, op);
80
- case "complete-flow":
81
- return handleCompleteFlow(runtimeDeps, args, ctx);
82
- case "cancel-flow":
83
- return handleCancelFlow(runtimeDeps, args);
84
- case "takeover":
85
- return handleTakeover(runtimeDeps, args, ctx.sessionID);
86
- default:
87
- return errorResponse("UNKNOWN_OP", `Unknown op: "${op}"`);
88
- }
89
- }
90
- catch (err) {
91
- return errorResponse("INTERNAL_ERROR", String(err));
92
- }
93
- },
94
- });
95
- }
96
- /** 独立注册辅助:把 flow_control 挂到工具注册表(后续接线批次使用) */
97
- export function registerFlowControl(registry, deps) {
98
- registry.flow_control = createFlowControlTool(deps);
99
- }
100
- // ─── op handlers ───
101
- async function handleCreateFlow(deps, args, sessionID) {
102
- const parent = args.parent_issue_number !== undefined ? Number(args.parent_issue_number) : undefined;
103
- const title = args.title ?? "";
104
- if (parent === undefined && title.trim() === "") {
105
- return errorResponse("POLICY_INVALID", "title is required for create-flow (or pass parent_issue_number to bind an existing issue)");
106
- }
107
- const result = await createFlow({
108
- projectDir: deps.projectDir,
109
- title,
110
- sessionID,
111
- autoMode: args.auto_mode === true,
112
- goal: args.goal,
113
- acceptanceCriteria: args.acceptance_criteria,
114
- parentIssueNumber: parent,
115
- });
116
- if (!result.ok) {
117
- return errorResponse(result.code, result.message);
118
- }
119
- const goalWritten = await writeMinimalGoal(deps.sessionClient, sessionID, result.ref.parentIssueNumber);
120
- if (!goalWritten) {
121
- return errorResponse("GOAL_WRITE_FAILED", "flow created but failed to write the minimal goal to the session");
122
- }
123
- return okResponse({ flow: result.ref });
124
- }
125
- async function handleStatus(_deps, args) {
126
- const n = requireParentIssueNumber(args);
127
- if (typeof n === "string")
128
- return n;
129
- const legacy = await detectLegacyFlowRun(n, flowGh);
130
- if (legacy.legacy)
131
- return legacyDetectedResponse(legacy);
132
- const result = await readFlowStatus(n);
133
- if (!result.ok) {
134
- return errorResponse(result.code, result.message);
135
- }
136
- return okResponse({ status: result.status });
137
- }
138
- async function handlePlanningStart(deps, args) {
139
- const n = requireParentIssueNumber(args);
140
- if (typeof n === "string")
141
- return n;
142
- const result = await planningStart(deps.projectDir, n);
143
- if (!result.ok) {
144
- return errorResponse(result.code, result.message);
145
- }
146
- return okResponse({ worktreePath: result.worktreePath, branch: result.branch });
147
- }
148
- async function handlePlanningPr(deps, args) {
149
- const n = requireParentIssueNumber(args);
150
- if (typeof n === "string")
151
- return n;
152
- const result = await planningPr(deps.projectDir, n);
153
- if (!result.ok) {
154
- return errorResponse(result.code, result.message);
155
- }
156
- return okResponse({ prNumber: result.prNumber, worktreePath: result.worktreePath, branch: result.branch });
157
- }
158
- async function handleStage(deps, args, op) {
159
- const n = requireParentIssueNumber(args);
160
- if (typeof n === "string")
161
- return n;
162
- const stage = args.stage;
163
- if (!stage || !FLOW_STAGES.includes(stage)) {
164
- return errorResponse("POLICY_INVALID", "stage is required for stage ops: requirements|design|tasks|code|review");
165
- }
166
- const risk = args.risk;
167
- if (risk !== undefined && risk !== "high" && risk !== "low") {
168
- return errorResponse("POLICY_INVALID", "risk must be \"high\" or \"low\"");
169
- }
170
- const result = await applyStageOp(deps.projectDir, n, op, stage, args.user_confirmed === true, risk);
171
- if (!result.ok) {
172
- return errorResponse(result.code, result.message);
173
- }
174
- const note = op === "stage-complete" && stage === "requirements"
175
- ? "requirements 产物(PRD/CONTEXT/decision-map)请 commit+push 到 main:planning worktree 基于 main HEAD 创建,未提交的文件在其中不可见"
176
- : undefined;
177
- return okResponse({
178
- stage: result.stage,
179
- completedStages: result.completedStages,
180
- ...(result.highRisk ? { highRisk: true } : {}),
181
- ...(note ? { note } : {}),
182
- });
183
- }
184
- async function handleCompleteFlow(deps, args, ctx) {
185
- const n = requireParentIssueNumber(args);
186
- if (typeof n === "string")
187
- return n;
188
- // 独立 goal-verify 验证通过:flow 级 goalComplete 标记(跨会话持久,最可靠)
189
- // 或绑定 session 的 goal 已 complete(向后兼容)
190
- const index = await readIndex(deps.projectDir);
191
- const entry = getFlowSession(index, n);
192
- const goalCompleteAtFlowLevel = entry?.goalComplete === true;
193
- const targetSessionID = entry?.sessionID ?? ctx.sessionID;
194
- const goalStatus = await readGoalStatus(deps.sessionClient, targetSessionID);
195
- if (!goalCompleteAtFlowLevel && goalStatus !== "complete") {
196
- return errorResponse("GOAL_NOT_COMPLETE", "complete-flow requires the goal to be verified complete first (goal({op:'complete'}) by goal-verify)");
197
- }
198
- const result = await completeFlow(deps.projectDir, n);
199
- if (!result.ok) {
200
- return errorResponse(result.code, result.message);
201
- }
202
- return okResponse({ flow: { parentIssueNumber: result.parentIssueNumber } });
203
- }
204
- async function handleCancelFlow(deps, args) {
205
- const n = requireParentIssueNumber(args);
206
- if (typeof n === "string")
207
- return n;
208
- const result = await cancelFlow(deps.projectDir, n, args.user_confirmed === true);
209
- if (!result.ok) {
210
- return errorResponse(result.code, result.message);
211
- }
212
- return okResponse({ flow: { parentIssueNumber: result.parentIssueNumber } });
213
- }
214
- async function handleTakeover(deps, args, sessionID) {
215
- const n = requireParentIssueNumber(args);
216
- if (typeof n === "string")
217
- return n;
218
- const result = await takeoverFlow(deps.projectDir, n, sessionID, args.user_confirmed === true);
219
- if (!result.ok) {
220
- return errorResponse(result.code, result.message);
221
- }
222
- if (result.oldSessionID && result.oldSessionID !== sessionID) {
223
- await pauseOldSessionGoal(deps.sessionClient, result.oldSessionID);
224
- }
225
- return okResponse({ flow: { parentIssueNumber: result.parentIssueNumber }, oldSessionID: result.oldSessionID });
226
- }
227
- // ─── helpers ───
228
- function requireParentIssueNumber(args) {
229
- const n = Number(args.parent_issue_number);
230
- if (!Number.isInteger(n) || n <= 0) {
231
- return errorResponse("POLICY_INVALID", "parent_issue_number is required");
232
- }
233
- return n;
234
- }
235
- /** 写最小 goal(§10.2):{parentIssueNumber, status:"active", continuationCount:0} */
236
- async function writeMinimalGoal(client, sessionID, parentIssueNumber) {
237
- try {
238
- const { data } = await client.session.get({ sessionID });
239
- const existing = data?.metadata ?? {};
240
- await client.session.update({
241
- sessionID,
242
- metadata: { ...existing, goal: { parentIssueNumber, status: "active", continuationCount: 0 } },
243
- });
244
- return true;
245
- }
246
- catch {
247
- return false;
248
- }
249
- }
250
- /** 读指定 session 的 goal 状态;无 goal 返回 null */
251
- async function readGoalStatus(client, sessionID) {
252
- try {
253
- const { data } = await client.session.get({ sessionID });
254
- const goal = data?.metadata?.goal;
255
- return goal?.status ?? null;
256
- }
257
- catch {
258
- return null;
259
- }
260
- }
261
- /** takeover 后把旧 session 的 goal 置 paused(§10.3) */
262
- async function pauseOldSessionGoal(client, sessionID) {
263
- try {
264
- const { data } = await client.session.get({ sessionID });
265
- const metadata = data?.metadata;
266
- const goal = metadata?.goal;
267
- if (!goal)
268
- return;
269
- await client.session.update({ sessionID, metadata: { ...metadata, goal: { ...goal, status: "paused" } } });
270
- }
271
- catch {
272
- // 旧 session goal 置 paused 失败不阻断 takeover
273
- }
274
- }
275
- function legacyDetectedResponse(legacy) {
276
- const detail = legacy.flowRunId ? ` (flowRunId: ${legacy.flowRunId})` : "";
277
- return errorResponse("LEGACY_FLOW_DETECTED", `This issue is a legacy-architecture FlowRun${detail}; complete it with the old plugin version (0.x). New versions do not auto-migrate.`);
278
- }
279
- function okResponse(overrides = {}) {
280
- const resp = { ok: true, ...overrides };
281
- return JSON.stringify(resp, null, 2);
282
- }
283
- function errorResponse(code, message) {
284
- const resp = { ok: false, error: { code, message } };
285
- return JSON.stringify(resp, null, 2);
286
- }
287
- //# sourceMappingURL=flow-control.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flow-control.js","sourceRoot":"","sources":["../../src/plugin/flow-control.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import type { CallerSessionClient } from "../kernel/caller.js";
2
- import type { GhFn } from "../kernel/release.js";
3
- export type GitFn = (args: string, cwd: string) => Promise<{
4
- stdout: string;
5
- stderr: string;
6
- }>;
7
- export declare function setReleaseControlGhExecutor(fn: GhFn | null): void;
8
- export declare function setReleaseControlGitExecutor(fn: GitFn | null): void;
9
- export type ReleaseControlOp = "propose-version" | "open-release-pr" | "merge-release-pr" | "monitor";
10
- export interface ReleaseControlDeps {
11
- projectDir: string;
12
- sessionClient: CallerSessionClient;
13
- }
14
- /**
15
- * release_control — 版本提议 / Release PR / 合并打 tag / release workflow 监控。
16
- * 技术栈无关:版本读写规则与 tag 格式全部来自 Profile(§9.1),不硬编码 npm。
17
- */
18
- export declare function createReleaseControlTool(deps: ReleaseControlDeps): {
19
- description: string;
20
- args: {
21
- op: import("zod").ZodEnum<{
22
- "propose-version": "propose-version";
23
- "open-release-pr": "open-release-pr";
24
- "merge-release-pr": "merge-release-pr";
25
- monitor: "monitor";
26
- }>;
27
- proposed_version: import("zod").ZodString;
28
- merge_sha: import("zod").ZodOptional<import("zod").ZodString>;
29
- release_notes: import("zod").ZodString;
30
- user_confirmed: import("zod").ZodBoolean;
31
- };
32
- execute(args: {
33
- op: "propose-version" | "open-release-pr" | "merge-release-pr" | "monitor";
34
- proposed_version: string;
35
- release_notes: string;
36
- user_confirmed: boolean;
37
- merge_sha?: string | undefined;
38
- }, context: import("@opencode-ai/plugin/tool").ToolContext): Promise<import("@opencode-ai/plugin/tool").ToolResult>;
39
- };