@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.
- package/README.md +34 -19
- package/README.zh.md +34 -19
- package/assets/agents/dev-lifecycle.md +60 -49
- package/assets/agents/team/architect.md +8 -1
- package/assets/agents/team/developer.md +89 -0
- package/assets/agents/team/goal-verify.md +5 -1
- package/assets/agents/team/reviewer.md +6 -0
- package/assets/commands/code.md +3 -2
- package/assets/commands/design.md +3 -2
- package/assets/commands/release.md +3 -2
- package/assets/commands/requirements.md +3 -2
- package/assets/commands/review.md +3 -2
- package/assets/commands/setup.md +3 -2
- package/assets/commands/tasks.md +2 -1
- package/assets/prompts/bootstrap.md +9 -8
- package/assets/prompts/stage-contract.md +55 -0
- package/assets/skills/flow-code/SKILL.md +38 -140
- package/assets/skills/flow-design/SKILL.md +28 -79
- package/assets/skills/flow-release/SKILL.md +31 -51
- package/assets/skills/flow-requirements/SKILL.md +31 -196
- package/assets/skills/flow-review/SKILL.md +26 -123
- package/assets/skills/flow-setup/SKILL.md +40 -43
- package/assets/skills/flow-tasks/SKILL.md +23 -153
- package/assets/skills/flow-tdd/SKILL.md +30 -31
- package/dist/kernel/caller.d.ts +48 -0
- package/dist/kernel/caller.js +88 -0
- package/dist/kernel/caller.js.map +1 -0
- package/dist/kernel/context.d.ts +27 -0
- package/dist/kernel/context.js +84 -0
- package/dist/kernel/context.js.map +1 -0
- package/dist/kernel/flow.d.ts +175 -0
- package/dist/kernel/flow.js +467 -0
- package/dist/kernel/flow.js.map +1 -0
- package/dist/kernel/legacy.d.ts +19 -0
- package/dist/kernel/legacy.js +34 -0
- package/dist/kernel/legacy.js.map +1 -0
- package/dist/kernel/mutex.d.ts +8 -0
- package/dist/kernel/mutex.js +23 -0
- package/dist/kernel/mutex.js.map +1 -0
- package/dist/kernel/permission.d.ts +21 -0
- package/dist/kernel/permission.js +45 -0
- package/dist/kernel/permission.js.map +1 -0
- package/dist/kernel/profile.d.ts +35 -0
- package/dist/kernel/profile.js +147 -0
- package/dist/kernel/profile.js.map +1 -0
- package/dist/kernel/records.d.ts +103 -0
- package/dist/kernel/records.js +240 -0
- package/dist/kernel/records.js.map +1 -0
- package/dist/kernel/release.d.ts +106 -0
- package/dist/kernel/release.js +241 -0
- package/dist/kernel/release.js.map +1 -0
- package/dist/kernel/review.d.ts +34 -0
- package/dist/kernel/review.js +82 -0
- package/dist/kernel/review.js.map +1 -0
- package/dist/kernel/session-index.d.ts +45 -0
- package/dist/kernel/session-index.js +136 -0
- package/dist/kernel/session-index.js.map +1 -0
- package/dist/kernel/setup.d.ts +95 -0
- package/dist/kernel/setup.js +401 -0
- package/dist/kernel/setup.js.map +1 -0
- package/dist/kernel/slug.d.ts +23 -0
- package/dist/kernel/slug.js +67 -0
- package/dist/kernel/slug.js.map +1 -0
- package/dist/kernel/task.d.ts +213 -0
- package/dist/kernel/task.js +873 -0
- package/dist/kernel/task.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
- package/dist/{flowrun → kernel/tdd}/adapter.js +27 -26
- package/dist/kernel/tdd/adapter.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/digest.d.ts +2 -1
- package/dist/{flowrun → kernel/tdd}/digest.js +6 -4
- package/dist/kernel/tdd/digest.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
- package/dist/{flowrun → kernel/tdd}/evaluator.js +1 -1
- package/dist/kernel/tdd/evaluator.js.map +1 -0
- package/dist/kernel/tdd/evidence.d.ts +42 -0
- package/dist/kernel/tdd/evidence.js +48 -0
- package/dist/kernel/tdd/evidence.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/state.d.ts +2 -2
- package/dist/{flowrun → kernel/tdd}/state.js +1 -1
- package/dist/kernel/tdd/state.js.map +1 -0
- package/dist/kernel/types.d.ts +180 -0
- package/dist/kernel/types.js +2 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/worktree.d.ts +45 -0
- package/dist/kernel/worktree.js +156 -0
- package/dist/kernel/worktree.js.map +1 -0
- package/dist/plugin/agents.d.ts +5 -17
- package/dist/plugin/agents.js +0 -23
- package/dist/plugin/agents.js.map +1 -1
- package/dist/plugin/flow-control.d.ts +91 -0
- package/dist/plugin/flow-control.js +287 -0
- package/dist/plugin/flow-control.js.map +1 -0
- package/dist/plugin/goal.d.ts +17 -46
- package/dist/plugin/goal.js +47 -117
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +78 -6
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/release-control.d.ts +39 -0
- package/dist/plugin/release-control.js +343 -0
- package/dist/plugin/release-control.js.map +1 -0
- package/dist/plugin/server.d.ts +19 -0
- package/dist/plugin/server.js +198 -320
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/setup-control.d.ts +59 -0
- package/dist/plugin/setup-control.js +111 -0
- package/dist/plugin/setup-control.js.map +1 -0
- package/dist/plugin/shell.d.ts +7 -34
- package/dist/plugin/shell.js +12 -137
- package/dist/plugin/shell.js.map +1 -1
- package/dist/plugin/skills.d.ts +1 -1
- package/dist/plugin/skills.js +1 -7
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin/task-control.d.ts +90 -0
- package/dist/plugin/task-control.js +208 -0
- package/dist/plugin/task-control.js.map +1 -0
- package/dist/plugin/tdd-checkpoint.d.ts +128 -0
- package/dist/plugin/tdd-checkpoint.js +664 -0
- package/dist/plugin/tdd-checkpoint.js.map +1 -0
- package/dist/util/gh.d.ts +5 -0
- package/dist/util/gh.js +12 -0
- package/dist/util/gh.js.map +1 -1
- package/dist/util/paths.d.ts +6 -2
- package/dist/util/paths.js +15 -7
- package/dist/util/paths.js.map +1 -1
- package/package.json +4 -4
- package/assets/agents/team/backend.md +0 -100
- package/assets/agents/team/frontend.md +0 -98
- package/assets/commands/handoff.md +0 -4
- package/assets/commands/test.md +0 -4
- package/assets/context/CONTEXT.md +0 -41
- package/assets/skills/flow-handoff/SKILL.md +0 -76
- package/assets/skills/flow-test/SKILL.md +0 -75
- package/dist/flowrun/adapter.js.map +0 -1
- package/dist/flowrun/audit.d.ts +0 -5
- package/dist/flowrun/audit.js +0 -67
- package/dist/flowrun/audit.js.map +0 -1
- package/dist/flowrun/ci.d.ts +0 -64
- package/dist/flowrun/ci.js +0 -184
- package/dist/flowrun/ci.js.map +0 -1
- package/dist/flowrun/coverage.d.ts +0 -70
- package/dist/flowrun/coverage.js +0 -207
- package/dist/flowrun/coverage.js.map +0 -1
- package/dist/flowrun/digest.js.map +0 -1
- package/dist/flowrun/evaluator.js.map +0 -1
- package/dist/flowrun/gate.d.ts +0 -28
- package/dist/flowrun/gate.js +0 -139
- package/dist/flowrun/gate.js.map +0 -1
- package/dist/flowrun/github.d.ts +0 -24
- package/dist/flowrun/github.js +0 -154
- package/dist/flowrun/github.js.map +0 -1
- package/dist/flowrun/index.d.ts +0 -14
- package/dist/flowrun/index.js +0 -15
- package/dist/flowrun/index.js.map +0 -1
- package/dist/flowrun/merge.d.ts +0 -57
- package/dist/flowrun/merge.js +0 -180
- package/dist/flowrun/merge.js.map +0 -1
- package/dist/flowrun/migration.d.ts +0 -11
- package/dist/flowrun/migration.js +0 -276
- package/dist/flowrun/migration.js.map +0 -1
- package/dist/flowrun/resilience.d.ts +0 -18
- package/dist/flowrun/resilience.js +0 -80
- package/dist/flowrun/resilience.js.map +0 -1
- package/dist/flowrun/state.js.map +0 -1
- package/dist/flowrun/transitions.d.ts +0 -66
- package/dist/flowrun/transitions.js +0 -168
- package/dist/flowrun/transitions.js.map +0 -1
- package/dist/flowrun/types.d.ts +0 -356
- package/dist/flowrun/types.js +0 -21
- package/dist/flowrun/types.js.map +0 -1
- package/dist/flowrun/validator.d.ts +0 -19
- package/dist/flowrun/validator.js +0 -209
- package/dist/flowrun/validator.js.map +0 -1
- package/dist/plugin/broker.d.ts +0 -73
- package/dist/plugin/broker.js +0 -140
- package/dist/plugin/broker.js.map +0 -1
- package/dist/plugin/tdd-tool.d.ts +0 -62
- package/dist/plugin/tdd-tool.js +0 -336
- package/dist/plugin/tdd-tool.js.map +0 -1
|
@@ -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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"}
|
package/dist/plugin/agents.d.ts
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
}
|
package/dist/plugin/agents.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;
|
|
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;
|