@devcxl/opencode-cabbage 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex-plugin/plugin.json +36 -0
- package/README.md +34 -0
- package/README.zh.md +6 -0
- package/codex-skills/agent-architect/SKILL.md +79 -0
- package/codex-skills/agent-dev-lifecycle/SKILL.md +309 -0
- package/codex-skills/agent-developer/SKILL.md +51 -0
- package/codex-skills/agent-goal-verify/SKILL.md +45 -0
- package/codex-skills/agent-researcher/SKILL.md +32 -0
- package/codex-skills/agent-reviewer/SKILL.md +109 -0
- package/codex-skills/flow-code/SKILL.md +71 -0
- package/codex-skills/flow-design/SKILL.md +146 -0
- package/codex-skills/flow-release/SKILL.md +90 -0
- package/codex-skills/flow-requirements/SKILL.md +90 -0
- package/codex-skills/flow-research/SKILL.md +77 -0
- package/codex-skills/flow-review/SKILL.md +110 -0
- package/codex-skills/flow-setup/SKILL.md +75 -0
- package/codex-skills/flow-tasks/SKILL.md +220 -0
- package/codex-skills/flow-tdd/SKILL.md +235 -0
- package/dist/hooks/session-start.d.ts +1 -0
- package/dist/hooks/session-start.js +72 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/plugin/goal-store.d.ts +71 -0
- package/dist/plugin/goal-store.js +54 -0
- package/dist/plugin/goal-store.js.map +1 -0
- package/dist/plugin/goal.d.ts +4 -11
- package/dist/plugin/goal.js +16 -50
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/server.d.ts +3 -2
- package/dist/plugin/server.js +19 -18
- package/dist/plugin/server.js.map +1 -1
- package/hooks/hooks.json +17 -0
- package/package.json +11 -3
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cabbage Session Start Hook — loads plugin overview and project context.
|
|
3
|
+
* Runs on Codex SessionStart lifecycle event (matcher: startup|resume).
|
|
4
|
+
* Compiled to dist/hooks/session-start.js by tsc.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
// PLUGIN_ROOT is set by Codex hooks runtime
|
|
9
|
+
const PROJECT_DIR = process.cwd();
|
|
10
|
+
const MAX_OUTPUT_LENGTH = 12000;
|
|
11
|
+
function getHeader() {
|
|
12
|
+
return `## Cabbage Development Plugin
|
|
13
|
+
|
|
14
|
+
This plugin provides a full development lifecycle orchestration system.
|
|
15
|
+
Load skills by name: @agent-dev-lifecycle, @agent-architect, @agent-developer, @agent-reviewer, @agent-goal-verify, @agent-researcher
|
|
16
|
+
|
|
17
|
+
### Available Flow Skills
|
|
18
|
+
- \`@flow-setup\` — 初始化项目开发环境
|
|
19
|
+
- \`@flow-requirements\` — 需求分析产出 PRD
|
|
20
|
+
- \`@flow-design\` — 技术方案与 ADR
|
|
21
|
+
- \`@flow-tasks\` — DAG 任务拆解
|
|
22
|
+
- \`@flow-research\` — 调研/事实核查
|
|
23
|
+
- \`@flow-code\` — 编码实现(TDD)
|
|
24
|
+
- \`@flow-tdd\` — TDD 协议参考
|
|
25
|
+
- \`@flow-review\` — 代码审查
|
|
26
|
+
- \`@flow-release\` — 发布流程
|
|
27
|
+
|
|
28
|
+
### Available Agent Skills
|
|
29
|
+
- \`@agent-dev-lifecycle\` — 全流程编排器(主 agent,场景分诊)
|
|
30
|
+
- \`@agent-architect\` — 架构设计
|
|
31
|
+
- \`@agent-developer\` — 编码实现
|
|
32
|
+
- \`@agent-reviewer\` — 代码审查
|
|
33
|
+
- \`@agent-goal-verify\` — 目标验证
|
|
34
|
+
- \`@agent-researcher\` — 独立调研
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
function readProjectProfile() {
|
|
38
|
+
// Try root AGENTS.md from project directory
|
|
39
|
+
const agentsMd = join(PROJECT_DIR, "AGENTS.md");
|
|
40
|
+
if (!existsSync(agentsMd))
|
|
41
|
+
return "";
|
|
42
|
+
let content;
|
|
43
|
+
try {
|
|
44
|
+
content = readFileSync(agentsMd, "utf8");
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
// Match only the exact "## Project Profile" heading line (not "## Project Profile Notes"),
|
|
50
|
+
// and stop at the next "## " heading or end of file.
|
|
51
|
+
const lines = content.split("\n");
|
|
52
|
+
const start = lines.findIndex((line) => line.trim() === "## Project Profile");
|
|
53
|
+
if (start === -1)
|
|
54
|
+
return "";
|
|
55
|
+
const end = lines.findIndex((line, i) => i > start && /^##\s/.test(line.trim()));
|
|
56
|
+
const slice = end === -1 ? lines.slice(start) : lines.slice(start, end);
|
|
57
|
+
return slice.join("\n").trim();
|
|
58
|
+
}
|
|
59
|
+
function main() {
|
|
60
|
+
const header = getHeader();
|
|
61
|
+
const profile = readProjectProfile();
|
|
62
|
+
const parts = [header];
|
|
63
|
+
if (profile)
|
|
64
|
+
parts.push(`## Project Context\n\n${profile}`);
|
|
65
|
+
let output = parts.join("\n\n");
|
|
66
|
+
if (output.length > MAX_OUTPUT_LENGTH) {
|
|
67
|
+
output = `${output.slice(0, MAX_OUTPUT_LENGTH)}\n\n[context truncated — output exceeds ${MAX_OUTPUT_LENGTH} chars]`;
|
|
68
|
+
}
|
|
69
|
+
console.log(output);
|
|
70
|
+
}
|
|
71
|
+
main();
|
|
72
|
+
//# sourceMappingURL=session-start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,4CAA4C;AAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AACjC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AAE/B,SAAS,SAAS;IAChB,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuBR,CAAA;AACD,CAAC;AAED,SAAS,kBAAkB;IACzB,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEpC,IAAI,OAAe,CAAA;IACnB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,2FAA2F;IAC3F,qDAAqD;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,oBAAoB,CAAC,CAAA;IAC7E,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAE3B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,IAAI;IACX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAA;IAEpC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAA;IACtB,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAA;IAE3D,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,2CAA2C,iBAAiB,SAAS,CAAA;IACrH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { GoalData } from "./goal.js";
|
|
2
|
+
/**
|
|
3
|
+
* goal 存储抽象(V2 迁移解耦准备)。
|
|
4
|
+
*
|
|
5
|
+
* V1 实现 = session.metadata.goal(createMetadataGoalStore)。
|
|
6
|
+
* V2 候选 = ctx.storage / 本地文件——切换时只替换实现,不改调用方。
|
|
7
|
+
* 见 docs/dev/research/2026-08-31-opencode-v2-compat-spike.md §6.3.1。
|
|
8
|
+
*/
|
|
9
|
+
/** goal 宿主会话的最小面:goal 工具判定子会话(parentID)与元数据保留(write 全量替换)所需 */
|
|
10
|
+
export interface GoalSession {
|
|
11
|
+
parentID: string | null;
|
|
12
|
+
metadata: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
/** 宽松消息面:记账与尾部检查的最小形状(V1 实现直接透传 SDK messages data,不做映射) */
|
|
15
|
+
export interface GoalMessage {
|
|
16
|
+
info?: {
|
|
17
|
+
id?: string;
|
|
18
|
+
role?: string;
|
|
19
|
+
time?: {
|
|
20
|
+
completed?: number;
|
|
21
|
+
created?: number;
|
|
22
|
+
} | null;
|
|
23
|
+
tokens?: unknown;
|
|
24
|
+
error?: unknown;
|
|
25
|
+
} | null;
|
|
26
|
+
parts?: Array<{
|
|
27
|
+
type?: string;
|
|
28
|
+
text?: string;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/** goal 状态存储。read 的 fail-closed 语义(异常 → null)由实现保证,调用方依赖此兜底。 */
|
|
32
|
+
export interface GoalStore {
|
|
33
|
+
read(sessionID: string): Promise<{
|
|
34
|
+
goal: GoalData | null;
|
|
35
|
+
session: GoalSession | null;
|
|
36
|
+
}>;
|
|
37
|
+
/** 写 goal;null 表示删除。existingSession 复用 read 结果避免二次读取。 */
|
|
38
|
+
write(sessionID: string, goal: GoalData | null, existingSession?: GoalSession | null): Promise<void>;
|
|
39
|
+
/** 最近消息(记账基线 + 续接尾部检查用)。data 非数组时返回 null(与 SDK 语义一致)。 */
|
|
40
|
+
messages(sessionID: string, limit: number): Promise<GoalMessage[] | null>;
|
|
41
|
+
}
|
|
42
|
+
/** GoalStore V1 实现所需的最小 SDK 客户端面(createOpencodeClient 返回类型的子集) */
|
|
43
|
+
export interface GoalStoreClient {
|
|
44
|
+
session: {
|
|
45
|
+
get(args: {
|
|
46
|
+
sessionID: string;
|
|
47
|
+
}): Promise<{
|
|
48
|
+
data?: {
|
|
49
|
+
parentID?: string | null;
|
|
50
|
+
metadata?: Record<string, unknown>;
|
|
51
|
+
} | null;
|
|
52
|
+
}>;
|
|
53
|
+
update(args: {
|
|
54
|
+
sessionID: string;
|
|
55
|
+
metadata: Record<string, unknown>;
|
|
56
|
+
}): Promise<unknown>;
|
|
57
|
+
messages(args: {
|
|
58
|
+
sessionID: string;
|
|
59
|
+
limit?: number;
|
|
60
|
+
}): Promise<{
|
|
61
|
+
data?: GoalMessage[];
|
|
62
|
+
}>;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** V1 实现:goal 持久化在 session metadata 的 goal 键;messages 直接透传 SDK 消息面 */
|
|
66
|
+
export declare function createMetadataGoalStore(client: GoalStoreClient): GoalStore;
|
|
67
|
+
/**
|
|
68
|
+
* 从插件上下文构建 SDK client(V1 宿主机制)。
|
|
69
|
+
* V2 下 ctx 本身即 server client,本函数与 createMetadataGoalStore 一起被替换。
|
|
70
|
+
*/
|
|
71
|
+
export declare function createGoalClient(serverUrl: URL, v1Client: any): import("@opencode-ai/sdk/v2").OpencodeClient;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createOpencodeClient } from "@opencode-ai/sdk/v2";
|
|
2
|
+
/** V1 实现:goal 持久化在 session metadata 的 goal 键;messages 直接透传 SDK 消息面 */
|
|
3
|
+
export function createMetadataGoalStore(client) {
|
|
4
|
+
return {
|
|
5
|
+
async read(sessionID) {
|
|
6
|
+
try {
|
|
7
|
+
const result = await client.session.get({ sessionID });
|
|
8
|
+
const session = result?.data ?? null;
|
|
9
|
+
if (!session)
|
|
10
|
+
return { goal: null, session: null };
|
|
11
|
+
const goalSession = {
|
|
12
|
+
parentID: session.parentID ?? null,
|
|
13
|
+
metadata: session.metadata ?? {},
|
|
14
|
+
};
|
|
15
|
+
if (!goalSession.metadata.goal)
|
|
16
|
+
return { goal: null, session: goalSession };
|
|
17
|
+
return { goal: goalSession.metadata.goal, session: goalSession };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { goal: null, session: null };
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async write(sessionID, goal, existingSession) {
|
|
24
|
+
const session = existingSession ?? (await this.read(sessionID)).session;
|
|
25
|
+
if (!session)
|
|
26
|
+
throw new Error("Failed to get session");
|
|
27
|
+
const existing = session.metadata ?? {};
|
|
28
|
+
const metadata = goal === null
|
|
29
|
+
? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
|
|
30
|
+
: { ...existing, goal };
|
|
31
|
+
await client.session.update({ sessionID, metadata });
|
|
32
|
+
},
|
|
33
|
+
async messages(sessionID, limit) {
|
|
34
|
+
const result = await client.session.messages({ sessionID, limit });
|
|
35
|
+
return Array.isArray(result?.data) ? result.data : null;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从插件上下文构建 SDK client(V1 宿主机制)。
|
|
41
|
+
* V2 下 ctx 本身即 server client,本函数与 createMetadataGoalStore 一起被替换。
|
|
42
|
+
*/
|
|
43
|
+
export function createGoalClient(serverUrl, v1Client) {
|
|
44
|
+
const v1Config = v1Client?.getConfig?.() ?? {};
|
|
45
|
+
return createOpencodeClient({
|
|
46
|
+
baseUrl: serverUrl.origin,
|
|
47
|
+
headers: v1Config.headers,
|
|
48
|
+
fetch: v1Config.fetch,
|
|
49
|
+
// SDK v2 默认 ThrowOnError=false(4xx/5xx 静默 resolve 为 {error}),
|
|
50
|
+
// 必须显式开启,否则 readGoal/writeGoal 的 try/catch 与错误传播全部失效
|
|
51
|
+
throwOnError: true,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=goal-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-store.js","sourceRoot":"","sources":["../../src/plugin/goal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AA+C1D,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC7D,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;gBACtD,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAA;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;gBAClD,MAAM,WAAW,GAAgB;oBAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;oBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;iBACjC,CAAA;gBACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;gBAC3E,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;YACtC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe;YAC1C,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;YACvE,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;YAEtD,MAAM,QAAQ,GAA4B,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI;gBAC5B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBAC5E,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;YAEzB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtD,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK;YAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;YAClE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAc,EAAE,QAAa;IAC5D,MAAM,QAAQ,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAA;IAC9C,OAAO,oBAAoB,CAAC;QAC1B,OAAO,EAAE,SAAS,CAAC,MAAM;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,8DAA8D;QAC9D,qDAAqD;QACrD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/plugin/goal.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ToolContext, ToolResult } from "@opencode-ai/plugin";
|
|
2
|
-
import {
|
|
3
|
-
import type { Session } from "@opencode-ai/sdk/v2";
|
|
2
|
+
import type { GoalSession, GoalStore } from "./goal-store.js";
|
|
4
3
|
export type GoalStatus = "active" | "paused" | "complete";
|
|
5
4
|
/** 用户最后使用的会话配置快照:续接注入时显式传回,防止 idle 后回落/切换默认 agent 与模型 */
|
|
6
5
|
export interface GoalSessionProfile {
|
|
@@ -53,22 +52,16 @@ export declare function isBlockedReport(text: string): boolean;
|
|
|
53
52
|
export declare const DONE_REPORT_RE: RegExp;
|
|
54
53
|
export declare function isDoneReport(text: string): boolean;
|
|
55
54
|
export declare function continuationPrompt(parentIssueNumber: number): string;
|
|
56
|
-
export declare function createGoalClient(serverUrl: URL, v1Client: any): import("@opencode-ai/sdk/v2").OpencodeClient;
|
|
57
|
-
export declare function readGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string): Promise<{
|
|
58
|
-
goal: GoalData | null;
|
|
59
|
-
session: Session | null;
|
|
60
|
-
}>;
|
|
61
|
-
export declare function writeGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string, goal: GoalData | null, existingSession?: Session | null): Promise<void>;
|
|
62
55
|
/**
|
|
63
56
|
* 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
|
|
64
|
-
* fn 接收当前 goal
|
|
57
|
+
* fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
|
|
65
58
|
* 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
|
|
66
59
|
*/
|
|
67
|
-
export declare function mutateGoal<T>(
|
|
60
|
+
export declare function mutateGoal<T>(store: GoalStore, sessionID: string, fn: (goal: GoalData | null, session: GoalSession | null) => Promise<{
|
|
68
61
|
goal: GoalData | null;
|
|
69
62
|
value: T;
|
|
70
63
|
}>): Promise<T>;
|
|
71
|
-
export declare function createGoalTool(
|
|
64
|
+
export declare function createGoalTool(store: GoalStore, projectDirFallback?: string): {
|
|
72
65
|
description: string;
|
|
73
66
|
args: {
|
|
74
67
|
op: import("zod").ZodEnum<{
|
package/dist/plugin/goal.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
2
|
-
import { createOpencodeClient } from "@opencode-ai/sdk/v2";
|
|
3
2
|
import { bindSession, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
|
|
4
3
|
import { KeyedMutex } from "../kernel/mutex.js";
|
|
5
4
|
import { resolveProjectDir } from "../util/paths.js";
|
|
@@ -98,55 +97,22 @@ marker [DONE: short summary of what was verified]. Do not use the marker unless
|
|
|
98
97
|
you actually ran the verification and it passed — the goal will pause for an
|
|
99
98
|
independent goal-verify pass.`;
|
|
100
99
|
}
|
|
101
|
-
export function createGoalClient(serverUrl, v1Client) {
|
|
102
|
-
const v1Config = v1Client?.getConfig?.() ?? {};
|
|
103
|
-
return createOpencodeClient({
|
|
104
|
-
baseUrl: serverUrl.origin,
|
|
105
|
-
headers: v1Config.headers,
|
|
106
|
-
fetch: v1Config.fetch,
|
|
107
|
-
// SDK v2 默认 ThrowOnError=false(4xx/5xx 静默 resolve 为 {error}),
|
|
108
|
-
// 必须显式开启,否则 readGoal/writeGoal 的 try/catch 与错误传播全部失效
|
|
109
|
-
throwOnError: true,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
export async function readGoal(client, sessionID) {
|
|
113
|
-
try {
|
|
114
|
-
const result = await client.session.get({ sessionID });
|
|
115
|
-
const session = result?.data ?? null;
|
|
116
|
-
if (!session?.metadata?.goal)
|
|
117
|
-
return { goal: null, session };
|
|
118
|
-
return { goal: session.metadata.goal, session };
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
return { goal: null, session: null };
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
export async function writeGoal(client, sessionID, goal, existingSession) {
|
|
125
|
-
const session = existingSession ?? (await readGoal(client, sessionID)).session;
|
|
126
|
-
if (!session)
|
|
127
|
-
throw new Error("Failed to get session");
|
|
128
|
-
const existing = session.metadata ?? {};
|
|
129
|
-
const metadata = goal === null
|
|
130
|
-
? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
|
|
131
|
-
: { ...existing, goal };
|
|
132
|
-
await client.session.update({ sessionID, metadata });
|
|
133
|
-
}
|
|
134
100
|
/**
|
|
135
101
|
* 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
|
|
136
|
-
* fn 接收当前 goal
|
|
102
|
+
* fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
|
|
137
103
|
* 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
|
|
138
104
|
*/
|
|
139
|
-
export async function mutateGoal(
|
|
105
|
+
export async function mutateGoal(store, sessionID, fn) {
|
|
140
106
|
return goalMutex.runExclusive(sessionID, async () => {
|
|
141
|
-
const current = await
|
|
107
|
+
const current = await store.read(sessionID);
|
|
142
108
|
const { goal: next, value } = await fn(current.goal, current.session);
|
|
143
109
|
if (next !== null || current.goal !== null) {
|
|
144
|
-
await
|
|
110
|
+
await store.write(sessionID, next, current.session);
|
|
145
111
|
}
|
|
146
112
|
return value;
|
|
147
113
|
});
|
|
148
114
|
}
|
|
149
|
-
export function createGoalTool(
|
|
115
|
+
export function createGoalTool(store, projectDirFallback) {
|
|
150
116
|
/** 会话级项目目录:优先 ToolContext.directory,退化到插件级 projectDir(异常会话下避免写入根目录) */
|
|
151
117
|
const sessionProjectDir = (ctxDirectory) => resolveProjectDir(ctxDirectory, projectDirFallback ?? "");
|
|
152
118
|
return tool({
|
|
@@ -167,7 +133,7 @@ Use a single op field:
|
|
|
167
133
|
async execute(args, ctx) {
|
|
168
134
|
const sessionID = ctx.sessionID;
|
|
169
135
|
// 只读判断:当前会话是否为子 agent、目标会话(父会话)ID
|
|
170
|
-
const { session } = await
|
|
136
|
+
const { session } = await store.read(sessionID);
|
|
171
137
|
const isSubAgent = !!session?.parentID;
|
|
172
138
|
const targetSessionID = session?.parentID ?? sessionID;
|
|
173
139
|
if (isSubAgent && ["create", "pause", "resume", "cancel", "edit"].includes(args.op)) {
|
|
@@ -178,7 +144,7 @@ Use a single op field:
|
|
|
178
144
|
if (agentName !== "goal-verify") {
|
|
179
145
|
return `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.`;
|
|
180
146
|
}
|
|
181
|
-
return mutateGoal(
|
|
147
|
+
return mutateGoal(store, targetSessionID, async (goal) => {
|
|
182
148
|
if (!goal)
|
|
183
149
|
return { goal, value: "No goal to complete in the parent session." };
|
|
184
150
|
if (goal.status !== "active") {
|
|
@@ -197,7 +163,7 @@ Use a single op field:
|
|
|
197
163
|
}
|
|
198
164
|
switch (args.op) {
|
|
199
165
|
case "create":
|
|
200
|
-
return mutateGoal(
|
|
166
|
+
return mutateGoal(store, sessionID, async (goal) => {
|
|
201
167
|
if (goal?.status === "active") {
|
|
202
168
|
// 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
|
|
203
169
|
// 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
|
|
@@ -215,9 +181,9 @@ Use a single op field:
|
|
|
215
181
|
// 记账基线:create 时点的最新完成 assistant 轮快照(快照法排除 goal 前历史消耗)。
|
|
216
182
|
// 拉取失败/无历史 → baseline 0(护栏方向保守:把可见历史计入)。
|
|
217
183
|
try {
|
|
218
|
-
const
|
|
184
|
+
const messages = await store.messages(sessionID, 40);
|
|
219
185
|
let baseline = 0;
|
|
220
|
-
for (const message of
|
|
186
|
+
for (const message of messages ?? []) {
|
|
221
187
|
const info = message?.info;
|
|
222
188
|
if (info?.role !== "assistant")
|
|
223
189
|
continue;
|
|
@@ -240,11 +206,11 @@ Use a single op field:
|
|
|
240
206
|
return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
|
|
241
207
|
});
|
|
242
208
|
case "get": {
|
|
243
|
-
const { goal } = await
|
|
209
|
+
const { goal } = await store.read(targetSessionID);
|
|
244
210
|
return goal ? formatGoal(goal) : "No active goal.";
|
|
245
211
|
}
|
|
246
212
|
case "complete": {
|
|
247
|
-
const { goal } = await
|
|
213
|
+
const { goal } = await store.read(sessionID);
|
|
248
214
|
if (!goal)
|
|
249
215
|
return "No active goal.";
|
|
250
216
|
if (goal.status !== "active")
|
|
@@ -252,7 +218,7 @@ Use a single op field:
|
|
|
252
218
|
return `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.`;
|
|
253
219
|
}
|
|
254
220
|
case "resume":
|
|
255
|
-
return mutateGoal(
|
|
221
|
+
return mutateGoal(store, sessionID, async (goal) => {
|
|
256
222
|
if (!goal)
|
|
257
223
|
return { goal, value: "No goal to resume." };
|
|
258
224
|
if (!canTransitionTo(goal, "active"))
|
|
@@ -264,7 +230,7 @@ Use a single op field:
|
|
|
264
230
|
return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
|
|
265
231
|
});
|
|
266
232
|
case "pause":
|
|
267
|
-
return mutateGoal(
|
|
233
|
+
return mutateGoal(store, sessionID, async (goal) => {
|
|
268
234
|
if (!goal)
|
|
269
235
|
return { goal, value: "No goal to pause." };
|
|
270
236
|
if (!canTransitionTo(goal, "paused"))
|
|
@@ -273,7 +239,7 @@ Use a single op field:
|
|
|
273
239
|
return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
|
|
274
240
|
});
|
|
275
241
|
case "cancel":
|
|
276
|
-
return mutateGoal(
|
|
242
|
+
return mutateGoal(store, sessionID, async (goal) => {
|
|
277
243
|
if (!goal)
|
|
278
244
|
return { goal, value: "No goal to cancel." };
|
|
279
245
|
// 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
|
|
@@ -286,7 +252,7 @@ Use a single op field:
|
|
|
286
252
|
return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
|
|
287
253
|
});
|
|
288
254
|
case "edit":
|
|
289
|
-
return mutateGoal(
|
|
255
|
+
return mutateGoal(store, sessionID, async (goal) => {
|
|
290
256
|
if (!goal)
|
|
291
257
|
return { goal, value: "No goal to edit." };
|
|
292
258
|
if (goal.status === "complete") {
|
package/dist/plugin/goal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin/server.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
import { type GoalStore } from "./goal-store.js";
|
|
2
3
|
import type { ContextBlock } from "../kernel/context.js";
|
|
3
4
|
export interface FirstUserInjectionInput {
|
|
4
5
|
hasGoal: boolean;
|
|
@@ -20,7 +21,7 @@ interface GoalToolConfig extends AgentToolConfig {
|
|
|
20
21
|
agent?: Record<string, unknown>;
|
|
21
22
|
}
|
|
22
23
|
export declare function configureGoalTools(config: GoalToolConfig): void;
|
|
23
|
-
export declare function queueContinuation(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, sessionID: string, projectDir?: string): Promise<void>;
|
|
24
|
-
export declare function autoResume(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, projectDir: string): Promise<void>;
|
|
24
|
+
export declare function queueContinuation(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, sessionID: string, projectDir?: string): Promise<void>;
|
|
25
|
+
export declare function autoResume(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, projectDir: string): Promise<void>;
|
|
25
26
|
export declare function createOpencodeCabbage(packageRoot: string): Plugin;
|
|
26
27
|
export {};
|
package/dist/plugin/server.js
CHANGED
|
@@ -6,7 +6,8 @@ import { loadCommands } from "./commands.js";
|
|
|
6
6
|
import { setupSkillsDir } from "./skills.js";
|
|
7
7
|
import { loadAgents } from "./agents.js";
|
|
8
8
|
import { createAgentShellEnv } from "./shell.js";
|
|
9
|
-
import {
|
|
9
|
+
import { createGoalTool, mutateGoal, MAX_CONTINUATIONS, continuationPrompt, formatGoal, isBlockedReport, isDoneReport, snapshotTokenTotal, budgetReached } from "./goal.js";
|
|
10
|
+
import { createGoalClient, createMetadataGoalStore } from "./goal-store.js";
|
|
10
11
|
import { readIndex, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
|
|
11
12
|
import { getContextBlock, formatContextBlock, CONTEXT_MARKER } from "../kernel/context.js";
|
|
12
13
|
import { readProjectProfile } from "../kernel/profile.js";
|
|
@@ -76,12 +77,12 @@ async function hasWorkingChildren(client, sessionID) {
|
|
|
76
77
|
return true;
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
|
-
export async function queueContinuation(client, sessionID, projectDir) {
|
|
80
|
+
export async function queueContinuation(client, store, sessionID, projectDir) {
|
|
80
81
|
if (continuationInFlight.has(sessionID))
|
|
81
82
|
return;
|
|
82
83
|
continuationInFlight.add(sessionID);
|
|
83
84
|
try {
|
|
84
|
-
const decision = await mutateGoal(
|
|
85
|
+
const decision = await mutateGoal(store, sessionID, async (goal) => {
|
|
85
86
|
// 读改写与 message.updated 同锁串行,杜绝续接计数/状态被并发覆盖
|
|
86
87
|
if (!goal || goal.status !== "active")
|
|
87
88
|
return { goal, value: null };
|
|
@@ -108,8 +109,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
|
|
|
108
109
|
// 尾部静默检查:idle 事件可能竞态了后续消息/未落盘的回复。
|
|
109
110
|
// 最后一条是 user 消息、或最后 assistant 未完成(无 completed 时间)→
|
|
110
111
|
// 会话正在或即将忙碌,等下一次 idle 事件重新触发;无 assistant 消息则无 provider/model 可续。
|
|
111
|
-
const
|
|
112
|
-
const messages = Array.isArray(messagesResult?.data) ? messagesResult.data : null;
|
|
112
|
+
const messages = await store.messages(sessionID, 40);
|
|
113
113
|
if (!messages)
|
|
114
114
|
return { goal, value: null };
|
|
115
115
|
const lastMessageInfo = messages.length > 0 ? messages[messages.length - 1]?.info : null;
|
|
@@ -202,7 +202,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
|
|
|
202
202
|
// abort 二次检查:idle 与 abort 事件并发时,避免对已 abort 的会话发出续接
|
|
203
203
|
if (abortedSessions.has(sessionID)) {
|
|
204
204
|
abortedSessions.delete(sessionID);
|
|
205
|
-
await mutateGoal(
|
|
205
|
+
await mutateGoal(store, sessionID, async (goal) => {
|
|
206
206
|
if (!goal)
|
|
207
207
|
return { goal, value: null };
|
|
208
208
|
goal.status = "paused";
|
|
@@ -237,7 +237,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
|
|
|
237
237
|
catch (err) {
|
|
238
238
|
// 发送失败 → 回滚计数(尽力;回滚失败只会少一次续接,方向安全)
|
|
239
239
|
console.error("[cabbage] continuation prompt failed, rolling back counter:", err);
|
|
240
|
-
await mutateGoal(
|
|
240
|
+
await mutateGoal(store, sessionID, async (goal) => {
|
|
241
241
|
if (!goal)
|
|
242
242
|
return { goal, value: null };
|
|
243
243
|
goal.continuationCount = Math.max(0, goal.continuationCount - 1);
|
|
@@ -254,7 +254,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
|
|
|
254
254
|
continuationInFlight.delete(sessionID);
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
|
-
export async function autoResume(client, projectDir) {
|
|
257
|
+
export async function autoResume(client, store, projectDir) {
|
|
258
258
|
const index = await readIndex(projectDir);
|
|
259
259
|
for (const [parentIssueNumber, entry] of Object.entries(index.flows)) {
|
|
260
260
|
if (entry.status !== "active")
|
|
@@ -267,7 +267,7 @@ export async function autoResume(client, projectDir) {
|
|
|
267
267
|
console.warn(`[cabbage] auto-resume: skip #${parentIssueNumber} (continued ${Math.round((Date.now() - entry.lastContinuedAt) / 1000)}s ago; next idle event re-arms)`);
|
|
268
268
|
continue;
|
|
269
269
|
}
|
|
270
|
-
const { goal } = await
|
|
270
|
+
const { goal } = await store.read(entry.sessionID);
|
|
271
271
|
// 索引一致性自愈:entry 指向的 goal 已是别的 Flow(edit 换 Flow 后旧 entry 残留/rebind 失败)→
|
|
272
272
|
// 删除陈旧 entry,防止每次重启对同一会话重复续接
|
|
273
273
|
if (goal && goal.parentIssueNumber !== Number(parentIssueNumber)) {
|
|
@@ -313,12 +313,13 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
313
313
|
const projectDir = ctx.worktree || ctx.directory;
|
|
314
314
|
const v1Client = ctx.client._client;
|
|
315
315
|
const goalClient = createGoalClient(ctx.serverUrl, v1Client);
|
|
316
|
-
const
|
|
316
|
+
const goalStore = createMetadataGoalStore(goalClient);
|
|
317
|
+
const goalTool = createGoalTool(goalStore, projectDir);
|
|
317
318
|
const agentsDir = path.join(packageRoot, "assets", "agents");
|
|
318
319
|
await initPrompts(packageRoot, projectDir);
|
|
319
320
|
await initBootstrap();
|
|
320
321
|
startPeriodicCleanup();
|
|
321
|
-
void autoResume(goalClient, projectDir).catch(err => {
|
|
322
|
+
void autoResume(goalClient, goalStore, projectDir).catch(err => {
|
|
322
323
|
console.error("[cabbage] auto-resume failed:", err);
|
|
323
324
|
});
|
|
324
325
|
return {
|
|
@@ -395,7 +396,7 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
395
396
|
if (firstUser.parts.some(p => p.type === "text" && (p.text.includes("EXTREMELY_IMPORTANT") || p.text.includes(CONTEXT_MARKER))))
|
|
396
397
|
return;
|
|
397
398
|
const sessionID = output.messages[0].info.sessionID;
|
|
398
|
-
const { goal, session } = await
|
|
399
|
+
const { goal, session } = await goalStore.read(sessionID);
|
|
399
400
|
const contextBlock = await getContextBlock(projectDir);
|
|
400
401
|
const injection = buildFirstUserInjection({
|
|
401
402
|
hasGoal: goal?.status === "active",
|
|
@@ -417,7 +418,7 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
417
418
|
// abort 立即持久化 pause:不依赖内存标记。
|
|
418
419
|
// 否则 30 分钟清理窗口内无 idle 事件、或插件重启时标记丢失,
|
|
419
420
|
// 用户主动中断的 goal 会被下次 idle/autoResume 自动续接(继续烧 token)。
|
|
420
|
-
void mutateGoal(
|
|
421
|
+
void mutateGoal(goalStore, sessionID, async (goal) => {
|
|
421
422
|
if (!goal || goal.status !== "active")
|
|
422
423
|
return { goal, value: undefined };
|
|
423
424
|
goal.status = "paused";
|
|
@@ -434,15 +435,15 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
434
435
|
const sessionID = evt.properties.sessionID;
|
|
435
436
|
if (sessionID) {
|
|
436
437
|
try {
|
|
437
|
-
const
|
|
438
|
-
if (
|
|
438
|
+
const { session } = await goalStore.read(sessionID);
|
|
439
|
+
if (session?.parentID)
|
|
439
440
|
return;
|
|
440
441
|
}
|
|
441
442
|
catch (err) {
|
|
442
443
|
console.error("[cabbage] session lookup failed:", err);
|
|
443
444
|
return;
|
|
444
445
|
}
|
|
445
|
-
await queueContinuation(goalClient, sessionID, projectDir).catch(err => {
|
|
446
|
+
await queueContinuation(goalClient, goalStore, sessionID, projectDir).catch(err => {
|
|
446
447
|
console.error("[cabbage] continuation failed:", err);
|
|
447
448
|
});
|
|
448
449
|
}
|
|
@@ -452,7 +453,7 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
452
453
|
if (sessionID && !continuationInFlight.has(sessionID)) {
|
|
453
454
|
abortedSessions.delete(sessionID);
|
|
454
455
|
const info = evt.properties.info;
|
|
455
|
-
await mutateGoal(
|
|
456
|
+
await mutateGoal(goalStore, sessionID, async (goal) => {
|
|
456
457
|
if (!goal)
|
|
457
458
|
return { goal, value: undefined };
|
|
458
459
|
goal.continuationCount = 0;
|
|
@@ -470,7 +471,7 @@ export function createOpencodeCabbage(packageRoot) {
|
|
|
470
471
|
if (evt.type === "session.updated") {
|
|
471
472
|
const sessionID = evt.properties?.sessionID;
|
|
472
473
|
if (sessionID) {
|
|
473
|
-
const { goal } = await
|
|
474
|
+
const { goal } = await goalStore.read(sessionID);
|
|
474
475
|
if (goal?.status === "complete") {
|
|
475
476
|
await updateFlowSession(projectDir, goal.parentIssueNumber, { status: "completed" });
|
|
476
477
|
}
|