@hassangameryt/freeflow 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +6 -2
  3. package/.codex-plugin/plugin.json +9 -9
  4. package/README.md +190 -127
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/{skills → capabilities}/output-router/SKILL.md +21 -17
  9. package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
  10. package/capabilities/output-router/references/setup.md +110 -0
  11. package/command-surface.json +62 -7
  12. package/hooks/freeflow-runtime-context.mjs +572 -154
  13. package/hooks/hooks.json +26 -1
  14. package/hooks/tests/check-runtime-context-hook.sh +375 -0
  15. package/package.json +24 -24
  16. package/pi-extension/dist/index.js +264 -80
  17. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  18. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  19. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  20. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  21. package/pi-extension/dist/output-router/renderers.js +1023 -0
  22. package/pi-extension/dist/output-router/router-tools.js +554 -0
  23. package/pi-extension/dist/output-router/schemas.js +383 -0
  24. package/pi-extension/dist/output-router/status.js +744 -0
  25. package/pi-extension/dist/output-router/utils.js +502 -0
  26. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  27. package/pi-extension/dist/settings/settings-tui.js +314 -0
  28. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  29. package/pi-extension/freeflow/index.js +1 -0
  30. package/pi-extension/src/index.ts +230 -56
  31. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  32. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
  33. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  34. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  35. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  36. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  37. package/pi-extension/src/output-router/status.ts +791 -0
  38. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  39. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  40. package/pi-extension/src/settings/settings-tui.ts +408 -0
  41. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  42. package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
  43. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  44. package/pi-extension/tests/output-router/search.test.js +722 -0
  45. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  46. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  48. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  49. package/router/dist/benchmarks/benchmarks.js +860 -761
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  53. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  59. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  61. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  66. package/router/dist/config/config.d.ts +62 -55
  67. package/router/dist/config/config.js +552 -373
  68. package/router/dist/config/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +38 -38
  70. package/router/dist/config/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +586 -538
  72. package/router/dist/config/types.d.ts +413 -361
  73. package/router/dist/config/types.js +19 -8
  74. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  75. package/router/dist/evidence/bounded-evidence.js +265 -252
  76. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  77. package/router/dist/evidence/evidence-range-selector.js +192 -191
  78. package/router/dist/evidence/evidence-search.d.ts +18 -16
  79. package/router/dist/evidence/evidence-search.js +401 -377
  80. package/router/dist/evidence/evidence.d.ts +17 -17
  81. package/router/dist/evidence/evidence.js +163 -159
  82. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  83. package/router/dist/evidence/failure-contracts.js +132 -126
  84. package/router/dist/evidence/line-ranges.d.ts +17 -15
  85. package/router/dist/evidence/line-ranges.js +18 -18
  86. package/router/dist/experiments/local-index.d.ts +47 -41
  87. package/router/dist/experiments/local-index.js +477 -458
  88. package/router/dist/local/local-traversal.d.ts +18 -0
  89. package/router/dist/local/local-traversal.js +334 -0
  90. package/router/dist/processing/engine.d.ts +94 -70
  91. package/router/dist/processing/engine.js +462 -364
  92. package/router/dist/processing/reducers.d.ts +208 -194
  93. package/router/dist/processing/reducers.js +1434 -1256
  94. package/router/dist/processing/renderers.d.ts +24 -18
  95. package/router/dist/processing/renderers.js +161 -152
  96. package/router/dist/processing/scripts.d.ts +80 -67
  97. package/router/dist/processing/scripts.js +343 -290
  98. package/router/dist/repo/repo-traversal.d.ts +9 -9
  99. package/router/dist/repo/repo-traversal.js +205 -202
  100. package/router/dist/routing/observed-reducers.d.ts +25 -19
  101. package/router/dist/routing/observed-reducers.js +559 -545
  102. package/router/dist/routing/observed-routing.d.ts +23 -14
  103. package/router/dist/routing/observed-routing.js +319 -318
  104. package/router/dist/routing/parsers.d.ts +10 -10
  105. package/router/dist/routing/parsers.js +454 -406
  106. package/router/dist/routing/run-filters.d.ts +45 -41
  107. package/router/dist/routing/run-filters.js +215 -207
  108. package/router/dist/routing/run-reducers.d.ts +45 -26
  109. package/router/dist/routing/run-reducers.js +102 -90
  110. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  111. package/router/dist/sandbox/adapter-roots.js +43 -41
  112. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  114. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  115. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  116. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  117. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  118. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  119. package/router/dist/sandbox/script-sandbox.js +294 -260
  120. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  121. package/router/dist/setup/script-transform-adapters.js +223 -204
  122. package/router/dist/tools/batch.d.ts +27 -16
  123. package/router/dist/tools/batch.js +493 -416
  124. package/router/dist/tools/run.d.ts +47 -35
  125. package/router/dist/tools/run.js +1172 -1087
  126. package/router/dist/tools/search.d.ts +53 -31
  127. package/router/dist/tools/search.js +1224 -1065
  128. package/router/dist/transform/engine.d.ts +121 -96
  129. package/router/dist/transform/engine.js +1853 -1736
  130. package/router/dist/vault/vault-index.d.ts +97 -78
  131. package/router/dist/vault/vault-index.js +347 -342
  132. package/router/dist/vault/vault.d.ts +109 -74
  133. package/router/dist/vault/vault.js +528 -533
  134. package/runtime/interaction-contract.md +16 -0
  135. package/skills/bypass/SKILL.md +52 -38
  136. package/skills/commit-work/SKILL.md +54 -46
  137. package/skills/commit-work/references/staging-decisions.md +46 -24
  138. package/skills/decision-gate/SKILL.md +48 -0
  139. package/skills/design-for-depth/SKILL.md +75 -59
  140. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  141. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  142. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  143. package/skills/diagnose-failure/SKILL.md +65 -60
  144. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  145. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  146. package/skills/discuss/SKILL.md +121 -0
  147. package/skills/discuss/references/checkpoints.md +66 -0
  148. package/skills/evaluate-skill/SKILL.md +62 -53
  149. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  150. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  151. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  152. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  153. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  154. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  155. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  156. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  159. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  160. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  161. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  162. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  163. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  164. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  165. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  166. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  167. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  168. package/skills/execute-work/SKILL.md +99 -0
  169. package/skills/execute-work/references/code-practices.md +78 -0
  170. package/skills/execute-work/references/execution-loop.md +77 -0
  171. package/skills/finish-branch/SKILL.md +117 -0
  172. package/skills/finish-branch/references/integration-options.md +80 -0
  173. package/skills/handoff/SKILL.md +65 -39
  174. package/skills/handoff/references/templates.md +104 -27
  175. package/skills/launch-work/SKILL.md +116 -0
  176. package/skills/launch-work/references/launch-readiness.md +85 -0
  177. package/skills/migration-work/SKILL.md +115 -0
  178. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  179. package/skills/mode-contract/SKILL.md +72 -52
  180. package/skills/release-work/SKILL.md +118 -0
  181. package/skills/release-work/references/release-evidence.md +78 -0
  182. package/skills/review-artifact/SKILL.md +77 -69
  183. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  184. package/skills/review-work/SKILL.md +82 -57
  185. package/skills/review-work/references/reviewer-prompt.md +97 -60
  186. package/skills/review-work/references/security-risk-lens.md +67 -0
  187. package/skills/setup-freeflow/SKILL.md +54 -68
  188. package/skills/setup-freeflow/references/activation-contract.md +84 -69
  189. package/skills/setup-freeflow/references/host-setup.md +50 -17
  190. package/skills/simplify-code/SKILL.md +80 -0
  191. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  192. package/skills/tdd/SKILL.md +96 -0
  193. package/skills/tdd/references/test-design.md +96 -0
  194. package/skills/track-work/SKILL.md +84 -0
  195. package/skills/track-work/references/working-record-schema.md +378 -0
  196. package/skills/verify-work/SKILL.md +59 -38
  197. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  198. package/skills/verify-work/references/integration-evidence.md +51 -0
  199. package/skills/verify-work/references/performance-evidence.md +57 -0
  200. package/skills/workflow/SKILL.md +53 -59
  201. package/skills/workflow/references/domain-skill-composition.md +57 -0
  202. package/skills/workflow/references/workflow-loop.md +92 -0
  203. package/skills/write-plan/SKILL.md +85 -58
  204. package/skills/write-plan/references/plan-shapes.md +132 -46
  205. package/skills/write-skill/SKILL.md +82 -51
  206. package/skills/write-skill/references/activation-boundaries.md +62 -0
  207. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  208. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  209. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  210. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  211. package/skills/write-spec/SKILL.md +65 -54
  212. package/skills/write-spec/references/artifact-standards.md +60 -41
  213. package/skills/write-spec/references/decision-records.md +77 -0
  214. package/skills/write-spec/references/spec-shapes.md +119 -60
  215. package/evals/README.md +0 -32
  216. package/evals/fixtures/copy-conventions.md +0 -31
  217. package/evals/fixtures/output-router/README.md +0 -12
  218. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  219. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  220. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  221. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  222. package/evals/fixtures/output-router/verification-output.txt +0 -8
  223. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  224. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  227. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  228. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  229. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  230. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  232. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  233. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  234. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  235. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  236. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  238. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  239. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  240. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  241. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  242. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  244. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  245. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  246. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  247. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  248. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  250. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  251. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  256. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  257. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  259. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  260. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  261. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  262. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  263. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  264. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  265. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  266. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  269. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  270. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  272. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  274. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  275. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  277. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  279. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  283. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  286. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  287. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  288. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  289. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  295. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  297. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  299. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  300. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  301. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  302. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  303. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  304. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  305. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  306. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  307. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  308. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  311. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  312. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  313. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  314. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  315. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  316. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  317. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  318. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  319. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  321. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  323. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  324. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  337. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  349. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  362. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  363. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  364. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  365. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  366. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  367. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  368. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  369. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  370. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  371. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  372. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  373. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  374. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  375. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  376. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  377. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  378. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  379. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  380. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  381. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  382. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  383. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  384. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  385. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  386. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  387. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  388. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  389. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  390. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  391. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  393. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  395. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  396. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  397. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  398. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  399. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  400. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  401. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  403. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  404. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  405. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  406. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  407. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  408. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  409. package/evals/fixtures/tiny-team-app/README.md +0 -5
  410. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  411. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  412. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  413. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  414. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  415. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  417. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  418. package/evals/prompts/aon-001.txt +0 -2
  419. package/evals/prompts/byp-001.txt +0 -2
  420. package/evals/prompts/byp-002.txt +0 -2
  421. package/evals/prompts/cap-001.txt +0 -3
  422. package/evals/prompts/cap-002.txt +0 -3
  423. package/evals/prompts/cmd-001.txt +0 -3
  424. package/evals/prompts/cmd-002.txt +0 -3
  425. package/evals/prompts/cmd-003.txt +0 -6
  426. package/evals/prompts/cmd-004.txt +0 -5
  427. package/evals/prompts/cmd-005.txt +0 -5
  428. package/evals/prompts/cmd-006.txt +0 -5
  429. package/evals/prompts/cmd-007.txt +0 -5
  430. package/evals/prompts/cmd-008.txt +0 -5
  431. package/evals/prompts/cmd-009.txt +0 -8
  432. package/evals/prompts/cmd-010.txt +0 -5
  433. package/evals/prompts/cmd-011.txt +0 -5
  434. package/evals/prompts/cmd-012.txt +0 -5
  435. package/evals/prompts/cmd-013.txt +0 -5
  436. package/evals/prompts/cmd-014.txt +0 -7
  437. package/evals/prompts/cmd-015.txt +0 -7
  438. package/evals/prompts/cmd-016.txt +0 -5
  439. package/evals/prompts/cmt-001.txt +0 -1
  440. package/evals/prompts/cmt-002.txt +0 -1
  441. package/evals/prompts/cmt-003.txt +0 -1
  442. package/evals/prompts/cmt-004.txt +0 -1
  443. package/evals/prompts/cmt-005.txt +0 -1
  444. package/evals/prompts/dfd-001.txt +0 -3
  445. package/evals/prompts/dia-001.txt +0 -3
  446. package/evals/prompts/dia-002.txt +0 -3
  447. package/evals/prompts/dia-003.txt +0 -3
  448. package/evals/prompts/dis-001.txt +0 -5
  449. package/evals/prompts/dis-002.txt +0 -5
  450. package/evals/prompts/esk-001.txt +0 -5
  451. package/evals/prompts/esk-002.txt +0 -5
  452. package/evals/prompts/esk-003.txt +0 -5
  453. package/evals/prompts/grc-001.txt +0 -3
  454. package/evals/prompts/hof-001.txt +0 -3
  455. package/evals/prompts/hof-002.txt +0 -1
  456. package/evals/prompts/hof-003.txt +0 -1
  457. package/evals/prompts/hof-004.txt +0 -1
  458. package/evals/prompts/hof-005.txt +0 -1
  459. package/evals/prompts/ivg-001.txt +0 -1
  460. package/evals/prompts/ivg-002.txt +0 -11
  461. package/evals/prompts/ivg-003.txt +0 -1
  462. package/evals/prompts/ivg-004.txt +0 -1
  463. package/evals/prompts/mode-001.txt +0 -3
  464. package/evals/prompts/mode-002.txt +0 -1
  465. package/evals/prompts/mode-003.txt +0 -3
  466. package/evals/prompts/mode-004.txt +0 -3
  467. package/evals/prompts/mode-005.txt +0 -3
  468. package/evals/prompts/mode-006.txt +0 -3
  469. package/evals/prompts/mode-007.txt +0 -3
  470. package/evals/prompts/otr-001.txt +0 -3
  471. package/evals/prompts/otr-002.txt +0 -3
  472. package/evals/prompts/rar-001.txt +0 -5
  473. package/evals/prompts/rar-002.txt +0 -3
  474. package/evals/prompts/rar-003.txt +0 -6
  475. package/evals/prompts/rar-004.txt +0 -15
  476. package/evals/prompts/rar-005.txt +0 -10
  477. package/evals/prompts/rbr-001.txt +0 -3
  478. package/evals/prompts/rbr-002.txt +0 -3
  479. package/evals/prompts/rbr-003.txt +0 -7
  480. package/evals/prompts/rev-001.txt +0 -3
  481. package/evals/prompts/rev-002.txt +0 -5
  482. package/evals/prompts/rev-003.txt +0 -6
  483. package/evals/prompts/rev-004.txt +0 -1
  484. package/evals/prompts/rev-005.txt +0 -15
  485. package/evals/prompts/rev-006.txt +0 -5
  486. package/evals/prompts/stp-001.txt +0 -1
  487. package/evals/prompts/stp-002.txt +0 -1
  488. package/evals/prompts/stp-003.txt +0 -1
  489. package/evals/prompts/stp-004.txt +0 -1
  490. package/evals/prompts/stp-005.txt +0 -1
  491. package/evals/prompts/stp-006.txt +0 -1
  492. package/evals/prompts/stp-007.txt +0 -1
  493. package/evals/prompts/stp-008.txt +0 -1
  494. package/evals/prompts/stp-009.txt +0 -1
  495. package/evals/prompts/stp-010.txt +0 -1
  496. package/evals/prompts/stp-011.txt +0 -1
  497. package/evals/prompts/vfy-003.txt +0 -1
  498. package/evals/prompts/wpl-001.txt +0 -3
  499. package/evals/prompts/wpl-002.txt +0 -5
  500. package/evals/prompts/wpl-003.txt +0 -3
  501. package/evals/prompts/wpl-004.txt +0 -5
  502. package/evals/prompts/wpl-005.txt +0 -1
  503. package/evals/prompts/wrc-001.txt +0 -10
  504. package/evals/prompts/wrc-002.txt +0 -3
  505. package/evals/prompts/wsk-001.txt +0 -6
  506. package/evals/prompts/wsp-001.txt +0 -5
  507. package/evals/prompts/wsp-002.txt +0 -15
  508. package/evals/prompts/wsp-003.txt +0 -3
  509. package/evals/prompts/wsp-004.txt +0 -15
  510. package/evals/prompts/wsp-005.txt +0 -5
  511. package/evals/prompts/wsp-006.txt +0 -12
  512. package/evals/prompts/wsp-007.txt +0 -9
  513. package/evals/prompts/wsp-008.txt +0 -13
  514. package/evals/prompts/xpl-001.txt +0 -1
  515. package/evals/prompts/xpl-002.txt +0 -3
  516. package/evals/prompts/xpl-003.txt +0 -3
  517. package/evals/prompts/xpl-004.txt +0 -3
  518. package/evals/prompts/xpl-005.txt +0 -5
  519. package/evals/prompts/xpl-006.txt +0 -3
  520. package/evals/registries/adversarial-evals.json +0 -39
  521. package/evals/registries/fixture-evals.json +0 -2513
  522. package/evals/registries/handoff-evals.json +0 -74
  523. package/evals/registries/legacy-evals.json +0 -147
  524. package/evals/registries/skill-evidence.json +0 -193
  525. package/evals/registries/verify-work-evals.json +0 -46
  526. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  527. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  528. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  529. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  530. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  531. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  532. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  533. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  534. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  535. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  536. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  537. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  538. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  539. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  540. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  541. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  543. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  544. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  545. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  546. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  547. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  548. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  549. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  550. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  551. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  552. package/evals/reports/by-skill/discover-1-report.md +0 -118
  553. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  554. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  555. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  556. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  557. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  558. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  559. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  560. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  561. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  562. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  563. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  564. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  565. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  566. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  567. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  568. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  569. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  570. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  571. package/evals/reports/by-skill/research-1-report.md +0 -144
  572. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  573. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  574. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  575. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  576. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  577. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  578. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  579. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  580. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  581. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  582. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  583. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  584. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  585. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  586. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  588. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  589. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  590. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  591. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  592. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  593. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  594. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  595. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  596. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  597. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  598. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  599. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  600. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  601. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  602. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  603. package/evals/reports/iterations/iteration-1-report.md +0 -71
  604. package/evals/reports/iterations/iteration-2-report.md +0 -78
  605. package/evals/reports/iterations/iteration-3-report.md +0 -118
  606. package/evals/reports/iterations/iteration-4-report.md +0 -131
  607. package/evals/reports/iterations/iteration-5-report.md +0 -149
  608. package/evals/reports/iterations/iteration-6-report.md +0 -136
  609. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  610. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  611. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  613. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  614. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  615. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  616. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  617. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  618. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  619. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  620. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  621. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  622. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  623. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  624. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  625. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  626. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  627. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  628. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  629. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  630. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  631. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  632. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  633. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  634. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  635. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  636. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  637. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  638. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  639. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  640. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  641. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  642. package/evals/scripts/audit-command-surface.sh +0 -160
  643. package/evals/scripts/check-activation-contract.sh +0 -121
  644. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  645. package/evals/scripts/grade-fixture-eval.sh +0 -446
  646. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  648. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  649. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  650. package/evals/scripts/run-fixture-eval.sh +0 -464
  651. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  652. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  653. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  654. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  655. package/evals/scripts/skill-evidence.sh +0 -316
  656. package/evals/scripts/validate-release-metadata.sh +0 -486
  657. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  658. package/pi-extension/dist/host-producer-identification.js +0 -186
  659. package/pi-extension/dist/mcp-config.js +0 -30
  660. package/pi-extension/dist/native-safety-net.js +0 -209
  661. package/pi-extension/dist/observed-tool-routing.js +0 -114
  662. package/pi-extension/dist/renderers.js +0 -835
  663. package/pi-extension/dist/router-tools.js +0 -438
  664. package/pi-extension/dist/runtime-context.js +0 -288
  665. package/pi-extension/dist/schemas.js +0 -254
  666. package/pi-extension/dist/status.js +0 -449
  667. package/pi-extension/dist/utils.js +0 -467
  668. package/pi-extension/src/runtime-context.ts +0 -347
  669. package/pi-extension/src/status.ts +0 -505
  670. package/plugin-docs/README.md +0 -40
  671. package/plugin-docs/adr/0001-three-modes.md +0 -27
  672. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  673. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  674. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  675. package/plugin-docs/adr/README.md +0 -10
  676. package/plugin-docs/architecture.md +0 -89
  677. package/plugin-docs/output-router.md +0 -396
  678. package/plugin-docs/release-evidence.md +0 -77
  679. package/plugin-docs/skills.md +0 -44
  680. package/plugin-docs/workflow.md +0 -57
  681. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  682. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  683. package/skills/discover/CHECKPOINTS.md +0 -74
  684. package/skills/discover/SKILL.md +0 -173
  685. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  686. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  687. package/skills/execute-plan/SKILL.md +0 -133
  688. package/skills/execute-plan/references/execution-map.md +0 -122
  689. package/skills/interview-gate/SKILL.md +0 -90
  690. package/skills/setup-freeflow/references/output-router-setup.md +0 -102
  691. package/skills/workflow/references/workflow-map.md +0 -104
  692. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -12,551 +12,570 @@ const QUERY_EXCERPT_MAX_BYTES = 8_192;
12
12
  const LINE_PREVIEW_MAX_BYTES = 2_048;
13
13
  const TRUNCATION_SUFFIX = " … [truncated; query index stores bounded preview only]";
14
14
  const STOPWORDS = new Set([
15
- "a",
16
- "an",
17
- "and",
18
- "are",
19
- "as",
20
- "at",
21
- "be",
22
- "by",
23
- "for",
24
- "from",
25
- "in",
26
- "is",
27
- "it",
28
- "of",
29
- "on",
30
- "or",
31
- "that",
32
- "the",
33
- "this",
34
- "to",
35
- "with",
15
+ "a",
16
+ "an",
17
+ "and",
18
+ "are",
19
+ "as",
20
+ "at",
21
+ "be",
22
+ "by",
23
+ "for",
24
+ "from",
25
+ "in",
26
+ "is",
27
+ "it",
28
+ "of",
29
+ "on",
30
+ "or",
31
+ "that",
32
+ "the",
33
+ "this",
34
+ "to",
35
+ "with",
36
36
  ]);
37
37
  const SKIP_DIRS = new Set([
38
- ".git",
39
- "node_modules",
40
- "dist",
41
- "build",
42
- "out",
43
- ".next",
44
- ".nuxt",
45
- "coverage",
46
- "target",
47
- "graphify-out",
48
- ".cache",
49
- ".tmp",
50
- "tmp",
51
- "temp",
52
- "logs",
53
- "generated",
38
+ ".git",
39
+ "node_modules",
40
+ "dist",
41
+ "build",
42
+ "out",
43
+ ".next",
44
+ ".nuxt",
45
+ "coverage",
46
+ "target",
47
+ "graphify-out",
48
+ ".cache",
49
+ ".tmp",
50
+ "tmp",
51
+ "temp",
52
+ "logs",
53
+ "generated",
54
54
  ]);
55
55
  const BROAD_SKIP_FILE_EXTENSIONS = new Set([
56
- ".7z",
57
- ".avi",
58
- ".bin",
59
- ".bmp",
60
- ".br",
61
- ".class",
62
- ".db",
63
- ".dll",
64
- ".dylib",
65
- ".eot",
66
- ".exe",
67
- ".gif",
68
- ".gz",
69
- ".heic",
70
- ".icns",
71
- ".ico",
72
- ".jar",
73
- ".jpeg",
74
- ".jpg",
75
- ".mov",
76
- ".mp3",
77
- ".mp4",
78
- ".otf",
79
- ".parquet",
80
- ".pdf",
81
- ".png",
82
- ".pyc",
83
- ".rar",
84
- ".so",
85
- ".sqlite",
86
- ".sqlite3",
87
- ".tar",
88
- ".tgz",
89
- ".ttf",
90
- ".wasm",
91
- ".webm",
92
- ".webp",
93
- ".woff",
94
- ".woff2",
95
- ".zip",
96
- ".zst",
56
+ ".7z",
57
+ ".avi",
58
+ ".bin",
59
+ ".bmp",
60
+ ".br",
61
+ ".class",
62
+ ".db",
63
+ ".dll",
64
+ ".dylib",
65
+ ".eot",
66
+ ".exe",
67
+ ".gif",
68
+ ".gz",
69
+ ".heic",
70
+ ".icns",
71
+ ".ico",
72
+ ".jar",
73
+ ".jpeg",
74
+ ".jpg",
75
+ ".mov",
76
+ ".mp3",
77
+ ".mp4",
78
+ ".otf",
79
+ ".parquet",
80
+ ".pdf",
81
+ ".png",
82
+ ".pyc",
83
+ ".rar",
84
+ ".so",
85
+ ".sqlite",
86
+ ".sqlite3",
87
+ ".tar",
88
+ ".tgz",
89
+ ".ttf",
90
+ ".wasm",
91
+ ".webm",
92
+ ".webp",
93
+ ".woff",
94
+ ".woff2",
95
+ ".zip",
96
+ ".zst",
97
97
  ]);
98
98
  export function defaultExperimentalIndexCacheRoot() {
99
- const xdgCache = process.env.XDG_CACHE_HOME;
100
- return resolve(xdgCache && xdgCache.trim() ? xdgCache : join(homedir(), ".cache"), "freeflow-router", "experimental-index");
99
+ const xdgCache = process.env.XDG_CACHE_HOME;
100
+ return resolve(
101
+ xdgCache && xdgCache.trim() ? xdgCache : join(homedir(), ".cache"),
102
+ "freeflow-router",
103
+ "experimental-index",
104
+ );
101
105
  }
102
106
  export async function experimentalIndexCachePath(options) {
103
- const root = await realpath(resolve(options.root));
104
- const cacheRoot = resolve(options.cacheRoot ?? defaultExperimentalIndexCacheRoot());
105
- return join(cacheRoot, `${hash(JSON.stringify({ root, generatedPathGlobs: options.generatedPathGlobs ?? [] })).slice(0, 24)}.json`);
107
+ const root = await realpath(resolve(options.root));
108
+ const cacheRoot = resolve(options.cacheRoot ?? defaultExperimentalIndexCacheRoot());
109
+ return join(
110
+ cacheRoot,
111
+ `${hash(JSON.stringify({ root, generatedPathGlobs: options.generatedPathGlobs ?? [] })).slice(0, 24)}.json`,
112
+ );
106
113
  }
107
114
  export async function buildOrLoadExperimentalRepoIndex(options) {
108
- const startedAt = performance.now();
109
- const root = await realpath(resolve(options.root));
110
- const cacheOptions = { root };
111
- if (options.cacheRoot !== undefined) {
112
- cacheOptions.cacheRoot = options.cacheRoot;
113
- }
114
- if (options.generatedPathGlobs !== undefined) {
115
- cacheOptions.generatedPathGlobs = options.generatedPathGlobs;
116
- }
117
- const cachePath = await experimentalIndexCachePath(cacheOptions);
118
- const scannedFiles = await scanRepoTextFiles(root, options.generatedPathGlobs ?? []);
119
- const cachedIndex = await readCachedIndex(cachePath, root);
120
- if (cachedIndex && manifestMatches(cachedIndex, scannedFiles)) {
121
- return {
122
- mode: "warm-loaded",
123
- index: cachedIndex,
124
- cachePath,
125
- buildMs: performance.now() - startedAt,
126
- };
127
- }
128
- const index = buildIndexFromScannedFiles(root, cachePath, scannedFiles);
129
- await writeIndex(cachePath, index);
115
+ const startedAt = performance.now();
116
+ const root = await realpath(resolve(options.root));
117
+ const cacheOptions = { root };
118
+ if (options.cacheRoot !== undefined) {
119
+ cacheOptions.cacheRoot = options.cacheRoot;
120
+ }
121
+ if (options.generatedPathGlobs !== undefined) {
122
+ cacheOptions.generatedPathGlobs = options.generatedPathGlobs;
123
+ }
124
+ const cachePath = await experimentalIndexCachePath(cacheOptions);
125
+ const scannedFiles = await scanRepoTextFiles(root, options.generatedPathGlobs ?? []);
126
+ const cachedIndex = await readCachedIndex(cachePath, root);
127
+ if (cachedIndex && manifestMatches(cachedIndex, scannedFiles)) {
130
128
  return {
131
- mode: cachedIndex ? "stale-refreshed" : "cold-built",
132
- index,
133
- cachePath,
134
- buildMs: performance.now() - startedAt,
135
- ...(cachedIndex ? { refreshReason: staleReason(cachedIndex, scannedFiles) } : {}),
129
+ mode: "warm-loaded",
130
+ index: cachedIndex,
131
+ cachePath,
132
+ buildMs: performance.now() - startedAt,
136
133
  };
134
+ }
135
+ const index = buildIndexFromScannedFiles(root, cachePath, scannedFiles);
136
+ await writeIndex(cachePath, index);
137
+ return {
138
+ mode: cachedIndex ? "stale-refreshed" : "cold-built",
139
+ index,
140
+ cachePath,
141
+ buildMs: performance.now() - startedAt,
142
+ ...(cachedIndex ? { refreshReason: staleReason(cachedIndex, scannedFiles) } : {}),
143
+ };
137
144
  }
138
145
  export function queryExperimentalRepoIndex(index, query, options = {}) {
139
- const requestedTopK = options.topK ?? DEFAULT_TOP_K;
140
- const topK = Number.isFinite(requestedTopK)
141
- ? Math.min(MAX_TOP_K, Math.max(1, Math.floor(requestedTopK)))
142
- : DEFAULT_TOP_K;
143
- const queryTokens = uniqueTokens(tokenize(query));
144
- if (queryTokens.length === 0) {
145
- return [];
146
- }
147
- const normalizedQueryPhrase = normalizeTokenSequence(query);
148
- const stats = {
149
- averageLength: index.averageChunkTokens || 1,
150
- documentFrequency: new Map(Object.entries(index.tokenDocumentFrequency)),
151
- chunkCount: index.chunks.length,
152
- };
153
- const scored = [];
154
- for (const chunk of index.chunks) {
155
- const candidate = scoreIndexedChunk(index, chunk, queryTokens, normalizedQueryPhrase, stats);
156
- if (candidate) {
157
- scored.push(candidate);
158
- }
159
- }
160
- scored.sort((a, b) => b.score - a.score);
161
- const selected = [];
162
- const seen = new Set();
163
- for (const candidate of scored) {
164
- if (seen.has(candidate.path)) {
165
- continue;
166
- }
167
- seen.add(candidate.path);
168
- selected.push(candidate);
169
- if (selected.length >= topK) {
170
- break;
171
- }
172
- }
173
- return selected;
146
+ const requestedTopK = options.topK ?? DEFAULT_TOP_K;
147
+ const topK = Number.isFinite(requestedTopK)
148
+ ? Math.min(MAX_TOP_K, Math.max(1, Math.floor(requestedTopK)))
149
+ : DEFAULT_TOP_K;
150
+ const queryTokens = uniqueTokens(tokenize(query));
151
+ if (queryTokens.length === 0) {
152
+ return [];
153
+ }
154
+ const normalizedQueryPhrase = normalizeTokenSequence(query);
155
+ const stats = {
156
+ averageLength: index.averageChunkTokens || 1,
157
+ documentFrequency: new Map(Object.entries(index.tokenDocumentFrequency)),
158
+ chunkCount: index.chunks.length,
159
+ };
160
+ const scored = [];
161
+ for (const chunk of index.chunks) {
162
+ const candidate = scoreIndexedChunk(index, chunk, queryTokens, normalizedQueryPhrase, stats);
163
+ if (candidate) {
164
+ scored.push(candidate);
165
+ }
166
+ }
167
+ scored.sort((a, b) => b.score - a.score);
168
+ const selected = [];
169
+ const seen = new Set();
170
+ for (const candidate of scored) {
171
+ if (seen.has(candidate.path)) {
172
+ continue;
173
+ }
174
+ seen.add(candidate.path);
175
+ selected.push(candidate);
176
+ if (selected.length >= topK) {
177
+ break;
178
+ }
179
+ }
180
+ return selected;
174
181
  }
175
182
  async function readCachedIndex(cachePath, root) {
176
- try {
177
- const parsed = JSON.parse(await readFile(cachePath, "utf8"));
178
- if (parsed.version !== INDEX_VERSION || parsed.root !== root || !parsed.files || !Array.isArray(parsed.chunks)) {
179
- return null;
180
- }
181
- return parsed;
182
- }
183
- catch {
184
- return null;
183
+ try {
184
+ const parsed = JSON.parse(await readFile(cachePath, "utf8"));
185
+ if (parsed.version !== INDEX_VERSION || parsed.root !== root || !parsed.files || !Array.isArray(parsed.chunks)) {
186
+ return null;
185
187
  }
188
+ return parsed;
189
+ } catch {
190
+ return null;
191
+ }
186
192
  }
187
193
  async function writeIndex(cachePath, index) {
188
- await mkdir(dirname(cachePath), { recursive: true });
189
- await writeFile(cachePath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
194
+ await mkdir(dirname(cachePath), { recursive: true });
195
+ await writeFile(cachePath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
190
196
  }
191
197
  function manifestMatches(index, scannedFiles) {
192
- const indexedPaths = Object.keys(index.files).sort();
193
- const scannedPaths = scannedFiles.map((file) => file.path).sort();
194
- if (indexedPaths.length !== scannedPaths.length) {
195
- return false;
196
- }
197
- for (let indexPath = 0; indexPath < scannedPaths.length; indexPath += 1) {
198
- if (indexedPaths[indexPath] !== scannedPaths[indexPath]) {
199
- return false;
200
- }
198
+ const indexedPaths = Object.keys(index.files).sort();
199
+ const scannedPaths = scannedFiles.map((file) => file.path).sort();
200
+ if (indexedPaths.length !== scannedPaths.length) {
201
+ return false;
202
+ }
203
+ for (let indexPath = 0; indexPath < scannedPaths.length; indexPath += 1) {
204
+ if (indexedPaths[indexPath] !== scannedPaths[indexPath]) {
205
+ return false;
201
206
  }
202
- return scannedFiles.every((file) => index.files[file.path]?.hashSha256 === file.hashSha256);
207
+ }
208
+ return scannedFiles.every((file) => index.files[file.path]?.hashSha256 === file.hashSha256);
203
209
  }
204
210
  function staleReason(index, scannedFiles) {
205
- const indexedPaths = new Set(Object.keys(index.files));
206
- const scannedPaths = new Set(scannedFiles.map((file) => file.path));
207
- const added = [...scannedPaths].filter((path) => !indexedPaths.has(path));
208
- const removed = [...indexedPaths].filter((path) => !scannedPaths.has(path));
209
- const changed = scannedFiles
210
- .filter((file) => indexedPaths.has(file.path) && index.files[file.path]?.hashSha256 !== file.hashSha256)
211
- .map((file) => file.path);
212
- const parts = [];
213
- if (added.length) {
214
- parts.push(`${added.length} added`);
215
- }
216
- if (removed.length) {
217
- parts.push(`${removed.length} removed`);
218
- }
219
- if (changed.length) {
220
- parts.push(`${changed.length} changed`);
221
- }
222
- return parts.length ? parts.join(", ") : "cache metadata changed";
211
+ const indexedPaths = new Set(Object.keys(index.files));
212
+ const scannedPaths = new Set(scannedFiles.map((file) => file.path));
213
+ const added = [...scannedPaths].filter((path) => !indexedPaths.has(path));
214
+ const removed = [...indexedPaths].filter((path) => !scannedPaths.has(path));
215
+ const changed = scannedFiles
216
+ .filter((file) => indexedPaths.has(file.path) && index.files[file.path]?.hashSha256 !== file.hashSha256)
217
+ .map((file) => file.path);
218
+ const parts = [];
219
+ if (added.length) {
220
+ parts.push(`${added.length} added`);
221
+ }
222
+ if (removed.length) {
223
+ parts.push(`${removed.length} removed`);
224
+ }
225
+ if (changed.length) {
226
+ parts.push(`${changed.length} changed`);
227
+ }
228
+ return parts.length ? parts.join(", ") : "cache metadata changed";
223
229
  }
224
230
  function buildIndexFromScannedFiles(root, cachePath, scannedFiles) {
225
- const chunks = [];
226
- const files = {};
227
- for (const file of scannedFiles) {
228
- const fileChunks = candidateChunksForFile(file);
229
- const chunkIds = [];
230
- for (const chunk of fileChunks) {
231
- const tokens = tokenize(chunk.text);
232
- const indexedChunk = {
233
- id: chunks.length,
234
- path: file.path,
235
- startLine: chunk.range.start,
236
- endLine: chunk.range.end,
237
- kind: chunk.kind,
238
- text: chunk.text,
239
- tokens,
240
- tokenCounts: Object.fromEntries(tokenCountMap(tokens)),
241
- };
242
- if (chunk.heading !== undefined) {
243
- indexedChunk.heading = chunk.heading;
244
- }
245
- chunks.push(indexedChunk);
246
- chunkIds.push(indexedChunk.id);
247
- }
248
- files[file.path] = {
249
- path: file.path,
250
- hashSha256: file.hashSha256,
251
- sizeBytes: file.sizeBytes,
252
- lineCount: file.lines.length,
253
- chunkIds,
254
- };
255
- }
256
- const tokenDocumentFrequency = {};
257
- let totalTokens = 0;
258
- for (const chunk of chunks) {
259
- totalTokens += Math.max(1, chunk.tokens.length);
260
- for (const token of uniqueTokens(chunk.tokens)) {
261
- tokenDocumentFrequency[token] = (tokenDocumentFrequency[token] ?? 0) + 1;
262
- }
263
- }
264
- return {
265
- version: INDEX_VERSION,
266
- root,
267
- builtAt: new Date().toISOString(),
268
- files,
269
- chunks,
270
- tokenDocumentFrequency,
271
- averageChunkTokens: chunks.length ? totalTokens / chunks.length : 1,
272
- cachePath,
231
+ const chunks = [];
232
+ const files = {};
233
+ for (const file of scannedFiles) {
234
+ const fileChunks = candidateChunksForFile(file);
235
+ const chunkIds = [];
236
+ for (const chunk of fileChunks) {
237
+ const tokens = tokenize(chunk.text);
238
+ const indexedChunk = {
239
+ id: chunks.length,
240
+ path: file.path,
241
+ startLine: chunk.range.start,
242
+ endLine: chunk.range.end,
243
+ kind: chunk.kind,
244
+ text: chunk.text,
245
+ tokens,
246
+ tokenCounts: Object.fromEntries(tokenCountMap(tokens)),
247
+ };
248
+ if (chunk.heading !== undefined) {
249
+ indexedChunk.heading = chunk.heading;
250
+ }
251
+ chunks.push(indexedChunk);
252
+ chunkIds.push(indexedChunk.id);
253
+ }
254
+ files[file.path] = {
255
+ path: file.path,
256
+ hashSha256: file.hashSha256,
257
+ sizeBytes: file.sizeBytes,
258
+ lineCount: file.lines.length,
259
+ chunkIds,
273
260
  };
261
+ }
262
+ const tokenDocumentFrequency = {};
263
+ let totalTokens = 0;
264
+ for (const chunk of chunks) {
265
+ totalTokens += Math.max(1, chunk.tokens.length);
266
+ for (const token of uniqueTokens(chunk.tokens)) {
267
+ tokenDocumentFrequency[token] = (tokenDocumentFrequency[token] ?? 0) + 1;
268
+ }
269
+ }
270
+ return {
271
+ version: INDEX_VERSION,
272
+ root,
273
+ builtAt: new Date().toISOString(),
274
+ files,
275
+ chunks,
276
+ tokenDocumentFrequency,
277
+ averageChunkTokens: chunks.length ? totalTokens / chunks.length : 1,
278
+ cachePath,
279
+ };
274
280
  }
275
281
  async function scanRepoTextFiles(root, generatedPathGlobs = []) {
276
- const files = [];
277
- const visitedDirectories = new Set();
278
- await collectTextFiles(root, root, files, visitedDirectories, generatedPathGlobs);
279
- return files.sort((a, b) => a.path.localeCompare(b.path));
282
+ const files = [];
283
+ const visitedDirectories = new Set();
284
+ await collectTextFiles(root, root, files, visitedDirectories, generatedPathGlobs);
285
+ return files.sort((a, b) => a.path.localeCompare(b.path));
280
286
  }
281
287
  async function collectTextFiles(root, currentPath, files, visitedDirectories, generatedPathGlobs = []) {
282
- let currentRealPath;
283
- try {
284
- currentRealPath = await realpath(currentPath);
285
- }
286
- catch {
287
- return;
288
- }
289
- if (!isPathInsideRoot(root, currentRealPath)) {
290
- return;
291
- }
292
- let currentStat;
293
- try {
294
- currentStat = await stat(currentRealPath);
295
- }
296
- catch {
297
- return;
298
- }
299
- const relativePath = normalizeRelativePath(relative(root, currentRealPath));
300
- if (currentStat.isDirectory()) {
301
- if (visitedDirectories.has(currentRealPath)) {
302
- return;
303
- }
304
- visitedDirectories.add(currentRealPath);
305
- if (relativePath !== "" && (shouldSkipBroadDirectory(currentRealPath) || matchesGeneratedPathHint(relativePath, generatedPathGlobs))) {
306
- return;
307
- }
308
- const entries = await readdir(currentRealPath, { withFileTypes: true });
309
- for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
310
- await collectTextFiles(root, resolve(currentRealPath, entry.name), files, visitedDirectories, generatedPathGlobs);
311
- }
312
- return;
313
- }
314
- if (!currentStat.isFile()) {
315
- return;
316
- }
317
- if (shouldSkipBroadFile(relativePath, currentStat.size) || matchesGeneratedPathHint(relativePath, generatedPathGlobs)) {
318
- return;
319
- }
320
- const text = await readFile(currentRealPath, "utf8");
321
- if (text.includes("\0")) {
322
- return;
323
- }
324
- files.push({
325
- path: relativePath,
326
- absolutePath: currentRealPath,
327
- text,
328
- lines: splitLines(text),
329
- hashSha256: hash(text),
330
- sizeBytes: byteLength(text),
331
- });
288
+ let currentRealPath;
289
+ try {
290
+ currentRealPath = await realpath(currentPath);
291
+ } catch {
292
+ return;
293
+ }
294
+ if (!isPathInsideRoot(root, currentRealPath)) {
295
+ return;
296
+ }
297
+ let currentStat;
298
+ try {
299
+ currentStat = await stat(currentRealPath);
300
+ } catch {
301
+ return;
302
+ }
303
+ const relativePath = normalizeRelativePath(relative(root, currentRealPath));
304
+ if (currentStat.isDirectory()) {
305
+ if (visitedDirectories.has(currentRealPath)) {
306
+ return;
307
+ }
308
+ visitedDirectories.add(currentRealPath);
309
+ if (
310
+ relativePath !== "" &&
311
+ (shouldSkipBroadDirectory(currentRealPath) || matchesGeneratedPathHint(relativePath, generatedPathGlobs))
312
+ ) {
313
+ return;
314
+ }
315
+ const entries = await readdir(currentRealPath, { withFileTypes: true });
316
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
317
+ await collectTextFiles(root, resolve(currentRealPath, entry.name), files, visitedDirectories, generatedPathGlobs);
318
+ }
319
+ return;
320
+ }
321
+ if (!currentStat.isFile()) {
322
+ return;
323
+ }
324
+ if (
325
+ shouldSkipBroadFile(relativePath, currentStat.size) ||
326
+ matchesGeneratedPathHint(relativePath, generatedPathGlobs)
327
+ ) {
328
+ return;
329
+ }
330
+ const text = await readFile(currentRealPath, "utf8");
331
+ if (text.includes("\0")) {
332
+ return;
333
+ }
334
+ files.push({
335
+ path: relativePath,
336
+ absolutePath: currentRealPath,
337
+ text,
338
+ lines: splitLines(text),
339
+ hashSha256: hash(text),
340
+ sizeBytes: byteLength(text),
341
+ });
332
342
  }
333
343
  function candidateChunksForFile(file) {
334
- const chunks = [...markdownSectionChunks(file), ...lineWindowChunks(file)];
335
- return chunks.length ? chunks : lineWindowChunks(file);
344
+ const chunks = [...markdownSectionChunks(file), ...lineWindowChunks(file)];
345
+ return chunks.length ? chunks : lineWindowChunks(file);
336
346
  }
337
347
  function markdownSectionChunks(file) {
338
- const headingIndexes = file.lines
339
- .map((line, index) => ({ line, index }))
340
- .filter(({ line }) => line.trimStart().startsWith("#"));
341
- if (!headingIndexes.length) {
342
- return [];
343
- }
344
- return headingIndexes.map(({ line, index }, headingOrdinal) => {
345
- const nextHeading = headingIndexes[headingOrdinal + 1]?.index ?? file.lines.length;
346
- const range = { start: index + 1, end: Math.max(index + 1, nextHeading) };
347
- return {
348
- range,
349
- text: file.lines.slice(range.start - 1, range.end).join("\n"),
350
- heading: line,
351
- kind: "section",
352
- };
353
- });
348
+ const headingIndexes = file.lines
349
+ .map((line, index) => ({ line, index }))
350
+ .filter(({ line }) => line.trimStart().startsWith("#"));
351
+ if (!headingIndexes.length) {
352
+ return [];
353
+ }
354
+ return headingIndexes.map(({ line, index }, headingOrdinal) => {
355
+ const nextHeading = headingIndexes[headingOrdinal + 1]?.index ?? file.lines.length;
356
+ const range = { start: index + 1, end: Math.max(index + 1, nextHeading) };
357
+ return {
358
+ range,
359
+ text: file.lines.slice(range.start - 1, range.end).join("\n"),
360
+ heading: line,
361
+ kind: "section",
362
+ };
363
+ });
354
364
  }
355
365
  function lineWindowChunks(file) {
356
- return file.lines.map((_, lineIndex) => {
357
- const start = Math.max(0, lineIndex - DEFAULT_CONTEXT_LINES);
358
- const end = Math.min(file.lines.length - 1, lineIndex + DEFAULT_CONTEXT_LINES);
359
- return {
360
- range: { start: start + 1, end: end + 1 },
361
- text: file.lines.slice(start, end + 1).join("\n"),
362
- kind: "window",
363
- };
364
- });
365
- }
366
- function scoreIndexedChunk(index, chunk, queryTokens, normalizedQueryPhrase, stats) {
367
- const tokenCounts = new Map(Object.entries(chunk.tokenCounts));
368
- const matchingTokens = queryTokens.filter((token) => (tokenCounts.get(token) ?? 0) > 0);
369
- const pathScore = scoreText(chunk.path, queryTokens);
370
- if (!matchingTokens.length && pathScore <= 0) {
371
- return null;
372
- }
373
- const exactPhrase = hasExactNormalizedPhrase(chunk.text, normalizedQueryPhrase);
374
- const chunkLength = Math.max(1, chunk.tokens.length);
375
- const score = (exactPhrase ? 100_000 : 0) +
376
- bm25Score(queryTokens, tokenCounts, chunkLength, stats) * 10 +
377
- coverageRatio(matchingTokens, queryTokens) * 25 +
378
- headingCoverageBoost(chunk.heading ?? "", queryTokens) +
379
- identifierBoost(chunk.text, queryTokens) +
380
- pathScore -
381
- Math.log1p(chunkLength) * 10;
382
- const file = index.files[chunk.path];
383
- if (!file) {
384
- return null;
385
- }
386
- const lines = `${chunk.startLine}-${chunk.endLine}`;
387
- const excerpt = boundedExcerpt(chunk.text);
366
+ return file.lines.map((_, lineIndex) => {
367
+ const start = Math.max(0, lineIndex - DEFAULT_CONTEXT_LINES);
368
+ const end = Math.min(file.lines.length - 1, lineIndex + DEFAULT_CONTEXT_LINES);
388
369
  return {
389
- path: chunk.path,
390
- lines,
391
- excerpt,
392
- score,
393
- reason: exactPhrase
394
- ? `matched exact normalized query phrase in indexed ${chunk.kind} chunk`
395
- : `BM25-style indexed ${chunk.kind} chunk with ${matchingTokens.length}/${queryTokens.length} query-token coverage`,
396
- chunkKind: chunk.kind,
397
- hashSha256: file.hashSha256,
398
- contextBytes: byteLength(excerpt),
370
+ range: { start: start + 1, end: end + 1 },
371
+ text: file.lines.slice(start, end + 1).join("\n"),
372
+ kind: "window",
399
373
  };
374
+ });
375
+ }
376
+ function scoreIndexedChunk(index, chunk, queryTokens, normalizedQueryPhrase, stats) {
377
+ const tokenCounts = new Map(Object.entries(chunk.tokenCounts));
378
+ const matchingTokens = queryTokens.filter((token) => (tokenCounts.get(token) ?? 0) > 0);
379
+ const pathScore = scoreText(chunk.path, queryTokens);
380
+ if (!matchingTokens.length && pathScore <= 0) {
381
+ return null;
382
+ }
383
+ const exactPhrase = hasExactNormalizedPhrase(chunk.text, normalizedQueryPhrase);
384
+ const chunkLength = Math.max(1, chunk.tokens.length);
385
+ const score =
386
+ (exactPhrase ? 100_000 : 0) +
387
+ bm25Score(queryTokens, tokenCounts, chunkLength, stats) * 10 +
388
+ coverageRatio(matchingTokens, queryTokens) * 25 +
389
+ headingCoverageBoost(chunk.heading ?? "", queryTokens) +
390
+ identifierBoost(chunk.text, queryTokens) +
391
+ pathScore -
392
+ Math.log1p(chunkLength) * 10;
393
+ const file = index.files[chunk.path];
394
+ if (!file) {
395
+ return null;
396
+ }
397
+ const lines = `${chunk.startLine}-${chunk.endLine}`;
398
+ const excerpt = boundedExcerpt(chunk.text);
399
+ return {
400
+ path: chunk.path,
401
+ lines,
402
+ excerpt,
403
+ score,
404
+ reason: exactPhrase
405
+ ? `matched exact normalized query phrase in indexed ${chunk.kind} chunk`
406
+ : `BM25-style indexed ${chunk.kind} chunk with ${matchingTokens.length}/${queryTokens.length} query-token coverage`,
407
+ chunkKind: chunk.kind,
408
+ hashSha256: file.hashSha256,
409
+ contextBytes: byteLength(excerpt),
410
+ };
400
411
  }
401
412
  function bm25Score(queryTokens, tokenCounts, chunkLength, stats) {
402
- const k1 = 1.2;
403
- const b = 0.75;
404
- return queryTokens.reduce((score, token) => {
405
- const termFrequency = tokenCounts.get(token) ?? 0;
406
- if (termFrequency <= 0) {
407
- return score;
408
- }
409
- const documentFrequency = stats.documentFrequency.get(token) ?? 0;
410
- const idf = Math.log(1 + (stats.chunkCount - documentFrequency + 0.5) / (documentFrequency + 0.5));
411
- const normalizedLength = k1 * (1 - b + b * (chunkLength / Math.max(1, stats.averageLength)));
412
- const saturatedFrequency = (termFrequency * (k1 + 1)) / (termFrequency + normalizedLength);
413
- return score + idf * saturatedFrequency;
414
- }, 0);
413
+ const k1 = 1.2;
414
+ const b = 0.75;
415
+ return queryTokens.reduce((score, token) => {
416
+ const termFrequency = tokenCounts.get(token) ?? 0;
417
+ if (termFrequency <= 0) {
418
+ return score;
419
+ }
420
+ const documentFrequency = stats.documentFrequency.get(token) ?? 0;
421
+ const idf = Math.log(1 + (stats.chunkCount - documentFrequency + 0.5) / (documentFrequency + 0.5));
422
+ const normalizedLength = k1 * (1 - b + b * (chunkLength / Math.max(1, stats.averageLength)));
423
+ const saturatedFrequency = (termFrequency * (k1 + 1)) / (termFrequency + normalizedLength);
424
+ return score + idf * saturatedFrequency;
425
+ }, 0);
415
426
  }
416
427
  function coverageRatio(matchingTokens, queryTokens) {
417
- return queryTokens.length ? matchingTokens.length / queryTokens.length : 0;
428
+ return queryTokens.length ? matchingTokens.length / queryTokens.length : 0;
418
429
  }
419
430
  function headingCoverageBoost(heading, queryTokens) {
420
- const headingTokens = new Set(tokenize(heading));
421
- return queryTokens.filter((token) => headingTokens.has(token)).length * 4;
431
+ const headingTokens = new Set(tokenize(heading));
432
+ return queryTokens.filter((token) => headingTokens.has(token)).length * 4;
422
433
  }
423
434
  function identifierBoost(text, queryTokens) {
424
- const identifiers = Array.from(text.matchAll(/`([^`]+)`/g), (match) => tokenize(match[1] ?? "")).flat();
425
- if (!identifiers.length) {
426
- return 0;
427
- }
428
- const identifierSet = new Set(identifiers);
429
- return queryTokens.filter((token) => identifierSet.has(token)).length * 6;
435
+ const identifiers = Array.from(text.matchAll(/`([^`]+)`/g), (match) => tokenize(match[1] ?? "")).flat();
436
+ if (!identifiers.length) {
437
+ return 0;
438
+ }
439
+ const identifierSet = new Set(identifiers);
440
+ return queryTokens.filter((token) => identifierSet.has(token)).length * 6;
430
441
  }
431
442
  function scoreText(text, tokens) {
432
- const lower = text.toLowerCase();
433
- return tokens.reduce((score, token) => score + countOccurrences(lower, token), 0);
443
+ const lower = text.toLowerCase();
444
+ return tokens.reduce((score, token) => score + countOccurrences(lower, token), 0);
434
445
  }
435
446
  function countOccurrences(text, token) {
436
- let count = 0;
437
- let index = text.indexOf(token);
438
- while (index !== -1) {
439
- count += 1;
440
- index = text.indexOf(token, index + token.length);
441
- }
442
- return count;
447
+ let count = 0;
448
+ let index = text.indexOf(token);
449
+ while (index !== -1) {
450
+ count += 1;
451
+ index = text.indexOf(token, index + token.length);
452
+ }
453
+ return count;
443
454
  }
444
455
  function normalizeTokenSequence(text) {
445
- const tokens = tokenize(text);
446
- return tokens.length >= 2 ? tokens.join(" ") : "";
456
+ const tokens = tokenize(text);
457
+ return tokens.length >= 2 ? tokens.join(" ") : "";
447
458
  }
448
459
  function hasExactNormalizedPhrase(text, normalizedQueryPhrase) {
449
- return normalizedQueryPhrase !== "" && normalizeTokenSequence(text).includes(normalizedQueryPhrase);
460
+ return normalizedQueryPhrase !== "" && normalizeTokenSequence(text).includes(normalizedQueryPhrase);
450
461
  }
451
462
  function tokenize(query) {
452
- return query
453
- .toLowerCase()
454
- .split(/[^a-z0-9_./-]+/)
455
- .map((token) => token.trim())
456
- .filter((token) => token.length >= 2 && !STOPWORDS.has(token));
463
+ return query
464
+ .toLowerCase()
465
+ .split(/[^a-z0-9_./-]+/)
466
+ .map((token) => token.trim())
467
+ .filter((token) => token.length >= 2 && !STOPWORDS.has(token));
457
468
  }
458
469
  function tokenCountMap(tokens) {
459
- const counts = new Map();
460
- for (const token of tokens) {
461
- counts.set(token, (counts.get(token) ?? 0) + 1);
462
- }
463
- return counts;
470
+ const counts = new Map();
471
+ for (const token of tokens) {
472
+ counts.set(token, (counts.get(token) ?? 0) + 1);
473
+ }
474
+ return counts;
464
475
  }
465
476
  function uniqueTokens(tokens) {
466
- return Array.from(new Set(tokens));
477
+ return Array.from(new Set(tokens));
467
478
  }
468
479
  function boundedExcerpt(text) {
469
- const previewedLines = splitLines(text).map((line) => truncateToUtf8Bytes(line, LINE_PREVIEW_MAX_BYTES));
470
- return truncateToUtf8Bytes(previewedLines.join("\n"), QUERY_EXCERPT_MAX_BYTES);
480
+ const previewedLines = splitLines(text).map((line) => truncateToUtf8Bytes(line, LINE_PREVIEW_MAX_BYTES));
481
+ return truncateToUtf8Bytes(previewedLines.join("\n"), QUERY_EXCERPT_MAX_BYTES);
471
482
  }
472
483
  function shouldSkipBroadDirectory(path) {
473
- const name = path.split(/[\\/]+/).at(-1) ?? path;
474
- return SKIP_DIRS.has(name);
484
+ const name = path.split(/[\\/]+/).at(-1) ?? path;
485
+ return SKIP_DIRS.has(name);
475
486
  }
476
487
  function matchesGeneratedPathHint(path, hints) {
477
- if (hints.length === 0) {
478
- return false;
479
- }
480
- const normalizedPath = normalizeRelativePath(path);
481
- return hints.some((hint) => matchesSimpleGlob(normalizedPath, hint));
488
+ if (hints.length === 0) {
489
+ return false;
490
+ }
491
+ const normalizedPath = normalizeRelativePath(path);
492
+ return hints.some((hint) => matchesSimpleGlob(normalizedPath, hint));
482
493
  }
483
494
  function matchesSimpleGlob(path, pattern) {
484
- if (!pattern) {
485
- return false;
486
- }
487
- const normalizedPattern = normalizeRelativePath(pattern);
488
- if (normalizedPattern.endsWith("/**")) {
489
- const prefix = normalizedPattern.slice(0, -3);
490
- return path === prefix || path.startsWith(`${prefix}/`);
491
- }
492
- const escaped = normalizedPattern
493
- .replace(/[.+^${}()|[\]\\]/g, "\\$&")
494
- .replace(/\*\*/g, ".*")
495
- .replace(/\*/g, "[^/]*");
496
- return new RegExp(`^${escaped}$`).test(path);
495
+ if (!pattern) {
496
+ return false;
497
+ }
498
+ const normalizedPattern = normalizeRelativePath(pattern);
499
+ if (normalizedPattern.endsWith("/**")) {
500
+ const prefix = normalizedPattern.slice(0, -3);
501
+ return path === prefix || path.startsWith(`${prefix}/`);
502
+ }
503
+ const escaped = normalizedPattern
504
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
505
+ .replace(/\*\*/g, ".*")
506
+ .replace(/\*/g, "[^/]*");
507
+ return new RegExp(`^${escaped}$`).test(path);
497
508
  }
498
509
  function shouldSkipBroadFile(path, size) {
499
- const name = path.split("/").at(-1)?.toLowerCase() ?? path.toLowerCase();
500
- if (isLockfile(name)) {
501
- return false;
502
- }
503
- if (hasBroadSkippedFileExtension(name)) {
504
- return true;
505
- }
506
- if (size > BROAD_SCAN_MAX_FILE_BYTES) {
507
- return true;
508
- }
509
- if (name.endsWith(".min.js") || name.endsWith(".min.css") || name.endsWith(".map")) {
510
- return true;
511
- }
512
- if (name.includes(".bundle.") || name.endsWith(".log")) {
513
- return true;
514
- }
515
- if ((name.endsWith(".html") || name.endsWith(".json")) && size > 64_000) {
516
- return true;
517
- }
510
+ const name = path.split("/").at(-1)?.toLowerCase() ?? path.toLowerCase();
511
+ if (isLockfile(name)) {
518
512
  return false;
513
+ }
514
+ if (hasBroadSkippedFileExtension(name)) {
515
+ return true;
516
+ }
517
+ if (size > BROAD_SCAN_MAX_FILE_BYTES) {
518
+ return true;
519
+ }
520
+ if (name.endsWith(".min.js") || name.endsWith(".min.css") || name.endsWith(".map")) {
521
+ return true;
522
+ }
523
+ if (name.includes(".bundle.") || name.endsWith(".log")) {
524
+ return true;
525
+ }
526
+ if ((name.endsWith(".html") || name.endsWith(".json")) && size > 64_000) {
527
+ return true;
528
+ }
529
+ return false;
519
530
  }
520
531
  function hasBroadSkippedFileExtension(name) {
521
- for (const extension of BROAD_SKIP_FILE_EXTENSIONS) {
522
- if (name.endsWith(extension)) {
523
- return true;
524
- }
532
+ for (const extension of BROAD_SKIP_FILE_EXTENSIONS) {
533
+ if (name.endsWith(extension)) {
534
+ return true;
525
535
  }
526
- return false;
536
+ }
537
+ return false;
527
538
  }
528
539
  function isLockfile(name) {
529
- return (name === "package-lock.json" ||
530
- name === "npm-shrinkwrap.json" ||
531
- name === "pnpm-lock.yaml" ||
532
- name === "yarn.lock" ||
533
- name === "bun.lockb");
540
+ return (
541
+ name === "package-lock.json" ||
542
+ name === "npm-shrinkwrap.json" ||
543
+ name === "pnpm-lock.yaml" ||
544
+ name === "yarn.lock" ||
545
+ name === "bun.lockb"
546
+ );
534
547
  }
535
548
  function truncateToUtf8Bytes(text, maxBytes) {
536
- if (byteLength(text) <= maxBytes) {
537
- return text;
538
- }
539
- const suffixBytes = byteLength(TRUNCATION_SUFFIX);
540
- const contentBytes = Math.max(0, maxBytes - suffixBytes);
541
- let truncated = Buffer.from(text, "utf8").subarray(0, contentBytes).toString("utf8");
542
- while (byteLength(truncated) > contentBytes) {
543
- truncated = truncated.slice(0, -1);
544
- }
545
- return `${truncated}${TRUNCATION_SUFFIX}`;
549
+ if (byteLength(text) <= maxBytes) {
550
+ return text;
551
+ }
552
+ const suffixBytes = byteLength(TRUNCATION_SUFFIX);
553
+ const contentBytes = Math.max(0, maxBytes - suffixBytes);
554
+ let truncated = Buffer.from(text, "utf8").subarray(0, contentBytes).toString("utf8");
555
+ while (byteLength(truncated) > contentBytes) {
556
+ truncated = truncated.slice(0, -1);
557
+ }
558
+ return `${truncated}${TRUNCATION_SUFFIX}`;
546
559
  }
547
560
  function splitLines(text) {
548
- return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
561
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
549
562
  }
550
563
  function byteLength(text) {
551
- return Buffer.byteLength(text, "utf8");
564
+ return Buffer.byteLength(text, "utf8");
552
565
  }
553
566
  function isPathInsideRoot(root, absolutePath) {
554
- const relativePath = relative(root, absolutePath);
555
- return relativePath === "" || (!relativePath.startsWith("..") && !relativePath.startsWith("/") && !/^[A-Za-z]:/.test(relativePath));
567
+ const relativePath = relative(root, absolutePath);
568
+ return (
569
+ relativePath === "" ||
570
+ (!relativePath.startsWith("..") && !relativePath.startsWith("/") && !/^[A-Za-z]:/.test(relativePath))
571
+ );
556
572
  }
557
573
  function normalizeRelativePath(path) {
558
- return path.split(/[\\/]+/).filter(Boolean).join("/");
574
+ return path
575
+ .split(/[\\/]+/)
576
+ .filter(Boolean)
577
+ .join("/");
559
578
  }
560
579
  function hash(value) {
561
- return createHash("sha256").update(value).digest("hex");
580
+ return createHash("sha256").update(value).digest("hex");
562
581
  }