@hassangameryt/freeflow 0.1.0 → 0.3.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 (630) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +1 -1
  4. package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +1 -1
  5. package/README.md +25 -16
  6. package/assets/freeflow-plugin-icon.png +0 -0
  7. package/{plugins/freeflow/command-surface.json → command-surface.json} +10 -10
  8. package/evals/README.md +32 -0
  9. package/evals/fixtures/copy-conventions.md +31 -0
  10. package/evals/fixtures/output-router/README.md +12 -0
  11. package/evals/fixtures/output-router/failed-command-output.txt +9 -0
  12. package/evals/fixtures/output-router/large-router-manual.md +63 -0
  13. package/evals/fixtures/output-router/native-large-output.txt +40 -0
  14. package/evals/fixtures/output-router/noisy-test-output.txt +30 -0
  15. package/evals/fixtures/output-router/verification-output.txt +8 -0
  16. package/evals/fixtures/tiny-artifact-review-app/README.md +5 -0
  17. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +10 -0
  18. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +21 -0
  19. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +24 -0
  20. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +17 -0
  21. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +8 -0
  22. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +15 -0
  23. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +3 -0
  24. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +5 -0
  25. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +1 -0
  26. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +5 -0
  27. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +14 -0
  28. package/evals/fixtures/tiny-commit-app/README.md +3 -0
  29. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +5 -0
  30. package/evals/fixtures/tiny-commit-app/src/billing.ts +5 -0
  31. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +1 -0
  32. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +5 -0
  33. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +15 -0
  34. package/evals/fixtures/tiny-commit-everything-app/README.md +3 -0
  35. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +5 -0
  36. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +5 -0
  37. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +1 -0
  38. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +5 -0
  39. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +15 -0
  40. package/evals/fixtures/tiny-commit-staged-app/README.md +3 -0
  41. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +5 -0
  42. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +5 -0
  43. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +1 -0
  44. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +5 -0
  45. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +15 -0
  46. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +3 -0
  47. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +3 -0
  48. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +3 -0
  49. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +5 -0
  50. package/evals/fixtures/tiny-dashboard-stale-app/README.md +11 -0
  51. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +13 -0
  52. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +19 -0
  53. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +9 -0
  54. package/evals/fixtures/tiny-decision-destination-app/README.md +6 -0
  55. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +8 -0
  56. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +4 -0
  57. package/evals/fixtures/tiny-design-depth-app/README.md +15 -0
  58. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +25 -0
  59. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +3 -0
  60. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +3 -0
  61. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +3 -0
  62. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +12 -0
  63. package/evals/fixtures/tiny-eval-method-app/README.md +8 -0
  64. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +5 -0
  65. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +17 -0
  66. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +11 -0
  67. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +3 -0
  68. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +10 -0
  69. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +10 -0
  70. package/evals/fixtures/tiny-execute-plan-app/README.md +5 -0
  71. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +5 -0
  72. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +10 -0
  73. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +11 -0
  74. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +12 -0
  75. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +15 -0
  76. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +9 -0
  77. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +9 -0
  78. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +9 -0
  79. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +7 -0
  80. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +1 -0
  81. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +7 -0
  82. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +5 -0
  83. package/evals/fixtures/tiny-execute-review-loop-app/README.md +5 -0
  84. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +9 -0
  85. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +12 -0
  86. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +15 -0
  87. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +11 -0
  88. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +9 -0
  89. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +7 -0
  90. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +1 -0
  91. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +7 -0
  92. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +5 -0
  93. package/evals/fixtures/tiny-flaky-session-app/README.md +10 -0
  94. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +13 -0
  95. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +8 -0
  96. package/evals/fixtures/tiny-handoff-app/README.md +5 -0
  97. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +10 -0
  98. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +8 -0
  99. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +11 -0
  100. package/evals/fixtures/tiny-handoff-app/src/billing.ts +7 -0
  101. package/evals/fixtures/tiny-handoff-report-app/README.md +3 -0
  102. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +1 -0
  103. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +1 -0
  104. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +4 -0
  105. package/evals/fixtures/tiny-plan-app/README.md +5 -0
  106. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +10 -0
  107. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +25 -0
  108. package/evals/fixtures/tiny-plan-app/src/billing.ts +17 -0
  109. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +1 -0
  110. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +8 -0
  111. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +5 -0
  112. package/evals/fixtures/tiny-plan-strict-api-app/README.md +3 -0
  113. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +5 -0
  114. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +25 -0
  115. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +5 -0
  116. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +3 -0
  117. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +8 -0
  118. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +3 -0
  119. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +15 -0
  120. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +16 -0
  121. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +15 -0
  122. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +10 -0
  123. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +15 -0
  124. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +12 -0
  125. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +20 -0
  126. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +1 -0
  127. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +1 -0
  128. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +8 -0
  129. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +8 -0
  130. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +7 -0
  131. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +15 -0
  132. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +16 -0
  133. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +15 -0
  134. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +10 -0
  135. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +15 -0
  136. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +12 -0
  137. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +20 -0
  138. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +1 -0
  139. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +1 -0
  140. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +8 -0
  141. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +8 -0
  142. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +7 -0
  143. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +3 -0
  144. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +15 -0
  145. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +16 -0
  146. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +15 -0
  147. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +10 -0
  148. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +15 -0
  149. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +12 -0
  150. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +20 -0
  151. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +1 -0
  152. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +1 -0
  153. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +8 -0
  154. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +8 -0
  155. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +7 -0
  156. package/evals/fixtures/tiny-report-performance-app/README.md +11 -0
  157. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +10 -0
  158. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +29 -0
  159. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +8 -0
  160. package/evals/fixtures/tiny-review-request-app/README.md +3 -0
  161. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +5 -0
  162. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +19 -0
  163. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +20 -0
  164. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +25 -0
  165. package/evals/fixtures/tiny-review-request-app/src/billing.ts +11 -0
  166. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +19 -0
  167. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +8 -0
  168. package/evals/fixtures/tiny-review-work-app/README.md +5 -0
  169. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +9 -0
  170. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +12 -0
  171. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +15 -0
  172. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +9 -0
  173. package/evals/fixtures/tiny-review-work-app/src/billing.ts +7 -0
  174. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +1 -0
  175. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +7 -0
  176. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +5 -0
  177. package/evals/fixtures/tiny-saas-app/README.md +16 -0
  178. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +15 -0
  179. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +10 -0
  180. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +15 -0
  181. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +13 -0
  182. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +12 -0
  183. package/evals/fixtures/tiny-saas-app/src/billing.ts +20 -0
  184. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +1 -0
  185. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +1 -0
  186. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +8 -0
  187. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +8 -0
  188. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +7 -0
  189. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +6 -0
  190. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +5 -0
  191. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +5 -0
  192. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +6 -0
  193. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +5 -0
  194. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +6 -0
  195. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +6 -0
  196. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +14 -0
  197. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +6 -0
  198. package/evals/fixtures/tiny-skill-dev-app/README.md +10 -0
  199. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +8 -0
  200. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +17 -0
  201. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +13 -0
  202. package/evals/fixtures/tiny-team-app/README.md +5 -0
  203. package/evals/fixtures/tiny-team-app/docs/product.md +6 -0
  204. package/evals/fixtures/tiny-team-app/src/teams.ts +9 -0
  205. package/evals/fixtures/tiny-team-app/src/users.ts +5 -0
  206. package/evals/fixtures/tiny-team-app/tests/teams.test.md +7 -0
  207. package/evals/fixtures/tiny-verify-app/README.md +5 -0
  208. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +1 -0
  209. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +1 -0
  210. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +7 -0
  211. package/evals/prompts/aon-001.txt +2 -0
  212. package/evals/prompts/byp-001.txt +2 -0
  213. package/evals/prompts/byp-002.txt +2 -0
  214. package/evals/prompts/cap-001.txt +3 -0
  215. package/evals/prompts/cap-002.txt +3 -0
  216. package/evals/prompts/cmd-001.txt +3 -0
  217. package/evals/prompts/cmd-002.txt +3 -0
  218. package/evals/prompts/cmd-003.txt +6 -0
  219. package/evals/prompts/cmd-004.txt +5 -0
  220. package/evals/prompts/cmd-005.txt +5 -0
  221. package/evals/prompts/cmd-006.txt +5 -0
  222. package/evals/prompts/cmd-007.txt +5 -0
  223. package/evals/prompts/cmd-008.txt +5 -0
  224. package/evals/prompts/cmd-009.txt +8 -0
  225. package/evals/prompts/cmd-010.txt +5 -0
  226. package/evals/prompts/cmd-011.txt +5 -0
  227. package/evals/prompts/cmd-012.txt +5 -0
  228. package/evals/prompts/cmd-013.txt +5 -0
  229. package/evals/prompts/cmd-014.txt +7 -0
  230. package/evals/prompts/cmd-015.txt +7 -0
  231. package/evals/prompts/cmd-016.txt +5 -0
  232. package/evals/prompts/cmt-001.txt +1 -0
  233. package/evals/prompts/cmt-002.txt +1 -0
  234. package/evals/prompts/cmt-003.txt +1 -0
  235. package/evals/prompts/cmt-004.txt +1 -0
  236. package/evals/prompts/cmt-005.txt +1 -0
  237. package/evals/prompts/dfd-001.txt +3 -0
  238. package/evals/prompts/dia-001.txt +3 -0
  239. package/evals/prompts/dia-002.txt +3 -0
  240. package/evals/prompts/dia-003.txt +3 -0
  241. package/evals/prompts/dis-001.txt +5 -0
  242. package/evals/prompts/dis-002.txt +5 -0
  243. package/evals/prompts/esk-001.txt +5 -0
  244. package/evals/prompts/esk-002.txt +5 -0
  245. package/evals/prompts/esk-003.txt +5 -0
  246. package/evals/prompts/grc-001.txt +3 -0
  247. package/evals/prompts/hof-001.txt +3 -0
  248. package/evals/prompts/hof-002.txt +1 -0
  249. package/evals/prompts/hof-003.txt +1 -0
  250. package/evals/prompts/hof-004.txt +1 -0
  251. package/evals/prompts/hof-005.txt +1 -0
  252. package/evals/prompts/ivg-001.txt +1 -0
  253. package/evals/prompts/ivg-002.txt +11 -0
  254. package/evals/prompts/ivg-003.txt +1 -0
  255. package/evals/prompts/ivg-004.txt +1 -0
  256. package/evals/prompts/mode-001.txt +3 -0
  257. package/evals/prompts/mode-002.txt +1 -0
  258. package/evals/prompts/mode-003.txt +3 -0
  259. package/evals/prompts/mode-004.txt +3 -0
  260. package/evals/prompts/mode-005.txt +3 -0
  261. package/evals/prompts/mode-006.txt +3 -0
  262. package/evals/prompts/mode-007.txt +3 -0
  263. package/evals/prompts/otr-001.txt +3 -0
  264. package/evals/prompts/otr-002.txt +3 -0
  265. package/evals/prompts/rar-001.txt +5 -0
  266. package/evals/prompts/rar-002.txt +3 -0
  267. package/evals/prompts/rar-003.txt +6 -0
  268. package/evals/prompts/rar-004.txt +15 -0
  269. package/evals/prompts/rar-005.txt +10 -0
  270. package/evals/prompts/rbr-001.txt +3 -0
  271. package/evals/prompts/rbr-002.txt +3 -0
  272. package/evals/prompts/rbr-003.txt +7 -0
  273. package/evals/prompts/rev-001.txt +3 -0
  274. package/evals/prompts/rev-002.txt +5 -0
  275. package/evals/prompts/rev-003.txt +6 -0
  276. package/evals/prompts/rev-004.txt +1 -0
  277. package/evals/prompts/rev-005.txt +15 -0
  278. package/evals/prompts/rev-006.txt +5 -0
  279. package/evals/prompts/stp-001.txt +1 -0
  280. package/evals/prompts/stp-002.txt +1 -0
  281. package/evals/prompts/stp-003.txt +1 -0
  282. package/evals/prompts/stp-004.txt +1 -0
  283. package/evals/prompts/stp-005.txt +1 -0
  284. package/evals/prompts/stp-006.txt +1 -0
  285. package/evals/prompts/stp-007.txt +1 -0
  286. package/evals/prompts/stp-008.txt +1 -0
  287. package/evals/prompts/stp-009.txt +1 -0
  288. package/evals/prompts/stp-010.txt +1 -0
  289. package/evals/prompts/stp-011.txt +1 -0
  290. package/evals/prompts/vfy-003.txt +1 -0
  291. package/evals/prompts/wpl-001.txt +3 -0
  292. package/evals/prompts/wpl-002.txt +5 -0
  293. package/evals/prompts/wpl-003.txt +3 -0
  294. package/evals/prompts/wpl-004.txt +5 -0
  295. package/evals/prompts/wpl-005.txt +1 -0
  296. package/evals/prompts/wrc-001.txt +10 -0
  297. package/evals/prompts/wrc-002.txt +3 -0
  298. package/evals/prompts/wsk-001.txt +6 -0
  299. package/evals/prompts/wsp-001.txt +5 -0
  300. package/evals/prompts/wsp-002.txt +15 -0
  301. package/evals/prompts/wsp-003.txt +3 -0
  302. package/evals/prompts/wsp-004.txt +15 -0
  303. package/evals/prompts/wsp-005.txt +5 -0
  304. package/evals/prompts/wsp-006.txt +12 -0
  305. package/evals/prompts/wsp-007.txt +9 -0
  306. package/evals/prompts/wsp-008.txt +13 -0
  307. package/evals/prompts/xpl-001.txt +1 -0
  308. package/evals/prompts/xpl-002.txt +3 -0
  309. package/evals/prompts/xpl-003.txt +3 -0
  310. package/evals/prompts/xpl-004.txt +3 -0
  311. package/evals/prompts/xpl-005.txt +5 -0
  312. package/evals/prompts/xpl-006.txt +3 -0
  313. package/evals/registries/adversarial-evals.json +39 -0
  314. package/evals/registries/fixture-evals.json +2513 -0
  315. package/evals/registries/handoff-evals.json +74 -0
  316. package/evals/registries/legacy-evals.json +147 -0
  317. package/evals/registries/skill-evidence.json +193 -0
  318. package/evals/registries/verify-work-evals.json +46 -0
  319. package/evals/reports/acceptance/v0.1-acceptance-report.md +130 -0
  320. package/evals/reports/by-command-surface/command-surface-1-report.md +45 -0
  321. package/evals/reports/by-command-surface/command-surface-10-report.md +76 -0
  322. package/evals/reports/by-command-surface/command-surface-11-report.md +77 -0
  323. package/evals/reports/by-command-surface/command-surface-12-report.md +91 -0
  324. package/evals/reports/by-command-surface/command-surface-13-report.md +64 -0
  325. package/evals/reports/by-command-surface/command-surface-14-report.md +66 -0
  326. package/evals/reports/by-command-surface/command-surface-15-report.md +124 -0
  327. package/evals/reports/by-command-surface/command-surface-16-report.md +39 -0
  328. package/evals/reports/by-command-surface/command-surface-2-report.md +80 -0
  329. package/evals/reports/by-command-surface/command-surface-3-report.md +86 -0
  330. package/evals/reports/by-command-surface/command-surface-4-report.md +76 -0
  331. package/evals/reports/by-command-surface/command-surface-5-report.md +80 -0
  332. package/evals/reports/by-command-surface/command-surface-6-report.md +74 -0
  333. package/evals/reports/by-command-surface/command-surface-7-report.md +84 -0
  334. package/evals/reports/by-command-surface/command-surface-8-report.md +79 -0
  335. package/evals/reports/by-command-surface/command-surface-9-report.md +79 -0
  336. package/evals/reports/by-command-surface/command-surface-matrix.md +91 -0
  337. package/evals/reports/by-skill/bypass-1-report.md +124 -0
  338. package/evals/reports/by-skill/capture-decisions-1-report.md +99 -0
  339. package/evals/reports/by-skill/capture-decisions-2-report.md +102 -0
  340. package/evals/reports/by-skill/commit-work-1-report.md +165 -0
  341. package/evals/reports/by-skill/commit-work-2-report.md +109 -0
  342. package/evals/reports/by-skill/design-for-depth-1-report.md +95 -0
  343. package/evals/reports/by-skill/diagnose-failure-1-report.md +91 -0
  344. package/evals/reports/by-skill/diagnose-failure-2-report.md +94 -0
  345. package/evals/reports/by-skill/discover-1-report.md +118 -0
  346. package/evals/reports/by-skill/evaluate-skill-2-report.md +71 -0
  347. package/evals/reports/by-skill/execute-plan-1-report.md +103 -0
  348. package/evals/reports/by-skill/execute-plan-2-report.md +112 -0
  349. package/evals/reports/by-skill/execute-plan-3-report.md +87 -0
  350. package/evals/reports/by-skill/grill-context-1-report.md +103 -0
  351. package/evals/reports/by-skill/handoff-1-report.md +123 -0
  352. package/evals/reports/by-skill/handoff-2-report.md +105 -0
  353. package/evals/reports/by-skill/handoff-3-report.md +100 -0
  354. package/evals/reports/by-skill/handoff-7-report.md +77 -0
  355. package/evals/reports/by-skill/interview-gate-1-report.md +63 -0
  356. package/evals/reports/by-skill/interview-gate-2-report.md +105 -0
  357. package/evals/reports/by-skill/mode-contract-1-report.md +74 -0
  358. package/evals/reports/by-skill/mode-contract-2-report.md +87 -0
  359. package/evals/reports/by-skill/mode-contract-3-report.md +65 -0
  360. package/evals/reports/by-skill/mode-contract-4-report.md +71 -0
  361. package/evals/reports/by-skill/mode-contract-5-report.md +70 -0
  362. package/evals/reports/by-skill/output-router-1-report.md +76 -0
  363. package/evals/reports/by-skill/output-router-2-report.md +65 -0
  364. package/evals/reports/by-skill/research-1-report.md +144 -0
  365. package/evals/reports/by-skill/research-brief-1-report.md +94 -0
  366. package/evals/reports/by-skill/research-brief-2-report.md +75 -0
  367. package/evals/reports/by-skill/review-artifact-1-report.md +91 -0
  368. package/evals/reports/by-skill/review-artifact-2-report.md +79 -0
  369. package/evals/reports/by-skill/review-artifact-3-report.md +120 -0
  370. package/evals/reports/by-skill/review-artifact-4-report.md +89 -0
  371. package/evals/reports/by-skill/review-artifact-5-report.md +66 -0
  372. package/evals/reports/by-skill/review-work-1-report.md +85 -0
  373. package/evals/reports/by-skill/review-work-2-report.md +87 -0
  374. package/evals/reports/by-skill/review-work-3-report.md +104 -0
  375. package/evals/reports/by-skill/review-work-4-report.md +108 -0
  376. package/evals/reports/by-skill/review-work-5-report.md +73 -0
  377. package/evals/reports/by-skill/review-work-6-report.md +66 -0
  378. package/evals/reports/by-skill/setup-freeflow-1-report.md +199 -0
  379. package/evals/reports/by-skill/setup-freeflow-2-report.md +105 -0
  380. package/evals/reports/by-skill/setup-freeflow-3-report.md +105 -0
  381. package/evals/reports/by-skill/setup-freeflow-4-report.md +88 -0
  382. package/evals/reports/by-skill/setup-freeflow-5-report.md +115 -0
  383. package/evals/reports/by-skill/skill-authoring-1-report.md +81 -0
  384. package/evals/reports/by-skill/verify-work-1-report.md +111 -0
  385. package/evals/reports/by-skill/verify-work-2-report.md +120 -0
  386. package/evals/reports/by-skill/workflow-1-report.md +65 -0
  387. package/evals/reports/by-skill/write-plan-1-report.md +123 -0
  388. package/evals/reports/by-skill/write-plan-2-report.md +98 -0
  389. package/evals/reports/by-skill/write-plan-3-report.md +110 -0
  390. package/evals/reports/by-skill/write-spec-1-report.md +88 -0
  391. package/evals/reports/by-skill/write-spec-2-report.md +89 -0
  392. package/evals/reports/by-skill/write-spec-3-report.md +90 -0
  393. package/evals/reports/by-skill/write-spec-4-report.md +167 -0
  394. package/evals/reports/harness/claude-harness-1-report.md +103 -0
  395. package/evals/reports/harness/eval-harness-1-report.md +91 -0
  396. package/evals/reports/iterations/iteration-1-report.md +71 -0
  397. package/evals/reports/iterations/iteration-2-report.md +78 -0
  398. package/evals/reports/iterations/iteration-3-report.md +118 -0
  399. package/evals/reports/iterations/iteration-4-report.md +131 -0
  400. package/evals/reports/iterations/iteration-5-report.md +149 -0
  401. package/evals/reports/iterations/iteration-6-report.md +136 -0
  402. package/evals/reports/runtime/always-on-runtime-1-report.md +107 -0
  403. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +52 -0
  404. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +410 -0
  405. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +203 -0
  406. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +51 -0
  407. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +99 -0
  408. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +166 -0
  409. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +96 -0
  410. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +151 -0
  411. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +233 -0
  412. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +215 -0
  413. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +67 -0
  414. package/evals/reports/runtime/output-router-benchmark-1-report.md +81 -0
  415. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +35 -0
  416. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +150 -0
  417. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +46 -0
  418. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +62 -0
  419. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +64 -0
  420. package/evals/reports/runtime/output-router-regression-1-report.md +81 -0
  421. package/evals/reports/runtime/output-router-transform-eval-1-report.md +28 -0
  422. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +44 -0
  423. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +159 -0
  424. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +55 -0
  425. package/evals/reports/runtime/render-format-row-protocol-1-report.md +58 -0
  426. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +84 -0
  427. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +51 -0
  428. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +176 -0
  429. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +39 -0
  430. package/evals/reports/runtime/workflow-context-hook-1-report.md +82 -0
  431. package/evals/runbooks/adversarial-eval-runbook.md +28 -0
  432. package/evals/runbooks/fixture-eval-runbook.md +137 -0
  433. package/evals/runbooks/handoff-eval-runbook.md +22 -0
  434. package/evals/runbooks/verify-work-eval-runbook.md +27 -0
  435. package/evals/scripts/audit-command-surface.sh +160 -0
  436. package/evals/scripts/check-activation-contract.sh +121 -0
  437. package/evals/scripts/check-runtime-context-hook.sh +183 -0
  438. package/evals/scripts/grade-fixture-eval.sh +446 -0
  439. package/evals/scripts/run-claude-fixture-eval.sh +26 -0
  440. package/evals/scripts/run-codex-fixture-eval.sh +26 -0
  441. package/evals/scripts/run-eryx-python-proof-spike.js +559 -0
  442. package/evals/scripts/run-fixture-eval-by-id.sh +23 -0
  443. package/evals/scripts/run-fixture-eval.sh +464 -0
  444. package/evals/scripts/run-jq-wasm-proof-spike.js +299 -0
  445. package/evals/scripts/run-output-router-transform-eval.js +115 -0
  446. package/evals/scripts/run-pi-observed-routing-eval.js +478 -0
  447. package/evals/scripts/run-quickjs-wasi-proof-spike.js +339 -0
  448. package/evals/scripts/skill-evidence.sh +316 -0
  449. package/evals/scripts/validate-release-metadata.sh +486 -0
  450. package/evals/suites/v0.1-acceptance-suite.md +131 -0
  451. package/{plugins/freeflow/hooks → hooks}/freeflow-runtime-context.mjs +65 -14
  452. package/package.json +46 -13
  453. package/pi-extension/dist/host-producer-identification.js +186 -0
  454. package/pi-extension/dist/index.js +85 -0
  455. package/pi-extension/dist/mcp-config.js +30 -0
  456. package/pi-extension/dist/native-safety-net.js +209 -0
  457. package/pi-extension/dist/observed-tool-routing.js +114 -0
  458. package/pi-extension/dist/renderers.js +835 -0
  459. package/pi-extension/dist/router-tools.js +438 -0
  460. package/pi-extension/dist/runtime-context.js +288 -0
  461. package/pi-extension/dist/schemas.js +254 -0
  462. package/pi-extension/dist/status.js +449 -0
  463. package/pi-extension/dist/utils.js +467 -0
  464. package/pi-extension/src/host-producer-identification.ts +226 -0
  465. package/pi-extension/src/index.ts +121 -0
  466. package/pi-extension/src/mcp-config.ts +32 -0
  467. package/pi-extension/src/native-safety-net.ts +252 -0
  468. package/pi-extension/src/observed-tool-routing.ts +126 -0
  469. package/pi-extension/src/renderers.ts +917 -0
  470. package/pi-extension/src/router-tools.ts +478 -0
  471. package/pi-extension/src/runtime-context.ts +347 -0
  472. package/pi-extension/src/schemas.ts +259 -0
  473. package/pi-extension/src/status.ts +505 -0
  474. package/pi-extension/src/utils.ts +492 -0
  475. package/pi-extension/tsconfig.json +16 -0
  476. package/plugin-docs/README.md +40 -0
  477. package/plugin-docs/adr/0002-evals-before-hooks.md +17 -0
  478. package/{plugins/freeflow/docs → plugin-docs}/adr/0003-release-boundary.md +2 -2
  479. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +26 -0
  480. package/plugin-docs/adr/README.md +10 -0
  481. package/plugin-docs/architecture.md +89 -0
  482. package/plugin-docs/output-router.md +396 -0
  483. package/plugin-docs/release-evidence.md +77 -0
  484. package/{plugins/freeflow/docs → plugin-docs}/skills.md +7 -7
  485. package/{plugins/freeflow/docs → plugin-docs}/workflow.md +4 -4
  486. package/router/dist/benchmarks/benchmark-harness.d.ts +32 -0
  487. package/router/dist/benchmarks/benchmark-harness.js +92 -0
  488. package/router/dist/benchmarks/benchmarks.d.ts +102 -0
  489. package/router/dist/benchmarks/benchmarks.js +880 -0
  490. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +91 -0
  491. package/router/dist/benchmarks/codex-qa-benchmarks.js +461 -0
  492. package/router/dist/benchmarks/command-benchmarks.d.ts +128 -0
  493. package/router/dist/benchmarks/command-benchmarks.js +653 -0
  494. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +74 -0
  495. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +707 -0
  496. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +124 -0
  497. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1295 -0
  498. package/router/dist/benchmarks/context-saving-baseline.d.ts +54 -0
  499. package/router/dist/benchmarks/context-saving-baseline.js +439 -0
  500. package/router/dist/benchmarks/index-benchmarks.d.ts +98 -0
  501. package/router/dist/benchmarks/index-benchmarks.js +762 -0
  502. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +90 -0
  503. package/router/dist/benchmarks/storage-policy-benchmarks.js +538 -0
  504. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +47 -0
  505. package/router/dist/benchmarks/vault-index-benchmarks.js +257 -0
  506. package/router/dist/config/config.d.ts +96 -0
  507. package/router/dist/config/config.js +453 -0
  508. package/router/dist/config/router-contract.d.ts +10 -0
  509. package/router/dist/config/router-contract.js +54 -0
  510. package/router/dist/config/schema.d.ts +18 -0
  511. package/router/dist/config/schema.js +600 -0
  512. package/router/dist/config/types.d.ts +521 -0
  513. package/router/dist/config/types.js +30 -0
  514. package/router/dist/evidence/bounded-evidence.d.ts +40 -0
  515. package/router/dist/evidence/bounded-evidence.js +310 -0
  516. package/router/dist/evidence/evidence-range-selector.d.ts +22 -0
  517. package/router/dist/evidence/evidence-range-selector.js +231 -0
  518. package/router/dist/evidence/evidence-search.d.ts +25 -0
  519. package/router/dist/evidence/evidence-search.js +466 -0
  520. package/router/dist/evidence/evidence.d.ts +38 -0
  521. package/router/dist/evidence/evidence.js +196 -0
  522. package/router/dist/evidence/failure-contracts.d.ts +27 -0
  523. package/router/dist/evidence/failure-contracts.js +160 -0
  524. package/router/dist/evidence/line-ranges.d.ts +22 -0
  525. package/router/dist/evidence/line-ranges.js +22 -0
  526. package/router/dist/experiments/local-index.d.ts +58 -0
  527. package/router/dist/experiments/local-index.js +562 -0
  528. package/router/dist/index.d.ts +30 -0
  529. package/router/dist/index.js +32 -0
  530. package/router/dist/processing/engine.d.ts +108 -0
  531. package/router/dist/processing/engine.js +435 -0
  532. package/router/dist/processing/reducers.d.ts +266 -0
  533. package/router/dist/processing/reducers.js +1495 -0
  534. package/router/dist/processing/renderers.d.ts +25 -0
  535. package/router/dist/processing/renderers.js +186 -0
  536. package/router/dist/processing/scripts.d.ts +78 -0
  537. package/router/dist/processing/scripts.js +333 -0
  538. package/router/dist/repo/repo-traversal.d.ts +18 -0
  539. package/router/dist/repo/repo-traversal.js +242 -0
  540. package/router/dist/routing/observed-reducers.d.ts +35 -0
  541. package/router/dist/routing/observed-reducers.js +647 -0
  542. package/router/dist/routing/observed-routing.d.ts +17 -0
  543. package/router/dist/routing/observed-routing.js +377 -0
  544. package/router/dist/routing/parsers.d.ts +16 -0
  545. package/router/dist/routing/parsers.js +473 -0
  546. package/router/dist/routing/run-filters.d.ts +56 -0
  547. package/router/dist/routing/run-filters.js +230 -0
  548. package/router/dist/routing/run-reducers.d.ts +30 -0
  549. package/router/dist/routing/run-reducers.js +110 -0
  550. package/router/dist/sandbox/adapter-roots.d.ts +38 -0
  551. package/router/dist/sandbox/adapter-roots.js +64 -0
  552. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -0
  553. package/router/dist/sandbox/eryx-python-adapter.js +797 -0
  554. package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
  555. package/router/dist/sandbox/jq-wasm-adapter.js +421 -0
  556. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -0
  557. package/router/dist/sandbox/quickjs-wasi-adapter.js +381 -0
  558. package/router/dist/sandbox/script-sandbox.d.ts +113 -0
  559. package/router/dist/sandbox/script-sandbox.js +303 -0
  560. package/router/dist/setup/script-transform-adapters.d.ts +28 -0
  561. package/router/dist/setup/script-transform-adapters.js +259 -0
  562. package/router/dist/tools/batch.d.ts +22 -0
  563. package/router/dist/tools/batch.js +509 -0
  564. package/router/dist/tools/run.d.ts +50 -0
  565. package/router/dist/tools/run.js +1219 -0
  566. package/router/dist/tools/search.d.ts +44 -0
  567. package/router/dist/tools/search.js +1205 -0
  568. package/router/dist/transform/engine.d.ts +143 -0
  569. package/router/dist/transform/engine.js +1955 -0
  570. package/router/dist/vault/vault-index.d.ts +106 -0
  571. package/router/dist/vault/vault-index.js +411 -0
  572. package/router/dist/vault/vault.d.ts +103 -0
  573. package/router/dist/vault/vault.js +635 -0
  574. package/{plugins/freeflow/skills → skills}/commit-work/SKILL.md +17 -16
  575. package/{plugins/freeflow/skills → skills}/commit-work/references/staging-decisions.md +3 -3
  576. package/skills/design-for-depth/SKILL.md +90 -0
  577. package/skills/design-for-depth/references/design-pressure-signals.md +265 -0
  578. package/skills/design-for-depth/references/software-design-philosophy.md +219 -0
  579. package/{plugins/freeflow/skills → skills}/diagnose-failure/SKILL.md +6 -1
  580. package/skills/discover/ARTIFACT-DESTINATIONS.md +58 -0
  581. package/skills/discover/CHECKPOINTS.md +74 -0
  582. package/skills/discover/SKILL.md +173 -0
  583. package/skills/execute-plan/SKILL.md +133 -0
  584. package/skills/execute-plan/references/execution-map.md +122 -0
  585. package/{plugins/freeflow/skills → skills}/mode-contract/SKILL.md +10 -5
  586. package/skills/output-router/SKILL.md +202 -0
  587. package/skills/output-router/references/safety-policy.md +40 -0
  588. package/{plugins/freeflow/skills → skills}/review-artifact/SKILL.md +37 -1
  589. package/{plugins/freeflow/skills → skills}/review-artifact/references/reviewer-prompt.md +14 -2
  590. package/skills/review-work/SKILL.md +101 -0
  591. package/{plugins/freeflow/skills → skills}/review-work/references/reviewer-prompt.md +8 -0
  592. package/skills/setup-freeflow/SKILL.md +106 -0
  593. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/activation-contract.md +14 -8
  594. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/host-setup.md +5 -3
  595. package/skills/setup-freeflow/references/output-router-setup.md +102 -0
  596. package/{plugins/freeflow/skills → skills}/verify-work/SKILL.md +3 -1
  597. package/{plugins/freeflow/skills → skills}/workflow/SKILL.md +23 -13
  598. package/{plugins/freeflow/skills → skills}/workflow/references/workflow-map.md +21 -20
  599. package/{plugins/freeflow/skills → skills}/write-plan/SKILL.md +9 -1
  600. package/{plugins/freeflow/skills → skills}/write-skill/SKILL.md +1 -1
  601. package/{plugins/freeflow/skills → skills}/write-spec/SKILL.md +9 -6
  602. package/plugins/freeflow/docs/README.md +0 -39
  603. package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
  604. package/plugins/freeflow/docs/adr/README.md +0 -7
  605. package/plugins/freeflow/docs/architecture.md +0 -86
  606. package/plugins/freeflow/docs/release-evidence.md +0 -49
  607. package/plugins/freeflow/pi-extension/index.js +0 -250
  608. package/plugins/freeflow/skills/capture-decisions/SKILL.md +0 -95
  609. package/plugins/freeflow/skills/capture-decisions/references/destination-guide.md +0 -65
  610. package/plugins/freeflow/skills/execute-plan/SKILL.md +0 -67
  611. package/plugins/freeflow/skills/grill-context/SKILL.md +0 -79
  612. package/plugins/freeflow/skills/grill-context/references/approach-framing.md +0 -52
  613. package/plugins/freeflow/skills/research-brief/SKILL.md +0 -69
  614. package/plugins/freeflow/skills/review-work/SKILL.md +0 -73
  615. package/plugins/freeflow/skills/setup-freeflow/SKILL.md +0 -84
  616. /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
  617. /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
  618. /package/{plugins/freeflow/docs → plugin-docs}/adr/0001-three-modes.md +0 -0
  619. /package/{plugins/freeflow/skills → skills}/bypass/SKILL.md +0 -0
  620. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/feedback-loop-catalog.md +0 -0
  621. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/flaky-and-performance.md +0 -0
  622. /package/{plugins/freeflow/skills → skills}/evaluate-skill/SKILL.md +0 -0
  623. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/eval-patterns.md +0 -0
  624. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/grading-priority.md +0 -0
  625. /package/{plugins/freeflow/skills → skills}/handoff/SKILL.md +0 -0
  626. /package/{plugins/freeflow/skills → skills}/handoff/references/templates.md +0 -0
  627. /package/{plugins/freeflow/skills → skills}/interview-gate/SKILL.md +0 -0
  628. /package/{plugins/freeflow/skills → skills}/write-plan/references/plan-shapes.md +0 -0
  629. /package/{plugins/freeflow/skills → skills}/write-spec/references/artifact-standards.md +0 -0
  630. /package/{plugins/freeflow/skills → skills}/write-spec/references/spec-shapes.md +0 -0
@@ -0,0 +1,635 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, open, readFile, rename, unlink, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { DEFAULT_VAULT_RETENTION, DEFAULT_VAULT_ROOT } from "../config/config.js";
6
+ import { createLocalVaultIndex, recordVaultIndexFailure } from "./vault-index.js";
7
+ const sessionIndexWriteLocks = new Map();
8
+ const SESSION_INDEX_LOCK_RETRY_MS = 5;
9
+ const SESSION_INDEX_LOCK_TIMEOUT_MS = 5_000;
10
+ export function createVault(options = {}) {
11
+ return {
12
+ root: resolveVaultRoot(options.root ?? DEFAULT_VAULT_ROOT),
13
+ retention: options.retention ?? DEFAULT_VAULT_RETENTION,
14
+ };
15
+ }
16
+ export function resolveVaultRoot(root) {
17
+ if (root === "~") {
18
+ return homedir();
19
+ }
20
+ if (root.startsWith("~/")) {
21
+ return join(homedir(), root.slice(2));
22
+ }
23
+ return resolve(root);
24
+ }
25
+ export function commandOutputFingerprints(options) {
26
+ const combined = options.combined ?? combineOutputSections(options.stdout, options.stderr);
27
+ return {
28
+ exactSha256: sha256Json({ stdout: options.stdout, stderr: options.stderr, combined }),
29
+ normalizedSha256: sha256Json({
30
+ stdout: normalizeOutputText(options.stdout),
31
+ stderr: normalizeOutputText(options.stderr),
32
+ combined: normalizeOutputText(combined),
33
+ }),
34
+ commandFingerprintSha256: sha256Json({
35
+ command: options.command,
36
+ cwd: options.cwd ?? null,
37
+ executionStatus: options.executionStatus,
38
+ exitCode: options.exitCode,
39
+ }),
40
+ };
41
+ }
42
+ export function textOutputFingerprints(options) {
43
+ return {
44
+ exactSha256: sha256Text(options.raw),
45
+ normalizedSha256: sha256Text(normalizeOutputText(options.raw)),
46
+ };
47
+ }
48
+ export async function findExactDuplicateCommandOutput(vault, options) {
49
+ const index = await readSessionIndex(vault, options.sessionId);
50
+ for (const outputId of index.outputs) {
51
+ if (outputId === options.excludeOutputId) {
52
+ continue;
53
+ }
54
+ const entry = index.records[outputId];
55
+ if (!entry || entry.kind !== "command") {
56
+ continue;
57
+ }
58
+ const fingerprints = entry.fingerprints;
59
+ if (fingerprints?.exactSha256 === options.fingerprints.exactSha256 &&
60
+ fingerprints.commandFingerprintSha256 === options.fingerprints.commandFingerprintSha256) {
61
+ return entry;
62
+ }
63
+ }
64
+ return undefined;
65
+ }
66
+ export async function findExactDuplicateTextOutput(vault, options) {
67
+ const index = await readSessionIndex(vault, options.sessionId);
68
+ for (const outputId of index.outputs) {
69
+ if (outputId === options.excludeOutputId) {
70
+ continue;
71
+ }
72
+ const entry = index.records[outputId];
73
+ if (!entry || entry.kind !== "text") {
74
+ continue;
75
+ }
76
+ if (entry.fingerprints?.exactSha256 === options.fingerprints.exactSha256) {
77
+ return entry;
78
+ }
79
+ }
80
+ return undefined;
81
+ }
82
+ export async function storeCommandOutput(vault, options) {
83
+ assertStorablePersistence(options.persistence);
84
+ const createdAt = options.createdAt ?? new Date().toISOString();
85
+ const combined = options.combined ?? combineOutputSections(options.stdout, options.stderr);
86
+ const decisionIds = options.decisionIds ?? [];
87
+ const fingerprints = commandOutputFingerprints({
88
+ command: options.command,
89
+ stdout: options.stdout,
90
+ stderr: options.stderr,
91
+ combined,
92
+ executionStatus: options.executionStatus,
93
+ exitCode: options.exitCode,
94
+ ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
95
+ });
96
+ const payloadHash = sha256Json({
97
+ kind: "command",
98
+ createdAt,
99
+ command: options.command,
100
+ cwd: options.cwd,
101
+ executionStatus: options.executionStatus,
102
+ exitCode: options.exitCode,
103
+ durationMs: options.durationMs,
104
+ stdout: options.stdout,
105
+ stderr: options.stderr,
106
+ combined,
107
+ decisionIds,
108
+ });
109
+ const objectId = objectIdFromHash(payloadHash);
110
+ const outputId = outputIdFromHash(payloadHash);
111
+ const recordId = recordIdFromHash(payloadHash);
112
+ const objectDir = objectDirectory(vault, objectId);
113
+ const paths = {
114
+ meta: join(objectDir, "meta.json"),
115
+ stdout: join(objectDir, "stdout.txt"),
116
+ stderr: join(objectDir, "stderr.txt"),
117
+ combined: join(objectDir, "combined.txt"),
118
+ };
119
+ const record = {
120
+ kind: "command",
121
+ outputId,
122
+ recordId,
123
+ objectId,
124
+ command: options.command,
125
+ createdAt,
126
+ executionStatus: options.executionStatus,
127
+ exitCode: options.exitCode,
128
+ paths,
129
+ lineCounts: {
130
+ stdout: countLines(options.stdout),
131
+ stderr: countLines(options.stderr),
132
+ combined: countLines(combined),
133
+ },
134
+ byteCounts: {
135
+ stdout: byteLength(options.stdout),
136
+ stderr: byteLength(options.stderr),
137
+ combined: byteLength(combined),
138
+ },
139
+ hashes: {
140
+ stdoutSha256: sha256Text(options.stdout),
141
+ stderrSha256: sha256Text(options.stderr),
142
+ combinedSha256: sha256Text(combined),
143
+ },
144
+ fingerprints,
145
+ decisionIds,
146
+ producer: options.producer ?? { kind: "command" },
147
+ persistence: options.persistence ?? exactVaultPersistence(outputId),
148
+ contentHashSha256: payloadHash,
149
+ retention: vault.retention,
150
+ };
151
+ if (options.lineage !== undefined) {
152
+ record.lineage = options.lineage;
153
+ }
154
+ const commandExpiresAt = expiresAt(createdAt, vault.retention);
155
+ if (commandExpiresAt !== undefined) {
156
+ record.expiresAt = commandExpiresAt;
157
+ }
158
+ if (options.cwd !== undefined) {
159
+ record.cwd = options.cwd;
160
+ }
161
+ if (options.durationMs !== undefined) {
162
+ record.durationMs = options.durationMs;
163
+ }
164
+ await mkdir(objectDir, { recursive: true });
165
+ await writeFile(paths.stdout, options.stdout, "utf8");
166
+ await writeFile(paths.stderr, options.stderr, "utf8");
167
+ await writeFile(paths.combined, combined, "utf8");
168
+ await writeJson(paths.meta, record);
169
+ await addRecordToSessionIndex(vault, options.sessionId, record);
170
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, combined, "combined");
171
+ return record;
172
+ }
173
+ export async function storeTextOutput(vault, options) {
174
+ assertStorablePersistence(options.persistence);
175
+ const createdAt = options.createdAt ?? new Date().toISOString();
176
+ const decisionIds = options.decisionIds ?? [];
177
+ const fingerprints = textOutputFingerprints({ raw: options.raw });
178
+ const payloadHash = sha256Json({
179
+ kind: "text",
180
+ createdAt,
181
+ sourceKind: options.sourceKind,
182
+ raw: options.raw,
183
+ decisionIds,
184
+ });
185
+ const objectId = objectIdFromHash(payloadHash);
186
+ const outputId = outputIdFromHash(payloadHash);
187
+ const recordId = recordIdFromHash(payloadHash);
188
+ const objectDir = objectDirectory(vault, objectId);
189
+ const paths = {
190
+ meta: join(objectDir, "meta.json"),
191
+ raw: join(objectDir, "raw.txt"),
192
+ };
193
+ const record = {
194
+ kind: "text",
195
+ outputId,
196
+ recordId,
197
+ objectId,
198
+ sourceKind: options.sourceKind,
199
+ createdAt,
200
+ paths,
201
+ lineCounts: { raw: countLines(options.raw) },
202
+ byteCounts: { raw: byteLength(options.raw) },
203
+ hashes: { rawSha256: sha256Text(options.raw) },
204
+ fingerprints,
205
+ decisionIds,
206
+ producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
207
+ persistence: options.persistence ?? exactVaultPersistence(outputId),
208
+ contentHashSha256: payloadHash,
209
+ retention: vault.retention,
210
+ };
211
+ if (options.lineage !== undefined) {
212
+ record.lineage = options.lineage;
213
+ }
214
+ const textExpiresAt = expiresAt(createdAt, vault.retention);
215
+ if (textExpiresAt !== undefined) {
216
+ record.expiresAt = textExpiresAt;
217
+ }
218
+ await mkdir(objectDir, { recursive: true });
219
+ await writeFile(paths.raw, options.raw, "utf8");
220
+ await writeJson(paths.meta, record);
221
+ await addRecordToSessionIndex(vault, options.sessionId, record);
222
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, options.raw, "raw");
223
+ return record;
224
+ }
225
+ export async function storeMetadataOutput(vault, options) {
226
+ assertStorablePersistence(options.persistence);
227
+ const createdAt = options.createdAt ?? new Date().toISOString();
228
+ const decisionIds = options.decisionIds ?? [];
229
+ const payloadHash = sha256Json({
230
+ kind: "metadata",
231
+ createdAt,
232
+ sourceKind: options.sourceKind,
233
+ rawLineCount: options.rawLineCount,
234
+ rawByteCount: options.rawByteCount,
235
+ rawSha256: options.rawSha256,
236
+ metadata: options.metadata,
237
+ decisionIds,
238
+ });
239
+ const objectId = objectIdFromHash(payloadHash);
240
+ const outputId = outputIdFromHash(payloadHash);
241
+ const recordId = recordIdFromHash(payloadHash);
242
+ const objectDir = objectDirectory(vault, objectId);
243
+ const paths = {
244
+ meta: join(objectDir, "meta.json"),
245
+ };
246
+ const record = {
247
+ kind: "metadata",
248
+ outputId,
249
+ recordId,
250
+ objectId,
251
+ sourceKind: options.sourceKind,
252
+ createdAt,
253
+ paths,
254
+ lineCounts: { raw: options.rawLineCount },
255
+ byteCounts: { raw: options.rawByteCount },
256
+ hashes: options.rawSha256 !== undefined ? { rawSha256: options.rawSha256 } : {},
257
+ decisionIds,
258
+ producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
259
+ persistence: options.persistence ?? metadataOnlyPersistence(outputId),
260
+ contentHashSha256: payloadHash,
261
+ retention: vault.retention,
262
+ };
263
+ if (options.metadata !== undefined) {
264
+ record.metadata = options.metadata;
265
+ }
266
+ if (options.lineage !== undefined) {
267
+ record.lineage = options.lineage;
268
+ }
269
+ const metadataExpiresAt = expiresAt(createdAt, vault.retention);
270
+ if (metadataExpiresAt !== undefined) {
271
+ record.expiresAt = metadataExpiresAt;
272
+ }
273
+ await mkdir(objectDir, { recursive: true });
274
+ await writeJson(paths.meta, record);
275
+ await addRecordToSessionIndex(vault, options.sessionId, record);
276
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
277
+ return record;
278
+ }
279
+ export async function storeRepoFileReference(vault, options) {
280
+ assertStorablePersistence(options.persistence);
281
+ const createdAt = options.createdAt ?? new Date().toISOString();
282
+ const decisionIds = options.decisionIds ?? [];
283
+ const payloadHash = sha256Json({
284
+ kind: "repo-file",
285
+ createdAt,
286
+ path: options.path,
287
+ hashSha256: options.hashSha256,
288
+ decisionIds,
289
+ });
290
+ const objectId = objectIdFromHash(payloadHash);
291
+ const outputId = outputIdFromHash(payloadHash);
292
+ const recordId = recordIdFromHash(payloadHash);
293
+ const objectDir = objectDirectory(vault, objectId);
294
+ const paths = {
295
+ meta: join(objectDir, "meta.json"),
296
+ };
297
+ const record = {
298
+ kind: "repo-file",
299
+ outputId,
300
+ recordId,
301
+ objectId,
302
+ path: options.path,
303
+ paths,
304
+ decisionIds,
305
+ createdAt,
306
+ producer: options.producer ?? { kind: "repo" },
307
+ persistence: options.persistence ?? metadataOnlyPersistence(),
308
+ contentHashSha256: payloadHash,
309
+ retention: vault.retention,
310
+ };
311
+ if (options.lineage !== undefined) {
312
+ record.lineage = options.lineage;
313
+ }
314
+ const repoExpiresAt = expiresAt(createdAt, vault.retention);
315
+ if (repoExpiresAt !== undefined) {
316
+ record.expiresAt = repoExpiresAt;
317
+ }
318
+ if (options.hashSha256 !== undefined) {
319
+ record.hashSha256 = options.hashSha256;
320
+ }
321
+ await mkdir(objectDir, { recursive: true });
322
+ await writeJson(paths.meta, record);
323
+ await addRecordToSessionIndex(vault, options.sessionId, record);
324
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
325
+ return record;
326
+ }
327
+ export async function readVaultRecord(vault, sessionId, outputId) {
328
+ const index = await readSessionIndex(vault, sessionId);
329
+ const entry = index.records[outputId];
330
+ if (!entry) {
331
+ throw new Error(`No vault output found for ${outputId} in session ${sessionId}.`);
332
+ }
333
+ return readJson(join(objectDirectory(vault, entry.objectId), "meta.json"));
334
+ }
335
+ export async function readOutputText(vault, sessionId, outputId, stream) {
336
+ const record = await readVaultRecord(vault, sessionId, outputId);
337
+ const path = streamPath(record, stream);
338
+ return readFile(path, "utf8");
339
+ }
340
+ export async function readOutputLines(vault, options) {
341
+ if (!Number.isInteger(options.startLine) || !Number.isInteger(options.endLine)) {
342
+ throw new Error("Line ranges must use integer line numbers.");
343
+ }
344
+ if (options.startLine < 1 || options.endLine < options.startLine) {
345
+ throw new Error("Line ranges must be 1-based and endLine must be greater than or equal to startLine.");
346
+ }
347
+ const text = await readOutputText(vault, options.sessionId, options.outputId, options.stream);
348
+ return splitLines(text).slice(options.startLine - 1, options.endLine).join("\n");
349
+ }
350
+ export async function readSessionIndex(vault, sessionId) {
351
+ const path = sessionIndexPath(vault, sessionId);
352
+ try {
353
+ return (await readJson(path));
354
+ }
355
+ catch (error) {
356
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
357
+ if (code !== "ENOENT") {
358
+ throw error;
359
+ }
360
+ const now = new Date().toISOString();
361
+ return emptySessionIndex(sessionId, now);
362
+ }
363
+ }
364
+ function assertStorablePersistence(persistence) {
365
+ if (persistence?.recoverability === "none") {
366
+ throw new Error("Cannot store output with persistence recoverability none; skip vault storage instead.");
367
+ }
368
+ }
369
+ async function indexVaultRecordAfterAppend(vault, sessionId, record, text, stream) {
370
+ try {
371
+ const index = createLocalVaultIndex(vault);
372
+ const metadata = {
373
+ sessionId,
374
+ ...(stream !== undefined ? { stream } : {}),
375
+ };
376
+ await index.indexRecord(record, text, metadata);
377
+ }
378
+ catch (error) {
379
+ await recordVaultIndexFailure(vault, error).catch(() => undefined);
380
+ }
381
+ }
382
+ async function addRecordToSessionIndex(vault, sessionId, record) {
383
+ await withSessionIndexWriteLock(vault, sessionId, async () => {
384
+ const index = await readSessionIndex(vault, sessionId);
385
+ const updatedAt = new Date().toISOString();
386
+ const entry = {
387
+ outputId: record.outputId,
388
+ recordId: record.recordId,
389
+ objectId: record.objectId,
390
+ kind: record.kind,
391
+ createdAt: record.createdAt,
392
+ producer: record.producer,
393
+ persistence: record.persistence,
394
+ };
395
+ if (record.lineage !== undefined) {
396
+ entry.lineage = record.lineage;
397
+ }
398
+ if (record.kind === "command") {
399
+ entry.executionStatus = record.executionStatus;
400
+ }
401
+ if (record.fingerprints !== undefined) {
402
+ entry.fingerprints = record.fingerprints;
403
+ }
404
+ index.updatedAt = updatedAt;
405
+ index.records[record.outputId] = entry;
406
+ addUnique(index.outputs, record.outputId);
407
+ if (record.kind === "command") {
408
+ addToExecutionGroup(index, record.executionStatus, record.outputId);
409
+ }
410
+ await writeJsonAtomic(sessionIndexPath(vault, sessionId), index);
411
+ });
412
+ }
413
+ async function withSessionIndexWriteLock(vault, sessionId, operation) {
414
+ const key = `${vault.root}:${safeSegment(sessionId)}`;
415
+ const previous = sessionIndexWriteLocks.get(key) ?? Promise.resolve();
416
+ let releaseCurrent;
417
+ const current = new Promise((resolve) => {
418
+ releaseCurrent = resolve;
419
+ });
420
+ const chained = previous.catch(() => undefined).then(() => current);
421
+ sessionIndexWriteLocks.set(key, chained);
422
+ await previous.catch(() => undefined);
423
+ try {
424
+ return await withSessionIndexFileLock(vault, sessionId, operation);
425
+ }
426
+ finally {
427
+ releaseCurrent();
428
+ if (sessionIndexWriteLocks.get(key) === chained) {
429
+ sessionIndexWriteLocks.delete(key);
430
+ }
431
+ }
432
+ }
433
+ async function withSessionIndexFileLock(vault, sessionId, operation) {
434
+ const path = sessionIndexLockPath(vault, sessionId);
435
+ await mkdir(dirname(path), { recursive: true });
436
+ const startedAt = Date.now();
437
+ let handle;
438
+ while (handle === undefined) {
439
+ try {
440
+ handle = await open(path, "wx");
441
+ await handle.writeFile(`${process.pid}\n${new Date().toISOString()}\n`, "utf8");
442
+ }
443
+ catch (error) {
444
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
445
+ if (code !== "EEXIST") {
446
+ throw error;
447
+ }
448
+ if (Date.now() - startedAt > SESSION_INDEX_LOCK_TIMEOUT_MS) {
449
+ throw new Error(`Timed out waiting for vault session index lock for ${safeSegment(sessionId)}.`);
450
+ }
451
+ await sleep(SESSION_INDEX_LOCK_RETRY_MS);
452
+ }
453
+ }
454
+ try {
455
+ return await operation();
456
+ }
457
+ finally {
458
+ await handle.close().catch(() => undefined);
459
+ await unlink(path).catch(() => undefined);
460
+ }
461
+ }
462
+ function addToExecutionGroup(index, status, outputId) {
463
+ if (status === "success") {
464
+ addUnique(index.successful, outputId);
465
+ }
466
+ else if (status === "failed") {
467
+ addUnique(index.failed, outputId);
468
+ }
469
+ else if (status === "timed_out") {
470
+ addUnique(index.timedOut, outputId);
471
+ }
472
+ else if (status === "cancelled") {
473
+ addUnique(index.cancelled, outputId);
474
+ }
475
+ }
476
+ function emptySessionIndex(sessionId, now) {
477
+ return {
478
+ version: 1,
479
+ sessionId: safeSegment(sessionId),
480
+ createdAt: now,
481
+ updatedAt: now,
482
+ outputs: [],
483
+ records: {},
484
+ successful: [],
485
+ failed: [],
486
+ timedOut: [],
487
+ cancelled: [],
488
+ };
489
+ }
490
+ function streamPath(record, stream) {
491
+ if (record.kind === "command") {
492
+ if (stream === "raw") {
493
+ throw new Error("Command records do not have a raw stream. Use stdout, stderr, or combined.");
494
+ }
495
+ return record.paths[stream];
496
+ }
497
+ if (record.kind === "text") {
498
+ if (stream !== "raw") {
499
+ throw new Error("Text records only have a raw stream.");
500
+ }
501
+ return record.paths.raw;
502
+ }
503
+ if (record.kind === "metadata") {
504
+ throw new Error("Metadata only records store no raw stream.");
505
+ }
506
+ throw new Error("Repo file reference records store metadata only and have no raw stream.");
507
+ }
508
+ function sessionIndexPath(vault, sessionId) {
509
+ return join(vault.root, "sessions", safeSegment(sessionId), "index.json");
510
+ }
511
+ function sessionIndexLockPath(vault, sessionId) {
512
+ return `${sessionIndexPath(vault, sessionId)}.lock`;
513
+ }
514
+ function objectDirectory(vault, objectId) {
515
+ return join(vault.root, "objects", objectId);
516
+ }
517
+ function objectIdFromHash(hash) {
518
+ return `sha256_${hash}`;
519
+ }
520
+ function outputIdFromHash(hash) {
521
+ return `ffout_${hash.slice(0, 24)}`;
522
+ }
523
+ function recordIdFromHash(hash) {
524
+ return `ffrec_${hash.slice(0, 24)}`;
525
+ }
526
+ function exactVaultPersistence(outputId) {
527
+ return {
528
+ status: "vaulted",
529
+ recoverability: "exact",
530
+ recoveryOutputId: outputId,
531
+ outputId,
532
+ };
533
+ }
534
+ function metadataOnlyPersistence(outputId) {
535
+ return {
536
+ status: "metadata_only",
537
+ recoverability: "metadata_only",
538
+ ...(outputId !== undefined ? { outputId } : {}),
539
+ };
540
+ }
541
+ function producerForTextSourceKind(sourceKind) {
542
+ if (sourceKind === "native") {
543
+ return { kind: "native" };
544
+ }
545
+ if (sourceKind === "script") {
546
+ return { kind: "script" };
547
+ }
548
+ if (sourceKind === "mcp") {
549
+ return { kind: "mcp" };
550
+ }
551
+ if (sourceKind === "web") {
552
+ return { kind: "web" };
553
+ }
554
+ if (sourceKind === "fetch") {
555
+ return { kind: "fetch" };
556
+ }
557
+ if (sourceKind === "code_search") {
558
+ return { kind: "code_search" };
559
+ }
560
+ if (sourceKind === "transform") {
561
+ return { kind: "transform" };
562
+ }
563
+ return { kind: "other" };
564
+ }
565
+ function combineOutputSections(stdout, stderr) {
566
+ if (stdout.length === 0) {
567
+ return stderr;
568
+ }
569
+ if (stderr.length === 0) {
570
+ return stdout;
571
+ }
572
+ return `[stdout]\n${stdout}\n[stderr]\n${stderr}`;
573
+ }
574
+ function countLines(text) {
575
+ if (text.length === 0) {
576
+ return 0;
577
+ }
578
+ return splitLines(text).length;
579
+ }
580
+ function splitLines(text) {
581
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
582
+ }
583
+ function byteLength(text) {
584
+ return Buffer.byteLength(text, "utf8");
585
+ }
586
+ function sha256Text(text) {
587
+ return createHash("sha256").update(text).digest("hex");
588
+ }
589
+ function normalizeOutputText(text) {
590
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trimEnd();
591
+ }
592
+ function sha256Json(value) {
593
+ return sha256Text(JSON.stringify(value));
594
+ }
595
+ function expiresAt(createdAt, retention) {
596
+ if (retention.strategy !== "ttl") {
597
+ return undefined;
598
+ }
599
+ const createdTime = new Date(createdAt).getTime();
600
+ if (!Number.isFinite(createdTime)) {
601
+ return undefined;
602
+ }
603
+ return new Date(createdTime + retention.ttlDays * 24 * 60 * 60 * 1_000).toISOString();
604
+ }
605
+ function addUnique(items, item) {
606
+ if (!items.includes(item)) {
607
+ items.push(item);
608
+ }
609
+ }
610
+ function safeSegment(value) {
611
+ const safe = value.replace(/[^a-zA-Z0-9._-]/g, "_");
612
+ return safe.length > 0 ? safe : "session";
613
+ }
614
+ async function writeJson(path, value) {
615
+ await mkdir(dirname(path), { recursive: true });
616
+ await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
617
+ }
618
+ async function writeJsonAtomic(path, value) {
619
+ await mkdir(dirname(path), { recursive: true });
620
+ const tempPath = join(dirname(path), `.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}.json`);
621
+ try {
622
+ await writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
623
+ await rename(tempPath, path);
624
+ }
625
+ catch (error) {
626
+ await unlink(tempPath).catch(() => undefined);
627
+ throw error;
628
+ }
629
+ }
630
+ function sleep(ms) {
631
+ return new Promise((resolve) => setTimeout(resolve, ms));
632
+ }
633
+ async function readJson(path) {
634
+ return JSON.parse(await readFile(path, "utf8"));
635
+ }
@@ -1,19 +1,19 @@
1
1
  ---
2
2
  name: commit-work
3
- description: Use when committing completed work, preparing a git commit, deciding what to stage, reviewing staged/unstaged/untracked changes, handling commit-everything pressure, or checking generated, sensitive, user-owned, or mixed changes before commit.
3
+ description: Use when committing completed work, preparing a git commit, deciding what to stage, reviewing staged/unstaged/untracked changes, handling commit-everything pressure, pushing committed work, or checking generated, sensitive, user-owned, or mixed changes before commit or push.
4
4
  ---
5
5
 
6
6
  # Commit Work
7
7
 
8
- Commit only reviewed, verified, intended work.
8
+ Commit or push only reviewed, verified, intended work.
9
9
 
10
- This skill is a closeout guard. It is not a release process, PR flow, or hook installer.
10
+ This skill is a closeout guard for commits and simple pushes. It is not a release process, PR flow, or hook installer.
11
11
 
12
- Direct command syntax selects this segment, not commit approval. `--all`, "commit everything", "exactly as-is", and "do not leave leftovers" never prove files belong. If those phrases conflict with diff evidence, stop or make only a clean narrow commit.
12
+ Direct command syntax selects this segment, not commit or push approval. `--all`, "commit everything", "push all changes", "exactly as-is", and "do not leave leftovers" never prove files belong. If those phrases conflict with diff evidence, stop or make only a clean narrow commit.
13
13
 
14
- Hard stop: if untracked logs/debug output or user-owned behavior changes appear, do not commit them. If the prompt forbids leftovers or requires exactly-as-is, stop and ask.
14
+ Hard stop: if untracked logs/debug output or user-owned behavior changes appear, do not commit or push them. If the prompt forbids leftovers or requires exactly-as-is, stop and ask.
15
15
 
16
- Read `references/staging-decisions.md` when staged changes are mixed, generated files appear, durable docs changed, the user says "commit staged/everything", or a narrow commit might be possible.
16
+ Read `references/staging-decisions.md` when staged changes are mixed, generated files appear, durable docs changed, the user says "commit staged/everything" or "push all changes", or a narrow commit might be possible.
17
17
 
18
18
  ## Preconditions
19
19
 
@@ -42,12 +42,7 @@ Diff evidence beats intent. If the worktree contains changes outside the request
42
42
 
43
43
  Never use broad staging when unrelated, unreviewed, generated, or user-owned changes are present.
44
44
 
45
- Avoid:
46
-
47
- ```bash
48
- git add .
49
- git add -A
50
- ```
45
+ Avoid `git add .` and `git add -A`.
51
46
 
52
47
  Stage explicit paths or hunks that match the completed task.
53
48
 
@@ -80,18 +75,24 @@ Add a body only when it helps future readers understand why.
80
75
 
81
76
  Reference specs, plans, ADRs, issues, or decisions when they materially explain the commit. Do not invent mandatory `Refs:` lines for repos that do not require them.
82
77
 
83
- ## After Commit
78
+ ## Push Rule
79
+
80
+ Push only commits you inspected. Before pushing, inspect branch, upstream, remote, and ahead/behind state.
81
+ Do not push to protected/shared branches, set upstream, use `--force`, or rewrite remote history unless explicitly requested and branch evidence supports it. Use `--force-with-lease` only for an intended rewrite of the user's own branch.
82
+ If branch state is stale, diverged, missing upstream, or likely needs PR/CI/release judgment, stop and ask.
83
+
84
+ ## After Commit Or Push
84
85
 
85
86
  Verify what landed:
86
87
 
87
88
  ```bash
88
89
  git show --stat --oneline --name-only HEAD
89
- git status --short
90
+ git status --branch --short
90
91
  ```
91
92
 
92
93
  Final response should state:
93
94
 
94
- - commit SHA and subject
95
+ - commit SHA, subject, and push result if pushed
95
96
  - what was committed
96
97
  - what verification supports it
97
- - any remaining uncommitted or unverified changes
98
+ - any remaining uncommitted, unpushed, or unverified changes