@blxzer/cursor-trellis 0.3.5 → 0.3.6
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/CHANGELOG.md +46 -0
- package/README.md +13 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/goal/index.d.ts +3 -0
- package/dist/commands/goal/index.d.ts.map +1 -0
- package/dist/commands/goal/index.js +159 -0
- package/dist/commands/goal/index.js.map +1 -0
- package/dist/commands/goal/review.d.ts +6 -0
- package/dist/commands/goal/review.d.ts.map +1 -0
- package/dist/commands/goal/review.js +28 -0
- package/dist/commands/goal/review.js.map +1 -0
- package/dist/commands/sdk/run.d.ts.map +1 -1
- package/dist/commands/sdk/run.js +2 -27
- package/dist/commands/sdk/run.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +13 -1
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/goal/action-packet.d.ts +89 -0
- package/dist/goal/action-packet.d.ts.map +1 -0
- package/dist/goal/action-packet.js +113 -0
- package/dist/goal/action-packet.js.map +1 -0
- package/dist/goal/audit.d.ts +14 -0
- package/dist/goal/audit.d.ts.map +1 -0
- package/dist/goal/audit.js +12 -0
- package/dist/goal/audit.js.map +1 -0
- package/dist/goal/constants.d.ts +26 -0
- package/dist/goal/constants.d.ts.map +1 -0
- package/dist/goal/constants.js +24 -0
- package/dist/goal/constants.js.map +1 -0
- package/dist/goal/paths.d.ts +8 -0
- package/dist/goal/paths.d.ts.map +1 -0
- package/dist/goal/paths.js +36 -0
- package/dist/goal/paths.js.map +1 -0
- package/dist/goal/preflight.d.ts +21 -0
- package/dist/goal/preflight.d.ts.map +1 -0
- package/dist/goal/preflight.js +97 -0
- package/dist/goal/preflight.js.map +1 -0
- package/dist/goal/review-seam.d.ts +44 -0
- package/dist/goal/review-seam.d.ts.map +1 -0
- package/dist/goal/review-seam.js +153 -0
- package/dist/goal/review-seam.js.map +1 -0
- package/dist/goal/reviewer-rules.d.ts +13 -0
- package/dist/goal/reviewer-rules.d.ts.map +1 -0
- package/dist/goal/reviewer-rules.js +153 -0
- package/dist/goal/reviewer-rules.js.map +1 -0
- package/dist/goal/reviewer.d.ts +9 -0
- package/dist/goal/reviewer.d.ts.map +1 -0
- package/dist/goal/reviewer.js +54 -0
- package/dist/goal/reviewer.js.map +1 -0
- package/dist/goal/runtime.d.ts +32 -0
- package/dist/goal/runtime.d.ts.map +1 -0
- package/dist/goal/runtime.js +242 -0
- package/dist/goal/runtime.js.map +1 -0
- package/dist/goal/sdk-client.d.ts +10 -0
- package/dist/goal/sdk-client.d.ts.map +1 -0
- package/dist/goal/sdk-client.js +34 -0
- package/dist/goal/sdk-client.js.map +1 -0
- package/dist/goal/state.d.ts +40 -0
- package/dist/goal/state.d.ts.map +1 -0
- package/dist/goal/state.js +37 -0
- package/dist/goal/state.js.map +1 -0
- package/dist/goal/task-triggers.d.ts +15 -0
- package/dist/goal/task-triggers.d.ts.map +1 -0
- package/dist/goal/task-triggers.js +23 -0
- package/dist/goal/task-triggers.js.map +1 -0
- package/dist/goal/walls.d.ts +12 -0
- package/dist/goal/walls.d.ts.map +1 -0
- package/dist/goal/walls.js +65 -0
- package/dist/goal/walls.js.map +1 -0
- package/dist/goal/worker-prompt.d.ts +13 -0
- package/dist/goal/worker-prompt.d.ts.map +1 -0
- package/dist/goal/worker-prompt.js +41 -0
- package/dist/goal/worker-prompt.js.map +1 -0
- package/dist/goal/worker.d.ts +42 -0
- package/dist/goal/worker.d.ts.map +1 -0
- package/dist/goal/worker.js +180 -0
- package/dist/goal/worker.js.map +1 -0
- package/dist/migrations/manifests/0.3.5.json +9 -0
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/templates/common/commands/continue.md +15 -3
- package/dist/templates/common/skills/check.md +7 -4
- package/dist/templates/cursor/agents/cstl-check.md +1 -0
- package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +1 -1
- package/dist/templates/cursor/fixtures/expected-rules.js +6 -1
- package/dist/templates/cursor/fixtures/expected-rules.js.map +1 -1
- package/dist/templates/cursor/rules/cstl-cursor-modes.mdc +32 -0
- package/dist/templates/cursor/rules/cstl-triage.mdc +2 -4
- package/dist/templates/cursor/rules/retrieval-routing.mdc +26 -7
- package/dist/templates/markdown/index.d.ts +3 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +3 -0
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +38 -21
- package/dist/templates/markdown/spec/guides/cursor-native-modes-guide.md.txt +125 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +107 -104
- package/dist/templates/markdown/spec/guides/injection-budget-guide.md.txt +111 -0
- package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +24 -6
- package/dist/templates/markdown/spec/guides/verification-strength-guide.md.txt +184 -0
- package/dist/templates/shared-hooks/session-start.py +10 -0
- package/dist/templates/trellis/config.yaml +18 -0
- package/dist/templates/trellis/index.d.ts +5 -0
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +14 -0
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/artifact_locale.py +278 -0
- package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +37 -2
- package/dist/templates/trellis/scripts/common/config.py +39 -0
- package/dist/templates/trellis/scripts/common/injection_budget.py +317 -0
- package/dist/templates/trellis/scripts/common/parent_orchestration.py +161 -5
- package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +9 -3
- package/dist/templates/trellis/scripts/common/session_context.py +32 -4
- package/dist/templates/trellis/scripts/common/session_memory.py +26 -0
- package/dist/templates/trellis/scripts/common/subagent_dispatch.py +74 -9
- package/dist/templates/trellis/scripts/common/task_context.py +18 -0
- package/dist/templates/trellis/scripts/common/task_dashboard.py +16 -1
- package/dist/templates/trellis/scripts/common/task_map.py +40 -8
- package/dist/templates/trellis/scripts/common/task_store.py +144 -39
- package/dist/templates/trellis/scripts/common/test_observable_defaults.py +135 -0
- package/dist/templates/trellis/scripts/cursor_retrieval_probe_prompt.md +14 -12
- package/dist/templates/trellis/scripts/generate_dispatch_prompt.py +182 -0
- package/dist/templates/trellis/scripts/injection_budget_probe.py +69 -0
- package/dist/templates/trellis/scripts/retrieval_probe_matrix_template.json +3 -3
- package/dist/templates/trellis/scripts/spec_health_outcomes.py +160 -0
- package/dist/templates/trellis/scripts/task.py +19 -0
- package/dist/templates/trellis/tasks/locale/en/default-prd.md +19 -0
- package/dist/templates/trellis/tasks/locale/zh/default-prd.md +19 -0
- package/dist/templates/trellis/workflow.md +23 -3
- package/package.json +2 -2
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { GOAL_WALL_DEFAULTS } from "./constants.js";
|
|
3
|
+
import { goalStatePath } from "./paths.js";
|
|
4
|
+
export function defaultWalls(mode) {
|
|
5
|
+
return { ...GOAL_WALL_DEFAULTS[mode] };
|
|
6
|
+
}
|
|
7
|
+
export function createDraftState(goalId, goalText, mode) {
|
|
8
|
+
return {
|
|
9
|
+
goal_id: goalId,
|
|
10
|
+
lifecycle: "draft",
|
|
11
|
+
mode,
|
|
12
|
+
goal_text: goalText,
|
|
13
|
+
task_dir: null,
|
|
14
|
+
started_at: null,
|
|
15
|
+
last_progress_at: null,
|
|
16
|
+
worker_turns: 0,
|
|
17
|
+
total_turns: 0,
|
|
18
|
+
no_progress_rounds: 0,
|
|
19
|
+
reroute_counts: {},
|
|
20
|
+
walls: defaultWalls(mode),
|
|
21
|
+
channel_name: null,
|
|
22
|
+
last_worker_adapter: null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function readGoalState(cwd, goalId) {
|
|
26
|
+
const file = goalStatePath(cwd, goalId);
|
|
27
|
+
if (!fs.existsSync(file)) {
|
|
28
|
+
throw new Error(`Goal state not found: ${file}`);
|
|
29
|
+
}
|
|
30
|
+
return JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
31
|
+
}
|
|
32
|
+
export function writeGoalState(cwd, state) {
|
|
33
|
+
const file = goalStatePath(cwd, state.goal_id);
|
|
34
|
+
fs.mkdirSync(file.replace(/[/\\][^/\\]+$/, ""), { recursive: true });
|
|
35
|
+
fs.writeFileSync(file, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/goal/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwC3C,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,OAAO,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,QAAgB,EAChB,IAAiB;IAEjB,OAAO;QACL,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,OAAO;QAClB,IAAI;QACJ,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,CAAC;QACrB,cAAc,EAAE,EAAE;QAClB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAc;IACvD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAc,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,KAAgB;IAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GoalState } from "./state.js";
|
|
2
|
+
export type TaskTriggerId = "T-1" | "T-2" | "T-3" | "T-4" | "T-5";
|
|
3
|
+
export interface TaskTriggerHit {
|
|
4
|
+
id: TaskTriggerId;
|
|
5
|
+
reason: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function evaluateTaskTriggers(state: GoalState, ctx: {
|
|
8
|
+
l1Count: number;
|
|
9
|
+
estimatedHours?: number;
|
|
10
|
+
independentDeliverables?: number;
|
|
11
|
+
aboutToPause?: boolean;
|
|
12
|
+
justAcceptedPreflight?: boolean;
|
|
13
|
+
}): TaskTriggerHit[];
|
|
14
|
+
export declare function shouldCreateGoalRootTask(hits: TaskTriggerHit[]): boolean;
|
|
15
|
+
//# sourceMappingURL=task-triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-triggers.d.ts","sourceRoot":"","sources":["../../src/goal/task-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,aAAa,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,GACA,cAAc,EAAE,CAwBlB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAExE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function evaluateTaskTriggers(state, ctx) {
|
|
2
|
+
const hits = [];
|
|
3
|
+
if (ctx.justAcceptedPreflight) {
|
|
4
|
+
hits.push({ id: "T-5", reason: "preflight accepted — goal-root task required" });
|
|
5
|
+
}
|
|
6
|
+
if ((ctx.estimatedHours ?? 0) > 1) {
|
|
7
|
+
hits.push({ id: "T-1", reason: "estimated or elapsed >1h" });
|
|
8
|
+
}
|
|
9
|
+
if ((ctx.independentDeliverables ?? 0) >= 2) {
|
|
10
|
+
hits.push({ id: "T-2", reason: "≥2 independent deliverables planned" });
|
|
11
|
+
}
|
|
12
|
+
if (ctx.l1Count >= 1 && !state.task_dir) {
|
|
13
|
+
hits.push({ id: "T-3", reason: "≥1 L1 audit without bound task_dir" });
|
|
14
|
+
}
|
|
15
|
+
if (ctx.aboutToPause) {
|
|
16
|
+
hits.push({ id: "T-4", reason: "pause or crash-wall imminent" });
|
|
17
|
+
}
|
|
18
|
+
return hits;
|
|
19
|
+
}
|
|
20
|
+
export function shouldCreateGoalRootTask(hits) {
|
|
21
|
+
return hits.some((h) => h.id === "T-5" || h.id === "T-3");
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=task-triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-triggers.js","sourceRoot":"","sources":["../../src/goal/task-triggers.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,oBAAoB,CAClC,KAAgB,EAChB,GAMC;IAED,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAsB;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GoalState } from "./state.js";
|
|
2
|
+
export type WallCheckResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
} | {
|
|
5
|
+
ok: false;
|
|
6
|
+
reason: string;
|
|
7
|
+
crash: true;
|
|
8
|
+
};
|
|
9
|
+
export declare function checkWalls(state: GoalState, nowMs?: number): WallCheckResult;
|
|
10
|
+
export declare function markProgress(state: GoalState, nowMs?: number): GoalState;
|
|
11
|
+
export declare function markNoProgressRound(state: GoalState): GoalState;
|
|
12
|
+
//# sourceMappingURL=walls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walls.d.ts","sourceRoot":"","sources":["../../src/goal/walls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAa/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,SAAa,GAAG,eAAe,CA+ChF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,SAAa,GAAG,SAAS,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAK/D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
function elapsedSeconds(state, nowMs) {
|
|
2
|
+
if (!state.started_at)
|
|
3
|
+
return 0;
|
|
4
|
+
return Math.max(0, (nowMs - Date.parse(state.started_at)) / 1000);
|
|
5
|
+
}
|
|
6
|
+
function noProgressSeconds(state, nowMs) {
|
|
7
|
+
const anchor = state.last_progress_at ?? state.started_at;
|
|
8
|
+
if (!anchor)
|
|
9
|
+
return 0;
|
|
10
|
+
return Math.max(0, (nowMs - Date.parse(anchor)) / 1000);
|
|
11
|
+
}
|
|
12
|
+
export function checkWalls(state, nowMs = Date.now()) {
|
|
13
|
+
const w = state.walls;
|
|
14
|
+
if (state.started_at && elapsedSeconds(state, nowMs) >= w.wallClockSeconds) {
|
|
15
|
+
return {
|
|
16
|
+
ok: false,
|
|
17
|
+
crash: true,
|
|
18
|
+
reason: `wall-clock reached (${w.wallClockSeconds}s)`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (state.worker_turns >= w.workerTurnLimit) {
|
|
22
|
+
return {
|
|
23
|
+
ok: false,
|
|
24
|
+
crash: true,
|
|
25
|
+
reason: `worker turn hard-cap (${w.workerTurnLimit})`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (state.total_turns >= w.totalTurnLimit) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
crash: true,
|
|
32
|
+
reason: `total turn hard-cap (${w.totalTurnLimit})`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (state.started_at &&
|
|
36
|
+
noProgressSeconds(state, nowMs) >= w.noProgressSeconds) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
crash: true,
|
|
40
|
+
reason: `no-progress wall (${w.noProgressSeconds}s)`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (state.no_progress_rounds >= w.noProgressRounds) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
crash: true,
|
|
47
|
+
reason: `no-progress rounds (${w.noProgressRounds})`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return { ok: true };
|
|
51
|
+
}
|
|
52
|
+
export function markProgress(state, nowMs = Date.now()) {
|
|
53
|
+
return {
|
|
54
|
+
...state,
|
|
55
|
+
last_progress_at: new Date(nowMs).toISOString(),
|
|
56
|
+
no_progress_rounds: 0,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function markNoProgressRound(state) {
|
|
60
|
+
return {
|
|
61
|
+
...state,
|
|
62
|
+
no_progress_rounds: state.no_progress_rounds + 1,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=walls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walls.js","sourceRoot":"","sources":["../../src/goal/walls.ts"],"names":[],"mappings":"AAMA,SAAS,cAAc,CAAC,KAAgB,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAgB,EAAE,KAAa;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,UAAU,CAAC;IAC1D,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAgB,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IAEtB,IAAI,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC3E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,uBAAuB,CAAC,CAAC,gBAAgB,IAAI;SACtD,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,yBAAyB,CAAC,CAAC,eAAe,GAAG;SACtD,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,wBAAwB,CAAC,CAAC,cAAc,GAAG;SACpD,CAAC;IACJ,CAAC;IAED,IACE,KAAK,CAAC,UAAU;QAChB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,EACtD,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,qBAAqB,CAAC,CAAC,iBAAiB,IAAI;SACrD,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,uBAAuB,CAAC,CAAC,gBAAgB,GAAG;SACrD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAgB,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/D,OAAO;QACL,GAAG,KAAK;QACR,gBAAgB,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;QAC/C,kBAAkB,EAAE,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,OAAO;QACL,GAAG,KAAK;QACR,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,GAAG,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GoalState } from "./state.js";
|
|
2
|
+
export interface GoalWorkerPromptContext {
|
|
3
|
+
cwd: string;
|
|
4
|
+
state: GoalState;
|
|
5
|
+
contractPath: string;
|
|
6
|
+
agentDefinitionPath: string;
|
|
7
|
+
turnIndex: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the authoritative prompt for cstl-goal-worker (SDK / channel runner).
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildGoalWorkerPrompt(ctx: GoalWorkerPromptContext): string;
|
|
13
|
+
//# sourceMappingURL=worker-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-prompt.d.ts","sourceRoot":"","sources":["../../src/goal/worker-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAqC1E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Build the authoritative prompt for cstl-goal-worker (SDK / channel runner).
|
|
4
|
+
*/
|
|
5
|
+
export function buildGoalWorkerPrompt(ctx) {
|
|
6
|
+
const absoluteContract = path.resolve(ctx.contractPath);
|
|
7
|
+
const absoluteAgent = path.resolve(ctx.agentDefinitionPath);
|
|
8
|
+
const taskDir = ctx.state.task_dir ? path.resolve(ctx.state.task_dir) : "(none)";
|
|
9
|
+
const doneWhen = ctx.state.contract?.doneWhen.map((d, i) => `${i + 1}. ${d}`).join("\n") ??
|
|
10
|
+
"(contract not loaded)";
|
|
11
|
+
const evidenceHow = ctx.state.contract?.evidenceHow ?? "(unspecified)";
|
|
12
|
+
return [
|
|
13
|
+
"## Goal binding (authoritative)",
|
|
14
|
+
`- goal_id: \`${ctx.state.goal_id}\``,
|
|
15
|
+
`- mode: \`${ctx.state.mode}\``,
|
|
16
|
+
`- contract.md (absolute): \`${absoluteContract}\``,
|
|
17
|
+
`- task_dir (absolute): \`${taskDir}\``,
|
|
18
|
+
`- worker agent definition: \`${absoluteAgent}\``,
|
|
19
|
+
`- turn: ${ctx.turnIndex}`,
|
|
20
|
+
`- worker_turns: ${ctx.state.worker_turns} / ${ctx.state.walls.workerTurnLimit}`,
|
|
21
|
+
"",
|
|
22
|
+
"## done_when",
|
|
23
|
+
doneWhen,
|
|
24
|
+
"",
|
|
25
|
+
"## evidence_how",
|
|
26
|
+
evidenceHow,
|
|
27
|
+
"",
|
|
28
|
+
"## Turn instructions",
|
|
29
|
+
"You are the cstl-goal-worker subagent (G1). Advance one concrete step toward done_when.",
|
|
30
|
+
"If you need human-reviewed action (push/merge/delete/global-config class): output a single JSON code block",
|
|
31
|
+
"matching GoalActionPacket v0 (schema_version=1, goal_id, proposed_action, action_kind, axes,",
|
|
32
|
+
"hard_deny_candidates, done_when_ref, diff_or_cmd_digest). Do NOT include secrets.",
|
|
33
|
+
"Otherwise reply with a short status: progress vs done_when, next action, blockers.",
|
|
34
|
+
"",
|
|
35
|
+
"## Forbidden",
|
|
36
|
+
"- Mid-flight human approval requests (preflight already passed).",
|
|
37
|
+
"- Force-push, commit to main/release, bypass hard deny H-1…H-6.",
|
|
38
|
+
"- Raw secrets in output.",
|
|
39
|
+
].join("\n");
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=worker-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-prompt.js","sourceRoot":"","sources":["../../src/goal/worker-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAA4B;IAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjF,MAAM,QAAQ,GACZ,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACvE,uBAAuB,CAAC;IAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,IAAI,eAAe,CAAC;IAEvE,OAAO;QACL,iCAAiC;QACjC,gBAAgB,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI;QACrC,aAAa,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;QAC/B,+BAA+B,gBAAgB,IAAI;QACnD,4BAA4B,OAAO,IAAI;QACvC,gCAAgC,aAAa,IAAI;QACjD,WAAW,GAAG,CAAC,SAAS,EAAE;QAC1B,mBAAmB,GAAG,CAAC,KAAK,CAAC,YAAY,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE;QAChF,EAAE;QACF,cAAc;QACd,QAAQ;QACR,EAAE;QACF,iBAAiB;QACjB,WAAW;QACX,EAAE;QACF,sBAAsB;QACtB,yFAAyF;QACzF,4GAA4G;QAC5G,8FAA8F;QAC9F,mFAAmF;QACnF,oFAAoF;QACpF,EAAE;QACF,cAAc;QACd,kEAAkE;QAClE,iEAAiE;QACjE,0BAA0B;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { GoalActionPacket } from "./action-packet.js";
|
|
2
|
+
import type { GoalState, GoalWorkerKind } from "./state.js";
|
|
3
|
+
export type { GoalWorkerKind } from "./state.js";
|
|
4
|
+
export interface WorkerTurnContext {
|
|
5
|
+
cwd: string;
|
|
6
|
+
state: GoalState;
|
|
7
|
+
contractPath: string;
|
|
8
|
+
agentDefinitionPath: string;
|
|
9
|
+
turnIndex: number;
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
}
|
|
12
|
+
export type WorkerTurnKind = "status" | "action" | "error";
|
|
13
|
+
export interface WorkerTurnResult {
|
|
14
|
+
kind: WorkerTurnKind;
|
|
15
|
+
summary: string;
|
|
16
|
+
packet?: GoalActionPacket;
|
|
17
|
+
error?: string;
|
|
18
|
+
evidencePath: string;
|
|
19
|
+
}
|
|
20
|
+
export interface GoalWorkerAdapter {
|
|
21
|
+
readonly id: GoalWorkerKind;
|
|
22
|
+
runTurn(ctx: WorkerTurnContext): Promise<WorkerTurnResult>;
|
|
23
|
+
}
|
|
24
|
+
export declare function goalWorkerTurnPath(cwd: string, goalId: string, turnIndex: number): string;
|
|
25
|
+
export declare function extractJsonBlocks(text: string): unknown[];
|
|
26
|
+
export declare function parseWorkerPacketFromText(text: string, goalId: string): GoalActionPacket | null;
|
|
27
|
+
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T>;
|
|
28
|
+
export declare class MockWorkerAdapter implements GoalWorkerAdapter {
|
|
29
|
+
readonly id: "mock";
|
|
30
|
+
runTurn(ctx: WorkerTurnContext): Promise<WorkerTurnResult>;
|
|
31
|
+
}
|
|
32
|
+
export declare class SdkWorkerAdapter implements GoalWorkerAdapter {
|
|
33
|
+
readonly id: "sdk";
|
|
34
|
+
runTurn(ctx: WorkerTurnContext): Promise<WorkerTurnResult>;
|
|
35
|
+
}
|
|
36
|
+
export declare function resolveWorkerAdapter(opts: {
|
|
37
|
+
mockWorker?: boolean;
|
|
38
|
+
worker?: GoalWorkerKind;
|
|
39
|
+
}): GoalWorkerAdapter;
|
|
40
|
+
export declare function defaultAgentDefinitionPath(cwd: string): string;
|
|
41
|
+
export declare function buildWorkerTurnContext(cwd: string, state: GoalState, turnIndex: number): WorkerTurnContext;
|
|
42
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/goal/worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5D,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC5D;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAczD;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,gBAAgB,GAAG,IAAI,CAWzB;AAkCD,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAExB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAwBjE;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAEvB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAmDjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,GAAG,iBAAiB,CAcpB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,GAChB,iBAAiB,CASnB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { safeParseGoalActionPacket } from "./action-packet.js";
|
|
4
|
+
import { goalContractPath, goalRunDir } from "./paths.js";
|
|
5
|
+
import { promptCursorAgent } from "./sdk-client.js";
|
|
6
|
+
import { buildGoalWorkerPrompt } from "./worker-prompt.js";
|
|
7
|
+
import { packAction } from "./review-seam.js";
|
|
8
|
+
import { hasCursorApiKey } from "../utils/cursor-sdk-gate.js";
|
|
9
|
+
import { cursorApiKeySetupGuide } from "../utils/cursor-sdk-gate.js";
|
|
10
|
+
export function goalWorkerTurnPath(cwd, goalId, turnIndex) {
|
|
11
|
+
return path.join(goalRunDir(cwd, goalId), "worker-turns", `${turnIndex}.md`);
|
|
12
|
+
}
|
|
13
|
+
export function extractJsonBlocks(text) {
|
|
14
|
+
const blocks = [];
|
|
15
|
+
const re = /```(?:json)?\s*([\s\S]*?)```/gi;
|
|
16
|
+
let match;
|
|
17
|
+
while ((match = re.exec(text)) !== null) {
|
|
18
|
+
const raw = match[1]?.trim();
|
|
19
|
+
if (!raw)
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
blocks.push(JSON.parse(raw));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// skip invalid JSON fences
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return blocks;
|
|
29
|
+
}
|
|
30
|
+
export function parseWorkerPacketFromText(text, goalId) {
|
|
31
|
+
for (const block of extractJsonBlocks(text)) {
|
|
32
|
+
const parsed = safeParseGoalActionPacket(block);
|
|
33
|
+
if (parsed.valid && parsed.packet.goal_id === goalId) {
|
|
34
|
+
return parsed.packet;
|
|
35
|
+
}
|
|
36
|
+
if (parsed.valid && !parsed.packet.goal_id) {
|
|
37
|
+
return parsed.packet;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function writeWorkerEvidence(evidencePath, body) {
|
|
43
|
+
fs.mkdirSync(path.dirname(evidencePath), { recursive: true });
|
|
44
|
+
const content = [
|
|
45
|
+
`# Goal worker turn ${body.turnIndex}`,
|
|
46
|
+
"",
|
|
47
|
+
`adapter: \`${body.adapter}\``,
|
|
48
|
+
`kind: \`${body.kind}\``,
|
|
49
|
+
`status: \`${body.status}\``,
|
|
50
|
+
`prompt_chars: ${body.promptChars}`,
|
|
51
|
+
"",
|
|
52
|
+
"## Result",
|
|
53
|
+
"",
|
|
54
|
+
"```text",
|
|
55
|
+
body.result.slice(0, 8000),
|
|
56
|
+
"```",
|
|
57
|
+
"",
|
|
58
|
+
body.error ? `## Error\n\n${body.error}\n` : "",
|
|
59
|
+
].join("\n");
|
|
60
|
+
fs.writeFileSync(evidencePath, content, "utf-8");
|
|
61
|
+
}
|
|
62
|
+
export function withTimeout(promise, timeoutMs, label) {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const timer = setTimeout(() => {
|
|
65
|
+
reject(new Error(`${label} timed out after ${timeoutMs}ms`));
|
|
66
|
+
}, timeoutMs);
|
|
67
|
+
promise
|
|
68
|
+
.then((value) => {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
resolve(value);
|
|
71
|
+
})
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
reject(error);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export class MockWorkerAdapter {
|
|
79
|
+
id = "mock";
|
|
80
|
+
async runTurn(ctx) {
|
|
81
|
+
const evidencePath = goalWorkerTurnPath(ctx.cwd, ctx.state.goal_id, ctx.turnIndex);
|
|
82
|
+
const packet = packAction(ctx.state, {
|
|
83
|
+
summary: "Run focused validation for goal step (mock worker)",
|
|
84
|
+
kind: "shell",
|
|
85
|
+
digest: "pnpm test goal/",
|
|
86
|
+
axes: { A: false, B: false, C: true },
|
|
87
|
+
hardDenyCandidates: [],
|
|
88
|
+
});
|
|
89
|
+
writeWorkerEvidence(evidencePath, {
|
|
90
|
+
adapter: this.id,
|
|
91
|
+
turnIndex: ctx.turnIndex,
|
|
92
|
+
promptChars: 0,
|
|
93
|
+
status: "completed",
|
|
94
|
+
result: `[mock] worker turn ${ctx.turnIndex}`,
|
|
95
|
+
kind: "action",
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
kind: "action",
|
|
99
|
+
summary: `mock worker step ${ctx.turnIndex}`,
|
|
100
|
+
packet,
|
|
101
|
+
evidencePath,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export class SdkWorkerAdapter {
|
|
106
|
+
id = "sdk";
|
|
107
|
+
async runTurn(ctx) {
|
|
108
|
+
const evidencePath = goalWorkerTurnPath(ctx.cwd, ctx.state.goal_id, ctx.turnIndex);
|
|
109
|
+
const prompt = buildGoalWorkerPrompt(ctx);
|
|
110
|
+
try {
|
|
111
|
+
const outcome = await withTimeout(promptCursorAgent(prompt, ctx.cwd), ctx.timeoutMs, "SDK worker turn");
|
|
112
|
+
const packet = parseWorkerPacketFromText(outcome.result, ctx.state.goal_id);
|
|
113
|
+
const kind = packet ? "action" : "status";
|
|
114
|
+
writeWorkerEvidence(evidencePath, {
|
|
115
|
+
adapter: this.id,
|
|
116
|
+
turnIndex: ctx.turnIndex,
|
|
117
|
+
promptChars: prompt.length,
|
|
118
|
+
status: outcome.status,
|
|
119
|
+
result: outcome.result,
|
|
120
|
+
kind,
|
|
121
|
+
});
|
|
122
|
+
if (packet) {
|
|
123
|
+
return {
|
|
124
|
+
kind: "action",
|
|
125
|
+
summary: `sdk worker proposed action (turn ${ctx.turnIndex})`,
|
|
126
|
+
packet,
|
|
127
|
+
evidencePath,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const summary = outcome.result.trim().slice(0, 240) ||
|
|
131
|
+
`sdk worker status (turn ${ctx.turnIndex})`;
|
|
132
|
+
return { kind: "status", summary, evidencePath };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
136
|
+
writeWorkerEvidence(evidencePath, {
|
|
137
|
+
adapter: this.id,
|
|
138
|
+
turnIndex: ctx.turnIndex,
|
|
139
|
+
promptChars: prompt.length,
|
|
140
|
+
status: "error",
|
|
141
|
+
result: "",
|
|
142
|
+
kind: "error",
|
|
143
|
+
error: message,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
kind: "error",
|
|
147
|
+
summary: `sdk worker error: ${message}`,
|
|
148
|
+
error: message,
|
|
149
|
+
evidencePath,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function resolveWorkerAdapter(opts) {
|
|
155
|
+
if (opts.mockWorker || opts.worker === "mock") {
|
|
156
|
+
return new MockWorkerAdapter();
|
|
157
|
+
}
|
|
158
|
+
if (!hasCursorApiKey()) {
|
|
159
|
+
throw new Error([
|
|
160
|
+
"Runner goal worker requires CURSOR_API_KEY for live SDK turns.",
|
|
161
|
+
"Use --mock-worker for offline/CI, or set the key per `cstl sdk status`.",
|
|
162
|
+
cursorApiKeySetupGuide(),
|
|
163
|
+
].join(" "));
|
|
164
|
+
}
|
|
165
|
+
return new SdkWorkerAdapter();
|
|
166
|
+
}
|
|
167
|
+
export function defaultAgentDefinitionPath(cwd) {
|
|
168
|
+
return path.join(cwd, ".cursor", "agents", "cstl-goal-worker.md");
|
|
169
|
+
}
|
|
170
|
+
export function buildWorkerTurnContext(cwd, state, turnIndex) {
|
|
171
|
+
return {
|
|
172
|
+
cwd,
|
|
173
|
+
state,
|
|
174
|
+
contractPath: goalContractPath(cwd, state.goal_id),
|
|
175
|
+
agentDefinitionPath: defaultAgentDefinitionPath(cwd),
|
|
176
|
+
turnIndex,
|
|
177
|
+
timeoutMs: state.walls.workerTurnTimeoutMs,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/goal/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.3.5",
|
|
3
|
+
"description": "SDK task binding, Campaign Canvas open-path, smart-search ^0.2.0, Campaign MCP NDJSON",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**@blxzer/cursor-trellis 0.3.5**\n\n- feat(sdk): `cstl sdk run` injects explicit `--task` binding into agent prompt\n- feat(campaign): Campaign Canvas portable open-path + auto-open; env overrides\n- feat(cli): Adapt to @blxzer/smart-search ^0.2.0; External-knowledge gate\n- fix(campaign): Campaign MCP stdio speaks NDJSON\n- fix(cli): Do not create empty `.cursor/mcp.json` on Cursor init when no MCP selected",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Run `cstl update` to sync templates. No `--migrate` required. Retroactive local manifest — 0.3.5 shipped without this file in-repo."
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.3.6",
|
|
3
|
+
"description": "Goal MVP+SDK worker, locale zh/en, pack freshness, observable defaults, continue O1, injection budget",
|
|
4
|
+
"breaking": false,
|
|
5
|
+
"recommendMigrate": false,
|
|
6
|
+
"changelog": "**@blxzer/cursor-trellis 0.3.6**\n\n- feat(goal): `cstl goal` MVP + deterministic reviewer + SDK worker adapter\n- feat(locale): switchable zh/en artifact_locale + SessionStart summary line\n- feat(orchestration): auto publish-pack after integrate; nested child-id fixes\n- feat(observable): verify headers, dashboard verify summary, real jsonl seeds\n- feat(continue): search_memory step (O1)\n- feat(spec-health): S1 outcomes CLI\n- feat(context): opt-in journal snippet (default off)\n- feat(injection / verify / retrieval / modes): budget caps, graded verify guide, prefer native Grep+modes\n- docs(goal): goal-release-regression-runbook",
|
|
7
|
+
"migrations": [],
|
|
8
|
+
"notes": "Run `cstl update` to sync hooks/templates (SessionStart Artifact locale line). No `--migrate` required. BYOK short probe still deferred."
|
|
9
|
+
}
|
|
@@ -19,7 +19,19 @@ If the output says `Selected task: none`, do not auto-resume a previous or uniqu
|
|
|
19
19
|
- inspect details
|
|
20
20
|
- continue without a task for No Task / Micro-Grill work
|
|
21
21
|
|
|
22
|
-
## Step 2:
|
|
22
|
+
## Step 2: Search Session Memory
|
|
23
|
+
|
|
24
|
+
**Skip this step** if Step 1 reported `Selected task: none`.
|
|
25
|
+
|
|
26
|
+
When a task is selected, search past session memory so resume work can reuse journal context instead of re-asking the user:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
{{PYTHON_CMD}} ./.cstl/scripts/search_memory.py --query "<task topic or title>" --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Use the selected task's title or topic as the query. From the JSON results, summarize **1–3** most relevant hits for the user (title, summary, and next steps when present). Carry that context into the rest of the continue flow.
|
|
33
|
+
|
|
34
|
+
## Step 3: Load the Phase Index
|
|
23
35
|
|
|
24
36
|
```bash
|
|
25
37
|
{{PYTHON_CMD}} ./.cstl/scripts/get_context.py --mode phase
|
|
@@ -27,7 +39,7 @@ If the output says `Selected task: none`, do not auto-resume a previous or uniqu
|
|
|
27
39
|
|
|
28
40
|
Shows the Phase Index (Plan / Execute / Finish) with routing + skill mapping.
|
|
29
41
|
|
|
30
|
-
## Step
|
|
42
|
+
## Step 4: Decide Where You Are
|
|
31
43
|
|
|
32
44
|
When a task is selected, `get_context.py` shows the selected task's `status` field. Route by `status` + artifact presence. This command replaces the user needing to remember the Trellis flow; it does not itself approve implementation.
|
|
33
45
|
|
|
@@ -46,7 +58,7 @@ Phase rules (full detail in `.cstl/workflow.md`):
|
|
|
46
58
|
2. `[once]` steps are already done if the required output exists. `prd.md` alone can be enough only for lightweight tasks; complex tasks also need `design.md` and `implement.md`.
|
|
47
59
|
3. You may go back to an earlier phase if discoveries require it
|
|
48
60
|
|
|
49
|
-
## Step
|
|
61
|
+
## Step 5: Load the Specific Step
|
|
50
62
|
|
|
51
63
|
Once you know which step to resume at:
|
|
52
64
|
|
|
@@ -45,11 +45,14 @@ Run the project's lint, type-check, and test commands. Fix any failures before p
|
|
|
45
45
|
- [ ] No debug logging left in?
|
|
46
46
|
- [ ] No suppressed warnings or type-safety bypasses?
|
|
47
47
|
|
|
48
|
-
### Test Coverage
|
|
48
|
+
### Test Coverage (verification strength — not TDD)
|
|
49
49
|
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
- [ ]
|
|
50
|
+
Follow `.cstl/spec/guides/verification-strength-guide.md` for **graded** validation depth by closeout profile. cstl does **not** mandate red-green TDD or per-function unit tests.
|
|
51
|
+
|
|
52
|
+
- [ ] **Lite:** focused validation on touched behavior recorded in `verify.md` (`Validation:` line + result)
|
|
53
|
+
- [ ] **Full:** above + `Check evidence:` + `Reviewed change-set:` when contract requires code-review gate
|
|
54
|
+
- [ ] New function / bug fix → add or update tests **when the project's norms and task scope require it** — not as automatic TDD ceremony
|
|
55
|
+
- [ ] `python ./.cstl/scripts/task.py validate <task>` passing JSONL schema **≠** task acceptance; substantive `verify.md` signals still required
|
|
53
56
|
|
|
54
57
|
### Durable Learning (Phase 3.3)
|
|
55
58
|
|
|
@@ -48,6 +48,7 @@ Look for the `<!-- cstl-hook-injected -->` marker in your input above.
|
|
|
48
48
|
|
|
49
49
|
Before checking, read:
|
|
50
50
|
- `.cstl/spec/` - Development guidelines
|
|
51
|
+
- `.cstl/spec/guides/verification-strength-guide.md` - Graded verify depth (Lite/Full/Parent; not TDD)
|
|
51
52
|
- Task `prd.md` - Requirements document
|
|
52
53
|
- Task `design.md` - Technical design (if exists)
|
|
53
54
|
- Task `implement.md` - Execution plan (if exists)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expected-rules.d.ts","sourceRoot":"","sources":["../../../../src/templates/cursor/fixtures/expected-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"expected-rules.d.ts","sourceRoot":"","sources":["../../../../src/templates/cursor/fixtures/expected-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,EAAE,YAAY,EA8BvC,CAAC"}
|
|
@@ -19,7 +19,7 @@ export const expectedRules = [
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
filename: "retrieval-routing.mdc",
|
|
22
|
-
requiredSections: ["Native", "BYOK", "codegraph", "smart-search"],
|
|
22
|
+
requiredSections: ["Prefer", "Adapt", "Own", "Native", "BYOK", "codegraph", "smart-search"],
|
|
23
23
|
minBytes: 600,
|
|
24
24
|
},
|
|
25
25
|
{
|
|
@@ -27,5 +27,10 @@ export const expectedRules = [
|
|
|
27
27
|
requiredSections: ["rename_chat", "select", "start-execution", "skip silently"],
|
|
28
28
|
minBytes: 300,
|
|
29
29
|
},
|
|
30
|
+
{
|
|
31
|
+
filename: "cstl-cursor-modes.mdc",
|
|
32
|
+
requiredSections: ["Prefer Cursor native modes", "Quick routing", "Hard boundaries", "Rollback"],
|
|
33
|
+
minBytes: 400,
|
|
34
|
+
},
|
|
30
35
|
];
|
|
31
36
|
//# sourceMappingURL=expected-rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expected-rules.js","sourceRoot":"","sources":["../../../../src/templates/cursor/fixtures/expected-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C;QACE,QAAQ,EAAE,iBAAiB;QAC3B,gBAAgB,EAAE;YAChB,eAAe;YACf,qBAAqB;YACrB,cAAc;SACf;QACD,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,4BAA4B;QACtC,gBAAgB,EAAE,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;QAChE,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,uBAAuB;QACjC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"expected-rules.js","sourceRoot":"","sources":["../../../../src/templates/cursor/fixtures/expected-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C;QACE,QAAQ,EAAE,iBAAiB;QAC3B,gBAAgB,EAAE;YAChB,eAAe;YACf,qBAAqB;YACrB,cAAc;SACf;QACD,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,4BAA4B;QACtC,gBAAgB,EAAE,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;QAChE,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,uBAAuB;QACjC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC;QAC3F,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,yBAAyB;QACnC,gBAAgB,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,CAAC;QAC/E,QAAQ,EAAE,GAAG;KACd;IACD;QACE,QAAQ,EAAE,uBAAuB;QACjC,gBAAgB,EAAE,CAAC,4BAA4B,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,CAAC;QAChG,QAAQ,EAAE,GAAG;KACd;CACF,CAAC"}
|