pi-crew 0.9.51 → 0.9.53
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 +53 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2090 -1638
- package/dist/index.mjs +18057 -17119
- package/docs/actions-reference.md +431 -1
- package/index.ts +39 -10
- package/package.json +19 -9
- package/schema.json +41 -0
- package/scripts/check-bundle-size.mjs +38 -0
- package/scripts/test-runner.mjs +11 -1
- package/dist/index.mjs.map +0 -7
- package/docs/FEATURE_INTAKE.md +0 -126
- package/docs/HARNESS.md +0 -87
- package/docs/HARNESS_BACKLOG.md +0 -89
- package/docs/PROJECT_REVIEW.md +0 -270
- package/docs/PROJECT_REVIEW_FIXES.md +0 -342
- package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
- package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
- package/docs/REVIEW-FINDINGS-2026-06 +0 -357
- package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
- package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
- package/docs/TEST_MATRIX.md +0 -51
- package/docs/archive/README.md +0 -91
- package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
- package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
- package/docs/archive/pi-crew-bugs.md +0 -961
- package/docs/archive/pi-crew-test-final.md +0 -120
- package/docs/archive/pi-crew-test-results.md +0 -260
- package/docs/archive/pi-crew-test-round2.md +0 -136
- package/docs/archive/pi-crew-test-round4.md +0 -100
- package/docs/archive/pi-crew-test-round5.md +0 -70
- package/docs/archive/pi-crew-test-round6.md +0 -110
- package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
- package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
- package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
- package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
- package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
- package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
- package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
- package/docs/archive/pi-mono-opportunities.md +0 -969
- package/docs/archive/pi-mono-review.md +0 -291
- package/docs/archive/pi-subagent4-comparison.md +0 -261
- package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
- package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
- package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
- package/docs/bugs/bug-quota-display-truncation.md +0 -223
- package/docs/bugs/cross-session-notification-leakage.md +0 -82
- package/docs/code-review-2026-05-11.md +0 -592
- package/docs/coding-agent-optimization.md +0 -268
- package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
- package/docs/decisions/0001-durable-state.md +0 -41
- package/docs/decisions/0002-child-process-for-async.md +0 -42
- package/docs/decisions/0003-depth-guard.md +0 -36
- package/docs/decisions/0004-execfile-over-exec.md +0 -34
- package/docs/decisions/0005-no-parameter-properties.md +0 -49
- package/docs/decisions/0006-publish-bundled-esm.md +0 -63
- package/docs/decisions/0007-active-run-binary-index.md +0 -54
- package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
- package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
- package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
- package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
- package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
- package/docs/decisions/2026-07-26-c6-mascot-visibility-not-wired.md +0 -84
- package/docs/decisions/README.md +0 -26
- package/docs/deep-review-report.md +0 -384
- package/docs/distillation/cybersecurity-patterns.md +0 -294
- package/docs/feature-analysis-subagent4.md +0 -305
- package/docs/fix-plan-disabletools-exit-null.md +0 -219
- package/docs/fixes/BATCH_A_H1_H2.md +0 -86
- package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
- package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
- package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
- package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
- package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
- package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
- package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
- package/docs/fixes/bug-013-background-runner-death.md +0 -84
- package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
- package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
- package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
- package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
- package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
- package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
- package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
- package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
- package/docs/fixes/v0.9.10/smoke-test.md +0 -12
- package/docs/followup-plan-2026-05-12.md +0 -463
- package/docs/followup-review-2026-05-12.md +0 -297
- package/docs/goals.md +0 -59
- package/docs/implementation-plan-top3.md +0 -333
- package/docs/issue-29-analysis.md +0 -189
- package/docs/live-mailbox-runtime.md +0 -36
- package/docs/migration/atomic-write-v2-migration.md +0 -299
- package/docs/next-upgrade-roadmap.md +0 -808
- package/docs/oh-my-pi-research.md +0 -509
- package/docs/optimization-plan-2026-07.md +0 -366
- package/docs/optimization-plan.md +0 -644
- package/docs/patterns/command-agent-skill.md +0 -71
- package/docs/perf/baseline-2026-05.md +0 -113
- package/docs/perf/final-report-2026-05.md +0 -206
- package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
- package/docs/perf/performance-audit-report-2026-07.md +0 -948
- package/docs/perf/performance-review-2026-07.md +0 -287
- package/docs/perf/sprint-1-report.md +0 -71
- package/docs/perf/sprint-2-report.md +0 -81
- package/docs/perf/sprint-2.5-report.md +0 -53
- package/docs/perf/sprint-3-report.md +0 -36
- package/docs/perf/sprint-4-report.md +0 -47
- package/docs/perf/sprint-5-report.md +0 -51
- package/docs/perf/sprint-6-report.md +0 -94
- package/docs/perf/sprint-7-report.md +0 -74
- package/docs/perf/upgrade-plan-2026-05.md +0 -147
- package/docs/performance-optimization-execution-plan.md +0 -520
- package/docs/phase4-triage.md +0 -58
- package/docs/pi-crew-investigation-report.md +0 -411
- package/docs/product/README.md +0 -31
- package/docs/product/platform.md +0 -27
- package/docs/product/runtime-safety.md +0 -37
- package/docs/product/team-run.md +0 -39
- package/docs/product/team-tool.md +0 -37
- package/docs/runtime-analysis-child-vs-live.md +0 -171
- package/docs/runtime-migration-in-process-analysis.md +0 -250
- package/docs/skills/REFERENCE.md +0 -138
- package/docs/stories/README.md +0 -32
- package/docs/stories/US-DEPS-major-upgrade.md +0 -62
- package/docs/stories/backlog.md +0 -36
- package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
- package/docs/templates/decision.md +0 -27
- package/docs/templates/story.md +0 -44
- package/docs/templates/validation-report.md +0 -32
- package/docs/ui-optimization-plan.md +0 -447
- package/src/adapters/claude-adapter.ts +0 -23
- package/src/adapters/codex-adapter.ts +0 -21
- package/src/adapters/cursor-adapter.ts +0 -17
- package/src/adapters/export-util.ts +0 -143
- package/src/adapters/index.ts +0 -15
- package/src/adapters/registry.ts +0 -18
- package/src/adapters/types.ts +0 -23
- package/src/agents/agent-config.ts +0 -194
- package/src/agents/agent-search.ts +0 -98
- package/src/agents/agent-serializer.ts +0 -38
- package/src/agents/discover-agents.ts +0 -623
- package/src/benchmark/benchmark-runner.ts +0 -313
- package/src/benchmark/feedback-loop.ts +0 -73
- package/src/config/config.ts +0 -1269
- package/src/config/defaults.ts +0 -193
- package/src/config/drift-detector.ts +0 -290
- package/src/config/markers.ts +0 -330
- package/src/config/resilient-parser.ts +0 -117
- package/src/config/role-tools.ts +0 -118
- package/src/config/suggestions.ts +0 -75
- package/src/config/types.ts +0 -278
- package/src/errors.ts +0 -194
- package/src/extension/action-suggestions.ts +0 -117
- package/src/extension/async-notifier.ts +0 -179
- package/src/extension/autonomous-policy.ts +0 -209
- package/src/extension/command-completions.ts +0 -120
- package/src/extension/context-status-injection.ts +0 -185
- package/src/extension/crew-autocomplete.ts +0 -131
- package/src/extension/crew-cleanup.ts +0 -168
- package/src/extension/crew-input-router.ts +0 -93
- package/src/extension/crew-shortcuts.ts +0 -87
- package/src/extension/crew-vibes/cat-frames.ts +0 -18
- package/src/extension/crew-vibes/config.ts +0 -195
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -292
- package/src/extension/crew-vibes/index.ts +0 -432
- package/src/extension/crew-vibes/provider-usage.ts +0 -396
- package/src/extension/crew-vibes/render.ts +0 -206
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/extension/cross-extension-rpc.ts +0 -350
- package/src/extension/help.ts +0 -62
- package/src/extension/import-index.ts +0 -74
- package/src/extension/knowledge-injection.ts +0 -402
- package/src/extension/management.ts +0 -571
- package/src/extension/message-renderers.ts +0 -108
- package/src/extension/notification-router.ts +0 -152
- package/src/extension/notification-sink.ts +0 -54
- package/src/extension/pi-api.ts +0 -56
- package/src/extension/plan-orchestrate.ts +0 -302
- package/src/extension/project-init.ts +0 -170
- package/src/extension/register.ts +0 -113
- package/src/extension/registration/artifact-cleanup.ts +0 -20
- package/src/extension/registration/command-registration.ts +0 -58
- package/src/extension/registration/command-utils.ts +0 -58
- package/src/extension/registration/commands.ts +0 -1228
- package/src/extension/registration/compaction-guard.ts +0 -333
- package/src/extension/registration/context-builder.ts +0 -135
- package/src/extension/registration/crash-recovery-cache.ts +0 -54
- package/src/extension/registration/foreground-run-controller.ts +0 -238
- package/src/extension/registration/hook-registration.ts +0 -119
- package/src/extension/registration/lazy-configurers.ts +0 -124
- package/src/extension/registration/lifecycle-handlers.ts +0 -923
- package/src/extension/registration/lifecycle.ts +0 -259
- package/src/extension/registration/observability.ts +0 -322
- package/src/extension/registration/registration-types.ts +0 -158
- package/src/extension/registration/runtime-cleanup.ts +0 -230
- package/src/extension/registration/subagent-helpers.ts +0 -125
- package/src/extension/registration/subagent-manager-setup.ts +0 -330
- package/src/extension/registration/subagent-tools.ts +0 -456
- package/src/extension/registration/team-tool.ts +0 -220
- package/src/extension/registration/tool-registration.ts +0 -50
- package/src/extension/registration/ui.ts +0 -172
- package/src/extension/registration/viewers.ts +0 -121
- package/src/extension/registration/wire-cross-extension.ts +0 -37
- package/src/extension/result-watcher.ts +0 -139
- package/src/extension/rpc-hmac.ts +0 -256
- package/src/extension/run-bundle-schema.ts +0 -104
- package/src/extension/run-export.ts +0 -97
- package/src/extension/run-import.ts +0 -168
- package/src/extension/run-index.ts +0 -131
- package/src/extension/run-maintenance.ts +0 -190
- package/src/extension/session-summary.ts +0 -18
- package/src/extension/team-manager-command.ts +0 -153
- package/src/extension/team-onboard.ts +0 -177
- package/src/extension/team-recommendation.ts +0 -288
- package/src/extension/team-tool/anchor.ts +0 -172
- package/src/extension/team-tool/api.ts +0 -1244
- package/src/extension/team-tool/auto-summarize.ts +0 -142
- package/src/extension/team-tool/cache-control.ts +0 -19
- package/src/extension/team-tool/cancel.ts +0 -337
- package/src/extension/team-tool/chain-dispatch.ts +0 -95
- package/src/extension/team-tool/chain-executor.ts +0 -379
- package/src/extension/team-tool/config-patch.ts +0 -50
- package/src/extension/team-tool/context.ts +0 -149
- package/src/extension/team-tool/destructive-gate.ts +0 -52
- package/src/extension/team-tool/doctor.ts +0 -431
- package/src/extension/team-tool/explain.ts +0 -282
- package/src/extension/team-tool/failure-patterns.ts +0 -118
- package/src/extension/team-tool/goal-wrap.ts +0 -330
- package/src/extension/team-tool/goal.ts +0 -556
- package/src/extension/team-tool/handle-schedule.ts +0 -332
- package/src/extension/team-tool/handle-settings.ts +0 -520
- package/src/extension/team-tool/health-monitor.ts +0 -481
- package/src/extension/team-tool/inspect.ts +0 -88
- package/src/extension/team-tool/intent-policy.ts +0 -45
- package/src/extension/team-tool/lifecycle-actions.ts +0 -615
- package/src/extension/team-tool/orchestrate.ts +0 -98
- package/src/extension/team-tool/parallel-dispatch.ts +0 -183
- package/src/extension/team-tool/plan.ts +0 -50
- package/src/extension/team-tool/respond.ts +0 -150
- package/src/extension/team-tool/run-not-found.ts +0 -49
- package/src/extension/team-tool/run.ts +0 -1035
- package/src/extension/team-tool/status.ts +0 -260
- package/src/extension/team-tool/workflow-manage.ts +0 -261
- package/src/extension/team-tool-types.ts +0 -26
- package/src/extension/team-tool.ts +0 -1116
- package/src/extension/tool-result.ts +0 -16
- package/src/extension/validate-resources.ts +0 -108
- package/src/hooks/registry.ts +0 -200
- package/src/hooks/types.ts +0 -69
- package/src/i18n.ts +0 -212
- package/src/observability/correlation.ts +0 -50
- package/src/observability/event-bus.ts +0 -86
- package/src/observability/event-to-metric.ts +0 -170
- package/src/observability/exporters/adapter.ts +0 -27
- package/src/observability/exporters/otlp-exporter.ts +0 -356
- package/src/observability/exporters/prometheus-exporter.ts +0 -54
- package/src/observability/metric-registry.ts +0 -100
- package/src/observability/metric-retention.ts +0 -64
- package/src/observability/metric-sink.ts +0 -99
- package/src/observability/metrics-primitives.ts +0 -219
- package/src/plugins/plugin-define.ts +0 -6
- package/src/plugins/plugin-registry.ts +0 -32
- package/src/plugins/plugins/index.ts +0 -3
- package/src/plugins/plugins/nextjs.ts +0 -19
- package/src/plugins/plugins/vite.ts +0 -10
- package/src/plugins/plugins/vitest.ts +0 -9
- package/src/prompt/prompt-runtime.ts +0 -380
- package/src/runtime/adaptive-plan.ts +0 -563
- package/src/runtime/agent-control.ts +0 -215
- package/src/runtime/agent-memory.ts +0 -81
- package/src/runtime/agent-observability.ts +0 -122
- package/src/runtime/anchor-manager.ts +0 -475
- package/src/runtime/async-marker.ts +0 -32
- package/src/runtime/async-runner.ts +0 -381
- package/src/runtime/attention-events.ts +0 -28
- package/src/runtime/auto-summarize.ts +0 -344
- package/src/runtime/background-runner.ts +0 -837
- package/src/runtime/batch-barrier.ts +0 -147
- package/src/runtime/broker-issuer.ts +0 -37
- package/src/runtime/cancellation-token.ts +0 -99
- package/src/runtime/cancellation.ts +0 -99
- package/src/runtime/capability-inventory.ts +0 -137
- package/src/runtime/chain-parser.ts +0 -237
- package/src/runtime/chain-runner.ts +0 -606
- package/src/runtime/checkpoint.ts +0 -291
- package/src/runtime/child-pi-constants.ts +0 -42
- package/src/runtime/child-pi-kill.ts +0 -180
- package/src/runtime/child-pi-pool.ts +0 -68
- package/src/runtime/child-pi-spawn.ts +0 -287
- package/src/runtime/child-pi-steering.ts +0 -128
- package/src/runtime/child-pi-streams.ts +0 -296
- package/src/runtime/child-pi-transcript.ts +0 -169
- package/src/runtime/child-pi.ts +0 -1105
- package/src/runtime/coalesce-tasks.ts +0 -268
- package/src/runtime/code-summary.ts +0 -292
- package/src/runtime/command-trace.ts +0 -105
- package/src/runtime/compact-pipeline.ts +0 -56
- package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
- package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
- package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
- package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
- package/src/runtime/compact-stages/index.ts +0 -23
- package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
- package/src/runtime/compact-stages/truncation-stage.ts +0 -74
- package/src/runtime/compaction-summary.ts +0 -278
- package/src/runtime/completion-guard.ts +0 -207
- package/src/runtime/concurrency.ts +0 -58
- package/src/runtime/crash-classification.ts +0 -229
- package/src/runtime/crash-recovery.ts +0 -577
- package/src/runtime/crew-agent-records.ts +0 -593
- package/src/runtime/crew-agent-runtime.ts +0 -62
- package/src/runtime/crew-broker-child.ts +0 -88
- package/src/runtime/crew-broker-client.ts +0 -673
- package/src/runtime/crew-broker-tokens.ts +0 -84
- package/src/runtime/crew-broker.ts +0 -1276
- package/src/runtime/crew-hooks.ts +0 -227
- package/src/runtime/cross-extension-rpc.ts +0 -143
- package/src/runtime/custom-tools/irc-tool.ts +0 -282
- package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
- package/src/runtime/deadletter.ts +0 -47
- package/src/runtime/delivery-coordinator.ts +0 -211
- package/src/runtime/delta-conflict.ts +0 -348
- package/src/runtime/deterministic-ast.ts +0 -161
- package/src/runtime/diagnostic-export.ts +0 -171
- package/src/runtime/direct-run.ts +0 -45
- package/src/runtime/dwf-state-store.ts +0 -102
- package/src/runtime/dynamic-workflow-context.ts +0 -1016
- package/src/runtime/dynamic-workflow-runner.ts +0 -310
- package/src/runtime/effectiveness.ts +0 -90
- package/src/runtime/errors/crew-errors.ts +0 -162
- package/src/runtime/event-stream-bridge.ts +0 -98
- package/src/runtime/foreground-control.ts +0 -193
- package/src/runtime/foreground-watchdog.ts +0 -132
- package/src/runtime/global-worker-cap.ts +0 -96
- package/src/runtime/goal-achievement.ts +0 -148
- package/src/runtime/goal-evaluator.ts +0 -361
- package/src/runtime/goal-loop-runner.ts +0 -828
- package/src/runtime/goal-state-store.ts +0 -219
- package/src/runtime/green-contract.ts +0 -55
- package/src/runtime/group-join.ts +0 -267
- package/src/runtime/handoff-manager.ts +0 -598
- package/src/runtime/heartbeat-gradient.ts +0 -36
- package/src/runtime/heartbeat-watcher.ts +0 -239
- package/src/runtime/hidden-handoff.ts +0 -407
- package/src/runtime/important-line-classifier.ts +0 -140
- package/src/runtime/intercom-bridge.ts +0 -187
- package/src/runtime/iteration-hooks.ts +0 -305
- package/src/runtime/live-agent-control.ts +0 -136
- package/src/runtime/live-agent-manager.ts +0 -704
- package/src/runtime/live-control-realtime.ts +0 -56
- package/src/runtime/live-extension-bridge.ts +0 -148
- package/src/runtime/live-irc.ts +0 -97
- package/src/runtime/live-session-health.ts +0 -108
- package/src/runtime/live-session-runtime.ts +0 -1139
- package/src/runtime/loop-gates.ts +0 -128
- package/src/runtime/manifest-cache.ts +0 -375
- package/src/runtime/mcp-proxy.ts +0 -105
- package/src/runtime/metric-parser.ts +0 -36
- package/src/runtime/model-fallback.ts +0 -409
- package/src/runtime/model-resolver.ts +0 -126
- package/src/runtime/model-scope.ts +0 -158
- package/src/runtime/orphan-worker-registry.ts +0 -465
- package/src/runtime/output-validator.ts +0 -202
- package/src/runtime/overflow-recovery.ts +0 -206
- package/src/runtime/parallel-research.ts +0 -68
- package/src/runtime/parallel-utils.ts +0 -160
- package/src/runtime/parent-guard.ts +0 -134
- package/src/runtime/path-overlap.ts +0 -150
- package/src/runtime/peer-dep.ts +0 -292
- package/src/runtime/per-write-validator.ts +0 -181
- package/src/runtime/phase-progress.ts +0 -217
- package/src/runtime/phase-tracker.ts +0 -385
- package/src/runtime/pi-args.ts +0 -655
- package/src/runtime/pi-json-output.ts +0 -170
- package/src/runtime/pi-spawn.ts +0 -273
- package/src/runtime/pipeline-runner.ts +0 -523
- package/src/runtime/plan-templates.ts +0 -201
- package/src/runtime/policy-engine.ts +0 -115
- package/src/runtime/post-checks.ts +0 -142
- package/src/runtime/post-exit-stdio-guard.ts +0 -104
- package/src/runtime/process-lifecycle.ts +0 -491
- package/src/runtime/process-status.ts +0 -154
- package/src/runtime/progress-event-coalescer.ts +0 -44
- package/src/runtime/progress-tracker.ts +0 -124
- package/src/runtime/prose-compressor.ts +0 -162
- package/src/runtime/recovery-recipes.ts +0 -203
- package/src/runtime/replace.ts +0 -570
- package/src/runtime/resilient-edit.ts +0 -153
- package/src/runtime/result-extractor.ts +0 -213
- package/src/runtime/retry-executor.ts +0 -100
- package/src/runtime/retry-runner.ts +0 -336
- package/src/runtime/role-permission.ts +0 -59
- package/src/runtime/run-coalesced-task-group.ts +0 -308
- package/src/runtime/run-drift.ts +0 -219
- package/src/runtime/run-tracker.ts +0 -116
- package/src/runtime/runtime-policy.ts +0 -29
- package/src/runtime/runtime-resolver.ts +0 -172
- package/src/runtime/runtime-warmup.ts +0 -160
- package/src/runtime/scheduler.ts +0 -353
- package/src/runtime/semaphore.ts +0 -141
- package/src/runtime/sensitive-paths.ts +0 -93
- package/src/runtime/session-resources.ts +0 -25
- package/src/runtime/session-snapshot.ts +0 -59
- package/src/runtime/session-usage.ts +0 -79
- package/src/runtime/settings-store.ts +0 -155
- package/src/runtime/sidechain-output.ts +0 -35
- package/src/runtime/single-agent-compose.ts +0 -84
- package/src/runtime/skill-effectiveness.ts +0 -524
- package/src/runtime/skill-instructions.ts +0 -391
- package/src/runtime/stale-reconciler.ts +0 -680
- package/src/runtime/stream-preview.ts +0 -184
- package/src/runtime/streaming-output.ts +0 -50
- package/src/runtime/subagent-manager.ts +0 -561
- package/src/runtime/subprocess-tool-registry.ts +0 -70
- package/src/runtime/supervisor-contact.ts +0 -64
- package/src/runtime/task-display.ts +0 -52
- package/src/runtime/task-graph-scheduler.ts +0 -227
- package/src/runtime/task-graph.ts +0 -290
- package/src/runtime/task-health.ts +0 -83
- package/src/runtime/task-id.ts +0 -161
- package/src/runtime/task-output-context.ts +0 -602
- package/src/runtime/task-packet.ts +0 -268
- package/src/runtime/task-quality.ts +0 -199
- package/src/runtime/task-runner/capabilities.ts +0 -78
- package/src/runtime/task-runner/context-retrieval.ts +0 -163
- package/src/runtime/task-runner/live-executor.ts +0 -227
- package/src/runtime/task-runner/output-splitter.ts +0 -152
- package/src/runtime/task-runner/progress.ts +0 -157
- package/src/runtime/task-runner/prompt-builder.ts +0 -278
- package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
- package/src/runtime/task-runner/result-utils.ts +0 -16
- package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
- package/src/runtime/task-runner/run-projection.ts +0 -125
- package/src/runtime/task-runner/state-helpers.ts +0 -176
- package/src/runtime/task-runner/tail-read.ts +0 -34
- package/src/runtime/task-runner.ts +0 -1420
- package/src/runtime/team-runner-artifacts.ts +0 -13
- package/src/runtime/team-runner.ts +0 -1993
- package/src/runtime/tool-output-pruner.ts +0 -333
- package/src/runtime/tool-progress.ts +0 -278
- package/src/runtime/usage-tracker.ts +0 -73
- package/src/runtime/verification-gates.ts +0 -571
- package/src/runtime/verification-integrity.ts +0 -105
- package/src/runtime/verification-worktree.ts +0 -186
- package/src/runtime/worker-heartbeat.ts +0 -25
- package/src/runtime/worker-startup.ts +0 -83
- package/src/runtime/workflow-state.ts +0 -195
- package/src/runtime/workspace-lock.ts +0 -443
- package/src/runtime/workspace-tree.ts +0 -312
- package/src/runtime/yield-handler.ts +0 -224
- package/src/runtime/zombie-scanner.ts +0 -298
- package/src/schema/config-schema.ts +0 -327
- package/src/schema/team-tool-schema.ts +0 -415
- package/src/schema/validation-types.ts +0 -159
- package/src/skills/discover-skills.ts +0 -197
- package/src/skills/skill-templates.ts +0 -456
- package/src/skills/validate.ts +0 -285
- package/src/state/active-run-registry.ts +0 -439
- package/src/state/artifact-store.ts +0 -176
- package/src/state/atomic-write.ts +0 -903
- package/src/state/blob-store.ts +0 -308
- package/src/state/contracts.ts +0 -158
- package/src/state/crew-init.ts +0 -269
- package/src/state/decision-ledger.ts +0 -345
- package/src/state/event-log-rotation.ts +0 -342
- package/src/state/event-log.ts +0 -1311
- package/src/state/event-reconstructor.ts +0 -229
- package/src/state/gitignore-manager.ts +0 -46
- package/src/state/health-store.ts +0 -79
- package/src/state/hook-instinct-bridge.ts +0 -94
- package/src/state/hook-integrations.ts +0 -51
- package/src/state/instinct-store.ts +0 -275
- package/src/state/jsonl-writer.ts +0 -107
- package/src/state/locks.ts +0 -562
- package/src/state/mailbox.ts +0 -916
- package/src/state/observation-store.ts +0 -176
- package/src/state/run-cache.ts +0 -193
- package/src/state/run-graph.ts +0 -183
- package/src/state/run-metrics.ts +0 -165
- package/src/state/schedule.ts +0 -166
- package/src/state/session-state-map.ts +0 -51
- package/src/state/state-store.ts +0 -958
- package/src/state/task-claims.ts +0 -61
- package/src/state/tiered-eval.ts +0 -480
- package/src/state/types-eval.ts +0 -58
- package/src/state/types.ts +0 -440
- package/src/state/usage.ts +0 -138
- package/src/state/worker-atomic-writer.ts +0 -194
- package/src/subagents/async-entry.ts +0 -1
- package/src/subagents/index.ts +0 -3
- package/src/subagents/live/control.ts +0 -1
- package/src/subagents/live/manager.ts +0 -1
- package/src/subagents/live/realtime.ts +0 -1
- package/src/subagents/live/session-runtime.ts +0 -1
- package/src/subagents/manager.ts +0 -1
- package/src/subagents/spawn.ts +0 -1
- package/src/teams/discover-teams.ts +0 -187
- package/src/teams/team-config.ts +0 -27
- package/src/teams/team-serializer.ts +0 -38
- package/src/tools/safe-bash-extension.ts +0 -54
- package/src/tools/safe-bash.ts +0 -505
- package/src/types/diff.d.ts +0 -18
- package/src/types/new-api-types.ts +0 -35
- package/src/ui/agent-management-overlay.ts +0 -160
- package/src/ui/card-colors.ts +0 -139
- package/src/ui/crew-footer.ts +0 -102
- package/src/ui/crew-select-list.ts +0 -111
- package/src/ui/dashboard-panes/agents-pane.ts +0 -164
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
- package/src/ui/dashboard-panes/capability-pane.ts +0 -77
- package/src/ui/dashboard-panes/health-pane.ts +0 -31
- package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
- package/src/ui/dashboard-panes/progress-pane.ts +0 -38
- package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
- package/src/ui/deploy-bundled-themes.ts +0 -71
- package/src/ui/dwf-phase-display.ts +0 -151
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/heartbeat-aggregator.ts +0 -74
- package/src/ui/key-utils.ts +0 -42
- package/src/ui/keybinding-map.ts +0 -248
- package/src/ui/layout-primitives.ts +0 -106
- package/src/ui/live-conversation-overlay.ts +0 -183
- package/src/ui/live-duration.ts +0 -55
- package/src/ui/live-run-sidebar.ts +0 -293
- package/src/ui/loaders.ts +0 -6
- package/src/ui/mascot.ts +0 -449
- package/src/ui/overlays/agent-picker-overlay.ts +0 -65
- package/src/ui/overlays/confirm-overlay.ts +0 -60
- package/src/ui/overlays/help-overlay.ts +0 -177
- package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
- package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
- package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
- package/src/ui/pi-ui-compat.ts +0 -68
- package/src/ui/powerbar-publisher.ts +0 -459
- package/src/ui/render-coalescer.ts +0 -101
- package/src/ui/render-diff.ts +0 -160
- package/src/ui/render-scheduler.ts +0 -278
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -904
- package/src/ui/run-event-bus.ts +0 -381
- package/src/ui/run-snapshot-cache.ts +0 -1057
- package/src/ui/settings-overlay.ts +0 -1067
- package/src/ui/shared-overlay-scheduler.ts +0 -96
- package/src/ui/snapshot-types.ts +0 -90
- package/src/ui/spinner.ts +0 -17
- package/src/ui/status-colors.ts +0 -143
- package/src/ui/syntax-highlight.ts +0 -136
- package/src/ui/terminal-status.ts +0 -269
- package/src/ui/theme-adapter.ts +0 -271
- package/src/ui/theme-discovery.ts +0 -199
- package/src/ui/tool-progress-formatter.ts +0 -93
- package/src/ui/tool-render.ts +0 -453
- package/src/ui/tool-renderers/brief-mode.ts +0 -225
- package/src/ui/tool-renderers/index.ts +0 -726
- package/src/ui/transcript-cache.ts +0 -128
- package/src/ui/transcript-entries.ts +0 -256
- package/src/ui/transcript-viewer.ts +0 -424
- package/src/ui/widget/index.ts +0 -391
- package/src/ui/widget/widget-formatters.ts +0 -182
- package/src/ui/widget/widget-model.ts +0 -110
- package/src/ui/widget/widget-renderer.ts +0 -182
- package/src/ui/widget/widget-types.ts +0 -36
- package/src/utils/bm25-search.ts +0 -235
- package/src/utils/completion-dedupe.ts +0 -63
- package/src/utils/conflict-detect.ts +0 -668
- package/src/utils/env-allowlist.ts +0 -30
- package/src/utils/env-filter.ts +0 -155
- package/src/utils/file-coalescer.ts +0 -98
- package/src/utils/fingerprint.ts +0 -180
- package/src/utils/frontmatter.ts +0 -70
- package/src/utils/fs-watch.ts +0 -37
- package/src/utils/gh-protocol.ts +0 -556
- package/src/utils/git.ts +0 -260
- package/src/utils/guards.ts +0 -107
- package/src/utils/ids.ts +0 -24
- package/src/utils/incremental-reader.ts +0 -220
- package/src/utils/internal-error.ts +0 -10
- package/src/utils/names.ts +0 -36
- package/src/utils/ndjson.ts +0 -115
- package/src/utils/paths.ts +0 -227
- package/src/utils/project-detector.ts +0 -160
- package/src/utils/redaction.ts +0 -347
- package/src/utils/resolve-shell.ts +0 -36
- package/src/utils/run-watcher-registry.ts +0 -152
- package/src/utils/safe-paths.ts +0 -383
- package/src/utils/scan-cache.ts +0 -144
- package/src/utils/session-utils.ts +0 -110
- package/src/utils/sleep.ts +0 -54
- package/src/utils/socket-path.ts +0 -127
- package/src/utils/sse-parser.ts +0 -129
- package/src/utils/task-name-generator.ts +0 -337
- package/src/utils/timings.ts +0 -33
- package/src/utils/token-counter.ts +0 -200
- package/src/utils/visual.ts +0 -207
- package/src/workflows/cost-estimator.ts +0 -34
- package/src/workflows/discover-workflows.ts +0 -290
- package/src/workflows/intermediate-store.ts +0 -166
- package/src/workflows/preflight-validator.ts +0 -168
- package/src/workflows/topology-analyzer.ts +0 -203
- package/src/workflows/validate-workflow.ts +0 -50
- package/src/workflows/workflow-config.ts +0 -70
- package/src/workflows/workflow-serializer.ts +0 -32
- package/src/worktree/branch-freshness.ts +0 -112
- package/src/worktree/cleanup.ts +0 -341
- package/src/worktree/worktree-manager.ts +0 -1200
package/docs/FEATURE_INTAKE.md
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
# Feature Intake
|
|
2
|
-
|
|
3
|
-
Every implementation prompt must pass through the intake gate before code changes.
|
|
4
|
-
|
|
5
|
-
## Intake Flow
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
User prompt / issue
|
|
9
|
-
│
|
|
10
|
-
▼
|
|
11
|
-
Classify input type
|
|
12
|
-
│
|
|
13
|
-
▼
|
|
14
|
-
Identify affected modules
|
|
15
|
-
(src/runtime, src/state, src/extension, src/ui, src/utils)
|
|
16
|
-
│
|
|
17
|
-
▼
|
|
18
|
-
Run risk checklist
|
|
19
|
-
│
|
|
20
|
-
▼
|
|
21
|
-
Choose lane: tiny, normal, or high-risk
|
|
22
|
-
│
|
|
23
|
-
▼
|
|
24
|
-
Create/update story packet (normal+)
|
|
25
|
-
or patch directly (tiny)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Input Types
|
|
29
|
-
|
|
30
|
-
| Type | Use when | Artifact |
|
|
31
|
-
|------|----------|----------|
|
|
32
|
-
| Bug fix | Fix crash, wrong behavior, test failure | Direct patch or story |
|
|
33
|
-
| Feature | New capability (new tool action, new runtime mode) | Story packet |
|
|
34
|
-
| Refactor | Internal restructure without behavior change | Direct patch |
|
|
35
|
-
| Performance | Improve speed/memory/concurrency | Story packet |
|
|
36
|
-
| Security | Fix vulnerability, harden boundary | High-risk story |
|
|
37
|
-
| Docs | README, comments, harness files | Direct patch |
|
|
38
|
-
| Dependency | Update/add/remove dependencies | Story packet |
|
|
39
|
-
| Harness improvement | Improve this operating model | Direct docs update |
|
|
40
|
-
|
|
41
|
-
## Lanes
|
|
42
|
-
|
|
43
|
-
### Tiny
|
|
44
|
-
Low-risk: docs, names, narrow edits, comment fixes.
|
|
45
|
-
|
|
46
|
-
Requirements:
|
|
47
|
-
- Patch directly
|
|
48
|
-
- Run `npm run typecheck`
|
|
49
|
-
- Update harness only if friction found
|
|
50
|
-
|
|
51
|
-
### Normal
|
|
52
|
-
Story-sized behavior with bounded blast radius.
|
|
53
|
-
|
|
54
|
-
Requirements:
|
|
55
|
-
- Create/update story in `docs/stories/`
|
|
56
|
-
- Link affected product docs
|
|
57
|
-
- Add/update test matrix entries
|
|
58
|
-
- Run `npm test` + `npm run typecheck`
|
|
59
|
-
- Update `docs/TEST_MATRIX.md`
|
|
60
|
-
|
|
61
|
-
### High-Risk
|
|
62
|
-
Affects security, data integrity, state mutation, concurrency, or multiple modules.
|
|
63
|
-
|
|
64
|
-
Requirements:
|
|
65
|
-
- Create high-risk story folder in `docs/stories/`
|
|
66
|
-
- Fill overview, design, exec plan, validation
|
|
67
|
-
- Ask human confirmation before implementation
|
|
68
|
-
- Record decision in `docs/decisions/`
|
|
69
|
-
|
|
70
|
-
## Risk Checklist
|
|
71
|
-
|
|
72
|
-
| Risk flag | Applies when work touches |
|
|
73
|
-
|-----------|---------------------------|
|
|
74
|
-
| State mutation | manifest.json, tasks.json, events.jsonl writes |
|
|
75
|
-
| Concurrency | shared mutable state, race conditions, locks |
|
|
76
|
-
| Child process | spawning Pi workers, worktree isolation |
|
|
77
|
-
| Error handling | catch blocks, error propagation, crash recovery |
|
|
78
|
-
| External tools | `gh` CLI, `git` commands, shell execution |
|
|
79
|
-
| API contract | team tool API shape, tool parameters |
|
|
80
|
-
| Platform | Windows vs Unix path handling, EBUSY/EPERM |
|
|
81
|
-
| Backward compat | state format changes, config migration |
|
|
82
|
-
| Dependencies | new npm packages, native modules |
|
|
83
|
-
| Security | command injection, path traversal, trust boundaries |
|
|
84
|
-
|
|
85
|
-
## Classification
|
|
86
|
-
|
|
87
|
-
```text
|
|
88
|
-
0-1 flags:
|
|
89
|
-
tiny or normal, based on code impact
|
|
90
|
-
|
|
91
|
-
2-3 flags:
|
|
92
|
-
normal with stronger validation
|
|
93
|
-
|
|
94
|
-
4+ flags:
|
|
95
|
-
high-risk
|
|
96
|
-
|
|
97
|
-
Hard gates (always high-risk):
|
|
98
|
-
- State mutation + concurrency
|
|
99
|
-
- Child process spawning
|
|
100
|
-
- External tool execution (command injection surface)
|
|
101
|
-
- Removing or weakening error handling
|
|
102
|
-
- Changing state file format without migration
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## Affected Modules
|
|
106
|
-
|
|
107
|
-
| Module | Path | Blast radius |
|
|
108
|
-
|--------|------|-------------|
|
|
109
|
-
| Extension | `src/extension/` | Tool API, registration, hooks |
|
|
110
|
-
| Runtime | `src/runtime/` | Team runner, task runner, child process, async |
|
|
111
|
-
| State | `src/state/` | Durable state, events, locks, artifacts |
|
|
112
|
-
| UI | `src/ui/` | TUI dashboard, overlay, widgets |
|
|
113
|
-
| Utils | `src/utils/` | Shared utilities, conflict detection, git |
|
|
114
|
-
| Worktree | `src/worktree/` | Git worktree management |
|
|
115
|
-
| Config | `src/config/` | Runtime config, resource discovery |
|
|
116
|
-
| Tests | `test/` | Unit tests, integration |
|
|
117
|
-
|
|
118
|
-
## Output Example
|
|
119
|
-
|
|
120
|
-
```text
|
|
121
|
-
Lane: normal
|
|
122
|
-
Reason: touches state mutation and concurrency in team-runner.ts
|
|
123
|
-
Modules: src/runtime/team-runner.ts, src/state/state-store.ts
|
|
124
|
-
Story: docs/stories/US-015-durable-state-locking.md
|
|
125
|
-
Validation: npm test, npm run typecheck, CI 3/3
|
|
126
|
-
```
|
package/docs/HARNESS.md
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# Harness
|
|
2
|
-
|
|
3
|
-
pi-crew is a Pi extension for multi-agent orchestration. This harness helps
|
|
4
|
-
agents and humans collaborate on developing pi-crew in a reliable, inspectable,
|
|
5
|
-
and easy-to-steer way.
|
|
6
|
-
|
|
7
|
-
The product is pi-crew itself. The harness is the operating environment that
|
|
8
|
-
helps agents understand the product, classify work, track decisions, and
|
|
9
|
-
validate changes.
|
|
10
|
-
|
|
11
|
-
## Mental Model
|
|
12
|
-
|
|
13
|
-
```text
|
|
14
|
-
Human intent (issue, prompt, request)
|
|
15
|
-
│
|
|
16
|
-
▼
|
|
17
|
-
Feature intake
|
|
18
|
-
(classify → risk lane)
|
|
19
|
-
│
|
|
20
|
-
▼
|
|
21
|
-
Story packet or direct patch
|
|
22
|
-
│
|
|
23
|
-
▼
|
|
24
|
-
Agent work loop
|
|
25
|
-
(explore → plan → execute → verify)
|
|
26
|
-
│
|
|
27
|
-
▼
|
|
28
|
-
Product delta (code, tests, docs)
|
|
29
|
-
│
|
|
30
|
-
▼
|
|
31
|
-
Validation proof (tests, typecheck, CI)
|
|
32
|
-
│
|
|
33
|
-
▼
|
|
34
|
-
Harness delta (decisions, test matrix, backlog)
|
|
35
|
-
│
|
|
36
|
-
▼
|
|
37
|
-
Next intent
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Each task has 2 outputs:
|
|
41
|
-
1. **Product delta**: code changes, test changes, API shape, config changes
|
|
42
|
-
2. **Harness delta**: docs, decisions, test matrix updates, backlog items
|
|
43
|
-
|
|
44
|
-
## Source Hierarchy
|
|
45
|
-
|
|
46
|
-
Agents read in this order:
|
|
47
|
-
|
|
48
|
-
1. `AGENTS.md` — operating rules and important paths
|
|
49
|
-
2. `docs/HARNESS.md` — this file, the collaboration model
|
|
50
|
-
3. `docs/FEATURE_INTAKE.md` — before turning a request into work
|
|
51
|
-
4. `docs/product/` — current product contract
|
|
52
|
-
5. `docs/ARCHITECTURE.md` — implementation shape
|
|
53
|
-
6. `docs/stories/` — active and completed stories
|
|
54
|
-
7. `docs/TEST_MATRIX.md` — proof status
|
|
55
|
-
8. `docs/decisions/` — why important choices were made
|
|
56
|
-
|
|
57
|
-
## Validation Ladder
|
|
58
|
-
|
|
59
|
-
pi-crew already has validation commands:
|
|
60
|
-
|
|
61
|
-
| Level | Command | What it proves |
|
|
62
|
-
|-------|---------|----------------|
|
|
63
|
-
| quick | `npm run typecheck` | TypeScript correctness + strip-types import |
|
|
64
|
-
| unit | `npm test` | 1600+ unit tests, all pass |
|
|
65
|
-
| lint | `npm run check` | Biome lint + format |
|
|
66
|
-
| CI | GitHub Actions | Cross-platform (ubuntu, windows, macos) |
|
|
67
|
-
|
|
68
|
-
Agents **must not** claim validation passes without running the actual command.
|
|
69
|
-
|
|
70
|
-
## Growth Rule
|
|
71
|
-
|
|
72
|
-
The harness grows from friction. When an agent:
|
|
73
|
-
- Gets confused about expected behavior
|
|
74
|
-
- Has to repeat manual reasoning
|
|
75
|
-
- Lacks a validation command
|
|
76
|
-
- Discovers a missing rule
|
|
77
|
-
- Sees a recurring failure pattern
|
|
78
|
-
|
|
79
|
-
→ The agent must improve the harness directly or propose changes in `docs/HARNESS_BACKLOG.md`.
|
|
80
|
-
|
|
81
|
-
## Working Conventions
|
|
82
|
-
|
|
83
|
-
- Vietnamese for communication, English for code/comments
|
|
84
|
-
- Commit message format: `fix:`, `feat:`, `docs:` — conventional commits
|
|
85
|
-
- Every code change must pass `npm test` + `npm run typecheck`
|
|
86
|
-
- MEDIUM+ bugs found during review must be fixed before claiming done
|
|
87
|
-
- LOW issues documented in `docs/HARNESS_BACKLOG.md` if recurring
|
package/docs/HARNESS_BACKLOG.md
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# Harness Backlog
|
|
2
|
-
|
|
3
|
-
Use when an agent discovers a missing harness capability but should not change the operating model immediately.
|
|
4
|
-
|
|
5
|
-
## Items
|
|
6
|
-
|
|
7
|
-
### HB-001: Integration test harness
|
|
8
|
-
|
|
9
|
-
**Discovered while**: Review round 9 — all tests are unit tests, no multi-module integration tests exist.
|
|
10
|
-
|
|
11
|
-
**Current pain**: Cannot verify team-runner → state-store → child-process integration end-to-end without manual testing.
|
|
12
|
-
|
|
13
|
-
**Suggested improvement**: Add `test/integration/` with real file-system state, real child processes (with timeout).
|
|
14
|
-
|
|
15
|
-
**Risk**: normal
|
|
16
|
-
|
|
17
|
-
**Status**: ✅ PARTIALLY DONE (2026-06-24). The bulk of HB-001 was already
|
|
18
|
-
covered by 21 existing `test/integration/` files (team-runner path via
|
|
19
|
-
`mock-child-run`, `full-feature-smoke`, `phase3-6-*`). The genuine remaining
|
|
20
|
-
gap — interleaved manifest+task+event writes reloaded consistently (the
|
|
21
|
-
realistic run-load pattern) — is now covered by
|
|
22
|
-
`test/integration/state-durability-hb001.test.ts`. Child-process exit →
|
|
23
|
-
state-store reconcile is covered by `async-restart-recovery.test.ts`.
|
|
24
|
-
|
|
25
|
-
### HB-002: Windows-specific test coverage
|
|
26
|
-
|
|
27
|
-
**Discovered while**: RR-002 Windows EBUSY fix — only tested manually, no automated Windows-specific tests.
|
|
28
|
-
|
|
29
|
-
**Current pain**: Windows bugs only caught in CI, not locally.
|
|
30
|
-
|
|
31
|
-
**Suggested improvement**: Add `test/platform/` with Windows-specific tests (EBUSY retry, path handling).
|
|
32
|
-
|
|
33
|
-
**Risk**: normal
|
|
34
|
-
|
|
35
|
-
**Status**: ✅ DONE (2026-06-24). `test/platform/` ships with two files:
|
|
36
|
-
`windows-rename.test.ts` (EBUSY/EPERM rename retry path via `renameWithRetry`,
|
|
37
|
-
self-skips off win32) and `posix-tools.test.ts` (BSD-vs-GNU grep, /var →
|
|
38
|
-
/private/var realpath, POSIX-shell resolution — self-skips on win32).
|
|
39
|
-
Runbook in `test/platform/README.md`. The CI OS matrix (ubuntu/windows/macos)
|
|
40
|
-
exercises each platform's tests.
|
|
41
|
-
|
|
42
|
-
### HB-003: Performance regression baseline
|
|
43
|
-
|
|
44
|
-
**Discovered while**: Review noted `sleepSync` busy-wait on Windows — no perf benchmarks exist.
|
|
45
|
-
|
|
46
|
-
**Current pain**: Cannot detect performance regressions.
|
|
47
|
-
|
|
48
|
-
**Suggested improvement**: Add benchmark suite for critical paths (state writes, event append, task dispatch).
|
|
49
|
-
|
|
50
|
-
**Risk**: tiny
|
|
51
|
-
|
|
52
|
-
**Status**: ✅ DONE (2026-06-24). `test/bench/` now has 6 benchmarks:
|
|
53
|
-
the pre-existing `register-startup`, `render-flush`, `snapshot-cache`, plus
|
|
54
|
-
three new ones covering the gaps HB-003 flagged — `atomic-write.bench.ts`
|
|
55
|
-
(`atomicWriteJson` cold/warm), `event-append.bench.ts` (serial lock
|
|
56
|
-
contention vs batch), `task-graph-scheduler.bench.ts` (DAG build/refresh/
|
|
57
|
-
full-run). All run via `npm run bench` → `test/bench/results.json`; baseline
|
|
58
|
-
via `npm run bench:capture`. Each prints min/p50/p95/p99/max percentiles.
|
|
59
|
-
|
|
60
|
-
### HB-004: Real-binary smoke tests for ctx.agent() paths
|
|
61
|
-
|
|
62
|
-
**Discovered while**: Real-world `team action='run'` smoke testing on 2026-06-24
|
|
63
|
-
caught three bugs that the unit suite (which mocks child-pi) missed entirely.
|
|
64
|
-
|
|
65
|
-
**Current pain**: The unit tests for `dynamic-workflow-context.ts` and
|
|
66
|
-
`child-pi.ts` use `PI_TEAMS_MOCK_CHILD_PI` and never shell out to the real `pi`
|
|
67
|
-
binary. As a result they cannot catch:
|
|
68
|
-
- argv flags the real `pi` rejects (e.g. the `--crew-subagent` regression),
|
|
69
|
-
- env/persona interactions that change real model output (e.g. the
|
|
70
|
-
schema+systemPrompt drop),
|
|
71
|
-
- exit-code races in the real spawn lifecycle (e.g. the
|
|
72
|
-
`disableTools:true` → `exit null` race).
|
|
73
|
-
|
|
74
|
-
**Suggested improvement**: Add `test/smoke/` (gated behind a `PI_CREW_SMOKE=1`
|
|
75
|
-
env so CI doesn't bill tokens by default) that runs real `.dwf.ts` workflows
|
|
76
|
-
end-to-end via `team action='run'` and asserts on the resulting
|
|
77
|
-
`events.jsonl` + `summary.md`. One workflow per feature family
|
|
78
|
-
(phase/log/pipeline/agent/schema/worktree). Document the runbook in
|
|
79
|
-
`docs/troubleshooting.md`.
|
|
80
|
-
|
|
81
|
-
**Risk**: normal (token cost when run; otherwise read-only)
|
|
82
|
-
|
|
83
|
-
**Status**: ✅ DONE (2026-06-24). `test/smoke/` shipped with 5 smoke tests
|
|
84
|
-
(argv-flags, agent-plain, agent-schema, agent-disabletools, dwf-workflow),
|
|
85
|
-
all gated behind `PI_CREW_SMOKE=1`. `npm run test:smoke` runs them. CI
|
|
86
|
-
manual-dispatch workflow at `.github/workflows/smoke.yml` (requires
|
|
87
|
-
`PI_AUTH_JSON` secret). Runbook in `docs/troubleshooting.md`. Each smoke test
|
|
88
|
-
maps to a real bug it would have caught (HB-003a, the schema+systemPrompt
|
|
89
|
-
drop, the `--crew-subagent` argv regression).
|
package/docs/PROJECT_REVIEW.md
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
# pi-crew — Project Review
|
|
2
|
-
|
|
3
|
-
> Review date: 2026-05-18
|
|
4
|
-
> Version: `pi-crew@0.2.19`
|
|
5
|
-
> Scope: the entire source (`index.ts`, `src/**`), config, tests, docs, scripts.
|
|
6
|
-
> Method: read source directly, cross-referenced against `AGENTS.md`/`docs/architecture.md`, ran `npm run typecheck` + `npm run test:unit`.
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
`pi-crew` is a multi-agent orchestration Pi extension (teams + workflows + worktrees + async background runs), with a **durable-first model**: every run/task/event is persisted to disk (JSONL + atomic JSON writes) so that foreground, async background, dashboard, and crash recovery all read the same source of truth.
|
|
11
|
-
|
|
12
|
-
The codebase is mature, uses **TypeScript strict mode** (`noImplicitAny`, `strict: true`), has a broad test suite (1596 tests pass, 2 skipped, 0 failures), clear layered architecture (extension / runtime / state / worktree / utils), and many defensive notes ("3.1 backpressure", "2.10 cache", "P1 catch unhandled errors") indicating it has been iterated over many review rounds.
|
|
13
|
-
|
|
14
|
-
### Quick health-check results
|
|
15
|
-
|
|
16
|
-
| Category | Result |
|
|
17
|
-
|---|---|
|
|
18
|
-
| `npm run typecheck` (`tsc --noEmit` + strip-types import) | PASS |
|
|
19
|
-
| `npm run test:unit` (1598 tests / 128 suites) | 1596 pass · 2 skip · 0 fail (~90s) |
|
|
20
|
-
| `npm pack --dry-run` (via `npm run ci`) | Not checked in this session |
|
|
21
|
-
| Linter (ESLint) | No `lint` script; relies on `tsc strict` |
|
|
22
|
-
| Number of `.ts` files in `src/` | ~190 modules |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 1. Notable strengths
|
|
27
|
-
|
|
28
|
-
1. **Consistent path-safety**: `utils/safe-paths.ts` (`assertSafePathId`, `resolveContainedPath`, `resolveRealContainedPath`) is used uniformly in `state-store.ts`, `artifact-store.ts`, `mailbox.ts`. It has two layers: a string-based containment check and a real-path check (defends against symlink escape after mkdir).
|
|
29
|
-
2. **Multi-layered defensive atomic writes** (`state/atomic-write.ts`):
|
|
30
|
-
- `O_EXCL | O_CREAT | O_NOFOLLOW` when opening the temp file.
|
|
31
|
-
- `fstatSync` post-open to verify a regular file (defends against TOCTOU on Windows where `O_NOFOLLOW = 0`).
|
|
32
|
-
- Rename retry with exponential backoff + jitter (defends against lockstep starvation).
|
|
33
|
-
- Coalesced variant `atomicWriteJsonCoalesced` for high-frequency state writes; flush on `exit`/`SIGTERM`/`SIGINT`.
|
|
34
|
-
3. **Redaction (`utils/redaction.ts`)** handles many patterns: PEM private keys, Authorization headers, Bearer tokens, inline secret patterns, key-name matching (`apiKey`, `password`, `secret`, ...). Applied in `appendEvent`, `appendMailboxMessage`, `writeArtifact`, `appendTranscript`.
|
|
35
|
-
4. **Env sanitization (`utils/env-filter.ts`)**: default secret-pattern deny-list, allow-list mode for `worktree.setupHook` to pass only `PATH`, `HOME`, `PI_*`.
|
|
36
|
-
5. **Process kill tree** (`runtime/child-pi.ts`):
|
|
37
|
-
- Windows: `taskkill /T /F` + verify-after-2s + retry if PID is still alive.
|
|
38
|
-
- POSIX: `process.kill(-pid, "SIGTERM")` (process group) with an absolute-pid fallback; SIGKILL escalation after `HARD_KILL_MS`; fast-cancel SIGKILL after 200ms on user cancel.
|
|
39
|
-
- Lifecycle events have a structured shape `{ type, pid, exitCode?, error?, ts }`.
|
|
40
|
-
6. **Backpressure**: pause child stdout when more than 256KB is undrained.
|
|
41
|
-
7. **Lazy imports marked with `// LAZY:`** with a specific reason (reduces ~1.4s import cost at registration), plus a `check:lazy-imports` script to enforce it.
|
|
42
|
-
8. **Run / task contract guards**: `shouldMergeTaskUpdate` (prevents a stale snapshot from regressing terminal state), monotonic finishedAt, `canTransitionRunStatus`, plan-approval-gating for mutating tasks.
|
|
43
|
-
9. **Crash & cancellation paths**: `executeTeamRun` catch-all ensures the manifest/tasks transition to terminal on unhandled error (avoids "running forever"); `background-runner` has an `unhandledRejection` guard that writes `async.failed` before exit; `parent-guard` so the background runner dies when its parent dies.
|
|
44
|
-
10. **Very broad test coverage** for both happy paths and edge cases (yield, atomic-write retry, mergeTaskUpdates, mailbox validation, cancellation, model fallback...).
|
|
45
|
-
11. **Config**:
|
|
46
|
-
- Schema validation via TypeBox with fuzzy suggestions for misspelled keys.
|
|
47
|
-
- **Sanitize project-level config** (`sanitizeProjectConfig`): strips sensitive keys (`executeWorkers`, `runtime.mode`, `worktree.setupHook`, `otlp.headers`, `agents.overrides`, …) from the project config, accepting them only from user config. This is an essential safeguard for an injected repo.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 2. Bugs / Issues found
|
|
52
|
-
|
|
53
|
-
> Classification: **HIGH** (can cause data loss / incorrectness), **MED** (correctness corner case / DX), **LOW** (improvement).
|
|
54
|
-
|
|
55
|
-
### HIGH
|
|
56
|
-
|
|
57
|
-
**H1. `event-log.ts` — silent loss when exceeding `MAX_EVENTS_BYTES` (50MB)**
|
|
58
|
-
```ts
|
|
59
|
-
// src/state/event-log.ts ~ appendEventInsideLock
|
|
60
|
-
if (fs.existsSync(eventsPath) && fs.statSync(eventsPath).size > MAX_EVENTS_BYTES) {
|
|
61
|
-
logInternalError(...);
|
|
62
|
-
return { ...fullEvent, metadata: { ...(fullEvent.metadata ?? {seq:0,...}), appended: false } };
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
- Problem: the event is dropped immediately (including terminal events like `run.failed`, `task.completed`) and `appendCounter` is also not incremented → `compactEventLog` (which only runs every 100 appends) is not triggered when it is needed most. Consequence: once the threshold is crossed, the log is "locked" silently until the next 100 appends trigger a rotation.
|
|
66
|
-
- Suggestion: when the threshold is hit, call `compactEventLog(eventsPath)` immediately, or rotate first then append; also prioritize letting terminal events (TERMINAL_EVENT_TYPES) through, since those events are part of the durable contract.
|
|
67
|
-
|
|
68
|
-
**H2. `mailbox.ts` — `appendMailboxMessage` has no cross-process lock**
|
|
69
|
-
```ts
|
|
70
|
-
fs.appendFileSync(mailboxFile(manifest, complete.direction, complete.taskId), `${JSON.stringify(...)}\n`, "utf-8");
|
|
71
|
-
```
|
|
72
|
-
- Problem: `appendFileSync` is not atomic across processes on Windows. Two background runners + foreground steering at the same time can interleave JSON lines → `parseMailboxMessage` skips them, messages are lost silently (reported later via `validateMailbox`).
|
|
73
|
-
- Suggestion: use the existing `withEventLogLockSync` pattern for the mailbox, or use `atomicWriteFile` to rewrite (slower but atomic). At minimum, add atomic `O_APPEND` on POSIX (only guaranteed up to PIPE_BUF) and a lock on Windows.
|
|
74
|
-
|
|
75
|
-
**H3. `atomic-write.ts` — fallback `writeFileSync` has no symlink guard**
|
|
76
|
-
```ts
|
|
77
|
-
try { renameWithRetry(tempPath, filePath); }
|
|
78
|
-
catch (renameError) {
|
|
79
|
-
try { fs.writeFileSync(filePath, content, "utf-8"); } // BYPASSES symlink guard
|
|
80
|
-
catch { throw renameError; }
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
- Problem: if rename fails with EPERM on Windows, the fallback goes directly to `writeFileSync(filePath)` — if `filePath` becomes a symlink between the `isSymlinkSafePath` check (top of function) and the fallback, the write follows the link. The time window is small but could be exploited by an adversary on a multi-user host.
|
|
84
|
-
- Suggestion: before the fallback, re-check `fs.lstatSync(filePath).isSymbolicLink()`. Or open an fd with `O_NOFOLLOW` and `O_TRUNC` then write.
|
|
85
|
-
|
|
86
|
-
**H4. `team-runner.ts` — function named `__test__mergeTaskUpdates` is used in production**
|
|
87
|
-
```ts
|
|
88
|
-
// Re-exported and documented as test-only:
|
|
89
|
-
export function __test__mergeTaskUpdates(...) { ... }
|
|
90
|
-
// but called in executeTeamRunCore:
|
|
91
|
-
tasks = __test__mergeTaskUpdates(tasks, results);
|
|
92
|
-
```
|
|
93
|
-
- Problem: the `__test__` convention implies only tests should import it; this is actually the runner's core merge logic. Another developer might "clean up" this helper or change its behavior thinking it only affects tests → silent regression.
|
|
94
|
-
- Suggestion: rename to `mergeTaskUpdatesPreservingTerminal()` (or similar), keep `__test__mergeTaskUpdates` as an export-only alias for tests, add a comment.
|
|
95
|
-
|
|
96
|
-
### MED
|
|
97
|
-
|
|
98
|
-
**M1. `task-runner.ts` — `transcriptPath` reused across model fallback attempts**
|
|
99
|
-
- Each attempt appends to the same transcript file. `parsePiJsonOutput(fs.readFileSync(transcriptPath, "utf-8"))` parses everything → final text/usage may be mixed across attempts. `resultArtifact.content` takes `parsedOutput?.finalText`, which could be the final text of attempt 1 (which failed) if attempt 2 has no valid message_end.
|
|
100
|
-
- Suggestion: either use `transcripts/${task.id}.attempt-${i}.jsonl` per attempt, or clear the file at the start of each attempt if the policy is "last attempt wins".
|
|
101
|
-
|
|
102
|
-
**M2. `task-runner.ts` — reads the entire transcript into memory for `transcriptArtifact`**
|
|
103
|
-
```ts
|
|
104
|
-
content: fs.readFileSync(transcriptPath, "utf-8"),
|
|
105
|
-
```
|
|
106
|
-
- For long-running tasks the transcript can be tens of MB. Combined with compactChildPiEvent already reducing size, it is still unbounded. `MAX_CAPTURE_BYTES` only applies to in-memory `stdout/stderr`, not to the on-disk transcript.
|
|
107
|
-
- Suggestion: cap the transcript file size (rotate when exceeding a threshold) or have the artifact use a reference (path) instead of copying content.
|
|
108
|
-
|
|
109
|
-
**M3. `cleanup.ts` — `fs.statSync(worktreePath).isDirectory()` has no race guard**
|
|
110
|
-
```ts
|
|
111
|
-
for (const entry of fs.readdirSync(worktreeRoot)) {
|
|
112
|
-
const worktreePath = path.join(worktreeRoot, entry);
|
|
113
|
-
if (!fs.statSync(worktreePath).isDirectory()) continue;
|
|
114
|
-
```
|
|
115
|
-
- If the entry is deleted between `readdirSync` and `statSync`, it throws uncaught.
|
|
116
|
-
- Suggestion: wrap in `try { fs.statSync... } catch { continue; }` or use `fs.readdirSync(worktreeRoot, { withFileTypes: true })` then `entry.isDirectory()`.
|
|
117
|
-
|
|
118
|
-
**M4. `worktree-manager.ts` — `runSetupHook` parses JSON only from the last line**
|
|
119
|
-
```ts
|
|
120
|
-
const lastLine = lines[lines.length - 1] ?? trimmed;
|
|
121
|
-
const parsed = JSON.parse(lastLine);
|
|
122
|
-
```
|
|
123
|
-
- If the hook outputs multi-line JSON (pretty-printed), only the last line is parsed → `syntheticPaths` are silently lost. There is a log warning, but it is silent from the caller's side.
|
|
124
|
-
- Suggestion: try parsing `trimmed` first, fall back to the last line. Or define a clear protocol (one-line JSON, terminator marker).
|
|
125
|
-
|
|
126
|
-
**M5. `worktree-manager.ts` — `linkNodeModulesIfPresent` does not warn when `symlinkSync` fails**
|
|
127
|
-
```ts
|
|
128
|
-
try { fs.symlinkSync(...); return true; } catch { return false; }
|
|
129
|
-
```
|
|
130
|
-
- On Windows without the right to create symlinks (requires SeCreateSymbolicLinkPrivilege), it fails silently, the agent runs without `node_modules` — module resolution may fail but the caller does not know.
|
|
131
|
-
- Suggestion: log the reason for failure (especially for non-admin Windows) via `logInternalError`, or return `{ linked, reason }`.
|
|
132
|
-
|
|
133
|
-
**M6. `child-pi.ts` — `forcedFinalDrain` forces `exitCode: 0`**
|
|
134
|
-
```ts
|
|
135
|
-
const finalExitCode = forcedFinalDrain && !timeoutError ? 0 : exitCode;
|
|
136
|
-
```
|
|
137
|
-
- This logic (already explained in a comment) converts some exit ≠ 0 into 0 after the child sends the final assistant event. Edge case: child crashes during cleanup after the final event → still reports success. This could mask a memory leak or crash in the child Pi.
|
|
138
|
-
- Suggestion: add telemetry/metrics counting how often `forcedFinalDrain → 0` happens to detect regressions. Currently there is only a lifecycle event "final_drain" but no conversion metric.
|
|
139
|
-
|
|
140
|
-
**M7. `background-runner.ts` — `process.exit(130)` in the interrupt guard does not await flush**
|
|
141
|
-
```ts
|
|
142
|
-
if (last?.type === "interrupt" && last?.acknowledged !== true) {
|
|
143
|
-
appendEvent(...);
|
|
144
|
-
process.exit(130);
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
- `process.exit` runs the `'exit'` handler but does not await async ops (e.g., a pending `appendEventBuffered` Promise). `flushEventLogBuffer` registered on `'exit'` is sync so it's OK, but `terminateLiveAgentsForRun` is not. It could leak a live agent.
|
|
148
|
-
- Suggestion: `await terminateLiveAgentsForRun(...)` before exiting, or use `process.exitCode = 130` + return so cleanup runs normally.
|
|
149
|
-
|
|
150
|
-
**M8. `state-store.ts` — manifest cache TTL invariant**
|
|
151
|
-
- The cache key is `stateRoot`, TTL 5 minutes. Path validation guards against manifest paths changing. But if the file mtime + size do not change (extremely rare but possible with coalesced atomic writes when the size & content are the same), the cache serves stale content.
|
|
152
|
-
- Suggestion: add a `contentHash` (cheap to stat → a fingerprint like the first 32 bytes) to the cache key, or invalidate the cache in the `atomicWriteJsonCoalesced` flush callback.
|
|
153
|
-
|
|
154
|
-
**M9. `event-log.ts` — `sequenceCache` not invalidated when the file is truncated externally**
|
|
155
|
-
- If an external tool truncates `events.jsonl` (manual rotation), the cached `seq` stays high, making `nextSequence` produce wrong seqs (there is a fallback: `cached.size === stat.size`). OK for the same-size race, but if truncation happens between `statSync` and `appendFileSync`, two appends will have the same seq.
|
|
156
|
-
- Suggestion: persistSequence already uses atomic write, you can trust it in the race. Add an integration test for external truncation.
|
|
157
|
-
|
|
158
|
-
**M10. `runtime-resolver` / config — `executeWorkers=false` default fallback path**
|
|
159
|
-
- `handleResume` has complex logic to re-evaluate `runtime.mode` when resuming scaffold runs. The 3-way logic (`resumeManifest.runtimeResolution?.safety === "explicit_dry_run"` + env var checks) easily leads to an edge case where the user expects actual workers but resume is still scaffold. Hard to test.
|
|
160
|
-
- Suggestion: refactor into a clear state machine `resolveResumeRuntime({ original, override, env })` with unit tests covering the full truth table.
|
|
161
|
-
|
|
162
|
-
### LOW
|
|
163
|
-
|
|
164
|
-
- **L1. `package.json` missing a `lint` script**; the global `AGENTS.md` has a convention `eslint --max-warnings=0`. Currently it only relies on `tsc strict`. Consider adding ESLint or Biome.
|
|
165
|
-
- **L2. Many `JSON.stringify(value, null, 2)` for metadata artifacts**. Pretty-printing 50+ artifact/task files costs I/O. Consider minified JSON for metadata; pretty only for summary/progress that users read.
|
|
166
|
-
- **L3. `task-runner.ts` creates ~13 artifacts per task** (prompt, result, inputs, coordination, skill, packet, verification, startup, permission, capability, prompt-pipeline, log, transcript, diff, diff-stat, output-validation). Each is an `atomicWriteFile` syscall. In a large run (50+ tasks), consolidating into fewer sub-artifacts would significantly reduce I/O.
|
|
167
|
-
- **L4. `registerYieldTool()` runs at module top level** (`task-runner.ts` line 35). Side effect on import — if the module is imported twice (e.g., jiti vs strip-types), `subprocessToolRegistry` could be duplicated. Check whether `subprocess-tool-registry.ts` is idempotent.
|
|
168
|
-
- **L5. `atomic-write.ts` `atomicWriteJsonCoalesced`** — the API has a significant caveat (read-after-write within the buffer window reads stale content). Large risk surface if a future dev forgets to call `flushPendingAtomicWrites()`. Consider adding a dedicated read API `readJsonFileWithCoalesceFlush()`.
|
|
169
|
-
- **L6. Cancellation paths have no counting metric**. There are observability events but no gauge for the number of tasks cancelled per run.
|
|
170
|
-
- **L7. `management.ts` `handleUpdate` rename+write** sequence has no rollback if writeFileSync fails after rename (a backup exists, but the user must manually restore). Could wrap in try/catch + auto-restore from backup.
|
|
171
|
-
- **L8. `child-pi.ts` mock paths read env `PI_TEAMS_MOCK_CHILD_PI`** — there should be a guard preventing accidental production activation (check `process.env.NODE_ENV === "test"` or a clear test flag).
|
|
172
|
-
- **L9. `worktree-manager.ts` `findGitRoot` throws** if cwd is not a git repo. `prepareTaskWorkspace` calls it before checking workspaceMode; actually workspaceMode is checked at the top of the function, OK. But the git error message ("not a git repository") propagates to the user — not user-friendly.
|
|
173
|
-
- **L10. The naming `crewRoot` vs `.crew/` vs `.pi/teams/`** is documented but easy to confuse. `projectCrewRoot` has three branches (existing `.crew` → `.crew`; existing `.pi` → `.pi/teams`; else → `.crew`). Tests cover it but a new dev reading the code can easily misunderstand.
|
|
174
|
-
- **L11. Some `let task: TeamTaskState = ...` is reassigned multiple times in `task-runner.ts`**. Hard to reason about. Consider refactoring into a reducer pattern.
|
|
175
|
-
- **L12. `update-references-for-rename` only updates team→agent and team.defaultWorkflow**, does not cover workflow→step.role or agent references in test fixtures. The comment acknowledges this. Still worth fixing so renames are safe.
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## 3. Security review
|
|
180
|
-
|
|
181
|
-
| Item | Status | Notes |
|
|
182
|
-
|---|---|---|
|
|
183
|
-
| Path traversal | OK | `assertSafePathId`, `resolveContainedPath`, `resolveRealContainedPath` cover it fairly thoroughly. |
|
|
184
|
-
| Symlink escape | OK (corner case H3) | `O_NOFOLLOW`, `lstatSync`, post-open `fstatSync`. One fallback path skips the check (H3). |
|
|
185
|
-
| Secret leak | OK | Redaction applied at the event log, transcript, mailbox, artifact inputs. Env sanitization before spawning the child. |
|
|
186
|
-
| Code injection via setup hook | Mitigated | `runSetupHook` validates the file exists, uses `shell: false`, allow-lists env, 30s timeout. But it still executes user-provided code. Must trust the user. |
|
|
187
|
-
| Untrusted project config | OK | `sanitizeProjectConfig` strips sensitive keys before merging. |
|
|
188
|
-
| Process tree leak (zombie child Pi) | OK | `terminateActiveChildPiProcesses` + `parent-guard` + Windows `taskkill /T /F`. |
|
|
189
|
-
| DoS via concurrency | OK | Default hard-cap; `allowUnboundedConcurrency=true` requires explicit opt-in + emits an event. |
|
|
190
|
-
| Event log injection | Mitigated | JSON.stringify per line; readEvents skips parse errors. There is a risk of corrupted JSON lines due to an `appendFileSync` race (H2 in mailbox, but the event log has a lock). |
|
|
191
|
-
| Dependency surface | Small | Only runtime deps: typebox, cli-highlight, diff, jiti. |
|
|
192
|
-
|
|
193
|
-
In summary: the security posture is **good**. The biggest issue is H2 (mailbox has no lock) — stale state can occur if multiple processes race.
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## 4. Performance review
|
|
198
|
-
|
|
199
|
-
- **Atomic write coalescer** (50ms window) has reduced I/O for high-frequency state writes.
|
|
200
|
-
- **Manifest cache** with mtime+size key avoids re-parsing when unchanged.
|
|
201
|
-
- **Lazy import boundaries** reduce import cost ~1.4s.
|
|
202
|
-
- **`projectRootCache` TTL 30s** reduces 14 `existsSync` × ancestor levels per render tick.
|
|
203
|
-
|
|
204
|
-
Areas with optimization potential:
|
|
205
|
-
1. Each completed task produces ~13 artifacts (L3). 50 tasks = 650 atomic writes for metadata. Consider batching.
|
|
206
|
-
2. `progress.md` and `summary.md` are rewritten multiple times per batch (writeProgress in a loop). Coalescing is fine but `atomicWriteJsonCoalesced` could be used.
|
|
207
|
-
3. `parsePiJsonOutput(fs.readFileSync(transcriptPath))` runs each attempt, parsing the full transcript. Stream parsing is cheaper for large transcripts.
|
|
208
|
-
4. `aggregateUsage(tasks)` runs O(n) over tasks on each summary write.
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## 5. DX / Maintainability
|
|
213
|
-
|
|
214
|
-
| Aspect | Note |
|
|
215
|
-
|---|---|
|
|
216
|
-
| TS strict | OK, `noImplicitAny` enforced. |
|
|
217
|
-
| Naming `__test__*` | Some mixing of pure test utils and production helpers (H4). |
|
|
218
|
-
| File size | `team-runner.ts` (694 lines), `task-runner.ts` (440+ lines), `register.ts` (1k+ lines), `live-session-runtime.ts` (~750 lines) are all > 500 lines. AGENTS.md says "prefer small modules". |
|
|
219
|
-
| Comment quality | Good — there are "WHY" markers, version tags (`// 2.10`, `// H4`, `// 3.1`). |
|
|
220
|
-
| Test layout | `test/unit/*.test.ts` + `test/integration/*.test.ts`. Reasonable concurrency. |
|
|
221
|
-
| Hard-coded magic numbers | Mostly centralized in `config/defaults.ts`. |
|
|
222
|
-
| Error reporting | `logInternalError` is consistent — best-effort, does not throw. |
|
|
223
|
-
| Docs sync | `docs/architecture.md` matches the code (except some next-upgrade-roadmap items not yet implemented). |
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## 6. Test-matrix gaps (candidates for new tests)
|
|
228
|
-
|
|
229
|
-
- Cross-process race on mailbox append (H2).
|
|
230
|
-
- Event log overflow recovery (H1) — ensure terminal events are still persisted when exceeding 50MB.
|
|
231
|
-
- `forcedFinalDrain` does not mask a real child crash (M6).
|
|
232
|
-
- Resume with mixed `runtime.mode` overrides (M10).
|
|
233
|
-
- Atomic-write coalesced + read-after-write within the window — ensure documented behavior matches reality.
|
|
234
|
-
- `linkNodeModulesIfPresent` Windows non-admin fallback (M5).
|
|
235
|
-
- `runSetupHook` multi-line JSON output (M4).
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## 7. Suggested priorities (sorted)
|
|
240
|
-
|
|
241
|
-
1. **Fix H1** (event-log overflow): rotate immediately when the threshold is crossed + prioritize terminal events.
|
|
242
|
-
2. **Fix H2** (mailbox lock): apply the `withEventLogLockSync` pattern to mailbox append.
|
|
243
|
-
3. **Fix H3** (atomic-write symlink TOCTOU): re-check lstat before the `writeFileSync` fallback.
|
|
244
|
-
4. **Fix H4** (rename `__test__mergeTaskUpdates` → `mergeTaskUpdates`, keep alias).
|
|
245
|
-
5. **M1/M2** transcript per-attempt + cap size.
|
|
246
|
-
6. **M3** race-safe `statSync` in cleanup.
|
|
247
|
-
7. **M6** add a metric `crew.child.final_drain_force_zero_total`.
|
|
248
|
-
8. **L1** add ESLint or Biome for consistency (global AGENTS.md requires it).
|
|
249
|
-
9. **L3** batch artifact writes for metadata.
|
|
250
|
-
10. **L12** expand `updateReferencesForRename` for workflow→step + agent references.
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## 8. Verification
|
|
255
|
-
|
|
256
|
-
```
|
|
257
|
-
npx tsc --noEmit → PASS
|
|
258
|
-
node --experimental-strip-types -e "..." → PASS (strip-types import ok)
|
|
259
|
-
node --test test/unit/*.test.ts → 1596 pass / 2 skip / 0 fail / 90s
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
There is no lint command in the project (only `tsc strict`); no `.eslintrc*` file was found.
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## 9. Conclusion
|
|
267
|
-
|
|
268
|
-
`pi-crew` is a **mature, highly disciplined** codebase, with many defensive layers against TOCTOU, races, and mid-write crashes. Test coverage is broad, the architecture is clear. The issues found are mainly edge-case correctness and hardening; there is no serious "broken core flow" vulnerability.
|
|
269
|
-
|
|
270
|
-
**Recommendation**: prioritize fixing H1–H4 and expanding tests for cross-process races (mailbox + event-log overflow). Next, consider adding a linter, batching metadata artifact writes, and refactoring some large orchestrator files (`register.ts`, `team-runner.ts`, `live-session-runtime.ts`) into sub-modules.
|