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.
- package/CHANGELOG.md +81 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21790 -0
- package/dist/index.mjs +83070 -0
- package/dist/index.mjs.map +7 -0
- package/docs/A +358 -0
- package/docs/M-A +357 -0
- package/docs/REVIEW-FINDINGS-2026-06 +357 -0
- package/docs/Y +357 -0
- package/docs/a +357 -0
- package/docs/aA +358 -0
- package/docs/archive/README.md +91 -0
- package/docs/patterns/command-agent-skill.md +1 -1
- package/docs/skills/REFERENCE.md +0 -17
- package/docs//303/242mmaAAA/303/242 +357 -0
- package/index.bundle.ts +25 -0
- package/index.ts +95 -4
- package/package.json +15 -4
- package/skills/iterative-audit/SKILL.md +0 -1
- package/skills/widget-rendering/SKILL.md +17 -0
- package/src/adapters/claude-adapter.ts +1 -3
- package/src/adapters/export-util.ts +16 -16
- package/src/adapters/index.ts +5 -5
- package/src/agents/agent-config.ts +20 -14
- package/src/agents/agent-serializer.ts +1 -1
- package/src/agents/discover-agents.ts +83 -39
- package/src/benchmark/benchmark-runner.ts +51 -51
- package/src/benchmark/feedback-loop.ts +1 -1
- package/src/config/config.ts +166 -590
- package/src/config/defaults.ts +28 -2
- package/src/config/drift-detector.ts +11 -14
- package/src/config/markers.ts +201 -203
- package/src/config/resilient-parser.ts +14 -6
- package/src/config/role-tools.ts +3 -3
- package/src/config/suggestions.ts +5 -12
- package/src/config/types.ts +9 -25
- package/src/errors.ts +151 -157
- package/src/extension/action-suggestions.ts +54 -9
- package/src/extension/async-notifier.ts +43 -13
- package/src/extension/autonomous-policy.ts +77 -37
- package/src/extension/command-completions.ts +9 -8
- package/src/extension/context-status-injection.ts +14 -12
- package/src/extension/crew-autocomplete.ts +8 -16
- package/src/extension/crew-cleanup.ts +2 -1
- package/src/extension/crew-shortcuts.ts +9 -6
- package/src/extension/cross-extension-rpc.ts +136 -42
- package/src/extension/help.ts +1 -1
- package/src/extension/import-index.ts +10 -5
- package/src/extension/knowledge-injection.ts +88 -15
- package/src/extension/management.ts +89 -349
- package/src/extension/message-renderers.ts +3 -4
- package/src/extension/notification-router.ts +22 -5
- package/src/extension/notification-sink.ts +6 -3
- package/src/extension/pi-api.ts +17 -8
- package/src/extension/plan-orchestrate.ts +8 -27
- package/src/extension/project-init.ts +21 -6
- package/src/extension/register.ts +329 -975
- package/src/extension/registration/artifact-cleanup.ts +9 -4
- package/src/extension/registration/command-utils.ts +5 -1
- package/src/extension/registration/commands.ts +806 -314
- package/src/extension/registration/compaction-guard.ts +15 -15
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +293 -0
- package/src/extension/registration/subagent-helpers.ts +29 -7
- package/src/extension/registration/subagent-tools.ts +253 -44
- package/src/extension/registration/team-tool.ts +19 -84
- package/src/extension/registration/ui.ts +168 -0
- package/src/extension/registration/viewers.ts +64 -24
- package/src/extension/result-watcher.ts +18 -7
- package/src/extension/run-bundle-schema.ts +21 -6
- package/src/extension/run-export.ts +15 -6
- package/src/extension/run-import.ts +64 -29
- package/src/extension/run-index.ts +28 -9
- package/src/extension/run-maintenance.ts +32 -12
- package/src/extension/session-summary.ts +1 -1
- package/src/extension/team-manager-command.ts +64 -7
- package/src/extension/team-onboard.ts +151 -150
- package/src/extension/team-recommendation.ts +121 -21
- package/src/extension/team-tool/anchor.ts +31 -64
- package/src/extension/team-tool/api.ts +929 -141
- package/src/extension/team-tool/auto-summarize.ts +14 -26
- package/src/extension/team-tool/cache-control.ts +1 -5
- package/src/extension/team-tool/cancel.ts +138 -38
- package/src/extension/team-tool/chain-dispatch.ts +5 -13
- package/src/extension/team-tool/chain-executor.ts +29 -51
- package/src/extension/team-tool/config-patch.ts +1 -1
- package/src/extension/team-tool/context.ts +40 -20
- package/src/extension/team-tool/destructive-gate.ts +10 -5
- package/src/extension/team-tool/doctor.ts +170 -51
- package/src/extension/team-tool/explain.ts +228 -214
- package/src/extension/team-tool/failure-patterns.ts +3 -9
- package/src/extension/team-tool/goal-wrap.ts +71 -29
- package/src/extension/team-tool/goal.ts +185 -35
- package/src/extension/team-tool/handle-schedule.ts +34 -15
- package/src/extension/team-tool/handle-settings.ts +94 -56
- package/src/extension/team-tool/health-monitor.ts +27 -108
- package/src/extension/team-tool/inspect.ts +42 -9
- package/src/extension/team-tool/intent-policy.ts +4 -1
- package/src/extension/team-tool/lifecycle-actions.ts +244 -48
- package/src/extension/team-tool/orchestrate.ts +7 -18
- package/src/extension/team-tool/parallel-dispatch.ts +51 -29
- package/src/extension/team-tool/plan.ts +29 -5
- package/src/extension/team-tool/respond.ts +49 -16
- package/src/extension/team-tool/run-not-found.ts +3 -8
- package/src/extension/team-tool/run.ts +80 -317
- package/src/extension/team-tool/status.ts +135 -43
- package/src/extension/team-tool/workflow-manage.ts +92 -25
- package/src/extension/team-tool-types.ts +8 -1
- package/src/extension/team-tool.ts +142 -551
- package/src/extension/validate-resources.ts +39 -8
- package/src/hooks/registry.ts +66 -17
- package/src/hooks/types.ts +1 -1
- package/src/i18n.ts +25 -11
- package/src/observability/correlation.ts +17 -3
- package/src/observability/event-bus.ts +51 -56
- package/src/observability/event-to-metric.ts +117 -15
- package/src/observability/exporters/otlp-exporter.ts +56 -17
- package/src/observability/exporters/prometheus-exporter.ts +1 -1
- package/src/observability/metric-registry.ts +16 -4
- package/src/observability/metric-retention.ts +8 -2
- package/src/observability/metric-sink.ts +11 -3
- package/src/observability/metrics-primitives.ts +42 -9
- package/src/plugins/plugin-define.ts +2 -2
- package/src/plugins/plugin-registry.ts +25 -25
- package/src/plugins/plugins/index.ts +1 -1
- package/src/plugins/plugins/nextjs.ts +16 -16
- package/src/plugins/plugins/vite.ts +7 -11
- package/src/plugins/plugins/vitest.ts +6 -11
- package/src/runtime/adaptive-plan.ts +225 -40
- package/src/runtime/agent-control.ts +58 -15
- package/src/runtime/agent-memory.ts +15 -9
- package/src/runtime/agent-observability.ts +10 -2
- package/src/runtime/anchor-manager.ts +27 -25
- package/src/runtime/async-marker.ts +7 -1
- package/src/runtime/async-runner.ts +27 -23
- package/src/runtime/auto-summarize.ts +7 -13
- package/src/runtime/background-runner.ts +189 -251
- package/src/runtime/batch-barrier.ts +18 -16
- package/src/runtime/cancellation-token.ts +16 -6
- package/src/runtime/cancellation.ts +46 -8
- package/src/runtime/capability-inventory.ts +6 -4
- package/src/runtime/chain-parser.ts +44 -11
- package/src/runtime/chain-runner.ts +63 -69
- package/src/runtime/checkpoint.ts +12 -56
- package/src/runtime/child-pi.ts +343 -78
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +71 -26
- package/src/runtime/compact-stages/index.ts +15 -5
- package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
- package/src/runtime/compact-stages/truncation-stage.ts +4 -1
- package/src/runtime/compaction-summary.ts +17 -10
- package/src/runtime/completion-guard.ts +33 -16
- package/src/runtime/crash-classification.ts +28 -7
- package/src/runtime/crash-recovery.ts +177 -37
- package/src/runtime/crew-agent-records.ts +145 -47
- package/src/runtime/crew-hooks.ts +9 -24
- package/src/runtime/cross-extension-rpc.ts +25 -23
- package/src/runtime/custom-tools/irc-tool.ts +43 -15
- package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
- package/src/runtime/delivery-coordinator.ts +34 -7
- package/src/runtime/delta-conflict.ts +9 -21
- package/src/runtime/deterministic-ast.ts +1 -1
- package/src/runtime/diagnostic-export.ts +53 -20
- package/src/runtime/direct-run.ts +12 -2
- package/src/runtime/dwf-state-store.ts +1 -1
- package/src/runtime/dynamic-workflow-context.ts +186 -58
- package/src/runtime/dynamic-workflow-runner.ts +42 -20
- package/src/runtime/effectiveness.ts +16 -8
- package/src/runtime/errors/crew-errors.ts +7 -11
- package/src/runtime/event-stream-bridge.ts +9 -3
- package/src/runtime/foreground-control.ts +54 -14
- package/src/runtime/foreground-watchdog.ts +9 -6
- package/src/runtime/goal-achievement.ts +27 -10
- package/src/runtime/goal-evaluator.ts +54 -19
- package/src/runtime/goal-loop-runner.ts +280 -99
- package/src/runtime/goal-state-store.ts +27 -17
- package/src/runtime/green-contract.ts +11 -2
- package/src/runtime/group-join.ts +64 -31
- package/src/runtime/handoff-manager.ts +37 -42
- package/src/runtime/heartbeat-gradient.ts +10 -2
- package/src/runtime/heartbeat-watcher.ts +32 -6
- package/src/runtime/hidden-handoff.ts +12 -30
- package/src/runtime/important-line-classifier.ts +12 -2
- package/src/runtime/iteration-hooks.ts +25 -15
- package/src/runtime/live-agent-control.ts +55 -7
- package/src/runtime/live-agent-manager.ts +130 -27
- package/src/runtime/live-control-realtime.ts +23 -3
- package/src/runtime/live-irc.ts +4 -1
- package/src/runtime/live-session-health.ts +12 -4
- package/src/runtime/live-session-runtime.ts +379 -117
- package/src/runtime/manifest-cache.ts +28 -12
- package/src/runtime/mcp-proxy.ts +8 -16
- package/src/runtime/metric-parser.ts +1 -5
- package/src/runtime/model-fallback.ts +55 -18
- package/src/runtime/model-resolver.ts +2 -6
- package/src/runtime/model-scope.ts +19 -3
- package/src/runtime/notebook-helpers.ts +60 -62
- package/src/runtime/orphan-worker-registry.ts +37 -26
- package/src/runtime/output-validator.ts +18 -3
- package/src/runtime/overflow-recovery.ts +5 -4
- package/src/runtime/parallel-research.ts +29 -5
- package/src/runtime/parallel-utils.ts +9 -11
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +12 -17
- package/src/runtime/per-write-validator.ts +1 -3
- package/src/runtime/phase-tracker.ts +342 -330
- package/src/runtime/pi-args.ts +26 -8
- package/src/runtime/pi-json-output.ts +1 -1
- package/src/runtime/pi-spawn.ts +30 -19
- package/src/runtime/pipeline-runner.ts +56 -55
- package/src/runtime/plan-templates.ts +5 -6
- package/src/runtime/policy-engine.ts +43 -7
- package/src/runtime/post-checks.ts +12 -4
- package/src/runtime/post-exit-stdio-guard.ts +2 -2
- package/src/runtime/process-lifecycle.ts +20 -10
- package/src/runtime/process-status.ts +16 -5
- package/src/runtime/progress-event-coalescer.ts +2 -1
- package/src/runtime/progress-tracker.ts +103 -103
- package/src/runtime/prose-compressor.ts +9 -11
- package/src/runtime/recovery-recipes.ts +118 -24
- package/src/runtime/replace.ts +25 -10
- package/src/runtime/resilient-edit.ts +10 -25
- package/src/runtime/result-extractor.ts +1 -2
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +26 -50
- package/src/runtime/role-permission.ts +6 -1
- package/src/runtime/run-coalesced-task-group.ts +256 -0
- package/src/runtime/run-drift.ts +14 -15
- package/src/runtime/run-tracker.ts +6 -28
- package/src/runtime/runtime-policy.ts +1 -6
- package/src/runtime/runtime-resolver.ts +80 -15
- package/src/runtime/scheduler.ts +47 -18
- package/src/runtime/semaphore.ts +5 -7
- package/src/runtime/sensitive-paths.ts +2 -1
- package/src/runtime/session-usage.ts +1 -1
- package/src/runtime/settings-store.ts +16 -12
- package/src/runtime/sidechain-output.ts +6 -2
- package/src/runtime/single-agent-compose.ts +1 -4
- package/src/runtime/skill-effectiveness.ts +29 -97
- package/src/runtime/skill-instructions.ts +40 -83
- package/src/runtime/stale-reconciler.ts +73 -197
- package/src/runtime/stream-preview.ts +1 -1
- package/src/runtime/streaming-output.ts +1 -1
- package/src/runtime/subagent-manager.ts +44 -169
- package/src/runtime/subprocess-tool-registry.ts +4 -1
- package/src/runtime/supervisor-contact.ts +10 -5
- package/src/runtime/task-display.ts +19 -5
- package/src/runtime/task-graph-scheduler.ts +95 -21
- package/src/runtime/task-graph.ts +5 -11
- package/src/runtime/task-health.ts +54 -47
- package/src/runtime/task-id.ts +11 -18
- package/src/runtime/task-output-context.ts +265 -81
- package/src/runtime/task-packet.ts +12 -20
- package/src/runtime/task-quality.ts +6 -14
- package/src/runtime/task-runner/context-retrieval.ts +4 -13
- package/src/runtime/task-runner/live-executor.ts +114 -36
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/progress.ts +50 -12
- package/src/runtime/task-runner/prompt-builder.ts +31 -7
- package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
- package/src/runtime/task-runner/result-utils.ts +3 -1
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +27 -8
- package/src/runtime/task-runner/state-helpers.ts +29 -8
- package/src/runtime/task-runner/tail-read.ts +2 -6
- package/src/runtime/task-runner.ts +180 -326
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +456 -974
- package/src/runtime/tool-output-pruner.ts +6 -9
- package/src/runtime/tool-progress.ts +11 -21
- package/src/runtime/verification-gates.ts +33 -24
- package/src/runtime/verification-integrity.ts +1 -4
- package/src/runtime/verification-worktree.ts +62 -12
- package/src/runtime/worker-heartbeat.ts +5 -1
- package/src/runtime/worker-startup.ts +29 -5
- package/src/runtime/workflow-state.ts +17 -9
- package/src/runtime/workspace-lock.ts +30 -35
- package/src/runtime/workspace-tree.ts +20 -32
- package/src/runtime/yield-handler.ts +43 -9
- package/src/runtime/zombie-scanner.ts +5 -4
- package/src/schema/config-schema.ts +266 -172
- package/src/schema/team-tool-schema.ts +29 -74
- package/src/schema/validation-types.ts +25 -17
- package/src/skills/discover-skills.ts +35 -10
- package/src/skills/skill-templates.ts +109 -27
- package/src/skills/validate.ts +26 -8
- package/src/state/active-run-registry.ts +87 -28
- package/src/state/artifact-store.ts +9 -5
- package/src/state/atomic-write-v2.ts +85 -63
- package/src/state/atomic-write.ts +105 -26
- package/src/state/blob-store.ts +47 -20
- package/src/state/contracts.ts +20 -5
- package/src/state/crew-init.ts +5 -22
- package/src/state/decision-ledger.ts +19 -73
- package/src/state/event-log-rotation.ts +41 -15
- package/src/state/event-log.ts +168 -53
- package/src/state/event-reconstructor.ts +11 -1
- package/src/state/gitignore-manager.ts +2 -8
- package/src/state/health-store.ts +57 -57
- package/src/state/hook-instinct-bridge.ts +1 -1
- package/src/state/hook-integrations.ts +1 -1
- package/src/state/instinct-store.ts +17 -5
- package/src/state/jsonl-writer.ts +1 -1
- package/src/state/locks.ts +23 -9
- package/src/state/mailbox.ts +151 -28
- package/src/state/observation-store.ts +20 -14
- package/src/state/run-cache.ts +142 -135
- package/src/state/run-graph.ts +6 -15
- package/src/state/run-metrics.ts +5 -18
- package/src/state/schedule.ts +15 -9
- package/src/state/state-store.ts +129 -45
- package/src/state/task-claims.ts +12 -2
- package/src/state/tiered-eval.ts +52 -43
- package/src/state/types-eval.ts +2 -2
- package/src/state/types.ts +24 -20
- package/src/state/usage.ts +20 -4
- package/src/state/worker-atomic-writer.ts +6 -3
- package/src/subagents/index.ts +2 -2
- package/src/teams/discover-teams.ts +21 -6
- package/src/tools/safe-bash-extension.ts +5 -6
- package/src/tools/safe-bash.ts +10 -11
- package/src/types/new-api-types.ts +6 -10
- package/src/ui/agent-management-overlay.ts +52 -40
- package/src/ui/card-colors.ts +13 -4
- package/src/ui/crew-footer.ts +8 -7
- package/src/ui/crew-select-list.ts +1 -1
- package/src/ui/dashboard-panes/agents-pane.ts +41 -25
- package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
- package/src/ui/dashboard-panes/capability-pane.ts +32 -15
- package/src/ui/dashboard-panes/health-pane.ts +2 -1
- package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
- package/src/ui/dashboard-panes/progress-pane.ts +12 -9
- package/src/ui/heartbeat-aggregator.ts +15 -4
- package/src/ui/keybinding-map.ts +40 -7
- package/src/ui/live-conversation-overlay.ts +36 -20
- package/src/ui/live-duration.ts +1 -4
- package/src/ui/live-run-sidebar.ts +88 -25
- package/src/ui/loaders.ts +2 -8
- package/src/ui/mascot.ts +20 -36
- package/src/ui/overlays/agent-picker-overlay.ts +11 -3
- package/src/ui/overlays/confirm-overlay.ts +4 -2
- package/src/ui/overlays/help-overlay.ts +25 -14
- package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
- package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
- package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
- package/src/ui/pi-ui-compat.ts +7 -7
- package/src/ui/powerbar-publisher.ts +120 -42
- package/src/ui/render-diff.ts +10 -3
- package/src/ui/render-scheduler.ts +12 -4
- package/src/ui/run-action-dispatcher.ts +81 -18
- package/src/ui/run-dashboard.ts +172 -76
- package/src/ui/run-event-bus.ts +59 -37
- package/src/ui/run-snapshot-cache.ts +276 -86
- package/src/ui/settings-overlay.ts +361 -74
- package/src/ui/status-colors.ts +12 -1
- package/src/ui/syntax-highlight.ts +1 -1
- package/src/ui/theme-adapter.ts +16 -14
- package/src/ui/theme-discovery.ts +13 -2
- package/src/ui/tool-progress-formatter.ts +7 -7
- package/src/ui/tool-render.ts +128 -56
- package/src/ui/tool-renderers/brief-mode.ts +45 -27
- package/src/ui/tool-renderers/index.ts +109 -43
- package/src/ui/transcript-cache.ts +32 -6
- package/src/ui/transcript-entries.ts +25 -23
- package/src/ui/transcript-viewer.ts +78 -29
- package/src/ui/widget/index.ts +99 -40
- package/src/ui/widget/widget-formatters.ts +13 -6
- package/src/ui/widget/widget-model.ts +19 -8
- package/src/ui/widget/widget-renderer.ts +23 -13
- package/src/ui/widget/widget-types.ts +1 -1
- package/src/utils/bm25-search.ts +199 -199
- package/src/utils/conflict-detect.ts +22 -21
- package/src/utils/env-filter.ts +14 -7
- package/src/utils/file-coalescer.ts +5 -1
- package/src/utils/fingerprint.ts +3 -6
- package/src/utils/frontmatter.ts +3 -1
- package/src/utils/fs-watch.ts +2 -6
- package/src/utils/gh-protocol.ts +119 -44
- package/src/utils/git.ts +13 -15
- package/src/utils/guards.ts +2 -5
- package/src/utils/ids.ts +9 -2
- package/src/utils/incremental-reader.ts +14 -3
- package/src/utils/internal-error.ts +2 -1
- package/src/utils/names.ts +12 -3
- package/src/utils/paths.ts +49 -5
- package/src/utils/project-detector.ts +2 -2
- package/src/utils/redaction.ts +29 -19
- package/src/utils/resolve-shell.ts +9 -7
- package/src/utils/run-watcher-registry.ts +19 -31
- package/src/utils/safe-paths.ts +45 -24
- package/src/utils/scan-cache.ts +9 -2
- package/src/utils/session-utils.ts +2 -4
- package/src/utils/sleep.ts +12 -5
- package/src/utils/sse-parser.ts +5 -17
- package/src/utils/visual.ts +52 -32
- package/src/workflows/discover-workflows.ts +41 -109
- package/src/workflows/intermediate-store.ts +5 -21
- package/src/workflows/preflight-validator.ts +6 -33
- package/src/workflows/topology-analyzer.ts +5 -21
- package/src/workflows/workflow-config.ts +7 -6
- package/src/worktree/branch-freshness.ts +66 -8
- package/src/worktree/cleanup.ts +130 -20
- package/src/worktree/worktree-manager.ts +212 -69
- package/skills/artifact-analysis-loop/SKILL.md +0 -303
- package/skills/detection-pipeline-design/SKILL.md +0 -286
- package/skills/hunting-investigation-loop/SKILL.md +0 -402
- package/skills/incident-playbook-construction/SKILL.md +0 -384
- package/skills/security-review/SKILL.md +0 -561
- package/skills/threat-hypothesis-framework/SKILL.md +0 -176
- package/skills/ui-render-performance/SKILL.md +0 -58
- /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
- /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
- /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
- /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
- /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
- /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
- /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
- /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
- /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
- /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
- /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
- /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
- /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
289
|
-
|
|
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": {
|
|
44
|
-
|
|
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({
|
|
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 =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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 =
|
|
110
|
-
|
|
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,
|
|
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
|
-
{
|
|
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
|
-
{
|
|
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): {
|
|
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 {
|
|
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, {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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({
|
|
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
|
-
{
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
{
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
{
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
{
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
{
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
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) => ({
|
|
439
|
+
variables: t.variables.map((v) => ({
|
|
440
|
+
name: v.name,
|
|
441
|
+
required: v.required,
|
|
442
|
+
})),
|
|
361
443
|
}));
|
|
362
444
|
}
|
|
363
445
|
|
package/src/skills/validate.ts
CHANGED
|
@@ -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 {
|
|
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 {
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|