@telora/factory 0.4.5

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 (301) hide show
  1. package/dist/audit.d.ts +69 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +376 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/builder-completion.d.ts +35 -0
  6. package/dist/builder-completion.d.ts.map +1 -0
  7. package/dist/builder-completion.js +375 -0
  8. package/dist/builder-completion.js.map +1 -0
  9. package/dist/builder-spawner.d.ts +40 -0
  10. package/dist/builder-spawner.d.ts.map +1 -0
  11. package/dist/builder-spawner.js +493 -0
  12. package/dist/builder-spawner.js.map +1 -0
  13. package/dist/completion-gate.d.ts +52 -0
  14. package/dist/completion-gate.d.ts.map +1 -0
  15. package/dist/completion-gate.js +336 -0
  16. package/dist/completion-gate.js.map +1 -0
  17. package/dist/completion-report.d.ts +36 -0
  18. package/dist/completion-report.d.ts.map +1 -0
  19. package/dist/completion-report.js +348 -0
  20. package/dist/completion-report.js.map +1 -0
  21. package/dist/completion.d.ts +58 -0
  22. package/dist/completion.d.ts.map +1 -0
  23. package/dist/completion.js +287 -0
  24. package/dist/completion.js.map +1 -0
  25. package/dist/config.d.ts +16 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +57 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/context-manager.d.ts +152 -0
  30. package/dist/context-manager.d.ts.map +1 -0
  31. package/dist/context-manager.js +421 -0
  32. package/dist/context-manager.js.map +1 -0
  33. package/dist/crash-detection.d.ts +70 -0
  34. package/dist/crash-detection.d.ts.map +1 -0
  35. package/dist/crash-detection.js +123 -0
  36. package/dist/crash-detection.js.map +1 -0
  37. package/dist/crash-recovery.d.ts +83 -0
  38. package/dist/crash-recovery.d.ts.map +1 -0
  39. package/dist/crash-recovery.js +522 -0
  40. package/dist/crash-recovery.js.map +1 -0
  41. package/dist/crash-resolution.d.ts +34 -0
  42. package/dist/crash-resolution.d.ts.map +1 -0
  43. package/dist/crash-resolution.js +382 -0
  44. package/dist/crash-resolution.js.map +1 -0
  45. package/dist/escalation.d.ts +150 -0
  46. package/dist/escalation.d.ts.map +1 -0
  47. package/dist/escalation.js +352 -0
  48. package/dist/escalation.js.map +1 -0
  49. package/dist/execution-target.d.ts +31 -0
  50. package/dist/execution-target.d.ts.map +1 -0
  51. package/dist/execution-target.js +71 -0
  52. package/dist/execution-target.js.map +1 -0
  53. package/dist/execution-unit-init.d.ts +28 -0
  54. package/dist/execution-unit-init.d.ts.map +1 -0
  55. package/dist/execution-unit-init.js +115 -0
  56. package/dist/execution-unit-init.js.map +1 -0
  57. package/dist/execution.d.ts +17 -0
  58. package/dist/execution.d.ts.map +1 -0
  59. package/dist/execution.js +20 -0
  60. package/dist/execution.js.map +1 -0
  61. package/dist/factory-engine.d.ts +100 -0
  62. package/dist/factory-engine.d.ts.map +1 -0
  63. package/dist/factory-engine.js +243 -0
  64. package/dist/factory-engine.js.map +1 -0
  65. package/dist/gap-detection.d.ts +43 -0
  66. package/dist/gap-detection.d.ts.map +1 -0
  67. package/dist/gap-detection.js +149 -0
  68. package/dist/gap-detection.js.map +1 -0
  69. package/dist/gate-context.d.ts +23 -0
  70. package/dist/gate-context.d.ts.map +1 -0
  71. package/dist/gate-context.js +63 -0
  72. package/dist/gate-context.js.map +1 -0
  73. package/dist/gate-engine.d.ts +55 -0
  74. package/dist/gate-engine.d.ts.map +1 -0
  75. package/dist/gate-engine.js +191 -0
  76. package/dist/gate-engine.js.map +1 -0
  77. package/dist/gates/adversarial.d.ts +59 -0
  78. package/dist/gates/adversarial.d.ts.map +1 -0
  79. package/dist/gates/adversarial.js +426 -0
  80. package/dist/gates/adversarial.js.map +1 -0
  81. package/dist/gates/adversary-spawner.d.ts +35 -0
  82. package/dist/gates/adversary-spawner.d.ts.map +1 -0
  83. package/dist/gates/adversary-spawner.js +286 -0
  84. package/dist/gates/adversary-spawner.js.map +1 -0
  85. package/dist/gates/adversary-test-dir.d.ts +41 -0
  86. package/dist/gates/adversary-test-dir.d.ts.map +1 -0
  87. package/dist/gates/adversary-test-dir.js +150 -0
  88. package/dist/gates/adversary-test-dir.js.map +1 -0
  89. package/dist/gates/behavioral-parser.d.ts +32 -0
  90. package/dist/gates/behavioral-parser.d.ts.map +1 -0
  91. package/dist/gates/behavioral-parser.js +190 -0
  92. package/dist/gates/behavioral-parser.js.map +1 -0
  93. package/dist/gates/behavioral-runner.d.ts +36 -0
  94. package/dist/gates/behavioral-runner.d.ts.map +1 -0
  95. package/dist/gates/behavioral-runner.js +306 -0
  96. package/dist/gates/behavioral-runner.js.map +1 -0
  97. package/dist/gates/behavioral.d.ts +37 -0
  98. package/dist/gates/behavioral.d.ts.map +1 -0
  99. package/dist/gates/behavioral.js +485 -0
  100. package/dist/gates/behavioral.js.map +1 -0
  101. package/dist/gates/deterministic.d.ts +24 -0
  102. package/dist/gates/deterministic.d.ts.map +1 -0
  103. package/dist/gates/deterministic.js +186 -0
  104. package/dist/gates/deterministic.js.map +1 -0
  105. package/dist/git-factory.d.ts +59 -0
  106. package/dist/git-factory.d.ts.map +1 -0
  107. package/dist/git-factory.js +102 -0
  108. package/dist/git-factory.js.map +1 -0
  109. package/dist/guard-evaluation.d.ts +48 -0
  110. package/dist/guard-evaluation.d.ts.map +1 -0
  111. package/dist/guard-evaluation.js +416 -0
  112. package/dist/guard-evaluation.js.map +1 -0
  113. package/dist/index.d.ts +30 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +39 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/instance-completion.d.ts +34 -0
  118. package/dist/instance-completion.d.ts.map +1 -0
  119. package/dist/instance-completion.js +366 -0
  120. package/dist/instance-completion.js.map +1 -0
  121. package/dist/instance-lifecycle.d.ts +15 -0
  122. package/dist/instance-lifecycle.d.ts.map +1 -0
  123. package/dist/instance-lifecycle.js +18 -0
  124. package/dist/instance-lifecycle.js.map +1 -0
  125. package/dist/instance-phase-dispatch.d.ts +75 -0
  126. package/dist/instance-phase-dispatch.d.ts.map +1 -0
  127. package/dist/instance-phase-dispatch.js +674 -0
  128. package/dist/instance-phase-dispatch.js.map +1 -0
  129. package/dist/instance-poll-loop.d.ts +43 -0
  130. package/dist/instance-poll-loop.d.ts.map +1 -0
  131. package/dist/instance-poll-loop.js +360 -0
  132. package/dist/instance-poll-loop.js.map +1 -0
  133. package/dist/instance-state-machine.d.ts +52 -0
  134. package/dist/instance-state-machine.d.ts.map +1 -0
  135. package/dist/instance-state-machine.js +235 -0
  136. package/dist/instance-state-machine.js.map +1 -0
  137. package/dist/log-manager.d.ts +28 -0
  138. package/dist/log-manager.d.ts.map +1 -0
  139. package/dist/log-manager.js +71 -0
  140. package/dist/log-manager.js.map +1 -0
  141. package/dist/pipeline-evaluator.d.ts +61 -0
  142. package/dist/pipeline-evaluator.d.ts.map +1 -0
  143. package/dist/pipeline-evaluator.js +107 -0
  144. package/dist/pipeline-evaluator.js.map +1 -0
  145. package/dist/pipeline-metrics.d.ts +52 -0
  146. package/dist/pipeline-metrics.d.ts.map +1 -0
  147. package/dist/pipeline-metrics.js +40 -0
  148. package/dist/pipeline-metrics.js.map +1 -0
  149. package/dist/pipeline-traversal.d.ts +43 -0
  150. package/dist/pipeline-traversal.d.ts.map +1 -0
  151. package/dist/pipeline-traversal.js +68 -0
  152. package/dist/pipeline-traversal.js.map +1 -0
  153. package/dist/plan-parser.d.ts +76 -0
  154. package/dist/plan-parser.d.ts.map +1 -0
  155. package/dist/plan-parser.js +223 -0
  156. package/dist/plan-parser.js.map +1 -0
  157. package/dist/planning-phase.d.ts +52 -0
  158. package/dist/planning-phase.d.ts.map +1 -0
  159. package/dist/planning-phase.js +444 -0
  160. package/dist/planning-phase.js.map +1 -0
  161. package/dist/planning-prompt.d.ts +64 -0
  162. package/dist/planning-prompt.d.ts.map +1 -0
  163. package/dist/planning-prompt.js +251 -0
  164. package/dist/planning-prompt.js.map +1 -0
  165. package/dist/planning.d.ts +16 -0
  166. package/dist/planning.d.ts.map +1 -0
  167. package/dist/planning.js +17 -0
  168. package/dist/planning.js.map +1 -0
  169. package/dist/process-runner.d.ts +41 -0
  170. package/dist/process-runner.d.ts.map +1 -0
  171. package/dist/process-runner.js +81 -0
  172. package/dist/process-runner.js.map +1 -0
  173. package/dist/product-config.d.ts +34 -0
  174. package/dist/product-config.d.ts.map +1 -0
  175. package/dist/product-config.js +43 -0
  176. package/dist/product-config.js.map +1 -0
  177. package/dist/queries/cycle-evaluations.d.ts +23 -0
  178. package/dist/queries/cycle-evaluations.d.ts.map +1 -0
  179. package/dist/queries/cycle-evaluations.js +37 -0
  180. package/dist/queries/cycle-evaluations.js.map +1 -0
  181. package/dist/queries/escalations.d.ts +30 -0
  182. package/dist/queries/escalations.d.ts.map +1 -0
  183. package/dist/queries/escalations.js +42 -0
  184. package/dist/queries/escalations.js.map +1 -0
  185. package/dist/queries/execution-units.d.ts +76 -0
  186. package/dist/queries/execution-units.d.ts.map +1 -0
  187. package/dist/queries/execution-units.js +109 -0
  188. package/dist/queries/execution-units.js.map +1 -0
  189. package/dist/queries/gate-results.d.ts +32 -0
  190. package/dist/queries/gate-results.d.ts.map +1 -0
  191. package/dist/queries/gate-results.js +44 -0
  192. package/dist/queries/gate-results.js.map +1 -0
  193. package/dist/queries/instances.d.ts +51 -0
  194. package/dist/queries/instances.d.ts.map +1 -0
  195. package/dist/queries/instances.js +77 -0
  196. package/dist/queries/instances.js.map +1 -0
  197. package/dist/queries/sessions.d.ts +50 -0
  198. package/dist/queries/sessions.d.ts.map +1 -0
  199. package/dist/queries/sessions.js +81 -0
  200. package/dist/queries/sessions.js.map +1 -0
  201. package/dist/queries/shared.d.ts +38 -0
  202. package/dist/queries/shared.d.ts.map +1 -0
  203. package/dist/queries/shared.js +119 -0
  204. package/dist/queries/shared.js.map +1 -0
  205. package/dist/queries/specs.d.ts +12 -0
  206. package/dist/queries/specs.d.ts.map +1 -0
  207. package/dist/queries/specs.js +21 -0
  208. package/dist/queries/specs.js.map +1 -0
  209. package/dist/queries/strategies.d.ts +14 -0
  210. package/dist/queries/strategies.d.ts.map +1 -0
  211. package/dist/queries/strategies.js +18 -0
  212. package/dist/queries/strategies.js.map +1 -0
  213. package/dist/queries/work-units.d.ts +42 -0
  214. package/dist/queries/work-units.d.ts.map +1 -0
  215. package/dist/queries/work-units.js +57 -0
  216. package/dist/queries/work-units.js.map +1 -0
  217. package/dist/queries/workflows.d.ts +29 -0
  218. package/dist/queries/workflows.d.ts.map +1 -0
  219. package/dist/queries/workflows.js +103 -0
  220. package/dist/queries/workflows.js.map +1 -0
  221. package/dist/remediation-units.d.ts +40 -0
  222. package/dist/remediation-units.d.ts.map +1 -0
  223. package/dist/remediation-units.js +263 -0
  224. package/dist/remediation-units.js.map +1 -0
  225. package/dist/replanning.d.ts +72 -0
  226. package/dist/replanning.d.ts.map +1 -0
  227. package/dist/replanning.js +403 -0
  228. package/dist/replanning.js.map +1 -0
  229. package/dist/resource-limits.d.ts +62 -0
  230. package/dist/resource-limits.d.ts.map +1 -0
  231. package/dist/resource-limits.js +322 -0
  232. package/dist/resource-limits.js.map +1 -0
  233. package/dist/scheduler.d.ts +98 -0
  234. package/dist/scheduler.d.ts.map +1 -0
  235. package/dist/scheduler.js +203 -0
  236. package/dist/scheduler.js.map +1 -0
  237. package/dist/session-adapter.d.ts +89 -0
  238. package/dist/session-adapter.d.ts.map +1 -0
  239. package/dist/session-adapter.js +108 -0
  240. package/dist/session-adapter.js.map +1 -0
  241. package/dist/sop-generator.d.ts +29 -0
  242. package/dist/sop-generator.d.ts.map +1 -0
  243. package/dist/sop-generator.js +235 -0
  244. package/dist/sop-generator.js.map +1 -0
  245. package/dist/spec-profiles.d.ts +41 -0
  246. package/dist/spec-profiles.d.ts.map +1 -0
  247. package/dist/spec-profiles.js +131 -0
  248. package/dist/spec-profiles.js.map +1 -0
  249. package/dist/strategy-design-graph.d.ts +23 -0
  250. package/dist/strategy-design-graph.d.ts.map +1 -0
  251. package/dist/strategy-design-graph.js +205 -0
  252. package/dist/strategy-design-graph.js.map +1 -0
  253. package/dist/strategy-design-prompt.d.ts +28 -0
  254. package/dist/strategy-design-prompt.d.ts.map +1 -0
  255. package/dist/strategy-design-prompt.js +108 -0
  256. package/dist/strategy-design-prompt.js.map +1 -0
  257. package/dist/strategy-design-schema.d.ts +767 -0
  258. package/dist/strategy-design-schema.d.ts.map +1 -0
  259. package/dist/strategy-design-schema.js +126 -0
  260. package/dist/strategy-design-schema.js.map +1 -0
  261. package/dist/strategy-design.d.ts +69 -0
  262. package/dist/strategy-design.d.ts.map +1 -0
  263. package/dist/strategy-design.js +411 -0
  264. package/dist/strategy-design.js.map +1 -0
  265. package/dist/strategy-gating.d.ts +31 -0
  266. package/dist/strategy-gating.d.ts.map +1 -0
  267. package/dist/strategy-gating.js +276 -0
  268. package/dist/strategy-gating.js.map +1 -0
  269. package/dist/team-prompt-builder.d.ts +47 -0
  270. package/dist/team-prompt-builder.d.ts.map +1 -0
  271. package/dist/team-prompt-builder.js +362 -0
  272. package/dist/team-prompt-builder.js.map +1 -0
  273. package/dist/trace-engine.d.ts +40 -0
  274. package/dist/trace-engine.d.ts.map +1 -0
  275. package/dist/trace-engine.js +344 -0
  276. package/dist/trace-engine.js.map +1 -0
  277. package/dist/types.d.ts +612 -0
  278. package/dist/types.d.ts.map +1 -0
  279. package/dist/types.js +9 -0
  280. package/dist/types.js.map +1 -0
  281. package/dist/unit-session-lifecycle.d.ts +78 -0
  282. package/dist/unit-session-lifecycle.d.ts.map +1 -0
  283. package/dist/unit-session-lifecycle.js +141 -0
  284. package/dist/unit-session-lifecycle.js.map +1 -0
  285. package/dist/unit-session.d.ts +30 -0
  286. package/dist/unit-session.d.ts.map +1 -0
  287. package/dist/unit-session.js +370 -0
  288. package/dist/unit-session.js.map +1 -0
  289. package/dist/watchdogs.d.ts +33 -0
  290. package/dist/watchdogs.d.ts.map +1 -0
  291. package/dist/watchdogs.js +170 -0
  292. package/dist/watchdogs.js.map +1 -0
  293. package/dist/work-unit-scheduler.d.ts +34 -0
  294. package/dist/work-unit-scheduler.d.ts.map +1 -0
  295. package/dist/work-unit-scheduler.js +91 -0
  296. package/dist/work-unit-scheduler.js.map +1 -0
  297. package/dist/workflow-transition.d.ts +90 -0
  298. package/dist/workflow-transition.d.ts.map +1 -0
  299. package/dist/workflow-transition.js +340 -0
  300. package/dist/workflow-transition.js.map +1 -0
  301. package/package.json +65 -0
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Behavioral gate evaluation for the factory orchestrator.
3
+ *
4
+ * Manages the dev server lifecycle and Playwright test execution within
5
+ * a factory worktree. The flow is:
6
+ * 1. Start the dev server (blueprint config or "npm run dev")
7
+ * 2. Wait for the server to be ready (stdout detection or timeout)
8
+ * 3. Run `npx playwright test --reporter=json {testGlob}` in the worktree
9
+ * 4. Parse Playwright JSON reporter output for structured results
10
+ * 5. Kill the dev server process tree on completion or timeout
11
+ * 6. Return structured gate check results
12
+ *
13
+ * Dev server readiness detection looks for common patterns in stdout:
14
+ * - "ready" (generic)
15
+ * - "localhost" (generic server bind)
16
+ * - "Local:" (Vite dev server)
17
+ *
18
+ * The dev server process is killed using negative PID (process group kill)
19
+ * to ensure all child processes are terminated.
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ // ============================================================================
23
+ // Constants
24
+ // ============================================================================
25
+ /** Log prefix for behavioral gate messages. */
26
+ const LOG_PREFIX = '[gate:behavioral]';
27
+ /** Maximum output length per check result (10 KB). */
28
+ const MAX_OUTPUT_LENGTH = 10_000;
29
+ /** Default test glob if not specified in config. */
30
+ const DEFAULT_TEST_GLOB = 'tests/**/*.spec.ts';
31
+ /** Default dev server command if not specified in config. */
32
+ const DEFAULT_DEV_SERVER_COMMAND = 'npm run dev';
33
+ /** Default timeout for dev server readiness and test execution (30s). */
34
+ const DEFAULT_TIMEOUT_MS = 30_000;
35
+ /** Patterns in stdout that indicate the dev server is ready. */
36
+ const READY_PATTERNS = [
37
+ 'ready',
38
+ 'localhost',
39
+ 'Local:',
40
+ ];
41
+ /** Grace period for dev server process tree kill (ms). */
42
+ const KILL_GRACE_MS = 3_000;
43
+ // ============================================================================
44
+ // Dev server management
45
+ // ============================================================================
46
+ /**
47
+ * Start the dev server and wait for it to be ready.
48
+ *
49
+ * Spawns the dev server command in the worktree directory with a new
50
+ * process group (detached: true) so we can kill the entire tree later.
51
+ * Listens on stdout for readiness patterns or times out.
52
+ *
53
+ * @returns The dev server child process, or null if it failed to start.
54
+ */
55
+ function startDevServer(command, worktreePath) {
56
+ const [cmd, ...args] = parseCommand(command);
57
+ const proc = spawn(cmd, args, {
58
+ cwd: worktreePath,
59
+ stdio: ['ignore', 'pipe', 'pipe'],
60
+ detached: true,
61
+ shell: true,
62
+ env: { ...process.env, CI: 'true' },
63
+ });
64
+ return proc;
65
+ }
66
+ /**
67
+ * Wait for the dev server to emit a readiness signal on stdout.
68
+ *
69
+ * Resolves when any of the READY_PATTERNS are detected in stdout,
70
+ * or rejects on timeout.
71
+ */
72
+ function waitForServerReady(proc, timeoutMs) {
73
+ return new Promise((resolve, reject) => {
74
+ let resolved = false;
75
+ let stdoutBuffer = '';
76
+ const timer = setTimeout(() => {
77
+ if (!resolved) {
78
+ resolved = true;
79
+ reject(new Error(`Dev server did not become ready within ${timeoutMs}ms. ` +
80
+ `Captured stdout: ${truncateOutput(stdoutBuffer)}`));
81
+ }
82
+ }, timeoutMs);
83
+ const onData = (chunk) => {
84
+ if (resolved)
85
+ return;
86
+ const text = chunk.toString();
87
+ stdoutBuffer += text;
88
+ const lowerText = stdoutBuffer.toLowerCase();
89
+ const isReady = READY_PATTERNS.some((pattern) => lowerText.includes(pattern.toLowerCase()));
90
+ if (isReady) {
91
+ resolved = true;
92
+ clearTimeout(timer);
93
+ // Detach the listener but keep the process running
94
+ proc.stdout?.removeListener('data', onData);
95
+ resolve();
96
+ }
97
+ };
98
+ proc.stdout?.on('data', onData);
99
+ proc.on('error', (err) => {
100
+ if (!resolved) {
101
+ resolved = true;
102
+ clearTimeout(timer);
103
+ reject(new Error(`Dev server failed to start: ${err.message}`));
104
+ }
105
+ });
106
+ proc.on('close', (code) => {
107
+ if (!resolved) {
108
+ resolved = true;
109
+ clearTimeout(timer);
110
+ reject(new Error(`Dev server exited prematurely with code ${code ?? 'unknown'}. ` +
111
+ `Captured stdout: ${truncateOutput(stdoutBuffer)}`));
112
+ }
113
+ });
114
+ });
115
+ }
116
+ /**
117
+ * Kill the dev server process tree.
118
+ *
119
+ * Uses negative PID to send SIGTERM to the entire process group.
120
+ * Falls back to killing just the process if group kill fails.
121
+ * Waits up to KILL_GRACE_MS, then sends SIGKILL.
122
+ */
123
+ async function killDevServer(proc) {
124
+ const pid = proc.pid;
125
+ if (pid === undefined)
126
+ return;
127
+ // Try process group kill first (negative PID)
128
+ try {
129
+ process.kill(-pid, 'SIGTERM');
130
+ }
131
+ catch {
132
+ // Process group kill failed -- try direct kill
133
+ try {
134
+ proc.kill('SIGTERM');
135
+ }
136
+ catch {
137
+ // Already dead
138
+ return;
139
+ }
140
+ }
141
+ // Wait for graceful shutdown, then force kill if still alive
142
+ await new Promise((resolve) => {
143
+ const forceKillTimer = setTimeout(() => {
144
+ try {
145
+ process.kill(-pid, 'SIGKILL');
146
+ }
147
+ catch {
148
+ try {
149
+ proc.kill('SIGKILL');
150
+ }
151
+ catch {
152
+ // Already dead
153
+ }
154
+ }
155
+ resolve();
156
+ }, KILL_GRACE_MS);
157
+ proc.on('close', () => {
158
+ clearTimeout(forceKillTimer);
159
+ resolve();
160
+ });
161
+ });
162
+ }
163
+ // ============================================================================
164
+ // Playwright test execution
165
+ // ============================================================================
166
+ /**
167
+ * Run Playwright tests in the worktree and capture JSON output.
168
+ *
169
+ * Executes `npx playwright test --reporter=json {testGlob}` and collects
170
+ * the full stdout as the JSON report.
171
+ */
172
+ function runPlaywrightTests(worktreePath, testGlob, timeoutMs) {
173
+ return new Promise((resolve) => {
174
+ const proc = spawn('npx', ['playwright', 'test', '--reporter=json', testGlob], {
175
+ cwd: worktreePath,
176
+ stdio: ['ignore', 'pipe', 'pipe'],
177
+ shell: true,
178
+ env: { ...process.env, CI: 'true' },
179
+ });
180
+ let stdout = '';
181
+ let stderr = '';
182
+ proc.stdout?.on('data', (chunk) => {
183
+ stdout += chunk.toString();
184
+ });
185
+ proc.stderr?.on('data', (chunk) => {
186
+ stderr += chunk.toString();
187
+ });
188
+ const timer = setTimeout(() => {
189
+ try {
190
+ proc.kill('SIGTERM');
191
+ }
192
+ catch {
193
+ // Already dead
194
+ }
195
+ // Give it a moment to clean up, then force kill
196
+ setTimeout(() => {
197
+ try {
198
+ proc.kill('SIGKILL');
199
+ }
200
+ catch {
201
+ // Already dead
202
+ }
203
+ }, KILL_GRACE_MS);
204
+ }, timeoutMs);
205
+ proc.on('close', (code) => {
206
+ clearTimeout(timer);
207
+ resolve({ stdout, stderr, exitCode: code ?? 1 });
208
+ });
209
+ proc.on('error', (err) => {
210
+ clearTimeout(timer);
211
+ resolve({ stdout, stderr: stderr + '\n' + err.message, exitCode: 1 });
212
+ });
213
+ });
214
+ }
215
+ // ============================================================================
216
+ // Playwright JSON report parsing
217
+ // ============================================================================
218
+ /**
219
+ * Parse Playwright JSON reporter output into GateCheckResult items.
220
+ *
221
+ * Extracts individual test results from the nested suite/spec/test
222
+ * hierarchy. Each test becomes a separate GateCheckResult entry.
223
+ *
224
+ * If the JSON cannot be parsed, returns a single failed result with
225
+ * the raw output.
226
+ */
227
+ function parsePlaywrightResults(jsonOutput, stderrOutput, exitCode, durationMs) {
228
+ let report;
229
+ try {
230
+ report = JSON.parse(jsonOutput);
231
+ }
232
+ catch {
233
+ // JSON parse failed -- return a single check with raw output
234
+ return [{
235
+ checkName: 'playwright-test-run',
236
+ passed: false,
237
+ output: truncateOutput(`Failed to parse Playwright JSON output.\n\n` +
238
+ `Exit code: ${exitCode}\n\n` +
239
+ `stdout:\n${jsonOutput}\n\n` +
240
+ `stderr:\n${stderrOutput}`),
241
+ durationMs,
242
+ isAdversaryGenerated: false,
243
+ }];
244
+ }
245
+ const results = [];
246
+ // Handle top-level errors (e.g. config errors, no tests found)
247
+ if (report.errors && report.errors.length > 0) {
248
+ const errorMessages = report.errors
249
+ .map((e) => e.message ?? 'Unknown error')
250
+ .join('\n');
251
+ results.push({
252
+ checkName: 'playwright-setup',
253
+ passed: false,
254
+ output: truncateOutput(`Playwright reported errors:\n${errorMessages}`),
255
+ durationMs,
256
+ isAdversaryGenerated: false,
257
+ });
258
+ }
259
+ // Recursively extract test results from suites
260
+ if (report.suites) {
261
+ for (const suite of report.suites) {
262
+ extractSuiteResults(suite, [], results);
263
+ }
264
+ }
265
+ // If no results were extracted but exit code was non-zero, add a summary
266
+ if (results.length === 0) {
267
+ results.push({
268
+ checkName: 'playwright-test-run',
269
+ passed: exitCode === 0,
270
+ output: truncateOutput(exitCode === 0
271
+ ? 'All Playwright tests passed (no individual results extracted).'
272
+ : `Playwright exited with code ${exitCode}.\n\nstderr:\n${stderrOutput}`),
273
+ durationMs,
274
+ isAdversaryGenerated: false,
275
+ });
276
+ }
277
+ return results;
278
+ }
279
+ /**
280
+ * Recursively extract test results from a Playwright suite.
281
+ *
282
+ * Builds a fully qualified test name from the suite path and spec/test
283
+ * titles. Each test result becomes a GateCheckResult.
284
+ */
285
+ function extractSuiteResults(suite, parentPath, results) {
286
+ const currentPath = suite.title
287
+ ? [...parentPath, suite.title]
288
+ : parentPath;
289
+ // Process specs in this suite
290
+ if (suite.specs) {
291
+ for (const spec of suite.specs) {
292
+ extractSpecResults(spec, currentPath, results);
293
+ }
294
+ }
295
+ // Recurse into nested suites
296
+ if (suite.suites) {
297
+ for (const nested of suite.suites) {
298
+ extractSuiteResults(nested, currentPath, results);
299
+ }
300
+ }
301
+ }
302
+ /**
303
+ * Extract results from a Playwright spec (describe/test block).
304
+ */
305
+ function extractSpecResults(spec, suitePath, results) {
306
+ if (!spec.tests || spec.tests.length === 0) {
307
+ // Spec without tests -- use the spec's own ok status
308
+ const checkName = [...suitePath, spec.title ?? 'unknown'].join(' > ');
309
+ results.push({
310
+ checkName,
311
+ passed: spec.ok === true,
312
+ output: truncateOutput(spec.ok ? 'Passed' : 'Failed'),
313
+ durationMs: 0,
314
+ isAdversaryGenerated: false,
315
+ });
316
+ return;
317
+ }
318
+ for (const test of spec.tests) {
319
+ const testTitle = test.title ?? spec.title ?? 'unknown';
320
+ const checkName = [...suitePath, testTitle].join(' > ');
321
+ // Determine pass/fail from test results
322
+ const testResults = test.results ?? [];
323
+ const lastResult = testResults[testResults.length - 1];
324
+ const passed = test.status === 'expected'
325
+ || lastResult?.status === 'passed'
326
+ || (test.expectedStatus === test.status);
327
+ const totalDuration = testResults.reduce((sum, r) => sum + (r.duration ?? 0), 0);
328
+ // Build output from error information
329
+ let output = '';
330
+ if (passed) {
331
+ output = `Passed (${totalDuration}ms)`;
332
+ }
333
+ else {
334
+ const errorParts = [];
335
+ for (const result of testResults) {
336
+ if (result.error) {
337
+ if (result.error.message)
338
+ errorParts.push(result.error.message);
339
+ if (result.error.snippet)
340
+ errorParts.push(result.error.snippet);
341
+ }
342
+ if (result.errors) {
343
+ for (const err of result.errors) {
344
+ if (err.message)
345
+ errorParts.push(err.message);
346
+ if (err.snippet)
347
+ errorParts.push(err.snippet);
348
+ }
349
+ }
350
+ }
351
+ output = errorParts.length > 0
352
+ ? errorParts.join('\n---\n')
353
+ : `Failed with status: ${lastResult?.status ?? test.status ?? 'unknown'}`;
354
+ }
355
+ results.push({
356
+ checkName,
357
+ passed,
358
+ output: truncateOutput(output),
359
+ durationMs: totalDuration,
360
+ isAdversaryGenerated: false,
361
+ });
362
+ }
363
+ }
364
+ // ============================================================================
365
+ // Main exported function
366
+ // ============================================================================
367
+ /**
368
+ * Run behavioral gates for a factory work unit.
369
+ *
370
+ * Starts the dev server, waits for readiness, runs Playwright tests,
371
+ * parses results, and cleans up. Returns structured results suitable
372
+ * for persisting as gate check results.
373
+ *
374
+ * @param worktreePath Absolute path to the factory worktree.
375
+ * @param config Behavioral gate config from the blueprint, or null for defaults.
376
+ * @returns Overall pass/fail and individual check results.
377
+ */
378
+ export async function runBehavioralGates(worktreePath, config) {
379
+ const testGlob = config?.testGlob ?? DEFAULT_TEST_GLOB;
380
+ const devServerCommand = config?.devServerCommand ?? DEFAULT_DEV_SERVER_COMMAND;
381
+ const timeoutMs = config?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
382
+ const overallStart = Date.now();
383
+ console.log(`${LOG_PREFIX} Starting behavioral gates in ${worktreePath} ` +
384
+ `(devServer: "${devServerCommand}", glob: "${testGlob}", timeout: ${timeoutMs}ms)`);
385
+ // ── Step 1: Start the dev server ────────────────────────────────────
386
+ let devServer = null;
387
+ try {
388
+ devServer = startDevServer(devServerCommand, worktreePath);
389
+ if (devServer.pid === undefined) {
390
+ return {
391
+ passed: false,
392
+ results: [{
393
+ checkName: 'dev-server-start',
394
+ passed: false,
395
+ output: 'Failed to start dev server: process pid is undefined.',
396
+ durationMs: Date.now() - overallStart,
397
+ isAdversaryGenerated: false,
398
+ }],
399
+ };
400
+ }
401
+ console.log(`${LOG_PREFIX} Dev server started (pid: ${devServer.pid})`);
402
+ // ── Step 2: Wait for server readiness ───────────────────────────────
403
+ try {
404
+ await waitForServerReady(devServer, timeoutMs);
405
+ console.log(`${LOG_PREFIX} Dev server is ready`);
406
+ }
407
+ catch (readyErr) {
408
+ const error = readyErr instanceof Error ? readyErr.message : String(readyErr);
409
+ console.error(`${LOG_PREFIX} Dev server readiness check failed: ${error}`);
410
+ return {
411
+ passed: false,
412
+ results: [{
413
+ checkName: 'dev-server-ready',
414
+ passed: false,
415
+ output: truncateOutput(`Dev server failed readiness check.\n\n${error}`),
416
+ durationMs: Date.now() - overallStart,
417
+ isAdversaryGenerated: false,
418
+ }],
419
+ };
420
+ }
421
+ // ── Step 3: Run Playwright tests ────────────────────────────────────
422
+ const testStart = Date.now();
423
+ const { stdout, stderr, exitCode } = await runPlaywrightTests(worktreePath, testGlob, timeoutMs);
424
+ const testDuration = Date.now() - testStart;
425
+ console.log(`${LOG_PREFIX} Playwright tests completed ` +
426
+ `(exitCode: ${exitCode}, duration: ${testDuration}ms)`);
427
+ // ── Step 4: Parse results ───────────────────────────────────────────
428
+ const results = parsePlaywrightResults(stdout, stderr, exitCode, testDuration);
429
+ const passed = results.every((r) => r.passed);
430
+ console.log(`${LOG_PREFIX} Behavioral gates ${passed ? 'PASSED' : 'FAILED'} ` +
431
+ `(${results.filter((r) => r.passed).length}/${results.length} checks passed)`);
432
+ return { passed, results };
433
+ }
434
+ catch (err) {
435
+ const error = err instanceof Error ? err.message : String(err);
436
+ console.error(`${LOG_PREFIX} Unexpected error during behavioral gates: ${error}`);
437
+ return {
438
+ passed: false,
439
+ results: [{
440
+ checkName: 'behavioral-gate-error',
441
+ passed: false,
442
+ output: truncateOutput(`Unexpected error: ${error}`),
443
+ durationMs: Date.now() - overallStart,
444
+ isAdversaryGenerated: false,
445
+ }],
446
+ };
447
+ }
448
+ finally {
449
+ // ── Step 5: Kill dev server on completion or error ───────────────────
450
+ if (devServer) {
451
+ console.log(`${LOG_PREFIX} Killing dev server...`);
452
+ await killDevServer(devServer);
453
+ console.log(`${LOG_PREFIX} Dev server terminated`);
454
+ }
455
+ }
456
+ }
457
+ // ============================================================================
458
+ // Utility helpers
459
+ // ============================================================================
460
+ /**
461
+ * Truncate output to the maximum allowed length.
462
+ * Appends a truncation notice if the output was shortened.
463
+ */
464
+ function truncateOutput(output) {
465
+ if (output.length <= MAX_OUTPUT_LENGTH) {
466
+ return output;
467
+ }
468
+ const truncationNotice = '\n\n... [truncated at 10000 chars]';
469
+ return output.slice(0, MAX_OUTPUT_LENGTH - truncationNotice.length) + truncationNotice;
470
+ }
471
+ /**
472
+ * Parse a shell command string into the command and its arguments.
473
+ *
474
+ * Handles simple cases like "npm run dev" or "node server.js".
475
+ * For complex commands with pipes or redirects, the shell: true
476
+ * option on spawn handles those.
477
+ */
478
+ function parseCommand(command) {
479
+ const parts = command.trim().split(/\s+/);
480
+ if (parts.length === 0 || parts[0] === '') {
481
+ return ['npm', 'run', 'dev'];
482
+ }
483
+ return parts;
484
+ }
485
+ //# sourceMappingURL=behavioral.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavioral.js","sourceRoot":"","sources":["../../src/gates/behavioral.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Deterministic gate evaluation.
3
+ *
4
+ * Runs configured shell commands (typecheck, lint, test, build) in the
5
+ * worktree directory and captures structured results. Commands execute
6
+ * sequentially; the first failure short-circuits remaining checks.
7
+ */
8
+ import type { DeterministicGateConfig, GateCheckResult, TraceCheckConfig } from '../types.js';
9
+ /**
10
+ * Run deterministic gate checks in the given worktree.
11
+ *
12
+ * Executes the configured commands sequentially. Each command is run as a
13
+ * shell command in the worktree directory. The first failure short-circuits
14
+ * remaining checks.
15
+ *
16
+ * @param worktreePath - Absolute path to the git worktree directory
17
+ * @param config - Blueprint deterministic gate config, or null for defaults
18
+ * @returns Overall pass/fail and per-check results
19
+ */
20
+ export declare function runDeterministicGates(worktreePath: string, config: DeterministicGateConfig | null, traceChecks?: TraceCheckConfig[]): Promise<{
21
+ passed: boolean;
22
+ results: GateCheckResult[];
23
+ }>;
24
+ //# sourceMappingURL=deterministic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic.d.ts","sourceRoot":"","sources":["../../src/gates/deterministic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAmJ9F;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,uBAAuB,GAAG,IAAI,EACtC,WAAW,CAAC,EAAE,gBAAgB,EAAE,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAyE1D"}