pi-crew 0.9.16 → 0.9.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21790 -0
  4. package/dist/index.mjs +83070 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/docs/A +358 -0
  7. package/docs/M-A +357 -0
  8. package/docs/REVIEW-FINDINGS-2026-06 +357 -0
  9. package/docs/Y +357 -0
  10. package/docs/a +357 -0
  11. package/docs/aA +358 -0
  12. package/docs/archive/README.md +91 -0
  13. package/docs/patterns/command-agent-skill.md +1 -1
  14. package/docs/skills/REFERENCE.md +0 -17
  15. package/docs//303/242mmaAAA/303/242 +357 -0
  16. package/index.bundle.ts +25 -0
  17. package/index.ts +95 -4
  18. package/package.json +15 -4
  19. package/skills/iterative-audit/SKILL.md +0 -1
  20. package/skills/widget-rendering/SKILL.md +17 -0
  21. package/src/adapters/claude-adapter.ts +1 -3
  22. package/src/adapters/export-util.ts +16 -16
  23. package/src/adapters/index.ts +5 -5
  24. package/src/agents/agent-config.ts +20 -14
  25. package/src/agents/agent-serializer.ts +1 -1
  26. package/src/agents/discover-agents.ts +83 -39
  27. package/src/benchmark/benchmark-runner.ts +51 -51
  28. package/src/benchmark/feedback-loop.ts +1 -1
  29. package/src/config/config.ts +166 -590
  30. package/src/config/defaults.ts +28 -2
  31. package/src/config/drift-detector.ts +11 -14
  32. package/src/config/markers.ts +201 -203
  33. package/src/config/resilient-parser.ts +14 -6
  34. package/src/config/role-tools.ts +3 -3
  35. package/src/config/suggestions.ts +5 -12
  36. package/src/config/types.ts +9 -25
  37. package/src/errors.ts +151 -157
  38. package/src/extension/action-suggestions.ts +54 -9
  39. package/src/extension/async-notifier.ts +43 -13
  40. package/src/extension/autonomous-policy.ts +77 -37
  41. package/src/extension/command-completions.ts +9 -8
  42. package/src/extension/context-status-injection.ts +14 -12
  43. package/src/extension/crew-autocomplete.ts +8 -16
  44. package/src/extension/crew-cleanup.ts +2 -1
  45. package/src/extension/crew-shortcuts.ts +9 -6
  46. package/src/extension/cross-extension-rpc.ts +136 -42
  47. package/src/extension/help.ts +1 -1
  48. package/src/extension/import-index.ts +10 -5
  49. package/src/extension/knowledge-injection.ts +88 -15
  50. package/src/extension/management.ts +89 -349
  51. package/src/extension/message-renderers.ts +3 -4
  52. package/src/extension/notification-router.ts +22 -5
  53. package/src/extension/notification-sink.ts +6 -3
  54. package/src/extension/pi-api.ts +17 -8
  55. package/src/extension/plan-orchestrate.ts +8 -27
  56. package/src/extension/project-init.ts +21 -6
  57. package/src/extension/register.ts +329 -975
  58. package/src/extension/registration/artifact-cleanup.ts +9 -4
  59. package/src/extension/registration/command-utils.ts +5 -1
  60. package/src/extension/registration/commands.ts +806 -314
  61. package/src/extension/registration/compaction-guard.ts +15 -15
  62. package/src/extension/registration/lifecycle.ts +259 -0
  63. package/src/extension/registration/observability.ts +293 -0
  64. package/src/extension/registration/subagent-helpers.ts +29 -7
  65. package/src/extension/registration/subagent-tools.ts +253 -44
  66. package/src/extension/registration/team-tool.ts +19 -84
  67. package/src/extension/registration/ui.ts +168 -0
  68. package/src/extension/registration/viewers.ts +64 -24
  69. package/src/extension/result-watcher.ts +18 -7
  70. package/src/extension/run-bundle-schema.ts +21 -6
  71. package/src/extension/run-export.ts +15 -6
  72. package/src/extension/run-import.ts +64 -29
  73. package/src/extension/run-index.ts +28 -9
  74. package/src/extension/run-maintenance.ts +32 -12
  75. package/src/extension/session-summary.ts +1 -1
  76. package/src/extension/team-manager-command.ts +64 -7
  77. package/src/extension/team-onboard.ts +151 -150
  78. package/src/extension/team-recommendation.ts +121 -21
  79. package/src/extension/team-tool/anchor.ts +31 -64
  80. package/src/extension/team-tool/api.ts +929 -141
  81. package/src/extension/team-tool/auto-summarize.ts +14 -26
  82. package/src/extension/team-tool/cache-control.ts +1 -5
  83. package/src/extension/team-tool/cancel.ts +138 -38
  84. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  85. package/src/extension/team-tool/chain-executor.ts +29 -51
  86. package/src/extension/team-tool/config-patch.ts +1 -1
  87. package/src/extension/team-tool/context.ts +40 -20
  88. package/src/extension/team-tool/destructive-gate.ts +10 -5
  89. package/src/extension/team-tool/doctor.ts +170 -51
  90. package/src/extension/team-tool/explain.ts +228 -214
  91. package/src/extension/team-tool/failure-patterns.ts +3 -9
  92. package/src/extension/team-tool/goal-wrap.ts +71 -29
  93. package/src/extension/team-tool/goal.ts +185 -35
  94. package/src/extension/team-tool/handle-schedule.ts +34 -15
  95. package/src/extension/team-tool/handle-settings.ts +94 -56
  96. package/src/extension/team-tool/health-monitor.ts +27 -108
  97. package/src/extension/team-tool/inspect.ts +42 -9
  98. package/src/extension/team-tool/intent-policy.ts +4 -1
  99. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  100. package/src/extension/team-tool/orchestrate.ts +7 -18
  101. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  102. package/src/extension/team-tool/plan.ts +29 -5
  103. package/src/extension/team-tool/respond.ts +49 -16
  104. package/src/extension/team-tool/run-not-found.ts +3 -8
  105. package/src/extension/team-tool/run.ts +80 -317
  106. package/src/extension/team-tool/status.ts +135 -43
  107. package/src/extension/team-tool/workflow-manage.ts +92 -25
  108. package/src/extension/team-tool-types.ts +8 -1
  109. package/src/extension/team-tool.ts +142 -551
  110. package/src/extension/validate-resources.ts +39 -8
  111. package/src/hooks/registry.ts +66 -17
  112. package/src/hooks/types.ts +1 -1
  113. package/src/i18n.ts +25 -11
  114. package/src/observability/correlation.ts +17 -3
  115. package/src/observability/event-bus.ts +51 -56
  116. package/src/observability/event-to-metric.ts +117 -15
  117. package/src/observability/exporters/otlp-exporter.ts +56 -17
  118. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  119. package/src/observability/metric-registry.ts +16 -4
  120. package/src/observability/metric-retention.ts +8 -2
  121. package/src/observability/metric-sink.ts +11 -3
  122. package/src/observability/metrics-primitives.ts +42 -9
  123. package/src/plugins/plugin-define.ts +2 -2
  124. package/src/plugins/plugin-registry.ts +25 -25
  125. package/src/plugins/plugins/index.ts +1 -1
  126. package/src/plugins/plugins/nextjs.ts +16 -16
  127. package/src/plugins/plugins/vite.ts +7 -11
  128. package/src/plugins/plugins/vitest.ts +6 -11
  129. package/src/runtime/adaptive-plan.ts +225 -40
  130. package/src/runtime/agent-control.ts +58 -15
  131. package/src/runtime/agent-memory.ts +15 -9
  132. package/src/runtime/agent-observability.ts +10 -2
  133. package/src/runtime/anchor-manager.ts +27 -25
  134. package/src/runtime/async-marker.ts +7 -1
  135. package/src/runtime/async-runner.ts +27 -23
  136. package/src/runtime/auto-summarize.ts +7 -13
  137. package/src/runtime/background-runner.ts +189 -251
  138. package/src/runtime/batch-barrier.ts +18 -16
  139. package/src/runtime/cancellation-token.ts +16 -6
  140. package/src/runtime/cancellation.ts +46 -8
  141. package/src/runtime/capability-inventory.ts +6 -4
  142. package/src/runtime/chain-parser.ts +44 -11
  143. package/src/runtime/chain-runner.ts +63 -69
  144. package/src/runtime/checkpoint.ts +12 -56
  145. package/src/runtime/child-pi.ts +343 -78
  146. package/src/runtime/coalesce-tasks.ts +268 -0
  147. package/src/runtime/code-summary.ts +71 -26
  148. package/src/runtime/compact-stages/index.ts +15 -5
  149. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  150. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  151. package/src/runtime/compaction-summary.ts +17 -10
  152. package/src/runtime/completion-guard.ts +33 -16
  153. package/src/runtime/crash-classification.ts +28 -7
  154. package/src/runtime/crash-recovery.ts +177 -37
  155. package/src/runtime/crew-agent-records.ts +145 -47
  156. package/src/runtime/crew-hooks.ts +9 -24
  157. package/src/runtime/cross-extension-rpc.ts +25 -23
  158. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  159. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  160. package/src/runtime/delivery-coordinator.ts +34 -7
  161. package/src/runtime/delta-conflict.ts +9 -21
  162. package/src/runtime/deterministic-ast.ts +1 -1
  163. package/src/runtime/diagnostic-export.ts +53 -20
  164. package/src/runtime/direct-run.ts +12 -2
  165. package/src/runtime/dwf-state-store.ts +1 -1
  166. package/src/runtime/dynamic-workflow-context.ts +186 -58
  167. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  168. package/src/runtime/effectiveness.ts +16 -8
  169. package/src/runtime/errors/crew-errors.ts +7 -11
  170. package/src/runtime/event-stream-bridge.ts +9 -3
  171. package/src/runtime/foreground-control.ts +54 -14
  172. package/src/runtime/foreground-watchdog.ts +9 -6
  173. package/src/runtime/goal-achievement.ts +27 -10
  174. package/src/runtime/goal-evaluator.ts +54 -19
  175. package/src/runtime/goal-loop-runner.ts +280 -99
  176. package/src/runtime/goal-state-store.ts +27 -17
  177. package/src/runtime/green-contract.ts +11 -2
  178. package/src/runtime/group-join.ts +64 -31
  179. package/src/runtime/handoff-manager.ts +37 -42
  180. package/src/runtime/heartbeat-gradient.ts +10 -2
  181. package/src/runtime/heartbeat-watcher.ts +32 -6
  182. package/src/runtime/hidden-handoff.ts +12 -30
  183. package/src/runtime/important-line-classifier.ts +12 -2
  184. package/src/runtime/iteration-hooks.ts +25 -15
  185. package/src/runtime/live-agent-control.ts +55 -7
  186. package/src/runtime/live-agent-manager.ts +130 -27
  187. package/src/runtime/live-control-realtime.ts +23 -3
  188. package/src/runtime/live-irc.ts +4 -1
  189. package/src/runtime/live-session-health.ts +12 -4
  190. package/src/runtime/live-session-runtime.ts +379 -117
  191. package/src/runtime/manifest-cache.ts +28 -12
  192. package/src/runtime/mcp-proxy.ts +8 -16
  193. package/src/runtime/metric-parser.ts +1 -5
  194. package/src/runtime/model-fallback.ts +55 -18
  195. package/src/runtime/model-resolver.ts +2 -6
  196. package/src/runtime/model-scope.ts +19 -3
  197. package/src/runtime/notebook-helpers.ts +60 -62
  198. package/src/runtime/orphan-worker-registry.ts +37 -26
  199. package/src/runtime/output-validator.ts +18 -3
  200. package/src/runtime/overflow-recovery.ts +5 -4
  201. package/src/runtime/parallel-research.ts +29 -5
  202. package/src/runtime/parallel-utils.ts +9 -11
  203. package/src/runtime/path-overlap.ts +150 -0
  204. package/src/runtime/peer-dep.ts +12 -17
  205. package/src/runtime/per-write-validator.ts +1 -3
  206. package/src/runtime/phase-tracker.ts +342 -330
  207. package/src/runtime/pi-args.ts +26 -8
  208. package/src/runtime/pi-json-output.ts +1 -1
  209. package/src/runtime/pi-spawn.ts +30 -19
  210. package/src/runtime/pipeline-runner.ts +56 -55
  211. package/src/runtime/plan-templates.ts +5 -6
  212. package/src/runtime/policy-engine.ts +43 -7
  213. package/src/runtime/post-checks.ts +12 -4
  214. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  215. package/src/runtime/process-lifecycle.ts +20 -10
  216. package/src/runtime/process-status.ts +16 -5
  217. package/src/runtime/progress-event-coalescer.ts +2 -1
  218. package/src/runtime/progress-tracker.ts +103 -103
  219. package/src/runtime/prose-compressor.ts +9 -11
  220. package/src/runtime/recovery-recipes.ts +118 -24
  221. package/src/runtime/replace.ts +25 -10
  222. package/src/runtime/resilient-edit.ts +10 -25
  223. package/src/runtime/result-extractor.ts +1 -2
  224. package/src/runtime/retry-executor.ts +20 -4
  225. package/src/runtime/retry-runner.ts +26 -50
  226. package/src/runtime/role-permission.ts +6 -1
  227. package/src/runtime/run-coalesced-task-group.ts +256 -0
  228. package/src/runtime/run-drift.ts +14 -15
  229. package/src/runtime/run-tracker.ts +6 -28
  230. package/src/runtime/runtime-policy.ts +1 -6
  231. package/src/runtime/runtime-resolver.ts +80 -15
  232. package/src/runtime/scheduler.ts +47 -18
  233. package/src/runtime/semaphore.ts +5 -7
  234. package/src/runtime/sensitive-paths.ts +2 -1
  235. package/src/runtime/session-usage.ts +1 -1
  236. package/src/runtime/settings-store.ts +16 -12
  237. package/src/runtime/sidechain-output.ts +6 -2
  238. package/src/runtime/single-agent-compose.ts +1 -4
  239. package/src/runtime/skill-effectiveness.ts +29 -97
  240. package/src/runtime/skill-instructions.ts +40 -83
  241. package/src/runtime/stale-reconciler.ts +73 -197
  242. package/src/runtime/stream-preview.ts +1 -1
  243. package/src/runtime/streaming-output.ts +1 -1
  244. package/src/runtime/subagent-manager.ts +44 -169
  245. package/src/runtime/subprocess-tool-registry.ts +4 -1
  246. package/src/runtime/supervisor-contact.ts +10 -5
  247. package/src/runtime/task-display.ts +19 -5
  248. package/src/runtime/task-graph-scheduler.ts +95 -21
  249. package/src/runtime/task-graph.ts +5 -11
  250. package/src/runtime/task-health.ts +54 -47
  251. package/src/runtime/task-id.ts +11 -18
  252. package/src/runtime/task-output-context.ts +265 -81
  253. package/src/runtime/task-packet.ts +12 -20
  254. package/src/runtime/task-quality.ts +6 -14
  255. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  256. package/src/runtime/task-runner/live-executor.ts +114 -36
  257. package/src/runtime/task-runner/output-splitter.ts +152 -0
  258. package/src/runtime/task-runner/progress.ts +50 -12
  259. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  260. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  261. package/src/runtime/task-runner/result-utils.ts +3 -1
  262. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  263. package/src/runtime/task-runner/run-projection.ts +27 -8
  264. package/src/runtime/task-runner/state-helpers.ts +29 -8
  265. package/src/runtime/task-runner/tail-read.ts +2 -6
  266. package/src/runtime/task-runner.ts +180 -326
  267. package/src/runtime/team-runner-artifacts.ts +13 -0
  268. package/src/runtime/team-runner.ts +456 -974
  269. package/src/runtime/tool-output-pruner.ts +6 -9
  270. package/src/runtime/tool-progress.ts +11 -21
  271. package/src/runtime/verification-gates.ts +33 -24
  272. package/src/runtime/verification-integrity.ts +1 -4
  273. package/src/runtime/verification-worktree.ts +62 -12
  274. package/src/runtime/worker-heartbeat.ts +5 -1
  275. package/src/runtime/worker-startup.ts +29 -5
  276. package/src/runtime/workflow-state.ts +17 -9
  277. package/src/runtime/workspace-lock.ts +30 -35
  278. package/src/runtime/workspace-tree.ts +20 -32
  279. package/src/runtime/yield-handler.ts +43 -9
  280. package/src/runtime/zombie-scanner.ts +5 -4
  281. package/src/schema/config-schema.ts +266 -172
  282. package/src/schema/team-tool-schema.ts +29 -74
  283. package/src/schema/validation-types.ts +25 -17
  284. package/src/skills/discover-skills.ts +35 -10
  285. package/src/skills/skill-templates.ts +109 -27
  286. package/src/skills/validate.ts +26 -8
  287. package/src/state/active-run-registry.ts +87 -28
  288. package/src/state/artifact-store.ts +9 -5
  289. package/src/state/atomic-write-v2.ts +85 -63
  290. package/src/state/atomic-write.ts +105 -26
  291. package/src/state/blob-store.ts +47 -20
  292. package/src/state/contracts.ts +20 -5
  293. package/src/state/crew-init.ts +5 -22
  294. package/src/state/decision-ledger.ts +19 -73
  295. package/src/state/event-log-rotation.ts +41 -15
  296. package/src/state/event-log.ts +168 -53
  297. package/src/state/event-reconstructor.ts +11 -1
  298. package/src/state/gitignore-manager.ts +2 -8
  299. package/src/state/health-store.ts +57 -57
  300. package/src/state/hook-instinct-bridge.ts +1 -1
  301. package/src/state/hook-integrations.ts +1 -1
  302. package/src/state/instinct-store.ts +17 -5
  303. package/src/state/jsonl-writer.ts +1 -1
  304. package/src/state/locks.ts +23 -9
  305. package/src/state/mailbox.ts +151 -28
  306. package/src/state/observation-store.ts +20 -14
  307. package/src/state/run-cache.ts +142 -135
  308. package/src/state/run-graph.ts +6 -15
  309. package/src/state/run-metrics.ts +5 -18
  310. package/src/state/schedule.ts +15 -9
  311. package/src/state/state-store.ts +129 -45
  312. package/src/state/task-claims.ts +12 -2
  313. package/src/state/tiered-eval.ts +52 -43
  314. package/src/state/types-eval.ts +2 -2
  315. package/src/state/types.ts +24 -20
  316. package/src/state/usage.ts +20 -4
  317. package/src/state/worker-atomic-writer.ts +6 -3
  318. package/src/subagents/index.ts +2 -2
  319. package/src/teams/discover-teams.ts +21 -6
  320. package/src/tools/safe-bash-extension.ts +5 -6
  321. package/src/tools/safe-bash.ts +10 -11
  322. package/src/types/new-api-types.ts +6 -10
  323. package/src/ui/agent-management-overlay.ts +52 -40
  324. package/src/ui/card-colors.ts +13 -4
  325. package/src/ui/crew-footer.ts +8 -7
  326. package/src/ui/crew-select-list.ts +1 -1
  327. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  328. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  329. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  330. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  331. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  332. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  333. package/src/ui/heartbeat-aggregator.ts +15 -4
  334. package/src/ui/keybinding-map.ts +40 -7
  335. package/src/ui/live-conversation-overlay.ts +36 -20
  336. package/src/ui/live-duration.ts +1 -4
  337. package/src/ui/live-run-sidebar.ts +88 -25
  338. package/src/ui/loaders.ts +2 -8
  339. package/src/ui/mascot.ts +20 -36
  340. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  341. package/src/ui/overlays/confirm-overlay.ts +4 -2
  342. package/src/ui/overlays/help-overlay.ts +25 -14
  343. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  344. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  345. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  346. package/src/ui/pi-ui-compat.ts +7 -7
  347. package/src/ui/powerbar-publisher.ts +120 -42
  348. package/src/ui/render-diff.ts +10 -3
  349. package/src/ui/render-scheduler.ts +12 -4
  350. package/src/ui/run-action-dispatcher.ts +81 -18
  351. package/src/ui/run-dashboard.ts +172 -76
  352. package/src/ui/run-event-bus.ts +59 -37
  353. package/src/ui/run-snapshot-cache.ts +276 -86
  354. package/src/ui/settings-overlay.ts +361 -74
  355. package/src/ui/status-colors.ts +12 -1
  356. package/src/ui/syntax-highlight.ts +1 -1
  357. package/src/ui/theme-adapter.ts +16 -14
  358. package/src/ui/theme-discovery.ts +13 -2
  359. package/src/ui/tool-progress-formatter.ts +7 -7
  360. package/src/ui/tool-render.ts +128 -56
  361. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  362. package/src/ui/tool-renderers/index.ts +109 -43
  363. package/src/ui/transcript-cache.ts +32 -6
  364. package/src/ui/transcript-entries.ts +25 -23
  365. package/src/ui/transcript-viewer.ts +78 -29
  366. package/src/ui/widget/index.ts +99 -40
  367. package/src/ui/widget/widget-formatters.ts +13 -6
  368. package/src/ui/widget/widget-model.ts +19 -8
  369. package/src/ui/widget/widget-renderer.ts +23 -13
  370. package/src/ui/widget/widget-types.ts +1 -1
  371. package/src/utils/bm25-search.ts +199 -199
  372. package/src/utils/conflict-detect.ts +22 -21
  373. package/src/utils/env-filter.ts +14 -7
  374. package/src/utils/file-coalescer.ts +5 -1
  375. package/src/utils/fingerprint.ts +3 -6
  376. package/src/utils/frontmatter.ts +3 -1
  377. package/src/utils/fs-watch.ts +2 -6
  378. package/src/utils/gh-protocol.ts +119 -44
  379. package/src/utils/git.ts +13 -15
  380. package/src/utils/guards.ts +2 -5
  381. package/src/utils/ids.ts +9 -2
  382. package/src/utils/incremental-reader.ts +14 -3
  383. package/src/utils/internal-error.ts +2 -1
  384. package/src/utils/names.ts +12 -3
  385. package/src/utils/paths.ts +49 -5
  386. package/src/utils/project-detector.ts +2 -2
  387. package/src/utils/redaction.ts +29 -19
  388. package/src/utils/resolve-shell.ts +9 -7
  389. package/src/utils/run-watcher-registry.ts +19 -31
  390. package/src/utils/safe-paths.ts +45 -24
  391. package/src/utils/scan-cache.ts +9 -2
  392. package/src/utils/session-utils.ts +2 -4
  393. package/src/utils/sleep.ts +12 -5
  394. package/src/utils/sse-parser.ts +5 -17
  395. package/src/utils/visual.ts +52 -32
  396. package/src/workflows/discover-workflows.ts +41 -109
  397. package/src/workflows/intermediate-store.ts +5 -21
  398. package/src/workflows/preflight-validator.ts +6 -33
  399. package/src/workflows/topology-analyzer.ts +5 -21
  400. package/src/workflows/workflow-config.ts +7 -6
  401. package/src/worktree/branch-freshness.ts +66 -8
  402. package/src/worktree/cleanup.ts +130 -20
  403. package/src/worktree/worktree-manager.ts +212 -69
  404. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  405. package/skills/detection-pipeline-design/SKILL.md +0 -286
  406. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  407. package/skills/incident-playbook-construction/SKILL.md +0 -384
  408. package/skills/security-review/SKILL.md +0 -561
  409. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  410. package/skills/ui-render-performance/SKILL.md +0 -58
  411. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  412. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  413. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  414. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  415. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  416. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  417. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  418. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  419. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  420. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  421. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  422. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  430. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  431. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  432. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -3,10 +3,11 @@
3
3
  * Mirrors Pi's built-in /settings selector: tab bar, settings list with
4
4
  * label/value alignment, inline toggle, select submenu, and text input.
5
5
  */
6
- import type { CrewTheme } from "./theme-adapter.ts";
6
+
7
+ import { truncateToWidth, visibleWidth } from "../utils/visual.ts";
7
8
  import { DynamicCrewBorder } from "./dynamic-border.ts";
9
+ import type { CrewTheme } from "./theme-adapter.ts";
8
10
  import { discoverPiThemes, getActivePiTheme } from "./theme-discovery.ts";
9
- import { visibleWidth, truncateToWidth } from "../utils/visual.ts";
10
11
 
11
12
  // ---------------------------------------------------------------------------
12
13
  // Types
@@ -57,47 +58,265 @@ const TABS: TabDef[] = [
57
58
 
58
59
  const SETTINGS: SettingDef[] = [
59
60
  // Runtime
60
- { id: "runtime.mode", label: "Runtime Mode", type: "enum", values: ["auto", "scaffold", "child-process", "live-session"], tab: "runtime", description: "How workers execute. 'auto' picks best available. 'scaffold' = dry-run." },
61
- { id: "runtime.maxTurns", label: "Max Turns", type: "number", tab: "runtime", description: "Maximum agent turns per task." },
62
- { id: "runtime.graceTurns", label: "Grace Turns", type: "number", tab: "runtime", description: "Extra turns allowed after completion." },
63
- { id: "runtime.inheritContext", label: "Inherit Context", type: "boolean", tab: "runtime", description: "Pass parent conversation context to workers." },
64
- { id: "runtime.promptMode", label: "Prompt Mode", type: "enum", values: ["compact", "full", "minimal"], tab: "runtime", description: "How much prompt detail to send to workers." },
65
- { id: "runtime.completionMutationGuard", label: "Mutation Guard", type: "enum", values: ["off", "warn", "block"], tab: "runtime", description: "Guard against tasks completing without file mutations." },
66
- { id: "runtime.isolationPolicy", label: "Isolation Policy", type: "enum", values: ["workspace", "none"], tab: "runtime", description: "Workspace isolation between agents." },
61
+ {
62
+ id: "runtime.mode",
63
+ label: "Runtime Mode",
64
+ type: "enum",
65
+ values: ["auto", "scaffold", "child-process", "live-session"],
66
+ tab: "runtime",
67
+ description: "How workers execute. 'auto' picks best available. 'scaffold' = dry-run.",
68
+ },
69
+ {
70
+ id: "runtime.maxTurns",
71
+ label: "Max Turns",
72
+ type: "number",
73
+ tab: "runtime",
74
+ description: "Maximum agent turns per task.",
75
+ },
76
+ {
77
+ id: "runtime.graceTurns",
78
+ label: "Grace Turns",
79
+ type: "number",
80
+ tab: "runtime",
81
+ description: "Extra turns allowed after completion.",
82
+ },
83
+ {
84
+ id: "runtime.inheritContext",
85
+ label: "Inherit Context",
86
+ type: "boolean",
87
+ tab: "runtime",
88
+ description: "Pass parent conversation context to workers.",
89
+ },
90
+ {
91
+ id: "runtime.promptMode",
92
+ label: "Prompt Mode",
93
+ type: "enum",
94
+ values: ["compact", "full", "minimal"],
95
+ tab: "runtime",
96
+ description: "How much prompt detail to send to workers.",
97
+ },
98
+ {
99
+ id: "runtime.completionMutationGuard",
100
+ label: "Mutation Guard",
101
+ type: "enum",
102
+ values: ["off", "warn", "block"],
103
+ tab: "runtime",
104
+ description: "Guard against tasks completing without file mutations.",
105
+ },
106
+ {
107
+ id: "runtime.isolationPolicy",
108
+ label: "Isolation Policy",
109
+ type: "enum",
110
+ values: ["workspace", "none"],
111
+ tab: "runtime",
112
+ description: "Workspace isolation between agents.",
113
+ },
67
114
  // Limits
68
- { id: "limits.maxConcurrentWorkers", label: "Max Concurrent", type: "number", tab: "limits", description: "Max number of workers running simultaneously." },
69
- { id: "limits.maxTaskDepth", label: "Max Task Depth", type: "number", tab: "limits", description: "Maximum depth of nested task spawning." },
70
- { id: "limits.maxRunMinutes", label: "Max Run Minutes", type: "number", tab: "limits", description: "Maximum total run time in minutes." },
71
- { id: "limits.maxRetriesPerTask", label: "Max Retries", type: "number", tab: "limits", description: "Max retry attempts per failed task." },
72
- { id: "limits.maxTasksPerRun", label: "Max Tasks", type: "number", tab: "limits", description: "Maximum number of tasks per run." },
73
- { id: "limits.heartbeatStaleMs", label: "Heartbeat Stale", type: "number", tab: "limits", description: "Milliseconds before a worker is considered stale." },
115
+ {
116
+ id: "limits.maxConcurrentWorkers",
117
+ label: "Max Concurrent",
118
+ type: "number",
119
+ tab: "limits",
120
+ description: "Max number of workers running simultaneously.",
121
+ },
122
+ {
123
+ id: "limits.maxTaskDepth",
124
+ label: "Max Task Depth",
125
+ type: "number",
126
+ tab: "limits",
127
+ description: "Maximum depth of nested task spawning.",
128
+ },
129
+ {
130
+ id: "limits.maxRunMinutes",
131
+ label: "Max Run Minutes",
132
+ type: "number",
133
+ tab: "limits",
134
+ description: "Maximum total run time in minutes.",
135
+ },
136
+ {
137
+ id: "limits.maxRetriesPerTask",
138
+ label: "Max Retries",
139
+ type: "number",
140
+ tab: "limits",
141
+ description: "Max retry attempts per failed task.",
142
+ },
143
+ {
144
+ id: "limits.maxTasksPerRun",
145
+ label: "Max Tasks",
146
+ type: "number",
147
+ tab: "limits",
148
+ description: "Maximum number of tasks per run.",
149
+ },
150
+ {
151
+ id: "limits.heartbeatStaleMs",
152
+ label: "Heartbeat Stale",
153
+ type: "number",
154
+ tab: "limits",
155
+ description: "Milliseconds before a worker is considered stale.",
156
+ },
74
157
  // Agents
75
- { id: "agents.overrides", label: "Agent Model Overrides", type: "agent", tab: "agents", description: "Model and thinking overrides per agent role." },
76
- { id: "agents.disableBuiltins", label: "Disable Builtins", type: "boolean", tab: "agents", description: "Disable built-in agent definitions." },
158
+ {
159
+ id: "agents.overrides",
160
+ label: "Agent Model Overrides",
161
+ type: "agent",
162
+ tab: "agents",
163
+ description: "Model and thinking overrides per agent role.",
164
+ },
165
+ {
166
+ id: "agents.disableBuiltins",
167
+ label: "Disable Builtins",
168
+ type: "boolean",
169
+ tab: "agents",
170
+ description: "Disable built-in agent definitions.",
171
+ },
77
172
  // UI
78
- { id: "ui.showModel", label: "Show Model", type: "boolean", tab: "ui", description: "Show model name in widget/dashboard." },
79
- { id: "ui.showTokens", label: "Show Tokens", type: "boolean", tab: "ui", description: "Show token counts in dashboard." },
80
- { id: "ui.showTools", label: "Show Tools", type: "boolean", tab: "ui", description: "Show tool usage in dashboard." },
81
- { id: "ui.dashboardPlacement", label: "Dashboard Placement", type: "enum", values: ["center", "right"], tab: "ui", description: "Where to place the dashboard overlay." },
82
- { id: "ui.dashboardWidth", label: "Dashboard Width", type: "number", tab: "ui", description: "Dashboard width as percentage or pixels." },
83
- { id: "ui.autoOpenDashboard", label: "Auto Open Dashboard", type: "boolean", tab: "ui", description: "Auto-open dashboard when a run starts." },
84
- { id: "ui.widgetPlacement", label: "Widget Placement", type: "enum", values: ["bottom", "hidden"], tab: "ui", description: "Where to place the crew widget." },
173
+ {
174
+ id: "ui.showModel",
175
+ label: "Show Model",
176
+ type: "boolean",
177
+ tab: "ui",
178
+ description: "Show model name in widget/dashboard.",
179
+ },
180
+ {
181
+ id: "ui.showTokens",
182
+ label: "Show Tokens",
183
+ type: "boolean",
184
+ tab: "ui",
185
+ description: "Show token counts in dashboard.",
186
+ },
187
+ {
188
+ id: "ui.showTools",
189
+ label: "Show Tools",
190
+ type: "boolean",
191
+ tab: "ui",
192
+ description: "Show tool usage in dashboard.",
193
+ },
194
+ {
195
+ id: "ui.dashboardPlacement",
196
+ label: "Dashboard Placement",
197
+ type: "enum",
198
+ values: ["center", "right"],
199
+ tab: "ui",
200
+ description: "Where to place the dashboard overlay.",
201
+ },
202
+ {
203
+ id: "ui.dashboardWidth",
204
+ label: "Dashboard Width",
205
+ type: "number",
206
+ tab: "ui",
207
+ description: "Dashboard width as percentage or pixels.",
208
+ },
209
+ {
210
+ id: "ui.autoOpenDashboard",
211
+ label: "Auto Open Dashboard",
212
+ type: "boolean",
213
+ tab: "ui",
214
+ description: "Auto-open dashboard when a run starts.",
215
+ },
216
+ {
217
+ id: "ui.widgetPlacement",
218
+ label: "Widget Placement",
219
+ type: "enum",
220
+ values: ["bottom", "hidden"],
221
+ tab: "ui",
222
+ description: "Where to place the crew widget.",
223
+ },
85
224
  // ── Themes tab ──
86
- { id: "__piTheme__", label: "Pi UI Theme", type: "action", action: "piTheme", values: discoverPiThemes().map((t) => t.name), tab: "themes", description: "Overall terminal theme. Switches live (no restart). Currently: " + (getActivePiTheme() ?? "dark (default)") },
225
+ {
226
+ id: "__piTheme__",
227
+ label: "Pi UI Theme",
228
+ type: "action",
229
+ action: "piTheme",
230
+ values: discoverPiThemes().map((t) => t.name),
231
+ tab: "themes",
232
+ description: "Overall terminal theme. Switches live (no restart). Currently: " + (getActivePiTheme() ?? "dark (default)"),
233
+ },
87
234
  // Autonomous
88
- { id: "autonomous.enabled", label: "Enabled", type: "boolean", tab: "autonomous", description: "Enable autonomous pi-crew delegation." },
89
- { id: "autonomous.injectPolicy", label: "Inject Policy", type: "boolean", tab: "autonomous", description: "Inject delegation policy into agent context." },
90
- { id: "autonomous.preferAsyncForLongTasks", label: "Prefer Async", type: "boolean", tab: "autonomous", description: "Prefer async execution for long tasks." },
91
- { id: "autonomous.allowWorktreeSuggestion", label: "Allow Worktree", type: "boolean", tab: "autonomous", description: "Allow suggesting worktree isolation." },
235
+ {
236
+ id: "autonomous.enabled",
237
+ label: "Enabled",
238
+ type: "boolean",
239
+ tab: "autonomous",
240
+ description: "Enable autonomous pi-crew delegation.",
241
+ },
242
+ {
243
+ id: "autonomous.injectPolicy",
244
+ label: "Inject Policy",
245
+ type: "boolean",
246
+ tab: "autonomous",
247
+ description: "Inject delegation policy into agent context.",
248
+ },
249
+ {
250
+ id: "autonomous.preferAsyncForLongTasks",
251
+ label: "Prefer Async",
252
+ type: "boolean",
253
+ tab: "autonomous",
254
+ description: "Prefer async execution for long tasks.",
255
+ },
256
+ {
257
+ id: "autonomous.allowWorktreeSuggestion",
258
+ label: "Allow Worktree",
259
+ type: "boolean",
260
+ tab: "autonomous",
261
+ description: "Allow suggesting worktree isolation.",
262
+ },
92
263
  // Advanced
93
- { id: "executeWorkers", label: "Execute Workers", type: "boolean", tab: "advanced", description: "Allow real child Pi workers. false = scaffold only." },
94
- { id: "asyncByDefault", label: "Async By Default", type: "boolean", tab: "advanced", description: "Run teams asynchronously by default." },
95
- { id: "notifierIntervalMs", label: "Notifier Interval", type: "number", tab: "advanced", description: "Async run notifier check interval in ms." },
96
- { id: "reliability.autoRetry", label: "Auto Retry", type: "boolean", tab: "advanced", description: "Automatically retry failed tasks." },
97
- { id: "reliability.autoRecover", label: "Auto Recover", type: "boolean", tab: "advanced", description: "Automatically recover from crashes." },
98
- { id: "reliability.cleanupOrphanedTempDirs", label: "Cleanup Orphaned Temp Dirs", type: "boolean", tab: "advanced", description: "Remove /tmp/pi-crew-* directories after reconciliation (1h age threshold)." },
99
- { id: "telemetry.enabled", label: "Telemetry", type: "boolean", tab: "advanced", description: "Enable telemetry collection." },
100
- { id: "notifications.enabled", label: "Notifications", type: "boolean", tab: "advanced", description: "Enable run notifications." },
264
+ {
265
+ id: "executeWorkers",
266
+ label: "Execute Workers",
267
+ type: "boolean",
268
+ tab: "advanced",
269
+ description: "Allow real child Pi workers. false = scaffold only.",
270
+ },
271
+ {
272
+ id: "asyncByDefault",
273
+ label: "Async By Default",
274
+ type: "boolean",
275
+ tab: "advanced",
276
+ description: "Run teams asynchronously by default.",
277
+ },
278
+ {
279
+ id: "notifierIntervalMs",
280
+ label: "Notifier Interval",
281
+ type: "number",
282
+ tab: "advanced",
283
+ description: "Async run notifier check interval in ms.",
284
+ },
285
+ {
286
+ id: "reliability.autoRetry",
287
+ label: "Auto Retry",
288
+ type: "boolean",
289
+ tab: "advanced",
290
+ description: "Automatically retry failed tasks.",
291
+ },
292
+ {
293
+ id: "reliability.autoRecover",
294
+ label: "Auto Recover",
295
+ type: "boolean",
296
+ tab: "advanced",
297
+ description: "Automatically recover from crashes.",
298
+ },
299
+ {
300
+ id: "reliability.cleanupOrphanedTempDirs",
301
+ label: "Cleanup Orphaned Temp Dirs",
302
+ type: "boolean",
303
+ tab: "advanced",
304
+ description: "Remove /tmp/pi-crew-* directories after reconciliation (1h age threshold).",
305
+ },
306
+ {
307
+ id: "telemetry.enabled",
308
+ label: "Telemetry",
309
+ type: "boolean",
310
+ tab: "advanced",
311
+ description: "Enable telemetry collection.",
312
+ },
313
+ {
314
+ id: "notifications.enabled",
315
+ label: "Notifications",
316
+ type: "boolean",
317
+ tab: "advanced",
318
+ description: "Enable run notifications.",
319
+ },
101
320
  ];
102
321
 
103
322
  // ---------------------------------------------------------------------------
@@ -130,9 +349,9 @@ const EFFECTIVE_DEFAULTS: Record<string, unknown> = {
130
349
  "autonomous.injectPolicy": true,
131
350
  "autonomous.preferAsyncForLongTasks": false,
132
351
  "autonomous.allowWorktreeSuggestion": true,
133
- "executeWorkers": true,
134
- "asyncByDefault": false,
135
- "notifierIntervalMs": 5000,
352
+ executeWorkers: true,
353
+ asyncByDefault: false,
354
+ notifierIntervalMs: 5000,
136
355
  "reliability.autoRetry": false,
137
356
  "reliability.autoRecover": false,
138
357
  "reliability.cleanupOrphanedTempDirs": true,
@@ -201,7 +420,15 @@ class SelectSubmenu {
201
420
  private readonly title: string;
202
421
  private readonly description: string;
203
422
 
204
- constructor(title: string, description: string, options: string[], current: string, theme: CrewTheme, onSelect: (value: string) => void, onCancel: () => void) {
423
+ constructor(
424
+ title: string,
425
+ description: string,
426
+ options: string[],
427
+ current: string,
428
+ theme: CrewTheme,
429
+ onSelect: (value: string) => void,
430
+ onCancel: () => void,
431
+ ) {
205
432
  this.title = title;
206
433
  this.description = description;
207
434
  this.items = options;
@@ -285,7 +512,14 @@ class TextinputSubmenu {
285
512
  private readonly onSubmit: (value: string) => void;
286
513
  private readonly onCancel: () => void;
287
514
 
288
- constructor(title: string, description: string, initialValue: string, theme: CrewTheme, onSubmit: (value: string) => void, onCancel: () => void) {
515
+ constructor(
516
+ title: string,
517
+ description: string,
518
+ initialValue: string,
519
+ theme: CrewTheme,
520
+ onSubmit: (value: string) => void,
521
+ onCancel: () => void,
522
+ ) {
289
523
  this.title = title;
290
524
  this.description = description;
291
525
  this.buffer = initialValue;
@@ -345,13 +579,32 @@ class AgentOverridesSubmenu {
345
579
  private readonly onApply: (overrides: Record<string, unknown>) => void;
346
580
  private readonly onCancel: () => void;
347
581
 
348
- constructor(config: Record<string, unknown>, theme: CrewTheme, onApply: (overrides: Record<string, unknown>) => void, onCancel: () => void) {
582
+ constructor(
583
+ config: Record<string, unknown>,
584
+ theme: CrewTheme,
585
+ onApply: (overrides: Record<string, unknown>) => void,
586
+ onCancel: () => void,
587
+ ) {
349
588
  this.theme = theme;
350
589
  this.onApply = onApply;
351
590
  this.onCancel = onCancel;
352
- const existing = (config.agents as Record<string, unknown>)?.overrides as Record<string, { model?: string; thinking?: string }> | undefined;
591
+ const existing = (config.agents as Record<string, unknown>)?.overrides as
592
+ | Record<string, { model?: string; thinking?: string }>
593
+ | undefined;
353
594
  this.overrides = existing ? structuredClone(existing) : {};
354
- this.agents = ["explorer", "planner", "analyst", "critic", "executor", "reviewer", "security-reviewer", "test-engineer", "verifier", "cold-verifier", "writer"];
595
+ this.agents = [
596
+ "explorer",
597
+ "planner",
598
+ "analyst",
599
+ "critic",
600
+ "executor",
601
+ "reviewer",
602
+ "security-reviewer",
603
+ "test-engineer",
604
+ "verifier",
605
+ "cold-verifier",
606
+ "writer",
607
+ ];
355
608
  }
356
609
 
357
610
  invalidate(): void {}
@@ -375,7 +628,11 @@ class AgentOverridesSubmenu {
375
628
  const valueText = valueParts || this.theme.fg("dim", "(default)");
376
629
  const prefix = isSelected ? " → " : " ";
377
630
  const line = `${prefix}${label} ${valueText}`;
378
- lines.push(isSelected ? (this.theme.inverse?.(truncateToWidth(line, width - 2)) ?? truncateToWidth(line, width - 2)) : truncateToWidth(line, width - 2));
631
+ lines.push(
632
+ isSelected
633
+ ? (this.theme.inverse?.(truncateToWidth(line, width - 2)) ?? truncateToWidth(line, width - 2))
634
+ : truncateToWidth(line, width - 2),
635
+ );
379
636
  }
380
637
  lines.push("");
381
638
  lines.push(this.theme.fg("dim", "Enter to edit model · e to edit thinking · Esc to go back"));
@@ -397,8 +654,14 @@ class AgentOverridesSubmenu {
397
654
  handleInput(data: string): void {
398
655
  if (this.editField) return this.handleEditInput(data);
399
656
 
400
- if (data === "\x1b[A" || data === "k") { this.selectedIndex = (this.selectedIndex - 1 + this.agents.length) % this.agents.length; return; }
401
- if (data === "\x1b[B" || data === "j") { this.selectedIndex = (this.selectedIndex + 1) % this.agents.length; return; }
657
+ if (data === "\x1b[A" || data === "k") {
658
+ this.selectedIndex = (this.selectedIndex - 1 + this.agents.length) % this.agents.length;
659
+ return;
660
+ }
661
+ if (data === "\x1b[B" || data === "j") {
662
+ this.selectedIndex = (this.selectedIndex + 1) % this.agents.length;
663
+ return;
664
+ }
402
665
  if (data === "\r" || data === "\n") {
403
666
  const agent = this.agents[this.selectedIndex]!;
404
667
  this.editField = "model";
@@ -411,7 +674,10 @@ class AgentOverridesSubmenu {
411
674
  this.editBuffer = this.overrides[agent]?.thinking ?? "";
412
675
  return;
413
676
  }
414
- if (data === "\x1b") { this.onCancel(); return; }
677
+ if (data === "\x1b") {
678
+ this.onCancel();
679
+ return;
680
+ }
415
681
  }
416
682
 
417
683
  private handleEditInput(data: string): void {
@@ -430,9 +696,17 @@ class AgentOverridesSubmenu {
430
696
  this.editField = null;
431
697
  return;
432
698
  }
433
- if (data === "\x1b") { this.editField = null; return; }
434
- if (data === "\x7f" || data === "\b") { this.editBuffer = this.editBuffer.slice(0, -1); return; }
435
- if (data.length === 1 && data >= " " && data <= "~") { this.editBuffer += data; }
699
+ if (data === "\x1b") {
700
+ this.editField = null;
701
+ return;
702
+ }
703
+ if (data === "\x7f" || data === "\b") {
704
+ this.editBuffer = this.editBuffer.slice(0, -1);
705
+ return;
706
+ }
707
+ if (data.length === 1 && data >= " " && data <= "~") {
708
+ this.editBuffer += data;
709
+ }
436
710
  }
437
711
  }
438
712
 
@@ -483,9 +757,7 @@ class SettingsOverlay {
483
757
  lines.push(border("├", "┤"));
484
758
 
485
759
  // ── Content ──
486
- const content = this.submenu
487
- ? this.renderSubmenuContent(innerWidth - 4)
488
- : this.renderSettingsContent(innerWidth - 4);
760
+ const content = this.submenu ? this.renderSubmenuContent(innerWidth - 4) : this.renderSettingsContent(innerWidth - 4);
489
761
  for (const line of content) {
490
762
  lines.push(row(` ${truncateToWidth(line, innerWidth - 2)}`));
491
763
  }
@@ -501,21 +773,18 @@ class SettingsOverlay {
501
773
  for (const [i, tab] of TABS.entries()) {
502
774
  const isActive = i === this.currentTabIndex;
503
775
  const text = `${tab.icon} ${tab.label}`;
504
- parts.push(isActive
505
- ? this.theme.bold(this.theme.fg("accent", text))
506
- : this.theme.fg("dim", text),
507
- );
776
+ parts.push(isActive ? this.theme.bold(this.theme.fg("accent", text)) : this.theme.fg("dim", text));
508
777
  }
509
778
  return parts.join(" " + this.theme.fg("border", "│") + " ");
510
779
  }
511
780
 
512
781
  private renderSettingsContent(innerWidth: number): string[] {
513
782
  const tabId = TABS[this.currentTabIndex]?.id ?? "runtime";
514
- const settings = SETTINGS.filter(s => s.tab === tabId);
783
+ const settings = SETTINGS.filter((s) => s.tab === tabId);
515
784
  const lines: string[] = [];
516
785
 
517
786
  // Calculate max label width for alignment
518
- const maxLabelWidth = Math.min(28, Math.max(...settings.map(s => visibleWidth(s.label))));
787
+ const maxLabelWidth = Math.min(28, Math.max(...settings.map((s) => visibleWidth(s.label))));
519
788
 
520
789
  // Render visible items
521
790
  const startIdx = this.scrollOffset;
@@ -526,9 +795,7 @@ class SettingsOverlay {
526
795
  if (!def) continue;
527
796
  const isSelected = i === this.selectedIndex;
528
797
 
529
- const effective = this.changedValues.has(def.id)
530
- ? this.changedValues.get(def.id)
531
- : currentValueFor(this.config, def.id);
798
+ const effective = this.changedValues.has(def.id) ? this.changedValues.get(def.id) : currentValueFor(this.config, def.id);
532
799
  const isDefault = !this.changedValues.has(def.id) && !isExplicitlySet(this.config, def.id) && def.id !== "__piTheme__";
533
800
  const valueStr = formatValue(effective, def.id);
534
801
  const suffix = isDefault && (effective !== undefined || EFFECTIVE_DEFAULTS[def.id] !== undefined) ? " (default)" : "";
@@ -605,7 +872,7 @@ class SettingsOverlay {
605
872
 
606
873
  // Item navigation
607
874
  const tabId = TABS[this.currentTabIndex]?.id ?? "runtime";
608
- const settings = SETTINGS.filter(s => s.tab === tabId);
875
+ const settings = SETTINGS.filter((s) => s.tab === tabId);
609
876
 
610
877
  if (data === "\x1b[A" || data === "k") {
611
878
  this.selectedIndex = Math.max(0, this.selectedIndex - 1);
@@ -652,7 +919,10 @@ class SettingsOverlay {
652
919
  this.submenu = null;
653
920
  this.submenuSettingId = null;
654
921
  },
655
- () => { this.submenu = null; this.submenuSettingId = null; },
922
+ () => {
923
+ this.submenu = null;
924
+ this.submenuSettingId = null;
925
+ },
656
926
  );
657
927
  break;
658
928
  }
@@ -675,7 +945,10 @@ class SettingsOverlay {
675
945
  this.submenu = null;
676
946
  this.submenuSettingId = null;
677
947
  },
678
- () => { this.submenu = null; this.submenuSettingId = null; },
948
+ () => {
949
+ this.submenu = null;
950
+ this.submenuSettingId = null;
951
+ },
679
952
  );
680
953
  break;
681
954
  }
@@ -692,7 +965,10 @@ class SettingsOverlay {
692
965
  this.submenu = null;
693
966
  this.submenuSettingId = null;
694
967
  },
695
- () => { this.submenu = null; this.submenuSettingId = null; },
968
+ () => {
969
+ this.submenu = null;
970
+ this.submenuSettingId = null;
971
+ },
696
972
  );
697
973
  break;
698
974
  }
@@ -706,15 +982,19 @@ class SettingsOverlay {
706
982
  this.submenu = null;
707
983
  this.submenuSettingId = null;
708
984
  },
709
- () => { this.submenu = null; this.submenuSettingId = null; },
985
+ () => {
986
+ this.submenu = null;
987
+ this.submenuSettingId = null;
988
+ },
710
989
  );
711
990
  break;
712
991
  }
713
992
  case "action": {
714
993
  if (!def.values?.length || !def.action) break;
715
- const actionCurrent = typeof this.changedValues.get(def.id) === "string"
716
- ? (this.changedValues.get(def.id) as string)
717
- : (currentValueFor(this.config, def.id) as string | undefined) ?? "";
994
+ const actionCurrent =
995
+ typeof this.changedValues.get(def.id) === "string"
996
+ ? (this.changedValues.get(def.id) as string)
997
+ : ((currentValueFor(this.config, def.id) as string | undefined) ?? "");
718
998
  this.submenuSettingId = def.id;
719
999
  this.submenu = new SelectSubmenu(
720
1000
  def.label,
@@ -728,7 +1008,10 @@ class SettingsOverlay {
728
1008
  this.submenu = null;
729
1009
  this.submenuSettingId = null;
730
1010
  },
731
- () => { this.submenu = null; this.submenuSettingId = null; },
1011
+ () => {
1012
+ this.submenu = null;
1013
+ this.submenuSettingId = null;
1014
+ },
732
1015
  );
733
1016
  break;
734
1017
  }
@@ -755,6 +1038,10 @@ export function createSettingsOverlay(
755
1038
  done: () => void,
756
1039
  onAction?: (action: string, value: unknown) => void,
757
1040
  ) {
758
- const overlay = new SettingsOverlay(config, theme, { onChange, onClose: done, onAction });
1041
+ const overlay = new SettingsOverlay(config, theme, {
1042
+ onChange,
1043
+ onClose: done,
1044
+ onAction,
1045
+ });
759
1046
  return { overlay, component: overlay };
760
1047
  }
@@ -1,6 +1,17 @@
1
1
  import type { CrewTheme, CrewThemeColor } from "./theme-adapter.ts";
2
2
 
3
- export type RunStatus = "queued" | "running" | "waiting" | "completed" | "failed" | "cancelled" | "stopped" | "blocked" | "stale" | "needs_attention" | (string & {});
3
+ export type RunStatus =
4
+ | "queued"
5
+ | "running"
6
+ | "waiting"
7
+ | "completed"
8
+ | "failed"
9
+ | "cancelled"
10
+ | "stopped"
11
+ | "blocked"
12
+ | "stale"
13
+ | "needs_attention"
14
+ | (string & {});
4
15
 
5
16
  export function colorForStatus(status: RunStatus): CrewThemeColor {
6
17
  switch (status) {
@@ -5,7 +5,7 @@
5
5
  * Falls back to plain text (theme.fg on every line) if the language is
6
6
  * unsupported or highlighting fails.
7
7
  */
8
- import { supportsLanguage, highlight } from "cli-highlight";
8
+ import { highlight, supportsLanguage } from "cli-highlight";
9
9
  import type { CrewTheme } from "./theme-adapter.ts";
10
10
  import { asCrewTheme } from "./theme-adapter.ts";
11
11