pi-crew 0.9.15 → 0.9.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21790 -0
  4. package/dist/index.mjs +83070 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/docs/A +358 -0
  7. package/docs/M-A +357 -0
  8. package/docs/REVIEW-FINDINGS-2026-06 +357 -0
  9. package/docs/Y +357 -0
  10. package/docs/a +357 -0
  11. package/docs/aA +358 -0
  12. package/docs/archive/README.md +91 -0
  13. package/docs/patterns/command-agent-skill.md +1 -1
  14. package/docs/skills/REFERENCE.md +0 -17
  15. package/docs//303/242mmaAAA/303/242 +357 -0
  16. package/index.bundle.ts +25 -0
  17. package/index.ts +95 -4
  18. package/package.json +15 -4
  19. package/skills/iterative-audit/SKILL.md +0 -1
  20. package/skills/widget-rendering/SKILL.md +17 -0
  21. package/src/adapters/claude-adapter.ts +1 -3
  22. package/src/adapters/export-util.ts +16 -16
  23. package/src/adapters/index.ts +5 -5
  24. package/src/agents/agent-config.ts +20 -14
  25. package/src/agents/agent-serializer.ts +1 -1
  26. package/src/agents/discover-agents.ts +83 -39
  27. package/src/benchmark/benchmark-runner.ts +51 -51
  28. package/src/benchmark/feedback-loop.ts +1 -1
  29. package/src/config/config.ts +166 -590
  30. package/src/config/defaults.ts +28 -2
  31. package/src/config/drift-detector.ts +11 -14
  32. package/src/config/markers.ts +201 -203
  33. package/src/config/resilient-parser.ts +14 -6
  34. package/src/config/role-tools.ts +3 -3
  35. package/src/config/suggestions.ts +5 -12
  36. package/src/config/types.ts +9 -25
  37. package/src/errors.ts +151 -157
  38. package/src/extension/action-suggestions.ts +54 -9
  39. package/src/extension/async-notifier.ts +43 -13
  40. package/src/extension/autonomous-policy.ts +77 -37
  41. package/src/extension/command-completions.ts +9 -8
  42. package/src/extension/context-status-injection.ts +14 -12
  43. package/src/extension/crew-autocomplete.ts +8 -16
  44. package/src/extension/crew-cleanup.ts +2 -1
  45. package/src/extension/crew-shortcuts.ts +9 -6
  46. package/src/extension/cross-extension-rpc.ts +136 -42
  47. package/src/extension/help.ts +1 -1
  48. package/src/extension/import-index.ts +10 -5
  49. package/src/extension/knowledge-injection.ts +88 -15
  50. package/src/extension/management.ts +89 -349
  51. package/src/extension/message-renderers.ts +3 -4
  52. package/src/extension/notification-router.ts +22 -5
  53. package/src/extension/notification-sink.ts +6 -3
  54. package/src/extension/pi-api.ts +17 -8
  55. package/src/extension/plan-orchestrate.ts +8 -27
  56. package/src/extension/project-init.ts +21 -6
  57. package/src/extension/register.ts +329 -975
  58. package/src/extension/registration/artifact-cleanup.ts +9 -4
  59. package/src/extension/registration/command-utils.ts +5 -1
  60. package/src/extension/registration/commands.ts +806 -314
  61. package/src/extension/registration/compaction-guard.ts +15 -15
  62. package/src/extension/registration/lifecycle.ts +259 -0
  63. package/src/extension/registration/observability.ts +293 -0
  64. package/src/extension/registration/subagent-helpers.ts +29 -7
  65. package/src/extension/registration/subagent-tools.ts +253 -44
  66. package/src/extension/registration/team-tool.ts +19 -84
  67. package/src/extension/registration/ui.ts +168 -0
  68. package/src/extension/registration/viewers.ts +64 -24
  69. package/src/extension/result-watcher.ts +18 -7
  70. package/src/extension/run-bundle-schema.ts +21 -6
  71. package/src/extension/run-export.ts +15 -6
  72. package/src/extension/run-import.ts +64 -29
  73. package/src/extension/run-index.ts +28 -9
  74. package/src/extension/run-maintenance.ts +32 -12
  75. package/src/extension/session-summary.ts +1 -1
  76. package/src/extension/team-manager-command.ts +64 -7
  77. package/src/extension/team-onboard.ts +151 -150
  78. package/src/extension/team-recommendation.ts +121 -21
  79. package/src/extension/team-tool/anchor.ts +31 -64
  80. package/src/extension/team-tool/api.ts +929 -141
  81. package/src/extension/team-tool/auto-summarize.ts +14 -26
  82. package/src/extension/team-tool/cache-control.ts +1 -5
  83. package/src/extension/team-tool/cancel.ts +138 -38
  84. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  85. package/src/extension/team-tool/chain-executor.ts +29 -51
  86. package/src/extension/team-tool/config-patch.ts +1 -1
  87. package/src/extension/team-tool/context.ts +40 -20
  88. package/src/extension/team-tool/destructive-gate.ts +10 -5
  89. package/src/extension/team-tool/doctor.ts +170 -51
  90. package/src/extension/team-tool/explain.ts +228 -214
  91. package/src/extension/team-tool/failure-patterns.ts +3 -9
  92. package/src/extension/team-tool/goal-wrap.ts +71 -29
  93. package/src/extension/team-tool/goal.ts +185 -35
  94. package/src/extension/team-tool/handle-schedule.ts +34 -15
  95. package/src/extension/team-tool/handle-settings.ts +94 -56
  96. package/src/extension/team-tool/health-monitor.ts +27 -108
  97. package/src/extension/team-tool/inspect.ts +42 -9
  98. package/src/extension/team-tool/intent-policy.ts +4 -1
  99. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  100. package/src/extension/team-tool/orchestrate.ts +7 -18
  101. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  102. package/src/extension/team-tool/plan.ts +29 -5
  103. package/src/extension/team-tool/respond.ts +49 -16
  104. package/src/extension/team-tool/run-not-found.ts +3 -8
  105. package/src/extension/team-tool/run.ts +80 -317
  106. package/src/extension/team-tool/status.ts +135 -43
  107. package/src/extension/team-tool/workflow-manage.ts +92 -25
  108. package/src/extension/team-tool-types.ts +8 -1
  109. package/src/extension/team-tool.ts +142 -551
  110. package/src/extension/validate-resources.ts +39 -8
  111. package/src/hooks/registry.ts +66 -17
  112. package/src/hooks/types.ts +1 -1
  113. package/src/i18n.ts +25 -11
  114. package/src/observability/correlation.ts +17 -3
  115. package/src/observability/event-bus.ts +51 -56
  116. package/src/observability/event-to-metric.ts +117 -15
  117. package/src/observability/exporters/otlp-exporter.ts +56 -17
  118. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  119. package/src/observability/metric-registry.ts +16 -4
  120. package/src/observability/metric-retention.ts +8 -2
  121. package/src/observability/metric-sink.ts +11 -3
  122. package/src/observability/metrics-primitives.ts +42 -9
  123. package/src/plugins/plugin-define.ts +2 -2
  124. package/src/plugins/plugin-registry.ts +25 -25
  125. package/src/plugins/plugins/index.ts +1 -1
  126. package/src/plugins/plugins/nextjs.ts +16 -16
  127. package/src/plugins/plugins/vite.ts +7 -11
  128. package/src/plugins/plugins/vitest.ts +6 -11
  129. package/src/runtime/adaptive-plan.ts +225 -40
  130. package/src/runtime/agent-control.ts +58 -15
  131. package/src/runtime/agent-memory.ts +15 -9
  132. package/src/runtime/agent-observability.ts +10 -2
  133. package/src/runtime/anchor-manager.ts +27 -25
  134. package/src/runtime/async-marker.ts +7 -1
  135. package/src/runtime/async-runner.ts +27 -23
  136. package/src/runtime/auto-summarize.ts +7 -13
  137. package/src/runtime/background-runner.ts +189 -251
  138. package/src/runtime/batch-barrier.ts +18 -16
  139. package/src/runtime/cancellation-token.ts +16 -6
  140. package/src/runtime/cancellation.ts +46 -8
  141. package/src/runtime/capability-inventory.ts +6 -4
  142. package/src/runtime/chain-parser.ts +44 -11
  143. package/src/runtime/chain-runner.ts +63 -69
  144. package/src/runtime/checkpoint.ts +12 -56
  145. package/src/runtime/child-pi.ts +343 -78
  146. package/src/runtime/coalesce-tasks.ts +268 -0
  147. package/src/runtime/code-summary.ts +71 -26
  148. package/src/runtime/compact-stages/index.ts +15 -5
  149. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  150. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  151. package/src/runtime/compaction-summary.ts +17 -10
  152. package/src/runtime/completion-guard.ts +33 -16
  153. package/src/runtime/crash-classification.ts +28 -7
  154. package/src/runtime/crash-recovery.ts +177 -37
  155. package/src/runtime/crew-agent-records.ts +193 -40
  156. package/src/runtime/crew-hooks.ts +9 -24
  157. package/src/runtime/cross-extension-rpc.ts +25 -23
  158. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  159. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  160. package/src/runtime/delivery-coordinator.ts +34 -7
  161. package/src/runtime/delta-conflict.ts +9 -21
  162. package/src/runtime/deterministic-ast.ts +1 -1
  163. package/src/runtime/diagnostic-export.ts +53 -20
  164. package/src/runtime/direct-run.ts +12 -2
  165. package/src/runtime/dwf-state-store.ts +1 -1
  166. package/src/runtime/dynamic-workflow-context.ts +186 -58
  167. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  168. package/src/runtime/effectiveness.ts +16 -8
  169. package/src/runtime/errors/crew-errors.ts +7 -11
  170. package/src/runtime/event-stream-bridge.ts +9 -3
  171. package/src/runtime/foreground-control.ts +54 -14
  172. package/src/runtime/foreground-watchdog.ts +9 -6
  173. package/src/runtime/goal-achievement.ts +27 -10
  174. package/src/runtime/goal-evaluator.ts +54 -19
  175. package/src/runtime/goal-loop-runner.ts +280 -99
  176. package/src/runtime/goal-state-store.ts +27 -17
  177. package/src/runtime/green-contract.ts +11 -2
  178. package/src/runtime/group-join.ts +64 -31
  179. package/src/runtime/handoff-manager.ts +37 -42
  180. package/src/runtime/heartbeat-gradient.ts +10 -2
  181. package/src/runtime/heartbeat-watcher.ts +32 -6
  182. package/src/runtime/hidden-handoff.ts +12 -30
  183. package/src/runtime/important-line-classifier.ts +12 -2
  184. package/src/runtime/iteration-hooks.ts +25 -15
  185. package/src/runtime/live-agent-control.ts +55 -7
  186. package/src/runtime/live-agent-manager.ts +130 -27
  187. package/src/runtime/live-control-realtime.ts +23 -3
  188. package/src/runtime/live-irc.ts +4 -1
  189. package/src/runtime/live-session-health.ts +12 -4
  190. package/src/runtime/live-session-runtime.ts +379 -117
  191. package/src/runtime/manifest-cache.ts +28 -12
  192. package/src/runtime/mcp-proxy.ts +8 -16
  193. package/src/runtime/metric-parser.ts +1 -5
  194. package/src/runtime/model-fallback.ts +55 -18
  195. package/src/runtime/model-resolver.ts +2 -6
  196. package/src/runtime/model-scope.ts +19 -3
  197. package/src/runtime/notebook-helpers.ts +60 -62
  198. package/src/runtime/orphan-worker-registry.ts +37 -26
  199. package/src/runtime/output-validator.ts +18 -3
  200. package/src/runtime/overflow-recovery.ts +5 -4
  201. package/src/runtime/parallel-research.ts +29 -5
  202. package/src/runtime/parallel-utils.ts +9 -11
  203. package/src/runtime/path-overlap.ts +150 -0
  204. package/src/runtime/peer-dep.ts +12 -17
  205. package/src/runtime/per-write-validator.ts +1 -3
  206. package/src/runtime/phase-tracker.ts +342 -330
  207. package/src/runtime/pi-args.ts +26 -8
  208. package/src/runtime/pi-json-output.ts +1 -1
  209. package/src/runtime/pi-spawn.ts +30 -19
  210. package/src/runtime/pipeline-runner.ts +56 -55
  211. package/src/runtime/plan-templates.ts +5 -6
  212. package/src/runtime/policy-engine.ts +43 -7
  213. package/src/runtime/post-checks.ts +12 -4
  214. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  215. package/src/runtime/process-lifecycle.ts +20 -10
  216. package/src/runtime/process-status.ts +16 -5
  217. package/src/runtime/progress-event-coalescer.ts +2 -1
  218. package/src/runtime/progress-tracker.ts +103 -103
  219. package/src/runtime/prose-compressor.ts +9 -11
  220. package/src/runtime/recovery-recipes.ts +118 -24
  221. package/src/runtime/replace.ts +25 -10
  222. package/src/runtime/resilient-edit.ts +10 -25
  223. package/src/runtime/result-extractor.ts +1 -2
  224. package/src/runtime/retry-executor.ts +20 -4
  225. package/src/runtime/retry-runner.ts +26 -50
  226. package/src/runtime/role-permission.ts +6 -1
  227. package/src/runtime/run-coalesced-task-group.ts +256 -0
  228. package/src/runtime/run-drift.ts +14 -15
  229. package/src/runtime/run-tracker.ts +6 -28
  230. package/src/runtime/runtime-policy.ts +1 -6
  231. package/src/runtime/runtime-resolver.ts +80 -15
  232. package/src/runtime/scheduler.ts +47 -18
  233. package/src/runtime/semaphore.ts +5 -7
  234. package/src/runtime/sensitive-paths.ts +2 -1
  235. package/src/runtime/session-usage.ts +1 -1
  236. package/src/runtime/settings-store.ts +16 -12
  237. package/src/runtime/sidechain-output.ts +6 -2
  238. package/src/runtime/single-agent-compose.ts +1 -4
  239. package/src/runtime/skill-effectiveness.ts +29 -97
  240. package/src/runtime/skill-instructions.ts +40 -83
  241. package/src/runtime/stale-reconciler.ts +73 -197
  242. package/src/runtime/stream-preview.ts +1 -1
  243. package/src/runtime/streaming-output.ts +1 -1
  244. package/src/runtime/subagent-manager.ts +86 -169
  245. package/src/runtime/subprocess-tool-registry.ts +4 -1
  246. package/src/runtime/supervisor-contact.ts +10 -5
  247. package/src/runtime/task-display.ts +19 -5
  248. package/src/runtime/task-graph-scheduler.ts +95 -21
  249. package/src/runtime/task-graph.ts +5 -11
  250. package/src/runtime/task-health.ts +54 -47
  251. package/src/runtime/task-id.ts +11 -18
  252. package/src/runtime/task-output-context.ts +265 -81
  253. package/src/runtime/task-packet.ts +12 -20
  254. package/src/runtime/task-quality.ts +6 -14
  255. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  256. package/src/runtime/task-runner/live-executor.ts +114 -36
  257. package/src/runtime/task-runner/output-splitter.ts +152 -0
  258. package/src/runtime/task-runner/progress.ts +50 -12
  259. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  260. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  261. package/src/runtime/task-runner/result-utils.ts +3 -1
  262. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  263. package/src/runtime/task-runner/run-projection.ts +27 -8
  264. package/src/runtime/task-runner/state-helpers.ts +29 -8
  265. package/src/runtime/task-runner/tail-read.ts +2 -6
  266. package/src/runtime/task-runner.ts +180 -326
  267. package/src/runtime/team-runner-artifacts.ts +13 -0
  268. package/src/runtime/team-runner.ts +456 -974
  269. package/src/runtime/tool-output-pruner.ts +6 -9
  270. package/src/runtime/tool-progress.ts +11 -21
  271. package/src/runtime/verification-gates.ts +33 -24
  272. package/src/runtime/verification-integrity.ts +1 -4
  273. package/src/runtime/verification-worktree.ts +62 -12
  274. package/src/runtime/worker-heartbeat.ts +5 -1
  275. package/src/runtime/worker-startup.ts +29 -5
  276. package/src/runtime/workflow-state.ts +17 -9
  277. package/src/runtime/workspace-lock.ts +30 -35
  278. package/src/runtime/workspace-tree.ts +20 -32
  279. package/src/runtime/yield-handler.ts +43 -9
  280. package/src/runtime/zombie-scanner.ts +5 -4
  281. package/src/schema/config-schema.ts +266 -172
  282. package/src/schema/team-tool-schema.ts +29 -74
  283. package/src/schema/validation-types.ts +25 -17
  284. package/src/skills/discover-skills.ts +35 -10
  285. package/src/skills/skill-templates.ts +109 -27
  286. package/src/skills/validate.ts +26 -8
  287. package/src/state/active-run-registry.ts +87 -28
  288. package/src/state/artifact-store.ts +9 -5
  289. package/src/state/atomic-write-v2.ts +85 -63
  290. package/src/state/atomic-write.ts +105 -26
  291. package/src/state/blob-store.ts +47 -20
  292. package/src/state/contracts.ts +20 -5
  293. package/src/state/crew-init.ts +5 -22
  294. package/src/state/decision-ledger.ts +19 -73
  295. package/src/state/event-log-rotation.ts +41 -15
  296. package/src/state/event-log.ts +168 -53
  297. package/src/state/event-reconstructor.ts +11 -1
  298. package/src/state/gitignore-manager.ts +2 -8
  299. package/src/state/health-store.ts +57 -57
  300. package/src/state/hook-instinct-bridge.ts +1 -1
  301. package/src/state/hook-integrations.ts +1 -1
  302. package/src/state/instinct-store.ts +17 -5
  303. package/src/state/jsonl-writer.ts +1 -1
  304. package/src/state/locks.ts +23 -9
  305. package/src/state/mailbox.ts +151 -28
  306. package/src/state/observation-store.ts +20 -14
  307. package/src/state/run-cache.ts +142 -135
  308. package/src/state/run-graph.ts +6 -15
  309. package/src/state/run-metrics.ts +5 -18
  310. package/src/state/schedule.ts +15 -9
  311. package/src/state/state-store.ts +129 -45
  312. package/src/state/task-claims.ts +12 -2
  313. package/src/state/tiered-eval.ts +52 -43
  314. package/src/state/types-eval.ts +2 -2
  315. package/src/state/types.ts +24 -20
  316. package/src/state/usage.ts +20 -4
  317. package/src/state/worker-atomic-writer.ts +6 -3
  318. package/src/subagents/index.ts +2 -2
  319. package/src/teams/discover-teams.ts +21 -6
  320. package/src/tools/safe-bash-extension.ts +5 -6
  321. package/src/tools/safe-bash.ts +10 -11
  322. package/src/types/new-api-types.ts +6 -10
  323. package/src/ui/agent-management-overlay.ts +52 -40
  324. package/src/ui/card-colors.ts +13 -4
  325. package/src/ui/crew-footer.ts +8 -7
  326. package/src/ui/crew-select-list.ts +1 -1
  327. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  328. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  329. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  330. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  331. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  332. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  333. package/src/ui/heartbeat-aggregator.ts +15 -4
  334. package/src/ui/keybinding-map.ts +40 -7
  335. package/src/ui/live-conversation-overlay.ts +36 -20
  336. package/src/ui/live-duration.ts +1 -4
  337. package/src/ui/live-run-sidebar.ts +88 -25
  338. package/src/ui/loaders.ts +2 -8
  339. package/src/ui/mascot.ts +20 -36
  340. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  341. package/src/ui/overlays/confirm-overlay.ts +4 -2
  342. package/src/ui/overlays/help-overlay.ts +25 -14
  343. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  344. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  345. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  346. package/src/ui/pi-ui-compat.ts +7 -7
  347. package/src/ui/powerbar-publisher.ts +120 -42
  348. package/src/ui/render-diff.ts +10 -3
  349. package/src/ui/render-scheduler.ts +12 -4
  350. package/src/ui/run-action-dispatcher.ts +81 -18
  351. package/src/ui/run-dashboard.ts +172 -76
  352. package/src/ui/run-event-bus.ts +59 -37
  353. package/src/ui/run-snapshot-cache.ts +276 -86
  354. package/src/ui/settings-overlay.ts +361 -74
  355. package/src/ui/status-colors.ts +12 -1
  356. package/src/ui/syntax-highlight.ts +1 -1
  357. package/src/ui/theme-adapter.ts +16 -14
  358. package/src/ui/theme-discovery.ts +13 -2
  359. package/src/ui/tool-progress-formatter.ts +7 -7
  360. package/src/ui/tool-render.ts +128 -56
  361. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  362. package/src/ui/tool-renderers/index.ts +109 -43
  363. package/src/ui/transcript-cache.ts +32 -6
  364. package/src/ui/transcript-entries.ts +25 -23
  365. package/src/ui/transcript-viewer.ts +78 -29
  366. package/src/ui/widget/index.ts +99 -40
  367. package/src/ui/widget/widget-formatters.ts +13 -6
  368. package/src/ui/widget/widget-model.ts +19 -8
  369. package/src/ui/widget/widget-renderer.ts +23 -13
  370. package/src/ui/widget/widget-types.ts +1 -1
  371. package/src/utils/bm25-search.ts +199 -199
  372. package/src/utils/conflict-detect.ts +22 -21
  373. package/src/utils/env-filter.ts +14 -7
  374. package/src/utils/file-coalescer.ts +5 -1
  375. package/src/utils/fingerprint.ts +3 -6
  376. package/src/utils/frontmatter.ts +3 -1
  377. package/src/utils/fs-watch.ts +2 -6
  378. package/src/utils/gh-protocol.ts +119 -44
  379. package/src/utils/git.ts +13 -15
  380. package/src/utils/guards.ts +2 -5
  381. package/src/utils/ids.ts +9 -2
  382. package/src/utils/incremental-reader.ts +14 -3
  383. package/src/utils/internal-error.ts +2 -1
  384. package/src/utils/names.ts +12 -3
  385. package/src/utils/paths.ts +49 -5
  386. package/src/utils/project-detector.ts +2 -2
  387. package/src/utils/redaction.ts +29 -19
  388. package/src/utils/resolve-shell.ts +9 -7
  389. package/src/utils/run-watcher-registry.ts +19 -31
  390. package/src/utils/safe-paths.ts +45 -24
  391. package/src/utils/scan-cache.ts +9 -2
  392. package/src/utils/session-utils.ts +2 -4
  393. package/src/utils/sleep.ts +12 -5
  394. package/src/utils/sse-parser.ts +5 -17
  395. package/src/utils/visual.ts +52 -32
  396. package/src/workflows/discover-workflows.ts +41 -109
  397. package/src/workflows/intermediate-store.ts +5 -21
  398. package/src/workflows/preflight-validator.ts +6 -33
  399. package/src/workflows/topology-analyzer.ts +5 -21
  400. package/src/workflows/workflow-config.ts +7 -6
  401. package/src/worktree/branch-freshness.ts +66 -8
  402. package/src/worktree/cleanup.ts +130 -20
  403. package/src/worktree/worktree-manager.ts +212 -69
  404. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  405. package/skills/detection-pipeline-design/SKILL.md +0 -286
  406. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  407. package/skills/incident-playbook-construction/SKILL.md +0 -384
  408. package/skills/security-review/SKILL.md +0 -561
  409. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  410. package/skills/ui-render-performance/SKILL.md +0 -58
  411. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  412. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  413. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  414. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  415. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  416. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  417. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  418. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  419. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  420. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  421. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  422. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  430. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  431. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  432. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -17,9 +17,16 @@ export interface TaskGraphIndex {
17
17
 
18
18
  export function buildTaskGraphIndex(tasks: TeamTaskState[]): TaskGraphIndex {
19
19
  return {
20
- doneSteps: new Set(tasks.filter((task) => task.status === "completed").map((task) => task.stepId).filter((id): id is string => id !== undefined)),
20
+ doneSteps: new Set(
21
+ tasks
22
+ .filter((task) => task.status === "completed")
23
+ .map((task) => task.stepId)
24
+ .filter((id): id is string => id !== undefined),
25
+ ),
21
26
  idMap: new Map(tasks.map((task) => [task.id, task])),
22
- stepToTaskId: new Map(tasks.map((task) => [task.stepId, task.id]).filter((entry): entry is [string, string] => entry[0] !== undefined)),
27
+ stepToTaskId: new Map(
28
+ tasks.map((task) => [task.stepId, task.id]).filter((entry): entry is [string, string] => entry[0] !== undefined),
29
+ ),
23
30
  };
24
31
  }
25
32
 
@@ -27,7 +34,12 @@ function taskById(tasks: TeamTaskState[]): Map<string, TeamTaskState> {
27
34
  return new Map(tasks.map((task) => [task.id, task]));
28
35
  }
29
36
 
30
- function dependencySatisfied(task: TeamTaskState, doneStepIds: Set<string>, idMap: Map<string, TeamTaskState>, stepMap: Map<string, string>): boolean {
37
+ function dependencySatisfied(
38
+ task: TeamTaskState,
39
+ doneStepIds: Set<string>,
40
+ idMap: Map<string, TeamTaskState>,
41
+ stepMap: Map<string, string>,
42
+ ): boolean {
31
43
  return task.dependsOn.every((dependency) => {
32
44
  if (doneStepIds.has(dependency)) return true;
33
45
  const taskId = stepMap.get(dependency) ?? dependency;
@@ -38,15 +50,27 @@ function dependencySatisfied(task: TeamTaskState, doneStepIds: Set<string>, idMa
38
50
  function withQueue(task: TeamTaskState, index: TaskGraphIndex): TeamTaskState {
39
51
  if (task.status === "queued") {
40
52
  const isReady = dependencySatisfied(task, index.doneSteps, index.idMap, index.stepToTaskId);
41
- return { ...task, graph: task.graph ? { ...task.graph, queue: isReady ? "ready" : "blocked" } : task.graph };
53
+ return {
54
+ ...task,
55
+ graph: task.graph ? { ...task.graph, queue: isReady ? "ready" : "blocked" } : task.graph,
56
+ };
42
57
  }
43
58
  if (task.status === "running") {
44
- return { ...task, graph: task.graph ? { ...task.graph, queue: "running" } : task.graph };
59
+ return {
60
+ ...task,
61
+ graph: task.graph ? { ...task.graph, queue: "running" } : task.graph,
62
+ };
45
63
  }
46
64
  if (task.status === "completed" || task.status === "skipped" || task.status === "needs_attention") {
47
- return { ...task, graph: task.graph ? { ...task.graph, queue: "done" } : task.graph };
65
+ return {
66
+ ...task,
67
+ graph: task.graph ? { ...task.graph, queue: "done" } : task.graph,
68
+ };
48
69
  }
49
- return { ...task, graph: task.graph ? { ...task.graph, queue: "blocked" } : task.graph };
70
+ return {
71
+ ...task,
72
+ graph: task.graph ? { ...task.graph, queue: "blocked" } : task.graph,
73
+ };
50
74
  }
51
75
 
52
76
  function ensureIndex(tasks: TeamTaskState[], index?: TaskGraphIndex): TaskGraphIndex {
@@ -59,20 +83,49 @@ export function refreshTaskGraphQueues(tasks: TeamTaskState[], index?: TaskGraph
59
83
  }
60
84
 
61
85
  export function getReadyTasks(tasks: TeamTaskState[], maxCount = 1, index?: TaskGraphIndex): TeamTaskState[] {
62
- return refreshTaskGraphQueues(tasks, index).filter((task) => task.status === "queued" && task.graph?.queue === "ready").slice(0, Math.max(0, maxCount));
86
+ return refreshTaskGraphQueues(tasks, index)
87
+ .filter((task) => task.status === "queued" && task.graph?.queue === "ready")
88
+ .slice(0, Math.max(0, maxCount));
63
89
  }
64
90
 
65
91
  export function markTaskRunning(tasks: TeamTaskState[], taskId: string, now = new Date(), index?: TaskGraphIndex): TeamTaskState[] {
66
92
  const resolved = ensureIndex(tasks, index);
67
- return refreshTaskGraphQueues(tasks, resolved).map((task) => task.id === taskId ? withQueue({ ...task, status: "running", startedAt: task.startedAt ?? now.toISOString() }, resolved) : task);
93
+ return refreshTaskGraphQueues(tasks, resolved).map((task) =>
94
+ task.id === taskId
95
+ ? withQueue(
96
+ {
97
+ ...task,
98
+ status: "running",
99
+ startedAt: task.startedAt ?? now.toISOString(),
100
+ },
101
+ resolved,
102
+ )
103
+ : task,
104
+ );
68
105
  }
69
106
 
70
107
  export function markTaskDone(tasks: TeamTaskState[], taskId: string, now = new Date(), index?: TaskGraphIndex): TeamTaskState[] {
71
108
  const resolved = ensureIndex(tasks, index);
72
- return refreshTaskGraphQueues(tasks.map((task) => task.id === taskId ? { ...task, status: "completed", finishedAt: task.finishedAt ?? now.toISOString() } : task), resolved);
109
+ return refreshTaskGraphQueues(
110
+ tasks.map((task) =>
111
+ task.id === taskId
112
+ ? {
113
+ ...task,
114
+ status: "completed",
115
+ finishedAt: task.finishedAt ?? now.toISOString(),
116
+ }
117
+ : task,
118
+ ),
119
+ resolved,
120
+ );
73
121
  }
74
122
 
75
- export function cancelTaskSubtree(tasks: TeamTaskState[], rootTaskId: string, reason = "Cancelled by task graph scheduler.", now = new Date()): TeamTaskState[] {
123
+ export function cancelTaskSubtree(
124
+ tasks: TeamTaskState[],
125
+ rootTaskId: string,
126
+ reason = "Cancelled by task graph scheduler.",
127
+ now = new Date(),
128
+ ): TeamTaskState[] {
76
129
  const ids = taskById(tasks);
77
130
  const toCancel = new Set<string>();
78
131
  const stack = [rootTaskId];
@@ -83,11 +136,18 @@ export function cancelTaskSubtree(tasks: TeamTaskState[], rootTaskId: string, re
83
136
  const task = ids.get(current);
84
137
  for (const child of task?.graph?.children ?? []) stack.push(child);
85
138
  }
86
- return refreshTaskGraphQueues(tasks.map((task) => {
87
- if (!toCancel.has(task.id)) return task;
88
- if (task.status === "completed") return task;
89
- return { ...task, status: "cancelled", error: reason, finishedAt: task.finishedAt ?? now.toISOString() };
90
- }));
139
+ return refreshTaskGraphQueues(
140
+ tasks.map((task) => {
141
+ if (!toCancel.has(task.id)) return task;
142
+ if (task.status === "completed") return task;
143
+ return {
144
+ ...task,
145
+ status: "cancelled",
146
+ error: reason,
147
+ finishedAt: task.finishedAt ?? now.toISOString(),
148
+ };
149
+ }),
150
+ );
91
151
  }
92
152
 
93
153
  export function failTaskAndBlockChildren(tasks: TeamTaskState[], rootTaskId: string, reason: string, now = new Date()): TeamTaskState[] {
@@ -102,11 +162,25 @@ export function failTaskAndBlockChildren(tasks: TeamTaskState[], rootTaskId: str
102
162
  const task = ids.get(current);
103
163
  for (const child of task?.graph?.children ?? []) stack.push(child);
104
164
  }
105
- return refreshTaskGraphQueues(tasks.map((task) => {
106
- if (task.id === rootTaskId) return { ...task, status: "failed", error: reason, finishedAt: task.finishedAt ?? now.toISOString() };
107
- if (blocked.has(task.id) && task.status === "queued") return { ...task, status: "skipped", error: `Blocked by failed task '${rootTaskId}'.`, finishedAt: task.finishedAt ?? now.toISOString() };
108
- return task;
109
- }));
165
+ return refreshTaskGraphQueues(
166
+ tasks.map((task) => {
167
+ if (task.id === rootTaskId)
168
+ return {
169
+ ...task,
170
+ status: "failed",
171
+ error: reason,
172
+ finishedAt: task.finishedAt ?? now.toISOString(),
173
+ };
174
+ if (blocked.has(task.id) && task.status === "queued")
175
+ return {
176
+ ...task,
177
+ status: "skipped",
178
+ error: `Blocked by failed task '${rootTaskId}'.`,
179
+ finishedAt: task.finishedAt ?? now.toISOString(),
180
+ };
181
+ return task;
182
+ }),
183
+ );
110
184
  }
111
185
 
112
186
  export function taskGraphSnapshot(tasks: TeamTaskState[], index?: TaskGraphIndex): TaskGraphSchedulerSnapshot {
@@ -34,7 +34,7 @@ export interface ExecutionPlan {
34
34
  * - Each subsequent wave contains tasks whose dependencies are all in earlier waves.
35
35
  * - If all tasks have empty `dependsOn`, they all go into wave 0 (backward compatible).
36
36
  * - If a cycle is detected, `hasCycle` is true and `cycleNodes` lists the involved IDs.
37
- *
37
+ *
38
38
  * @throws Error if a task depends on itself (self-dependency).
39
39
  */
40
40
  export function buildExecutionPlan(tasks: TaskNode[]): ExecutionPlan {
@@ -50,7 +50,7 @@ export function buildExecutionPlan(tasks: TaskNode[]): ExecutionPlan {
50
50
  }
51
51
 
52
52
  const idSet = new Set<string>(tasks.map((t) => t.id));
53
- const adjacency = new Map<string, Set<string>>(); // id -> ids that depend on it
53
+ const adjacency = new Map<string, Set<string>>(); // id -> ids that depend on it
54
54
  const inDegree = new Map<string, number>();
55
55
 
56
56
  for (const task of tasks) {
@@ -71,9 +71,7 @@ export function buildExecutionPlan(tasks: TaskNode[]): ExecutionPlan {
71
71
  // Kahn's algorithm with wave grouping
72
72
  const waves: ExecutionWave[] = [];
73
73
  const assigned = new Set<string>();
74
- let currentWaveIds = tasks
75
- .filter((t) => inDegree.get(t.id) === 0)
76
- .map((t) => t.id);
74
+ let currentWaveIds = tasks.filter((t) => inDegree.get(t.id) === 0).map((t) => t.id);
77
75
 
78
76
  let waveIndex = 0;
79
77
  while (currentWaveIds.length > 0) {
@@ -98,9 +96,7 @@ export function buildExecutionPlan(tasks: TaskNode[]): ExecutionPlan {
98
96
 
99
97
  // Detect cycle: if not all tasks were assigned, remaining ones form cycles
100
98
  if (assigned.size < tasks.length) {
101
- const cycleNodes = tasks
102
- .filter((t) => !assigned.has(t.id))
103
- .map((t) => t.id);
99
+ const cycleNodes = tasks.filter((t) => !assigned.has(t.id)).map((t) => t.id);
104
100
  return {
105
101
  waves,
106
102
  hasCycle: true,
@@ -143,9 +139,7 @@ export function getReadyTasks(plan: ExecutionPlan, completedTaskIds: Set<string>
143
139
 
144
140
  for (const wave of plan.waves) {
145
141
  // All tasks in prior waves must be completed for this wave to be ready
146
- const priorWavesComplete = plan.waves
147
- .slice(0, wave.index)
148
- .every((w) => w.taskIds.every((id) => completed.has(id)));
142
+ const priorWavesComplete = plan.waves.slice(0, wave.index).every((w) => w.taskIds.every((id) => completed.has(id)));
149
143
 
150
144
  if (!priorWavesComplete) continue;
151
145
 
@@ -1,76 +1,83 @@
1
1
  export type HealthGrade = "A" | "B" | "C" | "D" | "F";
2
2
 
3
3
  export interface HealthPenalty {
4
- reason: string;
5
- deduction: number;
4
+ reason: string;
5
+ deduction: number;
6
6
  }
7
7
 
8
8
  export interface HealthDelta {
9
- metric: string;
10
- delta: number;
11
- trend: "improving" | "degrading" | "stable";
9
+ metric: string;
10
+ delta: number;
11
+ trend: "improving" | "degrading" | "stable";
12
12
  }
13
13
 
14
14
  export interface RunHealth {
15
- score: number;
16
- grade: HealthGrade;
17
- penalties: HealthPenalty[];
18
- deltas: HealthDelta[];
15
+ score: number;
16
+ grade: HealthGrade;
17
+ penalties: HealthPenalty[];
18
+ deltas: HealthDelta[];
19
19
  }
20
20
 
21
21
  const STALLED_THRESHOLD_MS = 5 * 60 * 1000;
22
22
 
23
23
  export function scoreToGrade(score: number): HealthGrade {
24
- if (score >= 90) return "A";
25
- if (score >= 70) return "B";
26
- if (score >= 50) return "C";
27
- if (score >= 30) return "D";
28
- return "F";
24
+ if (score >= 90) return "A";
25
+ if (score >= 70) return "B";
26
+ if (score >= 50) return "C";
27
+ if (score >= 30) return "D";
28
+ return "F";
29
29
  }
30
30
 
31
31
  export interface TaskSummary {
32
- id: string;
33
- status: string;
34
- stalledSince?: number;
32
+ id: string;
33
+ status: string;
34
+ stalledSince?: number;
35
35
  }
36
36
 
37
37
  export interface ManifestSummary {
38
- runId: string;
39
- tasks: TaskSummary[];
40
- createdAt: string;
38
+ runId: string;
39
+ tasks: TaskSummary[];
40
+ createdAt: string;
41
41
  }
42
42
 
43
43
  export function computeRunHealth(manifest: ManifestSummary): RunHealth {
44
- const penalties: HealthPenalty[] = [];
45
- const tasks = manifest.tasks;
46
- const taskCount = tasks.length;
47
- if (taskCount === 0) return { score: 100, grade: "A", penalties: [], deltas: [] };
44
+ const penalties: HealthPenalty[] = [];
45
+ const tasks = manifest.tasks;
46
+ const taskCount = tasks.length;
47
+ if (taskCount === 0) return { score: 100, grade: "A", penalties: [], deltas: [] };
48
48
 
49
- const failedCount = tasks.filter(t => t.status === "failed").length;
50
- const stalledCount = tasks.filter(t =>
51
- t.stalledSince !== undefined && (Date.now() - t.stalledSince) > STALLED_THRESHOLD_MS
52
- ).length;
49
+ const failedCount = tasks.filter((t) => t.status === "failed").length;
50
+ const stalledCount = tasks.filter((t) => t.stalledSince !== undefined && Date.now() - t.stalledSince > STALLED_THRESHOLD_MS).length;
53
51
 
54
- const failureRate = failedCount / taskCount;
55
- if (failureRate > 0.2) {
56
- penalties.push({ reason: "high-failure-rate", deduction: Math.round(failureRate * 50) });
57
- }
52
+ const failureRate = failedCount / taskCount;
53
+ if (failureRate > 0.2) {
54
+ penalties.push({
55
+ reason: "high-failure-rate",
56
+ deduction: Math.round(failureRate * 50),
57
+ });
58
+ }
58
59
 
59
- if (stalledCount > 0) {
60
- penalties.push({ reason: "stalled-tasks", deduction: Math.min(15, stalledCount * 5) });
61
- }
60
+ if (stalledCount > 0) {
61
+ penalties.push({
62
+ reason: "stalled-tasks",
63
+ deduction: Math.min(15, stalledCount * 5),
64
+ });
65
+ }
62
66
 
63
- if (taskCount > 20) {
64
- penalties.push({ reason: "large-task-count", deduction: Math.min(10, Math.floor((taskCount - 20) / 10)) });
65
- }
67
+ if (taskCount > 20) {
68
+ penalties.push({
69
+ reason: "large-task-count",
70
+ deduction: Math.min(10, Math.floor((taskCount - 20) / 10)),
71
+ });
72
+ }
66
73
 
67
- const totalDeduction = penalties.reduce((sum, p) => sum + p.deduction, 0);
68
- const score = Math.max(0, Math.min(100, 100 - totalDeduction));
74
+ const totalDeduction = penalties.reduce((sum, p) => sum + p.deduction, 0);
75
+ const score = Math.max(0, Math.min(100, 100 - totalDeduction));
69
76
 
70
- return {
71
- score,
72
- grade: scoreToGrade(score),
73
- penalties,
74
- deltas: [],
75
- };
76
- }
77
+ return {
78
+ score,
79
+ grade: scoreToGrade(score),
80
+ penalties,
81
+ deltas: [],
82
+ };
83
+ }
@@ -56,10 +56,7 @@ export function hashToBase36(content: string, length: number): string {
56
56
  * @param config - Adaptive configuration
57
57
  * @returns Recommended hash length
58
58
  */
59
- export function calculateAdaptiveLength(
60
- existingCount: number,
61
- config: AdaptiveIDConfig = DEFAULT_CONFIG,
62
- ): number {
59
+ export function calculateAdaptiveLength(existingCount: number, config: AdaptiveIDConfig = DEFAULT_CONFIG): number {
63
60
  for (let length = config.minLength; length <= config.maxLength; length++) {
64
61
  const totalPossibilities = Math.pow(36, length);
65
62
  const probability = 1 - Math.exp(-(existingCount * existingCount) / (2 * totalPossibilities));
@@ -78,11 +75,7 @@ export function calculateAdaptiveLength(
78
75
  * @param existingCount - Number of existing IDs (for adaptive length)
79
76
  * @returns Hash-based ID like "pc-a1b2"
80
77
  */
81
- export function generateTaskHashId(
82
- parts: string[],
83
- prefix = DEFAULT_PREFIX,
84
- existingCount = 0,
85
- ): string {
78
+ export function generateTaskHashId(parts: string[], prefix = DEFAULT_PREFIX, existingCount = 0): string {
86
79
  const content = parts.join("|");
87
80
  const length = calculateAdaptiveLength(existingCount);
88
81
  const hash = hashToBase36(content, length);
@@ -137,15 +130,15 @@ export function childId(parentId: string, childNum: number): string {
137
130
  * Only "blocks" and "parent-child" affect execution ordering.
138
131
  */
139
132
  export type DependencyType =
140
- | "blocks" // A must complete before B starts
141
- | "parent-child" // Hierarchical relationship
142
- | "conditional-blocks" // B runs only if A fails
143
- | "waits-for" // Fanout gate: wait for dynamic children
144
- | "related" // Association only (no ordering)
145
- | "supersedes" // A replaces B
146
- | "duplicates" // A duplicates B
147
- | "delegated-from" // A was delegated from B
148
- | "validates"; // A validates B's output
133
+ | "blocks" // A must complete before B starts
134
+ | "parent-child" // Hierarchical relationship
135
+ | "conditional-blocks" // B runs only if A fails
136
+ | "waits-for" // Fanout gate: wait for dynamic children
137
+ | "related" // Association only (no ordering)
138
+ | "supersedes" // A replaces B
139
+ | "duplicates" // A duplicates B
140
+ | "delegated-from" // A was delegated from B
141
+ | "validates"; // A validates B's output
149
142
 
150
143
  // ── Stable IDs (full hash, for cross-run references) ──────────────────────
151
144