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
@@ -1,45 +1,26 @@
1
1
  import { allAgents, discoverAgents } from "../../agents/discover-agents.ts";
2
2
  import { loadConfig } from "../../config/config.ts";
3
- import {
4
- PipelineRunner,
5
- type PipelineWorkflow,
6
- } from "../../runtime/pipeline-runner.ts";
3
+ import { PipelineRunner, type PipelineWorkflow } from "../../runtime/pipeline-runner.ts";
7
4
  // Heavy runtime — lazy-loaded to avoid 1.4s import cost at extension registration.
8
5
  import type { executeTeamRun as ExecuteTeamRunFn } from "../../runtime/team-runner.ts";
9
6
  import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
10
- import {
11
- registerActiveRun,
12
- unregisterActiveRun,
13
- } from "../../state/active-run-registry.ts";
7
+ import { registerActiveRun, unregisterActiveRun } from "../../state/active-run-registry.ts";
14
8
  import { writeArtifact } from "../../state/artifact-store.ts";
15
9
  import { atomicWriteJson } from "../../state/atomic-write.ts";
16
- import {
17
- createRunManifest,
18
- loadRunManifestById,
19
- updateRunStatus,
20
- } from "../../state/state-store.ts";
10
+ import { createRunManifest, loadRunManifestById, updateRunStatus } from "../../state/state-store.ts";
21
11
  import { allTeams, discoverTeams } from "../../teams/discover-teams.ts";
22
- import {
23
- allWorkflows,
24
- discoverWorkflows,
25
- } from "../../workflows/discover-workflows.ts";
12
+ import { allWorkflows, discoverWorkflows } from "../../workflows/discover-workflows.ts";
26
13
  import { validateWorkflowForTeam } from "../../workflows/validate-workflow.ts";
27
- import {
28
- assertCleanLeader,
29
- findGitRoot,
30
- } from "../../worktree/worktree-manager.ts";
14
+ import { assertCleanLeader, findGitRoot } from "../../worktree/worktree-manager.ts";
31
15
 
32
16
  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- type-only import for TS inference
33
- const _typeCheck: typeof ExecuteTeamRunFn =
34
- null as never as typeof ExecuteTeamRunFn;
17
+ const _typeCheck: typeof ExecuteTeamRunFn = null as never as typeof ExecuteTeamRunFn;
35
18
 
36
19
  import { logInternalError } from "../../utils/internal-error.ts";
37
20
  import { resolveRealContainedPath } from "../../utils/safe-paths.ts";
38
21
 
39
22
  let _cachedExecuteTeamRun: typeof ExecuteTeamRunFn | undefined;
40
- async function executeTeamRun(
41
- ...args: Parameters<typeof ExecuteTeamRunFn>
42
- ): Promise<Awaited<ReturnType<typeof ExecuteTeamRunFn>>> {
23
+ async function executeTeamRun(...args: Parameters<typeof ExecuteTeamRunFn>): Promise<Awaited<ReturnType<typeof ExecuteTeamRunFn>>> {
43
24
  if (!_cachedExecuteTeamRun) {
44
25
  // LAZY: heavy runtime — defer 1.4s import cost until team run actually executes.
45
26
  const mod = await import("../../runtime/team-runner.ts");
@@ -49,10 +30,7 @@ async function executeTeamRun(
49
30
  }
50
31
 
51
32
  import { expandParallelResearchWorkflow } from "../../runtime/parallel-research.ts";
52
- import {
53
- resolveCrewRuntime,
54
- runtimeResolutionState,
55
- } from "../../runtime/runtime-resolver.ts";
33
+ import { resolveCrewRuntime, runtimeResolutionState } from "../../runtime/runtime-resolver.ts";
56
34
  import { normalizeSkillOverride } from "../../runtime/skill-instructions.ts";
57
35
  import { appendEventAsync, readEvents } from "../../state/event-log.ts";
58
36
  import { spawnBackgroundTeamRun } from "../../subagents/async-entry.ts";
@@ -84,9 +62,7 @@ import { spawnBackgroundTeamRun } from "../../subagents/async-entry.ts";
84
62
  * `team action='run' workflow='<dynamic>'` → "Cannot access 'crewInitPromise'
85
63
  * before initialization" at run.ts load. See RFC 17 + commit fixing this.
86
64
  */
87
- var crewInitPromise:
88
- | Promise<typeof import("../../state/crew-init.ts")>
89
- | undefined;
65
+ var crewInitPromise: Promise<typeof import("../../state/crew-init.ts")> | undefined;
90
66
  function loadCrewInit(): Promise<typeof import("../../state/crew-init.ts")> {
91
67
  if (!crewInitPromise) {
92
68
  crewInitPromise = import("../../state/crew-init.ts");
@@ -97,20 +73,13 @@ function loadCrewInit(): Promise<typeof import("../../state/crew-init.ts")> {
97
73
  import * as fs from "node:fs";
98
74
  import * as path from "node:path";
99
75
  import { hasAsyncStartMarker } from "../../runtime/async-marker.ts";
100
- import {
101
- checkProcessLiveness,
102
- isActiveRunStatus,
103
- } from "../../runtime/process-status.ts";
76
+ import { checkProcessLiveness, isActiveRunStatus } from "../../runtime/process-status.ts";
104
77
  import { waitForRun } from "../../runtime/run-tracker.ts";
105
78
  import { collectRunMetrics } from "../../state/run-metrics.ts";
106
79
  import type { PiTeamsToolResult } from "../tool-result.ts";
107
80
  import { effectiveRunConfig } from "./config-patch.ts";
108
81
  import { buildParentContext, result, type TeamContext } from "./context.ts";
109
- import {
110
- isGoalWrapEnabled,
111
- shouldGoalWrap,
112
- startGoalWrappedRun,
113
- } from "./goal-wrap.ts";
82
+ import { isGoalWrapEnabled, shouldGoalWrap, startGoalWrappedRun } from "./goal-wrap.ts";
114
83
 
115
84
  function tailFile(filePath: string, maxBytes = 4096): string | undefined {
116
85
  try {
@@ -131,12 +100,7 @@ function tailFile(filePath: string, maxBytes = 4096): string | undefined {
131
100
  }
132
101
  }
133
102
 
134
- function scheduleBackgroundEarlyExitGuard(
135
- cwd: string,
136
- runId: string,
137
- pid: number | undefined,
138
- logPath: string,
139
- ): void {
103
+ function scheduleBackgroundEarlyExitGuard(cwd: string, runId: string, pid: number | undefined, logPath: string): void {
140
104
  if (process.env.PI_CREW_ASYNC_EARLY_EXIT_GUARD === "0") return;
141
105
  const timer = setTimeout(() => {
142
106
  const loaded = loadRunManifestById(cwd, runId);
@@ -144,10 +108,7 @@ function scheduleBackgroundEarlyExitGuard(
144
108
  if (hasAsyncStartMarker(loaded.manifest)) return;
145
109
  if (
146
110
  readEvents(loaded.manifest.eventsPath).some(
147
- (event) =>
148
- event.type === "async.started" ||
149
- event.type === "async.completed" ||
150
- event.type === "async.failed",
111
+ (event) => event.type === "async.started" || event.type === "async.completed" || event.type === "async.failed",
151
112
  )
152
113
  )
153
114
  return;
@@ -155,11 +116,7 @@ function scheduleBackgroundEarlyExitGuard(
155
116
  if (liveness.alive) return;
156
117
  const tail = tailFile(logPath);
157
118
  const message = `Background runner exited within 3s; see background.log${tail ? `\n${tail}` : ""}`;
158
- const failed = updateRunStatus(
159
- loaded.manifest,
160
- "failed",
161
- "Background runner exited within 3s; see background.log",
162
- );
119
+ const failed = updateRunStatus(loaded.manifest, "failed", "Background runner exited within 3s; see background.log");
163
120
  void appendEventAsync(failed.eventsPath, {
164
121
  type: "async.failed",
165
122
  runId: failed.runId,
@@ -170,10 +127,7 @@ function scheduleBackgroundEarlyExitGuard(
170
127
  timer.unref();
171
128
  }
172
129
 
173
- export async function handleRun(
174
- params: TeamToolParamsValue,
175
- ctx: TeamContext,
176
- ): Promise<PiTeamsToolResult> {
130
+ export async function handleRun(params: TeamToolParamsValue, ctx: TeamContext): Promise<PiTeamsToolResult> {
177
131
  // CHAIN DISPATCH: runs before goal validation since a chain has no top-level
178
132
  // goal. The injected handleRun reference breaks the run.ts ↔ chain-dispatch.ts
179
133
  // import cycle; the lazy import defers the chain-executor cost until a chain is
@@ -184,12 +138,7 @@ export async function handleRun(
184
138
  return handleChainRun(params, ctx, handleRun);
185
139
  }
186
140
  const goal = params.goal ?? params.task;
187
- if (!goal)
188
- return result(
189
- "Run requires goal or task.",
190
- { action: "run", status: "error" },
191
- true,
192
- );
141
+ if (!goal) return result("Run requires goal or task.", { action: "run", status: "error" }, true);
193
142
  const intentPrefix = goal.length > 60 ? `${goal.slice(0, 57)}...` : goal;
194
143
 
195
144
  // P0: Ensure .crew directory structure exists before creating any manifests.
@@ -251,15 +200,8 @@ export async function handleRun(
251
200
  const teams = allTeams(discoverTeams(resolvedCtx.cwd));
252
201
  const workflows = allWorkflows(discoverWorkflows(resolvedCtx.cwd));
253
202
  const agents = allAgents(discoverAgents(resolvedCtx.cwd));
254
- const directAgent = params.agent
255
- ? agents.find((item) => item.name === params.agent)
256
- : undefined;
257
- if (params.agent && !directAgent)
258
- return result(
259
- `Agent '${params.agent}' not found.`,
260
- { action: "run", status: "error" },
261
- true,
262
- );
203
+ const directAgent = params.agent ? agents.find((item) => item.name === params.agent) : undefined;
204
+ if (params.agent && !directAgent) return result(`Agent '${params.agent}' not found.`, { action: "run", status: "error" }, true);
263
205
  const teamName = params.team ?? "default";
264
206
  const team = directAgent
265
207
  ? {
@@ -278,15 +220,8 @@ export async function handleRun(
278
220
  workspaceMode: params.workspaceMode,
279
221
  }
280
222
  : teams.find((item) => item.name === teamName);
281
- if (!team)
282
- return result(
283
- `Team '${teamName}' not found.`,
284
- { action: "run", status: "error" },
285
- true,
286
- );
287
- const workflowName = directAgent
288
- ? "direct-agent"
289
- : (params.workflow ?? team.defaultWorkflow ?? "default");
223
+ if (!team) return result(`Team '${teamName}' not found.`, { action: "run", status: "error" }, true);
224
+ const workflowName = directAgent ? "direct-agent" : (params.workflow ?? team.defaultWorkflow ?? "default");
290
225
  const baseWorkflow = directAgent
291
226
  ? {
292
227
  name: "direct-agent",
@@ -303,21 +238,10 @@ export async function handleRun(
303
238
  ],
304
239
  }
305
240
  : workflows.find((item) => item.name === workflowName);
306
- if (!baseWorkflow)
307
- return result(
308
- `Workflow '${workflowName}' not found.`,
309
- { action: "run", status: "error" },
310
- true,
311
- );
312
- // LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { expandParallelResearchWorkflow }` above (issue #28, RFC 17). At call time the module body has fully evaluated, so the dynamic import returns a live binding.
313
- // LAZY: marker duplicated for biome-check compatibility (script checks `lineNum - 2`).
314
- // LAZY: keep import on single line so the `// LAZY:` marker above remains 1-line away from `await import`.
315
- const { expandParallelResearchWorkflow: expandParallelResearch } = await import(
316
- "../../runtime/parallel-research.ts",
317
- );
318
- const workflow = directAgent
319
- ? baseWorkflow
320
- : expandParallelResearch(baseWorkflow, resolvedCtx.cwd);
241
+ if (!baseWorkflow) return result(`Workflow '${workflowName}' not found.`, { action: "run", status: "error" }, true);
242
+ // LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { expandParallelResearchWorkflow }` above (issue #28, RFC 17). At call time the module body has fully evaluated, so the dynamic import returns a live binding. Multi-line form breaks scripts/check-lazy-imports.mjs (which does `lines[lineNum - 2]`), so keep destructuring + await import on one line.
243
+ const { expandParallelResearchWorkflow: expandParallelResearch } = await import("../../runtime/parallel-research.ts");
244
+ const workflow = directAgent ? baseWorkflow : expandParallelResearch(baseWorkflow, resolvedCtx.cwd);
321
245
 
322
246
  // PREFLIGHT (advisory only, since v0.9.15): classify workflow topology and emit
323
247
  // informational notes per the rule in .crew/knowledge.md "pi-crew USAGE THRESHOLD
@@ -327,22 +251,13 @@ export async function handleRun(
327
251
  // Skip for direct-agent runs (they bypass the workflow system entirely).
328
252
  if (!directAgent) {
329
253
  // LAZY: defer preflight-validator import until a team run actually requests it.
330
- const { validateWorkflowUsage } = await import(
331
- "../../workflows/preflight-validator.ts"
332
- );
254
+ const { validateWorkflowUsage } = await import("../../workflows/preflight-validator.ts");
333
255
  const preflight = validateWorkflowUsage(workflow, {
334
256
  force: params.force === true,
335
257
  });
336
- const icon =
337
- preflight.level === "warn"
338
- ? "⚠️ "
339
- : preflight.level === "note"
340
- ? "ℹ️ "
341
- : "";
258
+ const icon = preflight.level === "warn" ? "⚠️ " : preflight.level === "note" ? "ℹ️ " : "";
342
259
  const tag = preflight.level.toUpperCase();
343
- console.warn(
344
- `${icon}[team-tool.preflight] ${tag}: ${preflight.message} (workflow=${workflow.name})`,
345
- );
260
+ console.warn(`${icon}[team-tool.preflight] ${tag}: ${preflight.message} (workflow=${workflow.name})`);
346
261
  if (preflight.suggestion) {
347
262
  console.warn(`[team-tool.preflight] → ${preflight.suggestion}`);
348
263
  }
@@ -358,11 +273,7 @@ export async function handleRun(
358
273
  // transition). When goal-wrap is unsafe for this workflow, we do NOT error
359
274
  // out — we fall through to the normal team-run path so the user still gets
360
275
  // the run they asked for. The disabled reason is logged for traceability.
361
- if (
362
- !directAgent &&
363
- workflow.source === "builtin" &&
364
- isGoalWrapEnabled(resolvedCtx.cwd, workflow.name)
365
- ) {
276
+ if (!directAgent && workflow.source === "builtin" && isGoalWrapEnabled(resolvedCtx.cwd, workflow.name)) {
366
277
  const decision = shouldGoalWrap(resolvedCtx.cwd, workflow);
367
278
  if (decision.enabled) {
368
279
  return await startGoalWrappedRun(params, ctx, workflow, goal);
@@ -401,9 +312,7 @@ export async function handleRun(
401
312
 
402
313
  // For now, show pipeline workflow info - full integration would require
403
314
  // connecting PipelineRunner to the actual team execution system
404
- const stageInfo = pipelineWorkflow.stages
405
- .map((s) => `- ${s.name} (${s.team})`)
406
- .join("\n");
315
+ const stageInfo = pipelineWorkflow.stages.map((s) => `- ${s.name} (${s.team})`).join("\n");
407
316
  return result(
408
317
  [
409
318
  `Pipeline workflow '${workflow.name}' is not yet wired into the team execution system.`,
@@ -424,25 +333,20 @@ export async function handleRun(
424
333
  }
425
334
 
426
335
  // LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { validateWorkflowForTeam }` above (issue #28, RFC 17).
427
- const { validateWorkflowForTeam: validateWorkflow } = await import(
428
- "../../workflows/validate-workflow.ts"
429
- );
336
+ const { validateWorkflowForTeam: validateWorkflow } = await import("../../workflows/validate-workflow.ts");
430
337
  const validationErrors = validateWorkflow(workflow, team);
431
338
  if (validationErrors.length > 0) {
432
339
  return result(
433
- [
434
- `Workflow '${workflow.name}' is not valid for team '${team.name}':`,
435
- ...validationErrors.map((error) => `- ${error}`),
436
- ].join("\n"),
340
+ [`Workflow '${workflow.name}' is not valid for team '${team.name}':`, ...validationErrors.map((error) => `- ${error}`)].join(
341
+ "\n",
342
+ ),
437
343
  { action: "run", status: "error" },
438
344
  true,
439
345
  );
440
346
  }
441
347
 
442
348
  // LAZY: dodge the jiti ESM/CJS interop TDZ race on the static `import { normalizeSkillOverride }` above (issue #28, RFC 17).
443
- const { normalizeSkillOverride: normalizeSkill } = await import(
444
- "../../runtime/skill-instructions.ts"
445
- );
349
+ const { normalizeSkillOverride: normalizeSkill } = await import("../../runtime/skill-instructions.ts");
446
350
  const skillOverride = normalizeSkill(params.skill);
447
351
  const { manifest, tasks, paths } = createRunManifest({
448
352
  cwd: resolvedCtx.cwd,
@@ -464,8 +368,7 @@ export async function handleRun(
464
368
  ...manifest,
465
369
  ...(skillOverride !== undefined ? { skillOverride } : {}),
466
370
  artifacts: [goalArtifact],
467
- summary:
468
- "Run manifest created; worker execution is not implemented yet.",
371
+ summary: "Run manifest created; worker execution is not implemented yet.",
469
372
  };
470
373
  atomicWriteJson(paths.manifestPath, updatedManifest);
471
374
  registerActiveRun(updatedManifest);
@@ -474,16 +377,9 @@ export async function handleRun(
474
377
  // run it via runDynamicWorkflow instead of the static executeTeamRun path. The script
475
378
  // orchestrates subagents via ctx.agent(); only ctx.setResult() reaches the main context.
476
379
  // Placed AFTER manifest creation so runId/paths/artifactsRoot are available.
477
- if (
478
- !directAgent &&
479
- (
480
- workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig
481
- ).runtime === "dynamic"
482
- ) {
380
+ if (!directAgent && (workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig).runtime === "dynamic") {
483
381
  // LAZY: defer dynamic import of ../../runtime/dynamic-workflow-runner.ts to its call site.
484
- const { runDynamicWorkflow } = await import(
485
- "../../runtime/dynamic-workflow-runner.ts"
486
- );
382
+ const { runDynamicWorkflow } = await import("../../runtime/dynamic-workflow-runner.ts");
487
383
  // Re-synthesize a dynamic-team (§0c C9) for role resolution.
488
384
  const dwfTeam: import("../../teams/team-config.ts").TeamConfig = {
489
385
  name: `dwf-${manifest.runId.slice(-12)}`,
@@ -500,39 +396,27 @@ export async function handleRun(
500
396
  };
501
397
  atomicWriteJson(paths.manifestPath, dwfManifest);
502
398
  try {
503
- let dwfResult:
504
- | import("../../runtime/dynamic-workflow-runner.ts").RunDynamicWorkflowResult
505
- | undefined;
399
+ let dwfResult: import("../../runtime/dynamic-workflow-runner.ts").RunDynamicWorkflowResult | undefined;
506
400
  try {
507
401
  dwfResult = await runDynamicWorkflow({
508
402
  manifest: dwfManifest,
509
- workflow:
510
- workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig,
403
+ workflow: workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig,
511
404
  team: dwfTeam,
512
405
  signal: ctx.signal ?? AbortSignal.timeout(3_600_000),
513
406
  modelOverride: params.model,
514
407
  tokenBudget:
515
408
  params.tokenBudget ??
516
- (
517
- workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig
518
- ).maxTokenBudget,
409
+ (workflow as import("../../workflows/workflow-config.ts").DynamicWorkflowConfig).maxTokenBudget,
519
410
  });
520
411
  } catch (runnerError) {
521
412
  // Round-11 runtime fix: persist manifest with status=failed when runner throws
522
413
  // (e.g., script timeout, script syntax error, async failure). Previously the
523
414
  // manifest stayed at 'queued' indefinitely, leaving an orphan state file.
524
- const failureReason =
525
- runnerError instanceof Error
526
- ? runnerError.message
527
- : String(runnerError);
415
+ const failureReason = runnerError instanceof Error ? runnerError.message : String(runnerError);
528
416
  const failedManifest = {
529
417
  ...dwfManifest,
530
418
  status: "failed" as const,
531
- summary:
532
- `Dynamic workflow '${workflow.name}' failed: ${failureReason}`.slice(
533
- 0,
534
- 2000,
535
- ),
419
+ summary: `Dynamic workflow '${workflow.name}' failed: ${failureReason}`.slice(0, 2000),
536
420
  updatedAt: new Date().toISOString(),
537
421
  };
538
422
  atomicWriteJson(paths.manifestPath, failedManifest);
@@ -555,8 +439,7 @@ export async function handleRun(
555
439
  `Dynamic workflow '${workflow.name}' completed.\n${dwfResult.manifest.summary ?? ""}`,
556
440
  {
557
441
  action: "run",
558
- status:
559
- dwfResult.manifest.status === "failed" ? "error" : "ok",
442
+ status: dwfResult.manifest.status === "failed" ? "error" : "ok",
560
443
  runId: dwfResult.manifest.runId,
561
444
  artifactsRoot: dwfResult.manifest.artifactsRoot,
562
445
  },
@@ -573,10 +456,7 @@ export async function handleRun(
573
456
  // it shows in the run timeline and status, and log it. A malformed config
574
457
  // (bad JSON / wrong types) should not be a silent no-op — doctor/config
575
458
  // actions already surface these; run should too.
576
- const configIssues = [
577
- ...(loadedConfig.error ? [`Config error: ${loadedConfig.error}`] : []),
578
- ...(loadedConfig.warnings ?? []),
579
- ];
459
+ const configIssues = [...(loadedConfig.error ? [`Config error: ${loadedConfig.error}`] : []), ...(loadedConfig.warnings ?? [])];
580
460
  if (configIssues.length > 0) {
581
461
  void appendEventAsync(updatedManifest.eventsPath, {
582
462
  type: "config.warning",
@@ -587,23 +467,14 @@ export async function handleRun(
587
467
  warnings: loadedConfig.warnings,
588
468
  path: loadedConfig.path,
589
469
  },
590
- }).catch((error) =>
591
- logInternalError(
592
- "team-tool.run.configWarning",
593
- error,
594
- `runId=${updatedManifest.runId}`,
595
- ),
596
- );
470
+ }).catch((error) => logInternalError("team-tool.run.configWarning", error, `runId=${updatedManifest.runId}`));
597
471
  logInternalError(
598
472
  "team-tool.run.configWarning",
599
473
  new Error(`config issues: ${configIssues.join("; ")}`),
600
474
  `runId=${updatedManifest.runId} path=${loadedConfig.path ?? "(defaults)"}`,
601
475
  );
602
476
  }
603
- const executedConfig = effectiveRunConfig(
604
- loadedConfig.config,
605
- params.config,
606
- );
477
+ const executedConfig = effectiveRunConfig(loadedConfig.config, params.config);
607
478
  const runtime = await resolveCrewRuntime(executedConfig);
608
479
  const runtimeResolution = runtimeResolutionState(runtime);
609
480
  const executionManifest = {
@@ -618,13 +489,7 @@ export async function handleRun(
618
489
  runId: executionManifest.runId,
619
490
  message: `Runtime resolved: ${runtime.kind} safety=${runtime.safety}`,
620
491
  data: { runtimeResolution },
621
- }).catch((error) =>
622
- logInternalError(
623
- "team-tool.run.resolved",
624
- error,
625
- `runId=${executionManifest.runId}`,
626
- ),
627
- );
492
+ }).catch((error) => logInternalError("team-tool.run.resolved", error, `runId=${executionManifest.runId}`));
628
493
  const runAsync = params.async ?? executedConfig.asyncByDefault ?? false;
629
494
  let effectiveRuntime = runtime;
630
495
  if (runAsync && runtime.kind === "live-session") {
@@ -638,10 +503,7 @@ export async function handleRun(
638
503
  reason: "Background runner cannot use live-session; falling back to child-process.",
639
504
  };
640
505
  }
641
- const effectiveRuntimeResolution =
642
- effectiveRuntime !== runtime
643
- ? runtimeResolutionState(effectiveRuntime)
644
- : runtimeResolution;
506
+ const effectiveRuntimeResolution = effectiveRuntime !== runtime ? runtimeResolutionState(effectiveRuntime) : runtimeResolution;
645
507
  const effectiveManifest =
646
508
  effectiveRuntime !== runtime
647
509
  ? {
@@ -657,26 +519,15 @@ export async function handleRun(
657
519
  runId: effectiveManifest.runId,
658
520
  message: `Runtime overridden: child-process (async fallback from live-session)`,
659
521
  data: { runtimeResolution: effectiveRuntimeResolution },
660
- }).catch((error) =>
661
- logInternalError(
662
- "team-tool.run.override",
663
- error,
664
- `runId=${effectiveManifest.runId}`,
665
- ),
666
- );
522
+ }).catch((error) => logInternalError("team-tool.run.override", error, `runId=${effectiveManifest.runId}`));
667
523
  }
668
524
  if (runAsync) {
669
525
  if (effectiveRuntime.safety === "blocked") {
670
- const runningManifest = updateRunStatus(
671
- effectiveManifest,
672
- "running",
673
- "Checking worker runtime availability.",
674
- );
526
+ const runningManifest = updateRunStatus(effectiveManifest, "running", "Checking worker runtime availability.");
675
527
  const blocked = updateRunStatus(
676
528
  runningManifest,
677
529
  "blocked",
678
- effectiveRuntime.reason ??
679
- "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
530
+ effectiveRuntime.reason ?? "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
680
531
  );
681
532
  void appendEventAsync(blocked.eventsPath, {
682
533
  type: "run.blocked",
@@ -688,8 +539,7 @@ export async function handleRun(
688
539
  async: true,
689
540
  diagnostics: {
690
541
  requestedMode: effectiveRuntime.requestedMode,
691
- workersDisabled:
692
- executedConfig.executeWorkers === false,
542
+ workersDisabled: executedConfig.executeWorkers === false,
693
543
  envCrew: process.env.PI_CREW_EXECUTE_WORKERS,
694
544
  envTeams: process.env.PI_TEAMS_EXECUTE_WORKERS,
695
545
  },
@@ -729,23 +579,11 @@ export async function handleRun(
729
579
  data: { pid: spawned.pid, logPath: spawned.logPath },
730
580
  });
731
581
  ctx.onRunStarted?.(effectiveManifest.runId);
732
- scheduleBackgroundEarlyExitGuard(
733
- resolvedCtx.cwd,
734
- effectiveManifest.runId,
735
- spawned.pid,
736
- spawned.logPath,
737
- );
582
+ scheduleBackgroundEarlyExitGuard(resolvedCtx.cwd, effectiveManifest.runId, spawned.pid, spawned.logPath);
738
583
  // Wait for the async run to complete and return actual results.
739
584
  try {
740
- const completed = await waitForRun(
741
- updatedManifest.runId,
742
- resolvedCtx.cwd,
743
- { timeoutMs: 3600000 },
744
- );
745
- const metrics = collectRunMetrics(
746
- resolvedCtx.cwd,
747
- completed.manifest.runId,
748
- );
585
+ const completed = await waitForRun(updatedManifest.runId, resolvedCtx.cwd, { timeoutMs: 3600000 });
586
+ const metrics = collectRunMetrics(resolvedCtx.cwd, completed.manifest.runId);
749
587
  const lines: string[] = [
750
588
  `pi-crew run ${completed.manifest.status}: ${completed.manifest.runId} (${team.name})`,
751
589
  `Goal: ${goal.slice(0, 100)}`,
@@ -760,19 +598,11 @@ export async function handleRun(
760
598
  if (completed.tasks.length > 0) {
761
599
  // Read run-level summary artifact if present
762
600
  let summaryContent: string | undefined;
763
- const summaryArtifact = completed.manifest.artifacts?.find(
764
- (a: { kind?: string }) => a.kind === "summary",
765
- );
601
+ const summaryArtifact = completed.manifest.artifacts?.find((a: { kind?: string }) => a.kind === "summary");
766
602
  if (summaryArtifact) {
767
603
  try {
768
- const sumPath = path.join(
769
- completed.manifest.artifactsRoot,
770
- summaryArtifact.path,
771
- );
772
- summaryContent = fs
773
- .readFileSync(sumPath, "utf-8")
774
- .trim()
775
- .slice(0, 4000);
604
+ const sumPath = path.join(completed.manifest.artifactsRoot, summaryArtifact.path);
605
+ summaryContent = fs.readFileSync(sumPath, "utf-8").trim().slice(0, 4000);
776
606
  } catch {
777
607
  /* summary unavailable */
778
608
  }
@@ -789,34 +619,19 @@ export async function handleRun(
789
619
  // inside artifactsRoot via the project's safe-path primitive. Rejects
790
620
  // absolute paths (/etc/passwd) and ../ traversal that the old
791
621
  // path.isAbsolute shortcut + bare path.join allowed.
792
- const resPath = resolveRealContainedPath(
793
- completed.manifest.artifactsRoot,
794
- task.resultArtifact.path,
795
- );
796
- resultExcerpt = fs
797
- .readFileSync(resPath, "utf-8")
798
- .trim()
799
- .slice(0, 2000);
622
+ const resPath = resolveRealContainedPath(completed.manifest.artifactsRoot, task.resultArtifact.path);
623
+ resultExcerpt = fs.readFileSync(resPath, "utf-8").trim().slice(0, 2000);
800
624
  } catch {
801
625
  resultExcerpt = "(result unavailable)";
802
626
  }
803
627
  }
804
628
  const shortResult = resultExcerpt.slice(0, 500);
805
629
  const statusTag =
806
- task.status === "completed"
807
- ? "✓"
808
- : task.status === "failed"
809
- ? "✗"
810
- : task.status === "cancelled"
811
- ? "⊘"
812
- : "·";
630
+ task.status === "completed" ? "✓" : task.status === "failed" ? "✗" : task.status === "cancelled" ? "⊘" : "·";
813
631
  taskLines.push(
814
632
  `- ${statusTag} ${task.id} [${task.role}]: ${task.status}${shortResult ? " — " + shortResult : ""}${task.error ? ` | Error: ${task.error.slice(0, 200)}` : ""}`,
815
633
  );
816
- if (
817
- task.status === "failed" ||
818
- task.status === "needs_attention"
819
- ) {
634
+ if (task.status === "failed" || task.status === "needs_attention") {
820
635
  failedCount++;
821
636
  failedIds.push(task.id);
822
637
  }
@@ -837,9 +652,7 @@ export async function handleRun(
837
652
  lines.push("All tasks completed successfully.");
838
653
  } else {
839
654
  lines.push("");
840
- lines.push(
841
- `${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`,
842
- );
655
+ lines.push(`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`);
843
656
  }
844
657
  } else {
845
658
  lines.push(
@@ -849,9 +662,7 @@ export async function handleRun(
849
662
  );
850
663
  }
851
664
 
852
- const runFailed =
853
- completed.manifest.status === "failed" ||
854
- completed.manifest.status === "blocked";
665
+ const runFailed = completed.manifest.status === "failed" || completed.manifest.status === "blocked";
855
666
  return result(
856
667
  lines.join("\n"),
857
668
  {
@@ -864,10 +675,7 @@ export async function handleRun(
864
675
  runFailed,
865
676
  );
866
677
  } catch (waitError: unknown) {
867
- const errorMessage =
868
- waitError instanceof Error
869
- ? waitError.message
870
- : String(waitError);
678
+ const errorMessage = waitError instanceof Error ? waitError.message : String(waitError);
871
679
  return result(
872
680
  [
873
681
  `pi-crew run timed out or failed: ${updatedManifest.runId}`,
@@ -891,16 +699,11 @@ export async function handleRun(
891
699
  }
892
700
 
893
701
  if (runtime.safety === "blocked") {
894
- const runningManifest = updateRunStatus(
895
- executionManifest,
896
- "running",
897
- "Checking worker runtime availability.",
898
- );
702
+ const runningManifest = updateRunStatus(executionManifest, "running", "Checking worker runtime availability.");
899
703
  const blocked = updateRunStatus(
900
704
  runningManifest,
901
705
  "blocked",
902
- runtime.reason ??
903
- "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
706
+ runtime.reason ?? "Child worker execution is disabled; refusing to create no-op scaffold subagents.",
904
707
  );
905
708
  void appendEventAsync(blocked.eventsPath, {
906
709
  type: "run.blocked",
@@ -971,15 +774,8 @@ export async function handleRun(
971
774
 
972
775
  // Wait for the foreground run to complete and return actual results.
973
776
  try {
974
- const completed = await waitForRun(
975
- updatedManifest.runId,
976
- resolvedCtx.cwd,
977
- { timeoutMs: 3600000 },
978
- );
979
- const metrics = collectRunMetrics(
980
- resolvedCtx.cwd,
981
- completed.manifest.runId,
982
- );
777
+ const completed = await waitForRun(updatedManifest.runId, resolvedCtx.cwd, { timeoutMs: 3600000 });
778
+ const metrics = collectRunMetrics(resolvedCtx.cwd, completed.manifest.runId);
983
779
  const lines: string[] = [
984
780
  `pi-crew run ${completed.manifest.status}: ${completed.manifest.runId} (${team.name})`,
985
781
  `Goal: ${goal.slice(0, 100)}`,
@@ -994,19 +790,11 @@ export async function handleRun(
994
790
  if (completed.tasks.length > 0) {
995
791
  // Read run-level summary artifact if present
996
792
  let summaryContent: string | undefined;
997
- const summaryArtifact = completed.manifest.artifacts?.find(
998
- (a: { kind?: string }) => a.kind === "summary",
999
- );
793
+ const summaryArtifact = completed.manifest.artifacts?.find((a: { kind?: string }) => a.kind === "summary");
1000
794
  if (summaryArtifact) {
1001
795
  try {
1002
- const sumPath = path.join(
1003
- completed.manifest.artifactsRoot,
1004
- summaryArtifact.path,
1005
- );
1006
- summaryContent = fs
1007
- .readFileSync(sumPath, "utf-8")
1008
- .trim()
1009
- .slice(0, 4000);
796
+ const sumPath = path.join(completed.manifest.artifactsRoot, summaryArtifact.path);
797
+ summaryContent = fs.readFileSync(sumPath, "utf-8").trim().slice(0, 4000);
1010
798
  } catch {
1011
799
  /* summary unavailable */
1012
800
  }
@@ -1023,34 +811,19 @@ export async function handleRun(
1023
811
  // inside artifactsRoot via the project's safe-path primitive. Rejects
1024
812
  // absolute paths (/etc/passwd) and ../ traversal that the old
1025
813
  // path.isAbsolute shortcut + bare path.join allowed.
1026
- const resPath = resolveRealContainedPath(
1027
- completed.manifest.artifactsRoot,
1028
- task.resultArtifact.path,
1029
- );
1030
- resultExcerpt = fs
1031
- .readFileSync(resPath, "utf-8")
1032
- .trim()
1033
- .slice(0, 2000);
814
+ const resPath = resolveRealContainedPath(completed.manifest.artifactsRoot, task.resultArtifact.path);
815
+ resultExcerpt = fs.readFileSync(resPath, "utf-8").trim().slice(0, 2000);
1034
816
  } catch {
1035
817
  resultExcerpt = "(result unavailable)";
1036
818
  }
1037
819
  }
1038
820
  const shortResult = resultExcerpt.slice(0, 500);
1039
821
  const statusTag =
1040
- task.status === "completed"
1041
- ? "✓"
1042
- : task.status === "failed"
1043
- ? "✗"
1044
- : task.status === "cancelled"
1045
- ? "⊘"
1046
- : "·";
822
+ task.status === "completed" ? "✓" : task.status === "failed" ? "✗" : task.status === "cancelled" ? "⊘" : "·";
1047
823
  taskLines.push(
1048
824
  `- ${statusTag} ${task.id} [${task.role}]: ${task.status}${shortResult ? " — " + shortResult : ""}${task.error ? ` | Error: ${task.error.slice(0, 200)}` : ""}`,
1049
825
  );
1050
- if (
1051
- task.status === "failed" ||
1052
- task.status === "needs_attention"
1053
- ) {
826
+ if (task.status === "failed" || task.status === "needs_attention") {
1054
827
  failedCount++;
1055
828
  failedIds.push(task.id);
1056
829
  }
@@ -1071,9 +844,7 @@ export async function handleRun(
1071
844
  lines.push("All tasks completed successfully.");
1072
845
  } else {
1073
846
  lines.push("");
1074
- lines.push(
1075
- `${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`,
1076
- );
847
+ lines.push(`${failedCount} task(s) failed: ${failedIds.join(", ")}. Consider retrying.`);
1077
848
  }
1078
849
  } else {
1079
850
  lines.push(
@@ -1083,9 +854,7 @@ export async function handleRun(
1083
854
  );
1084
855
  }
1085
856
 
1086
- const runFailed =
1087
- completed.manifest.status === "failed" ||
1088
- completed.manifest.status === "blocked";
857
+ const runFailed = completed.manifest.status === "failed" || completed.manifest.status === "blocked";
1089
858
  return result(
1090
859
  lines.join("\n"),
1091
860
  {
@@ -1098,10 +867,7 @@ export async function handleRun(
1098
867
  runFailed,
1099
868
  );
1100
869
  } catch (waitError: unknown) {
1101
- const errorMessage =
1102
- waitError instanceof Error
1103
- ? waitError.message
1104
- : String(waitError);
870
+ const errorMessage = waitError instanceof Error ? waitError.message : String(waitError);
1105
871
  return result(
1106
872
  [
1107
873
  `pi-crew run timed out or failed: ${updatedManifest.runId}`,
@@ -1171,10 +937,7 @@ export async function handleRun(
1171
937
  status: executed.manifest.status === "failed" ? "error" : "ok",
1172
938
  runId: executed.manifest.runId,
1173
939
  artifactsRoot: executed.manifest.artifactsRoot,
1174
- metrics: collectRunMetrics(
1175
- resolvedCtx.cwd,
1176
- executed.manifest.runId,
1177
- ),
940
+ metrics: collectRunMetrics(resolvedCtx.cwd, executed.manifest.runId),
1178
941
  },
1179
942
  executed.manifest.status === "failed",
1180
943
  );