pi-crew 0.9.16 → 0.9.18
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 +130 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21784 -0
- package/dist/index.mjs +83169 -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/migration/atomic-write-v2-migration.md +297 -0
- package/docs/patterns/command-agent-skill.md +1 -1
- package/docs/perf/performance-review-2026-07.md +287 -0
- 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 +303 -591
- 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 +149 -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 +39 -24
- 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 +344 -79
- 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 +187 -59
- 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 +13 -31
- 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 +10 -18
- 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 +2 -6
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +27 -51
- 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 +12 -19
- 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 +50 -14
- 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 +2 -7
- 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 +106 -27
- 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 +137 -47
- 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/terminal-status.ts +1 -3
- 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 +46 -29
- 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
|
@@ -43,7 +43,12 @@ export function validateWorkerOutput(role: string, output: string): OutputValida
|
|
|
43
43
|
|
|
44
44
|
// Empty output always fails
|
|
45
45
|
if (!output || !output.trim()) {
|
|
46
|
-
return {
|
|
46
|
+
return {
|
|
47
|
+
valid: false,
|
|
48
|
+
formatMatch: false,
|
|
49
|
+
structurePreserved: false,
|
|
50
|
+
issues: ["Empty output"],
|
|
51
|
+
};
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
// Check role-specific format
|
|
@@ -87,7 +92,12 @@ export function validateWorkerOutput(role: string, output: string): OutputValida
|
|
|
87
92
|
* Returns array of { file, line, severity, message } objects.
|
|
88
93
|
*/
|
|
89
94
|
export function parseReviewerFindings(output: string): Array<{ file: string; line: number; severity: string; message: string }> {
|
|
90
|
-
const findings: Array<{
|
|
95
|
+
const findings: Array<{
|
|
96
|
+
file: string;
|
|
97
|
+
line: number;
|
|
98
|
+
severity: string;
|
|
99
|
+
message: string;
|
|
100
|
+
}> = [];
|
|
91
101
|
const lines = output.split("\n");
|
|
92
102
|
|
|
93
103
|
const SEVERITY_MAP: Record<string, string> = {
|
|
@@ -118,7 +128,12 @@ export function parseReviewerFindings(output: string): Array<{ file: string; lin
|
|
|
118
128
|
* Returns array of { file, line, symbol, note } objects.
|
|
119
129
|
*/
|
|
120
130
|
export function parseExplorerResults(output: string): Array<{ file: string; line: number; symbol: string; note: string }> {
|
|
121
|
-
const results: Array<{
|
|
131
|
+
const results: Array<{
|
|
132
|
+
file: string;
|
|
133
|
+
line: number;
|
|
134
|
+
symbol: string;
|
|
135
|
+
note: string;
|
|
136
|
+
}> = [];
|
|
122
137
|
const lines = output.split("\n");
|
|
123
138
|
|
|
124
139
|
for (const line of lines) {
|
|
@@ -166,9 +166,10 @@ export class OverflowRecoveryTracker {
|
|
|
166
166
|
const existing = this.timers.get(key);
|
|
167
167
|
if (existing) clearTimeout(existing);
|
|
168
168
|
const current = this.states.get(key);
|
|
169
|
-
const timeoutMs =
|
|
170
|
-
|
|
171
|
-
|
|
169
|
+
const timeoutMs =
|
|
170
|
+
current?.phase === "recovered" || current?.phase === "failed" || current?.phase === "none"
|
|
171
|
+
? TERMINAL_STATE_TTL_MS
|
|
172
|
+
: PHASE_TIMEOUT_MS;
|
|
172
173
|
|
|
173
174
|
const timer = setTimeout(() => {
|
|
174
175
|
this.timers.delete(key);
|
|
@@ -202,4 +203,4 @@ export class OverflowRecoveryTracker {
|
|
|
202
203
|
timer.unref();
|
|
203
204
|
this.timers.set(key, timer);
|
|
204
205
|
}
|
|
205
|
-
}
|
|
206
|
+
}
|
|
@@ -5,7 +5,8 @@ import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.
|
|
|
5
5
|
export function sourcePiProjects(cwd: string): string[] {
|
|
6
6
|
const sourceDir = path.join(cwd, "Source");
|
|
7
7
|
try {
|
|
8
|
-
return fs
|
|
8
|
+
return fs
|
|
9
|
+
.readdirSync(sourceDir, { withFileTypes: true })
|
|
9
10
|
.filter((entry) => entry.isDirectory() && entry.name.startsWith("pi-"))
|
|
10
11
|
.map((entry) => `Source/${entry.name}`)
|
|
11
12
|
.sort();
|
|
@@ -30,15 +31,38 @@ export function expandParallelResearchWorkflow(workflow: WorkflowConfig, cwd: st
|
|
|
30
31
|
role: "explorer",
|
|
31
32
|
parallelGroup: "explore",
|
|
32
33
|
reads: paths,
|
|
33
|
-
task: [
|
|
34
|
+
task: [
|
|
35
|
+
`Explore this dynamic shard for: {goal}`,
|
|
36
|
+
"",
|
|
37
|
+
"Paths:",
|
|
38
|
+
...paths.map((item) => `- ${item}`),
|
|
39
|
+
"",
|
|
40
|
+
"Focus on purpose, architecture, runtime/UI patterns, package config, docs, and lessons for pi-crew.",
|
|
41
|
+
].join("\n"),
|
|
34
42
|
}));
|
|
35
43
|
return {
|
|
36
44
|
...workflow,
|
|
37
45
|
steps: [
|
|
38
|
-
{
|
|
46
|
+
{
|
|
47
|
+
id: "discover",
|
|
48
|
+
role: "explorer",
|
|
49
|
+
parallelGroup: "inventory",
|
|
50
|
+
task: `Quickly inventory and validate ${projects.length} pi-* projects for: {goal}\n\nProjects:\n${projects.map((item) => `- ${item}`).join("\n")}\n\nDo not block shard work; summarize routing notes only.`,
|
|
51
|
+
},
|
|
39
52
|
...exploreSteps,
|
|
40
|
-
{
|
|
41
|
-
|
|
53
|
+
{
|
|
54
|
+
id: "synthesize",
|
|
55
|
+
role: "analyst",
|
|
56
|
+
dependsOn: exploreSteps.map((step) => step.id),
|
|
57
|
+
task: "Synthesize all dynamic shard findings. Identify common patterns, gaps, and concrete recommendations. Use discover output if available, but prioritize completed shard outputs.",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "write",
|
|
61
|
+
role: "writer",
|
|
62
|
+
dependsOn: ["synthesize"],
|
|
63
|
+
output: "research-summary.md",
|
|
64
|
+
task: "Write a concise final summary with evidence, risks, and actionable next steps.",
|
|
65
|
+
},
|
|
42
66
|
],
|
|
43
67
|
};
|
|
44
68
|
}
|
|
@@ -76,9 +76,7 @@ async function mapConcurrentWithSignal<T, R>(
|
|
|
76
76
|
let aborted = false;
|
|
77
77
|
|
|
78
78
|
const abortController = new AbortController();
|
|
79
|
-
const workerSignal = signal
|
|
80
|
-
? AbortSignal.any([signal, abortController.signal])
|
|
81
|
-
: abortController.signal;
|
|
79
|
+
const workerSignal = signal ? AbortSignal.any([signal, abortController.signal]) : abortController.signal;
|
|
82
80
|
|
|
83
81
|
let rejectFirst: (error: unknown) => void;
|
|
84
82
|
const firstErrorPromise = new Promise<never>((_, reject) => {
|
|
@@ -140,14 +138,14 @@ export function aggregateParallelOutputs(
|
|
|
140
138
|
r.exitCode === -1
|
|
141
139
|
? "SKIPPED"
|
|
142
140
|
: r.exitCode == null || r.exitCode !== 0
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : ""}`
|
|
142
|
+
: r.error
|
|
143
|
+
? `WARNING: ${r.error}`
|
|
144
|
+
: !hasOutput && r.outputTargetPath && r.outputTargetExists === false
|
|
145
|
+
? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`
|
|
146
|
+
: !hasOutput && !r.outputTargetPath
|
|
147
|
+
? "EMPTY OUTPUT (no textual response returned)"
|
|
148
|
+
: "";
|
|
151
149
|
const body = status ? (hasOutput ? `${status}\n${r.output}` : status) : r.output;
|
|
152
150
|
return `${header}\n${body}`;
|
|
153
151
|
})
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* path-overlap.ts — write-path overlap detection for sequential scheduling (M5).
|
|
3
|
+
*
|
|
4
|
+
* Implements the writes-only path-intersection heuristic (per plan §11 decision
|
|
5
|
+
* #5). A pair of steps is considered overlapping ONLY when both declare the
|
|
6
|
+
* same write target (via `step.output`). Reads are intentionally ignored to
|
|
7
|
+
* avoid false positives (parallel reads are safe).
|
|
8
|
+
*
|
|
9
|
+
* Scope:
|
|
10
|
+
* - export `detectWriteOverlap(stepA, stepB): boolean` — pair check
|
|
11
|
+
* - export `selectNonOverlapping(steps, maxCount): WorkflowStep[]` — greedy
|
|
12
|
+
* packer that returns at most `maxCount` steps such that no two returned
|
|
13
|
+
* steps have overlapping write paths.
|
|
14
|
+
* - export `filterReadyByWriteOverlap(taskIds, tasks, workflow, maxCount)` —
|
|
15
|
+
* scheduler-side wrapper that translates TeamTaskState IDs to WorkflowSteps
|
|
16
|
+
* and applies the overlap filter.
|
|
17
|
+
*
|
|
18
|
+
* Default greedy strategy: preserve declaration order; first step always wins
|
|
19
|
+
* because (a) deterministic for tests, (b) declaration order typically reflects
|
|
20
|
+
* author intent, (c) a future PR can swap to priority-based when M5 defaults
|
|
21
|
+
* flip to `true` in production.
|
|
22
|
+
*
|
|
23
|
+
* Out of scope: reads overlap detection (decision #5); deferral cap (decision
|
|
24
|
+
* #6; M5 first ship treats repeated deferral as best-effort; cap warning logged
|
|
25
|
+
* but not enforced, since M5 default = false means production isn't gated).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { TeamTaskState } from "../state/types.ts";
|
|
29
|
+
import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.ts";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Extract the canonical write-target path of a step.
|
|
33
|
+
*
|
|
34
|
+
* Returns:
|
|
35
|
+
* - `step.output` if it is a non-empty string (the file path produced).
|
|
36
|
+
* - `undefined` otherwise (no declared write target → step has no write
|
|
37
|
+
* overlap risk).
|
|
38
|
+
*
|
|
39
|
+
* `step.output === false` means "explicitly no output"; treated as no write.
|
|
40
|
+
*/
|
|
41
|
+
function extractWritePath(step: WorkflowStep): string | undefined {
|
|
42
|
+
if (typeof step.output === "string" && step.output.length > 0) return step.output;
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Pairwise check: do stepA and stepB both write to the same path?
|
|
48
|
+
*
|
|
49
|
+
* O(1). Both steps must declare an `output` string; otherwise no overlap.
|
|
50
|
+
*
|
|
51
|
+
* Examples:
|
|
52
|
+
* detectWriteOverlap({output: 'a.md'}, {output: 'a.md'}) → true
|
|
53
|
+
* detectWriteOverlap({output: 'a.md'}, {output: 'b.md'}) → false
|
|
54
|
+
* detectWriteOverlap({output: 'a.md'}, {output: false}) → false
|
|
55
|
+
* detectWriteOverlap({output: 'a.md'}, {}) → false
|
|
56
|
+
*/
|
|
57
|
+
export function detectWriteOverlap(stepA: WorkflowStep, stepB: WorkflowStep): boolean {
|
|
58
|
+
const pathA = extractWritePath(stepA);
|
|
59
|
+
const pathB = extractWritePath(stepB);
|
|
60
|
+
if (!pathA || !pathB) return false;
|
|
61
|
+
return pathA === pathB;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Greedy packer: pick up to `maxCount` steps from `steps` such that no two
|
|
66
|
+
* PICKED steps have overlapping write paths.
|
|
67
|
+
*
|
|
68
|
+
* Algorithm:
|
|
69
|
+
* - Iterates over `steps` in order.
|
|
70
|
+
* - First step is always picked.
|
|
71
|
+
* - Each subsequent step is picked iff (a) it doesn't overlap with any
|
|
72
|
+
* already-picked step AND (b) we haven't reached `maxCount`.
|
|
73
|
+
*
|
|
74
|
+
* Returns the picked subset (a NEW array; does not mutate input).
|
|
75
|
+
*
|
|
76
|
+
* Used by scheduler when `limits.serializeOnPathOverlap = true`.
|
|
77
|
+
*/
|
|
78
|
+
export function selectNonOverlapping(steps: WorkflowStep[], maxCount: number): WorkflowStep[] {
|
|
79
|
+
const picked: WorkflowStep[] = [];
|
|
80
|
+
if (maxCount <= 0 || steps.length === 0) return picked;
|
|
81
|
+
for (const step of steps) {
|
|
82
|
+
if (picked.length >= maxCount) break;
|
|
83
|
+
let conflict = false;
|
|
84
|
+
for (const existing of picked) {
|
|
85
|
+
if (detectWriteOverlap(step, existing)) {
|
|
86
|
+
conflict = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!conflict) picked.push(step);
|
|
91
|
+
}
|
|
92
|
+
return picked;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Scheduler-side wrapper: given a list of ready task IDs (from the task-graph
|
|
97
|
+
* ready queue), filter them by write-path overlap using the workflow step
|
|
98
|
+
* definitions.
|
|
99
|
+
*
|
|
100
|
+
* Behavior:
|
|
101
|
+
* - Resolves each task ID → `TeamTaskState` → `WorkflowStep` via
|
|
102
|
+
* `task.stepId` matching `workflow.steps[i].id`.
|
|
103
|
+
* - Tasks whose step is missing from the workflow (e.g. ad-hoc tasks) are
|
|
104
|
+
* always included (treated as having no declared write path).
|
|
105
|
+
* - Returns the same array (identity-equal) when `enabled` is false, so
|
|
106
|
+
* callers can skip the filter cheaply.
|
|
107
|
+
*
|
|
108
|
+
* Used by the team-runner scheduler when `limits.serializeOnPathOverlap`
|
|
109
|
+
* is `true` (per plan §11 decision #6, default is `false` so this is a
|
|
110
|
+
* no-op in v0.9.17 unless the workflow author opts in).
|
|
111
|
+
*/
|
|
112
|
+
export function filterReadyByWriteOverlap(
|
|
113
|
+
readyTaskIds: string[],
|
|
114
|
+
tasks: TeamTaskState[],
|
|
115
|
+
workflow: WorkflowConfig,
|
|
116
|
+
maxCount: number,
|
|
117
|
+
enabled: boolean,
|
|
118
|
+
): string[] {
|
|
119
|
+
if (!enabled || maxCount <= 0 || readyTaskIds.length === 0) return readyTaskIds;
|
|
120
|
+
const taskById = new Map<string, TeamTaskState>(tasks.map((task) => [task.id, task]));
|
|
121
|
+
const stepById = new Map<string, WorkflowStep>(workflow.steps.map((step) => [step.id, step]));
|
|
122
|
+
const pickedSteps: WorkflowStep[] = [];
|
|
123
|
+
const pickedTaskIds: string[] = [];
|
|
124
|
+
for (const taskId of readyTaskIds) {
|
|
125
|
+
if (pickedTaskIds.length >= maxCount) break;
|
|
126
|
+
const task = taskById.get(taskId);
|
|
127
|
+
if (!task || !task.stepId) {
|
|
128
|
+
// No step reference: treat as no declared write path → never conflicts.
|
|
129
|
+
pickedTaskIds.push(taskId);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const step = stepById.get(task.stepId);
|
|
133
|
+
if (!step) {
|
|
134
|
+
pickedTaskIds.push(taskId);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
let conflict = false;
|
|
138
|
+
for (const existing of pickedSteps) {
|
|
139
|
+
if (detectWriteOverlap(step, existing)) {
|
|
140
|
+
conflict = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (!conflict) {
|
|
145
|
+
pickedTaskIds.push(taskId);
|
|
146
|
+
pickedSteps.push(step);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return pickedTaskIds;
|
|
150
|
+
}
|
package/src/runtime/peer-dep.ts
CHANGED
|
@@ -44,10 +44,7 @@ import { resolveNpmGlobalRoot } from "./pi-spawn.ts";
|
|
|
44
44
|
* The pi-coding-agent peer dependency package name(s) we can be loaded by.
|
|
45
45
|
* @earendil-works is the canonical scope; @mariozechner is the historical fork.
|
|
46
46
|
*/
|
|
47
|
-
export const PEER_DEP_NAMES = [
|
|
48
|
-
"@earendil-works/pi-coding-agent",
|
|
49
|
-
"@mariozechner/pi-coding-agent",
|
|
50
|
-
] as const;
|
|
47
|
+
export const PEER_DEP_NAMES = ["@earendil-works/pi-coding-agent", "@mariozechner/pi-coding-agent"] as const;
|
|
51
48
|
|
|
52
49
|
/**
|
|
53
50
|
* Env var a parent pi-crew process sets on spawned children so they can resolve
|
|
@@ -155,10 +152,7 @@ function extractEsmMain(pkg: unknown): string | undefined {
|
|
|
155
152
|
* container case) AND `<dir>/<pkg>` (handles a base that IS a node_modules
|
|
156
153
|
* dir, e.g. the output of `npm root -g`), then walk up to root.
|
|
157
154
|
*/
|
|
158
|
-
function findPackageDir(
|
|
159
|
-
start: string,
|
|
160
|
-
names: readonly string[],
|
|
161
|
-
): { dir: string; name: string } | undefined {
|
|
155
|
+
function findPackageDir(start: string, names: readonly string[]): { dir: string; name: string } | undefined {
|
|
162
156
|
let dir = path.resolve(start);
|
|
163
157
|
try {
|
|
164
158
|
if (fs.statSync(dir).isFile()) dir = path.dirname(dir);
|
|
@@ -168,10 +162,7 @@ function findPackageDir(
|
|
|
168
162
|
while (true) {
|
|
169
163
|
for (const name of names) {
|
|
170
164
|
const segs = name.split("/");
|
|
171
|
-
const candidates = [
|
|
172
|
-
path.join(dir, "node_modules", ...segs, "package.json"),
|
|
173
|
-
path.join(dir, ...segs, "package.json"),
|
|
174
|
-
];
|
|
165
|
+
const candidates = [path.join(dir, "node_modules", ...segs, "package.json"), path.join(dir, ...segs, "package.json")];
|
|
175
166
|
for (const pkgJson of candidates) {
|
|
176
167
|
try {
|
|
177
168
|
const pkg = JSON.parse(fs.readFileSync(pkgJson, "utf-8"));
|
|
@@ -194,14 +185,16 @@ function tryResolveFrom(base: string): ResolvedPeerDep | undefined {
|
|
|
194
185
|
const found = findPackageDir(base, PEER_DEP_NAMES);
|
|
195
186
|
if (!found) return undefined;
|
|
196
187
|
try {
|
|
197
|
-
const pkg = JSON.parse(
|
|
198
|
-
fs.readFileSync(path.join(found.dir, "package.json"), "utf-8"),
|
|
199
|
-
);
|
|
188
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(found.dir, "package.json"), "utf-8"));
|
|
200
189
|
const mainRel = extractEsmMain(pkg);
|
|
201
190
|
if (!mainRel) return undefined;
|
|
202
191
|
const mainAbs = path.resolve(found.dir, mainRel);
|
|
203
192
|
if (!fs.existsSync(mainAbs)) return undefined;
|
|
204
|
-
return {
|
|
193
|
+
return {
|
|
194
|
+
dir: found.dir,
|
|
195
|
+
name: found.name,
|
|
196
|
+
mainUrl: pathToFileURL(mainAbs).href,
|
|
197
|
+
};
|
|
205
198
|
} catch {
|
|
206
199
|
return undefined;
|
|
207
200
|
}
|
|
@@ -261,7 +254,9 @@ function buildMissingMessage(): string {
|
|
|
261
254
|
`This usually means pi-crew and pi are installed in separate node_modules trees\n` +
|
|
262
255
|
`(e.g. pi-crew under ~/.pi/agent/npm/ but pi under an nvm/Volta/fnm global scope).\n` +
|
|
263
256
|
`Resolution bases tried:\n` +
|
|
264
|
-
peerDepResolutionBases()
|
|
257
|
+
peerDepResolutionBases()
|
|
258
|
+
.map((b) => ` - ${b}`)
|
|
259
|
+
.join("\n") +
|
|
265
260
|
`\nFix: install pi-crew in the SAME scope as pi, e.g.\n` +
|
|
266
261
|
` npm install -g @earendil-works/pi-crew\n` +
|
|
267
262
|
`or set the env var ${PEER_DEP_DIR_ENV}=<path to the pi-coding-agent package dir>.`
|
|
@@ -68,9 +68,7 @@ export function validateJson(content: string, _filePath: string): ValidationResu
|
|
|
68
68
|
* ONLY zero-cost synchronous validators belong here. Process-spawning
|
|
69
69
|
* validators must be registered via a future opt-in path (see module doc).
|
|
70
70
|
*/
|
|
71
|
-
const DEFAULT_VALIDATORS: ReadonlyMap<string, PerWriteValidator> = new Map([
|
|
72
|
-
["json", validateJson],
|
|
73
|
-
]);
|
|
71
|
+
const DEFAULT_VALIDATORS: ReadonlyMap<string, PerWriteValidator> = new Map([["json", validateJson]]);
|
|
74
72
|
|
|
75
73
|
// ─────────────────────────────────────────────────────────────────────────
|
|
76
74
|
// Dedup cache (path → last-validated content). Bounded; small.
|