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
package/src/config/defaults.ts
CHANGED
|
@@ -30,7 +30,7 @@ export const DEFAULT_CHILD_PI: Readonly<{
|
|
|
30
30
|
|
|
31
31
|
export const DEFAULT_LIVE_SESSION = {
|
|
32
32
|
/** Maximum wall-clock time for a single live-session task before abort (ms). */
|
|
33
|
-
responseTimeoutMs: 10 * 60_000,
|
|
33
|
+
responseTimeoutMs: 10 * 60_000, // 10 minutes - increased from 5min for complex verification
|
|
34
34
|
/** Maximum yield reminder attempts before accepting no-yield. */
|
|
35
35
|
maxYieldRetries: 3,
|
|
36
36
|
/** Polling interval for session idle check during yield enforcement (ms). */
|
|
@@ -56,13 +56,39 @@ export const DEFAULT_CONCURRENCY = {
|
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
export const DEFAULT_EVENT_LOG = {
|
|
59
|
-
terminalEventTypes: [
|
|
59
|
+
terminalEventTypes: [
|
|
60
|
+
"run.blocked",
|
|
61
|
+
"run.completed",
|
|
62
|
+
"run.failed",
|
|
63
|
+
"run.cancelled",
|
|
64
|
+
"task.completed",
|
|
65
|
+
"task.failed",
|
|
66
|
+
"task.skipped",
|
|
67
|
+
"task.cancelled",
|
|
68
|
+
"task.needs_attention",
|
|
69
|
+
],
|
|
60
70
|
};
|
|
61
71
|
|
|
62
72
|
export const DEFAULT_ARTIFACT_CLEANUP = {
|
|
63
73
|
maxAgeDays: 7,
|
|
64
74
|
};
|
|
65
75
|
|
|
76
|
+
/** Round 25 (L6): thresholds for task-output-context inline-bytes budget.
|
|
77
|
+
* Single source of truth for the per-dep cap, total dep cap, and tee
|
|
78
|
+
* recovery multiplier. Previously hardcoded in
|
|
79
|
+
* src/runtime/task-output-context.ts; moved here so that operators can
|
|
80
|
+
* override them via config (Phase 5 ship) without touching runtime code. */
|
|
81
|
+
export const DEFAULT_OUTPUT_CONTEXT = {
|
|
82
|
+
/** Per-dep inline-bytes cap (chars). Set by plan §5 L4 (96 KB total). */
|
|
83
|
+
maxResultInlineBytes: 32_000,
|
|
84
|
+
/** Total inline-bytes budget across all deps for one downstream worker. */
|
|
85
|
+
maxTotalDepInlineBytes: 96_000,
|
|
86
|
+
/** Tee recovery threshold: only when file > TEE_THRESHOLD_MULTIPLIER *
|
|
87
|
+
* maxResultInlineBytes, the truncated inline is also written to a
|
|
88
|
+
* tee file (R2: 1.25x = 40 KB). */
|
|
89
|
+
teeThresholdMultiplier: 1.25,
|
|
90
|
+
} as const;
|
|
91
|
+
|
|
66
92
|
export const DEFAULT_PATHS = {
|
|
67
93
|
state: {
|
|
68
94
|
runsSubdir: "state/runs",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { PiTeamsConfig } from "./config.ts";
|
|
2
1
|
import { PiTeamsConfigSchema } from "../schema/config-schema.ts";
|
|
2
|
+
import type { PiTeamsConfig } from "./config.ts";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A single drift finding between discovered resources and config expectations.
|
|
@@ -53,9 +53,7 @@ export interface ConfigReferences {
|
|
|
53
53
|
/**
|
|
54
54
|
* Known top-level config keys allowed by the schema.
|
|
55
55
|
*/
|
|
56
|
-
const SCHEMA_KEYS: ReadonlySet<string> = new Set<string>(
|
|
57
|
-
Object.keys(PiTeamsConfigSchema.properties ?? {}),
|
|
58
|
-
);
|
|
56
|
+
const SCHEMA_KEYS: ReadonlySet<string> = new Set<string>(Object.keys(PiTeamsConfigSchema.properties ?? {}));
|
|
59
57
|
|
|
60
58
|
/**
|
|
61
59
|
* Extract all agent, team, and workflow names referenced in a raw config object.
|
|
@@ -70,13 +68,15 @@ function extractConfigReferences(config: Record<string, unknown>): ConfigReferen
|
|
|
70
68
|
const workflows = new Set<string>();
|
|
71
69
|
|
|
72
70
|
// agents.overrides keys are explicit agent references
|
|
73
|
-
const agentsObj =
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (agentsObj) {
|
|
77
|
-
const overrides = typeof agentsObj.overrides === "object" && agentsObj.overrides !== null && !Array.isArray(agentsObj.overrides)
|
|
78
|
-
? agentsObj.overrides as Record<string, unknown>
|
|
71
|
+
const agentsObj =
|
|
72
|
+
typeof config.agents === "object" && config.agents !== null && !Array.isArray(config.agents)
|
|
73
|
+
? (config.agents as Record<string, unknown>)
|
|
79
74
|
: undefined;
|
|
75
|
+
if (agentsObj) {
|
|
76
|
+
const overrides =
|
|
77
|
+
typeof agentsObj.overrides === "object" && agentsObj.overrides !== null && !Array.isArray(agentsObj.overrides)
|
|
78
|
+
? (agentsObj.overrides as Record<string, unknown>)
|
|
79
|
+
: undefined;
|
|
80
80
|
if (overrides) {
|
|
81
81
|
for (const name of Object.keys(overrides)) {
|
|
82
82
|
agents.add(name);
|
|
@@ -103,10 +103,7 @@ function extractConfigReferences(config: Record<string, unknown>): ConfigReferen
|
|
|
103
103
|
* For teams/workflows: the config currently doesn't have explicit team/workflow references,
|
|
104
104
|
* so missing/extra checks rely solely on what resources reference each other.
|
|
105
105
|
*/
|
|
106
|
-
export function detectDrift(
|
|
107
|
-
discovered: DiscoveredResources,
|
|
108
|
-
config: PiTeamsConfig,
|
|
109
|
-
): DriftReport {
|
|
106
|
+
export function detectDrift(discovered: DiscoveredResources, config: PiTeamsConfig): DriftReport {
|
|
110
107
|
const items: DriftItem[] = [];
|
|
111
108
|
|
|
112
109
|
const configRaw = config as Record<string, unknown>;
|
package/src/config/markers.ts
CHANGED
|
@@ -10,21 +10,21 @@ export const MARKER_END = "<!-- PI-CREW:GUIDANCE:END -->";
|
|
|
10
10
|
|
|
11
11
|
/** A single guidance section to inject between markers. */
|
|
12
12
|
export interface GuidanceBlock {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Unique identifier for this guidance section (e.g. "team-tool-usage").
|
|
15
|
+
* Must match `/^[a-zA-Z0-9_-]+$/`.
|
|
16
|
+
*/
|
|
17
|
+
id: string;
|
|
18
|
+
/**
|
|
19
|
+
* Markdown content to inject.
|
|
20
|
+
*
|
|
21
|
+
* **WARNING:** Content must be from trusted sources only. Guidance blocks
|
|
22
|
+
* are injected into markdown files that AI agents read. Untrusted content
|
|
23
|
+
* could contain prompt-injection payloads that manipulate agent behavior.
|
|
24
|
+
*/
|
|
25
|
+
content: string;
|
|
26
|
+
/** Higher priority = appears first. Default 0. */
|
|
27
|
+
priority?: number;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/** Regex for valid guidance block IDs. */
|
|
@@ -45,26 +45,26 @@ const VALID_BLOCK_ID = /^[a-zA-Z0-9_-]+$/;
|
|
|
45
45
|
* prevent all bypasses (e.g., base64, ROT13, semantic tricks).
|
|
46
46
|
*/
|
|
47
47
|
export function sanitizeGuidanceContent(content: string): string {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
let sanitized = content;
|
|
49
|
+
// Strip zero-width and invisible Unicode characters (potential bypass vectors)
|
|
50
|
+
sanitized = sanitized.replace(/[\u200B-\u200F\u2028-\u202F\u2060-\u206F\uFEFF]/g, "");
|
|
51
|
+
// Strip HTML comments (potential instruction hiding)
|
|
52
|
+
sanitized = sanitized.replace(/<!--[\s\S]*?-->/g, "");
|
|
53
|
+
// Strip lines that look like system directives (e.g. "SYSTEM:", "INSTRUCTION:", "IGNORE PREVIOUS")
|
|
54
|
+
sanitized = sanitized.replace(/^\s*(?:SYSTEM|INSTRUCTION|IGNORE\s+PREVIOUS|OVERRIDE)\s*:.*$/gim, "");
|
|
55
|
+
// Collapse multiple blank lines left by removals
|
|
56
|
+
sanitized = sanitized.replace(/\n{3,}/g, "\n\n");
|
|
57
|
+
return sanitized.trim();
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/** Result of an injection or removal operation. */
|
|
61
61
|
export interface InjectionResult {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
path: string;
|
|
63
|
+
modified: boolean;
|
|
64
|
+
/** Block IDs that were added or updated. */
|
|
65
|
+
added: string[];
|
|
66
|
+
/** Block IDs that were removed (content was empty). */
|
|
67
|
+
removed: string[];
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/**
|
|
@@ -75,10 +75,8 @@ export interface InjectionResult {
|
|
|
75
75
|
* parse individual blocks back out.
|
|
76
76
|
*/
|
|
77
77
|
function renderBlocks(blocks: GuidanceBlock[]): string {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
.map((block) => `<!-- PI-CREW:BLOCK:${block.id} -->\n${block.content}\n<!-- PI-CREW:/BLOCK:${block.id} -->`)
|
|
81
|
-
.join("\n\n");
|
|
78
|
+
const sorted = [...blocks].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
79
|
+
return sorted.map((block) => `<!-- PI-CREW:BLOCK:${block.id} -->\n${block.content}\n<!-- PI-CREW:/BLOCK:${block.id} -->`).join("\n\n");
|
|
82
80
|
}
|
|
83
81
|
|
|
84
82
|
/**
|
|
@@ -101,8 +99,7 @@ export function extractGuidanceIds(content: string): string[] {
|
|
|
101
99
|
*/
|
|
102
100
|
function parseExistingBlocks(inner: string): Map<string, GuidanceBlock> {
|
|
103
101
|
const map = new Map<string, GuidanceBlock>();
|
|
104
|
-
const regex =
|
|
105
|
-
/<!-- PI-CREW:BLOCK:([^\s>]+) -->\n([\s\S]*?)<!-- PI-CREW:\/BLOCK:\1 -->/g;
|
|
102
|
+
const regex = /<!-- PI-CREW:BLOCK:([^\s>]+) -->\n([\s\S]*?)<!-- PI-CREW:\/BLOCK:\1 -->/g;
|
|
106
103
|
let match: RegExpExecArray | null = regex.exec(inner);
|
|
107
104
|
while (match !== null) {
|
|
108
105
|
const id = match[1];
|
|
@@ -119,8 +116,8 @@ function parseExistingBlocks(inner: string): Map<string, GuidanceBlock> {
|
|
|
119
116
|
* Build the full marker section string.
|
|
120
117
|
*/
|
|
121
118
|
function buildMarkerSection(blocks: GuidanceBlock[]): string {
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
const body = renderBlocks(blocks);
|
|
120
|
+
return `\n${MARKER_START}\n${body}\n${MARKER_END}\n`;
|
|
124
121
|
}
|
|
125
122
|
|
|
126
123
|
/**
|
|
@@ -137,87 +134,88 @@ function buildMarkerSection(blocks: GuidanceBlock[]): string {
|
|
|
137
134
|
* - Content outside the markers is preserved exactly.
|
|
138
135
|
*/
|
|
139
136
|
export function injectGuidance(filePath: string, blocks: GuidanceBlock[]): InjectionResult {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
137
|
+
// Validate block IDs before processing (M1)
|
|
138
|
+
for (const block of blocks) {
|
|
139
|
+
if (!VALID_BLOCK_ID.test(block.id)) {
|
|
140
|
+
throw new Error(`Invalid guidance block ID '${block.id}': must match /^[a-zA-Z0-9_-]+$/.`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const original = fs.existsSync(filePath) ? fs.readFileSync(filePath, "utf-8") : "";
|
|
145
|
+
|
|
146
|
+
const startIdx = original.indexOf(MARKER_START);
|
|
147
|
+
const endIdx = original.indexOf(MARKER_END);
|
|
148
|
+
|
|
149
|
+
let existingBlocks = new Map<string, GuidanceBlock>();
|
|
150
|
+
let before = original;
|
|
151
|
+
let after = "";
|
|
152
|
+
|
|
153
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
154
|
+
// Extract content around markers
|
|
155
|
+
before = original.slice(0, startIdx);
|
|
156
|
+
after = original.slice(endIdx + MARKER_END.length);
|
|
157
|
+
|
|
158
|
+
const inner = original.slice(startIdx + MARKER_START.length, endIdx);
|
|
159
|
+
existingBlocks = parseExistingBlocks(inner);
|
|
160
|
+
} else {
|
|
161
|
+
// No markers: whole file is "before"
|
|
162
|
+
before = original;
|
|
163
|
+
after = "";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Merge: apply new blocks on top of existing
|
|
167
|
+
const added: string[] = [];
|
|
168
|
+
const removed: string[] = [];
|
|
169
|
+
|
|
170
|
+
for (const block of blocks) {
|
|
171
|
+
if (block.content === "") {
|
|
172
|
+
// Empty content signals removal
|
|
173
|
+
if (existingBlocks.has(block.id)) {
|
|
174
|
+
existingBlocks.delete(block.id);
|
|
175
|
+
removed.push(block.id);
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
existingBlocks.set(block.id, {
|
|
179
|
+
...block,
|
|
180
|
+
content: sanitizeGuidanceContent(block.content),
|
|
181
|
+
});
|
|
182
|
+
added.push(block.id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const merged = [...existingBlocks.values()];
|
|
187
|
+
|
|
188
|
+
// Nothing to write if there are no blocks and no markers existed
|
|
189
|
+
const hadMarkers = startIdx !== -1;
|
|
190
|
+
if (merged.length === 0 && !hadMarkers) {
|
|
191
|
+
return { path: filePath, modified: false, added: [], removed: [] };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// If all blocks removed and markers existed, remove the whole section
|
|
195
|
+
if (merged.length === 0 && hadMarkers) {
|
|
196
|
+
const newContent = trimTrailingNewlines(before) + after;
|
|
197
|
+
if (newContent === original) {
|
|
198
|
+
return { path: filePath, modified: false, added: [], removed };
|
|
199
|
+
}
|
|
200
|
+
fs.writeFileSync(filePath, newContent, "utf-8");
|
|
201
|
+
return { path: filePath, modified: true, added: [], removed };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const section = buildMarkerSection(merged);
|
|
205
|
+
const newContent = trimTrailingNewlines(before) + section + trimLeadingNewlines(after);
|
|
206
|
+
|
|
207
|
+
if (newContent === original) {
|
|
208
|
+
return { path: filePath, modified: false, added: [], removed };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Ensure parent directory exists
|
|
212
|
+
const dir = filePath.substring(0, Math.max(filePath.lastIndexOf("/"), filePath.lastIndexOf("\\")));
|
|
213
|
+
if (dir && !fs.existsSync(dir)) {
|
|
214
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
fs.writeFileSync(filePath, newContent, "utf-8");
|
|
218
|
+
return { path: filePath, modified: true, added, removed };
|
|
221
219
|
}
|
|
222
220
|
|
|
223
221
|
/**
|
|
@@ -229,58 +227,58 @@ export function injectGuidance(filePath: string, blocks: GuidanceBlock[]): Injec
|
|
|
229
227
|
* - Content outside markers is preserved exactly.
|
|
230
228
|
*/
|
|
231
229
|
export function removeGuidance(filePath: string, ids?: string[]): InjectionResult {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
230
|
+
if (!fs.existsSync(filePath)) {
|
|
231
|
+
return { path: filePath, modified: false, added: [], removed: [] };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const original = fs.readFileSync(filePath, "utf-8");
|
|
235
|
+
const startIdx = original.indexOf(MARKER_START);
|
|
236
|
+
const endIdx = original.indexOf(MARKER_END);
|
|
237
|
+
|
|
238
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
|
|
239
|
+
return { path: filePath, modified: false, added: [], removed: [] };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const before = original.slice(0, startIdx);
|
|
243
|
+
const after = original.slice(endIdx + MARKER_END.length);
|
|
244
|
+
const inner = original.slice(startIdx + MARKER_START.length, endIdx);
|
|
245
|
+
|
|
246
|
+
if (ids === undefined) {
|
|
247
|
+
// Remove entire marker section
|
|
248
|
+
const allIds = extractGuidanceIds(inner);
|
|
249
|
+
const newContent = trimTrailingNewlines(before) + after;
|
|
250
|
+
if (newContent === original) {
|
|
251
|
+
return { path: filePath, modified: false, added: [], removed: [] };
|
|
252
|
+
}
|
|
253
|
+
fs.writeFileSync(filePath, newContent, "utf-8");
|
|
254
|
+
return { path: filePath, modified: true, added: [], removed: allIds };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Remove specific block IDs
|
|
258
|
+
const existingBlocks = parseExistingBlocks(inner);
|
|
259
|
+
const removed: string[] = [];
|
|
260
|
+
for (const id of ids) {
|
|
261
|
+
if (existingBlocks.delete(id)) {
|
|
262
|
+
removed.push(id);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (removed.length === 0) {
|
|
267
|
+
return { path: filePath, modified: false, added: [], removed: [] };
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const merged = [...existingBlocks.values()];
|
|
271
|
+
|
|
272
|
+
if (merged.length === 0) {
|
|
273
|
+
const newContent = trimTrailingNewlines(before) + after;
|
|
274
|
+
fs.writeFileSync(filePath, newContent, "utf-8");
|
|
275
|
+
return { path: filePath, modified: true, added: [], removed };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const section = buildMarkerSection(merged);
|
|
279
|
+
const newContent = trimTrailingNewlines(before) + section + trimLeadingNewlines(after);
|
|
280
|
+
fs.writeFileSync(filePath, newContent, "utf-8");
|
|
281
|
+
return { path: filePath, modified: true, added: [], removed };
|
|
284
282
|
}
|
|
285
283
|
|
|
286
284
|
/**
|
|
@@ -290,43 +288,43 @@ export function removeGuidance(filePath: string, ids?: string[]): InjectionResul
|
|
|
290
288
|
* @param version — current pi-crew package version for version-aware updates
|
|
291
289
|
*/
|
|
292
290
|
export function standardGuidanceBlocks(version: string): GuidanceBlock[] {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
291
|
+
return [
|
|
292
|
+
{
|
|
293
|
+
id: "pi-crew-overview",
|
|
294
|
+
priority: 10,
|
|
295
|
+
content: [
|
|
296
|
+
"## pi-crew",
|
|
297
|
+
"",
|
|
298
|
+
`> Managed by **pi-crew v${version}** — do not edit this section manually.`,
|
|
299
|
+
"",
|
|
300
|
+
"pi-crew is a Pi extension for coordinated AI agent teams, workflows,",
|
|
301
|
+
"worktrees, and async task orchestration.",
|
|
302
|
+
].join("\n"),
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
id: "pi-crew-commands",
|
|
306
|
+
priority: 5,
|
|
307
|
+
content: [
|
|
308
|
+
"### Quick Commands",
|
|
309
|
+
"",
|
|
310
|
+
"| Command | Description |",
|
|
311
|
+
"|---|---|",
|
|
312
|
+
"| `team action='init'` | Initialize pi-crew for this project |",
|
|
313
|
+
"| `team action='run'` | Start a team run |",
|
|
314
|
+
"| `team action='status'` | Check run status |",
|
|
315
|
+
"| `team action='list'` | List available teams/agents/workflows |",
|
|
316
|
+
"| `team action='recommend'` | Get team/workflow recommendations |",
|
|
317
|
+
].join("\n"),
|
|
318
|
+
},
|
|
319
|
+
];
|
|
322
320
|
}
|
|
323
321
|
|
|
324
322
|
/** Remove trailing newlines from a string, ensuring at most one trailing newline. */
|
|
325
323
|
function trimTrailingNewlines(s: string): string {
|
|
326
|
-
|
|
324
|
+
return s.replace(/\n+$/, "");
|
|
327
325
|
}
|
|
328
326
|
|
|
329
327
|
/** Remove leading newlines from a string. */
|
|
330
328
|
function trimLeadingNewlines(s: string): string {
|
|
331
|
-
|
|
329
|
+
return s.replace(/^\n+/, "");
|
|
332
330
|
}
|
|
@@ -2,14 +2,11 @@
|
|
|
2
2
|
* Per-field resilient config parsing — continues on error, collects all field-level issues.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { PiTeamsConfigSchema } from "../schema/config-schema.ts";
|
|
6
5
|
import type { TSchema } from "@sinclair/typebox";
|
|
7
6
|
import { Value } from "@sinclair/typebox/value";
|
|
7
|
+
import { PiTeamsConfigSchema } from "../schema/config-schema.ts";
|
|
8
|
+
import { type PiTeamsConfig, parseConfig } from "./config.ts";
|
|
8
9
|
import { suggestConfigKey } from "./suggestions.ts";
|
|
9
|
-
import {
|
|
10
|
-
parseConfig,
|
|
11
|
-
type PiTeamsConfig,
|
|
12
|
-
} from "./config.ts";
|
|
13
10
|
|
|
14
11
|
// ---------------------------------------------------------------------------
|
|
15
12
|
// Types
|
|
@@ -56,7 +53,18 @@ export function parseConfigResilient(raw: unknown): ResilientParseResult {
|
|
|
56
53
|
const warnings: string[] = [];
|
|
57
54
|
|
|
58
55
|
if (!isObject(raw)) {
|
|
59
|
-
return {
|
|
56
|
+
return {
|
|
57
|
+
config: {},
|
|
58
|
+
errors: [
|
|
59
|
+
{
|
|
60
|
+
field: "config",
|
|
61
|
+
message: "config must be an object",
|
|
62
|
+
value: raw,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
warnings,
|
|
66
|
+
valid: false,
|
|
67
|
+
};
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
// Collect unknown top-level keys with suggestions
|
package/src/config/role-tools.ts
CHANGED
|
@@ -102,7 +102,7 @@ export function getToolConfig(role: string): RoleToolConfig {
|
|
|
102
102
|
*/
|
|
103
103
|
export function hasToolRestrictions(role: string): boolean {
|
|
104
104
|
const config = getToolConfig(role);
|
|
105
|
-
return
|
|
105
|
+
return config.tools !== undefined || config.excludeTools !== undefined;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/**
|
|
@@ -110,6 +110,6 @@ export function hasToolRestrictions(role: string): boolean {
|
|
|
110
110
|
*/
|
|
111
111
|
export function getRestrictedRoles(): string[] {
|
|
112
112
|
return Object.entries(ROLE_TOOL_CONFIGS)
|
|
113
|
-
.filter(([, config]) =>
|
|
113
|
+
.filter(([, config]) => config.tools !== undefined || config.excludeTools !== undefined)
|
|
114
114
|
.map(([role]) => role);
|
|
115
|
-
}
|
|
115
|
+
}
|