@interf/compiler 0.5.1 → 0.6.3

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 (353) hide show
  1. package/README.md +160 -201
  2. package/builtin-workflows/interf/README.md +22 -10
  3. package/builtin-workflows/interf/compile/stages/shape/SKILL.md +8 -5
  4. package/builtin-workflows/interf/compile/stages/structure/SKILL.md +3 -0
  5. package/builtin-workflows/interf/compile/stages/summarize/SKILL.md +18 -2
  6. package/builtin-workflows/interf/improve/SKILL.md +4 -4
  7. package/builtin-workflows/interf/use/query/SKILL.md +1 -1
  8. package/builtin-workflows/interf/workflow.json +19 -5
  9. package/builtin-workflows/interf/{compiled.schema.json → workflow.schema.json} +10 -3
  10. package/dist/bin.js +2 -28
  11. package/dist/{commands → cli/commands}/check-draft.d.ts +2 -2
  12. package/dist/{commands → cli/commands}/check-draft.js +13 -13
  13. package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
  14. package/dist/{commands → cli/commands}/compile-controller.js +39 -44
  15. package/dist/cli/commands/compile.d.ts +33 -0
  16. package/dist/{commands → cli/commands}/compile.js +107 -33
  17. package/dist/{commands → cli/commands}/compiled-flow.d.ts +3 -4
  18. package/dist/{commands → cli/commands}/compiled-flow.js +9 -14
  19. package/dist/{commands → cli/commands}/create-workflow-wizard.d.ts +20 -2
  20. package/dist/cli/commands/create-workflow-wizard.js +288 -0
  21. package/dist/{commands → cli/commands}/create.d.ts +2 -2
  22. package/dist/cli/commands/create.js +166 -0
  23. package/dist/cli/commands/dataset-selection.d.ts +6 -0
  24. package/dist/cli/commands/dataset-selection.js +11 -0
  25. package/dist/{commands → cli/commands}/default.js +5 -5
  26. package/dist/{commands → cli/commands}/doctor.js +12 -13
  27. package/dist/{commands → cli/commands}/executor-flow.d.ts +2 -2
  28. package/dist/{commands → cli/commands}/executor-flow.js +17 -17
  29. package/dist/cli/commands/init.d.ts +11 -0
  30. package/dist/{commands → cli/commands}/init.js +202 -109
  31. package/dist/{commands → cli/commands}/list.js +9 -6
  32. package/dist/{commands → cli/commands}/reset.js +5 -5
  33. package/dist/{commands → cli/commands}/source-config-wizard.d.ts +10 -5
  34. package/dist/{commands → cli/commands}/source-config-wizard.js +202 -95
  35. package/dist/{commands → cli/commands}/status.js +20 -11
  36. package/dist/{commands → cli/commands}/test-flow.d.ts +13 -4
  37. package/dist/{commands → cli/commands}/test-flow.js +30 -26
  38. package/dist/cli/commands/test.d.ts +14 -0
  39. package/dist/{commands → cli/commands}/test.js +48 -40
  40. package/dist/{commands → cli/commands}/verify.js +4 -4
  41. package/dist/cli/index.d.ts +21 -0
  42. package/dist/cli/index.js +33 -0
  43. package/dist/index.d.ts +22 -11
  44. package/dist/index.js +15 -6
  45. package/dist/lib/agent-args.d.ts +1 -3
  46. package/dist/lib/agent-args.js +1 -42
  47. package/dist/lib/agent-constants.d.ts +1 -5
  48. package/dist/lib/agent-constants.js +1 -28
  49. package/dist/lib/agent-detection.d.ts +1 -7
  50. package/dist/lib/agent-detection.js +1 -65
  51. package/dist/lib/agent-execution.d.ts +1 -2
  52. package/dist/lib/agent-execution.js +1 -242
  53. package/dist/lib/agent-logs.d.ts +1 -2
  54. package/dist/lib/agent-logs.js +1 -17
  55. package/dist/lib/agent-preflight.d.ts +1 -7
  56. package/dist/lib/agent-preflight.js +1 -76
  57. package/dist/lib/agent-render.d.ts +1 -8
  58. package/dist/lib/agent-render.js +1 -218
  59. package/dist/lib/agent-shells.d.ts +1 -44
  60. package/dist/lib/agent-shells.js +1 -847
  61. package/dist/lib/agent-status.d.ts +1 -3
  62. package/dist/lib/agent-status.js +1 -58
  63. package/dist/lib/agent-types.d.ts +1 -30
  64. package/dist/lib/agent-types.js +1 -1
  65. package/dist/lib/agents.d.ts +1 -6
  66. package/dist/lib/agents.js +1 -5
  67. package/dist/lib/builtin-compiled-workflow.d.ts +1 -129
  68. package/dist/lib/builtin-compiled-workflow.js +1 -153
  69. package/dist/lib/compiled-compile.d.ts +1 -52
  70. package/dist/lib/compiled-compile.js +1 -274
  71. package/dist/lib/compiled-paths.d.ts +1 -39
  72. package/dist/lib/compiled-paths.js +3 -103
  73. package/dist/lib/compiled-raw.d.ts +1 -49
  74. package/dist/lib/compiled-raw.js +3 -102
  75. package/dist/lib/compiled-reset.d.ts +1 -1
  76. package/dist/lib/compiled-reset.js +3 -44
  77. package/dist/lib/compiled-schema.d.ts +1 -27
  78. package/dist/lib/compiled-schema.js +1 -110
  79. package/dist/lib/discovery.d.ts +1 -1
  80. package/dist/lib/discovery.js +2 -2
  81. package/dist/lib/execution-profile.d.ts +1 -17
  82. package/dist/lib/execution-profile.js +1 -84
  83. package/dist/lib/executors.d.ts +1 -32
  84. package/dist/lib/executors.js +1 -43
  85. package/dist/lib/interf-bootstrap.d.ts +1 -3
  86. package/dist/lib/interf-bootstrap.js +3 -18
  87. package/dist/lib/interf-detect.d.ts +1 -33
  88. package/dist/lib/interf-detect.js +3 -176
  89. package/dist/lib/interf-scaffold.d.ts +1 -2
  90. package/dist/lib/interf-scaffold.js +3 -121
  91. package/dist/lib/interf-workflow-package.d.ts +1 -20
  92. package/dist/lib/interf-workflow-package.js +1 -276
  93. package/dist/lib/interf.d.ts +1 -5
  94. package/dist/lib/interf.js +3 -4
  95. package/dist/lib/local-workflows.d.ts +1 -53
  96. package/dist/lib/local-workflows.js +1 -399
  97. package/dist/lib/package-root.d.ts +1 -0
  98. package/dist/lib/package-root.js +1 -0
  99. package/dist/lib/project-paths.d.ts +1 -11
  100. package/dist/lib/project-paths.js +3 -32
  101. package/dist/lib/runtime-acceptance.d.ts +1 -9
  102. package/dist/lib/runtime-acceptance.js +1 -257
  103. package/dist/lib/runtime-contracts.d.ts +1 -2
  104. package/dist/lib/runtime-contracts.js +1 -47
  105. package/dist/lib/runtime-inventory.d.ts +1 -7
  106. package/dist/lib/runtime-inventory.js +1 -29
  107. package/dist/lib/runtime-paths.d.ts +1 -7
  108. package/dist/lib/runtime-paths.js +1 -23
  109. package/dist/lib/runtime-prompt.d.ts +1 -2
  110. package/dist/lib/runtime-prompt.js +1 -46
  111. package/dist/lib/runtime-reconcile.d.ts +1 -2
  112. package/dist/lib/runtime-reconcile.js +1 -156
  113. package/dist/lib/runtime-runs.d.ts +1 -11
  114. package/dist/lib/runtime-runs.js +1 -250
  115. package/dist/lib/runtime-types.d.ts +1 -43
  116. package/dist/lib/runtime-types.js +1 -1
  117. package/dist/lib/runtime.d.ts +1 -6
  118. package/dist/lib/runtime.js +1 -5
  119. package/dist/lib/schema.d.ts +4 -1016
  120. package/dist/lib/schema.js +6 -539
  121. package/dist/lib/source-config.d.ts +1 -39
  122. package/dist/lib/source-config.js +3 -293
  123. package/dist/lib/state-artifacts.d.ts +1 -8
  124. package/dist/lib/state-artifacts.js +1 -13
  125. package/dist/lib/state-health.d.ts +1 -4
  126. package/dist/lib/state-health.js +1 -132
  127. package/dist/lib/state-io.d.ts +1 -10
  128. package/dist/lib/state-io.js +1 -76
  129. package/dist/lib/state-paths.d.ts +1 -4
  130. package/dist/lib/state-paths.js +1 -13
  131. package/dist/lib/state-view.d.ts +1 -4
  132. package/dist/lib/state-view.js +1 -103
  133. package/dist/lib/state.d.ts +1 -6
  134. package/dist/lib/state.js +1 -5
  135. package/dist/lib/test-execution.d.ts +1 -14
  136. package/dist/lib/test-execution.js +3 -525
  137. package/dist/lib/test-matrices.d.ts +1 -90
  138. package/dist/lib/test-matrices.js +3 -96
  139. package/dist/lib/test-paths.d.ts +1 -12
  140. package/dist/lib/test-paths.js +3 -59
  141. package/dist/lib/test-profile-presets.d.ts +1 -57
  142. package/dist/lib/test-profile-presets.js +3 -50
  143. package/dist/lib/test-sandbox.d.ts +1 -11
  144. package/dist/lib/test-sandbox.js +3 -105
  145. package/dist/lib/test-specs.d.ts +1 -7
  146. package/dist/lib/test-specs.js +3 -114
  147. package/dist/lib/test-targets.d.ts +1 -5
  148. package/dist/lib/test-targets.js +3 -38
  149. package/dist/lib/test-types.d.ts +1 -17
  150. package/dist/lib/test-types.js +3 -1
  151. package/dist/lib/test.d.ts +1 -4
  152. package/dist/lib/test.js +3 -3
  153. package/dist/lib/validate-compiled.d.ts +1 -27
  154. package/dist/lib/validate-compiled.js +1 -238
  155. package/dist/lib/validate-helpers.d.ts +1 -12
  156. package/dist/lib/validate-helpers.js +1 -41
  157. package/dist/lib/validate.d.ts +1 -19
  158. package/dist/lib/validate.js +1 -256
  159. package/dist/lib/workflow-authoring.d.ts +1 -0
  160. package/dist/lib/workflow-authoring.js +1 -0
  161. package/dist/lib/workflow-definitions.d.ts +1 -68
  162. package/dist/lib/workflow-definitions.js +1 -206
  163. package/dist/lib/workflow-edit-session.d.ts +1 -0
  164. package/dist/lib/workflow-edit-session.js +1 -0
  165. package/dist/lib/workflow-edit-utils.d.ts +1 -0
  166. package/dist/lib/workflow-edit-utils.js +1 -0
  167. package/dist/lib/workflow-helpers.d.ts +1 -38
  168. package/dist/lib/workflow-helpers.js +1 -167
  169. package/dist/lib/workflow-improvement.d.ts +1 -22
  170. package/dist/lib/workflow-improvement.js +1 -396
  171. package/dist/lib/workflow-primitives.d.ts +1 -2
  172. package/dist/lib/workflow-primitives.js +1 -5
  173. package/dist/lib/workflow-review-paths.d.ts +1 -10
  174. package/dist/lib/workflow-review-paths.js +1 -27
  175. package/dist/lib/workflow-stage-policy.d.ts +1 -0
  176. package/dist/lib/workflow-stage-policy.js +1 -0
  177. package/dist/lib/workflow-stage-runner.d.ts +1 -41
  178. package/dist/lib/workflow-stage-runner.js +1 -109
  179. package/dist/lib/workflows.d.ts +1 -15
  180. package/dist/lib/workflows.js +1 -31
  181. package/dist/packages/agents/index.d.ts +17 -0
  182. package/dist/packages/agents/index.js +15 -0
  183. package/dist/packages/agents/lib/agents.d.ts +6 -0
  184. package/dist/packages/agents/lib/agents.js +5 -0
  185. package/dist/packages/agents/lib/args.d.ts +4 -0
  186. package/dist/packages/agents/lib/args.js +52 -0
  187. package/dist/packages/agents/lib/constants.d.ts +5 -0
  188. package/dist/packages/agents/lib/constants.js +28 -0
  189. package/dist/packages/agents/lib/detection.d.ts +7 -0
  190. package/dist/packages/agents/lib/detection.js +65 -0
  191. package/dist/packages/agents/lib/execution-profile.d.ts +17 -0
  192. package/dist/packages/agents/lib/execution-profile.js +84 -0
  193. package/dist/packages/agents/lib/execution.d.ts +2 -0
  194. package/dist/packages/agents/lib/execution.js +243 -0
  195. package/dist/packages/agents/lib/executors.d.ts +32 -0
  196. package/dist/packages/agents/lib/executors.js +45 -0
  197. package/dist/packages/agents/lib/logs.d.ts +2 -0
  198. package/dist/packages/agents/lib/logs.js +17 -0
  199. package/dist/packages/agents/lib/preflight.d.ts +7 -0
  200. package/dist/packages/agents/lib/preflight.js +77 -0
  201. package/dist/packages/agents/lib/render.d.ts +8 -0
  202. package/dist/packages/agents/lib/render.js +218 -0
  203. package/dist/packages/agents/lib/schema.d.ts +8 -0
  204. package/dist/packages/agents/lib/schema.js +7 -0
  205. package/dist/packages/agents/lib/shells.d.ts +69 -0
  206. package/dist/packages/agents/lib/shells.js +1021 -0
  207. package/dist/packages/agents/lib/status.d.ts +3 -0
  208. package/dist/packages/agents/lib/status.js +58 -0
  209. package/dist/packages/agents/lib/types.d.ts +30 -0
  210. package/dist/packages/agents/lib/types.js +1 -0
  211. package/dist/{lib → packages/agents/lib}/user-config.d.ts +1 -0
  212. package/dist/{lib → packages/agents/lib}/user-config.js +3 -2
  213. package/dist/packages/compiler/compiled-compile.d.ts +48 -0
  214. package/dist/packages/compiler/compiled-compile.js +256 -0
  215. package/dist/packages/compiler/compiled-schema.d.ts +31 -0
  216. package/dist/packages/compiler/compiled-schema.js +141 -0
  217. package/dist/packages/compiler/index.d.ts +24 -0
  218. package/dist/packages/compiler/index.js +23 -0
  219. package/dist/packages/compiler/lib/schema.d.ts +684 -0
  220. package/dist/packages/compiler/lib/schema.js +361 -0
  221. package/dist/packages/compiler/runtime-acceptance.d.ts +9 -0
  222. package/dist/packages/compiler/runtime-acceptance.js +269 -0
  223. package/dist/packages/compiler/runtime-contracts.d.ts +2 -0
  224. package/dist/packages/compiler/runtime-contracts.js +48 -0
  225. package/dist/packages/compiler/runtime-inventory.d.ts +7 -0
  226. package/dist/packages/compiler/runtime-inventory.js +29 -0
  227. package/dist/packages/compiler/runtime-paths.d.ts +8 -0
  228. package/dist/packages/compiler/runtime-paths.js +26 -0
  229. package/dist/packages/compiler/runtime-prompt.d.ts +2 -0
  230. package/dist/packages/compiler/runtime-prompt.js +48 -0
  231. package/dist/packages/compiler/runtime-reconcile.d.ts +2 -0
  232. package/dist/packages/compiler/runtime-reconcile.js +193 -0
  233. package/dist/packages/compiler/runtime-runs.d.ts +11 -0
  234. package/dist/packages/compiler/runtime-runs.js +262 -0
  235. package/dist/packages/compiler/runtime-types.d.ts +43 -0
  236. package/dist/packages/compiler/runtime-types.js +1 -0
  237. package/dist/packages/compiler/runtime.d.ts +6 -0
  238. package/dist/packages/compiler/runtime.js +5 -0
  239. package/dist/packages/compiler/state-artifacts.d.ts +8 -0
  240. package/dist/packages/compiler/state-artifacts.js +13 -0
  241. package/dist/packages/compiler/state-health.d.ts +4 -0
  242. package/dist/packages/compiler/state-health.js +132 -0
  243. package/dist/packages/compiler/state-io.d.ts +10 -0
  244. package/dist/packages/compiler/state-io.js +76 -0
  245. package/dist/packages/compiler/state-paths.d.ts +4 -0
  246. package/dist/packages/compiler/state-paths.js +13 -0
  247. package/dist/packages/compiler/state-view.d.ts +4 -0
  248. package/dist/packages/compiler/state-view.js +103 -0
  249. package/dist/packages/compiler/state.d.ts +7 -0
  250. package/dist/packages/compiler/state.js +12 -0
  251. package/dist/packages/compiler/validate-compiled.d.ts +27 -0
  252. package/dist/packages/compiler/validate-compiled.js +241 -0
  253. package/dist/packages/compiler/validate-helpers.d.ts +12 -0
  254. package/dist/packages/compiler/validate-helpers.js +41 -0
  255. package/dist/packages/compiler/validate.d.ts +21 -0
  256. package/dist/packages/compiler/validate.js +249 -0
  257. package/dist/packages/compiler/workflow-primitives.d.ts +2 -0
  258. package/dist/packages/compiler/workflow-primitives.js +5 -0
  259. package/dist/packages/compiler/workflows.d.ts +15 -0
  260. package/dist/packages/compiler/workflows.js +31 -0
  261. package/dist/packages/project-model/compiled-paths.d.ts +40 -0
  262. package/dist/packages/project-model/compiled-paths.js +106 -0
  263. package/dist/packages/project-model/compiled-raw.d.ts +49 -0
  264. package/dist/packages/project-model/compiled-raw.js +102 -0
  265. package/dist/packages/project-model/compiled-reset.d.ts +2 -0
  266. package/dist/packages/project-model/compiled-reset.js +72 -0
  267. package/dist/packages/project-model/index.d.ts +11 -0
  268. package/dist/packages/project-model/index.js +10 -0
  269. package/dist/packages/project-model/interf-bootstrap.d.ts +3 -0
  270. package/dist/packages/project-model/interf-bootstrap.js +18 -0
  271. package/dist/packages/project-model/interf-detect.d.ts +33 -0
  272. package/dist/packages/project-model/interf-detect.js +176 -0
  273. package/dist/packages/project-model/interf-scaffold.d.ts +2 -0
  274. package/dist/packages/project-model/interf-scaffold.js +124 -0
  275. package/dist/packages/project-model/interf.d.ts +5 -0
  276. package/dist/packages/project-model/interf.js +4 -0
  277. package/dist/packages/project-model/lib/schema.d.ts +125 -0
  278. package/dist/packages/project-model/lib/schema.js +62 -0
  279. package/dist/packages/project-model/project-paths.d.ts +11 -0
  280. package/dist/packages/project-model/project-paths.js +32 -0
  281. package/dist/packages/project-model/source-config.d.ts +38 -0
  282. package/dist/packages/project-model/source-config.js +297 -0
  283. package/dist/packages/testing/index.d.ts +13 -0
  284. package/dist/packages/testing/index.js +10 -0
  285. package/dist/packages/testing/lib/schema.d.ts +261 -0
  286. package/dist/packages/testing/lib/schema.js +119 -0
  287. package/dist/packages/testing/test-execution.d.ts +14 -0
  288. package/dist/packages/testing/test-execution.js +525 -0
  289. package/dist/packages/testing/test-matrices.d.ts +90 -0
  290. package/dist/packages/testing/test-matrices.js +96 -0
  291. package/dist/packages/testing/test-paths.d.ts +12 -0
  292. package/dist/packages/testing/test-paths.js +59 -0
  293. package/dist/packages/testing/test-profile-presets.d.ts +57 -0
  294. package/dist/packages/testing/test-profile-presets.js +50 -0
  295. package/dist/packages/testing/test-sandbox.d.ts +11 -0
  296. package/dist/packages/testing/test-sandbox.js +105 -0
  297. package/dist/packages/testing/test-specs.d.ts +7 -0
  298. package/dist/packages/testing/test-specs.js +114 -0
  299. package/dist/packages/testing/test-targets.d.ts +5 -0
  300. package/dist/packages/testing/test-targets.js +38 -0
  301. package/dist/packages/testing/test-types.d.ts +16 -0
  302. package/dist/packages/testing/test-types.js +1 -0
  303. package/dist/packages/testing/test.d.ts +4 -0
  304. package/dist/packages/testing/test.js +3 -0
  305. package/dist/packages/workflow-authoring/index.d.ts +4 -0
  306. package/dist/packages/workflow-authoring/index.js +4 -0
  307. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.d.ts +10 -0
  308. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.js +39 -0
  309. package/dist/packages/workflow-authoring/workflow-authoring.d.ts +26 -0
  310. package/dist/packages/workflow-authoring/workflow-authoring.js +120 -0
  311. package/dist/packages/workflow-authoring/workflow-edit-session.d.ts +16 -0
  312. package/dist/packages/workflow-authoring/workflow-edit-session.js +57 -0
  313. package/dist/packages/workflow-authoring/workflow-improvement.d.ts +23 -0
  314. package/dist/packages/workflow-authoring/workflow-improvement.js +209 -0
  315. package/dist/packages/workflow-package/builtin-compiled-workflow.d.ts +38 -0
  316. package/dist/packages/workflow-package/builtin-compiled-workflow.js +94 -0
  317. package/dist/packages/workflow-package/index.d.ts +9 -0
  318. package/dist/packages/workflow-package/index.js +9 -0
  319. package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
  320. package/dist/packages/workflow-package/interf-workflow-package.js +342 -0
  321. package/dist/{lib/config.d.ts → packages/workflow-package/lib/package-root.d.ts} +0 -1
  322. package/dist/packages/workflow-package/lib/package-root.js +6 -0
  323. package/dist/packages/workflow-package/local-workflows.d.ts +54 -0
  324. package/dist/packages/workflow-package/local-workflows.js +422 -0
  325. package/dist/packages/workflow-package/workflow-definitions.d.ts +78 -0
  326. package/dist/packages/workflow-package/workflow-definitions.js +203 -0
  327. package/dist/packages/workflow-package/workflow-helpers.d.ts +38 -0
  328. package/dist/packages/workflow-package/workflow-helpers.js +167 -0
  329. package/dist/packages/workflow-package/workflow-review-paths.d.ts +10 -0
  330. package/dist/packages/workflow-package/workflow-review-paths.js +27 -0
  331. package/dist/packages/workflow-package/workflow-stage-policy.d.ts +5 -0
  332. package/dist/packages/workflow-package/workflow-stage-policy.js +31 -0
  333. package/dist/packages/workflow-package/workflow-stage-runner.d.ts +41 -0
  334. package/dist/packages/workflow-package/workflow-stage-runner.js +109 -0
  335. package/package.json +44 -21
  336. package/dist/commands/compile.d.ts +0 -15
  337. package/dist/commands/create-workflow-wizard.js +0 -125
  338. package/dist/commands/create.js +0 -162
  339. package/dist/commands/init.d.ts +0 -3
  340. package/dist/commands/test.d.ts +0 -9
  341. package/dist/lib/compiled-home.d.ts +0 -5
  342. package/dist/lib/compiled-home.js +0 -32
  343. package/dist/lib/config.js +0 -9
  344. package/dist/lib/obsidian.d.ts +0 -1
  345. package/dist/lib/obsidian.js +0 -15
  346. package/dist/lib/summarize-plan.d.ts +0 -17
  347. package/dist/lib/summarize-plan.js +0 -120
  348. /package/dist/{commands → cli/commands}/default.d.ts +0 -0
  349. /package/dist/{commands → cli/commands}/doctor.d.ts +0 -0
  350. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  351. /package/dist/{commands → cli/commands}/reset.d.ts +0 -0
  352. /package/dist/{commands → cli/commands}/status.d.ts +0 -0
  353. /package/dist/{commands → cli/commands}/verify.d.ts +0 -0
@@ -1,24 +1,25 @@
1
1
  import { existsSync, readdirSync, statSync } from "node:fs";
2
- import { join } from "node:path";
2
+ import { join, relative, sep } from "node:path";
3
3
  import * as p from "@clack/prompts";
4
- import { compiledMaxAttempts, compiledMaxLoops, resolveSourceDatasetPath, } from "../lib/source-config.js";
5
- import { slugify } from "../lib/util.js";
4
+ import { sourceConfig as projectSourceConfig, } from "../../packages/project-model/index.js";
5
+ import { slugify } from "../../lib/util.js";
6
6
  import { resolveOrConfigureLocalExecutor } from "./executor-flow.js";
7
7
  import { draftTruthChecks } from "./check-draft.js";
8
8
  export const DEFAULT_COMPILED_NAME = "dataset1";
9
- export const DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER = "A question you can already verify from this dataset";
9
+ export const DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER = "A question you can already verify from this source folder";
10
10
  export const DEFAULT_COMPILED_CHECK_ANSWER_PLACEHOLDER = "The expected answer in plain English";
11
- export const DEFAULT_COMPILED_ABOUT_PLACEHOLDER = "Example: forward-demand metrics, board-prep questions, or chart reads from this dataset.";
11
+ export const DEFAULT_COMPILED_ABOUT_PLACEHOLDER = "Example: board-prep questions from these files, chart reads from this report, or tax review from these exports.";
12
12
  export const DEFAULT_DATASET_PATH_PLACEHOLDER = "./dataset1";
13
- export const DEFAULT_COMPILE_RETRY_ATTEMPTS = 1;
13
+ export const DEFAULT_COMPILE_RETRY_ATTEMPTS = 3;
14
14
  export const DEFAULT_SELF_IMPROVING_LOOPS = 3;
15
+ const DEFAULT_SELF_IMPROVING_ATTEMPTS = 1;
15
16
  function normalizeOptionalPromptText(value) {
16
17
  if (typeof value !== "string")
17
18
  return undefined;
18
19
  const normalized = value.trim();
19
20
  return normalized.length > 0 ? normalized : undefined;
20
21
  }
21
- function findSingleDatasetFolderCandidate(cwd) {
22
+ function listVisibleDatasetFolders(cwd) {
22
23
  const ignoredEntries = new Set([
23
24
  ".DS_Store",
24
25
  ".git",
@@ -32,10 +33,9 @@ function findSingleDatasetFolderCandidate(cwd) {
32
33
  rootEntries = readdirSync(cwd);
33
34
  }
34
35
  catch {
35
- return null;
36
+ return [];
36
37
  }
37
- const visibleEntries = rootEntries.filter((entry) => !ignoredEntries.has(entry));
38
- const visibleFiles = [];
38
+ const visibleEntries = rootEntries.filter((entry) => !ignoredEntries.has(entry) && !entry.startsWith("."));
39
39
  const visibleDirectories = [];
40
40
  for (const entry of visibleEntries) {
41
41
  try {
@@ -43,19 +43,56 @@ function findSingleDatasetFolderCandidate(cwd) {
43
43
  if (statSync(entryPath).isDirectory()) {
44
44
  visibleDirectories.push(entry);
45
45
  }
46
- else {
47
- visibleFiles.push(entry);
48
- }
49
46
  }
50
47
  catch {
51
48
  // ignore unreadable entries
52
49
  }
53
50
  }
54
- if (visibleFiles.length > 0 || visibleDirectories.length !== 1) {
51
+ return visibleDirectories.sort((left, right) => left.localeCompare(right));
52
+ }
53
+ function isReservedDatasetPath(relativePath) {
54
+ const normalized = relativePath.replace(/\\/g, "/").replace(/^\.\/+/, "");
55
+ return normalized === "interf" || normalized.startsWith("interf/") || normalized === ".interf" || normalized.startsWith(".interf/");
56
+ }
57
+ export function normalizeDatasetPathForConfig(projectPath, value) {
58
+ const resolvedPath = projectSourceConfig.resolveSourceDatasetPath(projectPath, { path: value.trim() });
59
+ const relativePath = relative(projectPath, resolvedPath).split(sep).join("/") || ".";
60
+ if (relativePath === ".") {
61
+ throw new Error("Pick a source folder inside this project, not the project root.");
62
+ }
63
+ if (isReservedDatasetPath(relativePath)) {
64
+ throw new Error("Pick an existing source folder under the project root, not `interf/` or `.interf/`.");
65
+ }
66
+ if (!existsSync(resolvedPath)) {
67
+ throw new Error("Pick an existing source folder under the project root.");
68
+ }
69
+ if (!statSync(resolvedPath).isDirectory()) {
70
+ throw new Error("Source folder must be a directory.");
71
+ }
72
+ return relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
73
+ }
74
+ function defaultDatasetNameForPath(datasetPath) {
75
+ const segments = datasetPath
76
+ .replace(/\\/g, "/")
77
+ .replace(/\/+$/g, "")
78
+ .split("/")
79
+ .filter((segment) => segment.length > 0 && segment !== ".");
80
+ return slugify(segments[segments.length - 1] ?? "") || DEFAULT_COMPILED_NAME;
81
+ }
82
+ function findSingleDatasetFolderCandidate(cwd) {
83
+ const visibleDirectories = listVisibleDatasetFolders(cwd);
84
+ if (visibleDirectories.length !== 1) {
55
85
  return null;
56
86
  }
57
87
  return `./${visibleDirectories[0]}`;
58
88
  }
89
+ export function listDatasetFolderChoices(cwd = process.cwd()) {
90
+ return listVisibleDatasetFolders(cwd).map((entry) => ({
91
+ value: `./${entry}`,
92
+ label: entry,
93
+ hint: `Use ./${entry} as the source folder`,
94
+ }));
95
+ }
59
96
  export function defaultDatasetPathForPrompt(name, introStyle, cwd = process.cwd()) {
60
97
  const namedFolderPath = join(cwd, name);
61
98
  if (existsSync(namedFolderPath)) {
@@ -69,15 +106,65 @@ export function defaultDatasetPathForPrompt(name, introStyle, cwd = process.cwd(
69
106
  }
70
107
  }
71
108
  if (introStyle === "first") {
72
- return findSingleDatasetFolderCandidate(cwd) ?? ".";
109
+ return findSingleDatasetFolderCandidate(cwd) ?? `./${name}`;
73
110
  }
74
111
  return `./${name}`;
75
112
  }
113
+ async function promptDatasetFolderPath(options) {
114
+ const folderChoices = listDatasetFolderChoices(options.projectPath);
115
+ if (folderChoices.length > 0) {
116
+ const selected = await p.select({
117
+ message: "Which source folder should Interf use?",
118
+ options: [
119
+ ...folderChoices,
120
+ {
121
+ value: "__manual__",
122
+ label: "Enter a different path",
123
+ hint: "Use a relative path if the source folder is not listed here",
124
+ },
125
+ ],
126
+ initialValue: folderChoices.some((choice) => choice.value === options.initialPath)
127
+ ? options.initialPath
128
+ : undefined,
129
+ });
130
+ if (p.isCancel(selected))
131
+ return null;
132
+ if (selected !== "__manual__") {
133
+ try {
134
+ return normalizeDatasetPathForConfig(options.projectPath, String(selected));
135
+ }
136
+ catch (error) {
137
+ p.log.error(error instanceof Error ? error.message : String(error));
138
+ return null;
139
+ }
140
+ }
141
+ }
142
+ const datasetPath = await p.text({
143
+ message: "Which source folder should Interf use?",
144
+ placeholder: DEFAULT_DATASET_PATH_PLACEHOLDER,
145
+ initialValue: options.initialPath,
146
+ validate: (value) => {
147
+ const normalized = value.trim();
148
+ if (normalized.length === 0)
149
+ return "Source folder is required";
150
+ try {
151
+ normalizeDatasetPathForConfig(options.projectPath, normalized);
152
+ return undefined;
153
+ }
154
+ catch (error) {
155
+ return error instanceof Error ? error.message : String(error);
156
+ }
157
+ },
158
+ });
159
+ if (p.isCancel(datasetPath))
160
+ return null;
161
+ return normalizeDatasetPathForConfig(options.projectPath, String(datasetPath));
162
+ }
76
163
  export function datasetAboutPromptMessage(introStyle) {
77
164
  if (introStyle === "edit") {
78
- return "What should this dataset stay accurate about?";
165
+ return "What task should this source folder stay focused on?";
79
166
  }
80
- return "What should this dataset be accurate about?";
167
+ return "What task should this source folder help with?";
81
168
  }
82
169
  function formatAttemptLabel(count, noun) {
83
170
  return `${count} ${noun}${count === 1 ? "" : "s"}`;
@@ -95,10 +182,30 @@ export function describeCompileLoopSelection(options) {
95
182
  return "Compile once.";
96
183
  }
97
184
  if (mode === "retry") {
98
- return "Compile retries are enabled for this dataset.";
185
+ const attempts = options.maxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS;
186
+ return `Compile retries are enabled here (${formatAttemptLabel(attempts, "total attempt")}).`;
99
187
  }
100
188
  const loops = options.maxLoops ?? DEFAULT_SELF_IMPROVING_LOOPS;
101
- return `Self-improving loops are enabled for this dataset (${formatAttemptLabel(loops, "workflow revision")}).`;
189
+ const attempts = options.maxAttempts ?? DEFAULT_SELF_IMPROVING_ATTEMPTS;
190
+ return `Self-improving loops are enabled here (${formatAttemptLabel(attempts, "attempt")} per variation, ${formatAttemptLabel(loops, "workflow revision")}).`;
191
+ }
192
+ async function promptCompileRetryAttempts(options) {
193
+ const maxAttempts = await p.text({
194
+ message: options.message,
195
+ placeholder: String(DEFAULT_COMPILE_RETRY_ATTEMPTS),
196
+ initialValue: String(options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS),
197
+ validate: (value) => {
198
+ const parsed = Number.parseInt(value.trim(), 10);
199
+ if (!Number.isInteger(parsed) || parsed < 2 || parsed > 5) {
200
+ return "Enter a whole number from 2 to 5";
201
+ }
202
+ return undefined;
203
+ },
204
+ });
205
+ if (p.isCancel(maxAttempts))
206
+ return null;
207
+ return projectSourceConfig.compiledMaxAttempts(Number.parseInt(String(maxAttempts).trim(), 10))
208
+ ?? DEFAULT_COMPILE_RETRY_ATTEMPTS;
102
209
  }
103
210
  export async function promptCheckCases(options) {
104
211
  p.log.info(options.heading);
@@ -139,7 +246,7 @@ export async function promptCheckCases(options) {
139
246
  }
140
247
  function printDraftTruthChecks(checks) {
141
248
  console.log();
142
- p.log.info(`Draft truth checks: ${checks.length}`);
249
+ p.log.info(`Draft checks: ${checks.length}`);
143
250
  for (const [index, check] of checks.entries()) {
144
251
  console.log(` ${index + 1}. ${check.question}`);
145
252
  console.log(` Expected: ${check.answer ?? ""}`);
@@ -151,7 +258,7 @@ async function promptDraftTruthChecks(options) {
151
258
  const datasetConfig = {
152
259
  path: options.datasetPath,
153
260
  };
154
- resolvedDatasetPath = resolveSourceDatasetPath(options.projectPath, datasetConfig);
261
+ resolvedDatasetPath = projectSourceConfig.resolveSourceDatasetPath(options.projectPath, datasetConfig);
155
262
  }
156
263
  catch (error) {
157
264
  p.log.error(error instanceof Error ? error.message : String(error));
@@ -164,19 +271,19 @@ async function promptDraftTruthChecks(options) {
164
271
  if (!resolved.executor) {
165
272
  if (resolved.cancelled)
166
273
  return null;
167
- p.log.error(resolved.error ?? "No local agent detected for truth-check drafting.");
274
+ p.log.error(resolved.error ?? "No local agent detected for check drafting.");
168
275
  const fallback = await p.select({
169
276
  message: "How do you want to continue?",
170
277
  options: [
171
278
  {
172
279
  value: "manual",
173
- label: "Add truth checks manually",
280
+ label: "Add checks manually",
174
281
  hint: "Write the questions and expected answers yourself",
175
282
  },
176
283
  {
177
284
  value: "skip",
178
285
  label: "Skip for now",
179
- hint: "Save this dataset without truth checks",
286
+ hint: "Save this dataset without checks",
180
287
  },
181
288
  ],
182
289
  });
@@ -185,7 +292,7 @@ async function promptDraftTruthChecks(options) {
185
292
  return fallback === "manual" ? "manual" : [];
186
293
  }
187
294
  while (true) {
188
- p.log.info("Drafting truth checks from the dataset files.");
295
+ p.log.info("Drafting checks from the source files.");
189
296
  const drafted = await draftTruthChecks({
190
297
  datasetName: options.datasetName,
191
298
  datasetPath: resolvedDatasetPath,
@@ -194,24 +301,24 @@ async function promptDraftTruthChecks(options) {
194
301
  targetCount: 4,
195
302
  });
196
303
  if (!drafted.checks) {
197
- p.log.error(drafted.error ?? "Could not draft truth checks from this dataset.");
304
+ p.log.error(drafted.error ?? "Could not draft checks from this source folder.");
198
305
  const retryMode = await p.select({
199
306
  message: "How do you want to continue?",
200
307
  options: [
201
308
  {
202
309
  value: "retry",
203
310
  label: "Try auto-create again",
204
- hint: "Run the same local agent again on the dataset folder",
311
+ hint: "Run the same local agent again on the source folder",
205
312
  },
206
313
  {
207
314
  value: "manual",
208
- label: "Add truth checks manually",
315
+ label: "Add checks manually",
209
316
  hint: "Write the checks yourself instead",
210
317
  },
211
318
  {
212
319
  value: "skip",
213
320
  label: "Skip for now",
214
- hint: "Save this dataset without truth checks",
321
+ hint: "Save this dataset without checks",
215
322
  },
216
323
  ],
217
324
  });
@@ -223,7 +330,7 @@ async function promptDraftTruthChecks(options) {
223
330
  }
224
331
  printDraftTruthChecks(drafted.checks);
225
332
  const nextStep = await p.select({
226
- message: "Use these truth checks?",
333
+ message: "Use these checks?",
227
334
  options: [
228
335
  {
229
336
  value: "use",
@@ -233,17 +340,17 @@ async function promptDraftTruthChecks(options) {
233
340
  {
234
341
  value: "retry",
235
342
  label: "Draft again",
236
- hint: "Run the same local agent again on the dataset folder",
343
+ hint: "Run the same local agent again on the source folder",
237
344
  },
238
345
  {
239
346
  value: "manual",
240
- label: "Add them manually instead",
347
+ label: "Add checks manually instead",
241
348
  hint: "Discard this draft and write the checks yourself",
242
349
  },
243
350
  {
244
351
  value: "skip",
245
352
  label: "Skip for now",
246
- hint: "Save this dataset without truth checks",
353
+ hint: "Save this dataset without checks",
247
354
  },
248
355
  ],
249
356
  });
@@ -263,18 +370,18 @@ async function promptCompiledChecks(options) {
263
370
  if (options.initialAbout) {
264
371
  p.log.info(`About: ${options.initialAbout}`);
265
372
  }
266
- p.log.info("Truth checks are the questions this dataset should already answer correctly.");
373
+ p.log.info("Checks are the questions your agents should be able to answer from the files behind this task.");
267
374
  const mode = await p.select({
268
- message: "How do you want to create them?",
375
+ message: "How should Interf create them?",
269
376
  options: [
270
377
  {
271
378
  value: "draft",
272
379
  label: "Auto-create a draft (Recommended)",
273
- hint: "Let a local agent draft a few clear, verifiable checks from this dataset",
380
+ hint: "Let your chosen local agent draft a few clear, verifiable checks from this source folder",
274
381
  },
275
382
  {
276
383
  value: "manual",
277
- label: "Add them manually",
384
+ label: "Add checks manually",
278
385
  hint: "Write the questions and expected answers yourself",
279
386
  },
280
387
  {
@@ -299,7 +406,7 @@ async function promptCompiledChecks(options) {
299
406
  return null;
300
407
  if (drafted === "manual") {
301
408
  return promptCheckCases({
302
- heading: "Truth checks",
409
+ heading: "Checks",
303
410
  questionMessage: "Question 1?",
304
411
  questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
305
412
  answerMessage: "Expected answer 1?",
@@ -310,7 +417,7 @@ async function promptCompiledChecks(options) {
310
417
  return drafted;
311
418
  }
312
419
  return promptCheckCases({
313
- heading: "Truth checks",
420
+ heading: "Checks",
314
421
  questionMessage: "Question 1?",
315
422
  questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
316
423
  answerMessage: "Expected answer 1?",
@@ -321,24 +428,24 @@ async function promptCompiledChecks(options) {
321
428
  if (options.initialAbout) {
322
429
  p.log.info(`About: ${options.initialAbout}`);
323
430
  }
324
- p.log.info(`Current truth checks: ${options.initialChecks.length}`);
431
+ p.log.info(`Current checks: ${options.initialChecks.length}`);
325
432
  const mode = await p.select({
326
433
  message: "What do you want to do with them?",
327
434
  options: [
328
435
  {
329
436
  value: "keep",
330
437
  label: "Keep them",
331
- hint: "Leave the current truth checks as-is",
438
+ hint: "Leave the current checks as-is",
332
439
  },
333
440
  {
334
441
  value: "add",
335
442
  label: "Add more",
336
- hint: "Append more truth checks",
443
+ hint: "Append more checks",
337
444
  },
338
445
  {
339
446
  value: "replace",
340
447
  label: "Replace all",
341
- hint: "Rewrite the truth checks from scratch",
448
+ hint: "Rewrite the checks from scratch",
342
449
  },
343
450
  {
344
451
  value: "redraft",
@@ -348,7 +455,7 @@ async function promptCompiledChecks(options) {
348
455
  {
349
456
  value: "clear",
350
457
  label: "Clear them for now",
351
- hint: "Keep this dataset without saved truth checks",
458
+ hint: "Keep this setup without checks",
352
459
  },
353
460
  ],
354
461
  });
@@ -371,7 +478,7 @@ async function promptCompiledChecks(options) {
371
478
  return null;
372
479
  if (drafted === "manual") {
373
480
  return promptCheckCases({
374
- heading: "Replace truth checks",
481
+ heading: "Replace checks",
375
482
  questionMessage: "Question 1?",
376
483
  questionPlaceholder: DEFAULT_COMPILED_CHECK_QUESTION_PLACEHOLDER,
377
484
  answerMessage: "Expected answer 1?",
@@ -382,7 +489,7 @@ async function promptCompiledChecks(options) {
382
489
  return drafted;
383
490
  }
384
491
  const nextChecks = await promptCheckCases({
385
- heading: mode === "add" ? "Add more truth checks" : "Replace truth checks",
492
+ heading: mode === "add" ? "Add more checks" : "Replace checks",
386
493
  questionMessage: mode === "add"
387
494
  ? `Question ${options.initialChecks.length + 1}?`
388
495
  : "Question 1?",
@@ -413,15 +520,16 @@ async function promptSelfImprovingLoops(options) {
413
520
  });
414
521
  if (p.isCancel(maxLoops))
415
522
  return null;
416
- return compiledMaxLoops(Number.parseInt(String(maxLoops).trim(), 10)) ?? DEFAULT_SELF_IMPROVING_LOOPS;
523
+ return projectSourceConfig.compiledMaxLoops(Number.parseInt(String(maxLoops).trim(), 10))
524
+ ?? DEFAULT_SELF_IMPROVING_LOOPS;
417
525
  }
418
526
  export async function promptCompileLoopSelection(options) {
419
527
  if (!options.hasChecks) {
420
528
  return {};
421
529
  }
422
530
  const currentMode = resolveCompileLoopMode(options.initialMaxAttempts, options.initialMaxLoops);
423
- const currentPromptMode = currentMode === "self-improving" ? "self-improving" : "once";
424
- const recommendedMode = options.recommendedMode ?? "self-improving";
531
+ const currentPromptMode = currentMode;
532
+ const recommendedMode = options.recommendedMode ?? "once";
425
533
  const includeCompileOnce = options.includeCompileOnce !== false;
426
534
  const hasSavedPolicy = typeof options.initialMaxAttempts === "number" ||
427
535
  typeof options.initialMaxLoops === "number";
@@ -436,7 +544,7 @@ export async function promptCompileLoopSelection(options) {
436
544
  once: {
437
545
  value: "once",
438
546
  label: "Compile once",
439
- hint: "Build the compiled dataset once with the selected workflow",
547
+ hint: "Build the compiled context once with the selected workflow",
440
548
  },
441
549
  "self-improving": {
442
550
  value: "self-improving",
@@ -447,23 +555,25 @@ export async function promptCompileLoopSelection(options) {
447
555
  },
448
556
  retry: {
449
557
  value: "retry",
450
- label: "Compile once",
451
- hint: "Build the compiled dataset once with the selected workflow",
558
+ label: "Retry same workflow",
559
+ hint: `Retry compile and compiled-context checks up to ${options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS} total time${(options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS) === 1 ? "" : "s"} without editing the workflow`,
452
560
  },
453
561
  };
454
562
  const orderedModes = (hasSavedPolicy
455
563
  ? [
456
564
  currentPromptMode,
457
565
  ...(recommendedMode !== currentPromptMode ? [recommendedMode] : []),
566
+ "retry",
458
567
  "once",
459
568
  ]
460
569
  : [
461
570
  recommendedMode,
571
+ "retry",
462
572
  "once",
463
573
  ]).filter((mode, index, list) => list.indexOf(mode) === index)
464
574
  .filter((mode) => includeCompileOnce || mode !== "once");
465
575
  const selectedMode = await p.select({
466
- message: options.message ?? "How should this dataset compile?",
576
+ message: options.message ?? "How should this compile run work?",
467
577
  options: orderedModes.map((mode) => optionsByMode[mode]),
468
578
  });
469
579
  if (p.isCancel(selectedMode))
@@ -471,6 +581,17 @@ export async function promptCompileLoopSelection(options) {
471
581
  if (selectedMode === "once") {
472
582
  return {};
473
583
  }
584
+ if (selectedMode === "retry") {
585
+ const maxAttempts = await promptCompileRetryAttempts({
586
+ initialMaxAttempts: options.initialMaxAttempts ?? DEFAULT_COMPILE_RETRY_ATTEMPTS,
587
+ message: "How many total attempts should Interf try before stopping?",
588
+ });
589
+ if (maxAttempts === null)
590
+ return null;
591
+ return {
592
+ max_attempts: maxAttempts,
593
+ };
594
+ }
474
595
  const maxLoops = await promptSelfImprovingLoops({
475
596
  initialMaxLoops: options.initialMaxLoops ?? DEFAULT_SELF_IMPROVING_LOOPS,
476
597
  message: "How many workflow revisions should Interf try?",
@@ -478,7 +599,7 @@ export async function promptCompileLoopSelection(options) {
478
599
  if (maxLoops === null)
479
600
  return null;
480
601
  return {
481
- max_attempts: compiledMaxAttempts(DEFAULT_COMPILE_RETRY_ATTEMPTS) ?? DEFAULT_COMPILE_RETRY_ATTEMPTS,
602
+ max_attempts: DEFAULT_SELF_IMPROVING_ATTEMPTS,
482
603
  max_loops: maxLoops,
483
604
  };
484
605
  }
@@ -486,64 +607,53 @@ export async function promptSingleCompiledConfig(options = {}) {
486
607
  const initial = options.initial;
487
608
  const introStyle = options.introStyle ?? "first";
488
609
  if (introStyle === "first") {
489
- p.log.info("Pick the dataset folder you want to measure.");
490
- p.log.info("Then say what this dataset should be accurate about and save a few truth checks you can verify.");
610
+ p.log.info("Pick the source folder for this task.");
611
+ p.log.info("Then say what task this source folder should help with and save a few checks you can verify.");
491
612
  }
492
613
  else if (introStyle === "additional") {
493
- p.log.info("Add another dataset only if this project needs a separate folder or set of truth checks.");
614
+ p.log.info("Add another setup only if this project needs a separate folder or set of checks.");
494
615
  }
495
616
  const fixedName = options.fixedName ? slugify(String(options.fixedName)) : undefined;
496
617
  if (options.fixedName && !fixedName) {
497
- p.log.error("Current dataset id needs letters, numbers, or dashes.");
618
+ p.log.error("Current dataset name needs letters, numbers, or dashes.");
498
619
  return null;
499
620
  }
500
- let name = fixedName ?? (options.skipNamePrompt ? slugify(String(initial?.name ?? DEFAULT_COMPILED_NAME)) : undefined);
501
- if (name) {
502
- if (options.fixedName) {
503
- p.log.info(`Editing truth checks for dataset "${name}".`);
504
- }
621
+ let name = fixedName;
622
+ if (name && options.fixedName) {
623
+ p.log.info(`Editing checks for dataset "${name}".`);
505
624
  }
506
- else {
507
- const suggestedName = initial?.name ?? slugify(String(initial?.about ?? "")) ?? DEFAULT_COMPILED_NAME;
625
+ let about = normalizeOptionalPromptText(initial?.about);
626
+ const projectPath = options.projectPath ?? process.cwd();
627
+ const defaultNameSeed = slugify(String(initial?.name ?? DEFAULT_COMPILED_NAME)) || DEFAULT_COMPILED_NAME;
628
+ const defaultDatasetPath = initial?.path ?? defaultDatasetPathForPrompt(defaultNameSeed, introStyle, projectPath);
629
+ const normalizedDatasetPath = await promptDatasetFolderPath({
630
+ projectPath,
631
+ initialPath: defaultDatasetPath,
632
+ });
633
+ if (!normalizedDatasetPath)
634
+ return null;
635
+ if (!name) {
636
+ const suggestedName = defaultDatasetNameForPath(normalizedDatasetPath);
508
637
  const rawName = await p.text({
509
- message: "Dataset id?",
638
+ message: "Dataset name?",
510
639
  placeholder: suggestedName,
511
640
  initialValue: suggestedName,
512
- validate: (value) => (value.trim().length === 0 ? "Name is required" : undefined),
641
+ validate: (value) => (value.trim().length === 0 ? "Dataset name is required" : undefined),
513
642
  });
514
643
  if (p.isCancel(rawName))
515
644
  return null;
516
645
  name = slugify(String(rawName));
517
646
  if (!name) {
518
- p.log.error("Dataset id needs letters, numbers, or dashes.");
647
+ p.log.error("Dataset name needs letters, numbers, or dashes.");
519
648
  return null;
520
649
  }
521
650
  if (name !== rawName) {
522
- p.log.info(`Dataset id: ${name}`);
651
+ p.log.info(`Dataset name: ${name}`);
523
652
  }
524
653
  }
525
- let about = normalizeOptionalPromptText(initial?.about);
526
- const defaultDatasetPath = initial?.path ?? defaultDatasetPathForPrompt(name, introStyle, options.projectPath ?? process.cwd());
527
- const datasetPath = await p.text({
528
- message: "Dataset folder?",
529
- placeholder: DEFAULT_DATASET_PATH_PLACEHOLDER,
530
- initialValue: defaultDatasetPath,
531
- validate: (value) => {
532
- const normalized = value.trim();
533
- if (normalized.length === 0)
534
- return "Dataset folder is required";
535
- try {
536
- resolveSourceDatasetPath(options.projectPath ?? process.cwd(), { path: normalized });
537
- return undefined;
538
- }
539
- catch (error) {
540
- return error instanceof Error ? error.message : String(error);
541
- }
542
- },
543
- });
544
- if (p.isCancel(datasetPath))
545
- return null;
546
- const normalizedDatasetPath = String(datasetPath).trim();
654
+ if (options.selectedWorkflowLabel) {
655
+ p.log.info(`Workflow: ${options.selectedWorkflowLabel}`);
656
+ }
547
657
  let compileLoopSelection = {
548
658
  ...(typeof initial?.max_attempts === "number" ? { max_attempts: initial.max_attempts } : {}),
549
659
  ...(typeof initial?.max_loops === "number" ? { max_loops: initial.max_loops } : {}),
@@ -573,11 +683,8 @@ export async function promptSingleCompiledConfig(options = {}) {
573
683
  initialMaxLoops: initial?.max_loops,
574
684
  hasChecks: checks.length > 0,
575
685
  intro: [
576
- ...(options.selectedWorkflowLabel
577
- ? [`Workflow: ${options.selectedWorkflowLabel}`]
578
- : []),
579
686
  "Compile mode",
580
- "Choose whether this dataset should compile once or keep revising the workflow until it passes the same truth checks.",
687
+ "Choose whether Interf should compile once, retry the same workflow, or try self-improving workflow variations on the same checks.",
581
688
  ],
582
689
  });
583
690
  if (compileLoopSelection === null)
@@ -1,8 +1,9 @@
1
1
  import chalk from "chalk";
2
2
  import * as p from "@clack/prompts";
3
- import { detectInterf, listCompiledDatasetsForSourceFolder, readInterfConfig, resolveSourceControlPath, } from "../lib/interf.js";
4
- import { computeCompiledHealth } from "../lib/state.js";
5
- import { readSavedTestComparison, printSavedTestComparisonState } from "./test-flow.js";
3
+ import { detectInterf, listCompiledDatasetsForSourceFolder, readInterfConfig, resolveSourceControlPath, } from "../../packages/project-model/interf.js";
4
+ import { computeCompiledHealth } from "../../packages/compiler/state.js";
5
+ import { sourceDatasetConfigFromInterfConfig, loadCompiledDatasetConfig, } from "../../packages/project-model/source-config.js";
6
+ import { printSavedTestComparisonState, readCurrentSavedTestComparison } from "./test-flow.js";
6
7
  function statusColor(status) {
7
8
  switch (status) {
8
9
  case "compiled":
@@ -17,7 +18,7 @@ function statusColor(status) {
17
18
  }
18
19
  export const statusCommand = {
19
20
  command: "status",
20
- describe: "Show deterministic health for a compiled dataset",
21
+ describe: "Show deterministic health for a compiled context",
21
22
  handler: async () => {
22
23
  let compiledPath = null;
23
24
  const detected = detectInterf(process.cwd());
@@ -32,8 +33,8 @@ export const statusCommand = {
32
33
  }));
33
34
  if (local.length === 0) {
34
35
  process.exitCode = 1;
35
- console.log(chalk.red(" No compiled datasets found."));
36
- console.log(chalk.dim(" Run `interf`, save truth checks, and compile a dataset first."));
36
+ console.log(chalk.red(" No compiled contexts found."));
37
+ console.log(chalk.dim(" Run `interf`, save checks, and compile a context folder first."));
37
38
  return;
38
39
  }
39
40
  if (local.length === 1) {
@@ -41,7 +42,7 @@ export const statusCommand = {
41
42
  }
42
43
  else {
43
44
  const selected = await p.select({
44
- message: "Which dataset?",
45
+ message: "Which setup?",
45
46
  options: local.map((entry) => ({ value: entry.path, label: entry.name })),
46
47
  });
47
48
  if (p.isCancel(selected))
@@ -58,15 +59,23 @@ export const statusCommand = {
58
59
  console.log(chalk.dim(` ${health.summary}`));
59
60
  const compiledConfig = readInterfConfig(compiledPath);
60
61
  const sourcePath = resolveSourceControlPath(compiledPath);
61
- const latestComparison = compiledConfig
62
- ? readSavedTestComparison(sourcePath, compiledConfig.name)
63
- : null;
62
+ const latestComparisonState = compiledConfig
63
+ ? readCurrentSavedTestComparison({
64
+ projectPath: sourcePath,
65
+ datasetName: compiledConfig.name,
66
+ checks: (loadCompiledDatasetConfig(compiledPath)
67
+ ?? sourceDatasetConfigFromInterfConfig(compiledConfig)).checks,
68
+ })
69
+ : { comparison: null, stale: false };
70
+ const latestComparison = latestComparisonState.comparison;
64
71
  if (latestComparison) {
65
72
  printSavedTestComparisonState(latestComparison);
66
73
  }
67
74
  else {
68
75
  console.log();
69
- console.log(chalk.dim(" No saved test result yet. Run `interf test` to measure files as-is and the compiled dataset."));
76
+ console.log(chalk.dim(latestComparisonState.stale
77
+ ? " Saved test results are stale for the current checks. Run `interf test` again."
78
+ : " No saved test result yet. Run `interf test` to measure files as-is and the compiled context."));
70
79
  }
71
80
  console.log();
72
81
  const metricOrder = [