pi-crew 0.9.16 → 0.9.17

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 (432) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21790 -0
  4. package/dist/index.mjs +83070 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/docs/A +358 -0
  7. package/docs/M-A +357 -0
  8. package/docs/REVIEW-FINDINGS-2026-06 +357 -0
  9. package/docs/Y +357 -0
  10. package/docs/a +357 -0
  11. package/docs/aA +358 -0
  12. package/docs/archive/README.md +91 -0
  13. package/docs/patterns/command-agent-skill.md +1 -1
  14. package/docs/skills/REFERENCE.md +0 -17
  15. package/docs//303/242mmaAAA/303/242 +357 -0
  16. package/index.bundle.ts +25 -0
  17. package/index.ts +95 -4
  18. package/package.json +15 -4
  19. package/skills/iterative-audit/SKILL.md +0 -1
  20. package/skills/widget-rendering/SKILL.md +17 -0
  21. package/src/adapters/claude-adapter.ts +1 -3
  22. package/src/adapters/export-util.ts +16 -16
  23. package/src/adapters/index.ts +5 -5
  24. package/src/agents/agent-config.ts +20 -14
  25. package/src/agents/agent-serializer.ts +1 -1
  26. package/src/agents/discover-agents.ts +83 -39
  27. package/src/benchmark/benchmark-runner.ts +51 -51
  28. package/src/benchmark/feedback-loop.ts +1 -1
  29. package/src/config/config.ts +166 -590
  30. package/src/config/defaults.ts +28 -2
  31. package/src/config/drift-detector.ts +11 -14
  32. package/src/config/markers.ts +201 -203
  33. package/src/config/resilient-parser.ts +14 -6
  34. package/src/config/role-tools.ts +3 -3
  35. package/src/config/suggestions.ts +5 -12
  36. package/src/config/types.ts +9 -25
  37. package/src/errors.ts +151 -157
  38. package/src/extension/action-suggestions.ts +54 -9
  39. package/src/extension/async-notifier.ts +43 -13
  40. package/src/extension/autonomous-policy.ts +77 -37
  41. package/src/extension/command-completions.ts +9 -8
  42. package/src/extension/context-status-injection.ts +14 -12
  43. package/src/extension/crew-autocomplete.ts +8 -16
  44. package/src/extension/crew-cleanup.ts +2 -1
  45. package/src/extension/crew-shortcuts.ts +9 -6
  46. package/src/extension/cross-extension-rpc.ts +136 -42
  47. package/src/extension/help.ts +1 -1
  48. package/src/extension/import-index.ts +10 -5
  49. package/src/extension/knowledge-injection.ts +88 -15
  50. package/src/extension/management.ts +89 -349
  51. package/src/extension/message-renderers.ts +3 -4
  52. package/src/extension/notification-router.ts +22 -5
  53. package/src/extension/notification-sink.ts +6 -3
  54. package/src/extension/pi-api.ts +17 -8
  55. package/src/extension/plan-orchestrate.ts +8 -27
  56. package/src/extension/project-init.ts +21 -6
  57. package/src/extension/register.ts +329 -975
  58. package/src/extension/registration/artifact-cleanup.ts +9 -4
  59. package/src/extension/registration/command-utils.ts +5 -1
  60. package/src/extension/registration/commands.ts +806 -314
  61. package/src/extension/registration/compaction-guard.ts +15 -15
  62. package/src/extension/registration/lifecycle.ts +259 -0
  63. package/src/extension/registration/observability.ts +293 -0
  64. package/src/extension/registration/subagent-helpers.ts +29 -7
  65. package/src/extension/registration/subagent-tools.ts +253 -44
  66. package/src/extension/registration/team-tool.ts +19 -84
  67. package/src/extension/registration/ui.ts +168 -0
  68. package/src/extension/registration/viewers.ts +64 -24
  69. package/src/extension/result-watcher.ts +18 -7
  70. package/src/extension/run-bundle-schema.ts +21 -6
  71. package/src/extension/run-export.ts +15 -6
  72. package/src/extension/run-import.ts +64 -29
  73. package/src/extension/run-index.ts +28 -9
  74. package/src/extension/run-maintenance.ts +32 -12
  75. package/src/extension/session-summary.ts +1 -1
  76. package/src/extension/team-manager-command.ts +64 -7
  77. package/src/extension/team-onboard.ts +151 -150
  78. package/src/extension/team-recommendation.ts +121 -21
  79. package/src/extension/team-tool/anchor.ts +31 -64
  80. package/src/extension/team-tool/api.ts +929 -141
  81. package/src/extension/team-tool/auto-summarize.ts +14 -26
  82. package/src/extension/team-tool/cache-control.ts +1 -5
  83. package/src/extension/team-tool/cancel.ts +138 -38
  84. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  85. package/src/extension/team-tool/chain-executor.ts +29 -51
  86. package/src/extension/team-tool/config-patch.ts +1 -1
  87. package/src/extension/team-tool/context.ts +40 -20
  88. package/src/extension/team-tool/destructive-gate.ts +10 -5
  89. package/src/extension/team-tool/doctor.ts +170 -51
  90. package/src/extension/team-tool/explain.ts +228 -214
  91. package/src/extension/team-tool/failure-patterns.ts +3 -9
  92. package/src/extension/team-tool/goal-wrap.ts +71 -29
  93. package/src/extension/team-tool/goal.ts +185 -35
  94. package/src/extension/team-tool/handle-schedule.ts +34 -15
  95. package/src/extension/team-tool/handle-settings.ts +94 -56
  96. package/src/extension/team-tool/health-monitor.ts +27 -108
  97. package/src/extension/team-tool/inspect.ts +42 -9
  98. package/src/extension/team-tool/intent-policy.ts +4 -1
  99. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  100. package/src/extension/team-tool/orchestrate.ts +7 -18
  101. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  102. package/src/extension/team-tool/plan.ts +29 -5
  103. package/src/extension/team-tool/respond.ts +49 -16
  104. package/src/extension/team-tool/run-not-found.ts +3 -8
  105. package/src/extension/team-tool/run.ts +80 -317
  106. package/src/extension/team-tool/status.ts +135 -43
  107. package/src/extension/team-tool/workflow-manage.ts +92 -25
  108. package/src/extension/team-tool-types.ts +8 -1
  109. package/src/extension/team-tool.ts +142 -551
  110. package/src/extension/validate-resources.ts +39 -8
  111. package/src/hooks/registry.ts +66 -17
  112. package/src/hooks/types.ts +1 -1
  113. package/src/i18n.ts +25 -11
  114. package/src/observability/correlation.ts +17 -3
  115. package/src/observability/event-bus.ts +51 -56
  116. package/src/observability/event-to-metric.ts +117 -15
  117. package/src/observability/exporters/otlp-exporter.ts +56 -17
  118. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  119. package/src/observability/metric-registry.ts +16 -4
  120. package/src/observability/metric-retention.ts +8 -2
  121. package/src/observability/metric-sink.ts +11 -3
  122. package/src/observability/metrics-primitives.ts +42 -9
  123. package/src/plugins/plugin-define.ts +2 -2
  124. package/src/plugins/plugin-registry.ts +25 -25
  125. package/src/plugins/plugins/index.ts +1 -1
  126. package/src/plugins/plugins/nextjs.ts +16 -16
  127. package/src/plugins/plugins/vite.ts +7 -11
  128. package/src/plugins/plugins/vitest.ts +6 -11
  129. package/src/runtime/adaptive-plan.ts +225 -40
  130. package/src/runtime/agent-control.ts +58 -15
  131. package/src/runtime/agent-memory.ts +15 -9
  132. package/src/runtime/agent-observability.ts +10 -2
  133. package/src/runtime/anchor-manager.ts +27 -25
  134. package/src/runtime/async-marker.ts +7 -1
  135. package/src/runtime/async-runner.ts +27 -23
  136. package/src/runtime/auto-summarize.ts +7 -13
  137. package/src/runtime/background-runner.ts +189 -251
  138. package/src/runtime/batch-barrier.ts +18 -16
  139. package/src/runtime/cancellation-token.ts +16 -6
  140. package/src/runtime/cancellation.ts +46 -8
  141. package/src/runtime/capability-inventory.ts +6 -4
  142. package/src/runtime/chain-parser.ts +44 -11
  143. package/src/runtime/chain-runner.ts +63 -69
  144. package/src/runtime/checkpoint.ts +12 -56
  145. package/src/runtime/child-pi.ts +343 -78
  146. package/src/runtime/coalesce-tasks.ts +268 -0
  147. package/src/runtime/code-summary.ts +71 -26
  148. package/src/runtime/compact-stages/index.ts +15 -5
  149. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  150. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  151. package/src/runtime/compaction-summary.ts +17 -10
  152. package/src/runtime/completion-guard.ts +33 -16
  153. package/src/runtime/crash-classification.ts +28 -7
  154. package/src/runtime/crash-recovery.ts +177 -37
  155. package/src/runtime/crew-agent-records.ts +145 -47
  156. package/src/runtime/crew-hooks.ts +9 -24
  157. package/src/runtime/cross-extension-rpc.ts +25 -23
  158. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  159. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  160. package/src/runtime/delivery-coordinator.ts +34 -7
  161. package/src/runtime/delta-conflict.ts +9 -21
  162. package/src/runtime/deterministic-ast.ts +1 -1
  163. package/src/runtime/diagnostic-export.ts +53 -20
  164. package/src/runtime/direct-run.ts +12 -2
  165. package/src/runtime/dwf-state-store.ts +1 -1
  166. package/src/runtime/dynamic-workflow-context.ts +186 -58
  167. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  168. package/src/runtime/effectiveness.ts +16 -8
  169. package/src/runtime/errors/crew-errors.ts +7 -11
  170. package/src/runtime/event-stream-bridge.ts +9 -3
  171. package/src/runtime/foreground-control.ts +54 -14
  172. package/src/runtime/foreground-watchdog.ts +9 -6
  173. package/src/runtime/goal-achievement.ts +27 -10
  174. package/src/runtime/goal-evaluator.ts +54 -19
  175. package/src/runtime/goal-loop-runner.ts +280 -99
  176. package/src/runtime/goal-state-store.ts +27 -17
  177. package/src/runtime/green-contract.ts +11 -2
  178. package/src/runtime/group-join.ts +64 -31
  179. package/src/runtime/handoff-manager.ts +37 -42
  180. package/src/runtime/heartbeat-gradient.ts +10 -2
  181. package/src/runtime/heartbeat-watcher.ts +32 -6
  182. package/src/runtime/hidden-handoff.ts +12 -30
  183. package/src/runtime/important-line-classifier.ts +12 -2
  184. package/src/runtime/iteration-hooks.ts +25 -15
  185. package/src/runtime/live-agent-control.ts +55 -7
  186. package/src/runtime/live-agent-manager.ts +130 -27
  187. package/src/runtime/live-control-realtime.ts +23 -3
  188. package/src/runtime/live-irc.ts +4 -1
  189. package/src/runtime/live-session-health.ts +12 -4
  190. package/src/runtime/live-session-runtime.ts +379 -117
  191. package/src/runtime/manifest-cache.ts +28 -12
  192. package/src/runtime/mcp-proxy.ts +8 -16
  193. package/src/runtime/metric-parser.ts +1 -5
  194. package/src/runtime/model-fallback.ts +55 -18
  195. package/src/runtime/model-resolver.ts +2 -6
  196. package/src/runtime/model-scope.ts +19 -3
  197. package/src/runtime/notebook-helpers.ts +60 -62
  198. package/src/runtime/orphan-worker-registry.ts +37 -26
  199. package/src/runtime/output-validator.ts +18 -3
  200. package/src/runtime/overflow-recovery.ts +5 -4
  201. package/src/runtime/parallel-research.ts +29 -5
  202. package/src/runtime/parallel-utils.ts +9 -11
  203. package/src/runtime/path-overlap.ts +150 -0
  204. package/src/runtime/peer-dep.ts +12 -17
  205. package/src/runtime/per-write-validator.ts +1 -3
  206. package/src/runtime/phase-tracker.ts +342 -330
  207. package/src/runtime/pi-args.ts +26 -8
  208. package/src/runtime/pi-json-output.ts +1 -1
  209. package/src/runtime/pi-spawn.ts +30 -19
  210. package/src/runtime/pipeline-runner.ts +56 -55
  211. package/src/runtime/plan-templates.ts +5 -6
  212. package/src/runtime/policy-engine.ts +43 -7
  213. package/src/runtime/post-checks.ts +12 -4
  214. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  215. package/src/runtime/process-lifecycle.ts +20 -10
  216. package/src/runtime/process-status.ts +16 -5
  217. package/src/runtime/progress-event-coalescer.ts +2 -1
  218. package/src/runtime/progress-tracker.ts +103 -103
  219. package/src/runtime/prose-compressor.ts +9 -11
  220. package/src/runtime/recovery-recipes.ts +118 -24
  221. package/src/runtime/replace.ts +25 -10
  222. package/src/runtime/resilient-edit.ts +10 -25
  223. package/src/runtime/result-extractor.ts +1 -2
  224. package/src/runtime/retry-executor.ts +20 -4
  225. package/src/runtime/retry-runner.ts +26 -50
  226. package/src/runtime/role-permission.ts +6 -1
  227. package/src/runtime/run-coalesced-task-group.ts +256 -0
  228. package/src/runtime/run-drift.ts +14 -15
  229. package/src/runtime/run-tracker.ts +6 -28
  230. package/src/runtime/runtime-policy.ts +1 -6
  231. package/src/runtime/runtime-resolver.ts +80 -15
  232. package/src/runtime/scheduler.ts +47 -18
  233. package/src/runtime/semaphore.ts +5 -7
  234. package/src/runtime/sensitive-paths.ts +2 -1
  235. package/src/runtime/session-usage.ts +1 -1
  236. package/src/runtime/settings-store.ts +16 -12
  237. package/src/runtime/sidechain-output.ts +6 -2
  238. package/src/runtime/single-agent-compose.ts +1 -4
  239. package/src/runtime/skill-effectiveness.ts +29 -97
  240. package/src/runtime/skill-instructions.ts +40 -83
  241. package/src/runtime/stale-reconciler.ts +73 -197
  242. package/src/runtime/stream-preview.ts +1 -1
  243. package/src/runtime/streaming-output.ts +1 -1
  244. package/src/runtime/subagent-manager.ts +44 -169
  245. package/src/runtime/subprocess-tool-registry.ts +4 -1
  246. package/src/runtime/supervisor-contact.ts +10 -5
  247. package/src/runtime/task-display.ts +19 -5
  248. package/src/runtime/task-graph-scheduler.ts +95 -21
  249. package/src/runtime/task-graph.ts +5 -11
  250. package/src/runtime/task-health.ts +54 -47
  251. package/src/runtime/task-id.ts +11 -18
  252. package/src/runtime/task-output-context.ts +265 -81
  253. package/src/runtime/task-packet.ts +12 -20
  254. package/src/runtime/task-quality.ts +6 -14
  255. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  256. package/src/runtime/task-runner/live-executor.ts +114 -36
  257. package/src/runtime/task-runner/output-splitter.ts +152 -0
  258. package/src/runtime/task-runner/progress.ts +50 -12
  259. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  260. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  261. package/src/runtime/task-runner/result-utils.ts +3 -1
  262. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  263. package/src/runtime/task-runner/run-projection.ts +27 -8
  264. package/src/runtime/task-runner/state-helpers.ts +29 -8
  265. package/src/runtime/task-runner/tail-read.ts +2 -6
  266. package/src/runtime/task-runner.ts +180 -326
  267. package/src/runtime/team-runner-artifacts.ts +13 -0
  268. package/src/runtime/team-runner.ts +456 -974
  269. package/src/runtime/tool-output-pruner.ts +6 -9
  270. package/src/runtime/tool-progress.ts +11 -21
  271. package/src/runtime/verification-gates.ts +33 -24
  272. package/src/runtime/verification-integrity.ts +1 -4
  273. package/src/runtime/verification-worktree.ts +62 -12
  274. package/src/runtime/worker-heartbeat.ts +5 -1
  275. package/src/runtime/worker-startup.ts +29 -5
  276. package/src/runtime/workflow-state.ts +17 -9
  277. package/src/runtime/workspace-lock.ts +30 -35
  278. package/src/runtime/workspace-tree.ts +20 -32
  279. package/src/runtime/yield-handler.ts +43 -9
  280. package/src/runtime/zombie-scanner.ts +5 -4
  281. package/src/schema/config-schema.ts +266 -172
  282. package/src/schema/team-tool-schema.ts +29 -74
  283. package/src/schema/validation-types.ts +25 -17
  284. package/src/skills/discover-skills.ts +35 -10
  285. package/src/skills/skill-templates.ts +109 -27
  286. package/src/skills/validate.ts +26 -8
  287. package/src/state/active-run-registry.ts +87 -28
  288. package/src/state/artifact-store.ts +9 -5
  289. package/src/state/atomic-write-v2.ts +85 -63
  290. package/src/state/atomic-write.ts +105 -26
  291. package/src/state/blob-store.ts +47 -20
  292. package/src/state/contracts.ts +20 -5
  293. package/src/state/crew-init.ts +5 -22
  294. package/src/state/decision-ledger.ts +19 -73
  295. package/src/state/event-log-rotation.ts +41 -15
  296. package/src/state/event-log.ts +168 -53
  297. package/src/state/event-reconstructor.ts +11 -1
  298. package/src/state/gitignore-manager.ts +2 -8
  299. package/src/state/health-store.ts +57 -57
  300. package/src/state/hook-instinct-bridge.ts +1 -1
  301. package/src/state/hook-integrations.ts +1 -1
  302. package/src/state/instinct-store.ts +17 -5
  303. package/src/state/jsonl-writer.ts +1 -1
  304. package/src/state/locks.ts +23 -9
  305. package/src/state/mailbox.ts +151 -28
  306. package/src/state/observation-store.ts +20 -14
  307. package/src/state/run-cache.ts +142 -135
  308. package/src/state/run-graph.ts +6 -15
  309. package/src/state/run-metrics.ts +5 -18
  310. package/src/state/schedule.ts +15 -9
  311. package/src/state/state-store.ts +129 -45
  312. package/src/state/task-claims.ts +12 -2
  313. package/src/state/tiered-eval.ts +52 -43
  314. package/src/state/types-eval.ts +2 -2
  315. package/src/state/types.ts +24 -20
  316. package/src/state/usage.ts +20 -4
  317. package/src/state/worker-atomic-writer.ts +6 -3
  318. package/src/subagents/index.ts +2 -2
  319. package/src/teams/discover-teams.ts +21 -6
  320. package/src/tools/safe-bash-extension.ts +5 -6
  321. package/src/tools/safe-bash.ts +10 -11
  322. package/src/types/new-api-types.ts +6 -10
  323. package/src/ui/agent-management-overlay.ts +52 -40
  324. package/src/ui/card-colors.ts +13 -4
  325. package/src/ui/crew-footer.ts +8 -7
  326. package/src/ui/crew-select-list.ts +1 -1
  327. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  328. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  329. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  330. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  331. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  332. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  333. package/src/ui/heartbeat-aggregator.ts +15 -4
  334. package/src/ui/keybinding-map.ts +40 -7
  335. package/src/ui/live-conversation-overlay.ts +36 -20
  336. package/src/ui/live-duration.ts +1 -4
  337. package/src/ui/live-run-sidebar.ts +88 -25
  338. package/src/ui/loaders.ts +2 -8
  339. package/src/ui/mascot.ts +20 -36
  340. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  341. package/src/ui/overlays/confirm-overlay.ts +4 -2
  342. package/src/ui/overlays/help-overlay.ts +25 -14
  343. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  344. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  345. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  346. package/src/ui/pi-ui-compat.ts +7 -7
  347. package/src/ui/powerbar-publisher.ts +120 -42
  348. package/src/ui/render-diff.ts +10 -3
  349. package/src/ui/render-scheduler.ts +12 -4
  350. package/src/ui/run-action-dispatcher.ts +81 -18
  351. package/src/ui/run-dashboard.ts +172 -76
  352. package/src/ui/run-event-bus.ts +59 -37
  353. package/src/ui/run-snapshot-cache.ts +276 -86
  354. package/src/ui/settings-overlay.ts +361 -74
  355. package/src/ui/status-colors.ts +12 -1
  356. package/src/ui/syntax-highlight.ts +1 -1
  357. package/src/ui/theme-adapter.ts +16 -14
  358. package/src/ui/theme-discovery.ts +13 -2
  359. package/src/ui/tool-progress-formatter.ts +7 -7
  360. package/src/ui/tool-render.ts +128 -56
  361. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  362. package/src/ui/tool-renderers/index.ts +109 -43
  363. package/src/ui/transcript-cache.ts +32 -6
  364. package/src/ui/transcript-entries.ts +25 -23
  365. package/src/ui/transcript-viewer.ts +78 -29
  366. package/src/ui/widget/index.ts +99 -40
  367. package/src/ui/widget/widget-formatters.ts +13 -6
  368. package/src/ui/widget/widget-model.ts +19 -8
  369. package/src/ui/widget/widget-renderer.ts +23 -13
  370. package/src/ui/widget/widget-types.ts +1 -1
  371. package/src/utils/bm25-search.ts +199 -199
  372. package/src/utils/conflict-detect.ts +22 -21
  373. package/src/utils/env-filter.ts +14 -7
  374. package/src/utils/file-coalescer.ts +5 -1
  375. package/src/utils/fingerprint.ts +3 -6
  376. package/src/utils/frontmatter.ts +3 -1
  377. package/src/utils/fs-watch.ts +2 -6
  378. package/src/utils/gh-protocol.ts +119 -44
  379. package/src/utils/git.ts +13 -15
  380. package/src/utils/guards.ts +2 -5
  381. package/src/utils/ids.ts +9 -2
  382. package/src/utils/incremental-reader.ts +14 -3
  383. package/src/utils/internal-error.ts +2 -1
  384. package/src/utils/names.ts +12 -3
  385. package/src/utils/paths.ts +49 -5
  386. package/src/utils/project-detector.ts +2 -2
  387. package/src/utils/redaction.ts +29 -19
  388. package/src/utils/resolve-shell.ts +9 -7
  389. package/src/utils/run-watcher-registry.ts +19 -31
  390. package/src/utils/safe-paths.ts +45 -24
  391. package/src/utils/scan-cache.ts +9 -2
  392. package/src/utils/session-utils.ts +2 -4
  393. package/src/utils/sleep.ts +12 -5
  394. package/src/utils/sse-parser.ts +5 -17
  395. package/src/utils/visual.ts +52 -32
  396. package/src/workflows/discover-workflows.ts +41 -109
  397. package/src/workflows/intermediate-store.ts +5 -21
  398. package/src/workflows/preflight-validator.ts +6 -33
  399. package/src/workflows/topology-analyzer.ts +5 -21
  400. package/src/workflows/workflow-config.ts +7 -6
  401. package/src/worktree/branch-freshness.ts +66 -8
  402. package/src/worktree/cleanup.ts +130 -20
  403. package/src/worktree/worktree-manager.ts +212 -69
  404. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  405. package/skills/detection-pipeline-design/SKILL.md +0 -286
  406. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  407. package/skills/incident-playbook-construction/SKILL.md +0 -384
  408. package/skills/security-review/SKILL.md +0 -561
  409. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  410. package/skills/ui-render-performance/SKILL.md +0 -58
  411. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  412. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  413. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  414. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  415. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  416. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  417. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  418. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  419. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  420. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  421. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  422. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  430. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  431. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  432. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -2,10 +2,10 @@ import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import { appendEvent } from "../state/event-log.ts";
4
4
  import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
5
- import { checkProcessLiveness, isActiveRunStatus } from "./process-status.ts";
6
- import { readCrewAgents } from "./crew-agent-records.ts";
7
5
  import { logInternalError } from "../utils/internal-error.ts";
8
6
  import { sleepSync } from "../utils/sleep.ts";
7
+ import { readCrewAgents } from "./crew-agent-records.ts";
8
+ import { checkProcessLiveness, isActiveRunStatus } from "./process-status.ts";
9
9
 
10
10
  export type ForegroundControlRequestType = "interrupt" | "status";
11
11
 
@@ -36,7 +36,9 @@ export function foregroundControlPath(manifest: TeamRunManifest): string {
36
36
  function readLastRequest(controlPath: string): ForegroundControlRequest | undefined {
37
37
  if (!fs.existsSync(controlPath)) return undefined;
38
38
  try {
39
- const parsed = JSON.parse(fs.readFileSync(controlPath, "utf-8")) as { requests?: ForegroundControlRequest[] };
39
+ const parsed = JSON.parse(fs.readFileSync(controlPath, "utf-8")) as {
40
+ requests?: ForegroundControlRequest[];
41
+ };
40
42
  return parsed.requests?.at(-1);
41
43
  } catch {
42
44
  return undefined;
@@ -53,13 +55,18 @@ export function readForegroundControlStatus(manifest: TeamRunManifest, tasks: Te
53
55
  asyncPid: manifest.async?.pid,
54
56
  asyncAlive,
55
57
  runningTasks: tasks.filter((task) => task.status === "running").map((task) => task.id),
56
- runningAgents: readCrewAgents(manifest).filter((agent) => agent.status === "running").map((agent) => agent.id),
58
+ runningAgents: readCrewAgents(manifest)
59
+ .filter((agent) => agent.status === "running")
60
+ .map((agent) => agent.id),
57
61
  controlPath,
58
62
  lastRequest: readLastRequest(controlPath),
59
63
  };
60
64
  }
61
65
 
62
- export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reason = "User requested foreground interrupt."): ForegroundControlRequest {
66
+ export function writeForegroundInterruptRequest(
67
+ manifest: TeamRunManifest,
68
+ reason = "User requested foreground interrupt.",
69
+ ): ForegroundControlRequest {
63
70
  const controlPath = foregroundControlPath(manifest);
64
71
  const lockDir = `${controlPath}.lock`;
65
72
  const pidFile = path.join(lockDir, "pid");
@@ -74,7 +81,11 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
74
81
  while (true) {
75
82
  try {
76
83
  fs.mkdirSync(lockDir, { recursive: true });
77
- try { fs.writeFileSync(pidFile, String(process.pid), "utf-8"); } catch { /* best-effort */ }
84
+ try {
85
+ fs.writeFileSync(pidFile, String(process.pid), "utf-8");
86
+ } catch {
87
+ /* best-effort */
88
+ }
78
89
  break;
79
90
  } catch {
80
91
  if (Date.now() - start > timeout) {
@@ -84,10 +95,18 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
84
95
  const ownerPid = Number.parseInt(raw, 10);
85
96
  if (!Number.isNaN(ownerPid) && ownerPid !== process.pid) {
86
97
  let alive = false;
87
- try { process.kill(ownerPid, 0); alive = true; } catch { /* dead */ }
98
+ try {
99
+ process.kill(ownerPid, 0);
100
+ alive = true;
101
+ } catch {
102
+ /* dead */
103
+ }
88
104
  if (!alive) {
89
105
  // Lock is stale — clear it and retry
90
- fs.rmSync(lockDir, { recursive: true, force: true });
106
+ fs.rmSync(lockDir, {
107
+ recursive: true,
108
+ force: true,
109
+ });
91
110
  continue;
92
111
  }
93
112
  // Lock held by live process — throw
@@ -95,7 +114,9 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
95
114
  logInternalError("foreground-control.lock-timeout", err, `controlPath=${controlPath}`);
96
115
  throw err;
97
116
  }
98
- } catch { /* no pid file — continue to throw */ }
117
+ } catch {
118
+ /* no pid file — continue to throw */
119
+ }
99
120
  const err = new Error(`Foreground control lock timeout for ${controlPath}`);
100
121
  logInternalError("foreground-control.lock-timeout", err, `controlPath=${controlPath}`);
101
122
  throw err;
@@ -106,23 +127,37 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
106
127
  const ownerPid = Number.parseInt(raw, 10);
107
128
  if (!Number.isNaN(ownerPid) && ownerPid !== process.pid) {
108
129
  let alive = false;
109
- try { process.kill(ownerPid, 0); alive = true; } catch { /* dead */ }
130
+ try {
131
+ process.kill(ownerPid, 0);
132
+ alive = true;
133
+ } catch {
134
+ /* dead */
135
+ }
110
136
  if (!alive) {
111
137
  const stat = fs.statSync(lockDir);
112
138
  if (Date.now() - stat.mtimeMs > staleMs) {
113
- fs.rmSync(lockDir, { recursive: true, force: true });
139
+ fs.rmSync(lockDir, {
140
+ recursive: true,
141
+ force: true,
142
+ });
114
143
  continue;
115
144
  }
116
145
  }
117
146
  }
118
- } catch { /* no pid file — fall through to sleep */ }
147
+ } catch {
148
+ /* no pid file — fall through to sleep */
149
+ }
119
150
  // Brief sleep to avoid CPU spinning
120
151
  sleepSync(10);
121
152
  }
122
153
  }
123
154
  };
124
155
  const releaseLock = (): void => {
125
- try { fs.rmSync(lockDir, { recursive: true, force: true }); } catch { /* best-effort */ }
156
+ try {
157
+ fs.rmSync(lockDir, { recursive: true, force: true });
158
+ } catch {
159
+ /* best-effort */
160
+ }
126
161
  };
127
162
 
128
163
  acquireLock();
@@ -144,7 +179,12 @@ export function writeForegroundInterruptRequest(manifest: TeamRunManifest, reaso
144
179
  };
145
180
  fs.mkdirSync(path.dirname(controlPath), { recursive: true });
146
181
  fs.writeFileSync(controlPath, `${JSON.stringify({ requests: [...requests, request] }, null, 2)}\n`, "utf-8");
147
- appendEvent(manifest.eventsPath, { type: "foreground.interrupt_requested", runId: manifest.runId, message: reason, data: { requestId: request.id, controlPath } });
182
+ appendEvent(manifest.eventsPath, {
183
+ type: "foreground.interrupt_requested",
184
+ runId: manifest.runId,
185
+ message: reason,
186
+ data: { requestId: request.id, controlPath },
187
+ });
148
188
  return request;
149
189
  } finally {
150
190
  releaseLock();
@@ -90,11 +90,12 @@ export function startForegroundWatchdog(opts: WatchdogOptions): void {
90
90
  if (!isActiveRunStatus(manifest.status)) {
91
91
  const teamName = manifest.team ?? "unknown";
92
92
  try {
93
- pi.sendUserMessage(
94
- `pi-crew run ${manifest.status}: ${runId} (${teamName}/${manifest.workflow ?? "default"})`,
95
- { deliverAs: "followUp" },
96
- );
97
- } catch { /* non-critical */ }
93
+ pi.sendUserMessage(`pi-crew run ${manifest.status}: ${runId} (${teamName}/${manifest.workflow ?? "default"})`, {
94
+ deliverAs: "followUp",
95
+ });
96
+ } catch {
97
+ /* non-critical */
98
+ }
98
99
  activeWatchdogs.delete(runId);
99
100
  return;
100
101
  }
@@ -109,7 +110,9 @@ export function startForegroundWatchdog(opts: WatchdogOptions): void {
109
110
  `pi-crew watchdog: run ${runId} appears hung (${detail}). Consider running team action='cancel' runId='${runId}' or team action='doctor'.`,
110
111
  { deliverAs: "followUp" },
111
112
  );
112
- } catch { /* non-critical */ }
113
+ } catch {
114
+ /* non-critical */
115
+ }
113
116
  // Don't stop — keep monitoring. The assistant or user may intervene.
114
117
  }
115
118
  } catch {
@@ -19,8 +19,8 @@
19
19
  */
20
20
  import { spawnSync } from "node:child_process";
21
21
  import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
22
- import type { WorkflowConfig } from "../workflows/workflow-config.ts";
23
22
  import { findRepoRoot } from "../utils/paths.ts";
23
+ import type { WorkflowConfig } from "../workflows/workflow-config.ts";
24
24
 
25
25
  /**
26
26
  * Roles whose job is to EDIT project source/test files (changes that appear in
@@ -71,18 +71,30 @@ export function assessGoalAchievement(
71
71
  // (1) Only code-mutating workflows can be false-green. Read-only/doc runs
72
72
  // legitimately make no project edits — never accuse them.
73
73
  if (!workflowIsMutating(workflow)) {
74
- return { achieved: "unknown", reason: "read-only / doc-only workflow (no executor/test-engineer steps)", signals: [] };
74
+ return {
75
+ achieved: "unknown",
76
+ reason: "read-only / doc-only workflow (no executor/test-engineer steps)",
77
+ signals: [],
78
+ };
75
79
  }
76
80
 
77
81
  // (2) Need a git repo to inspect the working tree.
78
82
  const tree = isGitWorkingTreeClean(manifest.cwd);
79
83
  if (tree.clean === "unknown" || !tree.repoRoot) {
80
- return { achieved: "unknown", reason: "not a git repo or git unavailable", signals: [] };
84
+ return {
85
+ achieved: "unknown",
86
+ reason: "not a git repo or git unavailable",
87
+ signals: [],
88
+ };
81
89
  }
82
90
 
83
91
  // (3) Non-empty working tree → the mutating run made edits. Achieved.
84
92
  if (!tree.clean) {
85
- return { achieved: true, reason: "git working tree has changes (mutating run edited project files)", signals: [`repoRoot=${tree.repoRoot}`] };
93
+ return {
94
+ achieved: true,
95
+ reason: "git working tree has changes (mutating run edited project files)",
96
+ signals: [`repoRoot=${tree.repoRoot}`],
97
+ };
86
98
  }
87
99
 
88
100
  // (4) Mutating run + CLEAN working tree → suspicious. The executor's job was
@@ -113,13 +125,18 @@ export function applyGoalAchievement(
113
125
  manifest: TeamRunManifest,
114
126
  assessment: GoalAchievementAssessment,
115
127
  ): { manifest: TeamRunManifest; downgraded: boolean } {
116
- const note = assessment.achieved === false
117
- ? `goal-achievement: FALSE-GREEN — ${assessment.reason}. ${assessment.signals.join("; ")}`
118
- : assessment.achieved === true
119
- ? `goal-achievement: OK ${assessment.reason}`
120
- : `goal-achievement: unknown — ${assessment.reason}`;
128
+ const note =
129
+ assessment.achieved === false
130
+ ? `goal-achievement: FALSE-GREEN — ${assessment.reason}. ${assessment.signals.join("; ")}`
131
+ : assessment.achieved === true
132
+ ? `goal-achievement: OK — ${assessment.reason}`
133
+ : `goal-achievement: unknown — ${assessment.reason}`;
121
134
 
122
- const updated: TeamRunManifest = { ...manifest, goalAchieved: assessment.achieved, goalAchievementNote: note };
135
+ const updated: TeamRunManifest = {
136
+ ...manifest,
137
+ goalAchieved: assessment.achieved,
138
+ goalAchievementNote: note,
139
+ };
123
140
 
124
141
  // Downgrade only on the highest-confidence false-green: a failed task
125
142
  // corroborates that the run genuinely did not succeed.
@@ -23,15 +23,15 @@
23
23
  * + verification-gates results + transcript tail (~8 KiB bounded read).
24
24
  */
25
25
 
26
- import { readFileSync, existsSync } from "node:fs";
26
+ import { existsSync, readFileSync } from "node:fs";
27
+ import type { AgentConfig } from "../agents/agent-config.ts";
28
+ import type { GoalVerdict } from "../state/types.ts";
29
+ import { logInternalError } from "../utils/internal-error.ts";
30
+ import { redactSecretString } from "../utils/redaction.ts";
27
31
  import { runChildPi } from "./child-pi.ts";
32
+ import { collectToolCallsFromEvent } from "./completion-guard.ts";
28
33
  import { parsePiJsonOutput } from "./pi-json-output.ts";
29
34
  import { extractStructuredResult } from "./result-extractor.ts";
30
- import { collectToolCallsFromEvent } from "./completion-guard.ts";
31
- import { logInternalError } from "../utils/internal-error.ts";
32
- import { redactSecretString } from "../utils/redaction.ts";
33
- import type { AgentConfig } from "../agents/agent-config.ts";
34
- import type { GoalVerdict } from "../state/types.ts";
35
35
 
36
36
  export interface GoalEvidence {
37
37
  /** Tail slice of the turn's worker transcript (bounded ~8 KiB). */
@@ -39,7 +39,11 @@ export interface GoalEvidence {
39
39
  /** Structured tool-call summary extracted from transcript events. */
40
40
  toolCalls: Array<{ tool: string; args?: unknown }>;
41
41
  /** Verification command results (exit codes + output refs), if verification ran. */
42
- verificationResults?: Array<{ command: string; exitCode: number | null; passed: boolean }>;
42
+ verificationResults?: Array<{
43
+ command: string;
44
+ exitCode: number | null;
45
+ passed: boolean;
46
+ }>;
43
47
  }
44
48
 
45
49
  export interface EvaluateGoalInput {
@@ -102,10 +106,7 @@ Respond with ONLY a single JSON object, no prose, no markdown fences:
102
106
 
103
107
  /** Build the judge task prompt: objective + scope + verification + evidence. */
104
108
  function buildJudgeTask(input: EvaluateGoalInput): string {
105
- const lines: string[] = [
106
- "# Goal to evaluate",
107
- input.objective,
108
- ];
109
+ const lines: string[] = ["# Goal to evaluate", input.objective];
109
110
  if (input.scope) lines.push("", "# Scope (allowed changes)", input.scope);
110
111
  if (input.verification?.commands?.length) {
111
112
  lines.push("", "# Acceptance verification (ALL must pass with exit code 0)", ...input.verification.commands.map((c) => `- ${c}`));
@@ -118,7 +119,9 @@ function buildJudgeTask(input: EvaluateGoalInput): string {
118
119
  lines.push("", "# ⚠ VERIFICATION COMPROMISED — objective oracle UNRELIABLE for this turn");
119
120
  lines.push("The following project-manifest files changed during the loop (detected by integrity snapshot):");
120
121
  lines.push(...input.verificationCompromised.map((f) => `- ${f}`));
121
- lines.push("Do NOT trust any verification-result 'PASS' for this turn. A worker may have rewritten the manifest to satisfy the command. Judge completion SOLELY from the transcript + artifact evidence, and default to achieved:false unless the transcript shows concrete finished work that does not depend on the compromised command.");
122
+ lines.push(
123
+ "Do NOT trust any verification-result 'PASS' for this turn. A worker may have rewritten the manifest to satisfy the command. Judge completion SOLELY from the transcript + artifact evidence, and default to achieved:false unless the transcript shows concrete finished work that does not depend on the compromised command.",
124
+ );
122
125
  }
123
126
  lines.push("", "# Evidence");
124
127
  if (input.evidence.verificationResults?.length) {
@@ -170,7 +173,11 @@ function tryParseDirectVerdict(stdout: string): { achieved: boolean; reason: str
170
173
  const parsed = JSON.parse(trimmed) as Record<string, unknown>;
171
174
  if (typeof parsed.achieved !== "boolean" || typeof parsed.reason !== "string") return undefined;
172
175
  const refs = Array.isArray(parsed.evidenceRefs) ? parsed.evidenceRefs.filter((r): r is string => typeof r === "string") : undefined;
173
- return { achieved: parsed.achieved, reason: parsed.reason, ...(refs ? { evidenceRefs: refs } : {}) };
176
+ return {
177
+ achieved: parsed.achieved,
178
+ reason: parsed.reason,
179
+ ...(refs ? { evidenceRefs: refs } : {}),
180
+ };
174
181
  } catch {
175
182
  return undefined;
176
183
  }
@@ -205,7 +212,12 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
205
212
  });
206
213
 
207
214
  if (result.exitCode !== 0 || result.error) {
208
- return blockedVerdict(input.turn, input.model, evaluatedAt, `judge spawn failed (exit=${result.exitCode}): ${result.error ?? result.stderr.slice(0, 200)}`);
215
+ return blockedVerdict(
216
+ input.turn,
217
+ input.model,
218
+ evaluatedAt,
219
+ `judge spawn failed (exit=${result.exitCode}): ${result.error ?? result.stderr.slice(0, 200)}`,
220
+ );
209
221
  }
210
222
 
211
223
  const parsed = parsePiJsonOutput(result.stdout);
@@ -232,11 +244,19 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
232
244
  }
233
245
 
234
246
  const extracted = extractStructuredResult(finalText);
235
- const data = extracted.structured ? (extracted.data as { achieved?: unknown; reason?: unknown; evidenceRefs?: unknown }) : undefined;
247
+ const data = extracted.structured
248
+ ? (extracted.data as {
249
+ achieved?: unknown;
250
+ reason?: unknown;
251
+ evidenceRefs?: unknown;
252
+ })
253
+ : undefined;
236
254
  if (!data || typeof data.achieved !== "boolean" || typeof data.reason !== "string") {
237
255
  return blockedVerdict(input.turn, input.model, evaluatedAt, `judge output not valid verdict JSON: ${truncate(finalText, 200)}`);
238
256
  }
239
- const evidenceRefs = Array.isArray(data.evidenceRefs) ? data.evidenceRefs.filter((r): r is string => typeof r === "string") : undefined;
257
+ const evidenceRefs = Array.isArray(data.evidenceRefs)
258
+ ? data.evidenceRefs.filter((r): r is string => typeof r === "string")
259
+ : undefined;
240
260
  return {
241
261
  turn: input.turn,
242
262
  achieved: data.achieved,
@@ -247,12 +267,23 @@ export async function evaluateGoal(input: EvaluateGoalInput): Promise<GoalVerdic
247
267
  };
248
268
  } catch (error) {
249
269
  logInternalError("goal-evaluator.evaluateGoal", error, `turn=${input.turn}`);
250
- return blockedVerdict(input.turn, input.model, evaluatedAt, `judge threw: ${error instanceof Error ? error.message : String(error)}`);
270
+ return blockedVerdict(
271
+ input.turn,
272
+ input.model,
273
+ evaluatedAt,
274
+ `judge threw: ${error instanceof Error ? error.message : String(error)}`,
275
+ );
251
276
  }
252
277
  }
253
278
 
254
279
  function blockedVerdict(turn: number, model: string, evaluatedAt: string, reason: string): GoalVerdict {
255
- return { turn, achieved: false, reason: `BLOCKED: ${reason}`, evaluatorModel: model, evaluatedAt };
280
+ return {
281
+ turn,
282
+ achieved: false,
283
+ reason: `BLOCKED: ${reason}`,
284
+ evaluatorModel: model,
285
+ evaluatedAt,
286
+ };
256
287
  }
257
288
 
258
289
  /**
@@ -290,5 +321,9 @@ export function bundleEvidence(
290
321
  }
291
322
  }
292
323
 
293
- return { transcriptSlice, toolCalls: toolCalls.slice(-50), verificationResults };
324
+ return {
325
+ transcriptSlice,
326
+ toolCalls: toolCalls.slice(-50),
327
+ verificationResults,
328
+ };
294
329
  }