@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,287 @@
1
+ // Host extensions built from source: a directory at an exact commit of the definition root's repository, or a
2
+ // committed directory under the definition root, optionally built with a declared argv. Each distinct source is
3
+ // snapshotted and built once per group into the group's resources, before any subject starts; a failed build
4
+ // makes the group invalid. The resolved commit, a hash of the built directory and the build's outcome are recorded
5
+ // beside each arm's other host extensions.
6
+
7
+ import { spawn } from "node:child_process";
8
+ import { createHash } from "node:crypto";
9
+ import { cp, lstat, mkdir, realpath, stat } from "node:fs/promises";
10
+ import path from "node:path";
11
+
12
+ import { runProcess } from "./grade-command.mjs";
13
+ import { isContained, isSafeRelativePath } from "./grade-support.mjs";
14
+
15
+ const BUILD_TIMEOUT_MS = 10 * 60 * 1000;
16
+ const COMMIT_REF = /^[0-9a-f]{7,64}$/;
17
+ const OUTPUT_TAIL_CHARACTERS = 4000;
18
+
19
+ function isPlainObject(value) {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value);
21
+ }
22
+
23
+ /** Whether a declared host extension is built from source rather than found among installed Pi packages. */
24
+ export function isSourceExtension(entry) {
25
+ return isPlainObject(entry) && !Object.hasOwn(entry, "package");
26
+ }
27
+
28
+ /** A declared host extension as the run plan names it. */
29
+ export function extensionLabel(entry) {
30
+ if (!isSourceExtension(entry)) return `${entry.package}@${entry.version}`;
31
+ const built = entry.build === undefined ? "" : " (built)";
32
+ return entry.source === undefined
33
+ ? `${entry.path}${built} from the working tree`
34
+ : `${entry.source.path}@${entry.source.ref}${built}`;
35
+ }
36
+
37
+ /**
38
+ * Validates one source-built host extension entry: `{ source: { kind: "git", ref, path }, build?, entry }` or
39
+ * `{ path, build?, entry }`.
40
+ *
41
+ * @param {any} entry
42
+ * @param {string} label
43
+ * @param {(code: string, message: string) => never} fail
44
+ */
45
+ export function validateSourceExtension(entry, label, fail) {
46
+ if (!isPlainObject(entry)) fail("invalid-definition", `${label} must be an object`);
47
+ const allowed = Object.hasOwn(entry, "source") ? ["source", "build", "entry"] : ["path", "build", "entry"];
48
+ for (const key of Object.keys(entry)) {
49
+ if (!allowed.includes(key)) fail("invalid-definition", `${label} contains unsupported field ${key}`);
50
+ }
51
+ if (Object.hasOwn(entry, "source")) {
52
+ const source = entry.source;
53
+ if (!isPlainObject(source)) fail("invalid-definition", `${label}.source must be an object`);
54
+ for (const key of Object.keys(source)) {
55
+ if (!["kind", "ref", "path"].includes(key)) {
56
+ fail("invalid-definition", `${label}.source contains unsupported field ${key}`);
57
+ }
58
+ }
59
+ if (source.kind !== "git") fail("invalid-definition", `${label}.source.kind must be git`);
60
+ if (typeof source.ref !== "string" || !COMMIT_REF.test(source.ref)) {
61
+ fail(
62
+ "invalid-definition",
63
+ `${label}.source.ref must be a commit SHA (7 to 64 hex characters), not a branch or tag`,
64
+ );
65
+ }
66
+ if (typeof source.path !== "string" || (source.path !== "." && !isSafeRelativePath(source.path))) {
67
+ fail("unsafe-path", `${label}.source.path must be a directory path relative to the definition root, or "."`);
68
+ }
69
+ } else if (typeof entry.path !== "string" || (entry.path !== "." && !isSafeRelativePath(entry.path))) {
70
+ fail("unsafe-path", `${label} needs package and version, source, or a path inside the definition root`);
71
+ }
72
+ if (typeof entry.entry !== "string" || !isSafeRelativePath(entry.entry)) {
73
+ fail("invalid-definition", `${label}.entry must be a file path relative to the built directory`);
74
+ }
75
+ if (
76
+ Object.hasOwn(entry, "build") &&
77
+ (!Array.isArray(entry.build) ||
78
+ entry.build.length === 0 ||
79
+ !entry.build.every((part) => typeof part === "string" && part !== ""))
80
+ ) {
81
+ fail("invalid-definition", `${label}.build must be a non-empty array of non-empty strings`);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * The working-tree directories that path-sourced host extensions read, across every arm, so the committed-input
87
+ * check covers them.
88
+ *
89
+ * @param {Array<Array<any>>} extensionLists each arm's declared host extensions
90
+ * @param {string} root the definition root
91
+ */
92
+ export function sourceExtensionInputs(extensionLists, root) {
93
+ const inputs = new Set();
94
+ for (const extensions of extensionLists) {
95
+ for (const entry of extensions ?? []) {
96
+ if (isSourceExtension(entry) && typeof entry.path === "string") inputs.add(path.resolve(root, entry.path));
97
+ }
98
+ }
99
+ return [...inputs];
100
+ }
101
+
102
+ /**
103
+ * Replaces each arm's deferred source extensions with built ones, building each distinct source and build once.
104
+ * Package extensions pass through unchanged, in their declared order.
105
+ *
106
+ * @param {{ extensions: Record<string, any[]>, root: string, groupDirectory: string, signal?: AbortSignal }} options
107
+ * @returns {Promise<Record<string, any[]>>}
108
+ */
109
+ export async function prepareSourceExtensions({ extensions, root, groupDirectory, signal }) {
110
+ const builds = new Map();
111
+ const prepared = {};
112
+ for (const [arm, list] of Object.entries(extensions ?? {})) {
113
+ prepared[arm] = [];
114
+ for (const extension of list ?? []) {
115
+ if (extension?.pending === undefined) {
116
+ prepared[arm].push(extension);
117
+ continue;
118
+ }
119
+ const declared = extension.pending;
120
+ const key = JSON.stringify([declared.source ?? { path: declared.path }, declared.build ?? null]);
121
+ if (!builds.has(key)) {
122
+ const directory = path.join(groupDirectory, "resources", "host-extensions", String(builds.size));
123
+ builds.set(key, await buildSource(declared, { root, directory, signal }));
124
+ }
125
+ const built = builds.get(key);
126
+ const entry = await realpath(path.join(built.root, declared.entry)).catch(() => null);
127
+ if (entry === null || !isContained(built.root, entry) || !(await stat(entry)).isFile()) {
128
+ throw new Error(`host extension entry is missing from its build or escapes it: ${declared.entry}`);
129
+ }
130
+ prepared[arm].push({
131
+ path: entry,
132
+ source: built.source,
133
+ entry: declared.entry,
134
+ directory: path.relative(groupDirectory, built.root).split(path.sep).join("/"),
135
+ sha256: built.sha256,
136
+ build: built.build,
137
+ });
138
+ }
139
+ }
140
+ return prepared;
141
+ }
142
+
143
+ // definitions.mjs imports this module for validation, so the host and sandbox modules load only when building.
144
+ async function fingerprintDirectory(directory) {
145
+ const sandbox = await import("./sandbox.mjs");
146
+ return sandbox.fingerprintDirectory(directory);
147
+ }
148
+
149
+ async function buildSource(declared, { root, directory, signal }) {
150
+ const canonicalRoot = await realpath(root);
151
+ const tree = path.join(directory, "source");
152
+ await mkdir(directory, { recursive: true });
153
+ let source;
154
+ if (declared.source !== undefined) {
155
+ const { commit } = await archiveCommit(canonicalRoot, declared.source, tree);
156
+ source = { kind: "git", ref: declared.source.ref, path: declared.source.path, commit };
157
+ } else {
158
+ await snapshotPath(canonicalRoot, declared.path, tree);
159
+ source = { kind: "path", path: declared.path };
160
+ }
161
+
162
+ let build = null;
163
+ if (declared.build !== undefined) {
164
+ // The build gets the subject-style isolation: its own home, temp and Pi directories, no copied login.
165
+ const { prepareIsolation } = await import("./hosts/pi/isolation.mjs");
166
+ const isolation = await prepareIsolation(directory, null);
167
+ const { baseProcessEnvironment } = await import("./process.mjs");
168
+ const environment = { ...baseProcessEnvironment(), PWD: tree, ...isolation.environment };
169
+ let result;
170
+ try {
171
+ result = await runProcess(declared.build, { cwd: tree, environment, timeoutMs: BUILD_TIMEOUT_MS, signal });
172
+ } catch (error) {
173
+ throw new Error(`building host extension ${describe(source)} could not start: ${messageOf(error)}`);
174
+ }
175
+ build = {
176
+ argv: declared.build,
177
+ exitCode: result.exitCode,
178
+ signal: result.signal,
179
+ timedOut: result.timedOut,
180
+ durationMs: result.durationMs,
181
+ stdout: result.stdout.summary().tail.slice(-OUTPUT_TAIL_CHARACTERS),
182
+ stderr: result.stderr.summary().tail.slice(-OUTPUT_TAIL_CHARACTERS),
183
+ };
184
+ if (result.exitCode !== 0 || result.timedOut) {
185
+ const outcome = result.timedOut ? "timed out" : `exit ${result.exitCode ?? result.signal}`;
186
+ const detail = (build.stderr.trim() || build.stdout.trim()).slice(-1000);
187
+ throw new Error(`building host extension ${describe(source)} failed (${outcome})${detail ? `: ${detail}` : ""}`);
188
+ }
189
+ }
190
+ const builtRoot = await realpath(tree);
191
+ const files = await fingerprintDirectory(builtRoot);
192
+ return { root: builtRoot, source, build, sha256: sha256(JSON.stringify(files)) };
193
+ }
194
+
195
+ /** Extracts one directory of an exact commit with `git archive`, from the repository holding the definition root. */
196
+ async function archiveCommit(canonicalRoot, source, destination) {
197
+ const repositoryRoot = await realpath((await git(canonicalRoot, ["rev-parse", "--show-toplevel"])).trim());
198
+ if (!isContained(repositoryRoot, canonicalRoot)) throw new Error("definition root is not inside its Git repository");
199
+ const commit = (
200
+ await git(canonicalRoot, ["rev-parse", "--verify", "--end-of-options", `${source.ref}^{commit}`])
201
+ ).trim();
202
+ if (!/^[0-9a-f]{40,64}$/.test(commit)) throw new Error(`Git ref did not resolve to one commit: ${source.ref}`);
203
+ const prefix = path.relative(repositoryRoot, canonicalRoot).split(path.sep).join("/");
204
+ const gitPath = [prefix, source.path === "." ? "" : source.path].filter(Boolean).join("/");
205
+ const type = (
206
+ await git(repositoryRoot, ["cat-file", "-t", gitPath === "" ? commit : `${commit}:${gitPath}`]).catch(() => "")
207
+ ).trim();
208
+ if (type !== "tree") throw new Error(`host extension source ${source.path} is not a directory at ${commit}`);
209
+ await mkdir(destination, { recursive: true });
210
+ await pipeArchive(repositoryRoot, gitPath === "" ? commit : `${commit}:${gitPath}`, destination);
211
+ return { commit };
212
+ }
213
+
214
+ /** `git archive --format=tar <tree> | tar -x -C <destination>`. */
215
+ function pipeArchive(repositoryRoot, tree, destination) {
216
+ return new Promise((resolve, reject) => {
217
+ const archive = spawn("git", ["-C", repositoryRoot, "archive", "--format=tar", tree], {
218
+ shell: false,
219
+ stdio: ["ignore", "pipe", "pipe"],
220
+ });
221
+ const extract = spawn("tar", ["-x", "-f", "-", "-C", destination], {
222
+ shell: false,
223
+ stdio: ["pipe", "ignore", "pipe"],
224
+ });
225
+ archive.stdout.pipe(extract.stdin);
226
+ const errors = [];
227
+ archive.stderr.on("data", (chunk) => errors.push(chunk));
228
+ extract.stderr.on("data", (chunk) => errors.push(chunk));
229
+ let pending = 2;
230
+ let failed = null;
231
+ const done = (label) => (code) => {
232
+ if (code !== 0) failed ??= `${label} exited ${code}`;
233
+ pending -= 1;
234
+ if (pending > 0) return;
235
+ if (failed === null) resolve();
236
+ else reject(new Error(`extracting ${tree} failed (${failed}): ${Buffer.concat(errors).toString("utf8").trim()}`));
237
+ };
238
+ archive.once("error", reject);
239
+ extract.once("error", reject);
240
+ archive.once("close", done("git archive"));
241
+ extract.once("close", done("tar"));
242
+ });
243
+ }
244
+
245
+ /** Copies a committed working-tree directory, refusing one that changes while it is copied. */
246
+ async function snapshotPath(canonicalRoot, declaredPath, destination) {
247
+ const sourcePath = await realpath(path.resolve(canonicalRoot, declaredPath)).catch(() => null);
248
+ if (sourcePath === null || !isContained(canonicalRoot, sourcePath)) {
249
+ throw new Error(`host extension path is missing or escapes the definition root: ${declaredPath}`);
250
+ }
251
+ if (!(await lstat(sourcePath)).isDirectory())
252
+ throw new Error(`host extension path is not a directory: ${declaredPath}`);
253
+ const before = JSON.stringify(await fingerprintDirectory(sourcePath));
254
+ await cp(sourcePath, destination, { recursive: true, dereference: false, errorOnExist: true, force: false });
255
+ const copied = JSON.stringify(await fingerprintDirectory(destination));
256
+ const after = JSON.stringify(await fingerprintDirectory(sourcePath));
257
+ if (copied !== before || after !== before) {
258
+ throw new Error(`host extension path changed while it was being snapshotted: ${declaredPath}`);
259
+ }
260
+ }
261
+
262
+ function git(cwd, args) {
263
+ return new Promise((resolve, reject) => {
264
+ const child = spawn("git", ["-C", cwd, ...args], { shell: false, stdio: ["ignore", "pipe", "pipe"] });
265
+ const stdout = [];
266
+ const stderr = [];
267
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
268
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
269
+ child.once("error", reject);
270
+ child.once("close", (code) => {
271
+ if (code === 0) resolve(Buffer.concat(stdout).toString("utf8"));
272
+ else reject(new Error(`git ${args[0]} failed: ${Buffer.concat(stderr).toString("utf8").trim()}`));
273
+ });
274
+ });
275
+ }
276
+
277
+ function describe(source) {
278
+ return source.kind === "git" ? `${source.path} at ${source.commit.slice(0, 12)}` : source.path;
279
+ }
280
+
281
+ function sha256(value) {
282
+ return createHash("sha256").update(value).digest("hex");
283
+ }
284
+
285
+ function messageOf(error) {
286
+ return error instanceof Error ? error.message : String(error);
287
+ }
@@ -0,0 +1,74 @@
1
+ // `skill-eval clear`: a person's decision that a transcript-scan flag does not taint a run. The clearance is
2
+ // recorded beside the run in `clearances.json`, with the reason; the run's own files never change. Every aggregate
3
+ // that lists the run's result is then rebuilt, so the run counts again once none of its flags is left uncleared.
4
+
5
+ import { readdir, readFile, stat } from "node:fs/promises";
6
+ import path from "node:path";
7
+
8
+ import { clearFlags, unclearedFlags } from "./scan.mjs";
9
+ import { rebuildAggregate } from "./trials.mjs";
10
+ import { resolveResult } from "./view.mjs";
11
+
12
+ async function readJson(file) {
13
+ try {
14
+ return JSON.parse(await readFile(file, "utf8"));
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+
20
+ /**
21
+ * Clears flags of one run and rebuilds the aggregates that list its result.
22
+ *
23
+ * @param {string} target a result ID or directory (a trial, never an aggregate)
24
+ * @param {{ group?: string | null, variant?: string | null, flags: string[] | "all", reason: string, root?: string, results?: string | null }} options
25
+ */
26
+ export async function clearRun(
27
+ target,
28
+ { group = null, variant = null, flags, reason, root = process.cwd(), results = null },
29
+ ) {
30
+ const directory = await resolveResult(target, root, results);
31
+ if (await stat(path.join(directory, "aggregate.json")).catch(() => null)) {
32
+ throw new Error(
33
+ "clear names one trial's result, not an aggregate; view the aggregate to see which trial holds the run",
34
+ );
35
+ }
36
+ const summary = await readJson(path.join(directory, "summary.json"));
37
+ if (summary === null) throw new Error(`not a readable result: ${directory}`);
38
+ const groups = summary.groups ?? [];
39
+ const position = group !== null && /^\d+$/.test(group) ? Number(group) : null;
40
+ const selected =
41
+ group === null
42
+ ? groups
43
+ : groups.filter((entry) => (position === null ? entry.id === group : entry.position === position));
44
+ if (selected.length !== 1) {
45
+ throw new Error(
46
+ group === null ? "the result has several groups; name one with --group" : `no group ${group} in the result`,
47
+ );
48
+ }
49
+ const [chosen] = selected;
50
+ const arms = Object.keys(chosen.variants ?? {});
51
+ const arm = variant ?? (arms.length === 1 ? arms[0] : null);
52
+ if (arm === null || !arms.includes(arm)) {
53
+ throw new Error(
54
+ variant === null ? `name the arm with --variant: ${arms.join(", ")}` : `no arm ${arm} in group ${chosen.id}`,
55
+ );
56
+ }
57
+ const armDirectory = path.join(directory, "groups", chosen.id, arm);
58
+ const run = await readJson(path.join(armDirectory, "run.json"));
59
+ if (run === null) throw new Error(`the run of ${chosen.id} ${arm} is unreadable`);
60
+ const cleared = await clearFlags(armDirectory, run, flags, reason);
61
+ const remaining = await unclearedFlags(run, armDirectory);
62
+
63
+ // Every aggregate stored beside the result that lists it as a trial counts the run anew.
64
+ const runsDirectory = path.dirname(directory);
65
+ const rebuilt = [];
66
+ for (const entry of await readdir(runsDirectory, { withFileTypes: true })) {
67
+ if (!entry.isDirectory()) continue;
68
+ const aggregate = await readJson(path.join(runsDirectory, entry.name, "aggregate.json"));
69
+ if (aggregate?.kind !== "aggregate" || !(aggregate.trials ?? []).some((trial) => trial.id === summary.id)) continue;
70
+ await rebuildAggregate(path.join(runsDirectory, entry.name), { root, results: runsDirectory });
71
+ rebuilt.push(entry.name);
72
+ }
73
+ return { result: summary.id, group: chosen.id, arm, cleared, remaining, rebuilt };
74
+ }