@devcxl/opencode-cabbage 0.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 +88 -0
- package/assets/agents/dev-lifecycle.md +135 -0
- package/assets/agents/team/architect.md +36 -0
- package/assets/agents/team/backend.md +44 -0
- package/assets/agents/team/frontend.md +41 -0
- package/assets/agents/team/reviewer.md +56 -0
- package/assets/commands/code.md +4 -0
- package/assets/commands/design.md +4 -0
- package/assets/commands/handoff.md +4 -0
- package/assets/commands/release.md +4 -0
- package/assets/commands/requirements.md +4 -0
- package/assets/commands/review.md +4 -0
- package/assets/commands/setup.md +4 -0
- package/assets/commands/tasks.md +4 -0
- package/assets/commands/test.md +4 -0
- package/assets/context/CONTEXT.md +40 -0
- package/assets/prompts/ADR-FORMAT.md +45 -0
- package/assets/prompts/PRD-FORMAT.md +17 -0
- package/assets/prompts/bootstrap.md +19 -0
- package/assets/skills/flow-code/SKILL.md +93 -0
- package/assets/skills/flow-design/SKILL.md +70 -0
- package/assets/skills/flow-handoff/SKILL.md +47 -0
- package/assets/skills/flow-release/SKILL.md +50 -0
- package/assets/skills/flow-requirements/SKILL.md +48 -0
- package/assets/skills/flow-requirements/references/interview-guide.md +35 -0
- package/assets/skills/flow-review/SKILL.md +88 -0
- package/assets/skills/flow-review/references/smell-baseline.md +18 -0
- package/assets/skills/flow-setup/SKILL.md +43 -0
- package/assets/skills/flow-tasks/SKILL.md +104 -0
- package/assets/skills/flow-test/SKILL.md +44 -0
- package/assets/templates/gitignore +5 -0
- package/dist/flowrun/audit.d.ts +5 -0
- package/dist/flowrun/audit.js +67 -0
- package/dist/flowrun/audit.js.map +1 -0
- package/dist/flowrun/gate.d.ts +18 -0
- package/dist/flowrun/gate.js +130 -0
- package/dist/flowrun/gate.js.map +1 -0
- package/dist/flowrun/github.d.ts +20 -0
- package/dist/flowrun/github.js +134 -0
- package/dist/flowrun/github.js.map +1 -0
- package/dist/flowrun/index.d.ts +7 -0
- package/dist/flowrun/index.js +8 -0
- package/dist/flowrun/index.js.map +1 -0
- package/dist/flowrun/merge.d.ts +24 -0
- package/dist/flowrun/merge.js +116 -0
- package/dist/flowrun/merge.js.map +1 -0
- package/dist/flowrun/resilience.d.ts +18 -0
- package/dist/flowrun/resilience.js +80 -0
- package/dist/flowrun/resilience.js.map +1 -0
- package/dist/flowrun/types.d.ts +81 -0
- package/dist/flowrun/types.js +20 -0
- package/dist/flowrun/types.js.map +1 -0
- package/dist/flowrun/validator.d.ts +9 -0
- package/dist/flowrun/validator.js +97 -0
- package/dist/flowrun/validator.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/agents.d.ts +15 -0
- package/dist/plugin/agents.js +64 -0
- package/dist/plugin/agents.js.map +1 -0
- package/dist/plugin/bootstrap.d.ts +3 -0
- package/dist/plugin/bootstrap.js +17 -0
- package/dist/plugin/bootstrap.js.map +1 -0
- package/dist/plugin/commands.d.ts +16 -0
- package/dist/plugin/commands.js +62 -0
- package/dist/plugin/commands.js.map +1 -0
- package/dist/plugin/goal.d.ts +41 -0
- package/dist/plugin/goal.js +194 -0
- package/dist/plugin/goal.js.map +1 -0
- package/dist/plugin/prompts.d.ts +3 -0
- package/dist/plugin/prompts.js +26 -0
- package/dist/plugin/prompts.js.map +1 -0
- package/dist/plugin/server.d.ts +2 -0
- package/dist/plugin/server.js +269 -0
- package/dist/plugin/server.js.map +1 -0
- package/dist/plugin/skills.d.ts +1 -0
- package/dist/plugin/skills.js +39 -0
- package/dist/plugin/skills.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.js +9 -0
- package/dist/plugin.js.map +1 -0
- package/dist/util/fs.d.ts +1 -0
- package/dist/util/fs.js +11 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/gh.d.ts +4 -0
- package/dist/util/gh.js +7 -0
- package/dist/util/gh.js.map +1 -0
- package/dist/util/paths.d.ts +17 -0
- package/dist/util/paths.js +78 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/shell.d.ts +1 -0
- package/dist/util/shell.js +4 -0
- package/dist/util/shell.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin/tool";
|
|
2
|
+
import { createOpencodeClient } from "@opencode-ai/sdk/v2";
|
|
3
|
+
function createGoal(objective, completionCriterion) {
|
|
4
|
+
return {
|
|
5
|
+
objective: objective.trim(),
|
|
6
|
+
completionCriterion: completionCriterion.trim(),
|
|
7
|
+
status: "active",
|
|
8
|
+
continuationCount: 0,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function canTransitionTo(goal, target) {
|
|
12
|
+
switch (target) {
|
|
13
|
+
case "paused": return goal.status === "active";
|
|
14
|
+
case "active": return goal.status === "paused";
|
|
15
|
+
case "complete": return goal.status === "active";
|
|
16
|
+
default: return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function formatGoal(goal) {
|
|
20
|
+
return [
|
|
21
|
+
`Goal: ${goal.objective}`,
|
|
22
|
+
`Completion criterion: ${goal.completionCriterion}`,
|
|
23
|
+
`Status: ${goal.status}`,
|
|
24
|
+
].join("\n");
|
|
25
|
+
}
|
|
26
|
+
export const MAX_CONTINUATIONS = 50;
|
|
27
|
+
export function continuationPrompt(objective, completionCriterion) {
|
|
28
|
+
return `Continue working toward the active goal.
|
|
29
|
+
|
|
30
|
+
<objective>
|
|
31
|
+
${objective}
|
|
32
|
+
</objective>
|
|
33
|
+
|
|
34
|
+
<completion_criterion>
|
|
35
|
+
${completionCriterion}
|
|
36
|
+
</completion_criterion>
|
|
37
|
+
|
|
38
|
+
Keep the full objective intact. Do not redefine success around a smaller or easier task.
|
|
39
|
+
Work from evidence — inspect the current state before relying on anything.
|
|
40
|
+
If the work is not done, just keep working. Do not narrate that you are continuing — execute.`;
|
|
41
|
+
}
|
|
42
|
+
export function verifyAgentPrompt() {
|
|
43
|
+
return `You are an independent goal verification agent. Your ONLY job is to determine whether a goal has been fully achieved by inspecting the current state.
|
|
44
|
+
|
|
45
|
+
You start with a FRESH context — do not assume any prior work was done correctly.
|
|
46
|
+
|
|
47
|
+
First step: Call goal({op:"get"}) to retrieve the objective and completion criterion.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Verification Procedure
|
|
52
|
+
|
|
53
|
+
1. Call goal({op:"get"}) to retrieve the objective and completion criterion.
|
|
54
|
+
2. Break them into concrete, individual requirements.
|
|
55
|
+
3. For EACH requirement, gather evidence:
|
|
56
|
+
- Read full files — not just snippets
|
|
57
|
+
- Run tests, builds, lint
|
|
58
|
+
- Check imports, exports, types resolve correctly
|
|
59
|
+
4. Classify each finding: SATISFIED / NOT SATISFIED / UNCERTAIN
|
|
60
|
+
5. If ALL requirements are SATISFIED:
|
|
61
|
+
Call goal({op:"complete"})
|
|
62
|
+
6. If ANY requirement is NOT SATISFIED or UNCERTAIN:
|
|
63
|
+
Do NOT call goal({op:"complete"}). Return a detailed report.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
Do not create or modify any files. You are a read-only verifier.`;
|
|
68
|
+
}
|
|
69
|
+
export function createGoalClient(serverUrl, v1Client) {
|
|
70
|
+
const v1Config = v1Client?.getConfig?.() ?? {};
|
|
71
|
+
return createOpencodeClient({
|
|
72
|
+
baseUrl: serverUrl.origin,
|
|
73
|
+
headers: v1Config.headers,
|
|
74
|
+
fetch: v1Config.fetch,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export async function readGoal(client, sessionID) {
|
|
78
|
+
try {
|
|
79
|
+
const result = await client.session.get({ sessionID });
|
|
80
|
+
const session = result?.data ?? null;
|
|
81
|
+
if (!session?.metadata?.goal)
|
|
82
|
+
return { goal: null, session };
|
|
83
|
+
return { goal: session.metadata.goal, session };
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return { goal: null, session: null };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function writeGoal(client, sessionID, goal, existingSession) {
|
|
90
|
+
const session = existingSession ?? (await readGoal(client, sessionID)).session;
|
|
91
|
+
if (!session)
|
|
92
|
+
throw new Error("Failed to get session");
|
|
93
|
+
const existing = session.metadata ?? {};
|
|
94
|
+
const metadata = goal === null
|
|
95
|
+
? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
|
|
96
|
+
: { ...existing, goal };
|
|
97
|
+
await client.session.update({ sessionID, metadata });
|
|
98
|
+
}
|
|
99
|
+
export function createGoalTool(client) {
|
|
100
|
+
return tool({
|
|
101
|
+
description: `Manage the active goal-mode objective.
|
|
102
|
+
|
|
103
|
+
Use a single op field:
|
|
104
|
+
- create: starts a goal. Requires both objective and completion_criterion.
|
|
105
|
+
- get: returns the current goal.
|
|
106
|
+
- resume: re-activates a paused goal.
|
|
107
|
+
- cancel: discards the current goal.
|
|
108
|
+
- pause: pauses the active goal.
|
|
109
|
+
- complete: marks the goal as completed. Follow the returned instructions.`,
|
|
110
|
+
args: {
|
|
111
|
+
op: tool.schema.enum(["create", "get", "complete", "resume", "cancel", "pause"]).describe("Goal operation"),
|
|
112
|
+
objective: tool.schema.string().describe("Goal objective (required for create)"),
|
|
113
|
+
completion_criterion: tool.schema.string().describe("Concrete, checkable conditions (required for create)"),
|
|
114
|
+
},
|
|
115
|
+
async execute(args, ctx) {
|
|
116
|
+
const sessionID = ctx.sessionID;
|
|
117
|
+
const session = await readGoal(client, sessionID);
|
|
118
|
+
const isSubAgent = !!session.session?.parentID;
|
|
119
|
+
const targetSessionID = session.session?.parentID ?? sessionID;
|
|
120
|
+
if (isSubAgent && ["create", "pause", "resume", "cancel"].includes(args.op)) {
|
|
121
|
+
return `Error: sub-agents cannot call goal({op:"${args.op}"}). Goal lifecycle operations are restricted to the main session.`;
|
|
122
|
+
}
|
|
123
|
+
if (isSubAgent && args.op === "complete") {
|
|
124
|
+
const parent = await readGoal(client, targetSessionID);
|
|
125
|
+
if (!parent.goal)
|
|
126
|
+
return "No goal to complete in the parent session.";
|
|
127
|
+
if (parent.goal.status !== "active") {
|
|
128
|
+
return `Parent session goal is not active (status: ${parent.goal.status}).`;
|
|
129
|
+
}
|
|
130
|
+
parent.goal.status = "complete";
|
|
131
|
+
await writeGoal(client, targetSessionID, parent.goal, parent.session);
|
|
132
|
+
return `Goal completed and verified: "${parent.goal.objective}"`;
|
|
133
|
+
}
|
|
134
|
+
switch (args.op) {
|
|
135
|
+
case "create": {
|
|
136
|
+
if (!args.objective?.trim())
|
|
137
|
+
return "Error: objective is required";
|
|
138
|
+
if (!args.completion_criterion?.trim())
|
|
139
|
+
return "Error: completion_criterion is required";
|
|
140
|
+
const existing = (await readGoal(client, sessionID)).goal;
|
|
141
|
+
if (existing?.status === "active") {
|
|
142
|
+
return `Error: an active goal already exists: "${existing.objective}"`;
|
|
143
|
+
}
|
|
144
|
+
const goal = createGoal(args.objective, args.completion_criterion);
|
|
145
|
+
await writeGoal(client, sessionID, goal);
|
|
146
|
+
return `Goal created: "${goal.objective}"\nStatus: active`;
|
|
147
|
+
}
|
|
148
|
+
case "get": {
|
|
149
|
+
const { goal } = await readGoal(client, targetSessionID);
|
|
150
|
+
return goal ? formatGoal(goal) : "No active goal.";
|
|
151
|
+
}
|
|
152
|
+
case "complete": {
|
|
153
|
+
const { goal } = await readGoal(client, sessionID);
|
|
154
|
+
if (!goal)
|
|
155
|
+
return "No active goal.";
|
|
156
|
+
if (goal.status !== "active")
|
|
157
|
+
return `Goal is not active (status: ${goal.status}).`;
|
|
158
|
+
return `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.`;
|
|
159
|
+
}
|
|
160
|
+
case "resume": {
|
|
161
|
+
const { goal, session: s } = await readGoal(client, sessionID);
|
|
162
|
+
if (!goal)
|
|
163
|
+
return "No goal to resume.";
|
|
164
|
+
if (!canTransitionTo(goal, "active"))
|
|
165
|
+
return `Goal cannot be resumed (status: ${goal.status}).`;
|
|
166
|
+
goal.status = "active";
|
|
167
|
+
goal.continuationCount = 0;
|
|
168
|
+
await writeGoal(client, sessionID, goal, s);
|
|
169
|
+
return `Goal resumed: "${goal.objective}"\nStatus: active`;
|
|
170
|
+
}
|
|
171
|
+
case "pause": {
|
|
172
|
+
const { goal, session: s } = await readGoal(client, sessionID);
|
|
173
|
+
if (!goal)
|
|
174
|
+
return "No goal to pause.";
|
|
175
|
+
if (!canTransitionTo(goal, "paused"))
|
|
176
|
+
return `Goal cannot be paused (status: ${goal.status}).`;
|
|
177
|
+
goal.status = "paused";
|
|
178
|
+
await writeGoal(client, sessionID, goal, s);
|
|
179
|
+
return `Goal paused: "${goal.objective}"\nStatus: paused`;
|
|
180
|
+
}
|
|
181
|
+
case "cancel": {
|
|
182
|
+
const { goal, session: s } = await readGoal(client, sessionID);
|
|
183
|
+
if (!goal)
|
|
184
|
+
return "No goal to cancel.";
|
|
185
|
+
await writeGoal(client, sessionID, null, s);
|
|
186
|
+
return `Goal cancelled: "${goal.objective}"`;
|
|
187
|
+
}
|
|
188
|
+
default:
|
|
189
|
+
return `Error: unknown operation "${args.op}"`;
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=goal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathExists } from "../util/fs.js";
|
|
4
|
+
import { PLUGIN_ID } from "../util/paths.js";
|
|
5
|
+
let _packageRoot = "";
|
|
6
|
+
let _projectDir = "";
|
|
7
|
+
export function initPrompts(packageRoot, projectDir) {
|
|
8
|
+
_packageRoot = packageRoot;
|
|
9
|
+
_projectDir = projectDir;
|
|
10
|
+
}
|
|
11
|
+
export function resetPrompts() {
|
|
12
|
+
_packageRoot = "";
|
|
13
|
+
_projectDir = "";
|
|
14
|
+
}
|
|
15
|
+
export async function loadPrompt(name) {
|
|
16
|
+
const projectPath = path.join(_projectDir, ".opencode", PLUGIN_ID, "prompts", `${name}.md`);
|
|
17
|
+
if (await pathExists(projectPath)) {
|
|
18
|
+
return await readFile(projectPath, "utf8");
|
|
19
|
+
}
|
|
20
|
+
const builtinPath = path.join(_packageRoot, "assets", "prompts", `${name}.md`);
|
|
21
|
+
if (await pathExists(builtinPath)) {
|
|
22
|
+
return await readFile(builtinPath, "utf8");
|
|
23
|
+
}
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/plugin/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,IAAI,YAAY,GAAG,EAAE,CAAA;AACrB,IAAI,WAAW,GAAG,EAAE,CAAA;AAEpB,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAAkB;IACjE,YAAY,GAAG,WAAW,CAAA;IAC1B,WAAW,GAAG,UAAU,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,YAAY,GAAG,EAAE,CAAA;IACjB,WAAW,GAAG,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAA;IAC3F,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAA;IAC9E,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { initPrompts } from "./prompts.js";
|
|
5
|
+
import { initBootstrap, getBootstrapContent } from "./bootstrap.js";
|
|
6
|
+
import { loadCommands } from "./commands.js";
|
|
7
|
+
import { setupSkillsDir } from "./skills.js";
|
|
8
|
+
import { loadAgents } from "./agents.js";
|
|
9
|
+
import { createGoalClient, createGoalTool, readGoal, writeGoal, MAX_CONTINUATIONS, continuationPrompt, verifyAgentPrompt, formatGoal } from "./goal.js";
|
|
10
|
+
const abortedSessions = new Set();
|
|
11
|
+
const errorRetryCount = new Map();
|
|
12
|
+
const COMPACTION_THRESHOLD = 20;
|
|
13
|
+
function sessionStatePath(projectDir) {
|
|
14
|
+
return path.join(projectDir, ".opencode", "opencode-cabbage", "session-state.json");
|
|
15
|
+
}
|
|
16
|
+
async function saveSessionState(projectDir, sessionID, goal) {
|
|
17
|
+
const dir = path.dirname(sessionStatePath(projectDir));
|
|
18
|
+
if (!existsSync(dir))
|
|
19
|
+
await mkdir(dir, { recursive: true });
|
|
20
|
+
await writeFile(sessionStatePath(projectDir), JSON.stringify({
|
|
21
|
+
sessionID,
|
|
22
|
+
status: goal.status,
|
|
23
|
+
updatedAt: Date.now(),
|
|
24
|
+
}), "utf8");
|
|
25
|
+
}
|
|
26
|
+
async function loadLastSession(projectDir) {
|
|
27
|
+
try {
|
|
28
|
+
const data = JSON.parse(await readFile(sessionStatePath(projectDir), "utf8"));
|
|
29
|
+
return data.status === "active" ? data.sessionID : null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function clearSessionState(projectDir) {
|
|
36
|
+
try {
|
|
37
|
+
await writeFile(sessionStatePath(projectDir), JSON.stringify({ status: "completed", updatedAt: Date.now() }), "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
}
|
|
41
|
+
async function queueContinuation(client, sessionID, projectDir) {
|
|
42
|
+
const { goal } = await readGoal(client, sessionID);
|
|
43
|
+
if (!goal || goal.status !== "active")
|
|
44
|
+
return;
|
|
45
|
+
if (projectDir)
|
|
46
|
+
saveSessionState(projectDir, sessionID, goal);
|
|
47
|
+
if (abortedSessions.has(sessionID)) {
|
|
48
|
+
abortedSessions.delete(sessionID);
|
|
49
|
+
goal.status = "paused";
|
|
50
|
+
await writeGoal(client, sessionID, goal);
|
|
51
|
+
if (projectDir)
|
|
52
|
+
clearSessionState(projectDir);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (goal.continuationCount >= MAX_CONTINUATIONS) {
|
|
56
|
+
goal.status = "paused";
|
|
57
|
+
await writeGoal(client, sessionID, goal);
|
|
58
|
+
if (projectDir)
|
|
59
|
+
clearSessionState(projectDir);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
goal.continuationCount++;
|
|
63
|
+
await writeGoal(client, sessionID, goal);
|
|
64
|
+
try {
|
|
65
|
+
if (goal.continuationCount > 0 && goal.continuationCount % COMPACTION_THRESHOLD === 0) {
|
|
66
|
+
try {
|
|
67
|
+
await client.session.promptAsync({
|
|
68
|
+
sessionID,
|
|
69
|
+
parts: [{ type: "text", text: "[compact] The session history is growing long. Summarize completed work and continue.", synthetic: true }],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
}
|
|
74
|
+
await client.session.promptAsync({
|
|
75
|
+
sessionID,
|
|
76
|
+
parts: [{ type: "text", text: continuationPrompt(goal.objective, goal.completionCriterion), synthetic: true }],
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error("[cabbage] continuation failed:", err);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function autoResume(client, projectDir) {
|
|
84
|
+
const lastSessionID = await loadLastSession(projectDir);
|
|
85
|
+
if (!lastSessionID)
|
|
86
|
+
return;
|
|
87
|
+
const { goal } = await readGoal(client, lastSessionID);
|
|
88
|
+
if (!goal || goal.status !== "active") {
|
|
89
|
+
await clearSessionState(projectDir);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
await client.session.promptAsync({
|
|
94
|
+
sessionID: lastSessionID,
|
|
95
|
+
parts: [{
|
|
96
|
+
type: "text",
|
|
97
|
+
text: `[auto-resume] Plugin restarted. Resuming previous goal:\n\n${formatGoal(goal)}\n\nContinue working.`,
|
|
98
|
+
synthetic: true,
|
|
99
|
+
}],
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error("[cabbage] auto-resume failed:", err);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function getRetryKey(sessionID, phase) {
|
|
107
|
+
return `${sessionID}:${phase}`;
|
|
108
|
+
}
|
|
109
|
+
function shouldEscalate(sessionID, phase) {
|
|
110
|
+
const key = getRetryKey(sessionID, phase);
|
|
111
|
+
const count = errorRetryCount.get(key) ?? 0;
|
|
112
|
+
errorRetryCount.set(key, count + 1);
|
|
113
|
+
if (count < 3)
|
|
114
|
+
return "retry";
|
|
115
|
+
if (count < 5)
|
|
116
|
+
return "skip";
|
|
117
|
+
return "pause";
|
|
118
|
+
}
|
|
119
|
+
const ABORTED_SESSION_CLEANUP_INTERVAL = 1000 * 60 * 30;
|
|
120
|
+
let abortedCleanupTimer = null;
|
|
121
|
+
function startPeriodicCleanup() {
|
|
122
|
+
if (abortedCleanupTimer)
|
|
123
|
+
clearInterval(abortedCleanupTimer);
|
|
124
|
+
abortedCleanupTimer = setInterval(() => {
|
|
125
|
+
abortedSessions.clear();
|
|
126
|
+
errorRetryCount.clear();
|
|
127
|
+
}, ABORTED_SESSION_CLEANUP_INTERVAL);
|
|
128
|
+
}
|
|
129
|
+
export function createOpencodeCabbage(packageRoot) {
|
|
130
|
+
return async (ctx, _options) => {
|
|
131
|
+
const sourceSkillsDir = path.join(packageRoot, "assets", "skills");
|
|
132
|
+
const contextDir = path.join(packageRoot, "assets", "context");
|
|
133
|
+
const commandsDir = path.join(packageRoot, "assets", "commands");
|
|
134
|
+
const skillsDir = await setupSkillsDir(sourceSkillsDir, contextDir);
|
|
135
|
+
const projectDir = ctx.worktree || ctx.directory;
|
|
136
|
+
const v1Client = ctx.client._client;
|
|
137
|
+
const goalClient = createGoalClient(ctx.serverUrl, v1Client);
|
|
138
|
+
const goalTool = createGoalTool(goalClient);
|
|
139
|
+
const agentsDir = path.join(packageRoot, "assets", "agents");
|
|
140
|
+
await initPrompts(packageRoot, projectDir);
|
|
141
|
+
await initBootstrap();
|
|
142
|
+
startPeriodicCleanup();
|
|
143
|
+
autoResume(goalClient, projectDir);
|
|
144
|
+
return {
|
|
145
|
+
tool: {
|
|
146
|
+
goal: goalTool,
|
|
147
|
+
},
|
|
148
|
+
config: async (rawConfig) => {
|
|
149
|
+
const config = rawConfig;
|
|
150
|
+
config.skills = config.skills || {};
|
|
151
|
+
config.skills.paths = config.skills.paths || [];
|
|
152
|
+
if (!config.skills.paths.includes(skillsDir)) {
|
|
153
|
+
config.skills.paths.push(skillsDir);
|
|
154
|
+
}
|
|
155
|
+
config.command = config.command || {};
|
|
156
|
+
for (const cmd of loadCommands(commandsDir, skillsDir)) {
|
|
157
|
+
if (config.command[cmd.name])
|
|
158
|
+
continue;
|
|
159
|
+
config.command[cmd.name] = {
|
|
160
|
+
template: cmd.template,
|
|
161
|
+
description: cmd.description,
|
|
162
|
+
agent: cmd.agent,
|
|
163
|
+
model: cmd.model,
|
|
164
|
+
subtask: cmd.subtask,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
config.agent = config.agent || {};
|
|
168
|
+
for (const agent of loadAgents(agentsDir)) {
|
|
169
|
+
if (config.agent[agent.key])
|
|
170
|
+
continue;
|
|
171
|
+
config.agent[agent.key] = {
|
|
172
|
+
description: agent.description,
|
|
173
|
+
mode: agent.mode,
|
|
174
|
+
color: agent.color,
|
|
175
|
+
prompt: agent.prompt,
|
|
176
|
+
tools: agent.tools ?? { read: true, bash: true, write: true, edit: true },
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if (!config.agent["goal-verify"]) {
|
|
180
|
+
config.agent["goal-verify"] = {
|
|
181
|
+
mode: "subagent",
|
|
182
|
+
description: "Goal verification agent. Verifies completion independently.",
|
|
183
|
+
prompt: verifyAgentPrompt(),
|
|
184
|
+
tools: { read: true, bash: true, write: false, edit: false },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"experimental.chat.messages.transform": async (_input, output) => {
|
|
189
|
+
const bootstrap = getBootstrapContent();
|
|
190
|
+
if (!output.messages.length)
|
|
191
|
+
return;
|
|
192
|
+
const firstUser = output.messages.find(m => m.info.role === "user");
|
|
193
|
+
if (!firstUser || !firstUser.parts.length)
|
|
194
|
+
return;
|
|
195
|
+
if (firstUser.parts.some(p => p.type === "text" && p.text.includes("EXTREMELY_IMPORTANT")))
|
|
196
|
+
return;
|
|
197
|
+
firstUser.parts.unshift({ type: "text", text: bootstrap });
|
|
198
|
+
},
|
|
199
|
+
async event({ event }) {
|
|
200
|
+
const evt = event;
|
|
201
|
+
if (evt.type === "session.error") {
|
|
202
|
+
const errorName = evt.properties?.error?.name;
|
|
203
|
+
const sessionID = evt.properties.sessionID;
|
|
204
|
+
if (errorName === "MessageAbortedError" && sessionID) {
|
|
205
|
+
abortedSessions.add(sessionID);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (evt.type === "session.status" && evt.properties?.status?.type === "idle") {
|
|
209
|
+
const sessionID = evt.properties.sessionID;
|
|
210
|
+
if (sessionID) {
|
|
211
|
+
const result = await goalClient.session.get({ sessionID });
|
|
212
|
+
if (result?.data?.parentID)
|
|
213
|
+
return;
|
|
214
|
+
void queueContinuation(goalClient, sessionID, projectDir);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (evt.type === "session.status" && evt.properties?.status?.type === "error") {
|
|
218
|
+
const sessionID = evt.properties.sessionID;
|
|
219
|
+
if (sessionID && !abortedSessions.has(sessionID)) {
|
|
220
|
+
const phase = evt.properties?.phase ?? "unknown";
|
|
221
|
+
const action = shouldEscalate(sessionID, phase);
|
|
222
|
+
const { goal } = await readGoal(goalClient, sessionID);
|
|
223
|
+
if (action === "retry" && goal) {
|
|
224
|
+
await goalClient.session.promptAsync({
|
|
225
|
+
sessionID,
|
|
226
|
+
parts: [{
|
|
227
|
+
type: "text",
|
|
228
|
+
text: `[auto-retry] Previous attempt failed. Try a different approach.\n\nGoal: ${goal.objective}`,
|
|
229
|
+
synthetic: true,
|
|
230
|
+
}],
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else if (action === "skip" && goal) {
|
|
234
|
+
await goalClient.session.promptAsync({
|
|
235
|
+
sessionID,
|
|
236
|
+
parts: [{
|
|
237
|
+
type: "text",
|
|
238
|
+
text: `[skip] Skipping failed step. Continue with remaining work.\n\nGoal: ${goal.objective}`,
|
|
239
|
+
synthetic: true,
|
|
240
|
+
}],
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (evt.type === "message.updated" && evt.properties?.info?.role === "user") {
|
|
246
|
+
const sessionID = evt.properties.sessionID;
|
|
247
|
+
if (sessionID) {
|
|
248
|
+
abortedSessions.delete(sessionID);
|
|
249
|
+
const { goal, session } = await readGoal(goalClient, sessionID);
|
|
250
|
+
if (goal) {
|
|
251
|
+
goal.continuationCount = 0;
|
|
252
|
+
await writeGoal(goalClient, sessionID, goal, session ?? undefined);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (evt.type === "session.updated") {
|
|
257
|
+
const sessionID = evt.properties?.sessionID;
|
|
258
|
+
if (sessionID) {
|
|
259
|
+
const { goal } = await readGoal(goalClient, sessionID);
|
|
260
|
+
if (goal?.status === "complete") {
|
|
261
|
+
await clearSessionState(projectDir);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/plugin/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function setupSkillsDir(sourceSkillsDir: string, contextDir?: string): Promise<string>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { cp, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const _tempDirs = new Set();
|
|
5
|
+
process.once("exit", () => {
|
|
6
|
+
for (const dir of _tempDirs) {
|
|
7
|
+
rm(dir, { recursive: true, force: true }).catch(() => { });
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
export async function setupSkillsDir(sourceSkillsDir, contextDir) {
|
|
11
|
+
const baseDir = await mkdtemp(path.join(tmpdir(), "opencode-cabbage-skills-"));
|
|
12
|
+
_tempDirs.add(baseDir);
|
|
13
|
+
const destDir = path.join(baseDir, "skills");
|
|
14
|
+
await cp(sourceSkillsDir, destDir, { recursive: true });
|
|
15
|
+
if (contextDir) {
|
|
16
|
+
try {
|
|
17
|
+
await cp(contextDir, path.join(destDir, "_context"), { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
catch { }
|
|
20
|
+
}
|
|
21
|
+
async function processDir(dir) {
|
|
22
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
const fullPath = path.join(dir, entry.name);
|
|
25
|
+
if (entry.isDirectory()) {
|
|
26
|
+
await processDir(fullPath);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (entry.name === "SKILL.md") {
|
|
30
|
+
let content = await readFile(fullPath, "utf8");
|
|
31
|
+
content = content.replaceAll(".opencode/skills/", `${destDir}/`);
|
|
32
|
+
await writeFile(fullPath, content, "utf8");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await processDir(destDir);
|
|
37
|
+
return destDir;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/plugin/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;AAEnC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;IACxB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,eAAuB,EAAE,UAAmB;IAC/E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAA;IAC9E,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAE5C,MAAM,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,GAAW;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAC1B,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC9C,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,OAAO,GAAG,CAAC,CAAA;gBAChE,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAEzB,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/dist/plugin.d.ts
ADDED
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { createOpencodeCabbage } from "./plugin/server.js";
|
|
4
|
+
export function resolvePackageRoot(metaUrl) {
|
|
5
|
+
return path.resolve(path.dirname(fileURLToPath(metaUrl)), "..");
|
|
6
|
+
}
|
|
7
|
+
const packageRoot = resolvePackageRoot(import.meta.url);
|
|
8
|
+
export const OpencodeCabbage = createOpencodeCabbage(packageRoot);
|
|
9
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAW,qBAAqB,CAAC,WAAW,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function pathExists(targetPath: string): Promise<boolean>;
|
package/dist/util/fs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
package/dist/util/gh.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/util/gh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,UAAU,EAAE,CAAC,IAAY,EAAE,OAAO,GAAG,MAAM;IAC/C,OAAO,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;AAC7C,CAAC"}
|