@blxzer/cursor-trellis 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +13 -0
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +3 -0
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/goal/index.d.ts +3 -0
  7. package/dist/commands/goal/index.d.ts.map +1 -0
  8. package/dist/commands/goal/index.js +159 -0
  9. package/dist/commands/goal/index.js.map +1 -0
  10. package/dist/commands/goal/review.d.ts +6 -0
  11. package/dist/commands/goal/review.d.ts.map +1 -0
  12. package/dist/commands/goal/review.js +28 -0
  13. package/dist/commands/goal/review.js.map +1 -0
  14. package/dist/commands/sdk/run.d.ts.map +1 -1
  15. package/dist/commands/sdk/run.js +2 -27
  16. package/dist/commands/sdk/run.js.map +1 -1
  17. package/dist/commands/update.d.ts.map +1 -1
  18. package/dist/commands/update.js +5 -1
  19. package/dist/commands/update.js.map +1 -1
  20. package/dist/configurators/workflow.d.ts.map +1 -1
  21. package/dist/configurators/workflow.js +51 -2
  22. package/dist/configurators/workflow.js.map +1 -1
  23. package/dist/constants/paths.d.ts +4 -0
  24. package/dist/constants/paths.d.ts.map +1 -1
  25. package/dist/constants/paths.js +4 -0
  26. package/dist/constants/paths.js.map +1 -1
  27. package/dist/goal/action-packet.d.ts +89 -0
  28. package/dist/goal/action-packet.d.ts.map +1 -0
  29. package/dist/goal/action-packet.js +113 -0
  30. package/dist/goal/action-packet.js.map +1 -0
  31. package/dist/goal/audit.d.ts +14 -0
  32. package/dist/goal/audit.d.ts.map +1 -0
  33. package/dist/goal/audit.js +12 -0
  34. package/dist/goal/audit.js.map +1 -0
  35. package/dist/goal/constants.d.ts +26 -0
  36. package/dist/goal/constants.d.ts.map +1 -0
  37. package/dist/goal/constants.js +24 -0
  38. package/dist/goal/constants.js.map +1 -0
  39. package/dist/goal/paths.d.ts +8 -0
  40. package/dist/goal/paths.d.ts.map +1 -0
  41. package/dist/goal/paths.js +36 -0
  42. package/dist/goal/paths.js.map +1 -0
  43. package/dist/goal/preflight.d.ts +21 -0
  44. package/dist/goal/preflight.d.ts.map +1 -0
  45. package/dist/goal/preflight.js +97 -0
  46. package/dist/goal/preflight.js.map +1 -0
  47. package/dist/goal/review-seam.d.ts +44 -0
  48. package/dist/goal/review-seam.d.ts.map +1 -0
  49. package/dist/goal/review-seam.js +153 -0
  50. package/dist/goal/review-seam.js.map +1 -0
  51. package/dist/goal/reviewer-rules.d.ts +13 -0
  52. package/dist/goal/reviewer-rules.d.ts.map +1 -0
  53. package/dist/goal/reviewer-rules.js +153 -0
  54. package/dist/goal/reviewer-rules.js.map +1 -0
  55. package/dist/goal/reviewer.d.ts +9 -0
  56. package/dist/goal/reviewer.d.ts.map +1 -0
  57. package/dist/goal/reviewer.js +54 -0
  58. package/dist/goal/reviewer.js.map +1 -0
  59. package/dist/goal/runtime.d.ts +32 -0
  60. package/dist/goal/runtime.d.ts.map +1 -0
  61. package/dist/goal/runtime.js +242 -0
  62. package/dist/goal/runtime.js.map +1 -0
  63. package/dist/goal/sdk-client.d.ts +10 -0
  64. package/dist/goal/sdk-client.d.ts.map +1 -0
  65. package/dist/goal/sdk-client.js +34 -0
  66. package/dist/goal/sdk-client.js.map +1 -0
  67. package/dist/goal/state.d.ts +40 -0
  68. package/dist/goal/state.d.ts.map +1 -0
  69. package/dist/goal/state.js +37 -0
  70. package/dist/goal/state.js.map +1 -0
  71. package/dist/goal/task-triggers.d.ts +15 -0
  72. package/dist/goal/task-triggers.d.ts.map +1 -0
  73. package/dist/goal/task-triggers.js +23 -0
  74. package/dist/goal/task-triggers.js.map +1 -0
  75. package/dist/goal/walls.d.ts +12 -0
  76. package/dist/goal/walls.d.ts.map +1 -0
  77. package/dist/goal/walls.js +65 -0
  78. package/dist/goal/walls.js.map +1 -0
  79. package/dist/goal/worker-prompt.d.ts +13 -0
  80. package/dist/goal/worker-prompt.d.ts.map +1 -0
  81. package/dist/goal/worker-prompt.js +41 -0
  82. package/dist/goal/worker-prompt.js.map +1 -0
  83. package/dist/goal/worker.d.ts +42 -0
  84. package/dist/goal/worker.d.ts.map +1 -0
  85. package/dist/goal/worker.js +180 -0
  86. package/dist/goal/worker.js.map +1 -0
  87. package/dist/migrations/manifests/0.3.5.json +9 -0
  88. package/dist/migrations/manifests/0.3.6.json +9 -0
  89. package/dist/migrations/manifests/0.4.0.json +9 -0
  90. package/dist/templates/common/commands/continue.md +15 -3
  91. package/dist/templates/common/skills/check.md +7 -4
  92. package/dist/templates/cursor/agents/cstl-check.md +1 -0
  93. package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +1 -1
  94. package/dist/templates/cursor/fixtures/expected-rules.js +6 -1
  95. package/dist/templates/cursor/fixtures/expected-rules.js.map +1 -1
  96. package/dist/templates/cursor/rules/cstl-cursor-modes.mdc +32 -0
  97. package/dist/templates/cursor/rules/cstl-triage.mdc +2 -4
  98. package/dist/templates/cursor/rules/retrieval-routing.mdc +26 -7
  99. package/dist/templates/markdown/index.d.ts +9 -0
  100. package/dist/templates/markdown/index.d.ts.map +1 -1
  101. package/dist/templates/markdown/index.js +9 -0
  102. package/dist/templates/markdown/index.js.map +1 -1
  103. package/dist/templates/markdown/spec/guides/artifact-locale-guide.md.txt +93 -0
  104. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +7 -7
  105. package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +38 -21
  106. package/dist/templates/markdown/spec/guides/cursor-native-modes-guide.md.txt +125 -0
  107. package/dist/templates/markdown/spec/guides/cursor-subagent-policy.md.txt +10 -8
  108. package/dist/templates/markdown/spec/guides/debug-loop-guide.md.txt +227 -0
  109. package/dist/templates/markdown/spec/guides/goal-release-regression-runbook.md.txt +132 -0
  110. package/dist/templates/markdown/spec/guides/index.md.txt +144 -104
  111. package/dist/templates/markdown/spec/guides/injection-budget-guide.md.txt +111 -0
  112. package/dist/templates/markdown/spec/guides/prototype-guide.md.txt +139 -0
  113. package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +28 -6
  114. package/dist/templates/markdown/spec/guides/test-discipline-guide.md.txt +138 -0
  115. package/dist/templates/markdown/spec/guides/verification-strength-guide.md.txt +185 -0
  116. package/dist/templates/shared-hooks/session-start.py +10 -0
  117. package/dist/templates/trellis/config.yaml +18 -0
  118. package/dist/templates/trellis/index.d.ts +17 -0
  119. package/dist/templates/trellis/index.d.ts.map +1 -1
  120. package/dist/templates/trellis/index.js +40 -0
  121. package/dist/templates/trellis/index.js.map +1 -1
  122. package/dist/templates/trellis/pool/README.md +103 -0
  123. package/dist/templates/trellis/pool/items/.gitkeep +0 -0
  124. package/dist/templates/trellis/pool/plan.md +26 -0
  125. package/dist/templates/trellis/scripts/common/artifact_locale.py +278 -0
  126. package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +37 -2
  127. package/dist/templates/trellis/scripts/common/config.py +39 -0
  128. package/dist/templates/trellis/scripts/common/injection_budget.py +317 -0
  129. package/dist/templates/trellis/scripts/common/parent_orchestration.py +161 -5
  130. package/dist/templates/trellis/scripts/common/pool_store.py +702 -0
  131. package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +9 -3
  132. package/dist/templates/trellis/scripts/common/session_context.py +32 -4
  133. package/dist/templates/trellis/scripts/common/session_memory.py +26 -0
  134. package/dist/templates/trellis/scripts/common/subagent_dispatch.py +74 -9
  135. package/dist/templates/trellis/scripts/common/task_context.py +18 -0
  136. package/dist/templates/trellis/scripts/common/task_dashboard.py +24 -1
  137. package/dist/templates/trellis/scripts/common/task_dependencies.py +673 -0
  138. package/dist/templates/trellis/scripts/common/task_gates.py +58 -5
  139. package/dist/templates/trellis/scripts/common/task_map.py +40 -8
  140. package/dist/templates/trellis/scripts/common/task_store.py +400 -39
  141. package/dist/templates/trellis/scripts/common/test_depends_mode_block.py +489 -0
  142. package/dist/templates/trellis/scripts/common/test_observable_defaults.py +135 -0
  143. package/dist/templates/trellis/scripts/common/test_pool_store.py +428 -0
  144. package/dist/templates/trellis/scripts/common/test_task_dependencies.py +345 -0
  145. package/dist/templates/trellis/scripts/cursor_retrieval_probe_prompt.md +14 -12
  146. package/dist/templates/trellis/scripts/generate_dispatch_prompt.py +182 -0
  147. package/dist/templates/trellis/scripts/injection_budget_probe.py +69 -0
  148. package/dist/templates/trellis/scripts/pool.py +192 -0
  149. package/dist/templates/trellis/scripts/retrieval_probe_matrix_template.json +3 -3
  150. package/dist/templates/trellis/scripts/spec_health_outcomes.py +160 -0
  151. package/dist/templates/trellis/scripts/task.py +85 -1
  152. package/dist/templates/trellis/scripts/verify_evidence_probe.py +138 -0
  153. package/dist/templates/trellis/tasks/locale/en/default-prd.md +19 -0
  154. package/dist/templates/trellis/tasks/locale/zh/default-prd.md +19 -0
  155. package/dist/templates/trellis/workflow.md +55 -5
  156. 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
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.4.0",
3
+ "description": "Review pool + task depends_on Plan A/B, workflow/guides alignment",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**@blxzer/cursor-trellis 0.4.0**\n\n- feat(pool): `.cstl/pool/` skeleton + `pool.py` validate/link/plan-check\n- feat(deps): `set-deps` / `set-depends-mode` / `--ignore-deps` (Plan A warn / Plan B block)\n- feat(verify): ship `verify_evidence_probe.py`\n- docs: workflow pool boundary + depends; guides (locale/debug/prototype/test/runbook)\n- chore: empty migrations list (template sync via `cstl update`)",
7
+ "migrations": [],
8
+ "notes": "Run `cstl update` to sync scripts/workflow/pool skeleton. No `--migrate` required. Pool items remain user data."
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: Load the Phase Index
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 3: Decide Where You Are
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 4: Load the Specific 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
- - [ ] New function unit test added?
51
- - [ ] Bug fix → regression test added?
52
- - [ ] Changed behavior existing tests updated?
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,EAyBvC,CAAC"}
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;QACjE,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;CACF,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"}