@interf/compiler 0.6.1 → 0.6.4

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 (391) hide show
  1. package/README.md +106 -80
  2. package/builtin-workflows/interf/README.md +5 -5
  3. package/builtin-workflows/interf/compile/stages/shape/SKILL.md +4 -4
  4. package/builtin-workflows/interf/improve/SKILL.md +2 -2
  5. package/builtin-workflows/interf/use/query/SKILL.md +1 -1
  6. package/builtin-workflows/interf/workflow.json +6 -6
  7. package/builtin-workflows/interf/workflow.schema.json +1 -1
  8. package/dist/bin.js +2 -28
  9. package/dist/{commands → cli/commands}/check-draft.d.ts +2 -2
  10. package/dist/{commands → cli/commands}/check-draft.js +16 -16
  11. package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
  12. package/dist/{commands → cli/commands}/compile-controller.js +37 -35
  13. package/dist/{commands → cli/commands}/compile.d.ts +2 -2
  14. package/dist/{commands → cli/commands}/compile.js +15 -11
  15. package/dist/{commands → cli/commands}/compiled-flow.d.ts +3 -4
  16. package/dist/{commands → cli/commands}/compiled-flow.js +9 -14
  17. package/dist/{commands → cli/commands}/create-workflow-wizard.d.ts +3 -3
  18. package/dist/{commands → cli/commands}/create-workflow-wizard.js +64 -37
  19. package/dist/{commands → cli/commands}/create.d.ts +1 -1
  20. package/dist/{commands → cli/commands}/create.js +15 -18
  21. package/dist/{commands → cli/commands}/dataset-selection.d.ts +1 -1
  22. package/dist/{commands → cli/commands}/default.js +3 -3
  23. package/dist/{commands → cli/commands}/doctor.js +5 -6
  24. package/dist/{commands → cli/commands}/executor-flow.d.ts +1 -1
  25. package/dist/{commands → cli/commands}/executor-flow.js +13 -16
  26. package/dist/{commands → cli/commands}/init.d.ts +4 -1
  27. package/dist/{commands → cli/commands}/init.js +162 -77
  28. package/dist/{commands → cli/commands}/list.js +6 -6
  29. package/dist/{commands → cli/commands}/reset.js +4 -4
  30. package/dist/{commands → cli/commands}/source-config-wizard.d.ts +9 -4
  31. package/dist/{commands → cli/commands}/source-config-wizard.js +168 -94
  32. package/dist/{commands → cli/commands}/status.js +20 -11
  33. package/dist/{commands → cli/commands}/test-flow.d.ts +13 -4
  34. package/dist/{commands → cli/commands}/test-flow.js +52 -48
  35. package/dist/cli/commands/test.d.ts +14 -0
  36. package/dist/{commands → cli/commands}/test.js +40 -24
  37. package/dist/{commands → cli/commands}/verify.js +4 -4
  38. package/dist/cli/index.d.ts +21 -0
  39. package/dist/cli/index.js +33 -0
  40. package/dist/index.d.ts +22 -11
  41. package/dist/index.js +15 -6
  42. package/dist/lib/agent-args.d.ts +1 -4
  43. package/dist/lib/agent-args.js +1 -52
  44. package/dist/lib/agent-constants.d.ts +1 -5
  45. package/dist/lib/agent-constants.js +1 -28
  46. package/dist/lib/agent-detection.d.ts +1 -7
  47. package/dist/lib/agent-detection.js +1 -65
  48. package/dist/lib/agent-execution.d.ts +1 -2
  49. package/dist/lib/agent-execution.js +1 -243
  50. package/dist/lib/agent-logs.d.ts +1 -2
  51. package/dist/lib/agent-logs.js +1 -17
  52. package/dist/lib/agent-preflight.d.ts +1 -7
  53. package/dist/lib/agent-preflight.js +1 -77
  54. package/dist/lib/agent-render.d.ts +1 -8
  55. package/dist/lib/agent-render.js +1 -218
  56. package/dist/lib/agent-shells.d.ts +1 -69
  57. package/dist/lib/agent-shells.js +1 -1021
  58. package/dist/lib/agent-status.d.ts +1 -3
  59. package/dist/lib/agent-status.js +1 -58
  60. package/dist/lib/agent-types.d.ts +1 -30
  61. package/dist/lib/agent-types.js +1 -1
  62. package/dist/lib/agents.d.ts +1 -6
  63. package/dist/lib/agents.js +1 -5
  64. package/dist/lib/builtin-compiled-workflow.d.ts +1 -38
  65. package/dist/lib/builtin-compiled-workflow.js +1 -94
  66. package/dist/lib/chart-guidance.d.ts +1 -1
  67. package/dist/lib/chart-guidance.js +1 -8
  68. package/dist/lib/compiled-compile.d.ts +1 -48
  69. package/dist/lib/compiled-compile.js +1 -255
  70. package/dist/lib/compiled-paths.d.ts +1 -40
  71. package/dist/lib/compiled-paths.js +3 -106
  72. package/dist/lib/compiled-raw.d.ts +1 -49
  73. package/dist/lib/compiled-raw.js +3 -102
  74. package/dist/lib/compiled-reset.d.ts +1 -2
  75. package/dist/lib/compiled-reset.js +3 -72
  76. package/dist/lib/compiled-schema.d.ts +1 -31
  77. package/dist/lib/compiled-schema.js +1 -141
  78. package/dist/lib/discovery.d.ts +1 -7
  79. package/dist/lib/discovery.js +1 -84
  80. package/dist/lib/execution-profile.d.ts +1 -17
  81. package/dist/lib/execution-profile.js +1 -84
  82. package/dist/lib/executors.d.ts +1 -32
  83. package/dist/lib/executors.js +1 -43
  84. package/dist/lib/filesystem.d.ts +1 -2
  85. package/dist/lib/filesystem.js +1 -55
  86. package/dist/lib/interf-bootstrap.d.ts +1 -3
  87. package/dist/lib/interf-bootstrap.js +3 -18
  88. package/dist/lib/interf-detect.d.ts +1 -33
  89. package/dist/lib/interf-detect.js +3 -176
  90. package/dist/lib/interf-scaffold.d.ts +1 -2
  91. package/dist/lib/interf-scaffold.js +3 -114
  92. package/dist/lib/interf-workflow-package.d.ts +1 -25
  93. package/dist/lib/interf-workflow-package.js +1 -342
  94. package/dist/lib/interf.d.ts +1 -5
  95. package/dist/lib/interf.js +3 -4
  96. package/dist/lib/local-workflows.d.ts +1 -54
  97. package/dist/lib/local-workflows.js +1 -422
  98. package/dist/lib/logger.d.ts +1 -3
  99. package/dist/lib/logger.js +1 -10
  100. package/dist/lib/package-root.d.ts +1 -0
  101. package/dist/lib/package-root.js +1 -0
  102. package/dist/lib/parse.d.ts +1 -8
  103. package/dist/lib/parse.js +1 -145
  104. package/dist/lib/project-paths.d.ts +1 -11
  105. package/dist/lib/project-paths.js +3 -32
  106. package/dist/lib/runtime-acceptance.d.ts +1 -9
  107. package/dist/lib/runtime-acceptance.js +1 -269
  108. package/dist/lib/runtime-contracts.d.ts +1 -2
  109. package/dist/lib/runtime-contracts.js +1 -48
  110. package/dist/lib/runtime-inventory.d.ts +1 -7
  111. package/dist/lib/runtime-inventory.js +1 -29
  112. package/dist/lib/runtime-paths.d.ts +1 -8
  113. package/dist/lib/runtime-paths.js +1 -26
  114. package/dist/lib/runtime-prompt.d.ts +1 -2
  115. package/dist/lib/runtime-prompt.js +1 -48
  116. package/dist/lib/runtime-reconcile.d.ts +1 -2
  117. package/dist/lib/runtime-reconcile.js +1 -193
  118. package/dist/lib/runtime-runs.d.ts +1 -11
  119. package/dist/lib/runtime-runs.js +1 -262
  120. package/dist/lib/runtime-types.d.ts +1 -43
  121. package/dist/lib/runtime-types.js +1 -1
  122. package/dist/lib/runtime.d.ts +1 -6
  123. package/dist/lib/runtime.js +1 -5
  124. package/dist/lib/schema.d.ts +4 -1073
  125. package/dist/lib/schema.js +6 -542
  126. package/dist/lib/source-config.d.ts +1 -39
  127. package/dist/lib/source-config.js +3 -293
  128. package/dist/lib/state-artifacts.d.ts +1 -8
  129. package/dist/lib/state-artifacts.js +1 -13
  130. package/dist/lib/state-health.d.ts +1 -4
  131. package/dist/lib/state-health.js +1 -132
  132. package/dist/lib/state-io.d.ts +1 -10
  133. package/dist/lib/state-io.js +1 -76
  134. package/dist/lib/state-paths.d.ts +1 -4
  135. package/dist/lib/state-paths.js +1 -13
  136. package/dist/lib/state-view.d.ts +1 -4
  137. package/dist/lib/state-view.js +1 -103
  138. package/dist/lib/state.d.ts +1 -7
  139. package/dist/lib/state.js +1 -12
  140. package/dist/lib/test-execution.d.ts +1 -14
  141. package/dist/lib/test-execution.js +3 -525
  142. package/dist/lib/test-matrices.d.ts +1 -90
  143. package/dist/lib/test-matrices.js +3 -96
  144. package/dist/lib/test-paths.d.ts +1 -12
  145. package/dist/lib/test-paths.js +3 -59
  146. package/dist/lib/test-profile-presets.d.ts +1 -57
  147. package/dist/lib/test-profile-presets.js +3 -50
  148. package/dist/lib/test-sandbox.d.ts +1 -11
  149. package/dist/lib/test-sandbox.js +3 -105
  150. package/dist/lib/test-specs.d.ts +1 -7
  151. package/dist/lib/test-specs.js +3 -114
  152. package/dist/lib/test-targets.d.ts +1 -5
  153. package/dist/lib/test-targets.js +3 -38
  154. package/dist/lib/test-types.d.ts +1 -17
  155. package/dist/lib/test-types.js +3 -1
  156. package/dist/lib/test.d.ts +1 -4
  157. package/dist/lib/test.js +3 -3
  158. package/dist/lib/util.d.ts +1 -4
  159. package/dist/lib/util.js +1 -25
  160. package/dist/lib/validate-compiled.d.ts +1 -27
  161. package/dist/lib/validate-compiled.js +1 -241
  162. package/dist/lib/validate-helpers.d.ts +1 -12
  163. package/dist/lib/validate-helpers.js +1 -41
  164. package/dist/lib/validate.d.ts +1 -21
  165. package/dist/lib/validate.js +1 -249
  166. package/dist/lib/workflow-authoring.d.ts +1 -26
  167. package/dist/lib/workflow-authoring.js +1 -119
  168. package/dist/lib/workflow-definitions.d.ts +1 -78
  169. package/dist/lib/workflow-definitions.js +1 -203
  170. package/dist/lib/workflow-edit-session.d.ts +1 -16
  171. package/dist/lib/workflow-edit-session.js +1 -57
  172. package/dist/lib/workflow-edit-utils.d.ts +1 -10
  173. package/dist/lib/workflow-edit-utils.js +1 -39
  174. package/dist/lib/workflow-helpers.d.ts +1 -38
  175. package/dist/lib/workflow-helpers.js +1 -167
  176. package/dist/lib/workflow-improvement.d.ts +1 -22
  177. package/dist/lib/workflow-improvement.js +1 -209
  178. package/dist/lib/workflow-primitives.d.ts +1 -2
  179. package/dist/lib/workflow-primitives.js +1 -5
  180. package/dist/lib/workflow-review-paths.d.ts +1 -10
  181. package/dist/lib/workflow-review-paths.js +1 -27
  182. package/dist/lib/workflow-stage-policy.d.ts +1 -5
  183. package/dist/lib/workflow-stage-policy.js +1 -31
  184. package/dist/lib/workflow-stage-runner.d.ts +1 -41
  185. package/dist/lib/workflow-stage-runner.js +1 -109
  186. package/dist/lib/workflows.d.ts +1 -15
  187. package/dist/lib/workflows.js +1 -31
  188. package/dist/packages/agents/index.d.ts +18 -0
  189. package/dist/packages/agents/index.js +16 -0
  190. package/dist/packages/agents/lib/agents.d.ts +6 -0
  191. package/dist/packages/agents/lib/agents.js +5 -0
  192. package/dist/packages/agents/lib/args.d.ts +4 -0
  193. package/dist/packages/agents/lib/args.js +52 -0
  194. package/dist/packages/agents/lib/chart-guidance.d.ts +1 -0
  195. package/dist/packages/agents/lib/chart-guidance.js +8 -0
  196. package/dist/packages/agents/lib/compiled-bootstrap.d.ts +3 -0
  197. package/dist/packages/agents/lib/compiled-bootstrap.js +18 -0
  198. package/dist/packages/agents/lib/constants.d.ts +5 -0
  199. package/dist/packages/agents/lib/constants.js +28 -0
  200. package/dist/packages/agents/lib/detection.d.ts +7 -0
  201. package/dist/packages/agents/lib/detection.js +65 -0
  202. package/dist/packages/agents/lib/execution-profile.d.ts +17 -0
  203. package/dist/packages/agents/lib/execution-profile.js +84 -0
  204. package/dist/packages/agents/lib/execution.d.ts +2 -0
  205. package/dist/packages/agents/lib/execution.js +243 -0
  206. package/dist/packages/agents/lib/executors.d.ts +32 -0
  207. package/dist/packages/agents/lib/executors.js +45 -0
  208. package/dist/packages/agents/lib/logs.d.ts +2 -0
  209. package/dist/packages/agents/lib/logs.js +17 -0
  210. package/dist/packages/agents/lib/preflight.d.ts +7 -0
  211. package/dist/packages/agents/lib/preflight.js +77 -0
  212. package/dist/packages/agents/lib/render.d.ts +8 -0
  213. package/dist/packages/agents/lib/render.js +218 -0
  214. package/dist/packages/agents/lib/schema.d.ts +8 -0
  215. package/dist/packages/agents/lib/schema.js +7 -0
  216. package/dist/packages/agents/lib/shells.d.ts +71 -0
  217. package/dist/packages/agents/lib/shells.js +1023 -0
  218. package/dist/packages/agents/lib/status.d.ts +3 -0
  219. package/dist/packages/agents/lib/status.js +58 -0
  220. package/dist/packages/agents/lib/types.d.ts +30 -0
  221. package/dist/packages/agents/lib/types.js +1 -0
  222. package/dist/{lib → packages/agents/lib}/user-config.d.ts +1 -0
  223. package/dist/{lib → packages/agents/lib}/user-config.js +3 -2
  224. package/dist/packages/compiler/compiled-compile.d.ts +4 -0
  225. package/dist/packages/compiler/compiled-compile.js +4 -0
  226. package/dist/packages/compiler/compiled-paths.d.ts +40 -0
  227. package/dist/packages/compiler/compiled-paths.js +106 -0
  228. package/dist/packages/compiler/compiled-pipeline.d.ts +39 -0
  229. package/dist/packages/compiler/compiled-pipeline.js +134 -0
  230. package/dist/packages/compiler/compiled-schema.d.ts +31 -0
  231. package/dist/packages/compiler/compiled-schema.js +141 -0
  232. package/dist/packages/compiler/compiled-stage-plan.d.ts +15 -0
  233. package/dist/packages/compiler/compiled-stage-plan.js +79 -0
  234. package/dist/packages/compiler/compiled-stage-runner.d.ts +10 -0
  235. package/dist/packages/compiler/compiled-stage-runner.js +46 -0
  236. package/dist/packages/compiler/compiled-target.d.ts +11 -0
  237. package/dist/packages/compiler/compiled-target.js +16 -0
  238. package/dist/packages/compiler/discovery.d.ts +7 -0
  239. package/dist/packages/compiler/discovery.js +80 -0
  240. package/dist/packages/compiler/index.d.ts +24 -0
  241. package/dist/packages/compiler/index.js +23 -0
  242. package/dist/packages/compiler/lib/schema.d.ts +684 -0
  243. package/dist/packages/compiler/lib/schema.js +363 -0
  244. package/dist/packages/compiler/raw-snapshot.d.ts +49 -0
  245. package/dist/packages/compiler/raw-snapshot.js +102 -0
  246. package/dist/packages/compiler/reset.d.ts +2 -0
  247. package/dist/packages/compiler/reset.js +72 -0
  248. package/dist/packages/compiler/runtime-acceptance.d.ts +9 -0
  249. package/dist/packages/compiler/runtime-acceptance.js +269 -0
  250. package/dist/packages/compiler/runtime-contracts.d.ts +2 -0
  251. package/dist/packages/compiler/runtime-contracts.js +48 -0
  252. package/dist/packages/compiler/runtime-inventory.d.ts +7 -0
  253. package/dist/packages/compiler/runtime-inventory.js +29 -0
  254. package/dist/packages/compiler/runtime-paths.d.ts +8 -0
  255. package/dist/packages/compiler/runtime-paths.js +26 -0
  256. package/dist/packages/compiler/runtime-prompt.d.ts +2 -0
  257. package/dist/packages/compiler/runtime-prompt.js +48 -0
  258. package/dist/packages/compiler/runtime-reconcile.d.ts +2 -0
  259. package/dist/packages/compiler/runtime-reconcile.js +193 -0
  260. package/dist/packages/compiler/runtime-runs.d.ts +11 -0
  261. package/dist/packages/compiler/runtime-runs.js +262 -0
  262. package/dist/packages/compiler/runtime-types.d.ts +43 -0
  263. package/dist/packages/compiler/runtime-types.js +1 -0
  264. package/dist/packages/compiler/runtime.d.ts +6 -0
  265. package/dist/packages/compiler/runtime.js +5 -0
  266. package/dist/packages/compiler/state-artifacts.d.ts +8 -0
  267. package/dist/packages/compiler/state-artifacts.js +13 -0
  268. package/dist/packages/compiler/state-health.d.ts +4 -0
  269. package/dist/packages/compiler/state-health.js +132 -0
  270. package/dist/packages/compiler/state-io.d.ts +10 -0
  271. package/dist/packages/compiler/state-io.js +76 -0
  272. package/dist/packages/compiler/state-paths.d.ts +4 -0
  273. package/dist/packages/compiler/state-paths.js +13 -0
  274. package/dist/packages/compiler/state-view.d.ts +4 -0
  275. package/dist/packages/compiler/state-view.js +103 -0
  276. package/dist/packages/compiler/state.d.ts +7 -0
  277. package/dist/packages/compiler/state.js +12 -0
  278. package/dist/packages/compiler/validate-compiled.d.ts +27 -0
  279. package/dist/packages/compiler/validate-compiled.js +241 -0
  280. package/dist/packages/compiler/validate-helpers.d.ts +12 -0
  281. package/dist/packages/compiler/validate-helpers.js +41 -0
  282. package/dist/packages/compiler/validate.d.ts +21 -0
  283. package/dist/packages/compiler/validate.js +249 -0
  284. package/dist/packages/compiler/workflow-primitives.d.ts +2 -0
  285. package/dist/packages/compiler/workflow-primitives.js +5 -0
  286. package/dist/packages/compiler/workflows.d.ts +15 -0
  287. package/dist/packages/compiler/workflows.js +31 -0
  288. package/dist/packages/project-model/compiled-paths.d.ts +1 -0
  289. package/dist/packages/project-model/compiled-paths.js +1 -0
  290. package/dist/packages/project-model/compiled-raw.d.ts +1 -0
  291. package/dist/packages/project-model/compiled-raw.js +1 -0
  292. package/dist/packages/project-model/compiled-reset.d.ts +1 -0
  293. package/dist/packages/project-model/compiled-reset.js +1 -0
  294. package/dist/packages/project-model/index.d.ts +11 -0
  295. package/dist/packages/project-model/index.js +10 -0
  296. package/dist/packages/project-model/interf-bootstrap.d.ts +1 -0
  297. package/dist/packages/project-model/interf-bootstrap.js +1 -0
  298. package/dist/packages/project-model/interf-detect.d.ts +33 -0
  299. package/dist/packages/project-model/interf-detect.js +176 -0
  300. package/dist/packages/project-model/interf-scaffold.d.ts +2 -0
  301. package/dist/packages/project-model/interf-scaffold.js +124 -0
  302. package/dist/packages/project-model/interf.d.ts +5 -0
  303. package/dist/packages/project-model/interf.js +4 -0
  304. package/dist/packages/project-model/lib/schema.d.ts +125 -0
  305. package/dist/packages/project-model/lib/schema.js +62 -0
  306. package/dist/packages/project-model/project-paths.d.ts +11 -0
  307. package/dist/packages/project-model/project-paths.js +32 -0
  308. package/dist/packages/project-model/source-config.d.ts +38 -0
  309. package/dist/packages/project-model/source-config.js +298 -0
  310. package/dist/packages/shared/file-types.d.ts +1 -0
  311. package/dist/packages/shared/file-types.js +4 -0
  312. package/dist/packages/shared/filesystem.d.ts +2 -0
  313. package/dist/packages/shared/filesystem.js +55 -0
  314. package/dist/packages/shared/index.d.ts +7 -0
  315. package/dist/packages/shared/index.js +7 -0
  316. package/dist/packages/shared/logger.d.ts +3 -0
  317. package/dist/packages/shared/logger.js +10 -0
  318. package/dist/packages/shared/naming.d.ts +1 -0
  319. package/dist/packages/shared/naming.js +8 -0
  320. package/dist/packages/shared/parse.d.ts +8 -0
  321. package/dist/packages/shared/parse.js +145 -0
  322. package/dist/packages/shared/path-guards.d.ts +2 -0
  323. package/dist/packages/shared/path-guards.js +14 -0
  324. package/dist/packages/shared/util.d.ts +3 -0
  325. package/dist/packages/shared/util.js +3 -0
  326. package/dist/packages/testing/index.d.ts +13 -0
  327. package/dist/packages/testing/index.js +10 -0
  328. package/dist/packages/testing/lib/schema.d.ts +261 -0
  329. package/dist/packages/testing/lib/schema.js +119 -0
  330. package/dist/packages/testing/test-execution.d.ts +14 -0
  331. package/dist/packages/testing/test-execution.js +525 -0
  332. package/dist/packages/testing/test-matrices.d.ts +90 -0
  333. package/dist/packages/testing/test-matrices.js +96 -0
  334. package/dist/packages/testing/test-paths.d.ts +12 -0
  335. package/dist/packages/testing/test-paths.js +59 -0
  336. package/dist/packages/testing/test-profile-presets.d.ts +57 -0
  337. package/dist/packages/testing/test-profile-presets.js +50 -0
  338. package/dist/packages/testing/test-sandbox.d.ts +11 -0
  339. package/dist/packages/testing/test-sandbox.js +105 -0
  340. package/dist/packages/testing/test-specs.d.ts +7 -0
  341. package/dist/packages/testing/test-specs.js +114 -0
  342. package/dist/packages/testing/test-targets.d.ts +5 -0
  343. package/dist/packages/testing/test-targets.js +38 -0
  344. package/dist/packages/testing/test-types.d.ts +16 -0
  345. package/dist/packages/testing/test-types.js +1 -0
  346. package/dist/packages/testing/test.d.ts +4 -0
  347. package/dist/packages/testing/test.js +3 -0
  348. package/dist/packages/workflow-authoring/index.d.ts +4 -0
  349. package/dist/packages/workflow-authoring/index.js +4 -0
  350. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.d.ts +10 -0
  351. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.js +39 -0
  352. package/dist/packages/workflow-authoring/workflow-authoring.d.ts +26 -0
  353. package/dist/packages/workflow-authoring/workflow-authoring.js +121 -0
  354. package/dist/packages/workflow-authoring/workflow-edit-session.d.ts +16 -0
  355. package/dist/packages/workflow-authoring/workflow-edit-session.js +57 -0
  356. package/dist/packages/workflow-authoring/workflow-improvement.d.ts +23 -0
  357. package/dist/packages/workflow-authoring/workflow-improvement.js +210 -0
  358. package/dist/packages/workflow-package/builtin-compiled-workflow.d.ts +38 -0
  359. package/dist/packages/workflow-package/builtin-compiled-workflow.js +94 -0
  360. package/dist/packages/workflow-package/context-interface.d.ts +96 -0
  361. package/dist/packages/workflow-package/context-interface.js +146 -0
  362. package/dist/packages/workflow-package/index.d.ts +11 -0
  363. package/dist/packages/workflow-package/index.js +11 -0
  364. package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
  365. package/dist/packages/workflow-package/interf-workflow-package.js +389 -0
  366. package/dist/{lib/config.d.ts → packages/workflow-package/lib/package-root.d.ts} +0 -1
  367. package/dist/packages/workflow-package/lib/package-root.js +6 -0
  368. package/dist/packages/workflow-package/local-workflows.d.ts +57 -0
  369. package/dist/packages/workflow-package/local-workflows.js +424 -0
  370. package/dist/packages/workflow-package/workflow-definitions.d.ts +82 -0
  371. package/dist/packages/workflow-package/workflow-definitions.js +210 -0
  372. package/dist/packages/workflow-package/workflow-helpers.d.ts +38 -0
  373. package/dist/packages/workflow-package/workflow-helpers.js +167 -0
  374. package/dist/packages/workflow-package/workflow-review-paths.d.ts +10 -0
  375. package/dist/packages/workflow-package/workflow-review-paths.js +27 -0
  376. package/dist/packages/workflow-package/workflow-stage-policy.d.ts +5 -0
  377. package/dist/packages/workflow-package/workflow-stage-policy.js +31 -0
  378. package/dist/packages/workflow-package/workflow-stage-runner.d.ts +41 -0
  379. package/dist/packages/workflow-package/workflow-stage-runner.js +109 -0
  380. package/package.json +43 -19
  381. package/dist/commands/test.d.ts +0 -3
  382. package/dist/lib/compiled-home.d.ts +0 -5
  383. package/dist/lib/compiled-home.js +0 -32
  384. package/dist/lib/config.js +0 -9
  385. /package/dist/{commands → cli/commands}/dataset-selection.js +0 -0
  386. /package/dist/{commands → cli/commands}/default.d.ts +0 -0
  387. /package/dist/{commands → cli/commands}/doctor.d.ts +0 -0
  388. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  389. /package/dist/{commands → cli/commands}/reset.d.ts +0 -0
  390. /package/dist/{commands → cli/commands}/status.d.ts +0 -0
  391. /package/dist/{commands → cli/commands}/verify.d.ts +0 -0
@@ -0,0 +1,298 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { join, relative, resolve, sep } from "node:path";
4
+ import { refreshCompiledBootstrapGuidance } from "../agents/lib/compiled-bootstrap.js";
5
+ import { readInterfConfig, } from "./interf.js";
6
+ import { seedCompiledWorkflowPackage } from "../workflow-package/interf-workflow-package.js";
7
+ import { readJsonFileWithSchema } from "../shared/parse.js";
8
+ import { getCompiledWorkflow } from "../workflow-package/workflow-definitions.js";
9
+ import { SourceFolderConfigSchema, } from "./lib/schema.js";
10
+ import { slugify } from "../shared/naming.js";
11
+ import { assertPathWithinRoot } from "../shared/path-guards.js";
12
+ import { defaultControlPathForCompiled, resolveSourceControlPathForCompiled, compiledInterfConfigPath, compiledInterfRoot, } from "../compiler/compiled-paths.js";
13
+ export const SOURCE_FOLDER_CONFIG_FILE = "interf.json";
14
+ function sourceConfigPath(sourcePath) {
15
+ return join(sourcePath, SOURCE_FOLDER_CONFIG_FILE);
16
+ }
17
+ function normalizeTruthChecks(cases) {
18
+ const seen = new Set();
19
+ return cases.map((caseSpec, index) => {
20
+ const baseId = slugify(caseSpec.id ?? caseSpec.question) || `check-${index + 1}`;
21
+ let id = baseId;
22
+ let suffix = 2;
23
+ while (seen.has(id)) {
24
+ id = `${baseId}-${suffix}`;
25
+ suffix += 1;
26
+ }
27
+ seen.add(id);
28
+ return {
29
+ id,
30
+ question: caseSpec.question.trim(),
31
+ ...(caseSpec.answer ? { answer: caseSpec.answer.trim() } : {}),
32
+ ...(caseSpec.strictness ? { strictness: caseSpec.strictness.trim() } : {}),
33
+ ...(caseSpec.expect ? { expect: caseSpec.expect } : {}),
34
+ };
35
+ });
36
+ }
37
+ export function fingerprintTruthChecks(checks) {
38
+ const normalized = checks.map((check) => ({
39
+ question: check.question.trim(),
40
+ ...(check.answer ? { answer: check.answer.trim() } : {}),
41
+ ...(check.strictness ? { strictness: check.strictness.trim() } : {}),
42
+ ...(check.expect ? { expect: check.expect } : {}),
43
+ }));
44
+ return createHash("sha256")
45
+ .update(JSON.stringify(normalized))
46
+ .digest("hex")
47
+ .slice(0, 16);
48
+ }
49
+ export function loadSourceFolderConfig(sourcePath) {
50
+ const filePath = sourceConfigPath(sourcePath);
51
+ if (!existsSync(filePath))
52
+ return null;
53
+ return readJsonFileWithSchema(filePath, "Interf project config", SourceFolderConfigSchema);
54
+ }
55
+ export function listSourceDatasetConfigs(config) {
56
+ return config?.datasets ?? [];
57
+ }
58
+ export function resolveDatasetCompileMaxAttempts(datasetConfig, override = null) {
59
+ const configured = override ?? datasetConfig.max_attempts ?? null;
60
+ if (configured == null)
61
+ return null;
62
+ const normalized = Math.trunc(configured);
63
+ if (!Number.isFinite(normalized) || normalized < 1)
64
+ return 1;
65
+ return Math.min(5, normalized);
66
+ }
67
+ export function resolveDatasetCompileMaxLoops(datasetConfig, override = null) {
68
+ const configured = override ?? datasetConfig.max_loops ?? null;
69
+ if (configured == null)
70
+ return null;
71
+ const normalized = Math.trunc(configured);
72
+ if (!Number.isFinite(normalized) || normalized < 1)
73
+ return 1;
74
+ return Math.min(3, normalized);
75
+ }
76
+ export function getDefaultSourceDatasetConfig(config) {
77
+ const datasets = listSourceDatasetConfigs(config);
78
+ return datasets[0] ?? null;
79
+ }
80
+ export function findSourceDatasetConfig(config, datasetName) {
81
+ return listSourceDatasetConfigs(config).find((dataset) => dataset.name === datasetName) ?? null;
82
+ }
83
+ function toWritableSourceProjectConfig(config) {
84
+ const datasets = config?.datasets ?? [];
85
+ if (datasets.length > 0) {
86
+ return {
87
+ datasets: datasets.map((dataset) => toWritableSourceDatasetConfig(dataset)),
88
+ };
89
+ }
90
+ return {};
91
+ }
92
+ function toWritableSourceDatasetConfig(dataset) {
93
+ return {
94
+ name: dataset.name,
95
+ path: dataset.path,
96
+ ...(dataset.about ? { about: dataset.about } : {}),
97
+ ...(dataset.workflow && dataset.workflow !== "interf" ? { workflow: dataset.workflow } : {}),
98
+ ...(typeof dataset.max_attempts === "number" ? { max_attempts: dataset.max_attempts } : {}),
99
+ ...(typeof dataset.max_loops === "number" ? { max_loops: dataset.max_loops } : {}),
100
+ checks: dataset.checks,
101
+ };
102
+ }
103
+ export function saveSourceFolderConfig(sourcePath, config) {
104
+ writeFileSync(sourceConfigPath(sourcePath), JSON.stringify(toWritableSourceProjectConfig(config), null, 2) + "\n");
105
+ }
106
+ export function appendSourceDatasetChecks(sourcePath, datasetName, checks) {
107
+ const existing = loadSourceFolderConfig(sourcePath);
108
+ const currentDataset = findSourceDatasetConfig(existing, datasetName);
109
+ const otherDatasets = listSourceDatasetConfigs(existing).filter((dataset) => dataset.name !== datasetName);
110
+ const currentChecks = currentDataset?.checks ?? [];
111
+ const nextDataset = {
112
+ ...toWritableSourceDatasetConfig(currentDataset ?? {
113
+ name: datasetName,
114
+ path: `./${datasetName}`,
115
+ checks: [],
116
+ }),
117
+ checks: [...currentChecks, ...checks],
118
+ };
119
+ saveSourceFolderConfig(sourcePath, {
120
+ datasets: [
121
+ nextDataset,
122
+ ...otherDatasets,
123
+ ],
124
+ });
125
+ }
126
+ export function upsertSourceDatasetConfig(sourcePath, datasetConfig, options = {}) {
127
+ const existing = loadSourceFolderConfig(sourcePath);
128
+ const datasets = listSourceDatasetConfigs(existing);
129
+ const candidateNames = Array.from(new Set([datasetConfig.name, options.matchName].filter((value) => Boolean(value))));
130
+ const existingIndex = datasets.findIndex((entry) => candidateNames.includes(entry.name));
131
+ if (existingIndex >= 0) {
132
+ datasets[existingIndex] = datasetConfig;
133
+ }
134
+ else {
135
+ datasets.push(datasetConfig);
136
+ }
137
+ saveSourceFolderConfig(sourcePath, {
138
+ datasets,
139
+ });
140
+ }
141
+ export function compiledMaxAttempts(maxAttempts) {
142
+ if (maxAttempts == null)
143
+ return undefined;
144
+ return resolveDatasetCompileMaxAttempts({ max_attempts: maxAttempts }, null) ?? 1;
145
+ }
146
+ export function compiledMaxLoops(maxLoops) {
147
+ if (maxLoops == null)
148
+ return undefined;
149
+ return resolveDatasetCompileMaxLoops({ max_loops: maxLoops }, null) ?? 1;
150
+ }
151
+ export function sourceDatasetConfigFromInterfConfig(config, datasetPath = `./${config.name}`) {
152
+ return {
153
+ name: config.name,
154
+ path: datasetPath,
155
+ ...(config.about ? { about: config.about } : {}),
156
+ ...(config.workflow ? { workflow: config.workflow } : {}),
157
+ ...(typeof config.max_attempts === "number"
158
+ ? { max_attempts: config.max_attempts }
159
+ : {}),
160
+ ...(typeof config.max_loops === "number"
161
+ ? { max_loops: config.max_loops }
162
+ : {}),
163
+ checks: config.checks ?? [],
164
+ };
165
+ }
166
+ export function loadCompiledDatasetConfig(compiledPath) {
167
+ const config = readInterfConfig(compiledPath);
168
+ if (!config)
169
+ return null;
170
+ const projectPath = resolveSourceControlPathForCompiled(compiledPath);
171
+ const configuredDatasets = listSourceDatasetConfigs(loadSourceFolderConfig(projectPath));
172
+ const fallbackDatasetPath = configuredDatasets.length === 1
173
+ ? configuredDatasets[0].path
174
+ : `./${config.name}`;
175
+ const datasetPath = typeof config.source?.dataset_path === "string" && config.source.dataset_path.length > 0
176
+ ? relative(projectPath, assertPathWithinRoot(projectPath, resolve(compiledPath, config.source.dataset_path), "Compiled context source path")).split(sep).join("/") || fallbackDatasetPath
177
+ : fallbackDatasetPath;
178
+ return sourceDatasetConfigFromInterfConfig(config, datasetPath);
179
+ }
180
+ export function saveCompiledInterfConfig(compiledPath, config) {
181
+ mkdirSync(compiledInterfRoot(compiledPath), { recursive: true });
182
+ writeFileSync(compiledInterfConfigPath(compiledPath), JSON.stringify(config, null, 2) + "\n");
183
+ return config;
184
+ }
185
+ export function syncCompiledInterfConfigFromSourceDatasetConfig(compiledPath, datasetConfig) {
186
+ const current = readInterfConfig(compiledPath);
187
+ const projectPath = resolveSourceControlPathForCompiled(compiledPath);
188
+ const datasetAbsolutePath = resolve(projectPath, datasetConfig.path);
189
+ const datasetRelativePath = relative(compiledPath, datasetAbsolutePath).split(sep).join("/") || ".";
190
+ const workflowId = datasetConfig.workflow ?? current?.workflow ?? "interf";
191
+ const workflowChanged = current?.workflow !== undefined && current.workflow !== workflowId;
192
+ const workflowOrigin = workflowChanged || !current?.workflow_origin
193
+ ? {
194
+ selected: workflowId,
195
+ local_draft: false,
196
+ }
197
+ : current.workflow_origin;
198
+ const { type: _ignoredType, name: _ignoredName, about: _ignoredAbout, workflow: _ignoredWorkflow, max_attempts: _ignoredMaxAttempts, max_loops: _ignoredMaxLoops, checks: _ignoredChecks, workflow_origin: _ignoredWorkflowOrigin, source: _ignoredSource, ...passthrough } = current ?? {};
199
+ const nextConfig = {
200
+ ...passthrough,
201
+ ...(!current ? {
202
+ type: "compiled",
203
+ source: {
204
+ path: "./raw",
205
+ },
206
+ } : {}),
207
+ type: "compiled",
208
+ name: datasetConfig.name,
209
+ ...(datasetConfig.about ? { about: datasetConfig.about } : {}),
210
+ workflow: workflowId,
211
+ ...(typeof datasetConfig.max_attempts === "number"
212
+ ? { max_attempts: datasetConfig.max_attempts }
213
+ : {}),
214
+ ...(typeof datasetConfig.max_loops === "number"
215
+ ? { max_loops: datasetConfig.max_loops }
216
+ : {}),
217
+ checks: datasetConfig.checks,
218
+ workflow_origin: workflowOrigin,
219
+ source: {
220
+ path: current?.source?.path ?? "./raw",
221
+ control_path: defaultControlPathForCompiled(compiledPath),
222
+ dataset_path: datasetRelativePath,
223
+ },
224
+ };
225
+ const saved = saveCompiledInterfConfig(compiledPath, nextConfig);
226
+ if (workflowChanged) {
227
+ const sourcePath = projectPath;
228
+ const selectedWorkflow = getCompiledWorkflow(workflowId, { sourcePath });
229
+ seedCompiledWorkflowPackage({
230
+ compiledPath,
231
+ sourcePath,
232
+ workflowId: selectedWorkflow.id,
233
+ });
234
+ }
235
+ refreshCompiledBootstrapGuidance(compiledPath);
236
+ return saved;
237
+ }
238
+ function buildLoadedTestSpec(options) {
239
+ if (options.checks.length === 0)
240
+ return null;
241
+ const testId = options.id ?? slugify(options.name);
242
+ return {
243
+ id: options.targetType === "raw" ? `${testId}-raw` : testId,
244
+ filePath: options.filePath,
245
+ type: options.targetType,
246
+ name: options.name,
247
+ description: options.about ?? options.fallbackDescription,
248
+ cases: normalizeTruthChecks(options.checks),
249
+ };
250
+ }
251
+ export function buildTestSpecFromSourceFolderConfig(options) {
252
+ const { sourcePath, targetName, targetType = "compiled" } = options;
253
+ const config = loadSourceFolderConfig(sourcePath);
254
+ if (!config)
255
+ return null;
256
+ const datasets = listSourceDatasetConfigs(config);
257
+ if (datasets.length === 0)
258
+ return null;
259
+ const match = targetName
260
+ ? datasets.find((entry) => entry.name === targetName)
261
+ : datasets.length === 1
262
+ ? datasets[0]
263
+ : getDefaultSourceDatasetConfig(config);
264
+ if (!match)
265
+ return null;
266
+ const configPath = sourceConfigPath(sourcePath);
267
+ return buildLoadedTestSpec({
268
+ id: match.id,
269
+ name: match.name,
270
+ about: match.about,
271
+ checks: match.checks,
272
+ targetType,
273
+ filePath: targetType === "raw"
274
+ ? `${configPath}#datasets/${match.name}:file-as-is`
275
+ : `${configPath}#datasets/${match.name}:compiled`,
276
+ fallbackDescription: `Derived from saved dataset checks in ${SOURCE_FOLDER_CONFIG_FILE}`,
277
+ });
278
+ }
279
+ export function buildTestSpecFromCompiledDatasetConfig(options) {
280
+ const { compiledPath, targetType = "compiled" } = options;
281
+ const config = readInterfConfig(compiledPath);
282
+ const configPath = compiledInterfConfigPath(compiledPath);
283
+ if (!config)
284
+ return null;
285
+ return buildLoadedTestSpec({
286
+ name: config.name,
287
+ about: config.about,
288
+ checks: config.checks ?? [],
289
+ targetType,
290
+ filePath: targetType === "raw"
291
+ ? `${configPath}#checks:file-as-is`
292
+ : `${configPath}#checks:compiled`,
293
+ fallbackDescription: "Derived from checks in the compiled context config.",
294
+ });
295
+ }
296
+ export function resolveSourceDatasetPath(projectPath, datasetConfig) {
297
+ return assertPathWithinRoot(projectPath, resolve(projectPath, datasetConfig.path), "Dataset path");
298
+ }
@@ -0,0 +1 @@
1
+ export declare function isMarkdownFile(filePath: string): boolean;
@@ -0,0 +1,4 @@
1
+ import { extname } from "node:path";
2
+ export function isMarkdownFile(filePath) {
3
+ return extname(filePath).toLowerCase() === ".md";
4
+ }
@@ -0,0 +1,2 @@
1
+ export declare function countFilesRecursive(dirPath: string): number;
2
+ export declare function listFilesRecursive(dirPath: string, predicate?: (filePath: string) => boolean): string[];
@@ -0,0 +1,55 @@
1
+ import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export function countFilesRecursive(dirPath) {
4
+ if (!existsSync(dirPath))
5
+ return 0;
6
+ let total = 0;
7
+ walkFilesRecursive(dirPath, () => {
8
+ total += 1;
9
+ });
10
+ return total;
11
+ }
12
+ export function listFilesRecursive(dirPath, predicate) {
13
+ const files = [];
14
+ if (!existsSync(dirPath))
15
+ return files;
16
+ walkFilesRecursive(dirPath, (filePath) => {
17
+ if (!predicate || predicate(filePath)) {
18
+ files.push(filePath);
19
+ }
20
+ });
21
+ return files;
22
+ }
23
+ function walkFilesRecursive(dirPath, onFile, visitedDirs = new Set()) {
24
+ if (!existsSync(dirPath))
25
+ return;
26
+ walkFilesRecursiveInternal(dirPath, onFile, visitedDirs);
27
+ }
28
+ function walkFilesRecursiveInternal(dirPath, onFile, visitedDirs) {
29
+ let resolvedDir;
30
+ try {
31
+ resolvedDir = realpathSync(dirPath);
32
+ }
33
+ catch {
34
+ return;
35
+ }
36
+ if (visitedDirs.has(resolvedDir))
37
+ return;
38
+ visitedDirs.add(resolvedDir);
39
+ for (const entry of readdirSync(dirPath)) {
40
+ const fullPath = join(dirPath, entry);
41
+ let stat;
42
+ try {
43
+ stat = statSync(fullPath);
44
+ }
45
+ catch {
46
+ continue;
47
+ }
48
+ if (stat.isDirectory()) {
49
+ walkFilesRecursiveInternal(fullPath, onFile, visitedDirs);
50
+ }
51
+ else if (stat.isFile()) {
52
+ onFile(fullPath);
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,7 @@
1
+ export * from "./file-types.js";
2
+ export * from "./filesystem.js";
3
+ export * from "./logger.js";
4
+ export * from "./naming.js";
5
+ export * from "./parse.js";
6
+ export * from "./path-guards.js";
7
+ export * from "./util.js";
@@ -0,0 +1,7 @@
1
+ export * from "./file-types.js";
2
+ export * from "./filesystem.js";
3
+ export * from "./logger.js";
4
+ export * from "./naming.js";
5
+ export * from "./parse.js";
6
+ export * from "./path-guards.js";
7
+ export * from "./util.js";
@@ -0,0 +1,3 @@
1
+ export type InterfWarningHandler = (message: string) => void;
2
+ export declare function setInterfWarningHandler(handler?: InterfWarningHandler): void;
3
+ export declare function warnInterf(message: string): void;
@@ -0,0 +1,10 @@
1
+ const defaultWarningHandler = (message) => {
2
+ console.warn(message);
3
+ };
4
+ let currentWarningHandler = defaultWarningHandler;
5
+ export function setInterfWarningHandler(handler) {
6
+ currentWarningHandler = handler ?? defaultWarningHandler;
7
+ }
8
+ export function warnInterf(message) {
9
+ currentWarningHandler(message);
10
+ }
@@ -0,0 +1 @@
1
+ export declare function slugify(input: string): string;
@@ -0,0 +1,8 @@
1
+ export function slugify(input) {
2
+ return input
3
+ .toLowerCase()
4
+ .trim()
5
+ .replace(/[^a-z0-9]+/g, "-")
6
+ .replace(/^-+|-+$/g, "")
7
+ .slice(0, 80);
8
+ }
@@ -0,0 +1,8 @@
1
+ import type { ZodType } from "zod";
2
+ export declare function readJsonFileUnchecked<T>(filePath: string, label: string): T | null;
3
+ export declare function readJsonFileWithSchema<T>(filePath: string, label: string, schema: ZodType<T>): T | null;
4
+ export declare function renderJsonFrontmatter(frontmatter: Record<string, unknown>): string;
5
+ export declare function parseJsonFrontmatter(content: string): {
6
+ frontmatter: Record<string, unknown>;
7
+ body: string;
8
+ } | null;
@@ -0,0 +1,145 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { warnInterf } from "./logger.js";
3
+ function formatError(error) {
4
+ return error instanceof Error ? error.message : String(error);
5
+ }
6
+ export function readJsonFileUnchecked(filePath, label) {
7
+ try {
8
+ return JSON.parse(readFileSync(filePath, "utf-8"));
9
+ }
10
+ catch (error) {
11
+ warnInterf(`Warning: failed to parse ${label} at ${filePath}: ${formatError(error)}`);
12
+ return null;
13
+ }
14
+ }
15
+ export function readJsonFileWithSchema(filePath, label, schema) {
16
+ const raw = readJsonFileUnchecked(filePath, label);
17
+ if (raw === null)
18
+ return null;
19
+ const parsed = schema.safeParse(raw);
20
+ if (!parsed.success) {
21
+ warnInterf(`Warning: failed to validate ${label} at ${filePath}: ${parsed.error.issues.map((issue) => issue.message).join("; ")}`);
22
+ return null;
23
+ }
24
+ return parsed.data;
25
+ }
26
+ export function renderJsonFrontmatter(frontmatter) {
27
+ return [
28
+ "---",
29
+ JSON.stringify(frontmatter, null, 2),
30
+ "---",
31
+ ].join("\n");
32
+ }
33
+ function parseQuotedString(value) {
34
+ if (value.length < 2)
35
+ return null;
36
+ const quote = value[0];
37
+ if ((quote !== "\"" && quote !== "'") || value[value.length - 1] !== quote)
38
+ return null;
39
+ const inner = value.slice(1, -1);
40
+ if (quote === "\"") {
41
+ try {
42
+ return JSON.parse(value);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ return inner.replace(/\\'/g, "'");
49
+ }
50
+ function parseYamlScalar(value) {
51
+ const trimmed = value.trim();
52
+ if (trimmed.length === 0)
53
+ return "";
54
+ const quoted = parseQuotedString(trimmed);
55
+ if (quoted !== null)
56
+ return quoted;
57
+ if (trimmed === "true")
58
+ return true;
59
+ if (trimmed === "false")
60
+ return false;
61
+ if (trimmed === "null")
62
+ return null;
63
+ if (/^-?\d+(?:\.\d+)?$/.test(trimmed))
64
+ return Number(trimmed);
65
+ if ((trimmed.startsWith("[") && trimmed.endsWith("]"))
66
+ || (trimmed.startsWith("{") && trimmed.endsWith("}"))) {
67
+ try {
68
+ return JSON.parse(trimmed);
69
+ }
70
+ catch {
71
+ return trimmed;
72
+ }
73
+ }
74
+ return trimmed;
75
+ }
76
+ function parseYamlFrontmatter(frontmatterText) {
77
+ const lines = frontmatterText.split("\n");
78
+ const frontmatter = {};
79
+ for (let index = 0; index < lines.length; index += 1) {
80
+ const line = lines[index] ?? "";
81
+ const trimmed = line.trim();
82
+ if (trimmed.length === 0 || trimmed.startsWith("#"))
83
+ continue;
84
+ const match = line.match(/^([A-Za-z0-9_-]+):(?:\s+(.*))?$/);
85
+ if (!match)
86
+ return null;
87
+ const [, key, inlineValue] = match;
88
+ if (!key)
89
+ return null;
90
+ if (inlineValue && inlineValue.trim().length > 0) {
91
+ frontmatter[key] = parseYamlScalar(inlineValue);
92
+ continue;
93
+ }
94
+ const items = [];
95
+ let cursor = index + 1;
96
+ while (cursor < lines.length) {
97
+ const nextLine = lines[cursor] ?? "";
98
+ const nextTrimmed = nextLine.trim();
99
+ if (nextTrimmed.length === 0) {
100
+ cursor += 1;
101
+ continue;
102
+ }
103
+ const itemMatch = nextLine.match(/^\s*-\s+(.*)$/);
104
+ if (!itemMatch || !/^\s+/.test(nextLine))
105
+ break;
106
+ items.push(parseYamlScalar(itemMatch[1] ?? ""));
107
+ cursor += 1;
108
+ }
109
+ if (items.length > 0) {
110
+ frontmatter[key] = items;
111
+ index = cursor - 1;
112
+ continue;
113
+ }
114
+ frontmatter[key] = "";
115
+ }
116
+ return Object.keys(frontmatter).length > 0 ? frontmatter : null;
117
+ }
118
+ export function parseJsonFrontmatter(content) {
119
+ const normalized = content.replace(/\r\n/g, "\n");
120
+ const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
121
+ if (!match)
122
+ return null;
123
+ const [, frontmatterText, body = ""] = match;
124
+ if (frontmatterText === undefined)
125
+ return null;
126
+ try {
127
+ const frontmatter = JSON.parse(frontmatterText);
128
+ if (!frontmatter || typeof frontmatter !== "object" || Array.isArray(frontmatter)) {
129
+ return null;
130
+ }
131
+ return {
132
+ frontmatter: frontmatter,
133
+ body,
134
+ };
135
+ }
136
+ catch {
137
+ const frontmatter = parseYamlFrontmatter(frontmatterText);
138
+ if (!frontmatter)
139
+ return null;
140
+ return {
141
+ frontmatter,
142
+ body,
143
+ };
144
+ }
145
+ }
@@ -0,0 +1,2 @@
1
+ export declare function isPathWithinRoot(rootPath: string, candidatePath: string): boolean;
2
+ export declare function assertPathWithinRoot(rootPath: string, candidatePath: string, label: string): string;
@@ -0,0 +1,14 @@
1
+ import { isAbsolute, relative, resolve, sep } from "node:path";
2
+ export function isPathWithinRoot(rootPath, candidatePath) {
3
+ const root = resolve(rootPath);
4
+ const candidate = resolve(candidatePath);
5
+ const relativePath = relative(root, candidate);
6
+ return relativePath === "" || (!isAbsolute(relativePath) && relativePath !== ".." && !relativePath.startsWith(`..${sep}`));
7
+ }
8
+ export function assertPathWithinRoot(rootPath, candidatePath, label) {
9
+ const resolvedPath = resolve(candidatePath);
10
+ if (!isPathWithinRoot(rootPath, resolvedPath)) {
11
+ throw new Error(`${label} must stay inside ${resolve(rootPath)}: ${resolvedPath}`);
12
+ }
13
+ return resolvedPath;
14
+ }
@@ -0,0 +1,3 @@
1
+ export { isMarkdownFile } from "./file-types.js";
2
+ export { slugify } from "./naming.js";
3
+ export { assertPathWithinRoot, isPathWithinRoot } from "./path-guards.js";
@@ -0,0 +1,3 @@
1
+ export { isMarkdownFile } from "./file-types.js";
2
+ export { slugify } from "./naming.js";
3
+ export { assertPathWithinRoot, isPathWithinRoot } from "./path-guards.js";
@@ -0,0 +1,13 @@
1
+ export * as schema from "./lib/schema.js";
2
+ export * as test from "./test.js";
3
+ export * as execution from "./test-execution.js";
4
+ export * as matrices from "./test-matrices.js";
5
+ export * as paths from "./test-paths.js";
6
+ export * as profilePresets from "./test-profile-presets.js";
7
+ export * as sandbox from "./test-sandbox.js";
8
+ export * as specs from "./test-specs.js";
9
+ export * as targets from "./test-targets.js";
10
+ export * as types from "./test-types.js";
11
+ export type { TestCase, TestCaseExpect, TestCheckResult, TestCaseResult, TestSpec, TestTargetResult, TestTargetRun, TestRunComparison, TestTargetType, } from "./lib/schema.js";
12
+ export type { LoadedTestSpec, TestTargetCandidate, } from "./test-types.js";
13
+ export type { TestSandboxRetentionMode, } from "./test-sandbox.js";
@@ -0,0 +1,10 @@
1
+ export * as schema from "./lib/schema.js";
2
+ export * as test from "./test.js";
3
+ export * as execution from "./test-execution.js";
4
+ export * as matrices from "./test-matrices.js";
5
+ export * as paths from "./test-paths.js";
6
+ export * as profilePresets from "./test-profile-presets.js";
7
+ export * as sandbox from "./test-sandbox.js";
8
+ export * as specs from "./test-specs.js";
9
+ export * as targets from "./test-targets.js";
10
+ export * as types from "./test-types.js";