@blxzer/cursor-trellis 0.3.4 → 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.
Files changed (210) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +13 -13
  3. package/README.zh-CN.md +1 -1
  4. package/bin/cstl.js +1 -1
  5. package/bin/smart-search.js +1 -1
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +17 -2
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/commands/campaign/canvas-render.d.ts +68 -0
  10. package/dist/commands/campaign/canvas-render.d.ts.map +1 -0
  11. package/dist/commands/campaign/canvas-render.js +414 -0
  12. package/dist/commands/campaign/canvas-render.js.map +1 -0
  13. package/dist/commands/campaign/compose.d.ts +15 -0
  14. package/dist/commands/campaign/compose.d.ts.map +1 -0
  15. package/dist/commands/campaign/compose.js +110 -0
  16. package/dist/commands/campaign/compose.js.map +1 -0
  17. package/dist/commands/campaign/index.d.ts +13 -0
  18. package/dist/commands/campaign/index.d.ts.map +1 -0
  19. package/dist/commands/campaign/index.js +134 -0
  20. package/dist/commands/campaign/index.js.map +1 -0
  21. package/dist/commands/campaign/kind-map.d.ts +6 -0
  22. package/dist/commands/campaign/kind-map.d.ts.map +1 -0
  23. package/dist/commands/campaign/kind-map.js +21 -0
  24. package/dist/commands/campaign/kind-map.js.map +1 -0
  25. package/dist/commands/campaign/mcp-server.d.ts +6 -0
  26. package/dist/commands/campaign/mcp-server.d.ts.map +1 -0
  27. package/dist/commands/campaign/mcp-server.js +167 -0
  28. package/dist/commands/campaign/mcp-server.js.map +1 -0
  29. package/dist/commands/campaign/render.d.ts +5 -0
  30. package/dist/commands/campaign/render.d.ts.map +1 -0
  31. package/dist/commands/campaign/render.js +103 -0
  32. package/dist/commands/campaign/render.js.map +1 -0
  33. package/dist/commands/campaign/trellis-load.d.ts +13 -0
  34. package/dist/commands/campaign/trellis-load.d.ts.map +1 -0
  35. package/dist/commands/campaign/trellis-load.js +122 -0
  36. package/dist/commands/campaign/trellis-load.js.map +1 -0
  37. package/dist/commands/campaign/types.d.ts +61 -0
  38. package/dist/commands/campaign/types.d.ts.map +1 -0
  39. package/dist/commands/campaign/types.js +3 -0
  40. package/dist/commands/campaign/types.js.map +1 -0
  41. package/dist/commands/goal/index.d.ts +3 -0
  42. package/dist/commands/goal/index.d.ts.map +1 -0
  43. package/dist/commands/goal/index.js +159 -0
  44. package/dist/commands/goal/index.js.map +1 -0
  45. package/dist/commands/goal/review.d.ts +6 -0
  46. package/dist/commands/goal/review.d.ts.map +1 -0
  47. package/dist/commands/goal/review.js +28 -0
  48. package/dist/commands/goal/review.js.map +1 -0
  49. package/dist/commands/init.d.ts.map +1 -1
  50. package/dist/commands/init.js +11 -1
  51. package/dist/commands/init.js.map +1 -1
  52. package/dist/commands/rpc/client.d.ts +51 -0
  53. package/dist/commands/rpc/client.d.ts.map +1 -0
  54. package/dist/commands/rpc/client.js +147 -0
  55. package/dist/commands/rpc/client.js.map +1 -0
  56. package/dist/commands/rpc/index.d.ts +10 -0
  57. package/dist/commands/rpc/index.d.ts.map +1 -0
  58. package/dist/commands/rpc/index.js +157 -0
  59. package/dist/commands/rpc/index.js.map +1 -0
  60. package/dist/commands/rpc/serve.d.ts +23 -0
  61. package/dist/commands/rpc/serve.d.ts.map +1 -0
  62. package/dist/commands/rpc/serve.js +60 -0
  63. package/dist/commands/rpc/serve.js.map +1 -0
  64. package/dist/commands/rpc/smoke.d.ts +16 -0
  65. package/dist/commands/rpc/smoke.d.ts.map +1 -0
  66. package/dist/commands/rpc/smoke.js +92 -0
  67. package/dist/commands/rpc/smoke.js.map +1 -0
  68. package/dist/commands/sdk/index.d.ts +9 -0
  69. package/dist/commands/sdk/index.d.ts.map +1 -0
  70. package/dist/commands/sdk/index.js +58 -0
  71. package/dist/commands/sdk/index.js.map +1 -0
  72. package/dist/commands/sdk/run.d.ts +42 -0
  73. package/dist/commands/sdk/run.d.ts.map +1 -0
  74. package/dist/commands/sdk/run.js +220 -0
  75. package/dist/commands/sdk/run.js.map +1 -0
  76. package/dist/commands/sdk/status.d.ts +14 -0
  77. package/dist/commands/sdk/status.d.ts.map +1 -0
  78. package/dist/commands/sdk/status.js +69 -0
  79. package/dist/commands/sdk/status.js.map +1 -0
  80. package/dist/configurators/workflow.d.ts.map +1 -1
  81. package/dist/configurators/workflow.js +13 -1
  82. package/dist/configurators/workflow.js.map +1 -1
  83. package/dist/goal/action-packet.d.ts +89 -0
  84. package/dist/goal/action-packet.d.ts.map +1 -0
  85. package/dist/goal/action-packet.js +113 -0
  86. package/dist/goal/action-packet.js.map +1 -0
  87. package/dist/goal/audit.d.ts +14 -0
  88. package/dist/goal/audit.d.ts.map +1 -0
  89. package/dist/goal/audit.js +12 -0
  90. package/dist/goal/audit.js.map +1 -0
  91. package/dist/goal/constants.d.ts +26 -0
  92. package/dist/goal/constants.d.ts.map +1 -0
  93. package/dist/goal/constants.js +24 -0
  94. package/dist/goal/constants.js.map +1 -0
  95. package/dist/goal/paths.d.ts +8 -0
  96. package/dist/goal/paths.d.ts.map +1 -0
  97. package/dist/goal/paths.js +36 -0
  98. package/dist/goal/paths.js.map +1 -0
  99. package/dist/goal/preflight.d.ts +21 -0
  100. package/dist/goal/preflight.d.ts.map +1 -0
  101. package/dist/goal/preflight.js +97 -0
  102. package/dist/goal/preflight.js.map +1 -0
  103. package/dist/goal/review-seam.d.ts +44 -0
  104. package/dist/goal/review-seam.d.ts.map +1 -0
  105. package/dist/goal/review-seam.js +153 -0
  106. package/dist/goal/review-seam.js.map +1 -0
  107. package/dist/goal/reviewer-rules.d.ts +13 -0
  108. package/dist/goal/reviewer-rules.d.ts.map +1 -0
  109. package/dist/goal/reviewer-rules.js +153 -0
  110. package/dist/goal/reviewer-rules.js.map +1 -0
  111. package/dist/goal/reviewer.d.ts +9 -0
  112. package/dist/goal/reviewer.d.ts.map +1 -0
  113. package/dist/goal/reviewer.js +54 -0
  114. package/dist/goal/reviewer.js.map +1 -0
  115. package/dist/goal/runtime.d.ts +32 -0
  116. package/dist/goal/runtime.d.ts.map +1 -0
  117. package/dist/goal/runtime.js +242 -0
  118. package/dist/goal/runtime.js.map +1 -0
  119. package/dist/goal/sdk-client.d.ts +10 -0
  120. package/dist/goal/sdk-client.d.ts.map +1 -0
  121. package/dist/goal/sdk-client.js +34 -0
  122. package/dist/goal/sdk-client.js.map +1 -0
  123. package/dist/goal/state.d.ts +40 -0
  124. package/dist/goal/state.d.ts.map +1 -0
  125. package/dist/goal/state.js +37 -0
  126. package/dist/goal/state.js.map +1 -0
  127. package/dist/goal/task-triggers.d.ts +15 -0
  128. package/dist/goal/task-triggers.d.ts.map +1 -0
  129. package/dist/goal/task-triggers.js +23 -0
  130. package/dist/goal/task-triggers.js.map +1 -0
  131. package/dist/goal/walls.d.ts +12 -0
  132. package/dist/goal/walls.d.ts.map +1 -0
  133. package/dist/goal/walls.js +65 -0
  134. package/dist/goal/walls.js.map +1 -0
  135. package/dist/goal/worker-prompt.d.ts +13 -0
  136. package/dist/goal/worker-prompt.d.ts.map +1 -0
  137. package/dist/goal/worker-prompt.js +41 -0
  138. package/dist/goal/worker-prompt.js.map +1 -0
  139. package/dist/goal/worker.d.ts +42 -0
  140. package/dist/goal/worker.d.ts.map +1 -0
  141. package/dist/goal/worker.js +180 -0
  142. package/dist/goal/worker.js.map +1 -0
  143. package/dist/migrations/manifests/0.3.5.json +9 -0
  144. package/dist/migrations/manifests/0.3.6.json +9 -0
  145. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +35 -29
  146. package/dist/templates/common/bundled-skills/smart-search-cli/references/cli-contract.md +11 -25
  147. package/dist/templates/common/commands/continue.md +15 -3
  148. package/dist/templates/common/skills/check.md +7 -4
  149. package/dist/templates/cursor/agents/cstl-check.md +1 -0
  150. package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +1 -1
  151. package/dist/templates/cursor/fixtures/expected-rules.js +6 -1
  152. package/dist/templates/cursor/fixtures/expected-rules.js.map +1 -1
  153. package/dist/templates/cursor/rules/cstl-cursor-modes.mdc +32 -0
  154. package/dist/templates/cursor/rules/cstl-triage.mdc +2 -4
  155. package/dist/templates/cursor/rules/retrieval-routing.mdc +26 -7
  156. package/dist/templates/markdown/agents.md +2 -0
  157. package/dist/templates/markdown/index.d.ts +3 -0
  158. package/dist/templates/markdown/index.d.ts.map +1 -1
  159. package/dist/templates/markdown/index.js +3 -0
  160. package/dist/templates/markdown/index.js.map +1 -1
  161. package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +38 -21
  162. package/dist/templates/markdown/spec/guides/cursor-native-modes-guide.md.txt +125 -0
  163. package/dist/templates/markdown/spec/guides/index.md.txt +107 -104
  164. package/dist/templates/markdown/spec/guides/injection-budget-guide.md.txt +111 -0
  165. package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +38 -6
  166. package/dist/templates/markdown/spec/guides/verification-strength-guide.md.txt +184 -0
  167. package/dist/templates/shared-hooks/session-start.py +10 -0
  168. package/dist/templates/trellis/config.yaml +18 -0
  169. package/dist/templates/trellis/index.d.ts +5 -0
  170. package/dist/templates/trellis/index.d.ts.map +1 -1
  171. package/dist/templates/trellis/index.js +14 -0
  172. package/dist/templates/trellis/index.js.map +1 -1
  173. package/dist/templates/trellis/scripts/common/artifact_locale.py +278 -0
  174. package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +51 -2
  175. package/dist/templates/trellis/scripts/common/config.py +39 -0
  176. package/dist/templates/trellis/scripts/common/injection_budget.py +317 -0
  177. package/dist/templates/trellis/scripts/common/parent_orchestration.py +500 -5
  178. package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +9 -3
  179. package/dist/templates/trellis/scripts/common/session_context.py +32 -4
  180. package/dist/templates/trellis/scripts/common/session_memory.py +26 -0
  181. package/dist/templates/trellis/scripts/common/subagent_dispatch.py +74 -9
  182. package/dist/templates/trellis/scripts/common/task_context.py +18 -0
  183. package/dist/templates/trellis/scripts/common/task_dashboard.py +16 -1
  184. package/dist/templates/trellis/scripts/common/task_map.py +670 -614
  185. package/dist/templates/trellis/scripts/common/task_store.py +191 -40
  186. package/dist/templates/trellis/scripts/common/test_observable_defaults.py +135 -0
  187. package/dist/templates/trellis/scripts/cursor_retrieval_probe_prompt.md +14 -12
  188. package/dist/templates/trellis/scripts/generate_dispatch_prompt.py +182 -0
  189. package/dist/templates/trellis/scripts/injection_budget_probe.py +69 -0
  190. package/dist/templates/trellis/scripts/retrieval_probe_matrix_template.json +3 -3
  191. package/dist/templates/trellis/scripts/spec_health_outcomes.py +160 -0
  192. package/dist/templates/trellis/scripts/task.py +51 -0
  193. package/dist/templates/trellis/tasks/locale/en/default-prd.md +19 -0
  194. package/dist/templates/trellis/tasks/locale/zh/default-prd.md +19 -0
  195. package/dist/templates/trellis/workflow.md +23 -3
  196. package/dist/utils/codebase-retrieval-router.d.ts.map +1 -1
  197. package/dist/utils/codebase-retrieval-router.js +14 -0
  198. package/dist/utils/codebase-retrieval-router.js.map +1 -1
  199. package/dist/utils/cursor-sdk-gate.d.ts +10 -0
  200. package/dist/utils/cursor-sdk-gate.d.ts.map +1 -0
  201. package/dist/utils/cursor-sdk-gate.js +32 -0
  202. package/dist/utils/cursor-sdk-gate.js.map +1 -0
  203. package/dist/utils/project-capabilities.d.ts +30 -3
  204. package/dist/utils/project-capabilities.d.ts.map +1 -1
  205. package/dist/utils/project-capabilities.js +182 -11
  206. package/dist/utils/project-capabilities.js.map +1 -1
  207. package/dist/utils/readiness.d.ts.map +1 -1
  208. package/dist/utils/readiness.js +26 -0
  209. package/dist/utils/readiness.js.map +1 -1
  210. package/package.json +4 -3
@@ -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
+ }