@plune-ai/cairn 0.2.1

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 (323) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +181 -0
  3. package/dist/agent/graph.d.ts +538 -0
  4. package/dist/agent/graph.d.ts.map +1 -0
  5. package/dist/agent/graph.js +0 -0
  6. package/dist/agent/graph.js.map +1 -0
  7. package/dist/agent/index.d.ts +83 -0
  8. package/dist/agent/index.d.ts.map +1 -0
  9. package/dist/agent/index.js +407 -0
  10. package/dist/agent/index.js.map +1 -0
  11. package/dist/analyze/index.d.ts +22 -0
  12. package/dist/analyze/index.d.ts.map +1 -0
  13. package/dist/analyze/index.js +39 -0
  14. package/dist/analyze/index.js.map +1 -0
  15. package/dist/artifacts/index.d.ts +29 -0
  16. package/dist/artifacts/index.d.ts.map +1 -0
  17. package/dist/artifacts/index.js +68 -0
  18. package/dist/artifacts/index.js.map +1 -0
  19. package/dist/artifacts/report.d.ts +21 -0
  20. package/dist/artifacts/report.d.ts.map +1 -0
  21. package/dist/artifacts/report.js +56 -0
  22. package/dist/artifacts/report.js.map +1 -0
  23. package/dist/artifacts/testcase-md.d.ts +37 -0
  24. package/dist/artifacts/testcase-md.d.ts.map +1 -0
  25. package/dist/artifacts/testcase-md.js +91 -0
  26. package/dist/artifacts/testcase-md.js.map +1 -0
  27. package/dist/browser/backends/playwright-cli.d.ts +23 -0
  28. package/dist/browser/backends/playwright-cli.d.ts.map +1 -0
  29. package/dist/browser/backends/playwright-cli.js +85 -0
  30. package/dist/browser/backends/playwright-cli.js.map +1 -0
  31. package/dist/browser/backends/playwright-lib.d.ts +32 -0
  32. package/dist/browser/backends/playwright-lib.d.ts.map +1 -0
  33. package/dist/browser/backends/playwright-lib.js +157 -0
  34. package/dist/browser/backends/playwright-lib.js.map +1 -0
  35. package/dist/browser/gateway.d.ts +33 -0
  36. package/dist/browser/gateway.d.ts.map +1 -0
  37. package/dist/browser/gateway.js +2 -0
  38. package/dist/browser/gateway.js.map +1 -0
  39. package/dist/browser/index.d.ts +15 -0
  40. package/dist/browser/index.d.ts.map +1 -0
  41. package/dist/browser/index.js +59 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/browser/types.d.ts +99 -0
  44. package/dist/browser/types.d.ts.map +1 -0
  45. package/dist/browser/types.js +6 -0
  46. package/dist/browser/types.js.map +1 -0
  47. package/dist/checklist/index.d.ts +24 -0
  48. package/dist/checklist/index.d.ts.map +1 -0
  49. package/dist/checklist/index.js +65 -0
  50. package/dist/checklist/index.js.map +1 -0
  51. package/dist/cli/branding.d.ts +14 -0
  52. package/dist/cli/branding.d.ts.map +1 -0
  53. package/dist/cli/branding.js +14 -0
  54. package/dist/cli/branding.js.map +1 -0
  55. package/dist/cli/index.d.ts +12 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +322 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/lex-bot.d.ts +3 -0
  60. package/dist/cli/lex-bot.d.ts.map +1 -0
  61. package/dist/cli/lex-bot.js +11 -0
  62. package/dist/cli/lex-bot.js.map +1 -0
  63. package/dist/codegen/index.d.ts +36 -0
  64. package/dist/codegen/index.d.ts.map +1 -0
  65. package/dist/codegen/index.js +63 -0
  66. package/dist/codegen/index.js.map +1 -0
  67. package/dist/codegen/schema.d.ts +14 -0
  68. package/dist/codegen/schema.d.ts.map +1 -0
  69. package/dist/codegen/schema.js +9 -0
  70. package/dist/codegen/schema.js.map +1 -0
  71. package/dist/config/env.d.ts +18 -0
  72. package/dist/config/env.d.ts.map +1 -0
  73. package/dist/config/env.js +42 -0
  74. package/dist/config/env.js.map +1 -0
  75. package/dist/config/index.d.ts +11 -0
  76. package/dist/config/index.d.ts.map +1 -0
  77. package/dist/config/index.js +74 -0
  78. package/dist/config/index.js.map +1 -0
  79. package/dist/config/profiles.d.ts +7 -0
  80. package/dist/config/profiles.d.ts.map +1 -0
  81. package/dist/config/profiles.js +28 -0
  82. package/dist/config/profiles.js.map +1 -0
  83. package/dist/config/schema.d.ts +91 -0
  84. package/dist/config/schema.d.ts.map +1 -0
  85. package/dist/config/schema.js +20 -0
  86. package/dist/config/schema.js.map +1 -0
  87. package/dist/design/index.d.ts +36 -0
  88. package/dist/design/index.d.ts.map +1 -0
  89. package/dist/design/index.js +35 -0
  90. package/dist/design/index.js.map +1 -0
  91. package/dist/design/schema.d.ts +109 -0
  92. package/dist/design/schema.d.ts.map +1 -0
  93. package/dist/design/schema.js +35 -0
  94. package/dist/design/schema.js.map +1 -0
  95. package/dist/eval/collect.d.ts +18 -0
  96. package/dist/eval/collect.d.ts.map +1 -0
  97. package/dist/eval/collect.js +53 -0
  98. package/dist/eval/collect.js.map +1 -0
  99. package/dist/eval/experiment.d.ts +49 -0
  100. package/dist/eval/experiment.d.ts.map +1 -0
  101. package/dist/eval/experiment.js +66 -0
  102. package/dist/eval/experiment.js.map +1 -0
  103. package/dist/eval/judge.d.ts +30 -0
  104. package/dist/eval/judge.d.ts.map +1 -0
  105. package/dist/eval/judge.js +47 -0
  106. package/dist/eval/judge.js.map +1 -0
  107. package/dist/eval/pilot.d.ts +21 -0
  108. package/dist/eval/pilot.d.ts.map +1 -0
  109. package/dist/eval/pilot.js +24 -0
  110. package/dist/eval/pilot.js.map +1 -0
  111. package/dist/eval/scorers.d.ts +23 -0
  112. package/dist/eval/scorers.d.ts.map +1 -0
  113. package/dist/eval/scorers.js +38 -0
  114. package/dist/eval/scorers.js.map +1 -0
  115. package/dist/index.d.ts +21 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +13 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/knowledge/index.d.ts +7 -0
  120. package/dist/knowledge/index.d.ts.map +1 -0
  121. package/dist/knowledge/index.js +39 -0
  122. package/dist/knowledge/index.js.map +1 -0
  123. package/dist/llm/factory.d.ts +31 -0
  124. package/dist/llm/factory.d.ts.map +1 -0
  125. package/dist/llm/factory.js +48 -0
  126. package/dist/llm/factory.js.map +1 -0
  127. package/dist/llm/index.d.ts +5 -0
  128. package/dist/llm/index.d.ts.map +1 -0
  129. package/dist/llm/index.js +3 -0
  130. package/dist/llm/index.js.map +1 -0
  131. package/dist/llm/structured.d.ts +30 -0
  132. package/dist/llm/structured.d.ts.map +1 -0
  133. package/dist/llm/structured.js +58 -0
  134. package/dist/llm/structured.js.map +1 -0
  135. package/dist/llm/vision.d.ts +16 -0
  136. package/dist/llm/vision.d.ts.map +1 -0
  137. package/dist/llm/vision.js +4 -0
  138. package/dist/llm/vision.js.map +1 -0
  139. package/dist/observe/index.d.ts +21 -0
  140. package/dist/observe/index.d.ts.map +1 -0
  141. package/dist/observe/index.js +18 -0
  142. package/dist/observe/index.js.map +1 -0
  143. package/dist/observe/parse-aria.d.ts +8 -0
  144. package/dist/observe/parse-aria.d.ts.map +1 -0
  145. package/dist/observe/parse-aria.js +71 -0
  146. package/dist/observe/parse-aria.js.map +1 -0
  147. package/dist/probe/index.d.ts +19 -0
  148. package/dist/probe/index.d.ts.map +1 -0
  149. package/dist/probe/index.js +38 -0
  150. package/dist/probe/index.js.map +1 -0
  151. package/dist/promote/index.d.ts +6 -0
  152. package/dist/promote/index.d.ts.map +1 -0
  153. package/dist/promote/index.js +4 -0
  154. package/dist/promote/index.js.map +1 -0
  155. package/dist/promote/promote-case.d.ts +12 -0
  156. package/dist/promote/promote-case.d.ts.map +1 -0
  157. package/dist/promote/promote-case.js +103 -0
  158. package/dist/promote/promote-case.js.map +1 -0
  159. package/dist/promote/selectors.d.ts +29 -0
  160. package/dist/promote/selectors.d.ts.map +1 -0
  161. package/dist/promote/selectors.js +58 -0
  162. package/dist/promote/selectors.js.map +1 -0
  163. package/dist/prompts/index.d.ts +32 -0
  164. package/dist/prompts/index.d.ts.map +1 -0
  165. package/dist/prompts/index.js +55 -0
  166. package/dist/prompts/index.js.map +1 -0
  167. package/dist/prompts/local/identify-elements.d.ts +6 -0
  168. package/dist/prompts/local/identify-elements.d.ts.map +1 -0
  169. package/dist/prompts/local/identify-elements.js +21 -0
  170. package/dist/prompts/local/identify-elements.js.map +1 -0
  171. package/dist/prompts/local/index.d.ts +3 -0
  172. package/dist/prompts/local/index.d.ts.map +1 -0
  173. package/dist/prompts/local/index.js +18 -0
  174. package/dist/prompts/local/index.js.map +1 -0
  175. package/dist/prompts/local/judge-checklist-coverage.d.ts +3 -0
  176. package/dist/prompts/local/judge-checklist-coverage.d.ts.map +1 -0
  177. package/dist/prompts/local/judge-checklist-coverage.js +11 -0
  178. package/dist/prompts/local/judge-checklist-coverage.js.map +1 -0
  179. package/dist/prompts/local/judge-test-cases.d.ts +3 -0
  180. package/dist/prompts/local/judge-test-cases.d.ts.map +1 -0
  181. package/dist/prompts/local/judge-test-cases.js +11 -0
  182. package/dist/prompts/local/judge-test-cases.js.map +1 -0
  183. package/dist/prompts/local/pilot-review.d.ts +3 -0
  184. package/dist/prompts/local/pilot-review.d.ts.map +1 -0
  185. package/dist/prompts/local/pilot-review.js +13 -0
  186. package/dist/prompts/local/pilot-review.js.map +1 -0
  187. package/dist/prompts/local/qa-manual-test-designer.d.ts +7 -0
  188. package/dist/prompts/local/qa-manual-test-designer.d.ts.map +1 -0
  189. package/dist/prompts/local/qa-manual-test-designer.js +13 -0
  190. package/dist/prompts/local/qa-manual-test-designer.js.map +1 -0
  191. package/dist/prompts/local/qa-playwright-ts-writer.d.ts +6 -0
  192. package/dist/prompts/local/qa-playwright-ts-writer.d.ts.map +1 -0
  193. package/dist/prompts/local/qa-playwright-ts-writer.js +40 -0
  194. package/dist/prompts/local/qa-playwright-ts-writer.js.map +1 -0
  195. package/dist/prompts/local/qa-testcase-from-ui.d.ts +6 -0
  196. package/dist/prompts/local/qa-testcase-from-ui.d.ts.map +1 -0
  197. package/dist/prompts/local/qa-testcase-from-ui.js +52 -0
  198. package/dist/prompts/local/qa-testcase-from-ui.js.map +1 -0
  199. package/dist/session/index.d.ts +27 -0
  200. package/dist/session/index.d.ts.map +1 -0
  201. package/dist/session/index.js +74 -0
  202. package/dist/session/index.js.map +1 -0
  203. package/dist/telemetry/index.d.ts +21 -0
  204. package/dist/telemetry/index.d.ts.map +1 -0
  205. package/dist/telemetry/index.js +26 -0
  206. package/dist/telemetry/index.js.map +1 -0
  207. package/dist/tui/App.d.ts +6 -0
  208. package/dist/tui/App.d.ts.map +1 -0
  209. package/dist/tui/App.js +61 -0
  210. package/dist/tui/App.js.map +1 -0
  211. package/dist/tui/components/error-boundary.d.ts +17 -0
  212. package/dist/tui/components/error-boundary.d.ts.map +1 -0
  213. package/dist/tui/components/error-boundary.js +20 -0
  214. package/dist/tui/components/error-boundary.js.map +1 -0
  215. package/dist/tui/components/field.d.ts +10 -0
  216. package/dist/tui/components/field.d.ts.map +1 -0
  217. package/dist/tui/components/field.js +8 -0
  218. package/dist/tui/components/field.js.map +1 -0
  219. package/dist/tui/components/help.d.ts +5 -0
  220. package/dist/tui/components/help.d.ts.map +1 -0
  221. package/dist/tui/components/help.js +7 -0
  222. package/dist/tui/components/help.js.map +1 -0
  223. package/dist/tui/components/log-pane.d.ts +6 -0
  224. package/dist/tui/components/log-pane.d.ts.map +1 -0
  225. package/dist/tui/components/log-pane.js +10 -0
  226. package/dist/tui/components/log-pane.js.map +1 -0
  227. package/dist/tui/components/node-checklist.d.ts +6 -0
  228. package/dist/tui/components/node-checklist.d.ts.map +1 -0
  229. package/dist/tui/components/node-checklist.js +9 -0
  230. package/dist/tui/components/node-checklist.js.map +1 -0
  231. package/dist/tui/components/pilot-badge.d.ts +6 -0
  232. package/dist/tui/components/pilot-badge.d.ts.map +1 -0
  233. package/dist/tui/components/pilot-badge.js +12 -0
  234. package/dist/tui/components/pilot-badge.js.map +1 -0
  235. package/dist/tui/components/scores-table.d.ts +6 -0
  236. package/dist/tui/components/scores-table.d.ts.map +1 -0
  237. package/dist/tui/components/scores-table.js +9 -0
  238. package/dist/tui/components/scores-table.js.map +1 -0
  239. package/dist/tui/components/scrollable-text.d.ts +6 -0
  240. package/dist/tui/components/scrollable-text.d.ts.map +1 -0
  241. package/dist/tui/components/scrollable-text.js +22 -0
  242. package/dist/tui/components/scrollable-text.js.map +1 -0
  243. package/dist/tui/components/session-picker.d.ts +5 -0
  244. package/dist/tui/components/session-picker.d.ts.map +1 -0
  245. package/dist/tui/components/session-picker.js +16 -0
  246. package/dist/tui/components/session-picker.js.map +1 -0
  247. package/dist/tui/components/test-case-list.d.ts +7 -0
  248. package/dist/tui/components/test-case-list.d.ts.map +1 -0
  249. package/dist/tui/components/test-case-list.js +10 -0
  250. package/dist/tui/components/test-case-list.js.map +1 -0
  251. package/dist/tui/hooks/use-run-artifacts.d.ts +14 -0
  252. package/dist/tui/hooks/use-run-artifacts.d.ts.map +1 -0
  253. package/dist/tui/hooks/use-run-artifacts.js +37 -0
  254. package/dist/tui/hooks/use-run-artifacts.js.map +1 -0
  255. package/dist/tui/hooks/use-runner.d.ts +25 -0
  256. package/dist/tui/hooks/use-runner.d.ts.map +1 -0
  257. package/dist/tui/hooks/use-runner.js +116 -0
  258. package/dist/tui/hooks/use-runner.js.map +1 -0
  259. package/dist/tui/hooks/use-runs.d.ts +14 -0
  260. package/dist/tui/hooks/use-runs.d.ts.map +1 -0
  261. package/dist/tui/hooks/use-runs.js +57 -0
  262. package/dist/tui/hooks/use-runs.js.map +1 -0
  263. package/dist/tui/hooks/use-sessions.d.ts +10 -0
  264. package/dist/tui/hooks/use-sessions.d.ts.map +1 -0
  265. package/dist/tui/hooks/use-sessions.js +32 -0
  266. package/dist/tui/hooks/use-sessions.js.map +1 -0
  267. package/dist/tui/hooks/use-stdout-dimensions.d.ts +3 -0
  268. package/dist/tui/hooks/use-stdout-dimensions.d.ts.map +1 -0
  269. package/dist/tui/hooks/use-stdout-dimensions.js +18 -0
  270. package/dist/tui/hooks/use-stdout-dimensions.js.map +1 -0
  271. package/dist/tui/index.d.ts +7 -0
  272. package/dist/tui/index.d.ts.map +1 -0
  273. package/dist/tui/index.js +13 -0
  274. package/dist/tui/index.js.map +1 -0
  275. package/dist/tui/router-context.d.ts +12 -0
  276. package/dist/tui/router-context.d.ts.map +1 -0
  277. package/dist/tui/router-context.js +14 -0
  278. package/dist/tui/router-context.js.map +1 -0
  279. package/dist/tui/router.d.ts +44 -0
  280. package/dist/tui/router.d.ts.map +1 -0
  281. package/dist/tui/router.js +22 -0
  282. package/dist/tui/router.js.map +1 -0
  283. package/dist/tui/screens/form-screen.d.ts +7 -0
  284. package/dist/tui/screens/form-screen.d.ts.map +1 -0
  285. package/dist/tui/screens/form-screen.js +104 -0
  286. package/dist/tui/screens/form-screen.js.map +1 -0
  287. package/dist/tui/screens/launcher-screen.d.ts +2 -0
  288. package/dist/tui/screens/launcher-screen.d.ts.map +1 -0
  289. package/dist/tui/screens/launcher-screen.js +28 -0
  290. package/dist/tui/screens/launcher-screen.js.map +1 -0
  291. package/dist/tui/screens/run-dashboard-screen.d.ts +7 -0
  292. package/dist/tui/screens/run-dashboard-screen.d.ts.map +1 -0
  293. package/dist/tui/screens/run-dashboard-screen.js +32 -0
  294. package/dist/tui/screens/run-dashboard-screen.js.map +1 -0
  295. package/dist/tui/screens/run-detail-screen.d.ts +5 -0
  296. package/dist/tui/screens/run-detail-screen.d.ts.map +1 -0
  297. package/dist/tui/screens/run-detail-screen.js +67 -0
  298. package/dist/tui/screens/run-detail-screen.js.map +1 -0
  299. package/dist/tui/screens/runs-list-screen.d.ts +2 -0
  300. package/dist/tui/screens/runs-list-screen.d.ts.map +1 -0
  301. package/dist/tui/screens/runs-list-screen.js +22 -0
  302. package/dist/tui/screens/runs-list-screen.js.map +1 -0
  303. package/dist/tui/screens/summary-screen.d.ts +6 -0
  304. package/dist/tui/screens/summary-screen.d.ts.map +1 -0
  305. package/dist/tui/screens/summary-screen.js +53 -0
  306. package/dist/tui/screens/summary-screen.js.map +1 -0
  307. package/dist/tui/theme.d.ts +31 -0
  308. package/dist/tui/theme.d.ts.map +1 -0
  309. package/dist/tui/theme.js +70 -0
  310. package/dist/tui/theme.js.map +1 -0
  311. package/dist/tui/types.d.ts +38 -0
  312. package/dist/tui/types.d.ts.map +1 -0
  313. package/dist/tui/types.js +2 -0
  314. package/dist/tui/types.js.map +1 -0
  315. package/dist/validate/index.d.ts +30 -0
  316. package/dist/validate/index.d.ts.map +1 -0
  317. package/dist/validate/index.js +39 -0
  318. package/dist/validate/index.js.map +1 -0
  319. package/dist/validate/runner.d.ts +15 -0
  320. package/dist/validate/runner.d.ts.map +1 -0
  321. package/dist/validate/runner.js +74 -0
  322. package/dist/validate/runner.js.map +1 -0
  323. package/package.json +97 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Graph-node knowledge + progress parsing for the live dashboard.
3
+ *
4
+ * CRITICAL: onProgress strings are localized (run.log is Ukrainian, graph.ts is English),
5
+ * so ONLY the `<node>` token before " — " is reliable. Never parse numbers from the message;
6
+ * those come from the typed result objects.
7
+ */
8
+ import type { NodeStatus, Command } from "./types.js";
9
+ export declare const EXPLORE_NODES: readonly ["observe", "identifyElements", "verifyLocators", "exploreStates", "probeInteractions", "designTestCases", "generateCode", "validate", "repair"];
10
+ export declare const DESIGN_NODES: readonly ["observe", "identifyElements", "verifyLocators", "exploreStates", "probeInteractions", "designTestCases"];
11
+ export declare const AUTOMATE_NODES: readonly ["generateCode", "validate"];
12
+ export declare const NODE_LABELS: Record<string, string>;
13
+ export declare function nodesFor(command: Command): readonly string[];
14
+ export declare function seedNodes(list: readonly string[]): NodeStatus[];
15
+ /**
16
+ * Extract the graph-node prefix from a progress line. Language-agnostic: only the
17
+ * token before " — " is used (the message text is localized and must not be relied on).
18
+ */
19
+ export declare function parseNode(event: string): {
20
+ node: string;
21
+ msg: string;
22
+ };
23
+ /**
24
+ * Monotonic advance: when `activeNode` starts, every earlier node becomes done, it
25
+ * becomes running, later nodes stay pending. This absorbs skipped no-op nodes
26
+ * (e.g. exploreStates) and ignores unknown post-graph nodes (score/pilot/collect).
27
+ */
28
+ export declare function advanceNodes(nodes: NodeStatus[], activeNode: string): NodeStatus[];
29
+ /** Mark every node done — used when the run resolves successfully. */
30
+ export declare function completeNodes(nodes: NodeStatus[]): NodeStatus[];
31
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,aAAa,2JAUhB,CAAC;AAEX,eAAO,MAAM,YAAY,qHAOf,CAAC;AAEX,eAAO,MAAM,cAAc,uCAAwC,CAAC;AAEpE,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU9C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAI5D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,EAAE,CAE/D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAItE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAOlF;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE/D"}
@@ -0,0 +1,70 @@
1
+ export const EXPLORE_NODES = [
2
+ "observe",
3
+ "identifyElements",
4
+ "verifyLocators",
5
+ "exploreStates",
6
+ "probeInteractions",
7
+ "designTestCases",
8
+ "generateCode",
9
+ "validate",
10
+ "repair",
11
+ ];
12
+ export const DESIGN_NODES = [
13
+ "observe",
14
+ "identifyElements",
15
+ "verifyLocators",
16
+ "exploreStates",
17
+ "probeInteractions",
18
+ "designTestCases",
19
+ ];
20
+ export const AUTOMATE_NODES = ["generateCode", "validate"];
21
+ export const NODE_LABELS = {
22
+ observe: "Observe page",
23
+ identifyElements: "Identify elements",
24
+ verifyLocators: "Verify locators",
25
+ exploreStates: "Explore states",
26
+ probeInteractions: "Probe interactions",
27
+ designTestCases: "Design test cases",
28
+ generateCode: "Generate code",
29
+ validate: "Validate",
30
+ repair: "Repair",
31
+ };
32
+ export function nodesFor(command) {
33
+ if (command === "design")
34
+ return DESIGN_NODES;
35
+ if (command === "automate")
36
+ return AUTOMATE_NODES;
37
+ return EXPLORE_NODES; // explore (observe is a separate, graphless path)
38
+ }
39
+ export function seedNodes(list) {
40
+ return list.map((node) => ({ node, state: "pending" }));
41
+ }
42
+ /**
43
+ * Extract the graph-node prefix from a progress line. Language-agnostic: only the
44
+ * token before " — " is used (the message text is localized and must not be relied on).
45
+ */
46
+ export function parseNode(event) {
47
+ const i = event.indexOf(" — ");
48
+ if (i === -1)
49
+ return { node: "", msg: event };
50
+ return { node: event.slice(0, i).trim(), msg: event.slice(i + 3) };
51
+ }
52
+ /**
53
+ * Monotonic advance: when `activeNode` starts, every earlier node becomes done, it
54
+ * becomes running, later nodes stay pending. This absorbs skipped no-op nodes
55
+ * (e.g. exploreStates) and ignores unknown post-graph nodes (score/pilot/collect).
56
+ */
57
+ export function advanceNodes(nodes, activeNode) {
58
+ const idx = nodes.findIndex((n) => n.node === activeNode);
59
+ if (idx === -1)
60
+ return nodes;
61
+ return nodes.map((n, i) => ({
62
+ node: n.node,
63
+ state: i < idx ? "done" : i === idx ? "running" : "pending",
64
+ }));
65
+ }
66
+ /** Mark every node done — used when the run resolves successfully. */
67
+ export function completeNodes(nodes) {
68
+ return nodes.map((n) => ({ node: n.node, state: "done" }));
69
+ }
70
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS;IACT,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,mBAAmB;IACnB,iBAAiB;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,UAAU,CAAU,CAAC;AAEpE,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,OAAO,EAAE,cAAc;IACvB,gBAAgB,EAAE,mBAAmB;IACrC,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,oBAAoB;IACvC,eAAe,EAAE,mBAAmB;IACpC,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC;IAClD,OAAO,aAAa,CAAC,CAAC,kDAAkD;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,UAAkB;IAClE,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC1D,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAC,CAAC;AACN,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * TUI-only view models. Intentionally NOT exported from the package (src/index.ts) —
3
+ * the TUI is a private application layer over the public API.
4
+ */
5
+ import type { ExploreResult, DesignResult, AutomateResult } from "../index.js";
6
+ /** The four runnable commands the launcher offers. */
7
+ export type Command = "explore" | "design" | "automate" | "observe";
8
+ /** Any terminal result the SummaryScreen may render. */
9
+ export type AnyResult = ExploreResult | DesignResult | AutomateResult;
10
+ export type PlanningStyle = "happy" | "negative" | "coverage" | "all";
11
+ /** Values collected by FormScreen before a run. `config` is added later by useRunner. */
12
+ export interface FormValues {
13
+ url: string;
14
+ session?: string;
15
+ sessionFile?: string;
16
+ checklist?: string;
17
+ style: PlanningStyle;
18
+ headed: boolean;
19
+ runDir?: string;
20
+ validate?: boolean;
21
+ }
22
+ /** One past run, summarized from runs/<id>/report.json for the RunsListScreen. */
23
+ export interface RunSummary {
24
+ runId: string;
25
+ dir: string;
26
+ url: string;
27
+ mode: "explore" | "design";
28
+ greenRatio?: number;
29
+ pilot?: "pass" | "needs-work" | "fail";
30
+ testCaseCount: number;
31
+ date: Date;
32
+ }
33
+ /** Live status of one graph node on the dashboard checklist. */
34
+ export interface NodeStatus {
35
+ node: string;
36
+ state: "pending" | "running" | "done";
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tui/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/E,sDAAsD;AACtD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpE,wDAAwD;AACxD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAEtE,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tui/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { type RawTestResult } from "./runner.js";
2
+ export { runSpecs } from "./runner.js";
3
+ export type { RawTestResult, TestStatus } from "./runner.js";
4
+ export interface TestResult {
5
+ test: string;
6
+ status: "passed" | "failed" | "flaky";
7
+ }
8
+ export interface ValidationReport {
9
+ results: TestResult[];
10
+ /** Share of consistently green tests (flaky does NOT count as green). */
11
+ greenRatio: number;
12
+ flakyCount: number;
13
+ }
14
+ /**
15
+ * Classify N runs into pass/fail/flaky (Spike S4): passed = all runs green;
16
+ * failed = none green; flaky = mixed. Flaky does not count as green (does not poison greenRatio).
17
+ */
18
+ export declare function classifyRuns(runs: RawTestResult[][]): ValidationReport;
19
+ export interface ValidateOptions {
20
+ /** Number of runs for flaky detection (Spike S4; default 2). */
21
+ reruns?: number;
22
+ /** storageState file for authenticated runs (passed to playwright.config). */
23
+ storageStatePath?: string;
24
+ }
25
+ /**
26
+ * Run the generated suite (already written to runDir/tests) N times and classify it.
27
+ * ⚠️ runDir must be INSIDE the project (spec files resolve @playwright/test via node_modules).
28
+ */
29
+ export declare function validateSuite(runDir: string, opts?: ValidateOptions): Promise<ValidationReport>;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,gBAAgB,CAsBtE;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAO3B"}
@@ -0,0 +1,39 @@
1
+ import { runSpecs } from "./runner.js";
2
+ export { runSpecs } from "./runner.js";
3
+ /**
4
+ * Classify N runs into pass/fail/flaky (Spike S4): passed = all runs green;
5
+ * failed = none green; flaky = mixed. Flaky does not count as green (does not poison greenRatio).
6
+ */
7
+ export function classifyRuns(runs) {
8
+ const byTitle = new Map();
9
+ for (const run of runs) {
10
+ for (const t of run) {
11
+ const arr = byTitle.get(t.title) ?? [];
12
+ arr.push(t.status);
13
+ byTitle.set(t.title, arr);
14
+ }
15
+ }
16
+ const results = [];
17
+ for (const [title, statuses] of byTitle) {
18
+ const passes = statuses.filter((s) => s === "passed").length;
19
+ const status = passes === statuses.length ? "passed" : passes === 0 ? "failed" : "flaky";
20
+ results.push({ test: title, status });
21
+ }
22
+ const passed = results.filter((r) => r.status === "passed").length;
23
+ const flakyCount = results.filter((r) => r.status === "flaky").length;
24
+ const greenRatio = results.length > 0 ? passed / results.length : 0;
25
+ return { results, greenRatio, flakyCount };
26
+ }
27
+ /**
28
+ * Run the generated suite (already written to runDir/tests) N times and classify it.
29
+ * ⚠️ runDir must be INSIDE the project (spec files resolve @playwright/test via node_modules).
30
+ */
31
+ export async function validateSuite(runDir, opts = {}) {
32
+ const reruns = Math.max(1, opts.reruns ?? 2);
33
+ const runs = [];
34
+ for (let i = 0; i < reruns; i += 1) {
35
+ runs.push(await runSpecs(runDir, { storageStatePath: opts.storageStatePath }));
36
+ }
37
+ return classifyRuns(runs);
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAevC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC7D,MAAM,MAAM,GACV,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAC7C,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,OAAwB,EAAE;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type TestStatus = "passed" | "failed" | "timedOut" | "skipped" | "interrupted";
2
+ export interface RawTestResult {
3
+ title: string;
4
+ status: TestStatus;
5
+ }
6
+ export interface RunSpecsOptions {
7
+ /** storageState file for authenticated runs (use.storageState). */
8
+ storageStatePath?: string;
9
+ }
10
+ /**
11
+ * Run the generated suite (runDir/tests) through the playwright test runner and return
12
+ * a per-test result. The JSON reporter writes to stdout; a non-zero exit code (there are failures) is not an error.
13
+ */
14
+ export declare function runSpecs(runDir: string, opts?: RunSpecsOptions): Promise<RawTestResult[]>;
15
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/validate/runner.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;AACtF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB;AAkBD,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2BD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA4BnG"}
@@ -0,0 +1,74 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { createRequire } from "node:module";
4
+ import { writeFile } from "node:fs/promises";
5
+ import { dirname, join, resolve } from "node:path";
6
+ const execFileAsync = promisify(execFile);
7
+ const require = createRequire(import.meta.url);
8
+ /** Run via `node <playwright>/cli.js test` — cross-platform, without npx/.cmd. */
9
+ const PW_CLI = join(dirname(require.resolve("playwright/package.json")), "cli.js");
10
+ /** Absolute path to @playwright/test — so the config resolves it from any runDir folder. */
11
+ const PW_TEST = require.resolve("@playwright/test");
12
+ function configContent(runDir, storageStatePath) {
13
+ const launchOpts = `launchOptions: { args: ['--disable-blink-features=AutomationControlled'] }`;
14
+ const use = storageStatePath
15
+ ? `{ headless: true, storageState: ${JSON.stringify(storageStatePath)}, ${launchOpts} }`
16
+ : `{ headless: true, ${launchOpts} }`;
17
+ return `const { defineConfig } = require(${JSON.stringify(PW_TEST)});
18
+ module.exports = defineConfig({
19
+ testDir: ${JSON.stringify(join(runDir, "tests"))},
20
+ fullyParallel: true,
21
+ retries: 0,
22
+ reporter: 'json',
23
+ use: ${use},
24
+ });
25
+ `;
26
+ }
27
+ function extract(json) {
28
+ const out = [];
29
+ const walk = (s) => {
30
+ for (const spec of s.specs ?? []) {
31
+ const status = (spec.tests?.[0]?.results?.[0]?.status ?? "failed");
32
+ out.push({ title: spec.title, status });
33
+ }
34
+ for (const child of s.suites ?? [])
35
+ walk(child);
36
+ };
37
+ for (const s of json.suites ?? [])
38
+ walk(s);
39
+ return out;
40
+ }
41
+ /**
42
+ * Run the generated suite (runDir/tests) through the playwright test runner and return
43
+ * a per-test result. The JSON reporter writes to stdout; a non-zero exit code (there are failures) is not an error.
44
+ */
45
+ export async function runSpecs(runDir, opts = {}) {
46
+ const absRunDir = resolve(runDir); // testDir in the config must be absolute
47
+ const configPath = join(absRunDir, "playwright.config.cjs");
48
+ await writeFile(configPath, configContent(absRunDir, opts.storageStatePath), "utf8");
49
+ // Do not inherit the parent runner's NODE_OPTIONS (vitest/tsx loader) — otherwise the child
50
+ // playwright process tries to apply a foreign loader and crashes.
51
+ const childEnv = { ...process.env, FORCE_COLOR: "0" };
52
+ delete childEnv.NODE_OPTIONS;
53
+ let stdout = "";
54
+ try {
55
+ const r = await execFileAsync(process.execPath, [PW_CLI, "test", `--config=${configPath}`], {
56
+ maxBuffer: 64 * 1024 * 1024,
57
+ env: childEnv,
58
+ });
59
+ stdout = r.stdout;
60
+ }
61
+ catch (e) {
62
+ stdout = e.stdout ?? "";
63
+ }
64
+ const start = stdout.indexOf("{");
65
+ if (start < 0)
66
+ return [];
67
+ try {
68
+ return extract(JSON.parse(stdout.slice(start)));
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/validate/runner.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@plune-ai/cairn",
3
+ "version": "0.2.1",
4
+ "description": "Cairn — an AI that walks your system and leaves a trail of tests. Autonomous QA agent (UI today; API/unit/docs planned) on LangGraph + Claude/OpenRouter, with self-improvement via Langfuse.",
5
+ "type": "module",
6
+ "license": "GPL-3.0-only",
7
+ "author": "plune-ai",
8
+ "keywords": [
9
+ "cairn",
10
+ "qa",
11
+ "testing",
12
+ "test-generation",
13
+ "playwright",
14
+ "ui-testing",
15
+ "langgraph",
16
+ "ai-agent",
17
+ "langfuse",
18
+ "anthropic",
19
+ "openrouter"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/plune-ai/cairn.git"
24
+ },
25
+ "homepage": "https://github.com/plune-ai/cairn#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/plune-ai/cairn/issues"
28
+ },
29
+ "engines": {
30
+ "node": ">=20"
31
+ },
32
+ "bin": {
33
+ "cairn": "dist/cli/index.js",
34
+ "lex-bot": "dist/cli/lex-bot.js"
35
+ },
36
+ "main": "./dist/index.js",
37
+ "types": "./dist/index.d.ts",
38
+ "exports": {
39
+ ".": {
40
+ "types": "./dist/index.d.ts",
41
+ "import": "./dist/index.js"
42
+ }
43
+ },
44
+ "files": [
45
+ "dist"
46
+ ],
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.json",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest",
55
+ "test:coverage": "vitest run --coverage",
56
+ "lint": "eslint .",
57
+ "session:save": "tsx scripts/save-session.ts",
58
+ "spike:s1-zod": "tsx scripts/spike-s1-zod.ts",
59
+ "spike:s2-vision": "tsx scripts/spike-s2-vision.ts",
60
+ "spike:s5-langfuse": "tsx scripts/spike-s5-langfuse.ts",
61
+ "spike:s6-parity": "tsx scripts/spike-s6-parity.ts"
62
+ },
63
+ "dependencies": {
64
+ "@langchain/anthropic": "^1.4.0",
65
+ "@langchain/core": "^1.1.48",
66
+ "@langchain/langgraph": "^1.3.6",
67
+ "@langchain/openai": "^1.4.7",
68
+ "@langfuse/client": "^5.4.1",
69
+ "@langfuse/langchain": "^5.4.1",
70
+ "@langfuse/otel": "^5.4.1",
71
+ "@langfuse/tracing": "^5.4.1",
72
+ "@opentelemetry/api": "^1.9.1",
73
+ "@opentelemetry/sdk-node": "^0.218.0",
74
+ "@playwright/cli": "^0.1.13",
75
+ "@playwright/test": "^1.60.0",
76
+ "commander": "^15.0.0",
77
+ "dotenv": "^17.4.2",
78
+ "ink": "^5.2.1",
79
+ "ink-select-input": "^6.2.0",
80
+ "ink-spinner": "^5.0.0",
81
+ "ink-text-input": "^6.0.0",
82
+ "playwright": "^1.60.0",
83
+ "react": "^18.3.1",
84
+ "zod": "^4.4.3"
85
+ },
86
+ "devDependencies": {
87
+ "@types/node": "^22.0.0",
88
+ "@types/react": "^18.3.31",
89
+ "@vitest/coverage-v8": "^4.1.8",
90
+ "eslint": "^10.4.1",
91
+ "ink-testing-library": "^4.0.0",
92
+ "tsx": "^4.22.4",
93
+ "typescript": "^5.9.3",
94
+ "typescript-eslint": "^8.60.1",
95
+ "vitest": "^4.1.8"
96
+ }
97
+ }