@hassangameryt/freeflow 0.7.3 → 0.9.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 (426) hide show
  1. package/.agents/plugins/marketplace.json +2 -2
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +2 -2
  4. package/.codex-plugin/plugin.json +3 -3
  5. package/.cursor-plugin/plugin.json +1 -1
  6. package/NOTICE +14 -0
  7. package/README.md +101 -159
  8. package/capabilities/cognitive-routing/SKILL.md +47 -210
  9. package/capabilities/cognitive-routing/references/coordinator.md +163 -0
  10. package/capabilities/cognitive-routing/references/worker.md +38 -0
  11. package/capabilities/compaction/SKILL.md +49 -0
  12. package/capabilities/compaction/references/summary-format.md +250 -0
  13. package/capabilities/messaging/SKILL.md +49 -0
  14. package/capabilities/task-memory/SKILL.md +87 -0
  15. package/command-surface.json +8 -52
  16. package/gemini-extension.json +1 -1
  17. package/hooks/claude/hooks.json +13 -3
  18. package/hooks/codex/hooks.json +2 -1
  19. package/hooks/shared/runtime-context.mjs +73 -83
  20. package/licenses/Apache-2.0.txt +55 -0
  21. package/package.json +42 -12
  22. package/pi-extension/README.md +41 -0
  23. package/pi-extension/dist/ask-user/ask.js +108 -0
  24. package/pi-extension/dist/ask-user/form.js +250 -0
  25. package/pi-extension/dist/ask-user/questions.js +66 -0
  26. package/pi-extension/dist/ask-user/tool.js +124 -0
  27. package/pi-extension/dist/cognitive-routing/assembler.js +417 -0
  28. package/pi-extension/dist/cognitive-routing/bootstrap.js +90 -0
  29. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/config.js +8 -6
  30. package/pi-extension/dist/cognitive-routing/economics.js +45 -0
  31. package/pi-extension/dist/cognitive-routing/event-schema.js +388 -0
  32. package/pi-extension/dist/{session-sources/events.js → cognitive-routing/event-store.js} +107 -41
  33. package/pi-extension/dist/cognitive-routing/gate.js +256 -0
  34. package/pi-extension/dist/cognitive-routing/handlers.js +901 -0
  35. package/pi-extension/dist/cognitive-routing/handoffs.js +350 -0
  36. package/pi-extension/dist/cognitive-routing/model-control.js +476 -0
  37. package/pi-extension/dist/cognitive-routing/projection.js +520 -0
  38. package/pi-extension/dist/cognitive-routing/provenance.js +83 -0
  39. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/render.js +15 -15
  40. package/pi-extension/dist/cognitive-routing/runtime.js +398 -0
  41. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/schemas.js +47 -11
  42. package/pi-extension/dist/cognitive-routing/session.js +223 -0
  43. package/pi-extension/dist/{session-sources → cognitive-routing}/sources.js +126 -87
  44. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/state.js +55 -386
  45. package/pi-extension/dist/cognitive-routing/status.js +81 -0
  46. package/pi-extension/dist/cognitive-routing/tools.js +74 -0
  47. package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/types.js +14 -11
  48. package/pi-extension/dist/compaction/carry.js +205 -0
  49. package/pi-extension/dist/compaction/config.js +24 -0
  50. package/pi-extension/dist/compaction/controller.js +494 -0
  51. package/pi-extension/dist/compaction/harness.js +93 -0
  52. package/pi-extension/dist/compaction/results.js +159 -0
  53. package/pi-extension/dist/compaction/thresholds.js +35 -0
  54. package/pi-extension/dist/compaction/tool.js +57 -0
  55. package/pi-extension/dist/host/branch.js +13 -0
  56. package/pi-extension/dist/host/canonical.js +12 -0
  57. package/pi-extension/dist/host/catalog.js +62 -0
  58. package/pi-extension/dist/host/config-validation.js +233 -0
  59. package/pi-extension/dist/host/config.js +361 -0
  60. package/pi-extension/dist/host/inbound.js +142 -0
  61. package/pi-extension/dist/host/projection-tags.js +60 -0
  62. package/pi-extension/dist/host/prompts.js +93 -0
  63. package/pi-extension/dist/{session-sources → host}/read-only-session.js +117 -1
  64. package/pi-extension/dist/{runtime → host}/request-history.js +125 -39
  65. package/pi-extension/dist/host/rows.js +25 -0
  66. package/pi-extension/dist/host/runtime-state.js +204 -0
  67. package/pi-extension/dist/host/section-keeper.js +85 -0
  68. package/pi-extension/dist/host/settings/freeflow-command.js +2323 -0
  69. package/pi-extension/dist/{settings/settings-tui.js → host/settings/settings-view.js} +205 -73
  70. package/pi-extension/dist/host/staging.js +28 -0
  71. package/pi-extension/dist/host/status.js +115 -0
  72. package/pi-extension/dist/index.js +1004 -188
  73. package/pi-extension/dist/messaging/config.js +27 -0
  74. package/pi-extension/dist/messaging/messaging.js +398 -0
  75. package/pi-extension/dist/messaging/registry.js +57 -0
  76. package/pi-extension/dist/messaging/render.js +90 -0
  77. package/pi-extension/dist/messaging/tools.js +109 -0
  78. package/pi-extension/dist/messaging/transport.js +101 -0
  79. package/pi-extension/dist/provider-support/cache/anchor.js +21 -0
  80. package/pi-extension/dist/provider-support/cache/anthropic.js +102 -0
  81. package/pi-extension/dist/provider-support/cache/health.js +73 -0
  82. package/pi-extension/dist/provider-support/cache/index.js +58 -0
  83. package/pi-extension/dist/provider-support/cache/keepalive.js +222 -0
  84. package/pi-extension/dist/provider-support/cache/monitor.js +17 -0
  85. package/pi-extension/dist/provider-support/cache/openai-responses.js +48 -0
  86. package/pi-extension/dist/provider-support/effort.js +13 -0
  87. package/pi-extension/dist/provider-support/index.js +44 -3
  88. package/pi-extension/dist/provider-support/{astra → openai}/adapter.js +46 -29
  89. package/pi-extension/dist/provider-support/{astra → openai}/history.js +10 -8
  90. package/pi-extension/dist/provider-support/{astra → openai}/index.js +8 -4
  91. package/pi-extension/dist/provider-support/{astra → openai}/session-state.js +29 -38
  92. package/pi-extension/dist/provider-support/routes.js +17 -0
  93. package/pi-extension/dist/task-memory/config.js +49 -0
  94. package/pi-extension/dist/task-memory/registry.js +119 -0
  95. package/pi-extension/dist/task-memory/render.js +107 -0
  96. package/pi-extension/dist/task-memory/runtime.js +994 -0
  97. package/pi-extension/dist/task-memory/tool.js +233 -0
  98. package/pi-extension/dist/tool-execution/apply-patch/grammar.js +23 -0
  99. package/pi-extension/dist/tool-execution/apply-patch/match.js +38 -0
  100. package/pi-extension/dist/tool-execution/apply-patch/parser.js +177 -0
  101. package/pi-extension/dist/tool-execution/apply-patch/plan.js +201 -0
  102. package/pi-extension/dist/tool-execution/apply-patch/tool.js +84 -0
  103. package/pi-extension/dist/tool-execution/background.js +430 -0
  104. package/pi-extension/dist/tool-execution/bash-guard.js +23 -0
  105. package/pi-extension/dist/tool-execution/config.js +33 -0
  106. package/pi-extension/dist/tool-execution/edit-messages.js +120 -0
  107. package/pi-extension/dist/tool-execution/file-state.js +138 -0
  108. package/pi-extension/dist/tool-execution/file-tracking.js +163 -0
  109. package/pi-extension/dist/tool-execution/guidance-notices.js +124 -0
  110. package/pi-extension/dist/tool-execution/prompt.js +54 -0
  111. package/pi-extension/dist/tool-execution/skill-reads.js +143 -0
  112. package/pi-extension/dist/tool-execution/tools.js +16 -0
  113. package/pi-extension/freeflow/README.md +9 -0
  114. package/runtime/prompts/cognitive-routing.md +4 -4
  115. package/runtime/prompts/core.md +29 -72
  116. package/runtime/prompts/interaction-contract.md +18 -8
  117. package/runtime/prompts/tool-execution.md +25 -0
  118. package/runtime/prompts/working-method.md +25 -0
  119. package/skills/deliver-work/SKILL.md +76 -0
  120. package/skills/deliver-work/references/branch-closeout.md +134 -0
  121. package/skills/deliver-work/references/commit.md +83 -0
  122. package/skills/deliver-work/references/launch.md +94 -0
  123. package/skills/deliver-work/references/release.md +85 -0
  124. package/skills/deliver-work/scripts/commit-state.mjs +139 -0
  125. package/skills/deliver-work/scripts/delivery-state.mjs +107 -0
  126. package/skills/deliver-work/scripts/lib/git-state.mjs +178 -0
  127. package/skills/deliver-work/scripts/push-route.mjs +122 -0
  128. package/skills/deliver-work/scripts/release-preflight.mjs +177 -0
  129. package/skills/discuss-work/SKILL.md +148 -0
  130. package/skills/{discuss → discuss-work}/references/discussion-continuity.md +13 -50
  131. package/skills/discuss-work/references/learning-action.md +36 -0
  132. package/skills/discuss-work/scripts/choices.mjs +101 -0
  133. package/skills/discuss-work/scripts/lib/choices.mjs +159 -0
  134. package/skills/evaluate-behavior/SKILL.md +107 -0
  135. package/skills/evaluate-behavior/references/authoring.md +381 -0
  136. package/skills/evaluate-behavior/references/coding-tasks.md +145 -0
  137. package/skills/evaluate-behavior/references/conversations-pipelines-judges.md +177 -0
  138. package/skills/evaluate-behavior/references/design-and-measurement.md +273 -0
  139. package/skills/evaluate-behavior/references/running-and-evidence.md +245 -0
  140. package/skills/evaluate-behavior/scripts/claude-guard.mjs +76 -0
  141. package/skills/evaluate-behavior/scripts/guard-rules.mjs +309 -0
  142. package/skills/evaluate-behavior/scripts/lib/agreement.mjs +90 -0
  143. package/skills/evaluate-behavior/scripts/lib/arms.mjs +55 -0
  144. package/skills/evaluate-behavior/scripts/lib/budget.mjs +87 -0
  145. package/skills/evaluate-behavior/scripts/lib/build-source.mjs +287 -0
  146. package/skills/evaluate-behavior/scripts/lib/clear.mjs +74 -0
  147. package/skills/evaluate-behavior/scripts/lib/container.mjs +395 -0
  148. package/skills/evaluate-behavior/scripts/lib/decision.mjs +418 -0
  149. package/skills/evaluate-behavior/scripts/lib/definitions.mjs +1072 -0
  150. package/skills/evaluate-behavior/scripts/lib/freeflow.mjs +103 -0
  151. package/skills/evaluate-behavior/scripts/lib/grade-command.mjs +591 -0
  152. package/skills/evaluate-behavior/scripts/lib/grade-comparison.mjs +90 -0
  153. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-interaction.mjs +19 -18
  154. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-support.mjs +32 -5
  155. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-workspace.mjs +28 -12
  156. package/skills/evaluate-behavior/scripts/lib/grade.mjs +101 -0
  157. package/skills/evaluate-behavior/scripts/lib/hooks.mjs +98 -0
  158. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/confinement.mjs +196 -0
  159. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/constraints.mjs +111 -0
  160. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/index.mjs +48 -0
  161. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/isolation.mjs +74 -0
  162. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/launch.mjs +123 -0
  163. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/model-call.mjs +73 -0
  164. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/recorder.mjs +178 -0
  165. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/session.mjs +494 -0
  166. package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/skills.mjs +81 -0
  167. package/skills/evaluate-behavior/scripts/lib/hosts/index.mjs +31 -0
  168. package/skills/evaluate-behavior/scripts/lib/hosts/names.mjs +3 -0
  169. package/skills/evaluate-behavior/scripts/lib/hosts/pi/confinement.mjs +173 -0
  170. package/skills/evaluate-behavior/scripts/lib/hosts/pi/host.mjs +148 -0
  171. package/skills/evaluate-behavior/scripts/lib/hosts/pi/index.mjs +70 -0
  172. package/skills/evaluate-behavior/scripts/lib/hosts/pi/isolation.mjs +81 -0
  173. package/skills/evaluate-behavior/scripts/lib/hosts/pi/model-call.mjs +79 -0
  174. package/skills/evaluate-behavior/scripts/lib/hosts/pi/process.mjs +241 -0
  175. package/skills/{evaluate-skill/scripts/lib → evaluate-behavior/scripts/lib/hosts/pi}/rpc.mjs +144 -26
  176. package/skills/evaluate-behavior/scripts/lib/identity.mjs +82 -0
  177. package/skills/evaluate-behavior/scripts/lib/judge.mjs +688 -0
  178. package/skills/evaluate-behavior/scripts/lib/metrics.mjs +332 -0
  179. package/skills/evaluate-behavior/scripts/lib/model-call.mjs +17 -0
  180. package/skills/evaluate-behavior/scripts/lib/participants.mjs +616 -0
  181. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/process.mjs +22 -0
  182. package/skills/evaluate-behavior/scripts/lib/queue.mjs +54 -0
  183. package/skills/evaluate-behavior/scripts/lib/reference.mjs +343 -0
  184. package/skills/evaluate-behavior/scripts/lib/reuse.mjs +277 -0
  185. package/skills/evaluate-behavior/scripts/lib/review.mjs +933 -0
  186. package/skills/evaluate-behavior/scripts/lib/runner.mjs +732 -0
  187. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/sandbox.mjs +121 -14
  188. package/skills/evaluate-behavior/scripts/lib/scan-shell.mjs +457 -0
  189. package/skills/evaluate-behavior/scripts/lib/scan.mjs +479 -0
  190. package/skills/evaluate-behavior/scripts/lib/seal.mjs +91 -0
  191. package/skills/evaluate-behavior/scripts/lib/shell.mjs +560 -0
  192. package/skills/evaluate-behavior/scripts/lib/source-override.mjs +64 -0
  193. package/skills/evaluate-behavior/scripts/lib/subject-file.mjs +88 -0
  194. package/skills/{evaluate-skill/scripts/lib/pi.mjs → evaluate-behavior/scripts/lib/subject.mjs} +239 -262
  195. package/skills/evaluate-behavior/scripts/lib/task-copy.mjs +124 -0
  196. package/skills/evaluate-behavior/scripts/lib/trials.mjs +524 -0
  197. package/skills/evaluate-behavior/scripts/lib/validity.mjs +68 -0
  198. package/skills/evaluate-behavior/scripts/lib/view-html.mjs +454 -0
  199. package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/view.mjs +218 -11
  200. package/skills/evaluate-behavior/scripts/pi-command-tool.mjs +159 -0
  201. package/skills/evaluate-behavior/scripts/pi-container-route.mjs +23 -0
  202. package/skills/evaluate-behavior/scripts/pi-guard.mjs +77 -0
  203. package/skills/evaluate-behavior/scripts/pi-login-refresh.mjs +31 -0
  204. package/skills/evaluate-behavior/scripts/skill-eval.mjs +586 -0
  205. package/skills/execute-work/SKILL.md +96 -72
  206. package/skills/execute-work/references/code-practices.md +27 -49
  207. package/skills/execute-work/references/design.md +271 -0
  208. package/skills/execute-work/references/diagnose.md +117 -0
  209. package/skills/execute-work/references/migration.md +108 -0
  210. package/skills/execute-work/references/simplify.md +65 -0
  211. package/skills/execute-work/scripts/self-review.mjs +422 -0
  212. package/skills/execute-work/scripts/touch-map.mjs +290 -0
  213. package/skills/review-work/SKILL.md +94 -64
  214. package/skills/review-work/references/adjudication.md +94 -0
  215. package/skills/review-work/references/artifact.md +198 -0
  216. package/skills/review-work/references/evals-and-judges.md +66 -0
  217. package/skills/review-work/references/work.md +177 -0
  218. package/skills/review-work/scripts/check-brief.mjs +128 -0
  219. package/skills/review-work/scripts/review-packet.mjs +233 -0
  220. package/skills/setup-freeflow/SKILL.md +69 -16
  221. package/skills/track-work/SKILL.md +135 -151
  222. package/skills/track-work/references/handoff.md +190 -0
  223. package/skills/track-work/references/projects.md +51 -0
  224. package/skills/track-work/references/working-record-format.md +201 -344
  225. package/skills/track-work/scripts/lib/document.mjs +79 -19
  226. package/skills/track-work/scripts/lib/format.mjs +18 -1
  227. package/skills/track-work/scripts/lib/recover.mjs +254 -0
  228. package/skills/track-work/scripts/lib/registry.mjs +656 -0
  229. package/skills/track-work/scripts/lib/search.mjs +40 -0
  230. package/skills/track-work/scripts/lib/store.mjs +53 -21
  231. package/skills/track-work/scripts/lib/transitions.mjs +79 -4
  232. package/skills/track-work/scripts/lib/views.mjs +50 -1
  233. package/skills/track-work/scripts/working-record.mjs +263 -22
  234. package/skills/verify-work/SKILL.md +64 -47
  235. package/skills/verify-work/references/feature-map.md +120 -0
  236. package/skills/verify-work/references/runtime-evidence.md +203 -0
  237. package/skills/verify-work/references/test-design.md +27 -6
  238. package/skills/verify-work/scripts/test-changes.mjs +246 -0
  239. package/skills/write-docs/SKILL.md +171 -0
  240. package/skills/write-docs/references/documentation-shapes.md +184 -0
  241. package/skills/write-docs/references/spec-and-plan-shapes.md +308 -0
  242. package/skills/write-docs/scripts/artifact-check.mjs +148 -0
  243. package/skills/write-docs/scripts/docs-check.mjs +229 -0
  244. package/skills/write-docs/scripts/plan-lint.mjs +123 -0
  245. package/skills/write-skill/SKILL.md +165 -165
  246. package/skills/write-skill/references/activation-and-wording.md +143 -0
  247. package/skills/write-skill/references/placement-and-dependencies.md +154 -0
  248. package/skills/write-skill/scripts/lib/compare.mjs +701 -0
  249. package/skills/write-skill/scripts/lib/similarity.mjs +56 -0
  250. package/skills/write-skill/scripts/lib/skill-author.mjs +197 -3
  251. package/skills/write-skill/scripts/skill-author.mjs +67 -8
  252. package/capabilities/context-virtualization/SKILL.md +0 -103
  253. package/capabilities/conversation-history/SKILL.md +0 -53
  254. package/hooks/tests/check-host-adapters.test.mjs +0 -82
  255. package/hooks/tests/check-runtime-context-hook.sh +0 -212
  256. package/pi-extension/dist/cognitive-routing-v2/projection.js +0 -330
  257. package/pi-extension/dist/cognitive-routing-v2/runtime.js +0 -2181
  258. package/pi-extension/dist/cognitive-routing-v2/tools.js +0 -60
  259. package/pi-extension/dist/context-virtualization/commands.js +0 -89
  260. package/pi-extension/dist/context-virtualization/projector.js +0 -42
  261. package/pi-extension/dist/context-virtualization/runtime.js +0 -378
  262. package/pi-extension/dist/context-virtualization/state.js +0 -57
  263. package/pi-extension/dist/context-virtualization/types.js +0 -10
  264. package/pi-extension/dist/conversation-history/passages.js +0 -66
  265. package/pi-extension/dist/conversation-history/ranking.js +0 -105
  266. package/pi-extension/dist/conversation-history/runtime.js +0 -226
  267. package/pi-extension/dist/conversation-history/search.js +0 -56
  268. package/pi-extension/dist/conversation-history/types.js +0 -1
  269. package/pi-extension/dist/freeflow-context/resolver.js +0 -120
  270. package/pi-extension/dist/freeflow-context/runtime.js +0 -80
  271. package/pi-extension/dist/freeflow-context/source-projector.js +0 -95
  272. package/pi-extension/dist/freeflow-context/tool.js +0 -314
  273. package/pi-extension/dist/freeflow-context/types.js +0 -12
  274. package/pi-extension/dist/freeflow-context/visibility.js +0 -28
  275. package/pi-extension/dist/integrations/mcp-config.js +0 -29
  276. package/pi-extension/dist/runtime/runtime-context.js +0 -754
  277. package/pi-extension/dist/runtime/runtime-identity.js +0 -5
  278. package/pi-extension/dist/session-sources/provenance.js +0 -32
  279. package/pi-extension/dist/settings/settings-ui.js +0 -1360
  280. package/pi-extension/dist/ui/text-component.js +0 -57
  281. package/pi-extension/src/cognitive-routing-v2/budget.ts +0 -42
  282. package/pi-extension/src/cognitive-routing-v2/config.ts +0 -173
  283. package/pi-extension/src/cognitive-routing-v2/projection.ts +0 -375
  284. package/pi-extension/src/cognitive-routing-v2/render.ts +0 -277
  285. package/pi-extension/src/cognitive-routing-v2/runtime.ts +0 -2241
  286. package/pi-extension/src/cognitive-routing-v2/schemas.ts +0 -180
  287. package/pi-extension/src/cognitive-routing-v2/state.ts +0 -839
  288. package/pi-extension/src/cognitive-routing-v2/tools.ts +0 -62
  289. package/pi-extension/src/cognitive-routing-v2/types.ts +0 -254
  290. package/pi-extension/src/context-virtualization/commands.ts +0 -111
  291. package/pi-extension/src/context-virtualization/projector.ts +0 -62
  292. package/pi-extension/src/context-virtualization/runtime.ts +0 -428
  293. package/pi-extension/src/context-virtualization/state.ts +0 -79
  294. package/pi-extension/src/context-virtualization/types.ts +0 -92
  295. package/pi-extension/src/conversation-history/passages.ts +0 -81
  296. package/pi-extension/src/conversation-history/ranking.ts +0 -155
  297. package/pi-extension/src/conversation-history/runtime.ts +0 -250
  298. package/pi-extension/src/conversation-history/search.ts +0 -79
  299. package/pi-extension/src/conversation-history/types.ts +0 -31
  300. package/pi-extension/src/freeflow-context/resolver.ts +0 -139
  301. package/pi-extension/src/freeflow-context/runtime.ts +0 -100
  302. package/pi-extension/src/freeflow-context/source-projector.ts +0 -106
  303. package/pi-extension/src/freeflow-context/tool.ts +0 -366
  304. package/pi-extension/src/freeflow-context/types.ts +0 -70
  305. package/pi-extension/src/freeflow-context/visibility.ts +0 -53
  306. package/pi-extension/src/index.ts +0 -390
  307. package/pi-extension/src/integrations/mcp-config.ts +0 -32
  308. package/pi-extension/src/provider-support/astra/adapter.ts +0 -108
  309. package/pi-extension/src/provider-support/astra/history.ts +0 -145
  310. package/pi-extension/src/provider-support/astra/index.ts +0 -12
  311. package/pi-extension/src/provider-support/astra/session-state.ts +0 -113
  312. package/pi-extension/src/provider-support/index.ts +0 -5
  313. package/pi-extension/src/runtime/request-history.ts +0 -243
  314. package/pi-extension/src/runtime/runtime-context.ts +0 -860
  315. package/pi-extension/src/runtime/runtime-identity.ts +0 -8
  316. package/pi-extension/src/session-sources/events.ts +0 -230
  317. package/pi-extension/src/session-sources/provenance.ts +0 -39
  318. package/pi-extension/src/session-sources/read-only-session.ts +0 -170
  319. package/pi-extension/src/session-sources/sources.ts +0 -334
  320. package/pi-extension/src/settings/settings-tui.ts +0 -501
  321. package/pi-extension/src/settings/settings-ui.ts +0 -1652
  322. package/pi-extension/src/ui/text-component.ts +0 -66
  323. package/pi-extension/tests/cache-reuse/history.test.js +0 -117
  324. package/pi-extension/tests/cache-reuse/native.test.js +0 -91
  325. package/pi-extension/tests/cache-reuse/settings.test.js +0 -211
  326. package/pi-extension/tests/cognitive-routing-v2/communication.test.js +0 -577
  327. package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +0 -183
  328. package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +0 -557
  329. package/pi-extension/tests/cognitive-routing-v2/native.test.js +0 -474
  330. package/pi-extension/tests/cognitive-routing-v2/performance.test.js +0 -87
  331. package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +0 -300
  332. package/pi-extension/tests/cognitive-routing-v2/projection.test.js +0 -241
  333. package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +0 -1034
  334. package/pi-extension/tests/cognitive-routing-v2/render.test.js +0 -244
  335. package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +0 -423
  336. package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +0 -521
  337. package/pi-extension/tests/cognitive-routing-v2/state.test.js +0 -586
  338. package/pi-extension/tests/context-virtualization/extension.test.js +0 -775
  339. package/pi-extension/tests/context-virtualization/projector.test.js +0 -110
  340. package/pi-extension/tests/context-virtualization/runtime.test.js +0 -230
  341. package/pi-extension/tests/conversation-history/runtime.test.js +0 -98
  342. package/pi-extension/tests/conversation-history/search.test.js +0 -97
  343. package/pi-extension/tests/fixtures/pi-host.js +0 -4
  344. package/pi-extension/tests/fixtures/routing-native.js +0 -191
  345. package/pi-extension/tests/integration/mode-free-core.test.js +0 -220
  346. package/pi-extension/tests/integration/pi-extension.test.js +0 -1447
  347. package/pi-extension/tests/integration/prompt-architecture.test.js +0 -447
  348. package/pi-extension/tests/integration/unaffected-regressions.test.js +0 -478
  349. package/pi-extension/tests/provider-support/astra-boundaries.test.js +0 -75
  350. package/pi-extension/tests/provider-support/astra.test.js +0 -306
  351. package/pi-extension/tests/provider-support/cli.test.js +0 -92
  352. package/pi-extension/tests/provider-support/native.test.js +0 -183
  353. package/pi-extension/tests/settings/settings-tui.test.js +0 -243
  354. package/pi-extension/tsconfig.json +0 -16
  355. package/plugin.json +0 -33
  356. package/runtime/prompts/context-virtualization.md +0 -3
  357. package/runtime/prompts/conversation-history.md +0 -3
  358. package/skills/action-selection/SKILL.md +0 -100
  359. package/skills/action-selection/references/trajectory-stalls.md +0 -71
  360. package/skills/bypass/SKILL.md +0 -153
  361. package/skills/commit-work/SKILL.md +0 -145
  362. package/skills/commit-work/references/git-state-edges.md +0 -94
  363. package/skills/commit-work/references/simple-push.md +0 -92
  364. package/skills/commit-work/references/staging-decisions.md +0 -106
  365. package/skills/decision-gate/SKILL.md +0 -106
  366. package/skills/design-for-depth/SKILL.md +0 -117
  367. package/skills/design-for-depth/references/design-pressure-signals.md +0 -182
  368. package/skills/design-for-depth/references/implementation-decisions.md +0 -76
  369. package/skills/design-for-depth/references/interface-design-loop.md +0 -136
  370. package/skills/design-for-depth/references/module-and-dependency-design.md +0 -147
  371. package/skills/design-for-depth/references/software-design-philosophy.md +0 -202
  372. package/skills/design-for-depth/references/state-and-failure-boundaries.md +0 -136
  373. package/skills/diagnose-failure/SKILL.md +0 -125
  374. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +0 -48
  375. package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +0 -51
  376. package/skills/discuss/SKILL.md +0 -116
  377. package/skills/evaluate-skill/SKILL.md +0 -219
  378. package/skills/evaluate-skill/references/evaluation-definition-schema.md +0 -385
  379. package/skills/evaluate-skill/references/evaluation-design.md +0 -112
  380. package/skills/evaluate-skill/references/execution-and-evidence.md +0 -90
  381. package/skills/evaluate-skill/references/review-and-revision.md +0 -92
  382. package/skills/evaluate-skill/scripts/lib/definitions.mjs +0 -407
  383. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +0 -60
  384. package/skills/evaluate-skill/scripts/lib/grade.mjs +0 -64
  385. package/skills/evaluate-skill/scripts/lib/runner.mjs +0 -368
  386. package/skills/evaluate-skill/scripts/pi-guard.mjs +0 -164
  387. package/skills/evaluate-skill/scripts/skill-eval.mjs +0 -102
  388. package/skills/execute-work/references/execute-work-edges.md +0 -68
  389. package/skills/finish-branch/SKILL.md +0 -117
  390. package/skills/finish-branch/references/integration-options.md +0 -80
  391. package/skills/handoff/SKILL.md +0 -82
  392. package/skills/handoff/references/handoff-templates.md +0 -150
  393. package/skills/launch-work/SKILL.md +0 -116
  394. package/skills/launch-work/references/launch-readiness.md +0 -85
  395. package/skills/migration-work/SKILL.md +0 -115
  396. package/skills/migration-work/references/migration-lifecycle.md +0 -82
  397. package/skills/release-work/SKILL.md +0 -118
  398. package/skills/release-work/references/release-evidence.md +0 -78
  399. package/skills/review-artifact/SKILL.md +0 -142
  400. package/skills/review-artifact/references/adjudicate-artifact-review.md +0 -101
  401. package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +0 -159
  402. package/skills/review-work/references/adjudicate-work-review.md +0 -97
  403. package/skills/review-work/references/independent-work-reviewer-contract.md +0 -139
  404. package/skills/review-work/references/security-risk-lens.md +0 -69
  405. package/skills/setup-freeflow/references/activation-contract.md +0 -109
  406. package/skills/setup-freeflow/references/host-setup.md +0 -67
  407. package/skills/simplify-code/SKILL.md +0 -85
  408. package/skills/simplify-code/references/simplification-patterns.md +0 -70
  409. package/skills/verify-work/references/browser-runtime-evidence.md +0 -55
  410. package/skills/verify-work/references/integration-evidence.md +0 -47
  411. package/skills/verify-work/references/performance-evidence.md +0 -57
  412. package/skills/workflow/SKILL.md +0 -127
  413. package/skills/workflow/references/domain-skill-composition.md +0 -43
  414. package/skills/write-plan/SKILL.md +0 -92
  415. package/skills/write-plan/references/plan-shapes.md +0 -156
  416. package/skills/write-skill/references/activation-boundaries.md +0 -104
  417. package/skills/write-skill/references/agent-first-instructions.md +0 -121
  418. package/skills/write-skill/references/progressive-disclosure.md +0 -127
  419. package/skills/write-skill/references/skill-dependency-graphs.md +0 -190
  420. package/skills/write-spec/SKILL.md +0 -92
  421. package/skills/write-spec/references/artifact-standards.md +0 -86
  422. package/skills/write-spec/references/decision-records.md +0 -78
  423. package/skills/write-spec/references/spec-shapes.md +0 -143
  424. /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/budget.js +0 -0
  425. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/evidence.mjs +0 -0
  426. /package/skills/{evaluate-skill → evaluate-behavior}/scripts/pi-observer.mjs +0 -0
@@ -0,0 +1,308 @@
1
+ # Spec, Plan And Decision Shapes
2
+
3
+ This reference is judgment, with one Rule under Plans: composable shapes for a Spec, a Plan or a decision record, not mandatory templates. Use only the sections the document needs for its use; the header, status and source trail are in [Write Docs](../SKILL.md#header-status-and-sources). A decision note or ADR has its own shape under [Decision Records](#decision-records), below.
4
+
5
+ ## Specs
6
+
7
+ ### Product Spec Or PRD
8
+
9
+ Use for a product, capability, workflow, or user-facing outcome.
10
+
11
+ Possible sections:
12
+
13
+ - problem and motivation;
14
+ - intended outcome;
15
+ - users or actors;
16
+ - scope and non-goals;
17
+ - user journeys or observable behavior;
18
+ - requirements and constraints;
19
+ - product, policy, or domain decisions;
20
+ - edge and failure behavior;
21
+ - acceptance criteria;
22
+ - unresolved questions and source evidence.
23
+
24
+ Do not turn a PRD into an implementation task list.
25
+
26
+ ### Issue Or Problem Specification
27
+
28
+ Use when a durable issue must define a problem clearly enough to investigate, fix, or accept.
29
+
30
+ Possible sections:
31
+
32
+ - observed problem or requested change;
33
+ - affected behavior and users;
34
+ - current evidence, reproduction, or examples;
35
+ - expected behavior;
36
+ - scope and non-goals;
37
+ - severity, constraints, and known impact;
38
+ - acceptance criteria;
39
+ - unresolved facts or owner decisions.
40
+
41
+ Do not present a guessed cause or requested patch as established fact. A fix sequence belongs in a Plan after the cause and path are sufficiently understood.
42
+
43
+ ### Requirements Or Behavioral Specification
44
+
45
+ Use when observable behavior and constraints matter more than implementation structure.
46
+
47
+ Possible sections:
48
+
49
+ - actors and preconditions;
50
+ - required behavior and invariants;
51
+ - inputs, outputs, states, and transitions;
52
+ - errors, rejection, degradation, and recovery;
53
+ - forbidden outcomes;
54
+ - compatibility and data guarantees;
55
+ - acceptance examples and evidence.
56
+
57
+ Express behavior precisely without copying implementation logic into the contract.
58
+
59
+ ### Technical Design
60
+
61
+ Use when the artifact must define an accepted technical direction in depth.
62
+
63
+ Possible sections:
64
+
65
+ - problem and current evidence;
66
+ - goals and non-goals;
67
+ - proposed architecture or design;
68
+ - module, interface, state, and ownership boundaries;
69
+ - data flow and persistence;
70
+ - failure contract and recovery;
71
+ - security, privacy, performance, and operational constraints;
72
+ - alternatives and rationale;
73
+ - compatibility or migration impact;
74
+ - risks, validation, and unresolved design questions.
75
+
76
+ A technical design may contain implementation detail when that detail defines the accepted design. Ordered phases and execution slices still belong in a Plan.
77
+
78
+ #### Implementation Decisions
79
+
80
+ Include this subsection when consequential engineering choices must survive implementation handoffs or context loss. For selecting those choices, use Execute Work's [design](../../execute-work/references/design.md); this shape preserves their result rather than duplicating the design method.
81
+
82
+ Capture only what the intended implementation needs:
83
+
84
+ - selected representation, identity, state owners, and module responsibilities;
85
+ - essential algorithm, effect ordering, update/invalidation, and failure behavior;
86
+ - source basis, rationale, and invariants;
87
+ - a plausible wrong implementation and the observer that distinguishes it;
88
+ - required constraints, suggested mechanics, and implementer freedom;
89
+ - unresolved assumptions and conditions requiring reconsideration.
90
+
91
+ A compact type or control-flow sketch is useful when it removes consequential ambiguity. Mark illustrative code as such; it is not the behavioral oracle. Keep the applicable revision recoverable and update only decisions affected by new evidence. Do not require this subsection for a product-only artifact or an already clear local change.
92
+
93
+ ### API, Protocol, Or Interface Contract
94
+
95
+ Use for a public or internal interface that callers will depend on.
96
+
97
+ Possible sections:
98
+
99
+ - interface, endpoint, command, event, or protocol name;
100
+ - callers, roles, authentication, and permissions;
101
+ - requests, inputs, responses, outputs, and schemas;
102
+ - invariants and ordering;
103
+ - errors and failure semantics;
104
+ - idempotency, retries, versioning, and compatibility;
105
+ - privacy, billing, data-safety, and operational constraints;
106
+ - examples and acceptance evidence.
107
+
108
+ Stop rather than inventing caller-visible behavior or compatibility promises.
109
+
110
+ ### Migration Contract
111
+
112
+ Use when current and target states, compatibility, and safety obligations must be durable before execution is planned.
113
+
114
+ Possible sections:
115
+
116
+ - current and target contracts;
117
+ - affected consumers, data, traffic, or configuration;
118
+ - compatibility and support commitments;
119
+ - data and state invariants;
120
+ - cutover, rollback, or forward-recovery requirements;
121
+ - observation and removal conditions;
122
+ - consequential failure behavior;
123
+ - acceptance and completion evidence;
124
+ - decisions still required.
125
+
126
+ Include ordering only when it is part of the accepted migration contract. Detailed execution phases belong in a migration or implementation Plan.
127
+
128
+ ### Combine Carefully
129
+
130
+ An artifact may combine shapes when it genuinely owns both jobs, such as a technical design containing an API contract. Keep each responsibility legible.
131
+
132
+ Do not create an omnibus artifact merely to avoid links. Separate artifacts when they have different owners, statuses, audiences, lifecycles, or review boundaries.
133
+
134
+ ## Plans
135
+
136
+ Approval to execute a Plan may cover its listed work, checks, selected reviews, record maintenance and local commits, still subject to fresh evidence and [Deliver Work](../../deliver-work/SKILL.md)'s commit inspection; accepting its strategy alone authorizes none of them, and neither ever implies push, integration, migration, deprecation, release or launch. This Rule is binding.
137
+
138
+ ### When A Plan Helps
139
+
140
+ Write a durable Plan when the intended outcome and material decisions are settled, the approach and dependencies can be ordered without guessing, and the strategy needs to survive on its own. A small correction can proceed from its request and supported approach, and an evolving route with substantial branching belongs in [Track Work](../../track-work/SKILL.md) as provisional Slices, not a confident long-form Plan. If execution is already authorized and a Plan is useful preparation, writing it need not create another approval stop; keep any review or user-return boundary actually selected.
141
+
142
+ ### Start With Source And Boundaries
143
+
144
+ A separate Spec is not required when the request and accepted understanding are clear enough; otherwise the Plan consumes the relevant Spec, issue, design, diagnosis or decision. Make the execution boundary and its dependencies clear:
145
+
146
+ ```text
147
+ Goal:
148
+ Source and linked artifacts:
149
+ Scope:
150
+ Non-goals:
151
+ Accepted decisions:
152
+ Assumptions:
153
+ Dependencies:
154
+ Required order:
155
+ ```
156
+
157
+ Link accepted behavior, architecture and decisions instead of copying their rationale. Do not hide unsettled design or owner choices as assumptions; an assumption whose failure would choose among materially different strategies is resolved before the Plan is executable, and work outside the Plan's promise is named as unresolved or deferred.
158
+
159
+ ### Write The Smallest Useful Strategy
160
+
161
+ Include the relevant goal, sources, scope, decisions, assumptions, dependencies, ordered coherent outcomes, focused checks, integration, completion conditions, and what would invalidate the strategy. Use exact paths and commands when known and useful; do not invent them to make the Plan look executable. The Plan is not a context inventory: name only the sources and relationships needed to explain or execute its steps, and leave ordinary local choices to the executing agent.
162
+
163
+ Size outcomes for manageable working context, dependencies, uncertainty and checking, not mechanically by file, bug count, test or method. A validation step may stop the Plan if a bounded assumption fails; if its result would select among materially different strategies, keep the dependent work provisional in the Working Record rather than presenting the later sequence as decided.
164
+
165
+ **Lightweight ordered Plan**, when the work is clear and short enough that phases add no value (a tiny reversible action may not need a saved Plan):
166
+
167
+ ```text
168
+ Ordered actions or slices:
169
+ Checks:
170
+ Selected checkpoints, if any:
171
+ Completion condition:
172
+ ```
173
+
174
+ **Phased Plan**, when execution has meaningful dependencies, integration points, or several coherent outcomes. A phase groups slices that produce one integrated outcome; a slice is a coherent result, not a file list, with a clear dependency on earlier work where one exists. If later phases cannot yet be planned honestly, use a Working Record instead.
175
+
176
+ ```text
177
+ ## Phase 1 — <outcome>
178
+ Purpose:
179
+ Dependencies:
180
+ Selected checkpoints, if any:
181
+ Completion condition:
182
+
183
+ ### Slice 1.1 — <result>
184
+ Intended result:
185
+ Source requirement:
186
+ Scope or write boundary:
187
+ Work:
188
+ Dependencies:
189
+ Tests or observations:
190
+ Verification claim and required boundary:
191
+ Selected independent review, if any:
192
+ Selected local commit, if any:
193
+ Other user or continuity checkpoint, if any:
194
+ Completion condition:
195
+ ```
196
+
197
+ Use only the slice fields needed to execute and check it; mention files, modules or systems only when they clarify scope.
198
+
199
+ ### Keep Acceptance And Return Visible
200
+
201
+ Tie each material outcome and final check to the accepted behavior it serves. Keep the agreed return condition visible: return a proposed strategy, implement one Slice, finish the task, or stop at a specified boundary. Before a new prerequisite becomes a planned obligation, determine whether it serves an accepted requirement or only preserves a particular approach. Internal delegation handbacks and context cycles are not user checkpoints.
202
+
203
+ ### Select Checkpoints Without A Schedule Of Ceremonies
204
+
205
+ Ordinary verification and silent self-review belong to producing each result; do not restate them as gates unless a particular evidence boundary needs explanation. Select independent review, a local commit, a user decision or a continuity transfer only to protect a concrete dependency, risk, rollback or delivery boundary; a slice ending or a fixed count is not enough. A selected local commit names its coherent outcome and conditions, not merely "commit after this slice"; actual results and commit identities go in the Working Record. When an existing agreement already covers the work, keep that source instead of asking the user to approve the same scope again because it is now written down.
206
+
207
+ ### Adapt For The Work Type
208
+
209
+ - **Remediation:** after evidence or diagnosis establishes the cause, include the observed problem, source requirement, affected scope, ordered corrections, regression checks, recovery or cleanup, and completion condition. Do not plan from a requested patch or plausible cause alone.
210
+ - **Migration or operations:** for an accepted migration, release, rollout or operational contract, include the source and target states, prerequisites, ordered execution or cohorts, checks before, during and after, stop or recovery conditions, observation, completion and cleanup. The Plan implements accepted compatibility, safety and recovery requirements; it does not invent them.
211
+
212
+ ### Finish With Integration And Invalidation
213
+
214
+ ```text
215
+ Integration:
216
+ Final tests or observations:
217
+ Verification claims and required boundaries:
218
+ Selected independent review, if any:
219
+ Selected local commit, if any:
220
+ Other user or continuity checkpoint, if any:
221
+ Completion condition:
222
+
223
+ Plan invalidation conditions:
224
+ ```
225
+
226
+ Useful invalidation conditions: a source requirement or accepted decision changes; a material dependency behaves differently; the design cannot satisfy the contract; checks cannot establish the required claims; implementation needs materially different scope or order; accepted review items expose a Plan-level defect. They stop or revise the affected Plan; they are not alternate branches. Do not use a narrow final check to imply broader completion.
227
+
228
+ ### Revise Or Supersede
229
+
230
+ A local implementation detail, expected result, completed slice, clerical correction or reached review cap does not revise the strategy. Use a superseding Plan when editing in place would obscure the earlier accepted strategy or reviewed state, and self-review a materially revised or superseding Plan through Review Work; independent review is selected separately, not required because the Plan changed.
231
+
232
+ ## Decision Records
233
+
234
+ Its binding statements restate [Write Docs](../SKILL.md) Rules; header, status and source trail follow Write Docs' [Header, Status And Sources](../SKILL.md#header-status-and-sources), like Specs and Plans.
235
+
236
+ ### Choose The Right Record
237
+
238
+ Use the smallest record that preserves the decision where future work will look for it.
239
+
240
+ - **Working Record decision:** task-local choice that affects later slices or current task direction. [Track Work](../../track-work/SKILL.md) owns its `D-` ID, state, rationale, and supersession.
241
+ - **Decision note:** durable product, policy, scope, compatibility, or technical choice that needs a separate document but does not require the repository's ADR process.
242
+ - **ADR:** surprising, cross-cutting, or hard-to-reverse architecture or operational decision whose alternatives and consequences must remain durable.
243
+ - **Owning spec:** keep a decision inside a PRD, API contract, technical design, or other spec when that artifact clearly owns the decision and a separate record would only duplicate it.
244
+
245
+ Do not create a separate decision artifact merely because a decision occurred.
246
+
247
+ ### When A Separate Decision Artifact Helps
248
+
249
+ A separate record is useful when the decision is:
250
+
251
+ - hard or expensive to reverse;
252
+ - surprising relative to repository or domain practice;
253
+ - a real tradeoff among materially different paths;
254
+ - cross-cutting across systems, teams, or operational boundaries;
255
+ - likely to be challenged again without its original rationale;
256
+ - intentionally rejected or superseded in a way future work must understand;
257
+ - explicitly requested as a durable decision artifact.
258
+
259
+ Ordinary reversible implementation choices, task progress, temporary constraints, assumptions, and unanswered questions do not belong in a durable decision record.
260
+
261
+ ### Write The Decision Clearly
262
+
263
+ Use the repository's ADR or decision format when one exists. Otherwise adapt this shape:
264
+
265
+ ```md
266
+ # Decision: <title>
267
+
268
+ > **Doc ID:** DECISION-<stable-id>
269
+ > **Type:** Decision | ADR
270
+ > **Status:** Draft | Accepted | Rejected | Superseded | Retired
271
+ > **Owner:** <decision owner>
272
+ > **Source:** <accepted context and evidence>
273
+
274
+ ## Context
275
+ <Decision question, constraints, and evidence.>
276
+
277
+ ## Decision
278
+ <Chosen path, exact scope, and why.>
279
+
280
+ ## Alternatives
281
+ <Only materially different alternatives and why they were not chosen.>
282
+
283
+ ## Consequences
284
+ <Benefits, costs, risks, compatibility, operations, and follow-up obligations.>
285
+
286
+ ## Revisit Or Supersession
287
+ <Evidence, conditions, or later decision that would reopen or replace it.>
288
+ ```
289
+
290
+ For a consequential choice, identify the presented option, its disclosed consequences, and the acceptance source.
291
+
292
+ ### Preserve Authority And History
293
+
294
+ Name who made or owns the decision when that matters. A reviewer can challenge a decision but cannot silently replace it. A Working Record, Plan, or Handoff cannot supersede a durable decision merely by describing a different path.
295
+
296
+ When a decision changes:
297
+
298
+ - preserve the old record as `Superseded` rather than rewriting it to match the present, or as `Retired`, with the date and the reason, when nothing replaces it;
299
+ - create or identify the replacement decision, if there is one, and link both directions;
300
+ - identify owning specs, plans, or policies whose current content depends on it and revise them when authorized;
301
+ - mark dependent work contingent when a required decision or source revision remains unresolved;
302
+ - preserve the evidence that justified the change.
303
+
304
+ Live evidence may show that implementation violates a decision or that the decision is no longer viable. Use Discuss Work when resolving that conflict requires user authority.
305
+
306
+ ### Avoid Duplication
307
+
308
+ Reference the decision from dependent artifacts instead of copying its full rationale. When a durable decision shapes how existing software works, the owning subsystem doc's Decisions section states its current effect and points to the record, and is kept current with the code like the rest of that doc. Keep task-local decisions in the Working Record unless they become durable beyond the task.
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ // Checks the header, status and source trail of Specs, Plans and decision records (Write Docs, "Header, Status And
3
+ // Sources"): a title; one status from the vocabulary (Draft, Reviewed, Accepted, Rejected, Superseded, Retired) or the
4
+ // repository's own, given with --statuses; an Accepted document names its Source; a Superseded one links its
5
+ // replacement; and every typed pointer in the trail resolves: file:<path>, commit:<sha>, working-record:<task>/...
6
+ // It checks shape and pointers, not whether the source really accepted the document.
7
+ // Usage: artifact-check.mjs <document.md>... [--statuses <a,b,...>] [--root <repository>] [--json]
8
+ // The status is read from a "> **Status:** ..." header line or the first line under a "## Status" heading. Exit code
9
+ // 0 when every document passes, 1 when one has a problem, 2 on a usage error.
10
+ import { execFileSync } from "node:child_process";
11
+ import { existsSync, readFileSync } from "node:fs";
12
+ import { dirname, join, relative, resolve } from "node:path";
13
+ import { parseArgs } from "node:util";
14
+
15
+ const USAGE = "Usage: artifact-check.mjs <document.md>... [--statuses <a,b,...>] [--root <repository>] [--json]";
16
+ let parsed;
17
+ try {
18
+ parsed = parseArgs({
19
+ allowPositionals: true,
20
+ options: { statuses: { type: "string" }, root: { type: "string" }, json: { type: "boolean", default: false } },
21
+ });
22
+ } catch (error) {
23
+ console.error(`${error.message}\n${USAGE}`);
24
+ process.exit(2);
25
+ }
26
+ const { values, positionals } = parsed;
27
+ if (!positionals.length) {
28
+ console.error(USAGE);
29
+ process.exit(2);
30
+ }
31
+ const git = (cwd, args) => {
32
+ try {
33
+ return execFileSync("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
34
+ } catch {
35
+ return null;
36
+ }
37
+ };
38
+ const root = resolve(values.root ?? git(process.cwd(), ["rev-parse", "--show-toplevel"]) ?? process.cwd());
39
+ const STATUSES = values.statuses
40
+ ? values.statuses
41
+ .split(",")
42
+ .map((each) => each.trim())
43
+ .filter(Boolean)
44
+ : ["Draft", "Reviewed", "Accepted", "Rejected", "Superseded", "Retired"];
45
+
46
+ function check(file) {
47
+ const text = readFileSync(file, "utf8");
48
+ const lines = text.split("\n");
49
+ const header = {};
50
+ for (const line of lines.slice(0, 40)) {
51
+ const match = /^>\s*\*\*([A-Za-z][A-Za-z ]*?):\*\*\s*(.*)$/.exec(line);
52
+ if (match && !(match[1] in header)) header[match[1]] = match[2].trim();
53
+ }
54
+ const problems = [];
55
+ const notChecked = [];
56
+ const title = lines.find((line) => /^#\s+\S/.test(line))?.replace(/^#\s+/, "") ?? null;
57
+ if (!title) problems.push("has no title (a first-level heading)");
58
+
59
+ let status = header.Status ?? null;
60
+ if (status === null) {
61
+ const at = lines.findIndex((line) => /^##\s+Status\s*$/i.test(line));
62
+ if (at !== -1)
63
+ status =
64
+ lines
65
+ .slice(at + 1)
66
+ .find((line) => line.trim())
67
+ ?.trim() ?? null;
68
+ }
69
+ const value = status?.replace(/[.*`]/g, "").split(/[\s,;(—–]/)[0] ?? null;
70
+ if (!status) problems.push("has no status (a > **Status:** line or a ## Status section)");
71
+ else if (status.includes("|")) problems.push(`gives several statuses (${status}); give the one current status`);
72
+ else if (!STATUSES.includes(value))
73
+ problems.push(
74
+ `status "${value}" is not one of ${STATUSES.join(", ")}${values.statuses ? "" : " (pass --statuses for the repository's own)"}`,
75
+ );
76
+
77
+ const body = text.toLowerCase();
78
+ if (
79
+ value === "Accepted" &&
80
+ !header.Source &&
81
+ !/^#{2,3}\s+(sources?|source trail)\b/im.test(text) &&
82
+ !/\b(accepted by|accepted in|accepted on)\b/.test(body)
83
+ )
84
+ problems.push("is Accepted but names no Source for the acceptance");
85
+ if (value === "Superseded" && !header["Superseded by"] && !/superseded by/i.test(text))
86
+ problems.push("is Superseded but does not link its replacement (Superseded by)");
87
+ if (value === "Retired" && !/\b\d{4}-\d{2}-\d{2}\b/.test(status + (header.Date ?? "") + text))
88
+ problems.push("is Retired without a date");
89
+
90
+ // Typed pointers anywhere in the document: the source trail.
91
+ // Placeholders (<sha>) and prose such as "file:line" are not pointers.
92
+ const pointers = [...text.matchAll(/\b(file|commit|working-record):([^\s`)\],;]+)/g)]
93
+ .map((match) => ({ kind: match[1], value: match[2].replace(/[.]+$/, "") }))
94
+ .filter(
95
+ (pointer) =>
96
+ !pointer.value.startsWith("<") &&
97
+ (pointer.kind !== "file" || /[./]/.test(pointer.value)) &&
98
+ (pointer.kind !== "commit" || /^[0-9a-f]{7,40}$/i.test(pointer.value)),
99
+ );
100
+ for (const pointer of pointers) {
101
+ const path = pointer.value.replace(/#.*$/, "");
102
+ if (pointer.kind === "commit") {
103
+ if (!/^[0-9a-f]{4,40}$/i.test(path) || !git(root, ["rev-parse", "--verify", "--quiet", `${path}^{commit}`]))
104
+ problems.push(`commit:${path} does not resolve in ${root}`);
105
+ } else if (pointer.kind === "file") {
106
+ if (![root, dirname(file)].some((base) => existsSync(join(base, path))))
107
+ problems.push(`file:${path} does not exist`);
108
+ } else {
109
+ const candidates = [join(root, ".freeflow", "tasks", path), join(root, ".freeflow", "project", path)];
110
+ if (!candidates.some((candidate) => existsSync(candidate)))
111
+ notChecked.push(`working-record:${path} (not found under .freeflow/tasks or the linked project)`);
112
+ }
113
+ }
114
+ if (!pointers.length && !header.Source)
115
+ notChecked.push("no typed source pointers (file:, commit:, working-record:) to check");
116
+ return {
117
+ path: relative(root, file) || file,
118
+ title,
119
+ status: value,
120
+ header: Object.keys(header),
121
+ problems,
122
+ notChecked,
123
+ };
124
+ }
125
+
126
+ const results = [];
127
+ const inputErrors = [];
128
+ for (const input of positionals) {
129
+ const file = resolve(input);
130
+ if (!existsSync(file)) inputErrors.push(`no such file: ${input}`);
131
+ else results.push(check(file));
132
+ }
133
+ const failed = inputErrors.length > 0 || results.some((result) => result.problems.length);
134
+ if (values.json)
135
+ console.log(
136
+ JSON.stringify({ command: "artifact-check", status: failed ? "fail" : "pass", inputErrors, results }, null, 2),
137
+ );
138
+ else {
139
+ for (const error of inputErrors) console.log(`error: ${error}`);
140
+ for (const result of results) {
141
+ console.log(
142
+ `${result.path}: ${result.status ?? "no status"}${result.problems.length ? `, ${result.problems.length} problem(s)` : ", passes"}`,
143
+ );
144
+ for (const problem of result.problems) console.log(` problem: ${problem}`);
145
+ for (const note of result.notChecked) console.log(` not checked: ${note}`);
146
+ }
147
+ }
148
+ process.exit(failed ? 1 : 0);