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,6 +1,6 @@
1
1
  import type { BeforeAgentStartEvent, ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- import { effectiveAutonomousConfig, loadConfig, type PiTeamsAutonomousConfig } from "../config/config.ts";
3
2
  import { allAgents, discoverAgents } from "../agents/discover-agents.ts";
3
+ import { effectiveAutonomousConfig, loadConfig, type PiTeamsAutonomousConfig } from "../config/config.ts";
4
4
  import { allTeams, discoverTeams } from "../teams/discover-teams.ts";
5
5
  import { allWorkflows, discoverWorkflows } from "../workflows/discover-workflows.ts";
6
6
 
@@ -12,27 +12,29 @@ const DEFAULT_MAGIC_KEYWORDS: Record<string, string[]> = {
12
12
  };
13
13
 
14
14
  const BULLET_OR_NUMBERED_TASK_RE = /^\s*(?:[-*•]|\d+[.)])\s+\S+/;
15
- const ACTIONABLE_TASK_TERMS: readonly string[] = Array.from(new Set([
16
- "implement",
17
- "refactor",
18
- "migrate",
19
- "fix",
20
- "add",
21
- "update",
22
- "test",
23
- "review",
24
- "research",
25
- "analyze",
26
- "document",
27
- "docs",
28
- "sửa",
29
- "thêm",
30
- "cập nhật",
31
- "kiểm thử",
32
- "nghiên cứu",
33
- "phân tích",
34
- "viết docs",
35
- ]));
15
+ const ACTIONABLE_TASK_TERMS: readonly string[] = Array.from(
16
+ new Set([
17
+ "implement",
18
+ "refactor",
19
+ "migrate",
20
+ "fix",
21
+ "add",
22
+ "update",
23
+ "test",
24
+ "review",
25
+ "research",
26
+ "analyze",
27
+ "document",
28
+ "docs",
29
+ "sửa",
30
+ "thêm",
31
+ "cập nhật",
32
+ "kiểm thử",
33
+ "nghiên cứu",
34
+ "phân tích",
35
+ "viết docs",
36
+ ]),
37
+ );
36
38
 
37
39
  function mergeMagicKeywords(configured: Record<string, string[]> | undefined): Record<string, string[]> {
38
40
  return { ...DEFAULT_MAGIC_KEYWORDS, ...(configured ?? {}) };
@@ -49,7 +51,9 @@ function actionableLineCount(prompt: string): number {
49
51
  function hasTaskListSignal(prompt: string): boolean {
50
52
  const lower = prompt.toLowerCase();
51
53
  const bulletCount = prompt.split(/\r?\n/).filter((line) => BULLET_OR_NUMBERED_TASK_RE.test(line)).length;
52
- const explicitList = ["các task", "danh sách task", "todo", "tasks sau", "task list", "làm lần lượt"].some((term) => lower.includes(term));
54
+ const explicitList = ["các task", "danh sách task", "todo", "tasks sau", "task list", "làm lần lượt"].some((term) =>
55
+ lower.includes(term),
56
+ );
53
57
  return bulletCount >= 3 || actionableLineCount(prompt) >= 2 || (explicitList && bulletCount >= 2);
54
58
  }
55
59
 
@@ -69,9 +73,10 @@ export function buildAutonomousPolicy(prompt: string, config: PiTeamsAutonomousC
69
73
  const asyncGuidance = effective.preferAsyncForLongTasks
70
74
  ? "For long-running team runs, prefer async: true unless the user needs immediate foreground progress."
71
75
  : "Use async: true only when the task is clearly long-running or the user asks for background execution.";
72
- const worktreeGuidance = effective.allowWorktreeSuggestion === false
73
- ? "Do not suggest worktree mode unless the user explicitly asks for it."
74
- : "Consider workspaceMode: 'worktree' for parallel or risky code-changing work in clean git repositories.";
76
+ const worktreeGuidance =
77
+ effective.allowWorktreeSuggestion === false
78
+ ? "Do not suggest worktree mode unless the user explicitly asks for it."
79
+ : "Consider workspaceMode: 'worktree' for parallel or risky code-changing work in clean git repositories.";
75
80
  return [
76
81
  "# pi-crew Delegation Policy (MANDATORY)",
77
82
  "",
@@ -83,7 +88,7 @@ export function buildAutonomousPolicy(prompt: string, config: PiTeamsAutonomousC
83
88
  "| Task characteristic | Delegate? | Method |",
84
89
  "|---|---|---|",
85
90
  "| Read/edit 1-2 files, simple question | NO | Do it directly |",
86
- "| User explicitly says \"do it yourself\" / \"no team\" | NO | Do it directly |",
91
+ '| User explicitly says "do it yourself" / "no team" | NO | Do it directly |',
87
92
  "| Destructive action (delete/prune/forget) | NO | Ask for confirmation first |",
88
93
  "| Research / deep-read / source audit / \"nghiên cứu\" | YES | `team action='research'` |",
89
94
  "| Multi-file implementation / feature / refactor | YES | `team action='run', team='implementation'` |",
@@ -109,7 +114,9 @@ export function buildAutonomousPolicy(prompt: string, config: PiTeamsAutonomousC
109
114
  "",
110
115
  asyncGuidance,
111
116
  worktreeGuidance,
112
- intents.length > 0 ? `Detected pi-crew routing signals/intents in the user prompt: ${intents.join(", ")}. Consider the matching team workflow if appropriate.` : "No explicit pi-crew routing signal was detected; decide based on complexity, risk, task-list structure, and conflict potential.",
117
+ intents.length > 0
118
+ ? `Detected pi-crew routing signals/intents in the user prompt: ${intents.join(", ")}. Consider the matching team workflow if appropriate.`
119
+ : "No explicit pi-crew routing signal was detected; decide based on complexity, risk, task-list structure, and conflict potential.",
113
120
  ].join("\n");
114
121
  }
115
122
 
@@ -135,35 +142,68 @@ function capLines(lines: string[], maxChars: number): string[] {
135
142
  }
136
143
 
137
144
  export function buildResourceRoutingGuidance(cwd: string, maxChars = 5000): string {
138
- const teams = allTeams(discoverTeams(cwd)).sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source)).slice(0, 12);
139
- const workflows = allWorkflows(discoverWorkflows(cwd)).sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source)).slice(0, 12);
140
- const agents = allAgents(discoverAgents(cwd)).sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source)).slice(0, 16);
145
+ const teams = allTeams(discoverTeams(cwd))
146
+ .sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source))
147
+ .slice(0, 12);
148
+ const workflows = allWorkflows(discoverWorkflows(cwd))
149
+ .sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source))
150
+ .slice(0, 12);
151
+ const agents = allAgents(discoverAgents(cwd))
152
+ .sort((a, b) => sourcePriority(a.source) - sourcePriority(b.source))
153
+ .slice(0, 16);
141
154
  const lines = [
142
155
  "# pi-crew Available Resources",
143
156
  "Use project-scoped resources over user/builtin resources when names overlap.",
144
157
  "Teams:",
145
- ...(teams.length ? teams.map((team) => `- ${team.name} (${team.source}): ${team.description}; defaultWorkflow=${team.defaultWorkflow ?? "default"}; roles=${team.roles.map((role) => `${role.name}->${role.agent}`).join(", ") || "none"}${team.routing?.triggers?.length ? `; triggers=${team.routing.triggers.join(",")}` : ""}${team.routing?.useWhen?.length ? `; useWhen=${team.routing.useWhen.join(";")}` : ""}`) : ["- (none)"]),
158
+ ...(teams.length
159
+ ? teams.map(
160
+ (team) =>
161
+ `- ${team.name} (${team.source}): ${team.description}; defaultWorkflow=${team.defaultWorkflow ?? "default"}; roles=${team.roles.map((role) => `${role.name}->${role.agent}`).join(", ") || "none"}${team.routing?.triggers?.length ? `; triggers=${team.routing.triggers.join(",")}` : ""}${team.routing?.useWhen?.length ? `; useWhen=${team.routing.useWhen.join(";")}` : ""}`,
162
+ )
163
+ : ["- (none)"]),
146
164
  "Workflows:",
147
- ...(workflows.length ? workflows.map((workflow) => `- ${workflow.name} (${workflow.source}): ${workflow.description}; steps=${workflow.steps.map((step) => `${step.id}:${step.role}`).join(", ") || "none"}`) : ["- (none)"]),
165
+ ...(workflows.length
166
+ ? workflows.map(
167
+ (workflow) =>
168
+ `- ${workflow.name} (${workflow.source}): ${workflow.description}; steps=${workflow.steps.map((step) => `${step.id}:${step.role}`).join(", ") || "none"}`,
169
+ )
170
+ : ["- (none)"]),
148
171
  "Agents:",
149
- ...(agents.length ? agents.map((agent) => `- ${agent.name} (${agent.source}): ${agent.description}${agent.routing?.triggers?.length ? `; triggers=${agent.routing.triggers.join(",")}` : ""}${agent.routing?.useWhen?.length ? `; useWhen=${agent.routing.useWhen.join(";")}` : ""}${agent.routing?.avoidWhen?.length ? `; avoidWhen=${agent.routing.avoidWhen.join(";")}` : ""}${agent.routing?.cost ? `; cost=${agent.routing.cost}` : ""}${agent.routing?.category ? `; category=${agent.routing.category}` : ""}`) : ["- (none)"]),
172
+ ...(agents.length
173
+ ? agents.map(
174
+ (agent) =>
175
+ `- ${agent.name} (${agent.source}): ${agent.description}${agent.routing?.triggers?.length ? `; triggers=${agent.routing.triggers.join(",")}` : ""}${agent.routing?.useWhen?.length ? `; useWhen=${agent.routing.useWhen.join(";")}` : ""}${agent.routing?.avoidWhen?.length ? `; avoidWhen=${agent.routing.avoidWhen.join(";")}` : ""}${agent.routing?.cost ? `; cost=${agent.routing.cost}` : ""}${agent.routing?.category ? `; category=${agent.routing.category}` : ""}`,
176
+ )
177
+ : ["- (none)"]),
150
178
  ];
151
179
  return capLines(lines, maxChars).join("\n");
152
180
  }
153
181
 
154
- export function appendAutonomousPolicy(systemPrompt: string, userPrompt: string, config: PiTeamsAutonomousConfig = {}, cwd?: string): string {
182
+ export function appendAutonomousPolicy(
183
+ systemPrompt: string,
184
+ userPrompt: string,
185
+ config: PiTeamsAutonomousConfig = {},
186
+ cwd?: string,
187
+ ): string {
155
188
  const resourceGuidance = cwd ? `\n\n${buildResourceRoutingGuidance(cwd)}` : "";
156
189
  return `${systemPrompt}\n\n${buildAutonomousPolicy(userPrompt, config)}${resourceGuidance}`;
157
190
  }
158
191
 
159
192
  export function registerAutonomousPolicy(pi: ExtensionAPI): void {
160
193
  pi.on("before_agent_start", (event: BeforeAgentStartEvent) => {
161
- const options = (event as BeforeAgentStartEvent & { systemPromptOptions?: { cwd?: unknown } }).systemPromptOptions ?? {};
194
+ const options =
195
+ (
196
+ event as BeforeAgentStartEvent & {
197
+ systemPromptOptions?: { cwd?: unknown };
198
+ }
199
+ ).systemPromptOptions ?? {};
162
200
  const cwd = typeof options.cwd === "string" ? options.cwd : undefined;
163
201
  const loaded = loadConfig(cwd);
164
202
  const autonomous = effectiveAutonomousConfig(loaded.config.autonomous);
165
203
  if (!autonomous.enabled) return undefined;
166
204
  if (!autonomous.injectPolicy) return undefined;
167
- return { systemPrompt: appendAutonomousPolicy(event.systemPrompt, event.prompt, autonomous, cwd) };
205
+ return {
206
+ systemPrompt: appendAutonomousPolicy(event.systemPrompt, event.prompt, autonomous, cwd),
207
+ };
168
208
  });
169
209
  }
@@ -10,19 +10,20 @@
10
10
  * requiring the user to memorize long generated IDs.
11
11
  */
12
12
  import type { AutocompleteItem } from "@earendil-works/pi-tui";
13
- import { listRecentRuns } from "./run-index.ts";
14
- import { discoverTeams, allTeams } from "../teams/discover-teams.ts";
15
- import { discoverWorkflows, allWorkflows } from "../workflows/discover-workflows.ts";
16
- import { discoverAgents, allAgents } from "../agents/discover-agents.ts";
13
+ import { allAgents, discoverAgents } from "../agents/discover-agents.ts";
17
14
  import type { TeamRunManifest } from "../state/types.ts";
15
+ import { allTeams, discoverTeams } from "../teams/discover-teams.ts";
16
+ import { allWorkflows, discoverWorkflows } from "../workflows/discover-workflows.ts";
17
+ import { listRecentRuns } from "./run-index.ts";
18
18
 
19
19
  const MAX_RUN_SUGGESTIONS = 15;
20
20
 
21
21
  function filterByPrefix(items: AutocompleteItem[], prefix: string): AutocompleteItem[] | null {
22
22
  const trimmed = prefix.trim();
23
- const filtered = trimmed === ""
24
- ? items
25
- : items.filter((item) => item.value.startsWith(trimmed) || item.label.toLowerCase().includes(trimmed.toLowerCase()));
23
+ const filtered =
24
+ trimmed === ""
25
+ ? items
26
+ : items.filter((item) => item.value.startsWith(trimmed) || item.label.toLowerCase().includes(trimmed.toLowerCase()));
26
27
  return filtered.length > 0 ? filtered.slice(0, MAX_RUN_SUGGESTIONS) : null;
27
28
  }
28
29
 
@@ -67,7 +68,7 @@ export function suggestRunIds(_prefix: string, cwd?: string): AutocompleteItem[]
67
68
  export async function suggestTaskIds(runId: string, prefix: string, cwd?: string): Promise<AutocompleteItem[] | null> {
68
69
  const resolvedCwd = cwd ?? process.cwd();
69
70
  // Dynamic import to avoid pulling state-store into the hot command-registration path.
70
- // LAZY: defer dynamic import of ../state/state-store.ts to its call site.
71
+ // LAZY: defer dynamic import of ../state/state-store.ts to its call site.
71
72
  const { loadRunManifestById } = await import("../state/state-store.ts");
72
73
  const loaded = loadRunManifestById(resolvedCwd, runId);
73
74
  if (!loaded) return null;
@@ -33,10 +33,10 @@
33
33
 
34
34
  import type { AgentMessage } from "@earendil-works/pi-agent-core";
35
35
  import type { Message } from "@earendil-works/pi-ai";
36
- import type { ExtensionAPI, ContextEvent } from "@earendil-works/pi-coding-agent";
37
- import { collectInFlightRuns } from "./registration/compaction-guard.ts";
38
- import { extractSessionId } from "../utils/session-utils.ts";
36
+ import type { ContextEvent, ExtensionAPI } from "@earendil-works/pi-coding-agent";
39
37
  import type { TeamRunManifest } from "../state/types.ts";
38
+ import { extractSessionId } from "../utils/session-utils.ts";
39
+ import { collectInFlightRuns } from "./registration/compaction-guard.ts";
40
40
 
41
41
  /** Sentinel that marks an injected ambient-status user message. */
42
42
  export const AMBIENT_STATUS_SENTINEL = "[pi-crew ambient status";
@@ -64,7 +64,9 @@ function runAge(createdAt?: string, updatedAt?: string): string {
64
64
  if (Number.isFinite(created)) {
65
65
  return `, running ${humanizeMs(Date.now() - created)}`;
66
66
  }
67
- } catch { /* ignore malformed timestamps */ }
67
+ } catch {
68
+ /* ignore malformed timestamps */
69
+ }
68
70
  return "";
69
71
  }
70
72
 
@@ -84,8 +86,7 @@ function humanizeMs(ms: number): string {
84
86
  */
85
87
  export function formatAmbientStatus(runs: TeamRunManifest[]): string {
86
88
  if (runs.length === 0) return "";
87
- const truncate = (s: string, n: number): string =>
88
- s.length > n ? `${s.slice(0, n - 1)}…` : s;
89
+ const truncate = (s: string, n: number): string => (s.length > n ? `${s.slice(0, n - 1)}…` : s);
89
90
  const lines: string[] = [
90
91
  `${AMBIENT_STATUS_SENTINEL} — environmental context, not a user request]`,
91
92
  `${runs.length} pi-crew run${runs.length === 1 ? "" : "s"} in flight:`,
@@ -99,7 +100,9 @@ export function formatAmbientStatus(runs: TeamRunManifest[]): string {
99
100
  if (runs.length > MAX_INLINE_RUNS) {
100
101
  lines.push(`• …and ${runs.length - MAX_INLINE_RUNS} more`);
101
102
  }
102
- lines.push("Inspect/join via the `team` tool: action=\"status\" (list), action=\"wait\" (join running), action=\"summary\"/action=\"get\" (results).");
103
+ lines.push(
104
+ 'Inspect/join via the `team` tool: action="status" (list), action="wait" (join running), action="summary"/action="get" (results).',
105
+ );
103
106
  return lines.join("\n");
104
107
  }
105
108
 
@@ -163,10 +166,7 @@ export function handleContextEvent(event: ContextEvent, cwd: string, sessionId?:
163
166
  * Pass `enabled: false` (from `runtime.reliability.ambientStatusInjection`) to
164
167
  * disable the feature without unwiring the handler.
165
168
  */
166
- export function registerContextStatusInjection(
167
- pi: ExtensionAPI,
168
- opts: { enabled?: boolean } = {},
169
- ): void {
169
+ export function registerContextStatusInjection(pi: ExtensionAPI, opts: { enabled?: boolean } = {}): void {
170
170
  if (opts.enabled === false) return;
171
171
  pi.on("context", (event: ContextEvent, ctx: unknown): AmbientContextResult | undefined => {
172
172
  // crew state is per-project; use the session ctx cwd when available,
@@ -176,7 +176,9 @@ export function registerContextStatusInjection(
176
176
  const cwd =
177
177
  typeof ctx === "object" && ctx !== null && typeof (ctx as { cwd?: unknown }).cwd === "string"
178
178
  ? (ctx as { cwd: string }).cwd
179
- : typeof process.cwd === "function" ? process.cwd() : ".";
179
+ : typeof process.cwd === "function"
180
+ ? process.cwd()
181
+ : ".";
180
182
  const sessionId = extractSessionId(ctx);
181
183
  return handleContextEvent(event, cwd, sessionId);
182
184
  });
@@ -12,11 +12,7 @@
12
12
  * slash-command, file (`@`), and command-argument completion all keep working
13
13
  * unchanged.
14
14
  */
15
- import type {
16
- AutocompleteItem,
17
- AutocompleteProvider,
18
- AutocompleteSuggestions,
19
- } from "@earendil-works/pi-tui";
15
+ import type { AutocompleteItem, AutocompleteProvider, AutocompleteSuggestions } from "@earendil-works/pi-tui";
20
16
  import { CREW_PHRASES } from "./crew-input-router.ts";
21
17
 
22
18
  /** Max phrases to suggest. */
@@ -68,9 +64,7 @@ export function suggestCrewPhrases(query: string): AutocompleteItem[] {
68
64
  * a crew natural-language trigger, returns phrase suggestions; otherwise
69
65
  * delegates to `current`.
70
66
  */
71
- export function createCrewAutocompleteProvider(
72
- current: AutocompleteProvider,
73
- ): AutocompleteProvider {
67
+ export function createCrewAutocompleteProvider(current: AutocompleteProvider): AutocompleteProvider {
74
68
  return {
75
69
  async getSuggestions(
76
70
  lines: string[],
@@ -115,11 +109,7 @@ export function createCrewAutocompleteProvider(
115
109
  return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
116
110
  },
117
111
 
118
- shouldTriggerFileCompletion(
119
- lines: string[],
120
- cursorLine: number,
121
- cursorCol: number,
122
- ): boolean {
112
+ shouldTriggerFileCompletion(lines: string[], cursorLine: number, cursorCol: number): boolean {
123
113
  // Suppress file-completion trigger inside a crew phrase so the
124
114
  // editor doesn't pop a file list over our phrase suggestions.
125
115
  if (cursorLine === 0) {
@@ -132,8 +122,10 @@ export function createCrewAutocompleteProvider(
132
122
  }
133
123
 
134
124
  /** Register the crew autocomplete provider on a Pi UI context. Safe to call once. */
135
- export function registerCrewAutocomplete(
136
- ctx: { ui?: { addAutocompleteProvider?: (factory: (current: AutocompleteProvider) => AutocompleteProvider) => void } },
137
- ): void {
125
+ export function registerCrewAutocomplete(ctx: {
126
+ ui?: {
127
+ addAutocompleteProvider?: (factory: (current: AutocompleteProvider) => AutocompleteProvider) => void;
128
+ };
129
+ }): void {
138
130
  ctx.ui?.addAutocompleteProvider?.((current) => createCrewAutocompleteProvider(current));
139
131
  }
@@ -1,6 +1,7 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- import { logInternalError } from "../utils/internal-error.ts";
3
2
  import { cleanupAllTrackedTempDirs } from "../runtime/pi-args.ts";
3
+ import { logInternalError } from "../utils/internal-error.ts";
4
+
4
5
  // NOTE: globalProgressTracker import kept for documentation but not directly used
5
6
  // since we don't have agent IDs to untrack. Actual progress clearing should be
6
7
  // handled by the progress tracker itself on shutdown.
@@ -50,7 +50,7 @@ const CREW_SHORTCUTS: ReadonlyArray<ShortcutRegistration> = [
50
50
  // (avoids pulling the full commands.ts dependency tree into every
51
51
  // process that imports this module, e.g. the unit test).
52
52
  handler: async (ctx) => {
53
- // LAZY: defer dynamic import of ./registration/commands.ts to its call site.
53
+ // LAZY: defer dynamic import of ./registration/commands.ts to its call site.
54
54
  const { openTeamSettingsOverlay } = await import("./registration/commands.ts");
55
55
  await openTeamSettingsOverlay(ctx);
56
56
  },
@@ -61,7 +61,7 @@ const CREW_SHORTCUTS: ReadonlyArray<ShortcutRegistration> = [
61
61
  // Lazy-import so the heavy UI module chain (RunDashboard etc.) is only
62
62
  // loaded on first use, not at extension load.
63
63
  handler: async (ctx) => {
64
- // LAZY: defer dynamic import of ./registration/commands.ts to its call site.
64
+ // LAZY: defer dynamic import of ./registration/commands.ts to its call site.
65
65
  const { openTeamDashboard } = await import("./registration/commands.ts");
66
66
  await openTeamDashboard(ctx);
67
67
  },
@@ -72,11 +72,14 @@ const CREW_SHORTCUTS: ReadonlyArray<ShortcutRegistration> = [
72
72
  * Register all crew keyboard shortcuts on a Pi instance. Safe to call once at
73
73
  * extension load. No-ops when `registerShortcut` is unavailable (older Pi).
74
74
  */
75
- export function registerCrewShortcuts(
76
- pi: { registerShortcut?: (shortcut: KeyId, options: { description?: string; handler: ShortcutHandler }) => void },
77
- ): void {
75
+ export function registerCrewShortcuts(pi: {
76
+ registerShortcut?: (shortcut: KeyId, options: { description?: string; handler: ShortcutHandler }) => void;
77
+ }): void {
78
78
  for (const sc of CREW_SHORTCUTS) {
79
- pi.registerShortcut?.(sc.key, { description: sc.description, handler: sc.handler });
79
+ pi.registerShortcut?.(sc.key, {
80
+ description: sc.description,
81
+ handler: sc.handler,
82
+ });
80
83
  }
81
84
  }
82
85