@devcxl/opencode-cabbage 0.3.2 → 1.1.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 (179) hide show
  1. package/README.md +34 -19
  2. package/README.zh.md +34 -19
  3. package/assets/agents/dev-lifecycle.md +60 -49
  4. package/assets/agents/team/architect.md +8 -1
  5. package/assets/agents/team/developer.md +89 -0
  6. package/assets/agents/team/goal-verify.md +5 -1
  7. package/assets/agents/team/reviewer.md +6 -0
  8. package/assets/commands/code.md +3 -2
  9. package/assets/commands/design.md +3 -2
  10. package/assets/commands/release.md +3 -2
  11. package/assets/commands/requirements.md +3 -2
  12. package/assets/commands/review.md +3 -2
  13. package/assets/commands/setup.md +3 -2
  14. package/assets/commands/tasks.md +2 -1
  15. package/assets/prompts/bootstrap.md +9 -8
  16. package/assets/prompts/stage-contract.md +55 -0
  17. package/assets/skills/flow-code/SKILL.md +38 -140
  18. package/assets/skills/flow-design/SKILL.md +28 -79
  19. package/assets/skills/flow-release/SKILL.md +31 -51
  20. package/assets/skills/flow-requirements/SKILL.md +31 -196
  21. package/assets/skills/flow-review/SKILL.md +26 -123
  22. package/assets/skills/flow-setup/SKILL.md +40 -43
  23. package/assets/skills/flow-tasks/SKILL.md +23 -153
  24. package/assets/skills/flow-tdd/SKILL.md +30 -31
  25. package/dist/kernel/caller.d.ts +48 -0
  26. package/dist/kernel/caller.js +88 -0
  27. package/dist/kernel/caller.js.map +1 -0
  28. package/dist/kernel/context.d.ts +27 -0
  29. package/dist/kernel/context.js +84 -0
  30. package/dist/kernel/context.js.map +1 -0
  31. package/dist/kernel/flow.d.ts +175 -0
  32. package/dist/kernel/flow.js +467 -0
  33. package/dist/kernel/flow.js.map +1 -0
  34. package/dist/kernel/legacy.d.ts +19 -0
  35. package/dist/kernel/legacy.js +34 -0
  36. package/dist/kernel/legacy.js.map +1 -0
  37. package/dist/kernel/mutex.d.ts +8 -0
  38. package/dist/kernel/mutex.js +23 -0
  39. package/dist/kernel/mutex.js.map +1 -0
  40. package/dist/kernel/permission.d.ts +21 -0
  41. package/dist/kernel/permission.js +45 -0
  42. package/dist/kernel/permission.js.map +1 -0
  43. package/dist/kernel/profile.d.ts +35 -0
  44. package/dist/kernel/profile.js +147 -0
  45. package/dist/kernel/profile.js.map +1 -0
  46. package/dist/kernel/records.d.ts +103 -0
  47. package/dist/kernel/records.js +240 -0
  48. package/dist/kernel/records.js.map +1 -0
  49. package/dist/kernel/release.d.ts +106 -0
  50. package/dist/kernel/release.js +241 -0
  51. package/dist/kernel/release.js.map +1 -0
  52. package/dist/kernel/review.d.ts +34 -0
  53. package/dist/kernel/review.js +82 -0
  54. package/dist/kernel/review.js.map +1 -0
  55. package/dist/kernel/session-index.d.ts +45 -0
  56. package/dist/kernel/session-index.js +136 -0
  57. package/dist/kernel/session-index.js.map +1 -0
  58. package/dist/kernel/setup.d.ts +95 -0
  59. package/dist/kernel/setup.js +401 -0
  60. package/dist/kernel/setup.js.map +1 -0
  61. package/dist/kernel/slug.d.ts +23 -0
  62. package/dist/kernel/slug.js +67 -0
  63. package/dist/kernel/slug.js.map +1 -0
  64. package/dist/kernel/task.d.ts +213 -0
  65. package/dist/kernel/task.js +873 -0
  66. package/dist/kernel/task.js.map +1 -0
  67. package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
  68. package/dist/{flowrun → kernel/tdd}/adapter.js +27 -26
  69. package/dist/kernel/tdd/adapter.js.map +1 -0
  70. package/dist/{flowrun → kernel/tdd}/digest.d.ts +2 -1
  71. package/dist/{flowrun → kernel/tdd}/digest.js +6 -4
  72. package/dist/kernel/tdd/digest.js.map +1 -0
  73. package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
  74. package/dist/{flowrun → kernel/tdd}/evaluator.js +1 -1
  75. package/dist/kernel/tdd/evaluator.js.map +1 -0
  76. package/dist/kernel/tdd/evidence.d.ts +42 -0
  77. package/dist/kernel/tdd/evidence.js +48 -0
  78. package/dist/kernel/tdd/evidence.js.map +1 -0
  79. package/dist/{flowrun → kernel/tdd}/state.d.ts +2 -2
  80. package/dist/{flowrun → kernel/tdd}/state.js +1 -1
  81. package/dist/kernel/tdd/state.js.map +1 -0
  82. package/dist/kernel/types.d.ts +180 -0
  83. package/dist/kernel/types.js +2 -0
  84. package/dist/kernel/types.js.map +1 -0
  85. package/dist/kernel/worktree.d.ts +45 -0
  86. package/dist/kernel/worktree.js +156 -0
  87. package/dist/kernel/worktree.js.map +1 -0
  88. package/dist/plugin/agents.d.ts +5 -17
  89. package/dist/plugin/agents.js +0 -23
  90. package/dist/plugin/agents.js.map +1 -1
  91. package/dist/plugin/flow-control.d.ts +91 -0
  92. package/dist/plugin/flow-control.js +287 -0
  93. package/dist/plugin/flow-control.js.map +1 -0
  94. package/dist/plugin/goal.d.ts +17 -46
  95. package/dist/plugin/goal.js +47 -117
  96. package/dist/plugin/goal.js.map +1 -1
  97. package/dist/plugin/prompt-lint.js +78 -6
  98. package/dist/plugin/prompt-lint.js.map +1 -1
  99. package/dist/plugin/release-control.d.ts +39 -0
  100. package/dist/plugin/release-control.js +343 -0
  101. package/dist/plugin/release-control.js.map +1 -0
  102. package/dist/plugin/server.d.ts +19 -0
  103. package/dist/plugin/server.js +198 -320
  104. package/dist/plugin/server.js.map +1 -1
  105. package/dist/plugin/setup-control.d.ts +59 -0
  106. package/dist/plugin/setup-control.js +111 -0
  107. package/dist/plugin/setup-control.js.map +1 -0
  108. package/dist/plugin/shell.d.ts +7 -34
  109. package/dist/plugin/shell.js +12 -137
  110. package/dist/plugin/shell.js.map +1 -1
  111. package/dist/plugin/skills.d.ts +1 -1
  112. package/dist/plugin/skills.js +1 -7
  113. package/dist/plugin/skills.js.map +1 -1
  114. package/dist/plugin/task-control.d.ts +90 -0
  115. package/dist/plugin/task-control.js +208 -0
  116. package/dist/plugin/task-control.js.map +1 -0
  117. package/dist/plugin/tdd-checkpoint.d.ts +128 -0
  118. package/dist/plugin/tdd-checkpoint.js +664 -0
  119. package/dist/plugin/tdd-checkpoint.js.map +1 -0
  120. package/dist/util/gh.d.ts +5 -0
  121. package/dist/util/gh.js +12 -0
  122. package/dist/util/gh.js.map +1 -1
  123. package/dist/util/paths.d.ts +6 -2
  124. package/dist/util/paths.js +15 -7
  125. package/dist/util/paths.js.map +1 -1
  126. package/package.json +4 -4
  127. package/assets/agents/team/backend.md +0 -100
  128. package/assets/agents/team/frontend.md +0 -98
  129. package/assets/commands/handoff.md +0 -4
  130. package/assets/commands/test.md +0 -4
  131. package/assets/context/CONTEXT.md +0 -41
  132. package/assets/skills/flow-handoff/SKILL.md +0 -76
  133. package/assets/skills/flow-test/SKILL.md +0 -75
  134. package/dist/flowrun/adapter.js.map +0 -1
  135. package/dist/flowrun/audit.d.ts +0 -5
  136. package/dist/flowrun/audit.js +0 -67
  137. package/dist/flowrun/audit.js.map +0 -1
  138. package/dist/flowrun/ci.d.ts +0 -64
  139. package/dist/flowrun/ci.js +0 -184
  140. package/dist/flowrun/ci.js.map +0 -1
  141. package/dist/flowrun/coverage.d.ts +0 -70
  142. package/dist/flowrun/coverage.js +0 -207
  143. package/dist/flowrun/coverage.js.map +0 -1
  144. package/dist/flowrun/digest.js.map +0 -1
  145. package/dist/flowrun/evaluator.js.map +0 -1
  146. package/dist/flowrun/gate.d.ts +0 -28
  147. package/dist/flowrun/gate.js +0 -139
  148. package/dist/flowrun/gate.js.map +0 -1
  149. package/dist/flowrun/github.d.ts +0 -24
  150. package/dist/flowrun/github.js +0 -154
  151. package/dist/flowrun/github.js.map +0 -1
  152. package/dist/flowrun/index.d.ts +0 -14
  153. package/dist/flowrun/index.js +0 -15
  154. package/dist/flowrun/index.js.map +0 -1
  155. package/dist/flowrun/merge.d.ts +0 -57
  156. package/dist/flowrun/merge.js +0 -180
  157. package/dist/flowrun/merge.js.map +0 -1
  158. package/dist/flowrun/migration.d.ts +0 -11
  159. package/dist/flowrun/migration.js +0 -276
  160. package/dist/flowrun/migration.js.map +0 -1
  161. package/dist/flowrun/resilience.d.ts +0 -18
  162. package/dist/flowrun/resilience.js +0 -80
  163. package/dist/flowrun/resilience.js.map +0 -1
  164. package/dist/flowrun/state.js.map +0 -1
  165. package/dist/flowrun/transitions.d.ts +0 -66
  166. package/dist/flowrun/transitions.js +0 -168
  167. package/dist/flowrun/transitions.js.map +0 -1
  168. package/dist/flowrun/types.d.ts +0 -356
  169. package/dist/flowrun/types.js +0 -21
  170. package/dist/flowrun/types.js.map +0 -1
  171. package/dist/flowrun/validator.d.ts +0 -19
  172. package/dist/flowrun/validator.js +0 -209
  173. package/dist/flowrun/validator.js.map +0 -1
  174. package/dist/plugin/broker.d.ts +0 -73
  175. package/dist/plugin/broker.js +0 -140
  176. package/dist/plugin/broker.js.map +0 -1
  177. package/dist/plugin/tdd-tool.d.ts +0 -62
  178. package/dist/plugin/tdd-tool.js +0 -336
  179. package/dist/plugin/tdd-tool.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ import type { BranchType } from "./slug.js";
2
+ type GitFn = (args: string) => Promise<{
3
+ stdout: string;
4
+ stderr: string;
5
+ }>;
6
+ export declare function setWorktreeGitExecutor(fn: GitFn | null): void;
7
+ export type WorktreeStartResult = {
8
+ ok: true;
9
+ branch: string;
10
+ path: string;
11
+ reused: boolean;
12
+ } | {
13
+ ok: false;
14
+ code: "BRANCH_EXISTS" | "BRANCH_EXISTS_UNMERGED" | "BRANCH_MISMATCH" | "INVALID_SLUG" | "GIT_FAILED";
15
+ message: string;
16
+ };
17
+ export interface WorktreeStartInput {
18
+ projectDir: string;
19
+ slug: string;
20
+ base: string;
21
+ branchType?: BranchType;
22
+ }
23
+ /** 分支已存在(本地 ref),未合并 → BRANCH_EXISTS_UNMERGED;已合并残留 → BRANCH_EXISTS */
24
+ export declare function worktreeStart(input: WorktreeStartInput): Promise<WorktreeStartResult>;
25
+ export type DestroyReason = "OK" | "DIRTY_WORKTREE" | "PR_NOT_MERGED" | "BRANCH_NOT_PUSHED" | "NOT_FOUND";
26
+ export type DestroyWorktreeResult = {
27
+ ok: true;
28
+ reason: "OK" | "NOT_FOUND";
29
+ } | {
30
+ ok: false;
31
+ reason: "DIRTY_WORKTREE" | "PR_NOT_MERGED" | "BRANCH_NOT_PUSHED" | "GIT_FAILED";
32
+ message: string;
33
+ };
34
+ export interface DestroyWorktreeInput {
35
+ worktreeDir: string;
36
+ branch: string;
37
+ prMerged: boolean;
38
+ userConfirmed: boolean;
39
+ }
40
+ /**
41
+ * preflight 顺序:不存在 → 幂等跳过;脏 → 拒绝(不 --force);
42
+ * 未合并 → 需 user_confirmed 且分支已推送;合并且干净 → 自动删除。
43
+ */
44
+ export declare function destroyWorktree(input: DestroyWorktreeInput): Promise<DestroyWorktreeResult>;
45
+ export {};
@@ -0,0 +1,156 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/kernel/worktree.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,8 @@
1
- export interface AgentTools {
2
- read?: boolean;
3
- bash?: boolean;
4
- write?: boolean;
5
- edit?: boolean;
6
- }
7
- export interface AgentCapabilities {
8
- create_pr: boolean;
9
- merge_pr: boolean;
10
- modify_files: boolean;
11
- run_tests: boolean;
12
- push_branch: boolean;
13
- approve_review: boolean;
14
- complete_goal: boolean;
15
- }
1
+ /**
2
+ * Agent frontmatter 的 permission 解析。
3
+ * 值可为字符串(如 "deny"、"npm test|git push")或嵌套规则对象
4
+ * (OpenCode 语义:pattern → action,如 bash: { "*": "deny", "npm *": "allow" })。
5
+ */
16
6
  export interface AgentPermission {
17
7
  [key: string]: string | Record<string, string> | undefined;
18
8
  }
@@ -21,8 +11,6 @@ export interface AgentEntry {
21
11
  description?: string;
22
12
  mode?: "subagent" | "primary" | "all";
23
13
  color?: string;
24
- tools?: AgentTools;
25
- capabilities?: AgentCapabilities;
26
14
  permission?: AgentPermission;
27
15
  prompt: string;
28
16
  }
@@ -20,27 +20,6 @@ function parseAgentFile(filePath) {
20
20
  const name = String(parsed.name ?? "");
21
21
  if (!name)
22
22
  return null;
23
- const toolsRaw = parsed.tools;
24
- const tools = toolsRaw && typeof toolsRaw === "object" && !Array.isArray(toolsRaw)
25
- ? {
26
- read: Boolean(toolsRaw.read),
27
- bash: Boolean(toolsRaw.bash),
28
- write: Boolean(toolsRaw.write),
29
- edit: Boolean(toolsRaw.edit),
30
- }
31
- : undefined;
32
- const capabilitiesRaw = parsed.capabilities;
33
- const capabilities = capabilitiesRaw && typeof capabilitiesRaw === "object" && !Array.isArray(capabilitiesRaw)
34
- ? {
35
- create_pr: Boolean(capabilitiesRaw.create_pr),
36
- merge_pr: Boolean(capabilitiesRaw.merge_pr),
37
- modify_files: Boolean(capabilitiesRaw.modify_files),
38
- run_tests: Boolean(capabilitiesRaw.run_tests),
39
- push_branch: Boolean(capabilitiesRaw.push_branch),
40
- approve_review: Boolean(capabilitiesRaw.approve_review),
41
- complete_goal: Boolean(capabilitiesRaw.complete_goal),
42
- }
43
- : undefined;
44
23
  const permissionRaw = parsed.permission;
45
24
  const permission = permissionRaw && typeof permissionRaw === "object" && !Array.isArray(permissionRaw)
46
25
  ? Object.fromEntries(Object.entries(permissionRaw)
@@ -64,8 +43,6 @@ function parseAgentFile(filePath) {
64
43
  description: parsed.description,
65
44
  mode: parsed.mode,
66
45
  color: parsed.color,
67
- tools,
68
- capabilities,
69
46
  permission,
70
47
  prompt: body,
71
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/plugin/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/plugin/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
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;