@urateam/core 0.1.0
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/dist/__tests__/assembler.test.d.ts +2 -0
- package/dist/__tests__/assembler.test.d.ts.map +1 -0
- package/dist/__tests__/assembler.test.js +63 -0
- package/dist/__tests__/assembler.test.js.map +1 -0
- package/dist/__tests__/auth-check.test.d.ts +2 -0
- package/dist/__tests__/auth-check.test.d.ts.map +1 -0
- package/dist/__tests__/auth-check.test.js +88 -0
- package/dist/__tests__/auth-check.test.js.map +1 -0
- package/dist/__tests__/auto-merge.test.d.ts +15 -0
- package/dist/__tests__/auto-merge.test.d.ts.map +1 -0
- package/dist/__tests__/auto-merge.test.js +428 -0
- package/dist/__tests__/auto-merge.test.js.map +1 -0
- package/dist/__tests__/bec89-unified-schema.test.d.ts +2 -0
- package/dist/__tests__/bec89-unified-schema.test.d.ts.map +1 -0
- package/dist/__tests__/bec89-unified-schema.test.js +235 -0
- package/dist/__tests__/bec89-unified-schema.test.js.map +1 -0
- package/dist/__tests__/conflict-detector.test.d.ts +2 -0
- package/dist/__tests__/conflict-detector.test.d.ts.map +1 -0
- package/dist/__tests__/conflict-detector.test.js +206 -0
- package/dist/__tests__/conflict-detector.test.js.map +1 -0
- package/dist/__tests__/coordination.test.d.ts +2 -0
- package/dist/__tests__/coordination.test.d.ts.map +1 -0
- package/dist/__tests__/coordination.test.js +257 -0
- package/dist/__tests__/coordination.test.js.map +1 -0
- package/dist/__tests__/db-postgres.test.d.ts +14 -0
- package/dist/__tests__/db-postgres.test.d.ts.map +1 -0
- package/dist/__tests__/db-postgres.test.js +289 -0
- package/dist/__tests__/db-postgres.test.js.map +1 -0
- package/dist/__tests__/db.test.d.ts +2 -0
- package/dist/__tests__/db.test.d.ts.map +1 -0
- package/dist/__tests__/db.test.js +182 -0
- package/dist/__tests__/db.test.js.map +1 -0
- package/dist/__tests__/deep-review.test.d.ts +2 -0
- package/dist/__tests__/deep-review.test.d.ts.map +1 -0
- package/dist/__tests__/deep-review.test.js +322 -0
- package/dist/__tests__/deep-review.test.js.map +1 -0
- package/dist/__tests__/devcontainer.test.d.ts +2 -0
- package/dist/__tests__/devcontainer.test.d.ts.map +1 -0
- package/dist/__tests__/devcontainer.test.js +89 -0
- package/dist/__tests__/devcontainer.test.js.map +1 -0
- package/dist/__tests__/distributed-lock.test.d.ts +18 -0
- package/dist/__tests__/distributed-lock.test.d.ts.map +1 -0
- package/dist/__tests__/distributed-lock.test.js +237 -0
- package/dist/__tests__/distributed-lock.test.js.map +1 -0
- package/dist/__tests__/e2e-pipeline.test.d.ts +25 -0
- package/dist/__tests__/e2e-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/e2e-pipeline.test.js +517 -0
- package/dist/__tests__/e2e-pipeline.test.js.map +1 -0
- package/dist/__tests__/error-classifier.test.d.ts +2 -0
- package/dist/__tests__/error-classifier.test.d.ts.map +1 -0
- package/dist/__tests__/error-classifier.test.js +33 -0
- package/dist/__tests__/error-classifier.test.js.map +1 -0
- package/dist/__tests__/executor-integration.test.d.ts +11 -0
- package/dist/__tests__/executor-integration.test.d.ts.map +1 -0
- package/dist/__tests__/executor-integration.test.js +246 -0
- package/dist/__tests__/executor-integration.test.js.map +1 -0
- package/dist/__tests__/executor-issue-id.test.d.ts +13 -0
- package/dist/__tests__/executor-issue-id.test.d.ts.map +1 -0
- package/dist/__tests__/executor-issue-id.test.js +211 -0
- package/dist/__tests__/executor-issue-id.test.js.map +1 -0
- package/dist/__tests__/executor.test.d.ts +2 -0
- package/dist/__tests__/executor.test.d.ts.map +1 -0
- package/dist/__tests__/executor.test.js +164 -0
- package/dist/__tests__/executor.test.js.map +1 -0
- package/dist/__tests__/extract-handoff.test.d.ts +2 -0
- package/dist/__tests__/extract-handoff.test.d.ts.map +1 -0
- package/dist/__tests__/extract-handoff.test.js +131 -0
- package/dist/__tests__/extract-handoff.test.js.map +1 -0
- package/dist/__tests__/fail-on-auto-commit.test.d.ts +2 -0
- package/dist/__tests__/fail-on-auto-commit.test.d.ts.map +1 -0
- package/dist/__tests__/fail-on-auto-commit.test.js +156 -0
- package/dist/__tests__/fail-on-auto-commit.test.js.map +1 -0
- package/dist/__tests__/fixtures/webhook-comment.json +5 -0
- package/dist/__tests__/fixtures/webhook-state-change.json +15 -0
- package/dist/__tests__/force-push-agent-branches.test.d.ts +12 -0
- package/dist/__tests__/force-push-agent-branches.test.d.ts.map +1 -0
- package/dist/__tests__/force-push-agent-branches.test.js +348 -0
- package/dist/__tests__/force-push-agent-branches.test.js.map +1 -0
- package/dist/__tests__/github-webhook.test.d.ts +2 -0
- package/dist/__tests__/github-webhook.test.d.ts.map +1 -0
- package/dist/__tests__/github-webhook.test.js +370 -0
- package/dist/__tests__/github-webhook.test.js.map +1 -0
- package/dist/__tests__/gitlab.test.d.ts +28 -0
- package/dist/__tests__/gitlab.test.d.ts.map +1 -0
- package/dist/__tests__/gitlab.test.js +241 -0
- package/dist/__tests__/gitlab.test.js.map +1 -0
- package/dist/__tests__/integration/auto-commit.test.d.ts +2 -0
- package/dist/__tests__/integration/auto-commit.test.d.ts.map +1 -0
- package/dist/__tests__/integration/auto-commit.test.js +207 -0
- package/dist/__tests__/integration/auto-commit.test.js.map +1 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts +10 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js +183 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js.map +1 -0
- package/dist/__tests__/integration/reproduce-bec99.test.d.ts +32 -0
- package/dist/__tests__/integration/reproduce-bec99.test.d.ts.map +1 -0
- package/dist/__tests__/integration/reproduce-bec99.test.js +243 -0
- package/dist/__tests__/integration/reproduce-bec99.test.js.map +1 -0
- package/dist/__tests__/integration/vitest-changed.test.d.ts +10 -0
- package/dist/__tests__/integration/vitest-changed.test.d.ts.map +1 -0
- package/dist/__tests__/integration/vitest-changed.test.js +128 -0
- package/dist/__tests__/integration/vitest-changed.test.js.map +1 -0
- package/dist/__tests__/license.test.d.ts +2 -0
- package/dist/__tests__/license.test.d.ts.map +1 -0
- package/dist/__tests__/license.test.js +53 -0
- package/dist/__tests__/license.test.js.map +1 -0
- package/dist/__tests__/mcp-resolver.test.d.ts +2 -0
- package/dist/__tests__/mcp-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-resolver.test.js +65 -0
- package/dist/__tests__/mcp-resolver.test.js.map +1 -0
- package/dist/__tests__/migrator.test.d.ts +2 -0
- package/dist/__tests__/migrator.test.d.ts.map +1 -0
- package/dist/__tests__/migrator.test.js +300 -0
- package/dist/__tests__/migrator.test.js.map +1 -0
- package/dist/__tests__/notifier-discord.test.d.ts +2 -0
- package/dist/__tests__/notifier-discord.test.d.ts.map +1 -0
- package/dist/__tests__/notifier-discord.test.js +166 -0
- package/dist/__tests__/notifier-discord.test.js.map +1 -0
- package/dist/__tests__/notifier-slack.test.d.ts +2 -0
- package/dist/__tests__/notifier-slack.test.d.ts.map +1 -0
- package/dist/__tests__/notifier-slack.test.js +157 -0
- package/dist/__tests__/notifier-slack.test.js.map +1 -0
- package/dist/__tests__/notifier.test.d.ts +2 -0
- package/dist/__tests__/notifier.test.d.ts.map +1 -0
- package/dist/__tests__/notifier.test.js +207 -0
- package/dist/__tests__/notifier.test.js.map +1 -0
- package/dist/__tests__/pipeline-config.test.d.ts +2 -0
- package/dist/__tests__/pipeline-config.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-config.test.js +143 -0
- package/dist/__tests__/pipeline-config.test.js.map +1 -0
- package/dist/__tests__/pipeline-runner.test.d.ts +2 -0
- package/dist/__tests__/pipeline-runner.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-runner.test.js +359 -0
- package/dist/__tests__/pipeline-runner.test.js.map +1 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.d.ts +9 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.d.ts.map +1 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.js +175 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.js.map +1 -0
- package/dist/__tests__/pm-approvals.test.d.ts +2 -0
- package/dist/__tests__/pm-approvals.test.d.ts.map +1 -0
- package/dist/__tests__/pm-approvals.test.js +162 -0
- package/dist/__tests__/pm-approvals.test.js.map +1 -0
- package/dist/__tests__/pm-budget.test.d.ts +2 -0
- package/dist/__tests__/pm-budget.test.d.ts.map +1 -0
- package/dist/__tests__/pm-budget.test.js +65 -0
- package/dist/__tests__/pm-budget.test.js.map +1 -0
- package/dist/__tests__/pm-conflict.test.d.ts +2 -0
- package/dist/__tests__/pm-conflict.test.d.ts.map +1 -0
- package/dist/__tests__/pm-conflict.test.js +87 -0
- package/dist/__tests__/pm-conflict.test.js.map +1 -0
- package/dist/__tests__/pm-promote.test.d.ts +2 -0
- package/dist/__tests__/pm-promote.test.d.ts.map +1 -0
- package/dist/__tests__/pm-promote.test.js +82 -0
- package/dist/__tests__/pm-promote.test.js.map +1 -0
- package/dist/__tests__/pm-recover.test.d.ts +2 -0
- package/dist/__tests__/pm-recover.test.d.ts.map +1 -0
- package/dist/__tests__/pm-recover.test.js +100 -0
- package/dist/__tests__/pm-recover.test.js.map +1 -0
- package/dist/__tests__/pm-scheduler.test.d.ts +2 -0
- package/dist/__tests__/pm-scheduler.test.d.ts.map +1 -0
- package/dist/__tests__/pm-scheduler.test.js +112 -0
- package/dist/__tests__/pm-scheduler.test.js.map +1 -0
- package/dist/__tests__/pm-slack-interface.test.d.ts +2 -0
- package/dist/__tests__/pm-slack-interface.test.d.ts.map +1 -0
- package/dist/__tests__/pm-slack-interface.test.js +372 -0
- package/dist/__tests__/pm-slack-interface.test.js.map +1 -0
- package/dist/__tests__/pm-slack.test.d.ts +2 -0
- package/dist/__tests__/pm-slack.test.d.ts.map +1 -0
- package/dist/__tests__/pm-slack.test.js +83 -0
- package/dist/__tests__/pm-slack.test.js.map +1 -0
- package/dist/__tests__/pm-triage.test.d.ts +2 -0
- package/dist/__tests__/pm-triage.test.d.ts.map +1 -0
- package/dist/__tests__/pm-triage.test.js +198 -0
- package/dist/__tests__/pm-triage.test.js.map +1 -0
- package/dist/__tests__/pm-types.test.d.ts +2 -0
- package/dist/__tests__/pm-types.test.d.ts.map +1 -0
- package/dist/__tests__/pm-types.test.js +76 -0
- package/dist/__tests__/pm-types.test.js.map +1 -0
- package/dist/__tests__/pr-automerge.test.d.ts +18 -0
- package/dist/__tests__/pr-automerge.test.d.ts.map +1 -0
- package/dist/__tests__/pr-automerge.test.js +645 -0
- package/dist/__tests__/pr-automerge.test.js.map +1 -0
- package/dist/__tests__/pr-description.test.d.ts +2 -0
- package/dist/__tests__/pr-description.test.d.ts.map +1 -0
- package/dist/__tests__/pr-description.test.js +728 -0
- package/dist/__tests__/pr-description.test.js.map +1 -0
- package/dist/__tests__/prompt-injection.test.d.ts +2 -0
- package/dist/__tests__/prompt-injection.test.d.ts.map +1 -0
- package/dist/__tests__/prompt-injection.test.js +446 -0
- package/dist/__tests__/prompt-injection.test.js.map +1 -0
- package/dist/__tests__/ralph-gate.test.d.ts +19 -0
- package/dist/__tests__/ralph-gate.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-gate.test.js +593 -0
- package/dist/__tests__/ralph-gate.test.js.map +1 -0
- package/dist/__tests__/ralph-review-fix-regression.test.d.ts +18 -0
- package/dist/__tests__/ralph-review-fix-regression.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-review-fix-regression.test.js +306 -0
- package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -0
- package/dist/__tests__/ralph.test.d.ts +2 -0
- package/dist/__tests__/ralph.test.d.ts.map +1 -0
- package/dist/__tests__/ralph.test.js +96 -0
- package/dist/__tests__/ralph.test.js.map +1 -0
- package/dist/__tests__/recover-stuck.test.d.ts +8 -0
- package/dist/__tests__/recover-stuck.test.d.ts.map +1 -0
- package/dist/__tests__/recover-stuck.test.js +399 -0
- package/dist/__tests__/recover-stuck.test.js.map +1 -0
- package/dist/__tests__/repo.test.d.ts +2 -0
- package/dist/__tests__/repo.test.d.ts.map +1 -0
- package/dist/__tests__/repo.test.js +295 -0
- package/dist/__tests__/repo.test.js.map +1 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts +2 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts.map +1 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.js +187 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts +16 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +226 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts +2 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.js +76 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts +18 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.js +178 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec62.test.d.ts +2 -0
- package/dist/__tests__/reproduce-bec62.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec62.test.js +86 -0
- package/dist/__tests__/reproduce-bec62.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts +13 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +220 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -0
- package/dist/__tests__/review-feedback.test.d.ts +2 -0
- package/dist/__tests__/review-feedback.test.d.ts.map +1 -0
- package/dist/__tests__/review-feedback.test.js +383 -0
- package/dist/__tests__/review-feedback.test.js.map +1 -0
- package/dist/__tests__/sanitizer.test.d.ts +2 -0
- package/dist/__tests__/sanitizer.test.d.ts.map +1 -0
- package/dist/__tests__/sanitizer.test.js +162 -0
- package/dist/__tests__/sanitizer.test.js.map +1 -0
- package/dist/__tests__/security.test.d.ts +2 -0
- package/dist/__tests__/security.test.d.ts.map +1 -0
- package/dist/__tests__/security.test.js +52 -0
- package/dist/__tests__/security.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +61 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/slack-alerts.test.d.ts +2 -0
- package/dist/__tests__/slack-alerts.test.d.ts.map +1 -0
- package/dist/__tests__/slack-alerts.test.js +214 -0
- package/dist/__tests__/slack-alerts.test.js.map +1 -0
- package/dist/__tests__/stage-models.test.d.ts +14 -0
- package/dist/__tests__/stage-models.test.d.ts.map +1 -0
- package/dist/__tests__/stage-models.test.js +244 -0
- package/dist/__tests__/stage-models.test.js.map +1 -0
- package/dist/__tests__/start-todo.test.d.ts +2 -0
- package/dist/__tests__/start-todo.test.d.ts.map +1 -0
- package/dist/__tests__/start-todo.test.js +175 -0
- package/dist/__tests__/start-todo.test.js.map +1 -0
- package/dist/__tests__/tech-stack.test.d.ts +2 -0
- package/dist/__tests__/tech-stack.test.d.ts.map +1 -0
- package/dist/__tests__/tech-stack.test.js +75 -0
- package/dist/__tests__/tech-stack.test.js.map +1 -0
- package/dist/__tests__/templates.test.d.ts +2 -0
- package/dist/__tests__/templates.test.d.ts.map +1 -0
- package/dist/__tests__/templates.test.js +161 -0
- package/dist/__tests__/templates.test.js.map +1 -0
- package/dist/__tests__/test-quality.test.d.ts +2 -0
- package/dist/__tests__/test-quality.test.d.ts.map +1 -0
- package/dist/__tests__/test-quality.test.js +329 -0
- package/dist/__tests__/test-quality.test.js.map +1 -0
- package/dist/__tests__/token-budget.test.d.ts +2 -0
- package/dist/__tests__/token-budget.test.d.ts.map +1 -0
- package/dist/__tests__/token-budget.test.js +198 -0
- package/dist/__tests__/token-budget.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +156 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/validate.test.d.ts +2 -0
- package/dist/__tests__/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validate.test.js +128 -0
- package/dist/__tests__/validate.test.js.map +1 -0
- package/dist/__tests__/webhook-handler.test.d.ts +2 -0
- package/dist/__tests__/webhook-handler.test.d.ts.map +1 -0
- package/dist/__tests__/webhook-handler.test.js +286 -0
- package/dist/__tests__/webhook-handler.test.js.map +1 -0
- package/dist/__tests__/webhook.test.d.ts +2 -0
- package/dist/__tests__/webhook.test.d.ts.map +1 -0
- package/dist/__tests__/webhook.test.js +58 -0
- package/dist/__tests__/webhook.test.js.map +1 -0
- package/dist/db/client.d.ts +56 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +201 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations/postgres/001_initial_schema.sql +78 -0
- package/dist/db/migrations/postgres/002_pg_timestamps.sql +78 -0
- package/dist/db/migrations/postgres/003_retry_count.sql +10 -0
- package/dist/db/migrations/postgres/004_review_feedback.sql +20 -0
- package/dist/db/migrations/postgres/005_auto_merge.sql +15 -0
- package/dist/db/migrations/sqlite/001_initial_schema.sql +78 -0
- package/dist/db/migrations/sqlite/002_retry_count.sql +5 -0
- package/dist/db/migrations/sqlite/003_review_feedback.sql +7 -0
- package/dist/db/migrations/sqlite/004_auto_merge.sql +6 -0
- package/dist/db/migrator.d.ts +51 -0
- package/dist/db/migrator.d.ts.map +1 -0
- package/dist/db/migrator.js +188 -0
- package/dist/db/migrator.js.map +1 -0
- package/dist/db/schema.d.ts +1114 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +129 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/entrypoint.d.ts +2 -0
- package/dist/entrypoint.d.ts.map +1 -0
- package/dist/entrypoint.js +113 -0
- package/dist/entrypoint.js.map +1 -0
- package/dist/executor/agent-config.d.ts +10 -0
- package/dist/executor/agent-config.d.ts.map +1 -0
- package/dist/executor/agent-config.js +81 -0
- package/dist/executor/agent-config.js.map +1 -0
- package/dist/executor/agent-stream.d.ts +65 -0
- package/dist/executor/agent-stream.d.ts.map +1 -0
- package/dist/executor/agent-stream.js +101 -0
- package/dist/executor/agent-stream.js.map +1 -0
- package/dist/executor/auth-check.d.ts +10 -0
- package/dist/executor/auth-check.d.ts.map +1 -0
- package/dist/executor/auth-check.js +52 -0
- package/dist/executor/auth-check.js.map +1 -0
- package/dist/executor/deep-review.d.ts +61 -0
- package/dist/executor/deep-review.d.ts.map +1 -0
- package/dist/executor/deep-review.js +308 -0
- package/dist/executor/deep-review.js.map +1 -0
- package/dist/executor/executor.d.ts +27 -0
- package/dist/executor/executor.d.ts.map +1 -0
- package/dist/executor/executor.js +168 -0
- package/dist/executor/executor.js.map +1 -0
- package/dist/executor/extract-handoff.d.ts +14 -0
- package/dist/executor/extract-handoff.d.ts.map +1 -0
- package/dist/executor/extract-handoff.js +80 -0
- package/dist/executor/extract-handoff.js.map +1 -0
- package/dist/executor/handoff.d.ts +24 -0
- package/dist/executor/handoff.d.ts.map +1 -0
- package/dist/executor/handoff.js +63 -0
- package/dist/executor/handoff.js.map +1 -0
- package/dist/executor/index.d.ts +8 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +8 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/mcp-resolver.d.ts +29 -0
- package/dist/executor/mcp-resolver.d.ts.map +1 -0
- package/dist/executor/mcp-resolver.js +80 -0
- package/dist/executor/mcp-resolver.js.map +1 -0
- package/dist/executor/permissions.d.ts +11 -0
- package/dist/executor/permissions.d.ts.map +1 -0
- package/dist/executor/permissions.js +32 -0
- package/dist/executor/permissions.js.map +1 -0
- package/dist/executor/profiles.d.ts +5 -0
- package/dist/executor/profiles.d.ts.map +1 -0
- package/dist/executor/profiles.js +35 -0
- package/dist/executor/profiles.js.map +1 -0
- package/dist/executor/prompt/assembler.d.ts +10 -0
- package/dist/executor/prompt/assembler.d.ts.map +1 -0
- package/dist/executor/prompt/assembler.js +28 -0
- package/dist/executor/prompt/assembler.js.map +1 -0
- package/dist/executor/prompt/index.d.ts +5 -0
- package/dist/executor/prompt/index.d.ts.map +1 -0
- package/dist/executor/prompt/index.js +5 -0
- package/dist/executor/prompt/index.js.map +1 -0
- package/dist/executor/prompt/sanitizer.d.ts +25 -0
- package/dist/executor/prompt/sanitizer.d.ts.map +1 -0
- package/dist/executor/prompt/sanitizer.js +81 -0
- package/dist/executor/prompt/sanitizer.js.map +1 -0
- package/dist/executor/prompt/schema-mapper.d.ts +7 -0
- package/dist/executor/prompt/schema-mapper.d.ts.map +1 -0
- package/dist/executor/prompt/schema-mapper.js +59 -0
- package/dist/executor/prompt/schema-mapper.js.map +1 -0
- package/dist/executor/prompt/templates.d.ts +31 -0
- package/dist/executor/prompt/templates.d.ts.map +1 -0
- package/dist/executor/prompt/templates.js +283 -0
- package/dist/executor/prompt/templates.js.map +1 -0
- package/dist/executor/ralph.d.ts +19 -0
- package/dist/executor/ralph.d.ts.map +1 -0
- package/dist/executor/ralph.js +112 -0
- package/dist/executor/ralph.js.map +1 -0
- package/dist/executor/test-quality.d.ts +117 -0
- package/dist/executor/test-quality.d.ts.map +1 -0
- package/dist/executor/test-quality.js +261 -0
- package/dist/executor/test-quality.js.map +1 -0
- package/dist/executor/validate.d.ts +15 -0
- package/dist/executor/validate.d.ts.map +1 -0
- package/dist/executor/validate.js +124 -0
- package/dist/executor/validate.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/license.d.ts +18 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +44 -0
- package/dist/license.js.map +1 -0
- package/dist/logger.d.ts +43 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +91 -0
- package/dist/logger.js.map +1 -0
- package/dist/notifier/composite.d.ts +13 -0
- package/dist/notifier/composite.d.ts.map +1 -0
- package/dist/notifier/composite.js +28 -0
- package/dist/notifier/composite.js.map +1 -0
- package/dist/notifier/discord.d.ts +14 -0
- package/dist/notifier/discord.d.ts.map +1 -0
- package/dist/notifier/discord.js +105 -0
- package/dist/notifier/discord.js.map +1 -0
- package/dist/notifier/index.d.ts +6 -0
- package/dist/notifier/index.d.ts.map +1 -0
- package/dist/notifier/index.js +6 -0
- package/dist/notifier/index.js.map +1 -0
- package/dist/notifier/linear.d.ts +28 -0
- package/dist/notifier/linear.d.ts.map +1 -0
- package/dist/notifier/linear.js +138 -0
- package/dist/notifier/linear.js.map +1 -0
- package/dist/notifier/slack-alerts.d.ts +62 -0
- package/dist/notifier/slack-alerts.d.ts.map +1 -0
- package/dist/notifier/slack-alerts.js +184 -0
- package/dist/notifier/slack-alerts.js.map +1 -0
- package/dist/notifier/slack.d.ts +14 -0
- package/dist/notifier/slack.d.ts.map +1 -0
- package/dist/notifier/slack.js +146 -0
- package/dist/notifier/slack.js.map +1 -0
- package/dist/pipeline/automerge.d.ts +44 -0
- package/dist/pipeline/automerge.d.ts.map +1 -0
- package/dist/pipeline/automerge.js +135 -0
- package/dist/pipeline/automerge.js.map +1 -0
- package/dist/pipeline/config.d.ts +5 -0
- package/dist/pipeline/config.d.ts.map +1 -0
- package/dist/pipeline/config.js +68 -0
- package/dist/pipeline/config.js.map +1 -0
- package/dist/pipeline/distributed-lock.d.ts +50 -0
- package/dist/pipeline/distributed-lock.d.ts.map +1 -0
- package/dist/pipeline/distributed-lock.js +114 -0
- package/dist/pipeline/distributed-lock.js.map +1 -0
- package/dist/pipeline/error-classifier.d.ts +9 -0
- package/dist/pipeline/error-classifier.d.ts.map +1 -0
- package/dist/pipeline/error-classifier.js +25 -0
- package/dist/pipeline/error-classifier.js.map +1 -0
- package/dist/pipeline/index.d.ts +9 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +9 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/pr-description.d.ts +35 -0
- package/dist/pipeline/pr-description.d.ts.map +1 -0
- package/dist/pipeline/pr-description.js +52 -0
- package/dist/pipeline/pr-description.js.map +1 -0
- package/dist/pipeline/queue.d.ts +7 -0
- package/dist/pipeline/queue.d.ts.map +1 -0
- package/dist/pipeline/queue.js +39 -0
- package/dist/pipeline/queue.js.map +1 -0
- package/dist/pipeline/router.d.ts +6 -0
- package/dist/pipeline/router.d.ts.map +1 -0
- package/dist/pipeline/router.js +19 -0
- package/dist/pipeline/router.js.map +1 -0
- package/dist/pipeline/runner.d.ts +142 -0
- package/dist/pipeline/runner.d.ts.map +1 -0
- package/dist/pipeline/runner.js +1848 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pm/actions/approval-helpers.d.ts +11 -0
- package/dist/pm/actions/approval-helpers.d.ts.map +1 -0
- package/dist/pm/actions/approval-helpers.js +34 -0
- package/dist/pm/actions/approval-helpers.js.map +1 -0
- package/dist/pm/actions/cancel.d.ts +11 -0
- package/dist/pm/actions/cancel.d.ts.map +1 -0
- package/dist/pm/actions/cancel.js +68 -0
- package/dist/pm/actions/cancel.js.map +1 -0
- package/dist/pm/actions/deprioritize.d.ts +12 -0
- package/dist/pm/actions/deprioritize.d.ts.map +1 -0
- package/dist/pm/actions/deprioritize.js +55 -0
- package/dist/pm/actions/deprioritize.js.map +1 -0
- package/dist/pm/actions/promote.d.ts +11 -0
- package/dist/pm/actions/promote.d.ts.map +1 -0
- package/dist/pm/actions/promote.js +78 -0
- package/dist/pm/actions/promote.js.map +1 -0
- package/dist/pm/actions/recover-stuck.d.ts +42 -0
- package/dist/pm/actions/recover-stuck.d.ts.map +1 -0
- package/dist/pm/actions/recover-stuck.js +143 -0
- package/dist/pm/actions/recover-stuck.js.map +1 -0
- package/dist/pm/actions/recover.d.ts +18 -0
- package/dist/pm/actions/recover.d.ts.map +1 -0
- package/dist/pm/actions/recover.js +56 -0
- package/dist/pm/actions/recover.js.map +1 -0
- package/dist/pm/actions/resolve-approvals.d.ts +17 -0
- package/dist/pm/actions/resolve-approvals.d.ts.map +1 -0
- package/dist/pm/actions/resolve-approvals.js +92 -0
- package/dist/pm/actions/resolve-approvals.js.map +1 -0
- package/dist/pm/actions/start-todo.d.ts +28 -0
- package/dist/pm/actions/start-todo.d.ts.map +1 -0
- package/dist/pm/actions/start-todo.js +117 -0
- package/dist/pm/actions/start-todo.js.map +1 -0
- package/dist/pm/actions/triage.d.ts +13 -0
- package/dist/pm/actions/triage.d.ts.map +1 -0
- package/dist/pm/actions/triage.js +109 -0
- package/dist/pm/actions/triage.js.map +1 -0
- package/dist/pm/budget.d.ts +9 -0
- package/dist/pm/budget.d.ts.map +1 -0
- package/dist/pm/budget.js +62 -0
- package/dist/pm/budget.js.map +1 -0
- package/dist/pm/call-claude.d.ts +3 -0
- package/dist/pm/call-claude.d.ts.map +1 -0
- package/dist/pm/call-claude.js +37 -0
- package/dist/pm/call-claude.js.map +1 -0
- package/dist/pm/conflict-detector.d.ts +42 -0
- package/dist/pm/conflict-detector.d.ts.map +1 -0
- package/dist/pm/conflict-detector.js +116 -0
- package/dist/pm/conflict-detector.js.map +1 -0
- package/dist/pm/conflict.d.ts +20 -0
- package/dist/pm/conflict.d.ts.map +1 -0
- package/dist/pm/conflict.js +63 -0
- package/dist/pm/conflict.js.map +1 -0
- package/dist/pm/coordination.d.ts +50 -0
- package/dist/pm/coordination.d.ts.map +1 -0
- package/dist/pm/coordination.js +163 -0
- package/dist/pm/coordination.js.map +1 -0
- package/dist/pm/linear-helpers.d.ts +2 -0
- package/dist/pm/linear-helpers.d.ts.map +1 -0
- package/dist/pm/linear-helpers.js +16 -0
- package/dist/pm/linear-helpers.js.map +1 -0
- package/dist/pm/scheduler.d.ts +47 -0
- package/dist/pm/scheduler.d.ts.map +1 -0
- package/dist/pm/scheduler.js +346 -0
- package/dist/pm/scheduler.js.map +1 -0
- package/dist/pm/slack-helpers.d.ts +2 -0
- package/dist/pm/slack-helpers.d.ts.map +1 -0
- package/dist/pm/slack-helpers.js +24 -0
- package/dist/pm/slack-helpers.js.map +1 -0
- package/dist/pm/slack-interface.d.ts +133 -0
- package/dist/pm/slack-interface.d.ts.map +1 -0
- package/dist/pm/slack-interface.js +641 -0
- package/dist/pm/slack-interface.js.map +1 -0
- package/dist/pm/slack.d.ts +18 -0
- package/dist/pm/slack.d.ts.map +1 -0
- package/dist/pm/slack.js +144 -0
- package/dist/pm/slack.js.map +1 -0
- package/dist/pm/types.d.ts +99 -0
- package/dist/pm/types.d.ts.map +1 -0
- package/dist/pm/types.js +17 -0
- package/dist/pm/types.js.map +1 -0
- package/dist/repo/config.d.ts +35 -0
- package/dist/repo/config.d.ts.map +1 -0
- package/dist/repo/config.js +72 -0
- package/dist/repo/config.js.map +1 -0
- package/dist/repo/devcontainer.d.ts +33 -0
- package/dist/repo/devcontainer.d.ts.map +1 -0
- package/dist/repo/devcontainer.js +90 -0
- package/dist/repo/devcontainer.js.map +1 -0
- package/dist/repo/git.d.ts +185 -0
- package/dist/repo/git.d.ts.map +1 -0
- package/dist/repo/git.js +586 -0
- package/dist/repo/git.js.map +1 -0
- package/dist/repo/github.d.ts +56 -0
- package/dist/repo/github.d.ts.map +1 -0
- package/dist/repo/github.js +164 -0
- package/dist/repo/github.js.map +1 -0
- package/dist/repo/gitlab.d.ts +47 -0
- package/dist/repo/gitlab.d.ts.map +1 -0
- package/dist/repo/gitlab.js +91 -0
- package/dist/repo/gitlab.js.map +1 -0
- package/dist/repo/index.d.ts +7 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +5 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/tech-stack.d.ts +13 -0
- package/dist/repo/tech-stack.d.ts.map +1 -0
- package/dist/repo/tech-stack.js +112 -0
- package/dist/repo/tech-stack.js.map +1 -0
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +3 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/review-checklist.d.ts +9 -0
- package/dist/security/review-checklist.d.ts.map +1 -0
- package/dist/security/review-checklist.js +46 -0
- package/dist/security/review-checklist.js.map +1 -0
- package/dist/security/sandbox.d.ts +7 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +31 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/server.d.ts +48 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +90 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +1230 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +225 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook/github-handler.d.ts +39 -0
- package/dist/webhook/github-handler.d.ts.map +1 -0
- package/dist/webhook/github-handler.js +439 -0
- package/dist/webhook/github-handler.js.map +1 -0
- package/dist/webhook/handler.d.ts +16 -0
- package/dist/webhook/handler.d.ts.map +1 -0
- package/dist/webhook/handler.js +171 -0
- package/dist/webhook/handler.js.map +1 -0
- package/dist/webhook/index.d.ts +5 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +5 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/parser.d.ts +18 -0
- package/dist/webhook/parser.d.ts.map +1 -0
- package/dist/webhook/parser.js +30 -0
- package/dist/webhook/parser.js.map +1 -0
- package/dist/webhook/signature.d.ts +2 -0
- package/dist/webhook/signature.d.ts.map +1 -0
- package/dist/webhook/signature.js +14 -0
- package/dist/webhook/signature.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEC-99: Integration tests for cross-worktree contamination guard.
|
|
3
|
+
*
|
|
4
|
+
* These tests verify that the BEC-99 fixes (branch verification before
|
|
5
|
+
* commit/push, pre-push hook installation) prevent cross-branch contamination
|
|
6
|
+
* when 3+ agents are dispatched in parallel on different branches that share
|
|
7
|
+
* the same git clone directory.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
10
|
+
import { mkdtempSync, rmSync, writeFileSync } from "fs";
|
|
11
|
+
import { tmpdir } from "os";
|
|
12
|
+
import { join } from "path";
|
|
13
|
+
import { execFileSync } from "child_process";
|
|
14
|
+
import { createWorktree, autoCommitChanges, verifyBranchMatch, getCurrentBranch, installPrePushHook, } from "../../repo/git.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Helper: bootstrap a local bare "origin" + a clone from it.
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
function makeSharedRepo() {
|
|
19
|
+
const origin = mkdtempSync(join(tmpdir(), "bec99-int-origin-"));
|
|
20
|
+
const clone = mkdtempSync(join(tmpdir(), "bec99-int-clone-"));
|
|
21
|
+
execFileSync("git", ["init", "--bare", origin]);
|
|
22
|
+
execFileSync("git", ["-C", origin, "symbolic-ref", "HEAD", "refs/heads/main"]);
|
|
23
|
+
const work = mkdtempSync(join(tmpdir(), "bec99-int-work-"));
|
|
24
|
+
execFileSync("git", ["clone", origin, work]);
|
|
25
|
+
execFileSync("git", ["-C", work, "config", "user.email", "ci@test.com"]);
|
|
26
|
+
execFileSync("git", ["-C", work, "config", "user.name", "CI"]);
|
|
27
|
+
writeFileSync(join(work, "README.md"), "initial\n");
|
|
28
|
+
execFileSync("git", ["-C", work, "add", "README.md"]);
|
|
29
|
+
execFileSync("git", ["-C", work, "commit", "-m", "init"]);
|
|
30
|
+
execFileSync("git", ["-C", work, "push", "origin", "main"]);
|
|
31
|
+
rmSync(work, { recursive: true, force: true });
|
|
32
|
+
execFileSync("git", ["clone", origin, clone]);
|
|
33
|
+
execFileSync("git", ["-C", clone, "config", "user.email", "ci@test.com"]);
|
|
34
|
+
execFileSync("git", ["-C", clone, "config", "user.name", "CI"]);
|
|
35
|
+
return { origin, clone };
|
|
36
|
+
}
|
|
37
|
+
const dirs = [];
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
for (const d of dirs.splice(0)) {
|
|
40
|
+
rmSync(d, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Integration test: 3 agents dispatched in parallel on different branches
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
describe("BEC-99 integration: parallel agent dispatch — commit isolation", () => {
|
|
47
|
+
it("3 parallel agents on different branches keep commits isolated", async () => {
|
|
48
|
+
const { origin, clone } = makeSharedRepo();
|
|
49
|
+
dirs.push(origin, clone);
|
|
50
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-parallel-"));
|
|
51
|
+
dirs.push(baseDir);
|
|
52
|
+
// ── Create 3 worktrees in parallel (as the agent SDK would) ──────────
|
|
53
|
+
const branches = [
|
|
54
|
+
"agent/BEC-101-feature-a",
|
|
55
|
+
"agent/BEC-102-feature-b",
|
|
56
|
+
"agent/BEC-103-feature-c",
|
|
57
|
+
];
|
|
58
|
+
const [wt1, wt2, wt3] = await Promise.all(branches.map((branch, i) => createWorktree(clone, `run-${i + 1}`, branch, baseDir)));
|
|
59
|
+
const worktrees = [wt1, wt2, wt3];
|
|
60
|
+
// ── Verify each worktree starts on the correct branch ────────────────
|
|
61
|
+
for (let i = 0; i < branches.length; i++) {
|
|
62
|
+
const current = await getCurrentBranch(worktrees[i]);
|
|
63
|
+
expect(current).toBe(branches[i]);
|
|
64
|
+
}
|
|
65
|
+
// ── Each agent writes and commits its own file ──────────────────────
|
|
66
|
+
const agentFiles = ["feature-a.ts", "feature-b.ts", "feature-c.ts"];
|
|
67
|
+
for (let i = 0; i < 3; i++) {
|
|
68
|
+
writeFileSync(join(worktrees[i], agentFiles[i]), `// ${branches[i]} work\n`);
|
|
69
|
+
}
|
|
70
|
+
// ── autoCommitChanges with expectedBranch succeeds for all ──────────
|
|
71
|
+
await Promise.all(branches.map((branch, i) => autoCommitChanges(worktrees[i], branch.split("/")[1], branch)));
|
|
72
|
+
// ── Verify each branch has exactly the right commit ──────────────────
|
|
73
|
+
for (let i = 0; i < 3; i++) {
|
|
74
|
+
const log = execFileSync("git", ["-C", worktrees[i], "log", "--oneline", "-5"]).toString().trim();
|
|
75
|
+
const branchId = branches[i].split("/")[1]; // e.g. "BEC-101-feature-a"
|
|
76
|
+
// The commit message contains this branch's ID
|
|
77
|
+
expect(log).toContain(branchId);
|
|
78
|
+
// The commit does NOT contain the other branches' IDs
|
|
79
|
+
for (let j = 0; j < 3; j++) {
|
|
80
|
+
if (j !== i) {
|
|
81
|
+
const otherId = branches[j].split("/")[1];
|
|
82
|
+
expect(log).not.toContain(otherId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Verify the branch is still correct
|
|
86
|
+
const current = await getCurrentBranch(worktrees[i]);
|
|
87
|
+
expect(current).toBe(branches[i]);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
it("cross-contamination attempt is blocked by verifyBranchMatch", async () => {
|
|
91
|
+
const { origin, clone } = makeSharedRepo();
|
|
92
|
+
dirs.push(origin, clone);
|
|
93
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-guard-"));
|
|
94
|
+
dirs.push(baseDir);
|
|
95
|
+
const branchA = "agent/BEC-104-alpha";
|
|
96
|
+
const branchB = "agent/BEC-105-beta";
|
|
97
|
+
// Create both worktrees.
|
|
98
|
+
const [wtA, wtB] = await Promise.all([
|
|
99
|
+
createWorktree(clone, "run-alpha", branchA, baseDir),
|
|
100
|
+
createWorktree(clone, "run-beta", branchB, baseDir),
|
|
101
|
+
]);
|
|
102
|
+
// Simulate agent A's worktree HEAD drifting onto a third branch
|
|
103
|
+
// (not branchB — git prevents checking out a branch already in another worktree).
|
|
104
|
+
// This represents the real-world scenario where an agent ran `git checkout`
|
|
105
|
+
// to some other branch, causing its HEAD to drift away from the expected branch.
|
|
106
|
+
const driftBranch = "agent/BEC-999-drift";
|
|
107
|
+
execFileSync("git", ["-C", wtA, "checkout", "-b", driftBranch]);
|
|
108
|
+
// Agent A writes its file (BEC-104's work) but HEAD is now on the drift branch
|
|
109
|
+
writeFileSync(join(wtA, "alpha-work.ts"), "// alpha's work\n");
|
|
110
|
+
// verifyBranchMatch throws immediately — HEAD is not on branchA
|
|
111
|
+
await expect(verifyBranchMatch(wtA, branchA)).rejects.toThrow(/branch mismatch/i);
|
|
112
|
+
// autoCommitChanges with expectedBranch also throws
|
|
113
|
+
await expect(autoCommitChanges(wtA, "BEC-104", branchA)).rejects.toThrow(/branch mismatch/i);
|
|
114
|
+
// Branch B (and the drift branch) should NOT contain any commit from agent A
|
|
115
|
+
const logB = execFileSync("git", ["-C", wtB, "log", "--oneline", "-5"]).toString().trim();
|
|
116
|
+
expect(logB).not.toContain("BEC-104");
|
|
117
|
+
// Drift branch also has no stray commit (autoCommitChanges was blocked)
|
|
118
|
+
const logDrift = execFileSync("git", ["-C", wtA, "log", "--oneline", "-5"]).toString().trim();
|
|
119
|
+
expect(logDrift).not.toContain("BEC-104");
|
|
120
|
+
});
|
|
121
|
+
it("verifyBranchMatch is a no-op when HEAD matches expected branch", async () => {
|
|
122
|
+
const { origin, clone } = makeSharedRepo();
|
|
123
|
+
dirs.push(origin, clone);
|
|
124
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-noop-"));
|
|
125
|
+
dirs.push(baseDir);
|
|
126
|
+
const branch = "agent/BEC-106-noop";
|
|
127
|
+
const wt = await createWorktree(clone, "run-noop", branch, baseDir);
|
|
128
|
+
// Should not throw when branch is correct
|
|
129
|
+
await expect(verifyBranchMatch(wt, branch)).resolves.toBeUndefined();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Integration test: installPrePushHook is idempotent
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
describe("BEC-99 integration: installPrePushHook idempotency", () => {
|
|
136
|
+
it("calling installPrePushHook multiple times does not corrupt the hook", async () => {
|
|
137
|
+
const { origin, clone } = makeSharedRepo();
|
|
138
|
+
dirs.push(origin, clone);
|
|
139
|
+
// First install
|
|
140
|
+
await installPrePushHook(clone);
|
|
141
|
+
const { readFile } = await import("node:fs/promises");
|
|
142
|
+
const hookPath = join(clone, ".git", "hooks", "pre-push");
|
|
143
|
+
const contentAfterFirst = await readFile(hookPath, "utf8");
|
|
144
|
+
// Second install — should be idempotent
|
|
145
|
+
await installPrePushHook(clone);
|
|
146
|
+
const contentAfterSecond = await readFile(hookPath, "utf8");
|
|
147
|
+
expect(contentAfterFirst).toBe(contentAfterSecond);
|
|
148
|
+
expect(contentAfterFirst).toMatch(/Linear Agent Framework/);
|
|
149
|
+
expect(contentAfterFirst).toMatch(/exit 0/);
|
|
150
|
+
});
|
|
151
|
+
it("does not overwrite a pre-existing third-party pre-push hook", async () => {
|
|
152
|
+
const { origin, clone } = makeSharedRepo();
|
|
153
|
+
dirs.push(origin, clone);
|
|
154
|
+
const { writeFile, mkdir, chmod } = await import("node:fs/promises");
|
|
155
|
+
const hooksDir = join(clone, ".git", "hooks");
|
|
156
|
+
await mkdir(hooksDir, { recursive: true });
|
|
157
|
+
const hookPath = join(hooksDir, "pre-push");
|
|
158
|
+
const thirdPartyHook = "#!/bin/sh\n# Custom hook by user\nexit 0\n";
|
|
159
|
+
await writeFile(hookPath, thirdPartyHook, "utf8");
|
|
160
|
+
await chmod(hookPath, 0o755);
|
|
161
|
+
// Should not overwrite a third-party hook
|
|
162
|
+
await installPrePushHook(clone);
|
|
163
|
+
const { readFile } = await import("node:fs/promises");
|
|
164
|
+
const content = await readFile(hookPath, "utf8");
|
|
165
|
+
expect(content).toBe(thirdPartyHook); // unchanged
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// Integration test: getCurrentBranch
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
describe("BEC-99 integration: getCurrentBranch", () => {
|
|
172
|
+
it("returns the correct branch name for a worktree", async () => {
|
|
173
|
+
const { origin, clone } = makeSharedRepo();
|
|
174
|
+
dirs.push(origin, clone);
|
|
175
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-current-"));
|
|
176
|
+
dirs.push(baseDir);
|
|
177
|
+
const branch = "agent/BEC-107-current";
|
|
178
|
+
const wt = await createWorktree(clone, "run-current", branch, baseDir);
|
|
179
|
+
const current = await getCurrentBranch(wt);
|
|
180
|
+
expect(current).toBe(branch);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=bec99-cross-worktree-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bec99-cross-worktree-guard.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/bec99-cross-worktree-guard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEC-99: Cross-worktree contamination guard for parallel agent dispatches
|
|
3
|
+
*
|
|
4
|
+
* This file started as a reproduction test that documented the gaps allowing
|
|
5
|
+
* cross-branch contamination when multiple agents are dispatched in parallel
|
|
6
|
+
* against different branches that share the same underlying git repository
|
|
7
|
+
* clone (via `git worktree`).
|
|
8
|
+
*
|
|
9
|
+
* The gaps identified were:
|
|
10
|
+
*
|
|
11
|
+
* 1. `autoCommitChanges()` had no branch-safety guard — it committed to
|
|
12
|
+
* whatever HEAD the worktree was currently on.
|
|
13
|
+
*
|
|
14
|
+
* 2. `createWorktree()` uses `git worktree add -B <branch>` which RESETS the
|
|
15
|
+
* branch ref to the current HEAD if the branch already exists. In a race
|
|
16
|
+
* where two runs share the same branch name (e.g. a retry after a
|
|
17
|
+
* stale-worktree removal), the second call clobbers the first's commits.
|
|
18
|
+
*
|
|
19
|
+
* 3. No pre-push git hook existed to validate that the worktree's HEAD branch
|
|
20
|
+
* matched the expected pipeline branch before pushing.
|
|
21
|
+
*
|
|
22
|
+
* 4. CLAUDE.md did not document the shared-.git-directory limitation or safe
|
|
23
|
+
* patterns for parallel agent dispatch.
|
|
24
|
+
*
|
|
25
|
+
* FIXES (BEC-99):
|
|
26
|
+
* - autoCommitChanges now accepts `expectedBranch` and throws on mismatch
|
|
27
|
+
* - pushBranch / pushBranchForce call verifyBranchMatch before every push
|
|
28
|
+
* - createWorktree installs a pre-push hook via installPrePushHook
|
|
29
|
+
* - Root CLAUDE.md now documents the isolation model and safe patterns
|
|
30
|
+
*/
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=reproduce-bec99.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce-bec99.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/reproduce-bec99.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEC-99: Cross-worktree contamination guard for parallel agent dispatches
|
|
3
|
+
*
|
|
4
|
+
* This file started as a reproduction test that documented the gaps allowing
|
|
5
|
+
* cross-branch contamination when multiple agents are dispatched in parallel
|
|
6
|
+
* against different branches that share the same underlying git repository
|
|
7
|
+
* clone (via `git worktree`).
|
|
8
|
+
*
|
|
9
|
+
* The gaps identified were:
|
|
10
|
+
*
|
|
11
|
+
* 1. `autoCommitChanges()` had no branch-safety guard — it committed to
|
|
12
|
+
* whatever HEAD the worktree was currently on.
|
|
13
|
+
*
|
|
14
|
+
* 2. `createWorktree()` uses `git worktree add -B <branch>` which RESETS the
|
|
15
|
+
* branch ref to the current HEAD if the branch already exists. In a race
|
|
16
|
+
* where two runs share the same branch name (e.g. a retry after a
|
|
17
|
+
* stale-worktree removal), the second call clobbers the first's commits.
|
|
18
|
+
*
|
|
19
|
+
* 3. No pre-push git hook existed to validate that the worktree's HEAD branch
|
|
20
|
+
* matched the expected pipeline branch before pushing.
|
|
21
|
+
*
|
|
22
|
+
* 4. CLAUDE.md did not document the shared-.git-directory limitation or safe
|
|
23
|
+
* patterns for parallel agent dispatch.
|
|
24
|
+
*
|
|
25
|
+
* FIXES (BEC-99):
|
|
26
|
+
* - autoCommitChanges now accepts `expectedBranch` and throws on mismatch
|
|
27
|
+
* - pushBranch / pushBranchForce call verifyBranchMatch before every push
|
|
28
|
+
* - createWorktree installs a pre-push hook via installPrePushHook
|
|
29
|
+
* - Root CLAUDE.md now documents the isolation model and safe patterns
|
|
30
|
+
*/
|
|
31
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
32
|
+
import { mkdtempSync, rmSync, writeFileSync, existsSync } from "fs";
|
|
33
|
+
import { tmpdir } from "os";
|
|
34
|
+
import { join } from "path";
|
|
35
|
+
import { execFileSync } from "child_process";
|
|
36
|
+
import { createWorktree, autoCommitChanges } from "../../repo/git.js";
|
|
37
|
+
import { readFileSync } from "fs";
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Helper: bootstrap a local bare "origin" + a clone from it.
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function makeSharedRepo() {
|
|
42
|
+
const origin = mkdtempSync(join(tmpdir(), "bec99-origin-"));
|
|
43
|
+
const clone = mkdtempSync(join(tmpdir(), "bec99-clone-"));
|
|
44
|
+
execFileSync("git", ["init", "--bare", origin]);
|
|
45
|
+
execFileSync("git", ["-C", origin, "symbolic-ref", "HEAD", "refs/heads/main"]);
|
|
46
|
+
// Create an initial commit in a temp working copy so origin/main exists.
|
|
47
|
+
const work = mkdtempSync(join(tmpdir(), "bec99-work-"));
|
|
48
|
+
execFileSync("git", ["clone", origin, work]);
|
|
49
|
+
execFileSync("git", ["-C", work, "config", "user.email", "ci@test.com"]);
|
|
50
|
+
execFileSync("git", ["-C", work, "config", "user.name", "CI"]);
|
|
51
|
+
writeFileSync(join(work, "README.md"), "initial\n");
|
|
52
|
+
execFileSync("git", ["-C", work, "add", "README.md"]);
|
|
53
|
+
execFileSync("git", ["-C", work, "commit", "-m", "init"]);
|
|
54
|
+
execFileSync("git", ["-C", work, "push", "origin", "main"]);
|
|
55
|
+
rmSync(work, { recursive: true, force: true });
|
|
56
|
+
// Clone is what the pipeline runner uses as `repoDir`.
|
|
57
|
+
execFileSync("git", ["clone", origin, clone]);
|
|
58
|
+
execFileSync("git", ["-C", clone, "config", "user.email", "ci@test.com"]);
|
|
59
|
+
execFileSync("git", ["-C", clone, "config", "user.name", "CI"]);
|
|
60
|
+
return { origin, clone };
|
|
61
|
+
}
|
|
62
|
+
const dirs = [];
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
for (const d of dirs.splice(0)) {
|
|
65
|
+
rmSync(d, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// FIX 1 — autoCommitChanges now throws when HEAD is on the wrong branch
|
|
70
|
+
//
|
|
71
|
+
// Before BEC-99: autoCommitChanges had no branch guard and silently committed
|
|
72
|
+
// to whatever HEAD the worktree was currently on, causing cross-contamination.
|
|
73
|
+
//
|
|
74
|
+
// After BEC-99: passing `expectedBranch` makes it throw immediately on mismatch,
|
|
75
|
+
// turning the silent data loss into a loud, recoverable error.
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
describe("BEC-99 fix 1: autoCommitChanges verifies branch before committing", () => {
|
|
78
|
+
it("throws when HEAD branch does not match expectedBranch", async () => {
|
|
79
|
+
const { origin, clone } = makeSharedRepo();
|
|
80
|
+
dirs.push(origin, clone);
|
|
81
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-runs-"));
|
|
82
|
+
dirs.push(baseDir);
|
|
83
|
+
// ── set up two branches in origin so we can check them out ──────────────
|
|
84
|
+
const prep = mkdtempSync(join(tmpdir(), "bec99-prep-"));
|
|
85
|
+
dirs.push(prep);
|
|
86
|
+
execFileSync("git", ["clone", origin, prep]);
|
|
87
|
+
execFileSync("git", ["-C", prep, "config", "user.email", "ci@test.com"]);
|
|
88
|
+
execFileSync("git", ["-C", prep, "config", "user.name", "CI"]);
|
|
89
|
+
execFileSync("git", ["-C", prep, "checkout", "-b", "agent/BEC-56-cache"]);
|
|
90
|
+
writeFileSync(join(prep, "cache.ts"), "// BEC-56 cache\n");
|
|
91
|
+
execFileSync("git", ["-C", prep, "add", "cache.ts"]);
|
|
92
|
+
execFileSync("git", ["-C", prep, "commit", "-m", "feat(BEC-56): add cache"]);
|
|
93
|
+
execFileSync("git", ["-C", prep, "push", "origin", "agent/BEC-56-cache"]);
|
|
94
|
+
// ── Pipeline creates a worktree for BEC-85 ────────────────────────────
|
|
95
|
+
const bec85WorktreePath = await createWorktree(clone, "run-bec85", "agent/BEC-85-sanitize", baseDir);
|
|
96
|
+
// Verify the worktree is on the correct branch.
|
|
97
|
+
const branchBefore = execFileSync("git", ["-C", bec85WorktreePath, "rev-parse", "--abbrev-ref", "HEAD"])
|
|
98
|
+
.toString()
|
|
99
|
+
.trim();
|
|
100
|
+
expect(branchBefore).toBe("agent/BEC-85-sanitize");
|
|
101
|
+
// ── Simulate an agent running `git checkout` inside its own worktree ──
|
|
102
|
+
execFileSync("git", ["-C", clone, "fetch", "origin"]);
|
|
103
|
+
execFileSync("git", ["-C", bec85WorktreePath, "checkout", "agent/BEC-56-cache"]);
|
|
104
|
+
// ── Agent writes a file (BEC-85's work) ──────────────────────────────
|
|
105
|
+
writeFileSync(join(bec85WorktreePath, "sanitize.ts"), "// BEC-85 sanitization fix\n");
|
|
106
|
+
// ── FIX: autoCommitChanges now throws when expectedBranch is provided and mismatched ──
|
|
107
|
+
await expect(autoCommitChanges(bec85WorktreePath, "BEC-85", "agent/BEC-85-sanitize")).rejects.toThrow(/branch mismatch/i);
|
|
108
|
+
// ── The wrong branch received no stray commit ──────────────────────────
|
|
109
|
+
const currentBranch = execFileSync("git", ["-C", bec85WorktreePath, "rev-parse", "--abbrev-ref", "HEAD"]).toString().trim();
|
|
110
|
+
expect(currentBranch).toBe("agent/BEC-56-cache"); // still on wrong branch...
|
|
111
|
+
// ...but no commit was made there:
|
|
112
|
+
const log = execFileSync("git", ["-C", bec85WorktreePath, "log", "--oneline", "-3"]).toString().trim();
|
|
113
|
+
expect(log).not.toContain("BEC-85"); // guard prevented the cross-contamination commit
|
|
114
|
+
});
|
|
115
|
+
it("commits normally when HEAD matches expectedBranch", async () => {
|
|
116
|
+
const { origin, clone } = makeSharedRepo();
|
|
117
|
+
dirs.push(origin, clone);
|
|
118
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-runs-clean-"));
|
|
119
|
+
dirs.push(baseDir);
|
|
120
|
+
const wtPath = await createWorktree(clone, "run-clean", "agent/BEC-99-clean", baseDir);
|
|
121
|
+
writeFileSync(join(wtPath, "fix.ts"), "// clean fix\n");
|
|
122
|
+
// Should succeed — HEAD matches expectedBranch.
|
|
123
|
+
const committed = await autoCommitChanges(wtPath, "BEC-99", "agent/BEC-99-clean");
|
|
124
|
+
expect(committed).toBe(true);
|
|
125
|
+
const log = execFileSync("git", ["-C", wtPath, "log", "--oneline", "-1"]).toString().trim();
|
|
126
|
+
expect(log).toContain("BEC-99");
|
|
127
|
+
});
|
|
128
|
+
it("commits normally when no expectedBranch is provided (backward compatible)", async () => {
|
|
129
|
+
const { origin, clone } = makeSharedRepo();
|
|
130
|
+
dirs.push(origin, clone);
|
|
131
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-runs-compat-"));
|
|
132
|
+
dirs.push(baseDir);
|
|
133
|
+
const wtPath = await createWorktree(clone, "run-compat", "agent/BEC-99-compat", baseDir);
|
|
134
|
+
writeFileSync(join(wtPath, "fix.ts"), "// compat fix\n");
|
|
135
|
+
// No expectedBranch — should work as before (no branch check).
|
|
136
|
+
const committed = await autoCommitChanges(wtPath, "BEC-99");
|
|
137
|
+
expect(committed).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// BUG 2 — createWorktree with -B resets branch ref in a concurrent scenario
|
|
142
|
+
//
|
|
143
|
+
// `git worktree add -B <branch>` RESETS the branch pointer to HEAD if the
|
|
144
|
+
// branch already exists. If two pipeline runs race and the second call wins
|
|
145
|
+
// after the first has already committed, the first run's commits become
|
|
146
|
+
// unreachable (dangling).
|
|
147
|
+
//
|
|
148
|
+
// NOTE: This remains a known limitation of the git worktree model. The
|
|
149
|
+
// contamination guards in BEC-99 (branch verification before commit/push)
|
|
150
|
+
// prevent the *symptom* of cross-contaminated pushes, but the underlying
|
|
151
|
+
// `-B` ref-reset still occurs on retry/stale-worktree recovery scenarios.
|
|
152
|
+
// Callers should avoid reusing the same branch name across concurrent runs.
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
describe("BEC-99 bug 2 (known limitation): -B flag in createWorktree resets ref on reuse", () => {
|
|
155
|
+
it("second createWorktree call with -B on same branch name resets ref to HEAD", async () => {
|
|
156
|
+
const { origin, clone } = makeSharedRepo();
|
|
157
|
+
dirs.push(origin, clone);
|
|
158
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-b-runs-"));
|
|
159
|
+
dirs.push(baseDir);
|
|
160
|
+
// ── First worktree for a run ──────────────────────────────────────────
|
|
161
|
+
const wt1 = await createWorktree(clone, "run-1", "agent/BEC-99-shared", baseDir);
|
|
162
|
+
// Agent makes a commit on the branch.
|
|
163
|
+
writeFileSync(join(wt1, "run1.ts"), "// run-1 work\n");
|
|
164
|
+
execFileSync("git", ["-C", wt1, "add", "run1.ts"]);
|
|
165
|
+
execFileSync("git", ["-C", wt1, "commit", "-m", "feat(BEC-99): run-1 commit"]);
|
|
166
|
+
const commitAfterRun1 = execFileSync("git", ["-C", wt1, "rev-parse", "HEAD"])
|
|
167
|
+
.toString().trim();
|
|
168
|
+
// ── First worktree is removed (simulating cleanup or stale-worktree recovery) ──
|
|
169
|
+
execFileSync("git", ["-C", clone, "worktree", "remove", wt1, "--force"]);
|
|
170
|
+
// ── Second run reuses the same branch name (retry / re-run scenario) ──
|
|
171
|
+
const wt2 = await createWorktree(clone, "run-2", "agent/BEC-99-shared", baseDir);
|
|
172
|
+
const commitAfterRun2 = execFileSync("git", ["-C", wt2, "rev-parse", "HEAD"])
|
|
173
|
+
.toString().trim();
|
|
174
|
+
// KNOWN LIMITATION: the branch ref is reset — run-1's commit is orphaned.
|
|
175
|
+
// Mitigation: don't reuse the same branch name across concurrent/retry runs.
|
|
176
|
+
expect(commitAfterRun1).not.toBe(commitAfterRun2);
|
|
177
|
+
let run1CommitReachable = true;
|
|
178
|
+
try {
|
|
179
|
+
execFileSync("git", ["-C", wt2, "merge-base", "--is-ancestor", commitAfterRun1, "HEAD"]);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
run1CommitReachable = false;
|
|
183
|
+
}
|
|
184
|
+
expect(run1CommitReachable).toBe(false); // run-1's work is unreachable from the reset branch
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// FIX 3 — createWorktree now installs a pre-push hook
|
|
189
|
+
//
|
|
190
|
+
// Before BEC-99: no pre-push hook validated branch names before pushing.
|
|
191
|
+
// After BEC-99: createWorktree calls installPrePushHook, which writes
|
|
192
|
+
// .git/hooks/pre-push that aborts pushes when HEAD ≠ the remote ref.
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
describe("BEC-99 fix 3: pre-push hook is installed by createWorktree", () => {
|
|
195
|
+
it("pre-push hook exists in .git/hooks/ after createWorktree", async () => {
|
|
196
|
+
const { origin, clone } = makeSharedRepo();
|
|
197
|
+
dirs.push(origin, clone);
|
|
198
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-hook-"));
|
|
199
|
+
dirs.push(baseDir);
|
|
200
|
+
await createWorktree(clone, "run-hook-check", "agent/BEC-99-hook-test", baseDir);
|
|
201
|
+
const hookPath = join(clone, ".git", "hooks", "pre-push");
|
|
202
|
+
expect(existsSync(hookPath)).toBe(true); // FIX CONFIRMED: hook is now installed
|
|
203
|
+
});
|
|
204
|
+
it("pre-push hook content validates branch name before push", async () => {
|
|
205
|
+
const { origin, clone } = makeSharedRepo();
|
|
206
|
+
dirs.push(origin, clone);
|
|
207
|
+
const baseDir = mkdtempSync(join(tmpdir(), "bec99-hook-content-"));
|
|
208
|
+
dirs.push(baseDir);
|
|
209
|
+
await createWorktree(clone, "run-hook-content", "agent/BEC-99-hook-content", baseDir);
|
|
210
|
+
const hookPath = join(clone, ".git", "hooks", "pre-push");
|
|
211
|
+
const hookContent = readFileSync(hookPath, "utf8");
|
|
212
|
+
// Hook should reference the contamination guard purpose
|
|
213
|
+
expect(hookContent).toMatch(/Linear Agent Framework/);
|
|
214
|
+
expect(hookContent).toMatch(/branch mismatch/i);
|
|
215
|
+
expect(hookContent).toMatch(/exit 1/);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// FIX 4 — Root CLAUDE.md now documents worktree isolation
|
|
220
|
+
//
|
|
221
|
+
// Before BEC-99: CLAUDE.md was silent about shared .git, contamination risks,
|
|
222
|
+
// and safe parallel dispatch patterns.
|
|
223
|
+
// After BEC-99: root CLAUDE.md documents all of these.
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
describe("BEC-99 fix 4: root CLAUDE.md documents worktree isolation model", () => {
|
|
226
|
+
const rootClaudeMdPath = join(new URL("../../../../../", import.meta.url).pathname, "CLAUDE.md");
|
|
227
|
+
it("root CLAUDE.md documents shared .git directory limitation", () => {
|
|
228
|
+
const content = readFileSync(rootClaudeMdPath, "utf8");
|
|
229
|
+
// These patterns are now present after the BEC-99 fix.
|
|
230
|
+
// Note: the regex uses .* to tolerate markdown backtick/bold formatting.
|
|
231
|
+
expect(content).toMatch(/shared.*\.git/i);
|
|
232
|
+
expect(content).toMatch(/cross.?branch contamination/i);
|
|
233
|
+
expect(content).toMatch(/parallel agent dispatch/i);
|
|
234
|
+
// pre-push hook is mentioned as installPrePushHook or pre-push hook
|
|
235
|
+
expect(content).toMatch(/pre.?push/i);
|
|
236
|
+
});
|
|
237
|
+
it("root CLAUDE.md documents cherry-pick recovery procedure", () => {
|
|
238
|
+
const content = readFileSync(rootClaudeMdPath, "utf8");
|
|
239
|
+
expect(content).toMatch(/cherry.?pick/i);
|
|
240
|
+
expect(content).toMatch(/force.?with.?lease/i);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=reproduce-bec99.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce-bec99.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/reproduce-bec99.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEC-116: Validates that `vitest --changed` correctly identifies and executes
|
|
3
|
+
* only the tests affected by recent commits.
|
|
4
|
+
*
|
|
5
|
+
* This test creates an isolated git repository with two test files, commits
|
|
6
|
+
* one of them, modifies it, then runs `vitest --changed` to confirm that
|
|
7
|
+
* only the modified file's tests are collected.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=vitest-changed.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-changed.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/vitest-changed.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|