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,11 +1,11 @@
1
+ import * as crypto from "node:crypto";
1
2
  import * as fs from "node:fs";
2
3
  import * as path from "node:path";
3
- import * as crypto from "node:crypto";
4
- import { assertRunBundle } from "./run-bundle-schema.ts";
5
- import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
6
4
  import { DEFAULT_PATHS } from "../config/defaults.ts";
5
+ import { type ConflictReport, detectImportConflicts } from "../runtime/delta-conflict.ts";
6
+ import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
7
7
  import { assertSafePathId, resolveContainedRelativePath, resolveRealContainedPath } from "../utils/safe-paths.ts";
8
- import { detectImportConflicts, type ConflictReport } from "../runtime/delta-conflict.ts";
8
+ import { assertRunBundle } from "./run-bundle-schema.ts";
9
9
 
10
10
  export interface ImportedRunBundleInfo {
11
11
  runId: string;
@@ -29,8 +29,16 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
29
29
  // Path containment: use resolveRealContainedPath for canonical real-path check
30
30
  // to prevent symlink/../ bypass of the startsWith string comparison.
31
31
  const allowedBases: string[] = [];
32
- try { allowedBases.push(userCrewRoot()); } catch { /* ignore */ }
33
- try { allowedBases.push(projectCrewRoot(cwd)); } catch { /* ignore */ }
32
+ try {
33
+ allowedBases.push(userCrewRoot());
34
+ } catch {
35
+ /* ignore */
36
+ }
37
+ try {
38
+ allowedBases.push(projectCrewRoot(cwd));
39
+ } catch {
40
+ /* ignore */
41
+ }
34
42
  allowedBases.push(cwd); // always include cwd last (highest priority)
35
43
  let isContained = false;
36
44
  for (const base of allowedBases) {
@@ -38,7 +46,9 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
38
46
  resolveRealContainedPath(base, resolvedPath);
39
47
  isContained = true;
40
48
  break;
41
- } catch { /* not contained — try next base */ }
49
+ } catch {
50
+ /* not contained — try next base */
51
+ }
42
52
  }
43
53
  if (!isContained) throw new Error(`Import path must be within project directory or crew root: ${resolvedPath}`);
44
54
  const raw = JSON.parse(fs.readFileSync(resolvedPath, "utf-8")) as unknown;
@@ -46,12 +56,19 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
46
56
 
47
57
  // Integrity check: verify SHA-256 hash if present in manifest
48
58
  const bundleJson = fs.readFileSync(resolvedPath, "utf-8");
49
- const parsedForHash = JSON.parse(bundleJson) as { manifest?: { sha256?: string } };
59
+ const parsedForHash = JSON.parse(bundleJson) as {
60
+ manifest?: { sha256?: string };
61
+ };
50
62
  if (parsedForHash.manifest?.sha256) {
51
63
  const expectedHash = parsedForHash.manifest.sha256;
52
64
  // Recompute hash by stringifying the bundle without the sha256 field
53
- const { sha256: _sha256, ...manifestWithoutHash } = parsedForHash.manifest as Record<string, unknown> & { sha256?: string };
54
- const bundleForHash = { ...parsedForHash, manifest: manifestWithoutHash };
65
+ const { sha256: _sha256, ...manifestWithoutHash } = parsedForHash.manifest as Record<string, unknown> & {
66
+ sha256?: string;
67
+ };
68
+ const bundleForHash = {
69
+ ...parsedForHash,
70
+ manifest: manifestWithoutHash,
71
+ };
55
72
  const recomputedHash = crypto.createHash("sha256").update(JSON.stringify(bundleForHash)).digest("hex");
56
73
  if (recomputedHash !== expectedHash) {
57
74
  throw new Error(`Integrity check failed: SHA-256 mismatch. Expected ${expectedHash}, got ${recomputedHash}`);
@@ -66,9 +83,15 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
66
83
  try {
67
84
  const existingManifestPath = path.join(importRoot(cwd, scope), runId, "run-export.json");
68
85
  if (fs.existsSync(existingManifestPath)) {
69
- const existingRaw = JSON.parse(fs.readFileSync(existingManifestPath, "utf-8")) as { manifest?: Record<string, unknown>; tasks?: unknown[] };
86
+ const existingRaw = JSON.parse(fs.readFileSync(existingManifestPath, "utf-8")) as {
87
+ manifest?: Record<string, unknown>;
88
+ tasks?: unknown[];
89
+ };
70
90
  conflictReport = detectImportConflicts(
71
- { manifest: raw.manifest as unknown as Record<string, unknown>, tasks: raw.tasks as unknown[] },
91
+ {
92
+ manifest: raw.manifest as unknown as Record<string, unknown>,
93
+ tasks: raw.tasks as unknown[],
94
+ },
72
95
  { manifest: existingRaw.manifest, tasks: existingRaw.tasks },
73
96
  );
74
97
  }
@@ -94,20 +117,32 @@ export function importRunBundle(cwd: string, bundlePath: string, scope: "project
94
117
  if (fs.existsSync(target) && fs.lstatSync(target).isSymbolicLink()) throw new Error(`Invalid import target: ${target}`);
95
118
  }
96
119
  fs.writeFileSync(targetJson, `${JSON.stringify({ ...raw, importedAt, importedFrom: resolvedPath }, null, 2)}\n`, "utf-8");
97
- fs.writeFileSync(targetSummary, [
98
- `# Imported pi-crew run ${runId}`,
99
- "",
100
- `Imported: ${importedAt}`,
101
- `Source: ${resolvedPath}`,
102
- `Original export: ${raw.exportedAt}`,
103
- `Status: ${raw.manifest.status}`,
104
- `Team: ${raw.manifest.team}`,
105
- `Workflow: ${raw.manifest.workflow ?? "(none)"}`,
106
- `Goal: ${raw.manifest.goal}`,
107
- "",
108
- "## Tasks",
109
- ...raw.tasks.map((task) => `- ${task.id}: ${task.status} (${task.role} -> ${task.agent})${task.error ? ` - ${task.error}` : ""}`),
110
- "",
111
- ].join("\n"), "utf-8");
112
- return { runId, importedAt, bundlePath: targetJson, summaryPath: targetSummary, ...(conflictReport?.hasConflicts ? { conflictReport } : {}) };
113
- }
120
+ fs.writeFileSync(
121
+ targetSummary,
122
+ [
123
+ `# Imported pi-crew run ${runId}`,
124
+ "",
125
+ `Imported: ${importedAt}`,
126
+ `Source: ${resolvedPath}`,
127
+ `Original export: ${raw.exportedAt}`,
128
+ `Status: ${raw.manifest.status}`,
129
+ `Team: ${raw.manifest.team}`,
130
+ `Workflow: ${raw.manifest.workflow ?? "(none)"}`,
131
+ `Goal: ${raw.manifest.goal}`,
132
+ "",
133
+ "## Tasks",
134
+ ...raw.tasks.map(
135
+ (task) => `- ${task.id}: ${task.status} (${task.role} -> ${task.agent})${task.error ? ` - ${task.error}` : ""}`,
136
+ ),
137
+ "",
138
+ ].join("\n"),
139
+ "utf-8",
140
+ );
141
+ return {
142
+ runId,
143
+ importedAt,
144
+ bundlePath: targetJson,
145
+ summaryPath: targetSummary,
146
+ ...(conflictReport?.hasConflicts ? { conflictReport } : {}),
147
+ };
148
+ }
@@ -1,13 +1,13 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as os from "node:os";
3
3
  import * as path from "node:path";
4
- import type { TeamRunManifest } from "../state/types.ts";
5
4
  import { DEFAULT_PATHS } from "../config/defaults.ts";
6
- import { findRepoRoot, projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
5
+ import { createCancellationToken } from "../runtime/cancellation-token.ts";
7
6
  import { activeRunEntries } from "../state/active-run-registry.ts";
7
+ import type { TeamRunManifest } from "../state/types.ts";
8
+ import { findRepoRoot, projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
8
9
  import { isSafePathId, resolveRealContainedPath } from "../utils/safe-paths.ts";
9
10
  import { sharedScanCache } from "../utils/scan-cache.ts";
10
- import { createCancellationToken } from "../runtime/cancellation-token.ts";
11
11
 
12
12
  function readManifest(filePath: string): TeamRunManifest | undefined {
13
13
  const cached = sharedScanCache.readAndCache("manifests", filePath, filePath);
@@ -29,7 +29,8 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
29
29
  const tempDirs = [os.tmpdir(), "/var/tmp", "/tmp"];
30
30
  const isTempRoot = tempDirs.some((t) => root.startsWith(t + path.sep));
31
31
  const token = createCancellationToken({ signal });
32
- const entries = fs.readdirSync(runsRoot, { withFileTypes: true })
32
+ const entries = fs
33
+ .readdirSync(runsRoot, { withFileTypes: true })
33
34
  .filter((entry) => entry.isDirectory() && isSafePathId(entry.name))
34
35
  .map((entry) => entry.name)
35
36
  .sort((a, b) => (b ?? "").localeCompare(a ?? ""));
@@ -42,7 +43,12 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
42
43
  if (!manifest) continue;
43
44
  // Filter out ghost runs: active status but CWD no longer exists.
44
45
  // These are deadletter/replay/temp runs whose temp dirs were cleaned up.
45
- if ((manifest.status === "queued" || manifest.status === "running" || manifest.status === "planning") && manifest.cwd && !fs.existsSync(manifest.cwd)) continue;
46
+ if (
47
+ (manifest.status === "queued" || manifest.status === "running" || manifest.status === "planning") &&
48
+ manifest.cwd &&
49
+ !fs.existsSync(manifest.cwd)
50
+ )
51
+ continue;
46
52
  // 2.19 — for runs in temp directories, verify the background process is alive.
47
53
  // Without this, runs that completed/crashed but left stale manifests will still show.
48
54
  if (isTempRoot && (manifest.status === "running" || manifest.status === "queued" || manifest.status === "planning")) {
@@ -51,12 +57,20 @@ function collectRuns(root: string, maxEntries?: number, signal?: AbortSignal): T
51
57
  const pidData = JSON.parse(fs.readFileSync(asyncPidPath, "utf-8"));
52
58
  const pid = pidData?.pid;
53
59
  if (pid && typeof pid === "number") {
54
- try { process.kill(pid, 0); } catch { continue; } // PID dead, skip this run
60
+ try {
61
+ process.kill(pid, 0);
62
+ } catch {
63
+ continue;
64
+ } // PID dead, skip this run
55
65
  }
56
- } catch { /* no async.pid or parse error — keep the run */ }
66
+ } catch {
67
+ /* no async.pid or parse error — keep the run */
68
+ }
57
69
  }
58
70
  results.push(manifest);
59
- } catch { /* skip unreadable manifests */ }
71
+ } catch {
72
+ /* skip unreadable manifests */
73
+ }
60
74
  }
61
75
  return results;
62
76
  }
@@ -98,7 +112,12 @@ export function listRecentRuns(cwd: string, max = 20, signal?: AbortSignal): Tea
98
112
  * - "user": only runs in the user crew root
99
113
  * - "all" (default): merge both scopes (current behavior)
100
114
  */
101
- export function listRunsByScope(cwd: string, scope: "project" | "user" | "all" = "all", max?: number, signal?: AbortSignal): TeamRunManifest[] {
115
+ export function listRunsByScope(
116
+ cwd: string,
117
+ scope: "project" | "user" | "all" = "all",
118
+ max?: number,
119
+ signal?: AbortSignal,
120
+ ): TeamRunManifest[] {
102
121
  const projectRoot = findRepoRoot(cwd);
103
122
  switch (scope) {
104
123
  case "project":
@@ -1,14 +1,13 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
+ import { DEFAULT_PATHS } from "../config/defaults.ts";
4
+ import { createCancellationToken } from "../runtime/cancellation-token.ts";
3
5
  import type { TeamRunManifest } from "../state/types.ts";
4
- import { resolveRealContainedPath } from "../utils/safe-paths.ts";
5
- import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
6
- import { listRuns } from "./run-index.ts";
7
6
  import { logInternalError } from "../utils/internal-error.ts";
7
+ import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
8
8
  import { redactSecrets } from "../utils/redaction.ts";
9
- import { createCancellationToken } from "../runtime/cancellation-token.ts";
10
- import { DEFAULT_PATHS } from "../config/defaults.ts";
11
- import { isSafePathId } from "../utils/safe-paths.ts";
9
+ import { isSafePathId, resolveRealContainedPath } from "../utils/safe-paths.ts";
10
+ import { listRuns } from "./run-index.ts";
12
11
 
13
12
  export interface PruneRunsResult {
14
13
  kept: string[];
@@ -50,7 +49,9 @@ function appendPruneAudit(cwd: string, payload: Record<string, unknown>): string
50
49
 
51
50
  export function pruneFinishedRuns(cwd: string, keep: number, options: PruneRunsOptions = {}): PruneRunsResult {
52
51
  const token = createCancellationToken({ signal: options.signal });
53
- const finished = listRuns(cwd, options.signal).filter((run) => run.cwd === cwd && isFinished(run)).sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""));
52
+ const finished = listRuns(cwd, options.signal)
53
+ .filter((run) => run.cwd === cwd && isFinished(run))
54
+ .sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""));
54
55
  const kept = finished.slice(0, keep).map((run) => run.runId);
55
56
  const removed: string[] = [];
56
57
  const toRemove = finished.slice(keep);
@@ -58,14 +59,24 @@ export function pruneFinishedRuns(cwd: string, keep: number, options: PruneRunsO
58
59
  if (i % 5 === 0) token.heartbeat(`prune:${i}/${toRemove.length}`);
59
60
  const run = toRemove[i];
60
61
  if (!isSafeToPrune(cwd, run)) {
61
- logInternalError("prune.path-unsafe", new Error(`Skipping unsafe prune: stateRoot=${run.stateRoot}, artifactsRoot=${run.artifactsRoot}`), `runId=${run.runId}`);
62
+ logInternalError(
63
+ "prune.path-unsafe",
64
+ new Error(`Skipping unsafe prune: stateRoot=${run.stateRoot}, artifactsRoot=${run.artifactsRoot}`),
65
+ `runId=${run.runId}`,
66
+ );
62
67
  continue;
63
68
  }
64
69
  fs.rmSync(run.stateRoot, { recursive: true, force: true });
65
70
  fs.rmSync(run.artifactsRoot, { recursive: true, force: true });
66
71
  removed.push(run.runId);
67
72
  }
68
- const auditPath = appendPruneAudit(cwd, { action: "prune", keep, intent: options.intent, kept, removed });
73
+ const auditPath = appendPruneAudit(cwd, {
74
+ action: "prune",
75
+ keep,
76
+ intent: options.intent,
77
+ kept,
78
+ removed,
79
+ });
69
80
  return { kept, removed, auditPath };
70
81
  }
71
82
 
@@ -85,9 +96,15 @@ export function pruneUserLevelRuns(keep: number): PruneRunsResult {
85
96
 
86
97
  // Read all run directories, parse manifests, filter to finished
87
98
  const MAX_DIRS = 500;
88
- const finished: Array<{ runId: string; updatedAt: string; stateRoot: string; artifactsRoot: string }> = [];
99
+ const finished: Array<{
100
+ runId: string;
101
+ updatedAt: string;
102
+ stateRoot: string;
103
+ artifactsRoot: string;
104
+ }> = [];
89
105
  const ghostRemoved: string[] = [];
90
- const dirs = fs.readdirSync(runsRoot, { withFileTypes: true })
106
+ const dirs = fs
107
+ .readdirSync(runsRoot, { withFileTypes: true })
91
108
  .filter((entry) => entry.isDirectory() && isSafePathId(entry.name))
92
109
  .slice(0, MAX_DIRS)
93
110
  .map((entry) => entry.name);
@@ -105,7 +122,10 @@ export function pruneUserLevelRuns(keep: number): PruneRunsResult {
105
122
  // These are deadletter/replay/temp runs from dead Pi sessions.
106
123
  const isActive = manifest.status === "queued" || manifest.status === "running" || manifest.status === "planning";
107
124
  if (isActive && manifest.cwd && !fs.existsSync(manifest.cwd)) {
108
- fs.rmSync(path.join(runsRoot, dir), { recursive: true, force: true });
125
+ fs.rmSync(path.join(runsRoot, dir), {
126
+ recursive: true,
127
+ force: true,
128
+ });
109
129
  ghostRemoved.push(manifest.runId);
110
130
  continue;
111
131
  }
@@ -1,7 +1,7 @@
1
1
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import { readCrewAgents } from "../runtime/crew-agent-records.ts";
2
3
  import { isDisplayActiveRun } from "../runtime/process-status.ts";
3
4
  import { listRuns } from "./run-index.ts";
4
- import { readCrewAgents } from "../runtime/crew-agent-records.ts";
5
5
 
6
6
  export function notifyActiveRuns(ctx: ExtensionContext): void {
7
7
  const active = listRuns(ctx.cwd)
@@ -2,8 +2,12 @@ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
2
  import { listRuns } from "./run-index.ts";
3
3
  // Lazy-loaded: team-tool.ts pulls in entire runtime chain.
4
4
  import type { handleTeamTool as HandleTeamToolFn } from "./team-tool.ts";
5
+
5
6
  let _cachedHandleTeamTool: typeof HandleTeamToolFn | undefined;
6
- async function handleTeamTool(params: Parameters<typeof HandleTeamToolFn>[0], ctx: Parameters<typeof HandleTeamToolFn>[1]): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
7
+ async function handleTeamTool(
8
+ params: Parameters<typeof HandleTeamToolFn>[0],
9
+ ctx: Parameters<typeof HandleTeamToolFn>[1],
10
+ ): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
7
11
  if (!_cachedHandleTeamTool) {
8
12
  // LAZY: team-tool.ts pulls in the entire runtime chain.
9
13
  const mod = await import("./team-tool.ts");
@@ -11,6 +15,7 @@ async function handleTeamTool(params: Parameters<typeof HandleTeamToolFn>[0], ct
11
15
  }
12
16
  return _cachedHandleTeamTool(params, ctx);
13
17
  }
18
+
14
19
  import { isToolError, textFromToolResult } from "./tool-result.ts";
15
20
 
16
21
  async function notifyResult(ctx: ExtensionCommandContext, result: Awaited<ReturnType<typeof handleTeamTool>>): Promise<void> {
@@ -53,14 +58,48 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
53
58
  const avoidWhen = await ctx.ui.input("Avoid when (comma-separated)", "");
54
59
  const cost = await ctx.ui.select("Cost", ["cheap", "free", "expensive"]);
55
60
  const category = await ctx.ui.input("Category", "custom");
56
- const baseConfig = { name, description, scope: "project", triggers, useWhen, avoidWhen, cost, category };
61
+ const baseConfig = {
62
+ name,
63
+ description,
64
+ scope: "project",
65
+ triggers,
66
+ useWhen,
67
+ avoidWhen,
68
+ cost,
69
+ category,
70
+ };
57
71
  if (resource === "agent") {
58
72
  const systemPrompt = isUpdate ? undefined : `You are ${name}.`;
59
- await notifyResult(ctx, await handleTeamTool({ action: isUpdate ? "update" : "create", resource, agent: name, config: { ...baseConfig, systemPrompt } }, ctx));
73
+ await notifyResult(
74
+ ctx,
75
+ await handleTeamTool(
76
+ {
77
+ action: isUpdate ? "update" : "create",
78
+ resource,
79
+ agent: name,
80
+ config: { ...baseConfig, systemPrompt },
81
+ },
82
+ ctx,
83
+ ),
84
+ );
60
85
  return;
61
86
  }
62
87
  const agent = await ctx.ui.input("Role agent", "executor");
63
- await notifyResult(ctx, await handleTeamTool({ action: isUpdate ? "update" : "create", resource, team: name, config: { ...baseConfig, roles: [{ name: "executor", agent: agent || "executor" }] } }, ctx));
88
+ await notifyResult(
89
+ ctx,
90
+ await handleTeamTool(
91
+ {
92
+ action: isUpdate ? "update" : "create",
93
+ resource,
94
+ team: name,
95
+ config: {
96
+ ...baseConfig,
97
+ roles: [{ name: "executor", agent: agent || "executor" }],
98
+ },
99
+ },
100
+ ctx,
101
+ ),
102
+ );
64
103
  return;
65
104
  }
66
105
 
@@ -71,7 +110,19 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
71
110
  if (!goal) return;
72
111
  const asyncRun = await ctx.ui.confirm("Async run?", "Run in detached background mode?");
73
112
  const worktree = await ctx.ui.confirm("Worktree mode?", "Use git worktrees for task workspaces? Requires a clean repo by default.");
74
- await notifyResult(ctx, await handleTeamTool({ action: "run", team: team || "default", goal, async: asyncRun, workspaceMode: worktree ? "worktree" : "single" }, ctx));
113
+ await notifyResult(
114
+ ctx,
115
+ await handleTeamTool(
116
+ {
117
+ action: "run",
118
+ team: team || "default",
119
+ goal,
120
+ async: asyncRun,
121
+ workspaceMode: worktree ? "worktree" : "single",
122
+ },
123
+ ctx,
124
+ ),
125
+ );
75
126
  return;
76
127
  }
77
128
 
@@ -80,7 +131,10 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
80
131
  ctx.ui.notify("No pi-crew runs found.", "info");
81
132
  return;
82
133
  }
83
- const selected = await ctx.ui.select("Select run", runs.map((run) => `${run.runId} [${run.status}] ${run.team}/${run.workflow ?? "none"}`));
134
+ const selected = await ctx.ui.select(
135
+ "Select run",
136
+ runs.map((run) => `${run.runId} [${run.status}] ${run.team}/${run.workflow ?? "none"}`),
137
+ );
84
138
  if (!selected) return;
85
139
  const runId = selected.split(" ")[0];
86
140
  if (!runId) return;
@@ -90,7 +144,10 @@ export async function handleTeamManagerCommand(_args: string, ctx: ExtensionComm
90
144
  return;
91
145
  }
92
146
  if (action === "Cleanup run worktrees") {
93
- const force = await ctx.ui.confirm("Force cleanup?", "Force may remove dirty worktrees. Choose false to preserve dirty worktrees and capture cleanup diffs.");
147
+ const force = await ctx.ui.confirm(
148
+ "Force cleanup?",
149
+ "Force may remove dirty worktrees. Choose false to preserve dirty worktrees and capture cleanup diffs.",
150
+ );
94
151
  await notifyResult(ctx, await handleTeamTool({ action: "cleanup", runId, force }, ctx));
95
152
  }
96
153
  }