pi-crew 0.9.16 → 0.9.18

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 (435) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21784 -0
  4. package/dist/index.mjs +83169 -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/migration/atomic-write-v2-migration.md +297 -0
  14. package/docs/patterns/command-agent-skill.md +1 -1
  15. package/docs/perf/performance-review-2026-07.md +287 -0
  16. package/docs/skills/REFERENCE.md +0 -17
  17. package/docs//303/242mmaAAA/303/242 +357 -0
  18. package/index.bundle.ts +25 -0
  19. package/index.ts +95 -4
  20. package/package.json +15 -4
  21. package/skills/iterative-audit/SKILL.md +0 -1
  22. package/skills/widget-rendering/SKILL.md +17 -0
  23. package/src/adapters/claude-adapter.ts +1 -3
  24. package/src/adapters/export-util.ts +16 -16
  25. package/src/adapters/index.ts +5 -5
  26. package/src/agents/agent-config.ts +20 -14
  27. package/src/agents/agent-serializer.ts +1 -1
  28. package/src/agents/discover-agents.ts +83 -39
  29. package/src/benchmark/benchmark-runner.ts +51 -51
  30. package/src/benchmark/feedback-loop.ts +1 -1
  31. package/src/config/config.ts +303 -591
  32. package/src/config/defaults.ts +28 -2
  33. package/src/config/drift-detector.ts +11 -14
  34. package/src/config/markers.ts +201 -203
  35. package/src/config/resilient-parser.ts +14 -6
  36. package/src/config/role-tools.ts +3 -3
  37. package/src/config/suggestions.ts +5 -12
  38. package/src/config/types.ts +9 -25
  39. package/src/errors.ts +151 -157
  40. package/src/extension/action-suggestions.ts +54 -9
  41. package/src/extension/async-notifier.ts +43 -13
  42. package/src/extension/autonomous-policy.ts +77 -37
  43. package/src/extension/command-completions.ts +9 -8
  44. package/src/extension/context-status-injection.ts +14 -12
  45. package/src/extension/crew-autocomplete.ts +8 -16
  46. package/src/extension/crew-cleanup.ts +2 -1
  47. package/src/extension/crew-shortcuts.ts +9 -6
  48. package/src/extension/cross-extension-rpc.ts +136 -42
  49. package/src/extension/help.ts +1 -1
  50. package/src/extension/import-index.ts +10 -5
  51. package/src/extension/knowledge-injection.ts +88 -15
  52. package/src/extension/management.ts +89 -349
  53. package/src/extension/message-renderers.ts +3 -4
  54. package/src/extension/notification-router.ts +22 -5
  55. package/src/extension/notification-sink.ts +6 -3
  56. package/src/extension/pi-api.ts +17 -8
  57. package/src/extension/plan-orchestrate.ts +8 -27
  58. package/src/extension/project-init.ts +21 -6
  59. package/src/extension/register.ts +329 -975
  60. package/src/extension/registration/artifact-cleanup.ts +9 -4
  61. package/src/extension/registration/command-utils.ts +5 -1
  62. package/src/extension/registration/commands.ts +806 -314
  63. package/src/extension/registration/compaction-guard.ts +15 -15
  64. package/src/extension/registration/lifecycle.ts +259 -0
  65. package/src/extension/registration/observability.ts +293 -0
  66. package/src/extension/registration/subagent-helpers.ts +29 -7
  67. package/src/extension/registration/subagent-tools.ts +253 -44
  68. package/src/extension/registration/team-tool.ts +19 -84
  69. package/src/extension/registration/ui.ts +168 -0
  70. package/src/extension/registration/viewers.ts +64 -24
  71. package/src/extension/result-watcher.ts +18 -7
  72. package/src/extension/run-bundle-schema.ts +21 -6
  73. package/src/extension/run-export.ts +15 -6
  74. package/src/extension/run-import.ts +64 -29
  75. package/src/extension/run-index.ts +28 -9
  76. package/src/extension/run-maintenance.ts +32 -12
  77. package/src/extension/session-summary.ts +1 -1
  78. package/src/extension/team-manager-command.ts +64 -7
  79. package/src/extension/team-onboard.ts +149 -150
  80. package/src/extension/team-recommendation.ts +121 -21
  81. package/src/extension/team-tool/anchor.ts +31 -64
  82. package/src/extension/team-tool/api.ts +929 -141
  83. package/src/extension/team-tool/auto-summarize.ts +14 -26
  84. package/src/extension/team-tool/cache-control.ts +1 -5
  85. package/src/extension/team-tool/cancel.ts +138 -38
  86. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  87. package/src/extension/team-tool/chain-executor.ts +29 -51
  88. package/src/extension/team-tool/config-patch.ts +1 -1
  89. package/src/extension/team-tool/context.ts +40 -20
  90. package/src/extension/team-tool/destructive-gate.ts +10 -5
  91. package/src/extension/team-tool/doctor.ts +170 -51
  92. package/src/extension/team-tool/explain.ts +228 -214
  93. package/src/extension/team-tool/failure-patterns.ts +3 -9
  94. package/src/extension/team-tool/goal-wrap.ts +71 -29
  95. package/src/extension/team-tool/goal.ts +185 -35
  96. package/src/extension/team-tool/handle-schedule.ts +34 -15
  97. package/src/extension/team-tool/handle-settings.ts +94 -56
  98. package/src/extension/team-tool/health-monitor.ts +27 -108
  99. package/src/extension/team-tool/inspect.ts +42 -9
  100. package/src/extension/team-tool/intent-policy.ts +4 -1
  101. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  102. package/src/extension/team-tool/orchestrate.ts +7 -18
  103. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  104. package/src/extension/team-tool/plan.ts +29 -5
  105. package/src/extension/team-tool/respond.ts +49 -16
  106. package/src/extension/team-tool/run-not-found.ts +3 -8
  107. package/src/extension/team-tool/run.ts +80 -317
  108. package/src/extension/team-tool/status.ts +135 -43
  109. package/src/extension/team-tool/workflow-manage.ts +92 -25
  110. package/src/extension/team-tool-types.ts +8 -1
  111. package/src/extension/team-tool.ts +142 -551
  112. package/src/extension/validate-resources.ts +39 -8
  113. package/src/hooks/registry.ts +66 -17
  114. package/src/hooks/types.ts +1 -1
  115. package/src/i18n.ts +25 -11
  116. package/src/observability/correlation.ts +17 -3
  117. package/src/observability/event-bus.ts +51 -56
  118. package/src/observability/event-to-metric.ts +117 -15
  119. package/src/observability/exporters/otlp-exporter.ts +56 -17
  120. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  121. package/src/observability/metric-registry.ts +16 -4
  122. package/src/observability/metric-retention.ts +8 -2
  123. package/src/observability/metric-sink.ts +11 -3
  124. package/src/observability/metrics-primitives.ts +42 -9
  125. package/src/plugins/plugin-define.ts +2 -2
  126. package/src/plugins/plugin-registry.ts +25 -25
  127. package/src/plugins/plugins/index.ts +1 -1
  128. package/src/plugins/plugins/nextjs.ts +16 -16
  129. package/src/plugins/plugins/vite.ts +7 -11
  130. package/src/plugins/plugins/vitest.ts +6 -11
  131. package/src/runtime/adaptive-plan.ts +225 -40
  132. package/src/runtime/agent-control.ts +58 -15
  133. package/src/runtime/agent-memory.ts +15 -9
  134. package/src/runtime/agent-observability.ts +10 -2
  135. package/src/runtime/anchor-manager.ts +27 -25
  136. package/src/runtime/async-marker.ts +7 -1
  137. package/src/runtime/async-runner.ts +39 -24
  138. package/src/runtime/auto-summarize.ts +7 -13
  139. package/src/runtime/background-runner.ts +189 -251
  140. package/src/runtime/batch-barrier.ts +18 -16
  141. package/src/runtime/cancellation-token.ts +16 -6
  142. package/src/runtime/cancellation.ts +46 -8
  143. package/src/runtime/capability-inventory.ts +6 -4
  144. package/src/runtime/chain-parser.ts +44 -11
  145. package/src/runtime/chain-runner.ts +63 -69
  146. package/src/runtime/checkpoint.ts +12 -56
  147. package/src/runtime/child-pi.ts +344 -79
  148. package/src/runtime/coalesce-tasks.ts +268 -0
  149. package/src/runtime/code-summary.ts +71 -26
  150. package/src/runtime/compact-stages/index.ts +15 -5
  151. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  152. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  153. package/src/runtime/compaction-summary.ts +17 -10
  154. package/src/runtime/completion-guard.ts +33 -16
  155. package/src/runtime/crash-classification.ts +28 -7
  156. package/src/runtime/crash-recovery.ts +177 -37
  157. package/src/runtime/crew-agent-records.ts +145 -47
  158. package/src/runtime/crew-hooks.ts +9 -24
  159. package/src/runtime/cross-extension-rpc.ts +25 -23
  160. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  161. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  162. package/src/runtime/delivery-coordinator.ts +34 -7
  163. package/src/runtime/delta-conflict.ts +9 -21
  164. package/src/runtime/deterministic-ast.ts +1 -1
  165. package/src/runtime/diagnostic-export.ts +53 -20
  166. package/src/runtime/direct-run.ts +12 -2
  167. package/src/runtime/dwf-state-store.ts +1 -1
  168. package/src/runtime/dynamic-workflow-context.ts +187 -59
  169. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  170. package/src/runtime/effectiveness.ts +16 -8
  171. package/src/runtime/errors/crew-errors.ts +7 -11
  172. package/src/runtime/event-stream-bridge.ts +9 -3
  173. package/src/runtime/foreground-control.ts +54 -14
  174. package/src/runtime/foreground-watchdog.ts +9 -6
  175. package/src/runtime/goal-achievement.ts +27 -10
  176. package/src/runtime/goal-evaluator.ts +54 -19
  177. package/src/runtime/goal-loop-runner.ts +280 -99
  178. package/src/runtime/goal-state-store.ts +27 -17
  179. package/src/runtime/green-contract.ts +11 -2
  180. package/src/runtime/group-join.ts +64 -31
  181. package/src/runtime/handoff-manager.ts +37 -42
  182. package/src/runtime/heartbeat-gradient.ts +10 -2
  183. package/src/runtime/heartbeat-watcher.ts +32 -6
  184. package/src/runtime/hidden-handoff.ts +13 -31
  185. package/src/runtime/important-line-classifier.ts +12 -2
  186. package/src/runtime/iteration-hooks.ts +25 -15
  187. package/src/runtime/live-agent-control.ts +55 -7
  188. package/src/runtime/live-agent-manager.ts +130 -27
  189. package/src/runtime/live-control-realtime.ts +23 -3
  190. package/src/runtime/live-irc.ts +4 -1
  191. package/src/runtime/live-session-health.ts +12 -4
  192. package/src/runtime/live-session-runtime.ts +379 -117
  193. package/src/runtime/manifest-cache.ts +28 -12
  194. package/src/runtime/mcp-proxy.ts +10 -18
  195. package/src/runtime/metric-parser.ts +1 -5
  196. package/src/runtime/model-fallback.ts +55 -18
  197. package/src/runtime/model-resolver.ts +2 -6
  198. package/src/runtime/model-scope.ts +19 -3
  199. package/src/runtime/notebook-helpers.ts +60 -62
  200. package/src/runtime/orphan-worker-registry.ts +37 -26
  201. package/src/runtime/output-validator.ts +18 -3
  202. package/src/runtime/overflow-recovery.ts +5 -4
  203. package/src/runtime/parallel-research.ts +29 -5
  204. package/src/runtime/parallel-utils.ts +9 -11
  205. package/src/runtime/path-overlap.ts +150 -0
  206. package/src/runtime/peer-dep.ts +12 -17
  207. package/src/runtime/per-write-validator.ts +1 -3
  208. package/src/runtime/phase-tracker.ts +342 -330
  209. package/src/runtime/pi-args.ts +26 -8
  210. package/src/runtime/pi-json-output.ts +1 -1
  211. package/src/runtime/pi-spawn.ts +30 -19
  212. package/src/runtime/pipeline-runner.ts +56 -55
  213. package/src/runtime/plan-templates.ts +5 -6
  214. package/src/runtime/policy-engine.ts +43 -7
  215. package/src/runtime/post-checks.ts +12 -4
  216. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  217. package/src/runtime/process-lifecycle.ts +20 -10
  218. package/src/runtime/process-status.ts +16 -5
  219. package/src/runtime/progress-event-coalescer.ts +2 -1
  220. package/src/runtime/progress-tracker.ts +103 -103
  221. package/src/runtime/prose-compressor.ts +9 -11
  222. package/src/runtime/recovery-recipes.ts +118 -24
  223. package/src/runtime/replace.ts +25 -10
  224. package/src/runtime/resilient-edit.ts +10 -25
  225. package/src/runtime/result-extractor.ts +2 -6
  226. package/src/runtime/retry-executor.ts +20 -4
  227. package/src/runtime/retry-runner.ts +27 -51
  228. package/src/runtime/role-permission.ts +6 -1
  229. package/src/runtime/run-coalesced-task-group.ts +256 -0
  230. package/src/runtime/run-drift.ts +14 -15
  231. package/src/runtime/run-tracker.ts +6 -28
  232. package/src/runtime/runtime-policy.ts +1 -6
  233. package/src/runtime/runtime-resolver.ts +80 -15
  234. package/src/runtime/scheduler.ts +47 -18
  235. package/src/runtime/semaphore.ts +5 -7
  236. package/src/runtime/sensitive-paths.ts +2 -1
  237. package/src/runtime/session-usage.ts +1 -1
  238. package/src/runtime/settings-store.ts +16 -12
  239. package/src/runtime/sidechain-output.ts +6 -2
  240. package/src/runtime/single-agent-compose.ts +1 -4
  241. package/src/runtime/skill-effectiveness.ts +29 -97
  242. package/src/runtime/skill-instructions.ts +40 -83
  243. package/src/runtime/stale-reconciler.ts +73 -197
  244. package/src/runtime/stream-preview.ts +1 -1
  245. package/src/runtime/streaming-output.ts +1 -1
  246. package/src/runtime/subagent-manager.ts +44 -169
  247. package/src/runtime/subprocess-tool-registry.ts +4 -1
  248. package/src/runtime/supervisor-contact.ts +10 -5
  249. package/src/runtime/task-display.ts +19 -5
  250. package/src/runtime/task-graph-scheduler.ts +95 -21
  251. package/src/runtime/task-graph.ts +5 -11
  252. package/src/runtime/task-health.ts +54 -47
  253. package/src/runtime/task-id.ts +12 -19
  254. package/src/runtime/task-output-context.ts +265 -81
  255. package/src/runtime/task-packet.ts +12 -20
  256. package/src/runtime/task-quality.ts +6 -14
  257. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  258. package/src/runtime/task-runner/live-executor.ts +114 -36
  259. package/src/runtime/task-runner/output-splitter.ts +152 -0
  260. package/src/runtime/task-runner/progress.ts +50 -12
  261. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  262. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  263. package/src/runtime/task-runner/result-utils.ts +3 -1
  264. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  265. package/src/runtime/task-runner/run-projection.ts +27 -8
  266. package/src/runtime/task-runner/state-helpers.ts +50 -14
  267. package/src/runtime/task-runner/tail-read.ts +2 -6
  268. package/src/runtime/task-runner.ts +180 -326
  269. package/src/runtime/team-runner-artifacts.ts +13 -0
  270. package/src/runtime/team-runner.ts +456 -974
  271. package/src/runtime/tool-output-pruner.ts +6 -9
  272. package/src/runtime/tool-progress.ts +11 -21
  273. package/src/runtime/verification-gates.ts +33 -24
  274. package/src/runtime/verification-integrity.ts +2 -7
  275. package/src/runtime/verification-worktree.ts +62 -12
  276. package/src/runtime/worker-heartbeat.ts +5 -1
  277. package/src/runtime/worker-startup.ts +29 -5
  278. package/src/runtime/workflow-state.ts +17 -9
  279. package/src/runtime/workspace-lock.ts +30 -35
  280. package/src/runtime/workspace-tree.ts +20 -32
  281. package/src/runtime/yield-handler.ts +43 -9
  282. package/src/runtime/zombie-scanner.ts +5 -4
  283. package/src/schema/config-schema.ts +266 -172
  284. package/src/schema/team-tool-schema.ts +29 -74
  285. package/src/schema/validation-types.ts +25 -17
  286. package/src/skills/discover-skills.ts +35 -10
  287. package/src/skills/skill-templates.ts +109 -27
  288. package/src/skills/validate.ts +26 -8
  289. package/src/state/active-run-registry.ts +87 -28
  290. package/src/state/artifact-store.ts +9 -5
  291. package/src/state/atomic-write-v2.ts +85 -63
  292. package/src/state/atomic-write.ts +106 -27
  293. package/src/state/blob-store.ts +47 -20
  294. package/src/state/contracts.ts +20 -5
  295. package/src/state/crew-init.ts +5 -22
  296. package/src/state/decision-ledger.ts +19 -73
  297. package/src/state/event-log-rotation.ts +41 -15
  298. package/src/state/event-log.ts +168 -53
  299. package/src/state/event-reconstructor.ts +11 -1
  300. package/src/state/gitignore-manager.ts +2 -8
  301. package/src/state/health-store.ts +57 -57
  302. package/src/state/hook-instinct-bridge.ts +1 -1
  303. package/src/state/hook-integrations.ts +1 -1
  304. package/src/state/instinct-store.ts +17 -5
  305. package/src/state/jsonl-writer.ts +1 -1
  306. package/src/state/locks.ts +23 -9
  307. package/src/state/mailbox.ts +151 -28
  308. package/src/state/observation-store.ts +20 -14
  309. package/src/state/run-cache.ts +142 -135
  310. package/src/state/run-graph.ts +6 -15
  311. package/src/state/run-metrics.ts +5 -18
  312. package/src/state/schedule.ts +15 -9
  313. package/src/state/state-store.ts +137 -47
  314. package/src/state/task-claims.ts +12 -2
  315. package/src/state/tiered-eval.ts +52 -43
  316. package/src/state/types-eval.ts +2 -2
  317. package/src/state/types.ts +24 -20
  318. package/src/state/usage.ts +20 -4
  319. package/src/state/worker-atomic-writer.ts +6 -3
  320. package/src/subagents/index.ts +2 -2
  321. package/src/teams/discover-teams.ts +21 -6
  322. package/src/tools/safe-bash-extension.ts +5 -6
  323. package/src/tools/safe-bash.ts +10 -11
  324. package/src/types/new-api-types.ts +6 -10
  325. package/src/ui/agent-management-overlay.ts +52 -40
  326. package/src/ui/card-colors.ts +13 -4
  327. package/src/ui/crew-footer.ts +8 -7
  328. package/src/ui/crew-select-list.ts +1 -1
  329. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  330. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  331. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  332. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  333. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  334. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  335. package/src/ui/heartbeat-aggregator.ts +15 -4
  336. package/src/ui/keybinding-map.ts +40 -7
  337. package/src/ui/live-conversation-overlay.ts +36 -20
  338. package/src/ui/live-duration.ts +1 -4
  339. package/src/ui/live-run-sidebar.ts +88 -25
  340. package/src/ui/loaders.ts +2 -8
  341. package/src/ui/mascot.ts +20 -36
  342. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  343. package/src/ui/overlays/confirm-overlay.ts +4 -2
  344. package/src/ui/overlays/help-overlay.ts +25 -14
  345. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  346. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  347. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  348. package/src/ui/pi-ui-compat.ts +7 -7
  349. package/src/ui/powerbar-publisher.ts +120 -42
  350. package/src/ui/render-diff.ts +10 -3
  351. package/src/ui/render-scheduler.ts +12 -4
  352. package/src/ui/run-action-dispatcher.ts +81 -18
  353. package/src/ui/run-dashboard.ts +172 -76
  354. package/src/ui/run-event-bus.ts +59 -37
  355. package/src/ui/run-snapshot-cache.ts +276 -86
  356. package/src/ui/settings-overlay.ts +361 -74
  357. package/src/ui/status-colors.ts +12 -1
  358. package/src/ui/syntax-highlight.ts +1 -1
  359. package/src/ui/terminal-status.ts +1 -3
  360. package/src/ui/theme-adapter.ts +16 -14
  361. package/src/ui/theme-discovery.ts +13 -2
  362. package/src/ui/tool-progress-formatter.ts +7 -7
  363. package/src/ui/tool-render.ts +128 -56
  364. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  365. package/src/ui/tool-renderers/index.ts +109 -43
  366. package/src/ui/transcript-cache.ts +32 -6
  367. package/src/ui/transcript-entries.ts +25 -23
  368. package/src/ui/transcript-viewer.ts +78 -29
  369. package/src/ui/widget/index.ts +99 -40
  370. package/src/ui/widget/widget-formatters.ts +13 -6
  371. package/src/ui/widget/widget-model.ts +19 -8
  372. package/src/ui/widget/widget-renderer.ts +23 -13
  373. package/src/ui/widget/widget-types.ts +1 -1
  374. package/src/utils/bm25-search.ts +199 -199
  375. package/src/utils/conflict-detect.ts +22 -21
  376. package/src/utils/env-filter.ts +14 -7
  377. package/src/utils/file-coalescer.ts +5 -1
  378. package/src/utils/fingerprint.ts +3 -6
  379. package/src/utils/frontmatter.ts +3 -1
  380. package/src/utils/fs-watch.ts +2 -6
  381. package/src/utils/gh-protocol.ts +119 -44
  382. package/src/utils/git.ts +13 -15
  383. package/src/utils/guards.ts +2 -5
  384. package/src/utils/ids.ts +9 -2
  385. package/src/utils/incremental-reader.ts +14 -3
  386. package/src/utils/internal-error.ts +2 -1
  387. package/src/utils/names.ts +12 -3
  388. package/src/utils/paths.ts +49 -5
  389. package/src/utils/project-detector.ts +2 -2
  390. package/src/utils/redaction.ts +29 -19
  391. package/src/utils/resolve-shell.ts +9 -7
  392. package/src/utils/run-watcher-registry.ts +19 -31
  393. package/src/utils/safe-paths.ts +46 -29
  394. package/src/utils/scan-cache.ts +9 -2
  395. package/src/utils/session-utils.ts +2 -4
  396. package/src/utils/sleep.ts +12 -5
  397. package/src/utils/sse-parser.ts +5 -17
  398. package/src/utils/visual.ts +52 -32
  399. package/src/workflows/discover-workflows.ts +41 -109
  400. package/src/workflows/intermediate-store.ts +5 -21
  401. package/src/workflows/preflight-validator.ts +6 -33
  402. package/src/workflows/topology-analyzer.ts +5 -21
  403. package/src/workflows/workflow-config.ts +7 -6
  404. package/src/worktree/branch-freshness.ts +66 -8
  405. package/src/worktree/cleanup.ts +130 -20
  406. package/src/worktree/worktree-manager.ts +212 -69
  407. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  408. package/skills/detection-pipeline-design/SKILL.md +0 -286
  409. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  410. package/skills/incident-playbook-construction/SKILL.md +0 -384
  411. package/skills/security-review/SKILL.md +0 -561
  412. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  413. package/skills/ui-render-performance/SKILL.md +0 -58
  414. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  415. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  416. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  417. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  418. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  419. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  420. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  421. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  422. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  430. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  431. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  432. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  433. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  434. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  435. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -43,7 +43,12 @@ export function validateWorkerOutput(role: string, output: string): OutputValida
43
43
 
44
44
  // Empty output always fails
45
45
  if (!output || !output.trim()) {
46
- return { valid: false, formatMatch: false, structurePreserved: false, issues: ["Empty output"] };
46
+ return {
47
+ valid: false,
48
+ formatMatch: false,
49
+ structurePreserved: false,
50
+ issues: ["Empty output"],
51
+ };
47
52
  }
48
53
 
49
54
  // Check role-specific format
@@ -87,7 +92,12 @@ export function validateWorkerOutput(role: string, output: string): OutputValida
87
92
  * Returns array of { file, line, severity, message } objects.
88
93
  */
89
94
  export function parseReviewerFindings(output: string): Array<{ file: string; line: number; severity: string; message: string }> {
90
- const findings: Array<{ file: string; line: number; severity: string; message: string }> = [];
95
+ const findings: Array<{
96
+ file: string;
97
+ line: number;
98
+ severity: string;
99
+ message: string;
100
+ }> = [];
91
101
  const lines = output.split("\n");
92
102
 
93
103
  const SEVERITY_MAP: Record<string, string> = {
@@ -118,7 +128,12 @@ export function parseReviewerFindings(output: string): Array<{ file: string; lin
118
128
  * Returns array of { file, line, symbol, note } objects.
119
129
  */
120
130
  export function parseExplorerResults(output: string): Array<{ file: string; line: number; symbol: string; note: string }> {
121
- const results: Array<{ file: string; line: number; symbol: string; note: string }> = [];
131
+ const results: Array<{
132
+ file: string;
133
+ line: number;
134
+ symbol: string;
135
+ note: string;
136
+ }> = [];
122
137
  const lines = output.split("\n");
123
138
 
124
139
  for (const line of lines) {
@@ -166,9 +166,10 @@ export class OverflowRecoveryTracker {
166
166
  const existing = this.timers.get(key);
167
167
  if (existing) clearTimeout(existing);
168
168
  const current = this.states.get(key);
169
- const timeoutMs = current?.phase === "recovered" || current?.phase === "failed" || current?.phase === "none"
170
- ? TERMINAL_STATE_TTL_MS
171
- : PHASE_TIMEOUT_MS;
169
+ const timeoutMs =
170
+ current?.phase === "recovered" || current?.phase === "failed" || current?.phase === "none"
171
+ ? TERMINAL_STATE_TTL_MS
172
+ : PHASE_TIMEOUT_MS;
172
173
 
173
174
  const timer = setTimeout(() => {
174
175
  this.timers.delete(key);
@@ -202,4 +203,4 @@ export class OverflowRecoveryTracker {
202
203
  timer.unref();
203
204
  this.timers.set(key, timer);
204
205
  }
205
- }
206
+ }
@@ -5,7 +5,8 @@ import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.
5
5
  export function sourcePiProjects(cwd: string): string[] {
6
6
  const sourceDir = path.join(cwd, "Source");
7
7
  try {
8
- return fs.readdirSync(sourceDir, { withFileTypes: true })
8
+ return fs
9
+ .readdirSync(sourceDir, { withFileTypes: true })
9
10
  .filter((entry) => entry.isDirectory() && entry.name.startsWith("pi-"))
10
11
  .map((entry) => `Source/${entry.name}`)
11
12
  .sort();
@@ -30,15 +31,38 @@ export function expandParallelResearchWorkflow(workflow: WorkflowConfig, cwd: st
30
31
  role: "explorer",
31
32
  parallelGroup: "explore",
32
33
  reads: paths,
33
- task: [`Explore this dynamic shard for: {goal}`, "", "Paths:", ...paths.map((item) => `- ${item}`), "", "Focus on purpose, architecture, runtime/UI patterns, package config, docs, and lessons for pi-crew."].join("\n"),
34
+ task: [
35
+ `Explore this dynamic shard for: {goal}`,
36
+ "",
37
+ "Paths:",
38
+ ...paths.map((item) => `- ${item}`),
39
+ "",
40
+ "Focus on purpose, architecture, runtime/UI patterns, package config, docs, and lessons for pi-crew.",
41
+ ].join("\n"),
34
42
  }));
35
43
  return {
36
44
  ...workflow,
37
45
  steps: [
38
- { id: "discover", role: "explorer", parallelGroup: "inventory", task: `Quickly inventory and validate ${projects.length} pi-* projects for: {goal}\n\nProjects:\n${projects.map((item) => `- ${item}`).join("\n")}\n\nDo not block shard work; summarize routing notes only.` },
46
+ {
47
+ id: "discover",
48
+ role: "explorer",
49
+ parallelGroup: "inventory",
50
+ task: `Quickly inventory and validate ${projects.length} pi-* projects for: {goal}\n\nProjects:\n${projects.map((item) => `- ${item}`).join("\n")}\n\nDo not block shard work; summarize routing notes only.`,
51
+ },
39
52
  ...exploreSteps,
40
- { id: "synthesize", role: "analyst", dependsOn: exploreSteps.map((step) => step.id), task: "Synthesize all dynamic shard findings. Identify common patterns, gaps, and concrete recommendations. Use discover output if available, but prioritize completed shard outputs." },
41
- { id: "write", role: "writer", dependsOn: ["synthesize"], output: "research-summary.md", task: "Write a concise final summary with evidence, risks, and actionable next steps." },
53
+ {
54
+ id: "synthesize",
55
+ role: "analyst",
56
+ dependsOn: exploreSteps.map((step) => step.id),
57
+ task: "Synthesize all dynamic shard findings. Identify common patterns, gaps, and concrete recommendations. Use discover output if available, but prioritize completed shard outputs.",
58
+ },
59
+ {
60
+ id: "write",
61
+ role: "writer",
62
+ dependsOn: ["synthesize"],
63
+ output: "research-summary.md",
64
+ task: "Write a concise final summary with evidence, risks, and actionable next steps.",
65
+ },
42
66
  ],
43
67
  };
44
68
  }
@@ -76,9 +76,7 @@ async function mapConcurrentWithSignal<T, R>(
76
76
  let aborted = false;
77
77
 
78
78
  const abortController = new AbortController();
79
- const workerSignal = signal
80
- ? AbortSignal.any([signal, abortController.signal])
81
- : abortController.signal;
79
+ const workerSignal = signal ? AbortSignal.any([signal, abortController.signal]) : abortController.signal;
82
80
 
83
81
  let rejectFirst: (error: unknown) => void;
84
82
  const firstErrorPromise = new Promise<never>((_, reject) => {
@@ -140,14 +138,14 @@ export function aggregateParallelOutputs(
140
138
  r.exitCode === -1
141
139
  ? "SKIPPED"
142
140
  : r.exitCode == null || r.exitCode !== 0
143
- ? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : ""}`
144
- : r.error
145
- ? `WARNING: ${r.error}`
146
- : !hasOutput && r.outputTargetPath && r.outputTargetExists === false
147
- ? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`
148
- : !hasOutput && !r.outputTargetPath
149
- ? "EMPTY OUTPUT (no textual response returned)"
150
- : "";
141
+ ? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : ""}`
142
+ : r.error
143
+ ? `WARNING: ${r.error}`
144
+ : !hasOutput && r.outputTargetPath && r.outputTargetExists === false
145
+ ? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`
146
+ : !hasOutput && !r.outputTargetPath
147
+ ? "EMPTY OUTPUT (no textual response returned)"
148
+ : "";
151
149
  const body = status ? (hasOutput ? `${status}\n${r.output}` : status) : r.output;
152
150
  return `${header}\n${body}`;
153
151
  })
@@ -0,0 +1,150 @@
1
+ /**
2
+ * path-overlap.ts — write-path overlap detection for sequential scheduling (M5).
3
+ *
4
+ * Implements the writes-only path-intersection heuristic (per plan §11 decision
5
+ * #5). A pair of steps is considered overlapping ONLY when both declare the
6
+ * same write target (via `step.output`). Reads are intentionally ignored to
7
+ * avoid false positives (parallel reads are safe).
8
+ *
9
+ * Scope:
10
+ * - export `detectWriteOverlap(stepA, stepB): boolean` — pair check
11
+ * - export `selectNonOverlapping(steps, maxCount): WorkflowStep[]` — greedy
12
+ * packer that returns at most `maxCount` steps such that no two returned
13
+ * steps have overlapping write paths.
14
+ * - export `filterReadyByWriteOverlap(taskIds, tasks, workflow, maxCount)` —
15
+ * scheduler-side wrapper that translates TeamTaskState IDs to WorkflowSteps
16
+ * and applies the overlap filter.
17
+ *
18
+ * Default greedy strategy: preserve declaration order; first step always wins
19
+ * because (a) deterministic for tests, (b) declaration order typically reflects
20
+ * author intent, (c) a future PR can swap to priority-based when M5 defaults
21
+ * flip to `true` in production.
22
+ *
23
+ * Out of scope: reads overlap detection (decision #5); deferral cap (decision
24
+ * #6; M5 first ship treats repeated deferral as best-effort; cap warning logged
25
+ * but not enforced, since M5 default = false means production isn't gated).
26
+ */
27
+
28
+ import type { TeamTaskState } from "../state/types.ts";
29
+ import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.ts";
30
+
31
+ /**
32
+ * Extract the canonical write-target path of a step.
33
+ *
34
+ * Returns:
35
+ * - `step.output` if it is a non-empty string (the file path produced).
36
+ * - `undefined` otherwise (no declared write target → step has no write
37
+ * overlap risk).
38
+ *
39
+ * `step.output === false` means "explicitly no output"; treated as no write.
40
+ */
41
+ function extractWritePath(step: WorkflowStep): string | undefined {
42
+ if (typeof step.output === "string" && step.output.length > 0) return step.output;
43
+ return undefined;
44
+ }
45
+
46
+ /**
47
+ * Pairwise check: do stepA and stepB both write to the same path?
48
+ *
49
+ * O(1). Both steps must declare an `output` string; otherwise no overlap.
50
+ *
51
+ * Examples:
52
+ * detectWriteOverlap({output: 'a.md'}, {output: 'a.md'}) → true
53
+ * detectWriteOverlap({output: 'a.md'}, {output: 'b.md'}) → false
54
+ * detectWriteOverlap({output: 'a.md'}, {output: false}) → false
55
+ * detectWriteOverlap({output: 'a.md'}, {}) → false
56
+ */
57
+ export function detectWriteOverlap(stepA: WorkflowStep, stepB: WorkflowStep): boolean {
58
+ const pathA = extractWritePath(stepA);
59
+ const pathB = extractWritePath(stepB);
60
+ if (!pathA || !pathB) return false;
61
+ return pathA === pathB;
62
+ }
63
+
64
+ /**
65
+ * Greedy packer: pick up to `maxCount` steps from `steps` such that no two
66
+ * PICKED steps have overlapping write paths.
67
+ *
68
+ * Algorithm:
69
+ * - Iterates over `steps` in order.
70
+ * - First step is always picked.
71
+ * - Each subsequent step is picked iff (a) it doesn't overlap with any
72
+ * already-picked step AND (b) we haven't reached `maxCount`.
73
+ *
74
+ * Returns the picked subset (a NEW array; does not mutate input).
75
+ *
76
+ * Used by scheduler when `limits.serializeOnPathOverlap = true`.
77
+ */
78
+ export function selectNonOverlapping(steps: WorkflowStep[], maxCount: number): WorkflowStep[] {
79
+ const picked: WorkflowStep[] = [];
80
+ if (maxCount <= 0 || steps.length === 0) return picked;
81
+ for (const step of steps) {
82
+ if (picked.length >= maxCount) break;
83
+ let conflict = false;
84
+ for (const existing of picked) {
85
+ if (detectWriteOverlap(step, existing)) {
86
+ conflict = true;
87
+ break;
88
+ }
89
+ }
90
+ if (!conflict) picked.push(step);
91
+ }
92
+ return picked;
93
+ }
94
+
95
+ /**
96
+ * Scheduler-side wrapper: given a list of ready task IDs (from the task-graph
97
+ * ready queue), filter them by write-path overlap using the workflow step
98
+ * definitions.
99
+ *
100
+ * Behavior:
101
+ * - Resolves each task ID → `TeamTaskState` → `WorkflowStep` via
102
+ * `task.stepId` matching `workflow.steps[i].id`.
103
+ * - Tasks whose step is missing from the workflow (e.g. ad-hoc tasks) are
104
+ * always included (treated as having no declared write path).
105
+ * - Returns the same array (identity-equal) when `enabled` is false, so
106
+ * callers can skip the filter cheaply.
107
+ *
108
+ * Used by the team-runner scheduler when `limits.serializeOnPathOverlap`
109
+ * is `true` (per plan §11 decision #6, default is `false` so this is a
110
+ * no-op in v0.9.17 unless the workflow author opts in).
111
+ */
112
+ export function filterReadyByWriteOverlap(
113
+ readyTaskIds: string[],
114
+ tasks: TeamTaskState[],
115
+ workflow: WorkflowConfig,
116
+ maxCount: number,
117
+ enabled: boolean,
118
+ ): string[] {
119
+ if (!enabled || maxCount <= 0 || readyTaskIds.length === 0) return readyTaskIds;
120
+ const taskById = new Map<string, TeamTaskState>(tasks.map((task) => [task.id, task]));
121
+ const stepById = new Map<string, WorkflowStep>(workflow.steps.map((step) => [step.id, step]));
122
+ const pickedSteps: WorkflowStep[] = [];
123
+ const pickedTaskIds: string[] = [];
124
+ for (const taskId of readyTaskIds) {
125
+ if (pickedTaskIds.length >= maxCount) break;
126
+ const task = taskById.get(taskId);
127
+ if (!task || !task.stepId) {
128
+ // No step reference: treat as no declared write path → never conflicts.
129
+ pickedTaskIds.push(taskId);
130
+ continue;
131
+ }
132
+ const step = stepById.get(task.stepId);
133
+ if (!step) {
134
+ pickedTaskIds.push(taskId);
135
+ continue;
136
+ }
137
+ let conflict = false;
138
+ for (const existing of pickedSteps) {
139
+ if (detectWriteOverlap(step, existing)) {
140
+ conflict = true;
141
+ break;
142
+ }
143
+ }
144
+ if (!conflict) {
145
+ pickedTaskIds.push(taskId);
146
+ pickedSteps.push(step);
147
+ }
148
+ }
149
+ return pickedTaskIds;
150
+ }
@@ -44,10 +44,7 @@ import { resolveNpmGlobalRoot } from "./pi-spawn.ts";
44
44
  * The pi-coding-agent peer dependency package name(s) we can be loaded by.
45
45
  * @earendil-works is the canonical scope; @mariozechner is the historical fork.
46
46
  */
47
- export const PEER_DEP_NAMES = [
48
- "@earendil-works/pi-coding-agent",
49
- "@mariozechner/pi-coding-agent",
50
- ] as const;
47
+ export const PEER_DEP_NAMES = ["@earendil-works/pi-coding-agent", "@mariozechner/pi-coding-agent"] as const;
51
48
 
52
49
  /**
53
50
  * Env var a parent pi-crew process sets on spawned children so they can resolve
@@ -155,10 +152,7 @@ function extractEsmMain(pkg: unknown): string | undefined {
155
152
  * container case) AND `<dir>/<pkg>` (handles a base that IS a node_modules
156
153
  * dir, e.g. the output of `npm root -g`), then walk up to root.
157
154
  */
158
- function findPackageDir(
159
- start: string,
160
- names: readonly string[],
161
- ): { dir: string; name: string } | undefined {
155
+ function findPackageDir(start: string, names: readonly string[]): { dir: string; name: string } | undefined {
162
156
  let dir = path.resolve(start);
163
157
  try {
164
158
  if (fs.statSync(dir).isFile()) dir = path.dirname(dir);
@@ -168,10 +162,7 @@ function findPackageDir(
168
162
  while (true) {
169
163
  for (const name of names) {
170
164
  const segs = name.split("/");
171
- const candidates = [
172
- path.join(dir, "node_modules", ...segs, "package.json"),
173
- path.join(dir, ...segs, "package.json"),
174
- ];
165
+ const candidates = [path.join(dir, "node_modules", ...segs, "package.json"), path.join(dir, ...segs, "package.json")];
175
166
  for (const pkgJson of candidates) {
176
167
  try {
177
168
  const pkg = JSON.parse(fs.readFileSync(pkgJson, "utf-8"));
@@ -194,14 +185,16 @@ function tryResolveFrom(base: string): ResolvedPeerDep | undefined {
194
185
  const found = findPackageDir(base, PEER_DEP_NAMES);
195
186
  if (!found) return undefined;
196
187
  try {
197
- const pkg = JSON.parse(
198
- fs.readFileSync(path.join(found.dir, "package.json"), "utf-8"),
199
- );
188
+ const pkg = JSON.parse(fs.readFileSync(path.join(found.dir, "package.json"), "utf-8"));
200
189
  const mainRel = extractEsmMain(pkg);
201
190
  if (!mainRel) return undefined;
202
191
  const mainAbs = path.resolve(found.dir, mainRel);
203
192
  if (!fs.existsSync(mainAbs)) return undefined;
204
- return { dir: found.dir, name: found.name, mainUrl: pathToFileURL(mainAbs).href };
193
+ return {
194
+ dir: found.dir,
195
+ name: found.name,
196
+ mainUrl: pathToFileURL(mainAbs).href,
197
+ };
205
198
  } catch {
206
199
  return undefined;
207
200
  }
@@ -261,7 +254,9 @@ function buildMissingMessage(): string {
261
254
  `This usually means pi-crew and pi are installed in separate node_modules trees\n` +
262
255
  `(e.g. pi-crew under ~/.pi/agent/npm/ but pi under an nvm/Volta/fnm global scope).\n` +
263
256
  `Resolution bases tried:\n` +
264
- peerDepResolutionBases().map((b) => ` - ${b}`).join("\n") +
257
+ peerDepResolutionBases()
258
+ .map((b) => ` - ${b}`)
259
+ .join("\n") +
265
260
  `\nFix: install pi-crew in the SAME scope as pi, e.g.\n` +
266
261
  ` npm install -g @earendil-works/pi-crew\n` +
267
262
  `or set the env var ${PEER_DEP_DIR_ENV}=<path to the pi-coding-agent package dir>.`
@@ -68,9 +68,7 @@ export function validateJson(content: string, _filePath: string): ValidationResu
68
68
  * ONLY zero-cost synchronous validators belong here. Process-spawning
69
69
  * validators must be registered via a future opt-in path (see module doc).
70
70
  */
71
- const DEFAULT_VALIDATORS: ReadonlyMap<string, PerWriteValidator> = new Map([
72
- ["json", validateJson],
73
- ]);
71
+ const DEFAULT_VALIDATORS: ReadonlyMap<string, PerWriteValidator> = new Map([["json", validateJson]]);
74
72
 
75
73
  // ─────────────────────────────────────────────────────────────────────────
76
74
  // Dedup cache (path → last-validated content). Bounded; small.