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
@@ -83,37 +83,23 @@ export const TeamToolParams = Type.Object({
83
83
  ),
84
84
  ),
85
85
  resource: Type.Optional(
86
- Type.Union(
87
- [
88
- Type.Literal("agent"),
89
- Type.Literal("team"),
90
- Type.Literal("workflow"),
91
- ],
92
- {
93
- description:
94
- "Resource kind for get/create/update/delete/list. Defaults to all for list.",
95
- },
96
- ),
86
+ Type.Union([Type.Literal("agent"), Type.Literal("team"), Type.Literal("workflow")], {
87
+ description: "Resource kind for get/create/update/delete/list. Defaults to all for list.",
88
+ }),
97
89
  ),
98
90
  team: Type.Optional(
99
91
  Type.String({
100
92
  description: "Team name, e.g. default or implementation.",
101
93
  }),
102
94
  ),
103
- workflow: Type.Optional(
104
- Type.String({ description: "Workflow name, e.g. default or review." }),
105
- ),
95
+ workflow: Type.Optional(Type.String({ description: "Workflow name, e.g. default or review." })),
106
96
  role: Type.Optional(
107
97
  Type.String({
108
98
  description: "Role name to run directly within a team.",
109
99
  }),
110
100
  ),
111
- agent: Type.Optional(
112
- Type.String({ description: "Agent name to inspect or run directly." }),
113
- ),
114
- goal: Type.Optional(
115
- Type.String({ description: "High-level objective for a team run." }),
116
- ),
101
+ agent: Type.Optional(Type.String({ description: "Agent name to inspect or run directly." })),
102
+ goal: Type.Optional(Type.String({ description: "High-level objective for a team run." })),
117
103
  chain: Type.Optional(
118
104
  Type.String({
119
105
  description:
@@ -127,7 +113,8 @@ export const TeamToolParams = Type.Object({
127
113
  ),
128
114
  singleAgent: Type.Optional(
129
115
  Type.Boolean({
130
- description: "When true (with action=plan), compose a single-agent sequential prompt for the workflow instead of a multi-agent plan. Cliff-resilient mode.",
116
+ description:
117
+ "When true (with action=plan), compose a single-agent sequential prompt for the workflow instead of a multi-agent plan. Cliff-resilient mode.",
131
118
  }),
132
119
  ),
133
120
  runId: Type.Optional(
@@ -136,12 +123,8 @@ export const TeamToolParams = Type.Object({
136
123
  pattern: "^[A-Za-z0-9_-]+$",
137
124
  }),
138
125
  ),
139
- taskId: Type.Optional(
140
- Type.String({ description: "Task ID for respond action." }),
141
- ),
142
- message: Type.Optional(
143
- Type.String({ description: "Message for respond action." }),
144
- ),
126
+ taskId: Type.Optional(Type.String({ description: "Task ID for respond action." })),
127
+ message: Type.Optional(Type.String({ description: "Message for respond action." })),
145
128
  async: Type.Optional(
146
129
  Type.Boolean({
147
130
  description: "Run in background when execution support is enabled.",
@@ -156,8 +139,7 @@ export const TeamToolParams = Type.Object({
156
139
  ),
157
140
  workspaceMode: Type.Optional(
158
141
  Type.Union([Type.Literal("single"), Type.Literal("worktree")], {
159
- description:
160
- "Workspace isolation mode. Worktree mode is planned after MVP.",
142
+ description: "Workspace isolation mode. Worktree mode is planned after MVP.",
161
143
  }),
162
144
  ),
163
145
  context: Type.Optional(
@@ -165,22 +147,13 @@ export const TeamToolParams = Type.Object({
165
147
  description: "Child context mode for workers.",
166
148
  }),
167
149
  ),
168
- cwd: Type.Optional(
169
- Type.String({ description: "Working directory override." }),
170
- ),
171
- model: Type.Optional(
172
- Type.String({ description: "Model override for direct runs." }),
173
- ),
150
+ cwd: Type.Optional(Type.String({ description: "Working directory override." })),
151
+ model: Type.Optional(Type.String({ description: "Model override for direct runs." })),
174
152
  skill: Type.Optional(SkillOverride),
175
153
  scope: Type.Optional(
176
- Type.Union(
177
- [
178
- Type.Literal("user"),
179
- Type.Literal("project"),
180
- Type.Literal("both"),
181
- ],
182
- { description: "Resource scope for discovery or management." },
183
- ),
154
+ Type.Union([Type.Literal("user"), Type.Literal("project"), Type.Literal("both")], {
155
+ description: "Resource scope for discovery or management.",
156
+ }),
184
157
  ),
185
158
  config: Type.Optional(FreeformConfig),
186
159
  dryRun: Type.Optional(
@@ -195,8 +168,7 @@ export const TeamToolParams = Type.Object({
195
168
  ),
196
169
  force: Type.Optional(
197
170
  Type.Boolean({
198
- description:
199
- "Override reference checks for destructive management actions.",
171
+ description: "Override reference checks for destructive management actions.",
200
172
  }),
201
173
  ),
202
174
  keep: Type.Optional(
@@ -207,22 +179,16 @@ export const TeamToolParams = Type.Object({
207
179
  ),
208
180
  updateReferences: Type.Optional(
209
181
  Type.Boolean({
210
- description:
211
- "When renaming agents or workflows, update team references in the same project/user scope.",
182
+ description: "When renaming agents or workflows, update team references in the same project/user scope.",
212
183
  }),
213
184
  ),
214
185
  replyTo: Type.Optional(
215
186
  Type.String({
216
- description:
217
- "ID of the original mailbox message this is a reply to.",
187
+ description: "ID of the original mailbox message this is a reply to.",
218
188
  }),
219
189
  ),
220
- replyFrom: Type.Optional(
221
- Type.String({ description: "Task ID sending the reply." }),
222
- ),
223
- replyDeadline: Type.Optional(
224
- Type.Integer({ description: "Ms epoch deadline for a reply." }),
225
- ),
190
+ replyFrom: Type.Optional(Type.String({ description: "Task ID sending the reply." })),
191
+ replyDeadline: Type.Optional(Type.Integer({ description: "Ms epoch deadline for a reply." })),
226
192
  planPath: Type.Optional(
227
193
  Type.String({
228
194
  description: "Path to a markdown plan document for orchestration.",
@@ -230,26 +196,22 @@ export const TeamToolParams = Type.Object({
230
196
  ),
231
197
  cron: Type.Optional(
232
198
  Type.String({
233
- description:
234
- "Cron expression for recurring scheduled runs (e.g., '0 9 * * MON').",
199
+ description: "Cron expression for recurring scheduled runs (e.g., '0 9 * * MON').",
235
200
  }),
236
201
  ),
237
202
  interval: Type.Optional(
238
203
  Type.Number({
239
- description:
240
- "Interval in milliseconds between recurring scheduled runs.",
204
+ description: "Interval in milliseconds between recurring scheduled runs.",
241
205
  }),
242
206
  ),
243
207
  once: Type.Optional(
244
208
  Type.Union([Type.String(), Type.Number()], {
245
- description:
246
- "ISO timestamp or epoch ms for a one-time scheduled run.",
209
+ description: "ISO timestamp or epoch ms for a one-time scheduled run.",
247
210
  }),
248
211
  ),
249
212
  excludeContextBash: Type.Optional(
250
213
  Type.Boolean({
251
- description:
252
- "Mark certain bash commands as excludeFromContext to reduce context tokens (default: false).",
214
+ description: "Mark certain bash commands as excludeFromContext to reduce context tokens (default: false).",
253
215
  }),
254
216
  ),
255
217
  // Budget tracking options
@@ -283,17 +245,10 @@ export const TeamToolParams = Type.Object({
283
245
  }),
284
246
  ),
285
247
  runKind: Type.Optional(
286
- Type.Union(
287
- [
288
- Type.Literal("team-run"),
289
- Type.Literal("goal-loop"),
290
- Type.Literal("dynamic-workflow"),
291
- ],
292
- {
293
- description:
294
- "Background dispatch discriminator. Default \"team-run\" runs the normal executeTeamRun workflow; \"goal-loop\" (P0/P1) and \"dynamic-workflow\" (P2/P3) dispatch to their respective background runners. Absent = \"team-run\" for backward compatibility.",
295
- },
296
- ),
248
+ Type.Union([Type.Literal("team-run"), Type.Literal("goal-loop"), Type.Literal("dynamic-workflow")], {
249
+ description:
250
+ 'Background dispatch discriminator. Default "team-run" runs the normal executeTeamRun workflow; "goal-loop" (P0/P1) and "dynamic-workflow" (P2/P3) dispatch to their respective background runners. Absent = "team-run" for backward compatibility.',
251
+ }),
297
252
  ),
298
253
  tokenBudget: Type.Optional(
299
254
  Type.Number({
@@ -40,15 +40,18 @@ const DEFAULT_MODE: ValidationMode = "strict";
40
40
 
41
41
  /** Recommended range constraints (not enforced by schema, but advisory). */
42
42
  const RECOMMENDED_RANGES: Record<string, { max: number; label: string }> = {
43
- "limits.maxConcurrentWorkers": { max: 8, label: "maxConcurrentWorkers > 8 may degrade performance" },
44
- "limits.maxTaskDepth": { max: 4, label: "maxTaskDepth > 4 may cause excessive nesting" },
43
+ "limits.maxConcurrentWorkers": {
44
+ max: 8,
45
+ label: "maxConcurrentWorkers > 8 may degrade performance",
46
+ },
47
+ "limits.maxTaskDepth": {
48
+ max: 4,
49
+ label: "maxTaskDepth > 4 may cause excessive nesting",
50
+ },
45
51
  };
46
52
 
47
53
  /** Recommended optional top-level keys that should be explicitly set. */
48
- const RECOMMENDED_OPTIONAL_KEYS: readonly string[] = [
49
- "limits",
50
- "runtime",
51
- ];
54
+ const RECOMMENDED_OPTIONAL_KEYS: readonly string[] = ["limits", "runtime"];
52
55
 
53
56
  // ---------------------------------------------------------------------------
54
57
  // Helpers
@@ -83,7 +86,11 @@ export function validateWithSeverity(raw: unknown, mode: ValidationMode = DEFAUL
83
86
  const findings: ValidationFinding[] = [];
84
87
 
85
88
  if (!isObject(raw)) {
86
- findings.push({ severity: "ERROR", message: "config must be an object", field: "config" });
89
+ findings.push({
90
+ severity: "ERROR",
91
+ message: "config must be an object",
92
+ field: "config",
93
+ });
87
94
  return { findings, mode, hasErrors: true, hasWarnings: false };
88
95
  }
89
96
 
@@ -92,22 +99,23 @@ export function validateWithSeverity(raw: unknown, mode: ValidationMode = DEFAUL
92
99
  if (!isValid) {
93
100
  for (const error of Value.Errors(PiTeamsConfigSchema, raw)) {
94
101
  const errRecord = error as unknown as Record<string, unknown>;
95
- const rawPath = typeof errRecord.path === "string"
96
- ? errRecord.path
97
- : typeof errRecord.instancePath === "string"
98
- ? errRecord.instancePath
99
- : "config";
102
+ const rawPath =
103
+ typeof errRecord.path === "string"
104
+ ? errRecord.path
105
+ : typeof errRecord.instancePath === "string"
106
+ ? errRecord.instancePath
107
+ : "config";
100
108
 
101
- const message = typeof errRecord.message === "string"
102
- ? errRecord.message
103
- : "invalid value";
109
+ const message = typeof errRecord.message === "string" ? errRecord.message : "invalid value";
104
110
 
105
111
  const field = rawPath.replace(/^\//, "").replace(/\//g, ".") || undefined;
106
112
 
107
113
  // Additional properties / unknown keys are less severe in lenient mode.
108
114
  // @sinclair/typebox uses keyword=undefined with message="Unexpected property" for these.
109
- const isUnknownProperty = errRecord.keyword === "additionalProperties" ||
110
- message === "Unexpected property" || message.startsWith("Unexpected property");
115
+ const isUnknownProperty =
116
+ errRecord.keyword === "additionalProperties" ||
117
+ message === "Unexpected property" ||
118
+ message.startsWith("Unexpected property");
111
119
  if (isUnknownProperty) {
112
120
  findings.push({
113
121
  severity: mode === "lenient" ? "WARNING" : "ERROR",
@@ -7,7 +7,7 @@ import { fileURLToPath } from "node:url";
7
7
  import { getAgentDir } from "../runtime/peer-dep.ts";
8
8
  import { logInternalError } from "../utils/internal-error.ts";
9
9
  import { isSafePathId, resolveContainedPath, resolveRealContainedPath } from "../utils/safe-paths.ts";
10
- import { parseSkillFrontmatter, validateSkillFrontmatter, type SkillValidationError } from "./validate.ts";
10
+ import { parseSkillFrontmatter, type SkillValidationError, validateSkillFrontmatter } from "./validate.ts";
11
11
 
12
12
  const PACKAGE_SKILLS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "skills");
13
13
 
@@ -46,10 +46,16 @@ export interface SkillDescriptor {
46
46
  function listSkillDirs(cwd: string): Array<{ root: string; source: SkillDescriptor["source"] }> {
47
47
  return [
48
48
  { root: path.resolve(cwd, ".pi", "skills"), source: "project-pi" },
49
- { root: path.resolve(cwd, ".agents", "skills"), source: "project-agents" },
49
+ {
50
+ root: path.resolve(cwd, ".agents", "skills"),
51
+ source: "project-agents",
52
+ },
50
53
  { root: path.resolve(cwd, "skills"), source: "project" },
51
54
  { root: path.join(getAgentDir(), "skills"), source: "user-pi" },
52
- { root: path.join(os.homedir(), ".agents", "skills"), source: "user-agents" },
55
+ {
56
+ root: path.join(os.homedir(), ".agents", "skills"),
57
+ source: "user-agents",
58
+ },
53
59
  { root: path.join(os.homedir(), ".pi", "skills"), source: "user-pi" },
54
60
  { root: PACKAGE_SKILLS_DIR, source: "package" },
55
61
  ];
@@ -72,11 +78,17 @@ export function getLastDiscoveryDiagnostics(): SkillValidationError[] {
72
78
  * SKILL.md files that pre-date the validator (we record a diagnostic in that
73
79
  * case but still return the description we could salvage).
74
80
  */
75
- function readDescription(content: string): { description: string; parseError: string | null } {
81
+ function readDescription(content: string): {
82
+ description: string;
83
+ parseError: string | null;
84
+ } {
76
85
  const parsed = parseSkillFrontmatter(content);
77
86
  if (parsed.ok) {
78
87
  const d = parsed.data.description;
79
- return { description: typeof d === "string" ? d : "", parseError: null };
88
+ return {
89
+ description: typeof d === "string" ? d : "",
90
+ parseError: null,
91
+ };
80
92
  }
81
93
  // YAML parse failed — fall back to legacy line-prefix match so we don't
82
94
  // regress existing skills whose frontmatter the old parser could read.
@@ -96,22 +108,30 @@ export function discoverSkills(cwd: string): SkillDescriptor[] {
96
108
  for (const dir of listSkillDirs(cwd)) {
97
109
  if (!fs.existsSync(dir.root)) continue;
98
110
  try {
99
- for (const entry of fs.readdirSync(dir.root, { withFileTypes: true })) {
111
+ for (const entry of fs.readdirSync(dir.root, {
112
+ withFileTypes: true,
113
+ })) {
100
114
  if (!entry.isDirectory()) continue;
101
115
  if (!isSafePathId(entry.name)) continue;
102
116
  const skillDirPath = path.join(dir.root, entry.name);
103
117
  try {
104
118
  if (fs.lstatSync(skillDirPath).isSymbolicLink()) continue;
105
- } catch { continue; }
119
+ } catch {
120
+ continue;
121
+ }
106
122
  const skillMdRelative = path.join(entry.name, "SKILL.md");
107
123
  let skillMdPath: string;
108
124
  try {
109
125
  skillMdPath = resolveContainedPath(dir.root, skillMdRelative);
110
- } catch { continue; }
126
+ } catch {
127
+ continue;
128
+ }
111
129
  if (!fs.existsSync(skillMdPath)) continue;
112
130
  try {
113
131
  if (fs.lstatSync(skillMdPath).isSymbolicLink()) continue;
114
- } catch { continue; }
132
+ } catch {
133
+ continue;
134
+ }
115
135
  let description = "";
116
136
  try {
117
137
  let readPath = skillMdPath;
@@ -136,7 +156,12 @@ export function discoverSkills(cwd: string): SkillDescriptor[] {
136
156
  } catch (error) {
137
157
  logInternalError("discoverSkills.readSkill", error, `skill=${entry.name}`);
138
158
  }
139
- results.push({ name: entry.name, description, source: dir.source, path: skillMdPath });
159
+ results.push({
160
+ name: entry.name,
161
+ description,
162
+ source: dir.source,
163
+ path: skillMdPath,
164
+ });
140
165
  }
141
166
  } catch (error) {
142
167
  logInternalError("discoverSkills.readdir", error, `root=${dir.root}`);
@@ -56,9 +56,25 @@ const CODE_REVIEW_TEMPLATE: SkillTemplate = {
56
56
  description: "Systematic code review skill with configurable language and focus areas.",
57
57
  category: "quality",
58
58
  variables: [
59
- { name: "language", description: "Primary programming language of the codebase", required: true, options: ["TypeScript", "JavaScript", "Python", "Rust", "Go", "Java", "C#", "Other"] },
60
- { name: "focusAreas", description: "Comma-separated list of review focus areas", required: false, defaultValue: "correctness, readability, performance" },
61
- { name: "severityThreshold", description: "Minimum severity level to report", required: false, defaultValue: "warning", options: ["info", "warning", "error", "critical"] },
59
+ {
60
+ name: "language",
61
+ description: "Primary programming language of the codebase",
62
+ required: true,
63
+ options: ["TypeScript", "JavaScript", "Python", "Rust", "Go", "Java", "C#", "Other"],
64
+ },
65
+ {
66
+ name: "focusAreas",
67
+ description: "Comma-separated list of review focus areas",
68
+ required: false,
69
+ defaultValue: "correctness, readability, performance",
70
+ },
71
+ {
72
+ name: "severityThreshold",
73
+ description: "Minimum severity level to report",
74
+ required: false,
75
+ defaultValue: "warning",
76
+ options: ["info", "warning", "error", "critical"],
77
+ },
62
78
  ],
63
79
  body: [
64
80
  "---",
@@ -99,9 +115,25 @@ const TESTING_TEMPLATE: SkillTemplate = {
99
115
  description: "Test writing skill with configurable framework and coverage targets.",
100
116
  category: "testing",
101
117
  variables: [
102
- { name: "framework", description: "Testing framework to use", required: true, options: ["vitest", "jest", "mocha", "pytest", "go-test", "cargo-test", "Other"] },
103
- { name: "coverageTarget", description: "Target coverage percentage", required: false, defaultValue: "80" },
104
- { name: "testType", description: "Primary type of tests to write", required: false, defaultValue: "unit", options: ["unit", "integration", "e2e", "all"] },
118
+ {
119
+ name: "framework",
120
+ description: "Testing framework to use",
121
+ required: true,
122
+ options: ["vitest", "jest", "mocha", "pytest", "go-test", "cargo-test", "Other"],
123
+ },
124
+ {
125
+ name: "coverageTarget",
126
+ description: "Target coverage percentage",
127
+ required: false,
128
+ defaultValue: "80",
129
+ },
130
+ {
131
+ name: "testType",
132
+ description: "Primary type of tests to write",
133
+ required: false,
134
+ defaultValue: "unit",
135
+ options: ["unit", "integration", "e2e", "all"],
136
+ },
105
137
  ],
106
138
  body: [
107
139
  "---",
@@ -137,9 +169,25 @@ const SECURITY_AUDIT_TEMPLATE: SkillTemplate = {
137
169
  description: "Security review skill with configurable scope and severity thresholds.",
138
170
  category: "security",
139
171
  variables: [
140
- { name: "scope", description: "Audit scope: what parts of the codebase to examine", required: true, options: ["full-codebase", "dependencies", "api-surface", "auth-flows", "input-handling"] },
141
- { name: "severityThreshold", description: "Minimum severity to report", required: false, defaultValue: "medium", options: ["low", "medium", "high", "critical"] },
142
- { name: "complianceFramework", description: "Compliance framework to check against (if applicable)", required: false, defaultValue: "OWASP Top 10" },
172
+ {
173
+ name: "scope",
174
+ description: "Audit scope: what parts of the codebase to examine",
175
+ required: true,
176
+ options: ["full-codebase", "dependencies", "api-surface", "auth-flows", "input-handling"],
177
+ },
178
+ {
179
+ name: "severityThreshold",
180
+ description: "Minimum severity to report",
181
+ required: false,
182
+ defaultValue: "medium",
183
+ options: ["low", "medium", "high", "critical"],
184
+ },
185
+ {
186
+ name: "complianceFramework",
187
+ description: "Compliance framework to check against (if applicable)",
188
+ required: false,
189
+ defaultValue: "OWASP Top 10",
190
+ },
143
191
  ],
144
192
  body: [
145
193
  "---",
@@ -179,9 +227,30 @@ const REFACTOR_TEMPLATE: SkillTemplate = {
179
227
  description: "Refactoring skill with configurable scope and constraints.",
180
228
  category: "maintenance",
181
229
  variables: [
182
- { name: "scope", description: "What to refactor: file, module, or architectural pattern", required: true },
183
- { name: "constraints", description: "Constraints to respect during refactoring", required: false, defaultValue: "preserve public API, maintain backward compatibility" },
184
- { name: "goal", description: "Primary refactoring goal", required: false, defaultValue: "improve readability and reduce complexity", options: ["improve readability and reduce complexity", "improve performance", "reduce coupling", "enable extensibility", "simplify testability"] },
230
+ {
231
+ name: "scope",
232
+ description: "What to refactor: file, module, or architectural pattern",
233
+ required: true,
234
+ },
235
+ {
236
+ name: "constraints",
237
+ description: "Constraints to respect during refactoring",
238
+ required: false,
239
+ defaultValue: "preserve public API, maintain backward compatibility",
240
+ },
241
+ {
242
+ name: "goal",
243
+ description: "Primary refactoring goal",
244
+ required: false,
245
+ defaultValue: "improve readability and reduce complexity",
246
+ options: [
247
+ "improve readability and reduce complexity",
248
+ "improve performance",
249
+ "reduce coupling",
250
+ "enable extensibility",
251
+ "simplify testability",
252
+ ],
253
+ },
185
254
  ],
186
255
  body: [
187
256
  "---",
@@ -223,9 +292,26 @@ const DOCUMENTATION_TEMPLATE: SkillTemplate = {
223
292
  description: "Documentation writing skill with configurable format and audience.",
224
293
  category: "documentation",
225
294
  variables: [
226
- { name: "format", description: "Documentation format to produce", required: true, options: ["markdown", "jsdoc", "rustdoc", "godoc", "pydoc", "openapi"] },
227
- { name: "audience", description: "Target audience for the documentation", required: false, defaultValue: "developers", options: ["developers", "operators", "end-users", "contributors", "architects"] },
228
- { name: "detailLevel", description: "Level of detail", required: false, defaultValue: "standard", options: ["brief", "standard", "comprehensive"] },
295
+ {
296
+ name: "format",
297
+ description: "Documentation format to produce",
298
+ required: true,
299
+ options: ["markdown", "jsdoc", "rustdoc", "godoc", "pydoc", "openapi"],
300
+ },
301
+ {
302
+ name: "audience",
303
+ description: "Target audience for the documentation",
304
+ required: false,
305
+ defaultValue: "developers",
306
+ options: ["developers", "operators", "end-users", "contributors", "architects"],
307
+ },
308
+ {
309
+ name: "detailLevel",
310
+ description: "Level of detail",
311
+ required: false,
312
+ defaultValue: "standard",
313
+ options: ["brief", "standard", "comprehensive"],
314
+ },
229
315
  ],
230
316
  body: [
231
317
  "---",
@@ -280,9 +366,7 @@ export function getBuiltinTemplates(): SkillTemplate[] {
280
366
  */
281
367
  export function findTemplate(idOrName: string): SkillTemplate | undefined {
282
368
  const lower = idOrName.toLowerCase();
283
- return BUILTIN_TEMPLATES.find(
284
- (t) => t.id.toLowerCase() === lower || t.name.toLowerCase() === lower,
285
- );
369
+ return BUILTIN_TEMPLATES.find((t) => t.id.toLowerCase() === lower || t.name.toLowerCase() === lower);
286
370
  }
287
371
 
288
372
  /**
@@ -296,10 +380,7 @@ export function findTemplate(idOrName: string): SkillTemplate | undefined {
296
380
  * @param variables User-supplied variable values.
297
381
  * @returns An object with the suggested filename and rendered content.
298
382
  */
299
- export function instantiateTemplate(
300
- template: SkillTemplate,
301
- variables: Record<string, string>,
302
- ): InstantiatedSkill {
383
+ export function instantiateTemplate(template: SkillTemplate, variables: Record<string, string>): InstantiatedSkill {
303
384
  // Validate and resolve all variable values
304
385
  const resolved: Record<string, string> = {};
305
386
 
@@ -308,9 +389,7 @@ export function instantiateTemplate(
308
389
 
309
390
  if (value === undefined || value === "") {
310
391
  if (variable.required) {
311
- throw new Error(
312
- `Missing required variable "${variable.name}" for template "${template.id}" (${variable.description}).`,
313
- );
392
+ throw new Error(`Missing required variable "${variable.name}" for template "${template.id}" (${variable.description}).`);
314
393
  }
315
394
  resolved[variable.name] = variable.defaultValue ?? "";
316
395
  continue;
@@ -320,7 +399,7 @@ export function instantiateTemplate(
320
399
  if (variable.options !== undefined && !variable.options.includes(value)) {
321
400
  throw new Error(
322
401
  `Invalid value "${value}" for variable "${variable.name}" in template "${template.id}". ` +
323
- `Allowed values: ${variable.options.join(", ")}.`,
402
+ `Allowed values: ${variable.options.join(", ")}.`,
324
403
  );
325
404
  }
326
405
 
@@ -357,7 +436,10 @@ export function listTemplates(): Array<{
357
436
  name: t.name,
358
437
  description: t.description,
359
438
  category: t.category,
360
- variables: t.variables.map((v) => ({ name: v.name, required: v.required })),
439
+ variables: t.variables.map((v) => ({
440
+ name: v.name,
441
+ required: v.required,
442
+ })),
361
443
  }));
362
444
  }
363
445
 
@@ -100,20 +100,24 @@ export interface ValidationResult {
100
100
  * surface as `{ ok: false }` rather than throwing — discovery must remain
101
101
  * exception-safe.
102
102
  */
103
- export function parseSkillFrontmatter(
104
- content: string,
105
- ): { ok: true; data: Record<string, unknown> } | { ok: false; error: string } {
103
+ export function parseSkillFrontmatter(content: string): { ok: true; data: Record<string, unknown> } | { ok: false; error: string } {
106
104
  const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
107
105
  if (!match) return { ok: true, data: {} };
108
106
  try {
109
107
  const parsed = yaml.parse(match[1]);
110
108
  if (parsed === null || parsed === undefined) return { ok: true, data: {} };
111
109
  if (typeof parsed !== "object" || Array.isArray(parsed)) {
112
- return { ok: false, error: "Frontmatter must be a YAML mapping, not a scalar or list." };
110
+ return {
111
+ ok: false,
112
+ error: "Frontmatter must be a YAML mapping, not a scalar or list.",
113
+ };
113
114
  }
114
115
  return { ok: true, data: parsed as Record<string, unknown> };
115
116
  } catch (e) {
116
- return { ok: false, error: `YAML parse error: ${(e as Error).message}` };
117
+ return {
118
+ ok: false,
119
+ error: `YAML parse error: ${(e as Error).message}`,
120
+ };
117
121
  }
118
122
  }
119
123
 
@@ -173,7 +177,13 @@ export function validateSkillFrontmatter(skillDir: string): ValidationResult {
173
177
  const nameRaw = data.name;
174
178
  let resolvedName = derivedName;
175
179
  if (nameRaw === undefined || nameRaw === null) {
176
- errors.push(warn(skillDir, "name", `Frontmatter 'name' missing; using directory name "${derivedName}" as fallback. Add explicit 'name' to silence this.`));
180
+ errors.push(
181
+ warn(
182
+ skillDir,
183
+ "name",
184
+ `Frontmatter 'name' missing; using directory name "${derivedName}" as fallback. Add explicit 'name' to silence this.`,
185
+ ),
186
+ );
177
187
  } else if (typeof nameRaw !== "string") {
178
188
  errors.push(hard(skillDir, "name", `'name' must be a string, got ${typeof nameRaw}.`));
179
189
  } else if (nameRaw.length === 0) {
@@ -227,7 +237,13 @@ export function validateSkillFrontmatter(skillDir: string): ValidationResult {
227
237
  // ── OPTIONAL: version
228
238
  if (data.version !== undefined) {
229
239
  if (typeof data.version !== "string" || !VERSION_REGEX.test(data.version)) {
230
- errors.push(hard(skillDir, "version", `'version' must be a semver string (e.g. "1.2.3" or "1.2.3-beta.1"); got "${String(data.version)}".`));
240
+ errors.push(
241
+ hard(
242
+ skillDir,
243
+ "version",
244
+ `'version' must be a semver string (e.g. "1.2.3" or "1.2.3-beta.1"); got "${String(data.version)}".`,
245
+ ),
246
+ );
231
247
  }
232
248
  }
233
249
 
@@ -239,7 +255,9 @@ export function validateSkillFrontmatter(skillDir: string): ValidationResult {
239
255
  // ── UNKNOWN PROPS: SOFT warn (HYBRID policy)
240
256
  for (const key of Object.keys(data)) {
241
257
  if (!ALLOWED_SKILL_PROPS.has(key)) {
242
- errors.push(warn(skillDir, `<unknown-prop:${key}>`, `Unknown property '${key}' is not in the whitelist; keeping for forward-compat.`));
258
+ errors.push(
259
+ warn(skillDir, `<unknown-prop:${key}>`, `Unknown property '${key}' is not in the whitelist; keeping for forward-compat.`),
260
+ );
243
261
  }
244
262
  }
245
263