@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 @@
1
+ {"version":3,"file":"action-packet.d.ts","sourceRoot":"","sources":["../../src/goal/action-packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mDAAmD;AACnD,eAAO,MAAM,iCAAiC,EAAG,CAAU,CAAC;AAE5D,eAAO,MAAM,aAAa,qDAOhB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,gBAAgB,uFAKnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,QAAA,MAAM,UAAU;;;;iBAId,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;iBAWjC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBnC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAClD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAEtE;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAStF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAM1E;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAepD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAKrE;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAc1F"}
@@ -0,0 +1,113 @@
1
+ import { z } from "zod";
2
+ /** Parent lock v0 — shared with reviewer Child. */
3
+ export const GOAL_ACTION_PACKET_SCHEMA_VERSION = 1;
4
+ export const HARD_DENY_IDS = [
5
+ "H-1",
6
+ "H-2",
7
+ "H-3",
8
+ "H-4",
9
+ "H-5",
10
+ "H-6",
11
+ ];
12
+ export const REVIEW_DECISIONS = [
13
+ "allow",
14
+ "allow_with_constraints",
15
+ "deny_suggest_alternative",
16
+ "uncertain",
17
+ ];
18
+ const axesSchema = z.object({
19
+ A: z.boolean(),
20
+ B: z.boolean(),
21
+ C: z.boolean(),
22
+ });
23
+ export const goalActionPacketSchema = z.object({
24
+ schema_version: z.literal(GOAL_ACTION_PACKET_SCHEMA_VERSION),
25
+ goal_id: z.string().min(1),
26
+ task_dir: z.string().nullable().optional(),
27
+ proposed_action: z.string().min(1),
28
+ action_kind: z.string().min(1),
29
+ axes: axesSchema,
30
+ hard_deny_candidates: z.array(z.string()),
31
+ done_when_ref: z.string().min(1),
32
+ diff_or_cmd_digest: z.string().min(1),
33
+ constraints_hint: z.string().nullable().optional(),
34
+ });
35
+ export const goalReviewDecisionSchema = z.object({
36
+ schema_version: z.literal(GOAL_ACTION_PACKET_SCHEMA_VERSION),
37
+ decision: z.enum(REVIEW_DECISIONS),
38
+ axes: axesSchema,
39
+ hard_deny_hit: z.string().nullable(),
40
+ constraints: z.array(z.string()).optional(),
41
+ alternative: z.string().nullable().optional(),
42
+ rationale: z.string().min(1),
43
+ l1_ready: z.object({
44
+ time: z.string().min(1),
45
+ action: z.string().min(1),
46
+ axes: axesSchema,
47
+ reviewer: z.string().min(1),
48
+ decision: z.string().min(1),
49
+ rollback_hint: z.string().min(1),
50
+ }),
51
+ h3_allowed: z.boolean().optional(),
52
+ valid: z.boolean().optional(),
53
+ invalid_reason: z.string().optional(),
54
+ });
55
+ export function parseGoalActionPacket(input) {
56
+ return goalActionPacketSchema.parse(input);
57
+ }
58
+ export function safeParseGoalActionPacket(input) {
59
+ const parsed = goalActionPacketSchema.safeParse(input);
60
+ if (!parsed.success) {
61
+ return {
62
+ valid: false,
63
+ invalid_reason: parsed.error.issues.map((i) => i.message).join("; "),
64
+ };
65
+ }
66
+ return { valid: true, packet: parsed.data };
67
+ }
68
+ export function parseGoalReviewDecision(input) {
69
+ const parsed = goalReviewDecisionSchema.parse(input);
70
+ if (parsed.hard_deny_hit != null && parsed.h3_allowed === true) {
71
+ throw new Error("invalid decision: hard_deny_hit set but h3_allowed is true");
72
+ }
73
+ return parsed;
74
+ }
75
+ export function isValidReviewDecision(decision) {
76
+ if (decision.valid === false) {
77
+ return { valid: false, reason: decision.invalid_reason ?? "marked invalid" };
78
+ }
79
+ const l1 = decision.l1_ready;
80
+ if (!l1.time || !l1.action || !l1.reviewer || !l1.decision || !l1.rollback_hint) {
81
+ return { valid: false, reason: "incomplete l1_ready" };
82
+ }
83
+ if (!decision.decision || !decision.axes) {
84
+ return { valid: false, reason: "missing decision or axes" };
85
+ }
86
+ if (decision.hard_deny_hit != null && decision.h3_allowed === true) {
87
+ return { valid: false, reason: "hard_deny_hit set but h3_allowed is true" };
88
+ }
89
+ return { valid: true };
90
+ }
91
+ export function deriveH3Allowed(decision) {
92
+ if (decision.hard_deny_hit != null) {
93
+ return false;
94
+ }
95
+ return decision.decision === "uncertain";
96
+ }
97
+ export function validateGoalReviewDecision(input) {
98
+ try {
99
+ const decision = parseGoalReviewDecision(input);
100
+ const check = isValidReviewDecision(decision);
101
+ if (!check.valid) {
102
+ return { valid: false, invalid_reason: check.reason };
103
+ }
104
+ return { valid: true, decision };
105
+ }
106
+ catch (error) {
107
+ return {
108
+ valid: false,
109
+ invalid_reason: error instanceof Error ? error.message : String(error),
110
+ };
111
+ }
112
+ }
113
+ //# sourceMappingURL=action-packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-packet.js","sourceRoot":"","sources":["../../src/goal/action-packet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mDAAmD;AACnD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAU,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACG,CAAC;AAIX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO;IACP,wBAAwB;IACxB,0BAA0B;IAC1B,WAAW;CACH,CAAC;AAIX,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;IACd,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;IACd,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC;IAC5D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,UAAU;IAChB,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC;IAC5D,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAClC,IAAI,EAAE,UAAU;IAChB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KACjC,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAMH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAc;IAEd,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAA4B;IAE5B,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAAC;IAC/E,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAChF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACnE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA4B;IAC1D,IAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACvE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function appendAuditLine(cwd: string, goalId: string, layer: "L0" | "L1" | "L2", line: string): void;
2
+ export declare function formatL1Line(l1: {
3
+ time: string;
4
+ action: string;
5
+ axes: {
6
+ A: boolean;
7
+ B: boolean;
8
+ C: boolean;
9
+ };
10
+ reviewer: string;
11
+ decision: string;
12
+ rollback_hint: string;
13
+ }): string;
14
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/goal/audit.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,GACX,IAAI,CAKN;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAET"}
@@ -0,0 +1,12 @@
1
+ import fs from "node:fs";
2
+ import { goalAuditPath } from "./paths.js";
3
+ export function appendAuditLine(cwd, goalId, layer, line) {
4
+ const file = goalAuditPath(cwd, goalId);
5
+ fs.mkdirSync(file.replace(/[/\\][^/\\]+$/, ""), { recursive: true });
6
+ const stamp = new Date().toISOString();
7
+ fs.appendFileSync(file, `[${stamp}] ${layer} ${line}\n`, "utf-8");
8
+ }
9
+ export function formatL1Line(l1) {
10
+ return JSON.stringify(l1);
11
+ }
12
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/goal/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,MAAc,EACd,KAAyB,EACzB,IAAY;IAEZ,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAO5B;IACC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** Frozen MVP wall defaults (runtime Child design §8). */
2
+ export declare const GOAL_WALL_DEFAULTS: {
3
+ readonly runner: {
4
+ readonly wallClockSeconds: number;
5
+ readonly noProgressSeconds: number;
6
+ readonly noProgressRounds: 3;
7
+ readonly workerTurnLimit: 12;
8
+ readonly totalTurnLimit: 24;
9
+ readonly workerTurnTimeoutMs: number;
10
+ readonly maxReroutes: 3;
11
+ readonly maxReviewRetries: 2;
12
+ };
13
+ readonly window: {
14
+ readonly wallClockSeconds: number;
15
+ readonly noProgressSeconds: number;
16
+ readonly noProgressRounds: 3;
17
+ readonly workerTurnLimit: 8;
18
+ readonly totalTurnLimit: 16;
19
+ readonly workerTurnTimeoutMs: number;
20
+ readonly maxReroutes: 3;
21
+ readonly maxReviewRetries: 2;
22
+ };
23
+ };
24
+ export type GoalRunMode = keyof typeof GOAL_WALL_DEFAULTS;
25
+ export type GoalLifecycleState = "draft" | "preflight_pending" | "running" | "paused" | "completed" | "crashed";
26
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/goal/constants.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;CAqBrB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,WAAW,GACX,SAAS,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** Frozen MVP wall defaults (runtime Child design §8). */
2
+ export const GOAL_WALL_DEFAULTS = {
3
+ runner: {
4
+ wallClockSeconds: 3 * 60 * 60,
5
+ noProgressSeconds: 20 * 60,
6
+ noProgressRounds: 3,
7
+ workerTurnLimit: 12,
8
+ totalTurnLimit: 24,
9
+ workerTurnTimeoutMs: 30 * 60 * 1000,
10
+ maxReroutes: 3,
11
+ maxReviewRetries: 2,
12
+ },
13
+ window: {
14
+ wallClockSeconds: 45 * 60,
15
+ noProgressSeconds: 20 * 60,
16
+ noProgressRounds: 3,
17
+ workerTurnLimit: 8,
18
+ totalTurnLimit: 16,
19
+ workerTurnTimeoutMs: 15 * 60 * 1000,
20
+ maxReroutes: 3,
21
+ maxReviewRetries: 2,
22
+ },
23
+ };
24
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/goal/constants.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE;QACN,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;QAC7B,iBAAiB,EAAE,EAAE,GAAG,EAAE;QAC1B,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,EAAE;QACnB,cAAc,EAAE,EAAE;QAClB,mBAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACnC,WAAW,EAAE,CAAC;QACd,gBAAgB,EAAE,CAAC;KACpB;IACD,MAAM,EAAE;QACN,gBAAgB,EAAE,EAAE,GAAG,EAAE;QACzB,iBAAiB,EAAE,EAAE,GAAG,EAAE;QAC1B,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,EAAE;QAClB,mBAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACnC,WAAW,EAAE,CAAC;QACd,gBAAgB,EAAE,CAAC;KACpB;CACO,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function newGoalId(now?: Date): string;
2
+ export declare function goalRunsRoot(cwd: string): string;
3
+ export declare function goalRunDir(cwd: string, goalId: string): string;
4
+ export declare function ensureGoalRunDir(cwd: string, goalId: string): string;
5
+ export declare function goalStatePath(cwd: string, goalId: string): string;
6
+ export declare function goalContractPath(cwd: string, goalId: string): string;
7
+ export declare function goalAuditPath(cwd: string, goalId: string): string;
8
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/goal/paths.ts"],"names":[],"mappings":"AAOA,wBAAgB,SAAS,CAAC,GAAG,OAAa,GAAG,MAAM,CAIlD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,36 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { randomBytes } from "node:crypto";
4
+ import { DIR_NAMES } from "../constants/paths.js";
5
+ import { workflowPath } from "../utils/workflow-dir.js";
6
+ export function newGoalId(now = new Date()) {
7
+ const ymd = now.toISOString().slice(0, 10).replace(/-/g, "");
8
+ const short = randomBytes(3).toString("hex");
9
+ return `goal-${ymd}-${short}`;
10
+ }
11
+ export function goalRunsRoot(cwd) {
12
+ const root = workflowPath(cwd, DIR_NAMES.WORKSPACE, "goal-runs");
13
+ if (!root) {
14
+ throw new Error("Trellis workflow not initialized (.cstl missing)");
15
+ }
16
+ return root;
17
+ }
18
+ export function goalRunDir(cwd, goalId) {
19
+ return path.join(goalRunsRoot(cwd), goalId);
20
+ }
21
+ export function ensureGoalRunDir(cwd, goalId) {
22
+ const dir = goalRunDir(cwd, goalId);
23
+ fs.mkdirSync(dir, { recursive: true });
24
+ fs.mkdirSync(path.join(dir, "packets"), { recursive: true });
25
+ return dir;
26
+ }
27
+ export function goalStatePath(cwd, goalId) {
28
+ return path.join(goalRunDir(cwd, goalId), "state.json");
29
+ }
30
+ export function goalContractPath(cwd, goalId) {
31
+ return path.join(goalRunDir(cwd, goalId), "contract.md");
32
+ }
33
+ export function goalAuditPath(cwd, goalId) {
34
+ return path.join(goalRunDir(cwd, goalId), "audit.log");
35
+ }
36
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/goal/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,SAAS,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IACxC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAc;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAc;IAC1D,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAc;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAc;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAc;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { GoalRunMode } from "./constants.js";
2
+ export interface PreflightProposal {
3
+ ok: true;
4
+ doneWhen: string[];
5
+ evidenceHow: string;
6
+ mode: GoalRunMode;
7
+ modeNotice: string;
8
+ }
9
+ export interface PreflightRejection {
10
+ ok: false;
11
+ reason: string;
12
+ }
13
+ export type PreflightResult = PreflightProposal | PreflightRejection;
14
+ export declare function detectRunMode(opts: {
15
+ forceWindow?: boolean;
16
+ runnerAvailable?: boolean;
17
+ }): GoalRunMode;
18
+ export declare function modeNotice(mode: GoalRunMode): string;
19
+ export declare function proposePreflight(goalText: string, mode: GoalRunMode): PreflightResult;
20
+ export declare function renderContractMarkdown(proposal: PreflightProposal, goalText: string): string;
21
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/goal/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAIrE,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,WAAW,CAId;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAWpD;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,GAChB,eAAe,CAiCjB;AAgCD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqB5F"}
@@ -0,0 +1,97 @@
1
+ const VAGUE_GOAL = /^(do it|fix|help|something|todo)$/i;
2
+ export function detectRunMode(opts) {
3
+ if (opts.forceWindow)
4
+ return "window";
5
+ if (opts.runnerAvailable === false)
6
+ return "window";
7
+ return "runner";
8
+ }
9
+ export function modeNotice(mode) {
10
+ if (mode === "window") {
11
+ return ("**窗内模式:** 关闭本聊天窗口将立即停止 goal 运行。默认墙钟上限 **45 分钟**。" +
12
+ "长跑请使用 CLI runner(`cstl goal run`)。");
13
+ }
14
+ return ("**Runner 模式:** goal 由后台 runner 调度 subagent(`@cursor/sdk`,需当前进程配置 `CURSOR_API_KEY`)," +
15
+ "主窗可用于查看状态与接手。默认墙钟上限 **3 小时**。无密钥时请使用 `--mock-worker` 或窗内模式。");
16
+ }
17
+ export function proposePreflight(goalText, mode) {
18
+ const trimmed = goalText.trim();
19
+ if (trimmed.length < 8 || VAGUE_GOAL.test(trimmed)) {
20
+ return {
21
+ ok: false,
22
+ reason: "Goal too vague — write a concrete objective (cannot derive done_when).",
23
+ };
24
+ }
25
+ const doneWhen = deriveDoneWhen(trimmed);
26
+ if (doneWhen.length === 0) {
27
+ return {
28
+ ok: false,
29
+ reason: "Cannot derive 1–3 observable done_when items — refine the goal.",
30
+ };
31
+ }
32
+ const evidenceHow = deriveEvidenceHow(trimmed, doneWhen);
33
+ if (!evidenceHow.trim()) {
34
+ return {
35
+ ok: false,
36
+ reason: "Cannot derive evidence_how — specify how completion will be proven.",
37
+ };
38
+ }
39
+ return {
40
+ ok: true,
41
+ doneWhen,
42
+ evidenceHow,
43
+ mode,
44
+ modeNotice: modeNotice(mode),
45
+ };
46
+ }
47
+ function deriveDoneWhen(goalText) {
48
+ const sentences = goalText
49
+ .split(/[.;。\n]/)
50
+ .map((s) => s.trim())
51
+ .filter((s) => s.length > 6);
52
+ if (sentences.length >= 2) {
53
+ return sentences.slice(0, 3).map((s) => `When: ${s}`);
54
+ }
55
+ return [
56
+ `When: ${goalText.trim()} is implemented and verifiable`,
57
+ "When: focused tests or validation commands for touched behavior pass",
58
+ ].slice(0, 3);
59
+ }
60
+ function deriveEvidenceHow(goalText, doneWhen) {
61
+ const lower = goalText.toLowerCase();
62
+ const parts = [];
63
+ if (/test|vitest|pytest/.test(lower)) {
64
+ parts.push("Run focused test suite; capture pass output in verify.md");
65
+ }
66
+ else if (/doc|readme|markdown/.test(lower)) {
67
+ parts.push("Link or cite updated markdown paths in verify.md");
68
+ }
69
+ else {
70
+ parts.push("Run validation commands listed in implement.md; capture output");
71
+ }
72
+ parts.push(`Map each done_when item: ${doneWhen.join(" | ")}`);
73
+ return parts.join("; ");
74
+ }
75
+ export function renderContractMarkdown(proposal, goalText) {
76
+ const items = proposal.doneWhen.map((d, i) => `${i + 1}. ${d}`).join("\n");
77
+ return [
78
+ "# cstl-goal contract",
79
+ "",
80
+ "## Goal",
81
+ goalText.trim(),
82
+ "",
83
+ "## done_when",
84
+ items,
85
+ "",
86
+ "## evidence_how",
87
+ proposal.evidenceHow,
88
+ "",
89
+ "## mode",
90
+ proposal.mode,
91
+ "",
92
+ "## mode_notice",
93
+ proposal.modeNotice,
94
+ "",
95
+ ].join("\n");
96
+ }
97
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/goal/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { GoalActionPacket, GoalReviewDecision } from "./action-packet.js";
2
+ import type { GoalState } from "./state.js";
3
+ export interface ProposedAction {
4
+ summary: string;
5
+ kind: string;
6
+ digest: string;
7
+ axes: {
8
+ A: boolean;
9
+ B: boolean;
10
+ C: boolean;
11
+ };
12
+ hardDenyCandidates: string[];
13
+ constraintsHint?: string | null;
14
+ }
15
+ export type ReviewCaller = (packetPath: string) => Promise<GoalReviewDecision>;
16
+ export declare function packAction(state: GoalState, action: ProposedAction): GoalActionPacket;
17
+ export declare function writePacketFiles(cwd: string, goalId: string, seq: number, packet: GoalActionPacket, response?: GoalReviewDecision): {
18
+ requestPath: string;
19
+ responsePath?: string;
20
+ };
21
+ export type ApplyDecisionResult = {
22
+ action: "execute";
23
+ constraints: string[];
24
+ } | {
25
+ action: "h3_continue";
26
+ } | {
27
+ action: "reroute";
28
+ alternative: string | null;
29
+ } | {
30
+ action: "crash_wall";
31
+ reason: string;
32
+ } | {
33
+ action: "retry_review";
34
+ reason: string;
35
+ };
36
+ export declare function applyReviewDecision(state: GoalState, packet: GoalActionPacket, decision: GoalReviewDecision, rerouteKey: string): {
37
+ state: GoalState;
38
+ result: ApplyDecisionResult;
39
+ };
40
+ export declare function recordL1(cwd: string, goalId: string, decision: GoalReviewDecision): void;
41
+ export declare function recordL2(cwd: string, goalId: string, reason: string): void;
42
+ /** MVP fallback when reviewer Child CLI is not yet available. */
43
+ export declare function minimalReviewFallback(packet: GoalActionPacket): GoalReviewDecision;
44
+ //# sourceMappingURL=review-seam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-seam.d.ts","sourceRoot":"","sources":["../../src/goal/review-seam.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAQ/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE/E,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,GACrB,gBAAgB,CAkBlB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,gBAAgB,EACxB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAShD;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAsCnD;AAkCD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,kBAAkB,GAC3B,IAAI,CAEN;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,CAoDlF"}
@@ -0,0 +1,153 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isValidReviewDecision, parseGoalActionPacket, parseGoalReviewDecision, } from "./action-packet.js";
4
+ import { appendAuditLine, formatL1Line } from "./audit.js";
5
+ import { goalRunDir } from "./paths.js";
6
+ export function packAction(state, action) {
7
+ const doneRef = state.contract?.doneWhen?.[0] ??
8
+ state.goal_text.slice(0, 120) ??
9
+ "active stop condition";
10
+ return parseGoalActionPacket({
11
+ schema_version: 1,
12
+ goal_id: state.goal_id,
13
+ task_dir: state.task_dir,
14
+ proposed_action: action.summary,
15
+ action_kind: action.kind,
16
+ axes: action.axes,
17
+ hard_deny_candidates: action.hardDenyCandidates,
18
+ done_when_ref: doneRef,
19
+ diff_or_cmd_digest: action.digest,
20
+ constraints_hint: action.constraintsHint ?? "feature-branch only",
21
+ });
22
+ }
23
+ export function writePacketFiles(cwd, goalId, seq, packet, response) {
24
+ const dir = path.join(goalRunDir(cwd, goalId), "packets");
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ const requestPath = path.join(dir, `${seq}-request.json`);
27
+ fs.writeFileSync(requestPath, `${JSON.stringify(packet, null, 2)}\n`, "utf-8");
28
+ if (!response)
29
+ return { requestPath };
30
+ const responsePath = path.join(dir, `${seq}-response.json`);
31
+ fs.writeFileSync(responsePath, `${JSON.stringify(response, null, 2)}\n`, "utf-8");
32
+ return { requestPath, responsePath };
33
+ }
34
+ export function applyReviewDecision(state, packet, decision, rerouteKey) {
35
+ const validity = isValidReviewDecision(decision);
36
+ if (!validity.valid) {
37
+ return {
38
+ state,
39
+ result: { action: "retry_review", reason: validity.reason },
40
+ };
41
+ }
42
+ if (decision.hard_deny_hit != null) {
43
+ if (decision.decision === "uncertain") {
44
+ return rerouteOrCrash(state, packet, decision, rerouteKey, true);
45
+ }
46
+ if (decision.decision === "deny_suggest_alternative") {
47
+ return rerouteOrCrash(state, packet, decision, rerouteKey, true);
48
+ }
49
+ }
50
+ switch (decision.decision) {
51
+ case "allow":
52
+ case "allow_with_constraints":
53
+ return {
54
+ state,
55
+ result: {
56
+ action: "execute",
57
+ constraints: decision.constraints ?? [],
58
+ },
59
+ };
60
+ case "uncertain":
61
+ return { state, result: { action: "h3_continue" } };
62
+ case "deny_suggest_alternative":
63
+ return rerouteOrCrash(state, packet, decision, rerouteKey, false);
64
+ default:
65
+ return {
66
+ state,
67
+ result: { action: "retry_review", reason: "unknown decision" },
68
+ };
69
+ }
70
+ }
71
+ function rerouteOrCrash(state, packet, decision, rerouteKey, hardDeny) {
72
+ const count = (state.reroute_counts[rerouteKey] ?? 0) + 1;
73
+ const next = {
74
+ ...state,
75
+ reroute_counts: { ...state.reroute_counts, [rerouteKey]: count },
76
+ };
77
+ if (count > state.walls.maxReroutes) {
78
+ return {
79
+ state: next,
80
+ result: {
81
+ action: "crash_wall",
82
+ reason: hardDeny
83
+ ? `hard-deny reroute exhausted for ${rerouteKey}`
84
+ : `reroute exhausted for ${rerouteKey}`,
85
+ },
86
+ };
87
+ }
88
+ return {
89
+ state: next,
90
+ result: {
91
+ action: "reroute",
92
+ alternative: decision.alternative ?? null,
93
+ },
94
+ };
95
+ }
96
+ export function recordL1(cwd, goalId, decision) {
97
+ appendAuditLine(cwd, goalId, "L1", formatL1Line(decision.l1_ready));
98
+ }
99
+ export function recordL2(cwd, goalId, reason) {
100
+ appendAuditLine(cwd, goalId, "L2", reason);
101
+ }
102
+ /** MVP fallback when reviewer Child CLI is not yet available. */
103
+ export function minimalReviewFallback(packet) {
104
+ const digest = packet.diff_or_cmd_digest.toLowerCase();
105
+ let hard = null;
106
+ if (/git\s+push\s+.*--force/.test(digest) || /push\s+--force/.test(digest)) {
107
+ hard = "H-1";
108
+ }
109
+ else if (/\b(main|master|release)\b/.test(digest) &&
110
+ /(push|merge|commit)/.test(digest)) {
111
+ hard = "H-2";
112
+ }
113
+ const axes = packet.axes;
114
+ const now = new Date().toISOString();
115
+ if (hard) {
116
+ return parseGoalReviewDecision({
117
+ schema_version: 1,
118
+ decision: "deny_suggest_alternative",
119
+ axes,
120
+ hard_deny_hit: hard,
121
+ alternative: "Use a feature branch and avoid force-push to protected branches.",
122
+ rationale: `Hard deny ${hard} matched digest.`,
123
+ h3_allowed: false,
124
+ l1_ready: {
125
+ time: now,
126
+ action: packet.proposed_action,
127
+ axes,
128
+ reviewer: "cstl-goal-runtime-fallback",
129
+ decision: "deny_suggest_alternative",
130
+ rollback_hint: "Do not execute; reroute per contract-freeze §3.",
131
+ },
132
+ });
133
+ }
134
+ const needsReview = axes.A || axes.B || packet.hard_deny_candidates.length > 0;
135
+ const decision = needsReview ? "uncertain" : "allow";
136
+ return parseGoalReviewDecision({
137
+ schema_version: 1,
138
+ decision,
139
+ axes,
140
+ hard_deny_hit: null,
141
+ rationale: needsReview ? "Axes triggered review." : "Local reversible work.",
142
+ h3_allowed: true,
143
+ l1_ready: {
144
+ time: now,
145
+ action: packet.proposed_action,
146
+ axes,
147
+ reviewer: "cstl-goal-runtime-fallback",
148
+ decision,
149
+ rollback_hint: needsReview ? "H3 may continue if not hard-deny." : "Revert local edits.",
150
+ },
151
+ });
152
+ }
153
+ //# sourceMappingURL=review-seam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-seam.js","sourceRoot":"","sources":["../../src/goal/review-seam.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { GoalActionPacket, GoalAxes, HardDenyId, ReviewDecision } from "./action-packet.js";
2
+ export interface RuleEvaluation {
3
+ hard_deny_hit: HardDenyId | null;
4
+ decision: ReviewDecision;
5
+ axes: GoalAxes;
6
+ constraints?: string[];
7
+ alternative?: string | null;
8
+ rationale: string;
9
+ }
10
+ export declare function detectHardDeny(packet: GoalActionPacket): HardDenyId | null;
11
+ export declare function evaluateSoftDecision(packet: GoalActionPacket, axes: GoalAxes): RuleEvaluation;
12
+ export declare function evaluateReviewerRules(packet: GoalActionPacket): RuleEvaluation;
13
+ //# sourceMappingURL=reviewer-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-rules.d.ts","sourceRoot":"","sources":["../../src/goal/reviewer-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKjG,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,GAAG,IAAI,CA6D1E;AAcD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,QAAQ,GACb,cAAc,CA8EhB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,GACvB,cAAc,CAehB"}