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
@@ -1,24 +1,25 @@
1
1
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
2
  import type { PiTeamsConfig } from "../../config/config.ts";
3
3
  import type { MetricRegistry } from "../../observability/metric-registry.ts";
4
- import type { TeamToolDetails } from "../team-tool-types.ts";
5
4
  import type { RunSnapshotCache } from "../../ui/run-snapshot-cache.ts";
6
- import { toolResult, type PiTeamsToolResult } from "../tool-result.ts";
5
+ import type { TeamToolDetails } from "../team-tool-types.ts";
6
+ import { type PiTeamsToolResult, toolResult } from "../tool-result.ts";
7
7
 
8
- export type TeamContext = Pick<ExtensionContext, "cwd"> & Partial<Pick<ExtensionContext, "model">> & {
9
- sessionId?: string;
10
- modelRegistry?: unknown;
11
- sessionManager?: { getBranch?: () => unknown[] };
12
- events?: { emit?: (event: string, data: unknown) => void };
13
- metricRegistry?: MetricRegistry;
14
- signal?: AbortSignal;
15
- startForegroundRun?: (runner: (signal?: AbortSignal) => Promise<void>, runId?: string) => void;
16
- abortForegroundRun?: (runId: string) => boolean;
17
- onRunStarted?: (runId: string) => void;
18
- onJsonEvent?: (taskId: string, runId: string, event: unknown) => void;
19
- config?: PiTeamsConfig;
20
- getRunSnapshotCache?: (cwd: string) => RunSnapshotCache;
21
- };
8
+ export type TeamContext = Pick<ExtensionContext, "cwd"> &
9
+ Partial<Pick<ExtensionContext, "model">> & {
10
+ sessionId?: string;
11
+ modelRegistry?: unknown;
12
+ sessionManager?: { getBranch?: () => unknown[] };
13
+ events?: { emit?: (event: string, data: unknown) => void };
14
+ metricRegistry?: MetricRegistry;
15
+ signal?: AbortSignal;
16
+ startForegroundRun?: (runner: (signal?: AbortSignal) => Promise<void>, runId?: string) => void;
17
+ abortForegroundRun?: (runId: string) => boolean;
18
+ onRunStarted?: (runId: string) => void;
19
+ onJsonEvent?: (taskId: string, runId: string, event: unknown) => void;
20
+ config?: PiTeamsConfig;
21
+ getRunSnapshotCache?: (cwd: string) => RunSnapshotCache;
22
+ };
22
23
 
23
24
  export function withSessionId<T extends Pick<ExtensionContext, "sessionManager">>(ctx: T): T & { sessionId?: string } {
24
25
  const sessionId = ctx.sessionManager?.getSessionId?.();
@@ -36,7 +37,14 @@ export function formatScoped(name: string, source: string, description: string):
36
37
  function extractTextContent(content: unknown): string {
37
38
  if (typeof content === "string") return content;
38
39
  if (!Array.isArray(content)) return "";
39
- return content.map((part) => part && typeof part === "object" && !Array.isArray(part) && typeof (part as { text?: unknown }).text === "string" ? (part as { text: string }).text : "").filter(Boolean).join("\n");
40
+ return content
41
+ .map((part) =>
42
+ part && typeof part === "object" && !Array.isArray(part) && typeof (part as { text?: unknown }).text === "string"
43
+ ? (part as { text: string }).text
44
+ : "",
45
+ )
46
+ .filter(Boolean)
47
+ .join("\n");
40
48
  }
41
49
 
42
50
  export function buildParentContext(ctx: TeamContext): string | undefined {
@@ -45,15 +53,27 @@ export function buildParentContext(ctx: TeamContext): string | undefined {
45
53
  const parts: string[] = [];
46
54
  for (const entry of branch.slice(-20)) {
47
55
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) continue;
48
- const record = entry as { type?: unknown; message?: unknown; summary?: unknown };
56
+ const record = entry as {
57
+ type?: unknown;
58
+ message?: unknown;
59
+ summary?: unknown;
60
+ };
49
61
  if (record.type === "compaction" && typeof record.summary === "string") parts.push(`[Summary]: ${record.summary}`);
50
- const message = record.message && typeof record.message === "object" && !Array.isArray(record.message) ? record.message as { role?: unknown; content?: unknown } : undefined;
62
+ const message =
63
+ record.message && typeof record.message === "object" && !Array.isArray(record.message)
64
+ ? (record.message as { role?: unknown; content?: unknown })
65
+ : undefined;
51
66
  if (!message || (message.role !== "user" && message.role !== "assistant")) continue;
52
67
  const text = extractTextContent(message.content).trim();
53
68
  if (text) parts.push(`[${message.role === "user" ? "User" : "Assistant"}]: ${text}`);
54
69
  }
55
70
  if (!parts.length) return undefined;
56
- return [`# Parent Conversation Context`, "The following context was inherited from the parent Pi session. Treat it as reference-only.", "", parts.join("\n\n")].join("\n");
71
+ return [
72
+ `# Parent Conversation Context`,
73
+ "The following context was inherited from the parent Pi session. Treat it as reference-only.",
74
+ "",
75
+ parts.join("\n\n"),
76
+ ].join("\n");
57
77
  }
58
78
 
59
79
  export function configRecord(config: unknown): Record<string, unknown> {
@@ -20,7 +20,15 @@
20
20
  * 5. Otherwise → blocked with a reason telling the user what to pass.
21
21
  */
22
22
 
23
- export const DESTRUCTIVE_TEAM_ACTIONS = new Set(["delete", "forget", "prune", "cleanup", "workflow-create", "workflow-save", "workflow-delete"]);
23
+ export const DESTRUCTIVE_TEAM_ACTIONS = new Set([
24
+ "delete",
25
+ "forget",
26
+ "prune",
27
+ "cleanup",
28
+ "workflow-create",
29
+ "workflow-save",
30
+ "workflow-delete",
31
+ ]);
24
32
 
25
33
  export interface TeamToolInputLike {
26
34
  action?: unknown;
@@ -33,10 +41,7 @@ export interface TeamToolInputLike {
33
41
  * Decide whether a destructive team action should be blocked.
34
42
  * @returns block reason string, or `undefined` to allow.
35
43
  */
36
- export function shouldBlockDestructiveTeamAction(
37
- action: string | undefined,
38
- input: TeamToolInputLike,
39
- ): string | undefined {
44
+ export function shouldBlockDestructiveTeamAction(action: string | undefined, input: TeamToolInputLike): string | undefined {
40
45
  if (!action || !DESTRUCTIVE_TEAM_ACTIONS.has(action)) return undefined;
41
46
  // dryRun cleanup is a PREVIEW (no writes) — never needs confirm.
42
47
  if (action === "cleanup" && input.dryRun === true) return undefined;
@@ -2,19 +2,19 @@ import { execFileSync, spawnSync } from "node:child_process";
2
2
  import * as fs from "node:fs";
3
3
  import * as path from "node:path";
4
4
  import { allAgents, discoverAgents } from "../../agents/discover-agents.ts";
5
- import { allTeams, discoverTeams } from "../../teams/discover-teams.ts";
6
- import { allWorkflows, discoverWorkflows } from "../../workflows/discover-workflows.ts";
7
5
  import { loadConfig } from "../../config/config.ts";
8
- import { projectCrewRoot, userCrewRoot } from "../../utils/paths.ts";
9
6
  import { DEFAULT_PATHS } from "../../config/defaults.ts";
10
- import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
7
+ import { type DriftReport, detectDrift, formatDriftReport } from "../../config/drift-detector.ts";
11
8
  import { getPiSpawnCommand } from "../../runtime/pi-spawn.ts";
12
9
  import { getRuntimeWarmupStatus } from "../../runtime/runtime-warmup.ts";
13
- import { scanZombieSubagents, formatZombieReport } from "../../runtime/zombie-scanner.ts";
14
- import { validateResources } from "../validate-resources.ts";
15
- import { detectDrift, formatDriftReport, type DriftReport } from "../../config/drift-detector.ts";
10
+ import { formatZombieReport, scanZombieSubagents } from "../../runtime/zombie-scanner.ts";
11
+ import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
16
12
  import { TeamToolParams } from "../../schema/team-tool-schema.ts";
13
+ import { allTeams, discoverTeams } from "../../teams/discover-teams.ts";
14
+ import { projectCrewRoot, userCrewRoot } from "../../utils/paths.ts";
15
+ import { allWorkflows, discoverWorkflows } from "../../workflows/discover-workflows.ts";
17
16
  import type { PiTeamsToolResult } from "../tool-result.ts";
17
+ import { validateResources } from "../validate-resources.ts";
18
18
  import { configRecord, result, type TeamContext } from "./context.ts";
19
19
 
20
20
  interface DoctorCheck {
@@ -25,7 +25,12 @@ interface DoctorCheck {
25
25
 
26
26
  function firstOutputLine(stdout: string | null | undefined, stderr: string | null | undefined): string {
27
27
  const output = `${stdout ?? ""}\n${stderr ?? ""}`.trim();
28
- return output.split(/\r?\n/).find((line) => line.trim().length > 0)?.trim() ?? "available";
28
+ return (
29
+ output
30
+ .split(/\r?\n/)
31
+ .find((line) => line.trim().length > 0)
32
+ ?.trim() ?? "available"
33
+ );
29
34
  }
30
35
 
31
36
  // Round 29 optimization: memoize spawnSync probe results at module level.
@@ -42,16 +47,28 @@ function commandExists(command: string, args: string[]): { ok: boolean; detail:
42
47
  if (cached) return cached;
43
48
  let result: { ok: boolean; detail: string };
44
49
  try {
45
- const output = spawnSync(command, args, { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
50
+ const output = spawnSync(command, args, {
51
+ encoding: "utf-8",
52
+ stdio: ["ignore", "pipe", "pipe"],
53
+ });
46
54
  if (output.error) {
47
55
  result = { ok: false, detail: output.error.message };
48
56
  } else if (output.status !== 0) {
49
- result = { ok: false, detail: firstOutputLine(output.stdout, output.stderr) || `status ${output.status}` };
57
+ result = {
58
+ ok: false,
59
+ detail: firstOutputLine(output.stdout, output.stderr) || `status ${output.status}`,
60
+ };
50
61
  } else {
51
- result = { ok: true, detail: firstOutputLine(output.stdout, output.stderr) };
62
+ result = {
63
+ ok: true,
64
+ detail: firstOutputLine(output.stdout, output.stderr),
65
+ };
52
66
  }
53
67
  } catch (error) {
54
- result = { ok: false, detail: error instanceof Error ? error.message : String(error) };
68
+ result = {
69
+ ok: false,
70
+ detail: error instanceof Error ? error.message : String(error),
71
+ };
55
72
  }
56
73
  commandExistsCache.set(cacheKey, result);
57
74
  return result;
@@ -67,7 +84,10 @@ function piCommandExists(): { ok: boolean; detail: string } {
67
84
  return piCommandExistsCache;
68
85
  }
69
86
  const executable = spec.command === "pi" ? "pi" : `${spec.command} ${spec.args[0] ?? ""}`.trim();
70
- piCommandExistsCache = { ok: true, detail: `${output.detail} (${executable})` };
87
+ piCommandExistsCache = {
88
+ ok: true,
89
+ detail: `${output.detail} (${executable})`,
90
+ };
71
91
  return piCommandExistsCache;
72
92
  }
73
93
 
@@ -81,7 +101,10 @@ function checkWritableDir(dir: string): { ok: boolean; detail: string } {
81
101
  fs.writeFileSync(probePath, "ok", "utf-8");
82
102
  fs.rmSync(probePath, { force: true });
83
103
  } catch {
84
- return { ok: false, detail: `${dir}: not writable (write test failed)` };
104
+ return {
105
+ ok: false,
106
+ detail: `${dir}: not writable (write test failed)`,
107
+ };
85
108
  }
86
109
  return { ok: true, detail: dir };
87
110
  } catch (error) {
@@ -96,7 +119,8 @@ function auditJsonSchema(schema: unknown): string[] {
96
119
  if (!node || typeof node !== "object" || Array.isArray(node)) return;
97
120
  const record = node as Record<string, unknown>;
98
121
  if (Array.isArray(record.type)) issues.push("schema node uses array-valued type");
99
- if (record.description && !record.type && !record.anyOf && !record.oneOf && !record.allOf && !record.properties) issues.push(`description-only schema node: ${record.description}`);
122
+ if (record.description && !record.type && !record.anyOf && !record.oneOf && !record.allOf && !record.properties)
123
+ issues.push(`description-only schema node: ${record.description}`);
100
124
  if (record.type === "array" && !record.items) issues.push("array schema missing items");
101
125
  if (record.type && (record.anyOf || record.oneOf)) issues.push("schema node combines type with union keyword");
102
126
  for (const value of Object.values(record)) {
@@ -160,58 +184,128 @@ export function buildTeamDoctorReport(input: TeamDoctorReportInput): TeamDoctorR
160
184
  const pi = piCommandExists();
161
185
  return [
162
186
  { label: "cwd", ok: true, detail: input.cwd },
163
- { label: "platform", ok: true, detail: `${process.platform}/${process.arch} node=${process.version}` },
187
+ {
188
+ label: "platform",
189
+ ok: true,
190
+ detail: `${process.platform}/${process.arch} node=${process.version}`,
191
+ },
164
192
  { label: "pi command", ok: pi.ok, detail: pi.detail },
165
193
  { label: "git command", ok: git.ok, detail: git.detail },
166
- { label: "config", ok: input.configErrors.length === 0, detail: `${input.configPath} (${input.configErrors.length} errors)` },
167
- { label: "model", ok: true, detail: input.model ? `${input.model.provider}/${input.model.id}` : "not available in this context" },
168
- { label: "config warnings", ok: true, detail: `${input.configWarnings.length} warnings` },
194
+ {
195
+ label: "config",
196
+ ok: input.configErrors.length === 0,
197
+ detail: `${input.configPath} (${input.configErrors.length} errors)`,
198
+ },
199
+ {
200
+ label: "model",
201
+ ok: true,
202
+ detail: input.model ? `${input.model.provider}/${input.model.id}` : "not available in this context",
203
+ },
204
+ {
205
+ label: "config warnings",
206
+ ok: true,
207
+ detail: `${input.configWarnings.length} warnings`,
208
+ },
169
209
  ];
170
210
  }),
171
211
  section("Filesystem", () => {
172
212
  const userWritable = checkWritableDir(userCrewRoot());
173
213
  const projectWritable = checkWritableDir(projectCrewRoot(input.cwd));
174
214
  return [
175
- { label: "user state", ok: userWritable.ok || userWritable.detail.endsWith(": missing"), detail: userWritable.detail },
176
- { label: "project state", ok: projectWritable.ok || projectWritable.detail.endsWith(": missing"), detail: projectWritable.detail },
177
- { label: "project state root", ok: true, detail: path.join(projectCrewRoot(input.cwd), DEFAULT_PATHS.state.runsSubdir) },
178
- { label: "artifacts root", ok: true, detail: path.join(projectCrewRoot(input.cwd), DEFAULT_PATHS.state.artifactsSubdir) },
215
+ {
216
+ label: "user state",
217
+ ok: userWritable.ok || userWritable.detail.endsWith(": missing"),
218
+ detail: userWritable.detail,
219
+ },
220
+ {
221
+ label: "project state",
222
+ ok: projectWritable.ok || projectWritable.detail.endsWith(": missing"),
223
+ detail: projectWritable.detail,
224
+ },
225
+ {
226
+ label: "project state root",
227
+ ok: true,
228
+ detail: path.join(projectCrewRoot(input.cwd), DEFAULT_PATHS.state.runsSubdir),
229
+ },
230
+ {
231
+ label: "artifacts root",
232
+ ok: true,
233
+ detail: path.join(projectCrewRoot(input.cwd), DEFAULT_PATHS.state.artifactsSubdir),
234
+ },
179
235
  ];
180
236
  }),
181
237
  section("Discovery", () => {
182
238
  const agentModelHints = discoveredAgentsAll.filter((agent) => agent.model || agent.fallbackModels?.length).length;
183
239
  return [
184
- { label: "agents", ok: true, detail: `${discoveredAgentsAll.length} discovered` },
185
- { label: "teams", ok: true, detail: `${discoveredTeamsAll.length} discovered` },
186
- { label: "workflows", ok: true, detail: `${discoveredWorkflowsAll.length} discovered` },
187
- { label: "resource model hints", ok: true, detail: `${agentModelHints} agents declare model/fallback preferences` },
240
+ {
241
+ label: "agents",
242
+ ok: true,
243
+ detail: `${discoveredAgentsAll.length} discovered`,
244
+ },
245
+ {
246
+ label: "teams",
247
+ ok: true,
248
+ detail: `${discoveredTeamsAll.length} discovered`,
249
+ },
250
+ {
251
+ label: "workflows",
252
+ ok: true,
253
+ detail: `${discoveredWorkflowsAll.length} discovered`,
254
+ },
255
+ {
256
+ label: "resource model hints",
257
+ ok: true,
258
+ detail: `${agentModelHints} agents declare model/fallback preferences`,
259
+ },
188
260
  ];
189
261
  }),
190
- section("Resource validation", () => [{
191
- label: "resource validation",
192
- ok: input.validationErrors === 0,
193
- detail: `${input.validationErrors} errors, ${input.validationWarnings} warnings`,
194
- }]),
262
+ section("Resource validation", () => [
263
+ {
264
+ label: "resource validation",
265
+ ok: input.validationErrors === 0,
266
+ detail: `${input.validationErrors} errors, ${input.validationWarnings} warnings`,
267
+ },
268
+ ]),
195
269
  section("Drift", () => {
196
270
  const driftErrors = driftResult.items.filter((item) => item.severity === "error").length;
197
271
  const driftWarnings = driftResult.items.filter((item) => item.severity === "warning").length;
198
- return [{
199
- label: "config drift",
200
- ok: !driftResult.hasDrift || driftErrors === 0,
201
- detail: driftResult.hasDrift ? `${driftErrors} errors, ${driftWarnings} warnings` : "no drift detected",
202
- }];
272
+ return [
273
+ {
274
+ label: "config drift",
275
+ ok: !driftResult.hasDrift || driftErrors === 0,
276
+ detail: driftResult.hasDrift ? `${driftErrors} errors, ${driftWarnings} warnings` : "no drift detected",
277
+ },
278
+ ];
203
279
  }),
204
280
  section("Schema", () => {
205
281
  const schemaIssues = auditJsonSchema(TeamToolParams);
206
- return [{ label: "strict-provider schema", ok: schemaIssues.length === 0, detail: schemaIssues.length ? schemaIssues.slice(0, 3).join("; ") : "team tool schema compatible" }];
282
+ return [
283
+ {
284
+ label: "strict-provider schema",
285
+ ok: schemaIssues.length === 0,
286
+ detail: schemaIssues.length ? schemaIssues.slice(0, 3).join("; ") : "team tool schema compatible",
287
+ },
288
+ ];
207
289
  }),
208
290
  section("Async/result delivery", () => [
209
- { label: "result watcher", ok: true, detail: "fs.watch with polling fallback for EMFILE/ENOSPC/EPERM" },
210
- { label: "async notifier", ok: true, detail: "session-stale guarded completion notifications enabled" },
291
+ {
292
+ label: "result watcher",
293
+ ok: true,
294
+ detail: "fs.watch with polling fallback for EMFILE/ENOSPC/EPERM",
295
+ },
296
+ {
297
+ label: "async notifier",
298
+ ok: true,
299
+ detail: "session-stale guarded completion notifications enabled",
300
+ },
211
301
  ]),
212
302
  section("Worktrees", () => [
213
303
  { label: "leader repository", ok: true, detail: input.cwd },
214
- { label: "cleanup policy", ok: true, detail: "dirty worktrees preserved unless force is set" },
304
+ {
305
+ label: "cleanup policy",
306
+ ok: true,
307
+ detail: "dirty worktrees preserved unless force is set",
308
+ },
215
309
  ]),
216
310
  section("Runtime warmup (cold-start fix v0.8.6)", () => {
217
311
  // Surface whether the general cold-start-race fix is active + how long
@@ -229,17 +323,27 @@ export function buildTeamDoctorReport(input: TeamDoctorReportInput): TeamDoctorR
229
323
  {
230
324
  label: "warmup started",
231
325
  ok: true, // informational — "not started" is not a failure
232
- detail: status.started ? "module graph pre-warmed at registration" : "not started in this process (normal for direct unit-test calls; in a live Pi session, started at extension load)",
326
+ detail: status.started
327
+ ? "module graph pre-warmed at registration"
328
+ : "not started in this process (normal for direct unit-test calls; in a live Pi session, started at extension load)",
233
329
  },
234
330
  ];
235
331
  if (status.started) {
236
332
  checks.push({
237
333
  label: "warmup completed",
238
334
  ok: status.completed,
239
- detail: status.completed ? (status.durationMs !== undefined ? `graph warm in ${status.durationMs}ms` : "completed") : "in progress",
335
+ detail: status.completed
336
+ ? status.durationMs !== undefined
337
+ ? `graph warm in ${status.durationMs}ms`
338
+ : "completed"
339
+ : "in progress",
240
340
  });
241
341
  if (status.error) {
242
- checks.push({ label: "warmup error", ok: false, detail: status.error });
342
+ checks.push({
343
+ label: "warmup error",
344
+ ok: false,
345
+ detail: status.error,
346
+ });
243
347
  }
244
348
  }
245
349
  return checks;
@@ -257,7 +361,11 @@ export function buildTeamDoctorReport(input: TeamDoctorReportInput): TeamDoctorR
257
361
  }
258
362
  if (lines.at(-1) === "") lines.pop();
259
363
  const text = lines.join("\n");
260
- return { text, hasErrors: sections.some((sectionLines) => sectionLines.some((line) => line.includes("FAIL"))), drift: driftResult.hasDrift ? driftResult : undefined };
364
+ return {
365
+ text,
366
+ hasErrors: sections.some((sectionLines) => sectionLines.some((line) => line.includes("FAIL"))),
367
+ drift: driftResult.hasDrift ? driftResult : undefined,
368
+ };
261
369
  }
262
370
 
263
371
  export function handleDoctor(ctx: TeamContext, params: TeamToolParamsValue = {}): PiTeamsToolResult {
@@ -267,11 +375,19 @@ export function handleDoctor(ctx: TeamContext, params: TeamToolParamsValue = {})
267
375
  if (params.focus === "zombies") {
268
376
  const scan = scanZombieSubagents();
269
377
  const text = formatZombieReport(scan);
270
- return result(text, {
271
- action: "doctor",
272
- status: "ok",
273
- data: { zombies: scan.zombies.length, live: scan.live.length, errors: scan.errors.length },
274
- }, false);
378
+ return result(
379
+ text,
380
+ {
381
+ action: "doctor",
382
+ status: "ok",
383
+ data: {
384
+ zombies: scan.zombies.length,
385
+ live: scan.live.length,
386
+ errors: scan.errors.length,
387
+ },
388
+ },
389
+ false,
390
+ );
275
391
  }
276
392
 
277
393
  const loadedConfig = loadConfig(ctx.cwd);
@@ -285,7 +401,10 @@ export function handleDoctor(ctx: TeamContext, params: TeamToolParamsValue = {})
285
401
  stdio: ["ignore", "pipe", "pipe"],
286
402
  timeout: 15_000,
287
403
  }).trim();
288
- smokeChildPi = { ok: output.includes("PI-TEAMS-SMOKE-OK"), detail: output.split("\n").slice(-1)[0] ?? "completed" };
404
+ smokeChildPi = {
405
+ ok: output.includes("PI-TEAMS-SMOKE-OK"),
406
+ detail: output.split("\n").slice(-1)[0] ?? "completed",
407
+ };
289
408
  } catch (error) {
290
409
  const message = error instanceof Error ? error.message : String(error);
291
410
  smokeChildPi = { ok: false, detail: message };