pi-crew 0.9.50 → 0.9.52
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 +150 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2222 -1761
- package/dist/index.mjs +18636 -17603
- package/docs/actions-reference.md +431 -1
- 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/skills/distill-software/SKILL.md +24 -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/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 -301
- package/src/ui/loaders.ts +0 -176
- package/src/ui/mascot.ts +0 -436
- 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 -224
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -913
- 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/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 -357
- 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
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
# Follow-up Review — pi-crew (2026-05-12, round 2)
|
|
2
|
-
|
|
3
|
-
Author: Droid (Factory) | Related: `docs/followup-plan-2026-05-12.md`, commit `926e6ee`.
|
|
4
|
-
|
|
5
|
-
Review after commit `926e6ee` applied the B1–B9 + A1–A2 fixes from `followup-plan-2026-05-12.md`.
|
|
6
|
-
|
|
7
|
-
## Result summary
|
|
8
|
-
|
|
9
|
-
- `npm run typecheck` → Passed
|
|
10
|
-
- `npm run test:unit` → **1411 tests / 1408 pass / 0 fail / 3 skip** (previously: 1389/1400 with 8 bash-on-Windows failures)
|
|
11
|
-
- `npm run check:lazy-imports` → **FAILS on Windows** (details below)
|
|
12
|
-
|
|
13
|
-
## Per-item status
|
|
14
|
-
|
|
15
|
-
| # | Item | Status | Notes |
|
|
16
|
-
|---|---|---|---|
|
|
17
|
-
| B1 | bash portability | ✅ Done | `resolveShellForScript` + `resolveBashCmd` in `src/utils/resolve-shell.ts`. Applied to `post-checks.ts` + `iteration-hooks.ts`. The 8 previously failing tests pass. |
|
|
18
|
-
| B2 | `worktree-manager.test.ts` | ⚠️ Partial | Has 3 tests (branch recovery, reuse, clean leader). Missing the `linkNodeModulesIfPresent` reject-file test. |
|
|
19
|
-
| B3 | `artifact-store.test.ts` | ✅ Done | Hash integrity + path traversal + nested dirs. |
|
|
20
|
-
| B4 | lock parity test | ✅ Done | 2 new tests: stale recovery sync+async, active lock throws. |
|
|
21
|
-
| B5 | setup-hook env filter | ⚠️ Partial | `sanitizeEnvSecrets` applied. Uses a deny-list `SECRET_KEY_PATTERN` instead of the allow-list proposed in the plan. |
|
|
22
|
-
| B6 | worktree checked-out hint | ✅ Done | try/catch + actionable error message. |
|
|
23
|
-
| B7 | LAZY marker | ✅ Done | Marker at `team-tool.ts:58`. |
|
|
24
|
-
| B8 | redaction roundtrip | ✅ Done | 3 tests (api_key, bearer, on-disk). |
|
|
25
|
-
| B9 | CI grep-check | ❌ Broken on Windows | Script uses `sed`, fails on Windows. |
|
|
26
|
-
| A1 | branchExists remote-tracking | ✅ Done | Returns `{ local, remoteOnly }`. |
|
|
27
|
-
| A2 | jiti fallback robust | ✅ Done | 3 candidates: `lib/jiti-register.mjs`, `register.mjs`, `dist/register.mjs`. |
|
|
28
|
-
| A3 | test alias cleanup | ⏭️ Skipped | Plan noted "not urgent". |
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Issues to address next
|
|
33
|
-
|
|
34
|
-
### C1 — (Medium, ~10 minutes) `scripts/check-lazy-imports.mjs` doesn't run on Windows
|
|
35
|
-
|
|
36
|
-
**File:** `scripts/check-lazy-imports.mjs`
|
|
37
|
-
|
|
38
|
-
**Problem:**
|
|
39
|
-
- The script uses `execSync("sed -n '...' ...")` to read the preceding line → `sed` isn't available on Windows by default.
|
|
40
|
-
- When sed fails, every line falls into the `catch` block → `bad.push(line)` → 13 false positives.
|
|
41
|
-
- `npm run ci` will always fail on a Windows dev machine.
|
|
42
|
-
|
|
43
|
-
**Proposed fix:** use plain Node instead of sed.
|
|
44
|
-
|
|
45
|
-
```js
|
|
46
|
-
import { execSync } from "node:child_process";
|
|
47
|
-
import { readFileSync } from "node:fs";
|
|
48
|
-
|
|
49
|
-
const out = execSync(`git grep -nE "await import\\(" -- "src/**/*.ts"`, { encoding: "utf-8" });
|
|
50
|
-
const bad = [];
|
|
51
|
-
const fileCache = new Map();
|
|
52
|
-
|
|
53
|
-
for (const line of out.split("\n").filter(Boolean)) {
|
|
54
|
-
if (line.includes("// LAZY:")) continue;
|
|
55
|
-
const m = line.match(/^([^:]+):(\d+):/);
|
|
56
|
-
if (!m) continue;
|
|
57
|
-
const [, file, lineNum] = m;
|
|
58
|
-
if (!fileCache.has(file)) fileCache.set(file, readFileSync(file, "utf-8").split(/\r?\n/));
|
|
59
|
-
const lines = fileCache.get(file);
|
|
60
|
-
const prevLine = lines[Number(lineNum) - 2] ?? "";
|
|
61
|
-
if (!prevLine.includes("// LAZY:")) bad.push(line);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (bad.length) {
|
|
65
|
-
console.error("Dynamic imports without `// LAZY:` marker:\n" + bad.join("\n"));
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
console.log("All dynamic imports have `// LAZY:` marker.");
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Test:** run `npm run check:lazy-imports` on both Linux and Windows → both should print "All dynamic imports have `// LAZY:` marker."
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
### C2 — (Medium, ~20 minutes) `sanitizeEnvSecrets` uses a deny-list, not meeting the defense-in-depth goal of plan B5
|
|
76
|
-
|
|
77
|
-
**File:** `src/utils/env-filter.ts`
|
|
78
|
-
|
|
79
|
-
**Current state:**
|
|
80
|
-
```ts
|
|
81
|
-
export function sanitizeEnvSecrets(env: NodeJS.ProcessEnv): Record<string, string> {
|
|
82
|
-
const filtered: Record<string, string> = {};
|
|
83
|
-
for (const [key, value] of Object.entries(env)) {
|
|
84
|
-
if (value !== undefined && !SECRET_KEY_PATTERN.test(key)) filtered[key] = value;
|
|
85
|
-
}
|
|
86
|
-
return filtered;
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Problem:**
|
|
91
|
-
- The deny-list only blocks keys matching `SECRET_KEY_PATTERN`. Variables whose names don't match (e.g. `DB_PASS`, `MY_KEY_FOO`, `INTERNAL_TOKEN_LEGACY`) will leak into the setup hook.
|
|
92
|
-
- The original plan B5 proposed an allow-list `["PATH", "HOME", "USERPROFILE", "TEMP", "TMP", "LANG", "PI_*"]` → much safer for user-provided hooks.
|
|
93
|
-
|
|
94
|
-
**Proposed fix:** add an overload with an allow-list, keeping the deny-list as the default for `buildChildPiSpawnOptions` (backward-compat).
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
export interface SanitizeOptions {
|
|
98
|
-
allowList?: string[]; // glob-like, supports trailing * (e.g. "PI_*")
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export function sanitizeEnvSecrets(env: NodeJS.ProcessEnv, options?: SanitizeOptions): Record<string, string> {
|
|
102
|
-
const filtered: Record<string, string> = {};
|
|
103
|
-
if (options?.allowList && options.allowList.length > 0) {
|
|
104
|
-
const matchers = options.allowList.map((p) => {
|
|
105
|
-
if (p.endsWith("*")) return (k: string) => k.startsWith(p.slice(0, -1));
|
|
106
|
-
return (k: string) => k === p;
|
|
107
|
-
});
|
|
108
|
-
for (const [key, value] of Object.entries(env)) {
|
|
109
|
-
if (value !== undefined && matchers.some((fn) => fn(key))) filtered[key] = value;
|
|
110
|
-
}
|
|
111
|
-
return filtered;
|
|
112
|
-
}
|
|
113
|
-
for (const [key, value] of Object.entries(env)) {
|
|
114
|
-
if (value !== undefined && !SECRET_KEY_PATTERN.test(key)) filtered[key] = value;
|
|
115
|
-
}
|
|
116
|
-
return filtered;
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Apply at `worktree-manager.ts:runSetupHook`:**
|
|
121
|
-
|
|
122
|
-
```ts
|
|
123
|
-
env: sanitizeEnvSecrets(process.env, {
|
|
124
|
-
allowList: ["PATH", "HOME", "USERPROFILE", "TEMP", "TMP", "TMPDIR", "LANG", "LC_ALL", "PI_*"],
|
|
125
|
-
}),
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**Tests to add:** `test/unit/env-filter.test.ts`:
|
|
129
|
-
- Allow-list pass-through for matching keys + reject the rest.
|
|
130
|
-
- Glob `PI_*` matches `PI_HOME`, `PI_CREW_X` but not `PIPELINE`.
|
|
131
|
-
- Default deny-list keeps old behavior.
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
### C3 — (Low, ~10 minutes) `resolveShellForScript` doesn't handle `.cmd/.bat` correctly on Windows
|
|
136
|
-
|
|
137
|
-
**File:** `src/utils/resolve-shell.ts`
|
|
138
|
-
|
|
139
|
-
**Current state:**
|
|
140
|
-
```ts
|
|
141
|
-
if (scriptPath.endsWith(".cmd") || scriptPath.endsWith(".bat")) {
|
|
142
|
-
return { command: scriptPath, args: [] };
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**Problem:**
|
|
147
|
-
- Node ≥ 20 blocks spawning `.bat/.cmd` directly without `shell: true` (CVE-2024-27980). The `execFileSync/spawn` code path will throw `EINVAL` or `ENOENT`.
|
|
148
|
-
- Consequence: post-check / iteration-hook written as `.cmd/.bat` will fail silently on Node 20+.
|
|
149
|
-
|
|
150
|
-
**Proposed fix:**
|
|
151
|
-
```ts
|
|
152
|
-
if (scriptPath.endsWith(".cmd") || scriptPath.endsWith(".bat")) {
|
|
153
|
-
return { command: process.env.ComSpec ?? "cmd.exe", args: ["/d", "/s", "/c", scriptPath] };
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
**Tests to add:** in `test/unit/resolve-shell.test.ts` (create new):
|
|
158
|
-
- Linux: `.sh` → `{ bash, [path] }`.
|
|
159
|
-
- Windows + `.ps1` → `{ powershell, ["-File", path] }`.
|
|
160
|
-
- Windows + `.cmd` → `{ cmd.exe, ["/d", "/s", "/c", path] }`.
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
### C4 — (Low, ~15 minutes) Missing test for `linkNodeModulesIfPresent` rejecting a file source (BUG-006 regression guard)
|
|
165
|
-
|
|
166
|
-
**File:** `test/unit/worktree-manager.test.ts`
|
|
167
|
-
|
|
168
|
-
**Problem:**
|
|
169
|
-
- Plan B2 required this test but the commit didn't add it. If someone modifies `linkNodeModulesIfPresent` and removes the `isDirectory()` check, BUG-006 will regress without a test catching it.
|
|
170
|
-
|
|
171
|
-
**Proposed fix:** add one test (assuming `linkNodeModulesIfPresent` is exported or tested indirectly via `prepareTaskWorkspace` with `worktree.linkNodeModules=true`):
|
|
172
|
-
|
|
173
|
-
```ts
|
|
174
|
-
test("prepareTaskWorkspace skips linkNodeModules when source is a file", () => {
|
|
175
|
-
const repo = fs.mkdtempSync(path.join(os.tmpdir(), "pi-crew-wt-fn-"));
|
|
176
|
-
initGitRepo(repo);
|
|
177
|
-
// Place a FILE at node_modules instead of a directory
|
|
178
|
-
fs.writeFileSync(path.join(repo, "node_modules"), "not a dir", "utf-8");
|
|
179
|
-
// Write project config to enable linkNodeModules
|
|
180
|
-
const cfgDir = path.join(repo, ".crew");
|
|
181
|
-
fs.mkdirSync(cfgDir, { recursive: true });
|
|
182
|
-
fs.writeFileSync(path.join(cfgDir, "config.json"), JSON.stringify({
|
|
183
|
-
worktree: { linkNodeModules: true },
|
|
184
|
-
}), "utf-8");
|
|
185
|
-
const manifest = minimalManifest(repo, "run-fn");
|
|
186
|
-
const task = minimalTask("task-fn", repo);
|
|
187
|
-
const result = prepareTaskWorkspace(manifest, task);
|
|
188
|
-
assert.equal(result.nodeModulesLinked, false);
|
|
189
|
-
fs.rmSync(repo, { recursive: true, force: true });
|
|
190
|
-
});
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
### C5 — (Low, ~5 minutes) `prepareTaskWorkspace` error message affected by locale
|
|
196
|
-
|
|
197
|
-
**File:** `src/worktree/worktree-manager.ts:127-140` (try/catch around `worktree add`)
|
|
198
|
-
|
|
199
|
-
**Problem:**
|
|
200
|
-
- The regex `/already checked out/` only matches when git runs with an English locale. On a user machine with `LANG=vi_VN` or Git for Windows with a different locale, the original message differs → falls back to throwing the raw error.
|
|
201
|
-
|
|
202
|
-
**Proposed fix:** force an English locale for the internal git command, or broaden the regex.
|
|
203
|
-
|
|
204
|
-
Option A (simpler): broaden the regex
|
|
205
|
-
```ts
|
|
206
|
-
if (/already checked out|is already used by worktree/i.test(msg)) { ... }
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
Option B (recommended): force `LANG=C` in the `git()` helper:
|
|
210
|
-
```ts
|
|
211
|
-
function git(cwd: string, args: string[]): string {
|
|
212
|
-
return execFileSync("git", args, {
|
|
213
|
-
cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"],
|
|
214
|
-
env: { ...process.env, LANG: "C", LC_ALL: "C" },
|
|
215
|
-
}).trim();
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
Option B standardizes all git output → also improves debugging.
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
### C6 — (Info, ~5 minutes) `branchExists` remote-only creates local from HEAD, may "lose" the remote's commits
|
|
224
|
-
|
|
225
|
-
**File:** `src/worktree/worktree-manager.ts:prepareTaskWorkspace`
|
|
226
|
-
|
|
227
|
-
**Current state:**
|
|
228
|
-
```ts
|
|
229
|
-
if (exists.local) {
|
|
230
|
-
git(repoRoot, ["worktree", "add", worktreePath, branch]);
|
|
231
|
-
} else {
|
|
232
|
-
git(repoRoot, ["worktree", "add", "-b", branch, worktreePath, "HEAD"]); // ← both remoteOnly and "doesn't exist" fall here
|
|
233
|
-
}
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
**Problem:**
|
|
237
|
-
- When `remoteOnly === true`, plan A1 proposed creating local from HEAD to avoid divergent tracking. The current code does exactly that, but:
|
|
238
|
-
- The user pushed the branch from another machine → expects the worktree to contain that code.
|
|
239
|
-
- There's no log/warning → silent drop.
|
|
240
|
-
|
|
241
|
-
**Proposed fix:** emit an info event/log when hitting the remoteOnly branch:
|
|
242
|
-
```ts
|
|
243
|
-
} else {
|
|
244
|
-
if (exists.remoteOnly) {
|
|
245
|
-
logInternalError("worktree.branchRemoteOnly", new Error(`Branch '${branch}' exists only on remote; creating local from HEAD instead of tracking remote.`), `branch=${branch}`);
|
|
246
|
-
}
|
|
247
|
-
git(repoRoot, ["worktree", "add", "-b", branch, worktreePath, "HEAD"]);
|
|
248
|
-
}
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
(Or push it out via a run event if there's a convenient event bus.)
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
## Implementation priority
|
|
256
|
-
|
|
257
|
-
| # | Item | Severity | Effort | Recommendation |
|
|
258
|
-
|---|---|---|---|---|
|
|
259
|
-
| 1 | C1 (lazy-imports cross-platform) | Medium | 10 minutes | Current sprint — block CI failure on Windows |
|
|
260
|
-
| 2 | C2 (allow-list env filter) | Medium | 20 minutes | Current sprint — defense-in-depth |
|
|
261
|
-
| 3 | C3 (.cmd/.bat on Node 20+) | Low | 10 minutes | Current sprint — ensure B1 is truly portable |
|
|
262
|
-
| 4 | C4 (test linkNodeModules file source) | Low | 15 minutes | Current sprint — close B2's regression gap |
|
|
263
|
-
| 5 | C5 (git locale-safe error parsing) | Low | 5 minutes | Next sprint |
|
|
264
|
-
| 6 | C6 (warn on remote-only branch) | Info | 5 minutes | Next sprint |
|
|
265
|
-
|
|
266
|
-
**Total effort:** ~65 minutes for the hardening batch.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Proposed commit batches
|
|
271
|
-
|
|
272
|
-
- **Batch 1 (must-fix CI):** C1 + C3 → 1 PR "scripts/cmd portability fix" (~20 minutes).
|
|
273
|
-
- **Batch 2 (security/test):** C2 + C4 → 1 PR "env allow-list + worktree regression test" (~35 minutes).
|
|
274
|
-
- **Batch 3 (polish):** C5 + C6 → 1 PR "git locale + remote-only branch hint" (~10 minutes).
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
## Positive notes after round 3 review
|
|
279
|
-
|
|
280
|
-
- The 8 previously failing bash-on-Windows tests now pass 100%.
|
|
281
|
-
- The DRY refactor of `sanitizeEnvSecrets` (extracted from `child-pi.ts`) is good.
|
|
282
|
-
- The `worktree-manager` resume logic + actionable error is very helpful for UX.
|
|
283
|
-
- The lock parity test covers both sync/async paths (exactly the BUG-004 goal).
|
|
284
|
-
- The artifact hash test correctly verifies the invariant `sha256(file) == contentHash`.
|
|
285
|
-
- `resolveJitiRegisterPath` now tolerates various jiti packaging layouts.
|
|
286
|
-
- The `branchExists` upgrade to `{local, remoteOnly}` is accurate per plan A1.
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
## Verification
|
|
291
|
-
|
|
292
|
-
```
|
|
293
|
-
npm run typecheck → Passed
|
|
294
|
-
npm run check:lazy-imports → Fails on Windows (sed not found)
|
|
295
|
-
npm run test:unit → 1411 tests, 1408 pass, 0 fail, 3 skip (227s)
|
|
296
|
-
git show 926e6ee --stat → 16 files changed, 797(+) 22(-)
|
|
297
|
-
```
|
package/docs/goals.md
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# Goal Loops (`team action='goal')
|
|
2
|
-
|
|
3
|
-
pi-crew v0.9.0 introduces an autonomous goal loop, modeled on Claude Code's `/goal`.
|
|
4
|
-
|
|
5
|
-
## What it does
|
|
6
|
-
|
|
7
|
-
A goal loop turns a single objective into a long-running, self-directed multi-turn
|
|
8
|
-
process:
|
|
9
|
-
|
|
10
|
-
1. A **worker** agent does one turn of work (`executeTeamRun`).
|
|
11
|
-
2. A separate **evaluator** model (the "goal-judge") reads the turn's transcript +
|
|
12
|
-
tool calls + verification results and returns a verdict:
|
|
13
|
-
`{ achieved: bool, reason: string, evidenceRefs?: string[] }`.
|
|
14
|
-
3. If **not achieved**, the `reason` is prepended to the next turn's prompt and the
|
|
15
|
-
loop continues.
|
|
16
|
-
4. Stops on: `achieved` / `maxTurns` reached / `budgetAbort` exceeded / `BLOCKED:` /
|
|
17
|
-
user `stop`.
|
|
18
|
-
|
|
19
|
-
## Usage
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
team action='goal', config.subAction='start',
|
|
23
|
-
config.objective='Migrate src/auth from JS to TS. Done when tsc --noEmit=0 and test/auth passes.',
|
|
24
|
-
config.evaluatorModel='haiku',
|
|
25
|
-
config.maxTurns=20,
|
|
26
|
-
budgetTotal=500000
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Sub-actions: `start | status | pause | resume | stop | step | clear`.
|
|
30
|
-
|
|
31
|
-
Slash command: `/team-goal start --objective='...' --evaluatorModel='...'`
|
|
32
|
-
|
|
33
|
-
## Design notes (see `research-findings/goal-workflow/`)
|
|
34
|
-
|
|
35
|
-
- **One manifest per turn** — `TEAM_RUN_STATUS_TRANSITIONS` + `shouldMergeTaskUpdate`
|
|
36
|
-
block re-driving a terminal manifest, so each turn is a fresh `createRunManifest`.
|
|
37
|
-
The goal loop owns OUTER state in `GoalLoopState` at
|
|
38
|
-
`<crewRoot>/state/goals/<goalId>.json`.
|
|
39
|
-
- **Feedback via `manifest.goal`** — the verdict's `reason` is composed into the next
|
|
40
|
-
turn's `manifest.goal` (re-read lazily each render). `session.steer` is NOT used
|
|
41
|
-
(it's a no-op for child-process runs).
|
|
42
|
-
- **Budget via `collectRunMetrics`** — `budgetUsed = Σ over turns of collectRunMetrics(cwd, turnRunId).totalTokens`.
|
|
43
|
-
(`loadRunMetrics`/`saveRunMetrics` have 0 callers — do not use.)
|
|
44
|
-
- **Judge lockdown** — the synthesized `goal-judge` AgentConfig sets `disableTools:true`
|
|
45
|
-
(Pi `--no-tools`), `excludeTools:[bash,read,write,edit]`, `inheritContext:false`,
|
|
46
|
-
`excludeContextBash:true`, `parentContext:undefined`, `maxTurns:1`. An empty
|
|
47
|
-
`tools:[]` is INSUFFICIENT because `pi-args.ts` skips empty arrays.
|
|
48
|
-
- **Trust boundary** — the judge is capability-locked (no agency, only emits a verdict).
|
|
49
|
-
|
|
50
|
-
## Background spawn
|
|
51
|
-
|
|
52
|
-
The loop runs in the background via `runKind:'goal-loop'` (background-runner.ts
|
|
53
|
-
dispatch). The handler `handleGoal('start')` writes the `GoalLoopState`; the
|
|
54
|
-
background process calls `runGoalLoop` which loops `executeTeamRun` per turn.
|
|
55
|
-
|
|
56
|
-
## Hooks
|
|
57
|
-
|
|
58
|
-
- `before_goal_step` — fires before each turn.
|
|
59
|
-
- `before_goal_abort` — fires before a budget/maxTurns abort.
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
# Implementation Plan: Top 3 Features from oh-my-pi v15
|
|
2
|
-
|
|
3
|
-
> Date: 2026-05-13
|
|
4
|
-
> Based on: `D:/my/my_project/source/oh-my-pi` research
|
|
5
|
-
> Target: pi-crew v0.2.x
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Priority Order
|
|
10
|
-
|
|
11
|
-
1. **Typed Crew Errors** — Quick win, no dependencies
|
|
12
|
-
2. **Conflict Detection** — High value, standalone module
|
|
13
|
-
3. **Issue-PR Protocol** — Medium complexity, GitHub integration
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 1. Typed Crew Errors
|
|
18
|
-
|
|
19
|
-
### Why
|
|
20
|
-
Current pi-crew uses generic `Error` types with string matching:
|
|
21
|
-
```typescript
|
|
22
|
-
catch (e) {
|
|
23
|
-
if (e instanceof Error && e.message.includes("deadletter")) { ... }
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Pattern from oh-my-pi: use typed sentinel errors with `instanceof` discrimination.
|
|
28
|
-
|
|
29
|
-
### Files to create/modify
|
|
30
|
-
|
|
31
|
-
**Create:** `src/runtime/errors/crew-errors.ts`
|
|
32
|
-
|
|
33
|
-
```typescript
|
|
34
|
-
/**
|
|
35
|
-
* Typed error sentinels for pi-crew operations.
|
|
36
|
-
* Follows oh-my-pi pattern from compaction/errors.ts.
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
export class CrewCancelledError extends Error {
|
|
40
|
-
readonly name = "CrewCancelledError" as const;
|
|
41
|
-
constructor(message = "Crew run cancelled") { super(message); }
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export class CrewTimeoutError extends Error {
|
|
45
|
-
readonly name = "CrewTimeoutError" as const;
|
|
46
|
-
constructor(public readonly maxDurationMs: number) {
|
|
47
|
-
super(`Crew run exceeded timeout of ${maxDurationMs}ms`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export class CrewDeadletterError extends Error {
|
|
52
|
-
readonly name = "CrewDeadletterError" as const;
|
|
53
|
-
constructor(
|
|
54
|
-
public readonly agentId: string,
|
|
55
|
-
public readonly reason: string,
|
|
56
|
-
) {
|
|
57
|
-
super(`Agent ${agentId} deadlettered: ${reason}`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export class CrewAbortError extends Error {
|
|
62
|
-
readonly name = "CrewAbortError" as const;
|
|
63
|
-
constructor(message = "Crew run aborted") { super(message); }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export class CrewManifestError extends Error {
|
|
67
|
-
readonly name = "CrewManifestError" as const;
|
|
68
|
-
constructor(message: string, public readonly runId?: string) { super(message); }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export class CrewLockError extends Error {
|
|
72
|
-
readonly name = "CrewLockError" as const;
|
|
73
|
-
constructor(message: string, public readonly lockPath?: string) { super(message); }
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Outcome of a crew run attempt.
|
|
78
|
-
* Used by RunTracker and HealthWatcher.
|
|
79
|
-
*/
|
|
80
|
-
export type CrewRunOutcome = "ok" | "cancelled" | "deadletter" | "failed" | "timeout" | "aborted";
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Update:** `src/runtime/task-runner.ts`, `src/runtime/team-runner.ts`, `src/runtime/crash-recovery.ts`
|
|
84
|
-
|
|
85
|
-
Replace string matching with `instanceof` checks.
|
|
86
|
-
|
|
87
|
-
### Implementation
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
# 1. Create file
|
|
91
|
-
cat > src/runtime/errors/crew-errors.ts << 'EOF'
|
|
92
|
-
// (content above)
|
|
93
|
-
EOF
|
|
94
|
-
|
|
95
|
-
# 2. Update imports in affected files
|
|
96
|
-
# From: catch (e) { if (e instanceof Error && e.message.includes("deadletter")) ... }
|
|
97
|
-
# To: catch (e) { if (e instanceof CrewDeadletterError) ... }
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Effort: LOW (1-2 hours)
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## 2. Conflict Detection
|
|
105
|
-
|
|
106
|
-
### Why
|
|
107
|
-
When multiple pi-crew agents edit the same file in a worktree, git merge conflicts can occur. Current pi-crew has no conflict detection — agents see garbled `<<<<<<< HEAD` markers with no structured way to resolve them.
|
|
108
|
-
|
|
109
|
-
### Architecture
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
pi-crew worktree agents edit files
|
|
113
|
-
↓
|
|
114
|
-
WorktreeManager detects file change
|
|
115
|
-
↓
|
|
116
|
-
ConflictDetector.scanFileForConflicts(path)
|
|
117
|
-
↓
|
|
118
|
-
Returns ConflictBlock[] + registers in ConflictHistory
|
|
119
|
-
↓
|
|
120
|
-
Read tool appends conflict warning footer
|
|
121
|
-
↓
|
|
122
|
-
Agent calls write({ path: "conflict://<id>", content })
|
|
123
|
-
↓
|
|
124
|
-
ConflictResolver.spliceConflict() → clean file
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Files to create
|
|
128
|
-
|
|
129
|
-
**Create:** `src/utils/conflict-detect.ts` (fork from oh-my-pi, ~400 lines)
|
|
130
|
-
|
|
131
|
-
Key exports:
|
|
132
|
-
- `scanConflictLines(lines, firstLineNumber)` → `ConflictBlock[]`
|
|
133
|
-
- `scanFileForConflicts(path)` → `{ blocks, scanTruncated }`
|
|
134
|
-
- `ConflictHistory` class
|
|
135
|
-
- `ConflictEntry` interface
|
|
136
|
-
- `parseConflictUri(raw)` → `ParsedConflictUri | null`
|
|
137
|
-
- `spliceConflict(text, entry, replacement)` → `string`
|
|
138
|
-
- `expandContentTokens(content, entry)` → `string` (handles @ours/@theirs/@base/@both)
|
|
139
|
-
- `renderConflictRegion(entry, scope)` → `{ lines, startLine }`
|
|
140
|
-
- `formatConflictWarning(entries)` → `string`
|
|
141
|
-
|
|
142
|
-
**Create:** `src/runtime/conflict-registry.ts`
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
/**
|
|
146
|
-
* Global conflict registry for pi-crew.
|
|
147
|
-
* Attaches ConflictHistory to each live session.
|
|
148
|
-
*/
|
|
149
|
-
import { ConflictHistory, getConflictHistory } from "../utils/conflict-detect.ts";
|
|
150
|
-
import type { LiveAgentHandle } from "./live-agent-manager.ts";
|
|
151
|
-
|
|
152
|
-
export function getAgentConflicts(handle: LiveAgentHandle): ConflictHistory {
|
|
153
|
-
if (!handle.conflictHistory) {
|
|
154
|
-
handle.conflictHistory = new ConflictHistory();
|
|
155
|
-
}
|
|
156
|
-
return handle.conflictHistory;
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Modify:** `src/extension/registration/tools/read-tool.ts`
|
|
161
|
-
|
|
162
|
-
After reading file content:
|
|
163
|
-
1. Call `scanConflictLines(lines, 1)`
|
|
164
|
-
2. For each block, call `conflictHistory.register(...)`
|
|
165
|
-
3. Append `formatConflictWarning(entries)` to output
|
|
166
|
-
|
|
167
|
-
**Modify:** `src/extension/registration/tools/write-tool.ts`
|
|
168
|
-
|
|
169
|
-
Add `conflict://<N>` handling:
|
|
170
|
-
1. Parse URI with `parseConflictUri(path)`
|
|
171
|
-
2. Look up `ConflictEntry` from `ConflictHistory`
|
|
172
|
-
3. Call `expandContentTokens(content, entry)`
|
|
173
|
-
4. Call `spliceConflict(originalText, entry, expandedContent)`
|
|
174
|
-
5. Write result to `entry.absolutePath`
|
|
175
|
-
|
|
176
|
-
### Integration points
|
|
177
|
-
|
|
178
|
-
| File | Change |
|
|
179
|
-
|------|--------|
|
|
180
|
-
| `src/extension/registration/tools/read-tool.ts` | Append conflict warning to file content |
|
|
181
|
-
| `src/extension/registration/tools/write-tool.ts` | Handle `conflict://` protocol |
|
|
182
|
-
| `src/runtime/live-agent-manager.ts` | Add `conflictHistory?: ConflictHistory` to handle |
|
|
183
|
-
| `src/utils/conflict-detect.ts` | New file (fork from oh-my-pi) |
|
|
184
|
-
| `src/runtime/conflict-registry.ts` | New file (global registry) |
|
|
185
|
-
|
|
186
|
-
### Edge cases to handle
|
|
187
|
-
|
|
188
|
-
1. **Nested conflicts** — oh-my-pi handles by requiring strict marker shape
|
|
189
|
-
2. **Multi-file conflicts** — `ConflictHistory.invalidatePath()` when file is resolved
|
|
190
|
-
3. **Retry after partial resolution** — `ConflictEntry` id stays stable
|
|
191
|
-
4. **Large files** — `scanFileForConflicts` caps at 10MB
|
|
192
|
-
5. **Diff3 conflicts** — Support `|||||||` base section
|
|
193
|
-
|
|
194
|
-
### Test plan
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
// test/unit/conflict-detect.test.ts
|
|
198
|
-
test("scanConflictLines detects single 2-way block", () => {
|
|
199
|
-
const lines = ["<<<<<<< HEAD", "our changes", "=======", "their changes", ">>>>>>> feature"];
|
|
200
|
-
const blocks = scanConflictLines(lines, 1);
|
|
201
|
-
assert(blocks.length === 1);
|
|
202
|
-
assert(blocks[0].oursLines[0] === "our changes");
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
test("scanConflictLines ignores non-column-0 markers", () => {
|
|
206
|
-
const lines = [" <<<<<<< indented", "=======", ">>>>>>>"];
|
|
207
|
-
const blocks = scanConflictLines(lines, 1);
|
|
208
|
-
assert(blocks.length === 0);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
test("scanConflictLines detects diff3 3-way block", () => {
|
|
212
|
-
// ...with ||||||| base marker
|
|
213
|
-
});
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Effort: MEDIUM (4-8 hours)
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## 3. Issue-PR Protocol
|
|
221
|
-
|
|
222
|
-
### Why
|
|
223
|
-
pi-crew workflow agents can benefit from issue/PR integration:
|
|
224
|
-
- Create issue from failed task
|
|
225
|
-
- Link workflow tasks to GitHub issues
|
|
226
|
-
- PR review workflow (`pr://` protocol)
|
|
227
|
-
|
|
228
|
-
### URL shapes to support
|
|
229
|
-
|
|
230
|
-
```
|
|
231
|
-
issue:// — list recent issues (default repo from cwd)
|
|
232
|
-
issue://owner/repo — list issues for repo
|
|
233
|
-
issue://123 — single issue (repo from cwd)
|
|
234
|
-
issue://owner/repo/123 — fully qualified
|
|
235
|
-
issue://owner/repo/123?comments=0 — suppress comments
|
|
236
|
-
|
|
237
|
-
pr:// — list recent PRs
|
|
238
|
-
pr://owner/repo — list PRs for repo
|
|
239
|
-
pr://owner/repo/456 — single PR
|
|
240
|
-
pr://owner/repo/456/diff — PR diff
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### Files to create/modify
|
|
244
|
-
|
|
245
|
-
**Create:** `src/internal-urls/issue-pr-protocol.ts` (port from oh-my-pi, ~577 lines)
|
|
246
|
-
|
|
247
|
-
Key exports:
|
|
248
|
-
- `IssuePrProtocol` class implementing `ProtocolHandler`
|
|
249
|
-
- `parseIssueUrl(url)` → `ParsedIssue`
|
|
250
|
-
- `parsePrUrl(url)` → `ParsedPr`
|
|
251
|
-
- `fetchIssue(parsed)` → `string` (markdown)
|
|
252
|
-
- `fetchPr(parsed)` → `string` (markdown)
|
|
253
|
-
- `fetchPrDiff(parsed)` → `string` (unified diff)
|
|
254
|
-
|
|
255
|
-
**Modify:** `src/internal-urls/router.ts`
|
|
256
|
-
|
|
257
|
-
Register `issue://` and `pr://` handlers.
|
|
258
|
-
|
|
259
|
-
**Create:** `src/tools/gh-cache.ts` (fork from oh-my-pi `tools/github-cache.ts`)
|
|
260
|
-
|
|
261
|
-
SQLite-backed cache for GitHub API responses. Shared across sessions.
|
|
262
|
-
|
|
263
|
-
### Dependencies
|
|
264
|
-
|
|
265
|
-
1. **GitHub CLI (`gh`)** — oh-my-pi uses `gh issue list`, `gh pr list`, `gh api`
|
|
266
|
-
2. **SQLite** — via `better-sqlite3` or similar
|
|
267
|
-
3. **Git config** — Need to resolve default repo from `git remote get-url origin`
|
|
268
|
-
|
|
269
|
-
### Implementation details
|
|
270
|
-
|
|
271
|
-
```typescript
|
|
272
|
-
interface ParsedIssue {
|
|
273
|
-
kind: "single" | "list";
|
|
274
|
-
repo?: string; // undefined = derive from cwd
|
|
275
|
-
number?: number;
|
|
276
|
-
state?: "open" | "closed" | "all";
|
|
277
|
-
limit?: number;
|
|
278
|
-
comments?: boolean;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
interface ParsedPr {
|
|
282
|
-
kind: "single" | "list" | "diff";
|
|
283
|
-
repo?: string;
|
|
284
|
-
number?: number;
|
|
285
|
-
state?: "open" | "closed" | "merged" | "all";
|
|
286
|
-
limit?: number;
|
|
287
|
-
diffMode?: "list" | "all";
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
**Fetching:**
|
|
292
|
-
- List: `gh issue list --repo owner/repo --state open --limit 30`
|
|
293
|
-
- Single: `gh issue view 123 --repo owner/repo --comments`
|
|
294
|
-
- PR: `gh pr view 456 --repo owner/repo --comments`
|
|
295
|
-
- Diff: `gh pr diff 456 --repo owner/repo`
|
|
296
|
-
|
|
297
|
-
**Caching:**
|
|
298
|
-
- Cache key: `{repo, number, type}` hash
|
|
299
|
-
- TTL: 5 minutes for list, 1 hour for single items
|
|
300
|
-
- Invalidate on write operations (create/close/reopen)
|
|
301
|
-
|
|
302
|
-
### Integration with pi-crew
|
|
303
|
-
|
|
304
|
-
**New tool:** `read-issue` / `read-pr`
|
|
305
|
-
```typescript
|
|
306
|
-
// agents can call:
|
|
307
|
-
// read({ path: "issue://123" }) → markdown of the issue
|
|
308
|
-
// read({ path: "pr://456" }) → markdown of the PR
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**New slash command:** `/issue` or use the existing `/crew`:
|
|
312
|
-
```
|
|
313
|
-
/crew create-issue "Task failed: fix memory leak in cache" --labels=bug --assignee=me
|
|
314
|
-
/crew link-issue TICKET-123 --task=explorer-1
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Effort: MEDIUM-HIGH (8-12 hours)
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
## Summary
|
|
322
|
-
|
|
323
|
-
| Feature | Effort | Risk | Priority |
|
|
324
|
-
|---------|--------|------|----------|
|
|
325
|
-
| Typed Crew Errors | LOW | None | 1 |
|
|
326
|
-
| Conflict Detection | MEDIUM | Git operations, large file handling | 2 |
|
|
327
|
-
| Issue-PR Protocol | MEDIUM-HIGH | GitHub auth, gh CLI dependency | 3 |
|
|
328
|
-
|
|
329
|
-
## Recommended execution order
|
|
330
|
-
|
|
331
|
-
1. **Day 1:** Typed Crew Errors (quick win)
|
|
332
|
-
2. **Day 2-3:** Conflict Detection
|
|
333
|
-
3. **Day 4-5:** Issue-PR Protocol (if time permits)
|