@telora/daemon 0.12.33
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/.env.example +64 -0
- package/README.md +229 -0
- package/build-info.json +4 -0
- package/dist/activity-tracker.d.ts +13 -0
- package/dist/activity-tracker.d.ts.map +1 -0
- package/dist/activity-tracker.js +19 -0
- package/dist/activity-tracker.js.map +1 -0
- package/dist/agent-state.d.ts +45 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +61 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/audit-hooks.d.ts +12 -0
- package/dist/audit-hooks.d.ts.map +1 -0
- package/dist/audit-hooks.js +45 -0
- package/dist/audit-hooks.js.map +1 -0
- package/dist/auto-update.d.ts +42 -0
- package/dist/auto-update.d.ts.map +1 -0
- package/dist/auto-update.js +96 -0
- package/dist/auto-update.js.map +1 -0
- package/dist/branch-status.d.ts +40 -0
- package/dist/branch-status.d.ts.map +1 -0
- package/dist/branch-status.js +107 -0
- package/dist/branch-status.js.map +1 -0
- package/dist/completion-detector.d.ts +87 -0
- package/dist/completion-detector.d.ts.map +1 -0
- package/dist/completion-detector.js +160 -0
- package/dist/completion-detector.js.map +1 -0
- package/dist/completion-handler.d.ts +48 -0
- package/dist/completion-handler.d.ts.map +1 -0
- package/dist/completion-handler.js +200 -0
- package/dist/completion-handler.js.map +1 -0
- package/dist/condition-evaluators.d.ts +31 -0
- package/dist/condition-evaluators.d.ts.map +1 -0
- package/dist/condition-evaluators.js +416 -0
- package/dist/condition-evaluators.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +311 -0
- package/dist/config.js.map +1 -0
- package/dist/control-state.d.ts +41 -0
- package/dist/control-state.d.ts.map +1 -0
- package/dist/control-state.js +204 -0
- package/dist/control-state.js.map +1 -0
- package/dist/crash-recovery-cleanup.d.ts +21 -0
- package/dist/crash-recovery-cleanup.d.ts.map +1 -0
- package/dist/crash-recovery-cleanup.js +198 -0
- package/dist/crash-recovery-cleanup.js.map +1 -0
- package/dist/crash-recovery-scan.d.ts +19 -0
- package/dist/crash-recovery-scan.d.ts.map +1 -0
- package/dist/crash-recovery-scan.js +145 -0
- package/dist/crash-recovery-scan.js.map +1 -0
- package/dist/crash-recovery-types.d.ts +54 -0
- package/dist/crash-recovery-types.d.ts.map +1 -0
- package/dist/crash-recovery-types.js +13 -0
- package/dist/crash-recovery-types.js.map +1 -0
- package/dist/crash-recovery.d.ts +88 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +448 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/daemon-logs.d.ts +19 -0
- package/dist/daemon-logs.d.ts.map +1 -0
- package/dist/daemon-logs.js +81 -0
- package/dist/daemon-logs.js.map +1 -0
- package/dist/daemon-process.d.ts +154 -0
- package/dist/daemon-process.d.ts.map +1 -0
- package/dist/daemon-process.js +427 -0
- package/dist/daemon-process.js.map +1 -0
- package/dist/dag-validator.d.ts +52 -0
- package/dist/dag-validator.d.ts.map +1 -0
- package/dist/dag-validator.js +199 -0
- package/dist/dag-validator.js.map +1 -0
- package/dist/delivery-guards.d.ts +41 -0
- package/dist/delivery-guards.d.ts.map +1 -0
- package/dist/delivery-guards.js +195 -0
- package/dist/delivery-guards.js.map +1 -0
- package/dist/delivery-lifecycle.d.ts +110 -0
- package/dist/delivery-lifecycle.d.ts.map +1 -0
- package/dist/delivery-lifecycle.js +353 -0
- package/dist/delivery-lifecycle.js.map +1 -0
- package/dist/delivery-merge.d.ts +17 -0
- package/dist/delivery-merge.d.ts.map +1 -0
- package/dist/delivery-merge.js +89 -0
- package/dist/delivery-merge.js.map +1 -0
- package/dist/dependency-resolver.d.ts +77 -0
- package/dist/dependency-resolver.d.ts.map +1 -0
- package/dist/dependency-resolver.js +337 -0
- package/dist/dependency-resolver.js.map +1 -0
- package/dist/evaluation-context.d.ts +49 -0
- package/dist/evaluation-context.d.ts.map +1 -0
- package/dist/evaluation-context.js +98 -0
- package/dist/evaluation-context.js.map +1 -0
- package/dist/git-activity.d.ts +24 -0
- package/dist/git-activity.d.ts.map +1 -0
- package/dist/git-activity.js +97 -0
- package/dist/git-activity.js.map +1 -0
- package/dist/git-branch.d.ts +33 -0
- package/dist/git-branch.d.ts.map +1 -0
- package/dist/git-branch.js +88 -0
- package/dist/git-branch.js.map +1 -0
- package/dist/git-integration.d.ts +27 -0
- package/dist/git-integration.d.ts.map +1 -0
- package/dist/git-integration.js +82 -0
- package/dist/git-integration.js.map +1 -0
- package/dist/git-merge-helpers.d.ts +48 -0
- package/dist/git-merge-helpers.d.ts.map +1 -0
- package/dist/git-merge-helpers.js +105 -0
- package/dist/git-merge-helpers.js.map +1 -0
- package/dist/git-merge-lock.d.ts +67 -0
- package/dist/git-merge-lock.d.ts.map +1 -0
- package/dist/git-merge-lock.js +157 -0
- package/dist/git-merge-lock.js.map +1 -0
- package/dist/git-merge-strategies.d.ts +39 -0
- package/dist/git-merge-strategies.d.ts.map +1 -0
- package/dist/git-merge-strategies.js +127 -0
- package/dist/git-merge-strategies.js.map +1 -0
- package/dist/git-merge.d.ts +80 -0
- package/dist/git-merge.d.ts.map +1 -0
- package/dist/git-merge.js +373 -0
- package/dist/git-merge.js.map +1 -0
- package/dist/git-state-detector.d.ts +24 -0
- package/dist/git-state-detector.d.ts.map +1 -0
- package/dist/git-state-detector.js +122 -0
- package/dist/git-state-detector.js.map +1 -0
- package/dist/git-types.d.ts +40 -0
- package/dist/git-types.d.ts.map +1 -0
- package/dist/git-types.js +23 -0
- package/dist/git-types.js.map +1 -0
- package/dist/git-utils.d.ts +28 -0
- package/dist/git-utils.d.ts.map +1 -0
- package/dist/git-utils.js +57 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/git.d.ts +24 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +64 -0
- package/dist/git.js.map +1 -0
- package/dist/guard-engine.d.ts +19 -0
- package/dist/guard-engine.d.ts.map +1 -0
- package/dist/guard-engine.js +21 -0
- package/dist/guard-engine.js.map +1 -0
- package/dist/guard-evaluator.d.ts +47 -0
- package/dist/guard-evaluator.d.ts.map +1 -0
- package/dist/guard-evaluator.js +193 -0
- package/dist/guard-evaluator.js.map +1 -0
- package/dist/heartbeat.d.ts +73 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +306 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +493 -0
- package/dist/index.js.map +1 -0
- package/dist/listener-auto-advance.d.ts +29 -0
- package/dist/listener-auto-advance.d.ts.map +1 -0
- package/dist/listener-auto-advance.js +172 -0
- package/dist/listener-auto-advance.js.map +1 -0
- package/dist/listener-review.d.ts +37 -0
- package/dist/listener-review.d.ts.map +1 -0
- package/dist/listener-review.js +217 -0
- package/dist/listener-review.js.map +1 -0
- package/dist/listener.d.ts +57 -0
- package/dist/listener.d.ts.map +1 -0
- package/dist/listener.js +361 -0
- package/dist/listener.js.map +1 -0
- package/dist/log-manager.d.ts +18 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +18 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/otlp-log-parser.d.ts +21 -0
- package/dist/otlp-log-parser.d.ts.map +1 -0
- package/dist/otlp-log-parser.js +143 -0
- package/dist/otlp-log-parser.js.map +1 -0
- package/dist/otlp-metric-parser.d.ts +20 -0
- package/dist/otlp-metric-parser.d.ts.map +1 -0
- package/dist/otlp-metric-parser.js +113 -0
- package/dist/otlp-metric-parser.js.map +1 -0
- package/dist/otlp-port-manager.d.ts +26 -0
- package/dist/otlp-port-manager.d.ts.map +1 -0
- package/dist/otlp-port-manager.js +130 -0
- package/dist/otlp-port-manager.js.map +1 -0
- package/dist/otlp-receiver.d.ts +51 -0
- package/dist/otlp-receiver.d.ts.map +1 -0
- package/dist/otlp-receiver.js +663 -0
- package/dist/otlp-receiver.js.map +1 -0
- package/dist/otlp-types.d.ts +92 -0
- package/dist/otlp-types.d.ts.map +1 -0
- package/dist/otlp-types.js +133 -0
- package/dist/otlp-types.js.map +1 -0
- package/dist/output-monitor.d.ts +33 -0
- package/dist/output-monitor.d.ts.map +1 -0
- package/dist/output-monitor.js +67 -0
- package/dist/output-monitor.js.map +1 -0
- package/dist/planning-prompt-builder.d.ts +67 -0
- package/dist/planning-prompt-builder.d.ts.map +1 -0
- package/dist/planning-prompt-builder.js +515 -0
- package/dist/planning-prompt-builder.js.map +1 -0
- package/dist/prompt-builder.d.ts +14 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +174 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/qa-crash-recovery.d.ts +77 -0
- package/dist/qa-crash-recovery.d.ts.map +1 -0
- package/dist/qa-crash-recovery.js +243 -0
- package/dist/qa-crash-recovery.js.map +1 -0
- package/dist/qa-dev-server.d.ts +73 -0
- package/dist/qa-dev-server.d.ts.map +1 -0
- package/dist/qa-dev-server.js +279 -0
- package/dist/qa-dev-server.js.map +1 -0
- package/dist/qa-orchestrator.d.ts +79 -0
- package/dist/qa-orchestrator.d.ts.map +1 -0
- package/dist/qa-orchestrator.js +349 -0
- package/dist/qa-orchestrator.js.map +1 -0
- package/dist/qa-port-allocator.d.ts +34 -0
- package/dist/qa-port-allocator.d.ts.map +1 -0
- package/dist/qa-port-allocator.js +75 -0
- package/dist/qa-port-allocator.js.map +1 -0
- package/dist/qa-provisioner.d.ts +33 -0
- package/dist/qa-provisioner.d.ts.map +1 -0
- package/dist/qa-provisioner.js +141 -0
- package/dist/qa-provisioner.js.map +1 -0
- package/dist/qa-state.d.ts +93 -0
- package/dist/qa-state.d.ts.map +1 -0
- package/dist/qa-state.js +74 -0
- package/dist/qa-state.js.map +1 -0
- package/dist/queries/control-state.d.ts +25 -0
- package/dist/queries/control-state.d.ts.map +1 -0
- package/dist/queries/control-state.js +34 -0
- package/dist/queries/control-state.js.map +1 -0
- package/dist/queries/daemon-connection.d.ts +25 -0
- package/dist/queries/daemon-connection.d.ts.map +1 -0
- package/dist/queries/daemon-connection.js +28 -0
- package/dist/queries/daemon-connection.js.map +1 -0
- package/dist/queries/deliveries.d.ts +100 -0
- package/dist/queries/deliveries.d.ts.map +1 -0
- package/dist/queries/deliveries.js +184 -0
- package/dist/queries/deliveries.js.map +1 -0
- package/dist/queries/git-activity.d.ts +20 -0
- package/dist/queries/git-activity.d.ts.map +1 -0
- package/dist/queries/git-activity.js +22 -0
- package/dist/queries/git-activity.js.map +1 -0
- package/dist/queries/guards.d.ts +47 -0
- package/dist/queries/guards.d.ts.map +1 -0
- package/dist/queries/guards.js +138 -0
- package/dist/queries/guards.js.map +1 -0
- package/dist/queries/index.d.ts +19 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +17 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/issues.d.ts +41 -0
- package/dist/queries/issues.d.ts.map +1 -0
- package/dist/queries/issues.js +67 -0
- package/dist/queries/issues.js.map +1 -0
- package/dist/queries/qa.d.ts +79 -0
- package/dist/queries/qa.d.ts.map +1 -0
- package/dist/queries/qa.js +85 -0
- package/dist/queries/qa.js.map +1 -0
- package/dist/queries/roles.d.ts +13 -0
- package/dist/queries/roles.d.ts.map +1 -0
- package/dist/queries/roles.js +39 -0
- package/dist/queries/roles.js.map +1 -0
- package/dist/queries/schemas.d.ts +777 -0
- package/dist/queries/schemas.d.ts.map +1 -0
- package/dist/queries/schemas.js +391 -0
- package/dist/queries/schemas.js.map +1 -0
- package/dist/queries/sessions.d.ts +64 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +100 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +61 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +187 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/strategies.d.ts +69 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +80 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/workflows.d.ts +17 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +49 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/queries/worktrees.d.ts +38 -0
- package/dist/queries/worktrees.d.ts.map +1 -0
- package/dist/queries/worktrees.js +37 -0
- package/dist/queries/worktrees.js.map +1 -0
- package/dist/self-update.d.ts +94 -0
- package/dist/self-update.d.ts.map +1 -0
- package/dist/self-update.js +438 -0
- package/dist/self-update.js.map +1 -0
- package/dist/session-lifecycle.d.ts +77 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +379 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/shutdown-state.d.ts +17 -0
- package/dist/shutdown-state.d.ts.map +1 -0
- package/dist/shutdown-state.js +22 -0
- package/dist/shutdown-state.js.map +1 -0
- package/dist/spawn-cooldown.d.ts +14 -0
- package/dist/spawn-cooldown.d.ts.map +1 -0
- package/dist/spawn-cooldown.js +34 -0
- package/dist/spawn-cooldown.js.map +1 -0
- package/dist/spawn-environment.d.ts +35 -0
- package/dist/spawn-environment.d.ts.map +1 -0
- package/dist/spawn-environment.js +48 -0
- package/dist/spawn-environment.js.map +1 -0
- package/dist/spawner-liveness.d.ts +23 -0
- package/dist/spawner-liveness.d.ts.map +1 -0
- package/dist/spawner-liveness.js +99 -0
- package/dist/spawner-liveness.js.map +1 -0
- package/dist/spawner-resolution.d.ts +27 -0
- package/dist/spawner-resolution.d.ts.map +1 -0
- package/dist/spawner-resolution.js +99 -0
- package/dist/spawner-resolution.js.map +1 -0
- package/dist/spawner-timeout.d.ts +32 -0
- package/dist/spawner-timeout.d.ts.map +1 -0
- package/dist/spawner-timeout.js +124 -0
- package/dist/spawner-timeout.js.map +1 -0
- package/dist/spawner.d.ts +77 -0
- package/dist/spawner.d.ts.map +1 -0
- package/dist/spawner.js +734 -0
- package/dist/spawner.js.map +1 -0
- package/dist/strategy-completion.d.ts +110 -0
- package/dist/strategy-completion.d.ts.map +1 -0
- package/dist/strategy-completion.js +434 -0
- package/dist/strategy-completion.js.map +1 -0
- package/dist/strategy-engine.d.ts +47 -0
- package/dist/strategy-engine.d.ts.map +1 -0
- package/dist/strategy-engine.js +419 -0
- package/dist/strategy-engine.js.map +1 -0
- package/dist/strategy-executor.d.ts +93 -0
- package/dist/strategy-executor.d.ts.map +1 -0
- package/dist/strategy-executor.js +775 -0
- package/dist/strategy-executor.js.map +1 -0
- package/dist/strategy-lifecycle.d.ts +61 -0
- package/dist/strategy-lifecycle.d.ts.map +1 -0
- package/dist/strategy-lifecycle.js +516 -0
- package/dist/strategy-lifecycle.js.map +1 -0
- package/dist/strategy-merge.d.ts +72 -0
- package/dist/strategy-merge.d.ts.map +1 -0
- package/dist/strategy-merge.js +371 -0
- package/dist/strategy-merge.js.map +1 -0
- package/dist/strategy-prompt-builder.d.ts +62 -0
- package/dist/strategy-prompt-builder.d.ts.map +1 -0
- package/dist/strategy-prompt-builder.js +538 -0
- package/dist/strategy-prompt-builder.js.map +1 -0
- package/dist/strategy-provisioning.d.ts +16 -0
- package/dist/strategy-provisioning.d.ts.map +1 -0
- package/dist/strategy-provisioning.js +119 -0
- package/dist/strategy-provisioning.js.map +1 -0
- package/dist/strategy-team-state.d.ts +24 -0
- package/dist/strategy-team-state.d.ts.map +1 -0
- package/dist/strategy-team-state.js +43 -0
- package/dist/strategy-team-state.js.map +1 -0
- package/dist/strategy-teardown.d.ts +24 -0
- package/dist/strategy-teardown.d.ts.map +1 -0
- package/dist/strategy-teardown.js +158 -0
- package/dist/strategy-teardown.js.map +1 -0
- package/dist/strategy-worktree-state.d.ts +47 -0
- package/dist/strategy-worktree-state.d.ts.map +1 -0
- package/dist/strategy-worktree-state.js +104 -0
- package/dist/strategy-worktree-state.js.map +1 -0
- package/dist/supabase.d.ts +36 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +50 -0
- package/dist/supabase.js.map +1 -0
- package/dist/task-converter.d.ts +61 -0
- package/dist/task-converter.d.ts.map +1 -0
- package/dist/task-converter.js +286 -0
- package/dist/task-converter.js.map +1 -0
- package/dist/task-dag-builder.d.ts +14 -0
- package/dist/task-dag-builder.d.ts.map +1 -0
- package/dist/task-dag-builder.js +17 -0
- package/dist/task-dag-builder.js.map +1 -0
- package/dist/team-prompt-base.d.ts +114 -0
- package/dist/team-prompt-base.d.ts.map +1 -0
- package/dist/team-prompt-base.js +531 -0
- package/dist/team-prompt-base.js.map +1 -0
- package/dist/team-prompt-variants.d.ts +27 -0
- package/dist/team-prompt-variants.d.ts.map +1 -0
- package/dist/team-prompt-variants.js +134 -0
- package/dist/team-prompt-variants.js.map +1 -0
- package/dist/team-spawner.d.ts +50 -0
- package/dist/team-spawner.d.ts.map +1 -0
- package/dist/team-spawner.js +410 -0
- package/dist/team-spawner.js.map +1 -0
- package/dist/telemetry-writer.d.ts +66 -0
- package/dist/telemetry-writer.d.ts.map +1 -0
- package/dist/telemetry-writer.js +96 -0
- package/dist/telemetry-writer.js.map +1 -0
- package/dist/trigger-executor.d.ts +56 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +313 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/types/config.d.ts +60 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/dag.d.ts +53 -0
- package/dist/types/dag.d.ts.map +1 -0
- package/dist/types/dag.js +5 -0
- package/dist/types/dag.js.map +1 -0
- package/dist/types/delivery.d.ts +71 -0
- package/dist/types/delivery.d.ts.map +1 -0
- package/dist/types/delivery.js +5 -0
- package/dist/types/delivery.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issue.d.ts +22 -0
- package/dist/types/issue.d.ts.map +1 -0
- package/dist/types/issue.js +5 -0
- package/dist/types/issue.js.map +1 -0
- package/dist/types/merge.d.ts +28 -0
- package/dist/types/merge.d.ts.map +1 -0
- package/dist/types/merge.js +5 -0
- package/dist/types/merge.js.map +1 -0
- package/dist/types/session.d.ts +98 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/strategy.d.ts +175 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +5 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/types/workflow.d.ts +34 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +9 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-init.d.ts +16 -0
- package/dist/unified-init.d.ts.map +1 -0
- package/dist/unified-init.js +183 -0
- package/dist/unified-init.js.map +1 -0
- package/dist/unified-shell-config.d.ts +34 -0
- package/dist/unified-shell-config.d.ts.map +1 -0
- package/dist/unified-shell-config.js +238 -0
- package/dist/unified-shell-config.js.map +1 -0
- package/dist/unified-shell-status.d.ts +15 -0
- package/dist/unified-shell-status.d.ts.map +1 -0
- package/dist/unified-shell-status.js +100 -0
- package/dist/unified-shell-status.js.map +1 -0
- package/dist/unified-shell.d.ts +50 -0
- package/dist/unified-shell.d.ts.map +1 -0
- package/dist/unified-shell.js +682 -0
- package/dist/unified-shell.js.map +1 -0
- package/dist/version-check.d.ts +19 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +67 -0
- package/dist/version-check.js.map +1 -0
- package/dist/workflow-engine.d.ts +95 -0
- package/dist/workflow-engine.d.ts.map +1 -0
- package/dist/workflow-engine.js +165 -0
- package/dist/workflow-engine.js.map +1 -0
- package/dist/worktree-merge.d.ts +23 -0
- package/dist/worktree-merge.d.ts.map +1 -0
- package/dist/worktree-merge.js +57 -0
- package/dist/worktree-merge.js.map +1 -0
- package/dist/worktree-safety.d.ts +48 -0
- package/dist/worktree-safety.d.ts.map +1 -0
- package/dist/worktree-safety.js +113 -0
- package/dist/worktree-safety.js.map +1 -0
- package/dist/worktree-strategy.d.ts +69 -0
- package/dist/worktree-strategy.d.ts.map +1 -0
- package/dist/worktree-strategy.js +214 -0
- package/dist/worktree-strategy.js.map +1 -0
- package/dist/worktree.d.ts +159 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +512 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +76 -0
- package/scripts/telora-daemon-wrapper.sh +31 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge strategy implementations.
|
|
3
|
+
*
|
|
4
|
+
* Individual merge strategies (fast-forward, rebase, merge-commit, squash)
|
|
5
|
+
* and the dispatch function that selects the appropriate strategy.
|
|
6
|
+
*/
|
|
7
|
+
import { type MergeResult, type MergeStrategy } from './git-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Attempt a fast-forward-only merge.
|
|
10
|
+
* Returns a MergeResult; on failure, no abort is needed (ff-only is atomic).
|
|
11
|
+
*/
|
|
12
|
+
export declare function tryFastForwardMerge(repoPath: string, sourceBranch: string): MergeResult;
|
|
13
|
+
/**
|
|
14
|
+
* Attempt a rebase merge.
|
|
15
|
+
* On conflict, aborts the rebase and returns conflicted file details.
|
|
16
|
+
*/
|
|
17
|
+
export declare function tryRebaseMerge(repoPath: string, sourceBranch: string): MergeResult;
|
|
18
|
+
/**
|
|
19
|
+
* Attempt a merge-commit merge (--no-ff).
|
|
20
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
21
|
+
*/
|
|
22
|
+
export declare function tryMergeCommit(repoPath: string, sourceBranch: string, commitMessage: string): MergeResult;
|
|
23
|
+
/**
|
|
24
|
+
* Attempt a squash merge: stages all changes from the source branch as a
|
|
25
|
+
* single commit on the current branch.
|
|
26
|
+
*
|
|
27
|
+
* 1. `git merge --squash <sourceBranch>` -- stages all diffs without committing
|
|
28
|
+
* 2. `git commit -m <commitMessage>` -- creates a single squashed commit
|
|
29
|
+
* 3. Captures the resulting commit SHA via `git rev-parse HEAD`
|
|
30
|
+
*
|
|
31
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
32
|
+
*/
|
|
33
|
+
export declare function trySquashMerge(repoPath: string, sourceBranch: string, commitMessage: string): MergeResult;
|
|
34
|
+
/**
|
|
35
|
+
* Dispatch to the appropriate merge strategy helper.
|
|
36
|
+
* For 'merge-commit', tries fast-forward first, then falls back to --no-ff.
|
|
37
|
+
*/
|
|
38
|
+
export declare function applyMergeStrategy(repoPath: string, sourceBranch: string, targetBranch: string, strategy: MergeStrategy): MergeResult;
|
|
39
|
+
//# sourceMappingURL=git-merge-strategies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-merge-strategies.d.ts","sourceRoot":"","sources":["../src/git-merge-strategies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGlF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,WAAW,CASb;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,WAAW,CAab;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,WAAW,CA4Bb;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,WAAW,CA8Cb;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,aAAa,GACtB,WAAW,CAmBb"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge strategy implementations.
|
|
3
|
+
*
|
|
4
|
+
* Individual merge strategies (fast-forward, rebase, merge-commit, squash)
|
|
5
|
+
* and the dispatch function that selects the appropriate strategy.
|
|
6
|
+
*/
|
|
7
|
+
import { runGitSync } from './git-types.js';
|
|
8
|
+
import { extractConflictedFiles } from './git-merge-helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Attempt a fast-forward-only merge.
|
|
11
|
+
* Returns a MergeResult; on failure, no abort is needed (ff-only is atomic).
|
|
12
|
+
*/
|
|
13
|
+
export function tryFastForwardMerge(repoPath, sourceBranch) {
|
|
14
|
+
const ffResult = runGitSync(['merge', '--ff-only', sourceBranch], repoPath);
|
|
15
|
+
if (ffResult.success) {
|
|
16
|
+
return { success: true };
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
success: false,
|
|
20
|
+
error: `Fast-forward merge not possible: ${ffResult.error}`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Attempt a rebase merge.
|
|
25
|
+
* On conflict, aborts the rebase and returns conflicted file details.
|
|
26
|
+
*/
|
|
27
|
+
export function tryRebaseMerge(repoPath, sourceBranch) {
|
|
28
|
+
const rebaseResult = runGitSync(['rebase', sourceBranch], repoPath);
|
|
29
|
+
if (rebaseResult.success) {
|
|
30
|
+
return { success: true };
|
|
31
|
+
}
|
|
32
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
33
|
+
runGitSync(['rebase', '--abort'], repoPath);
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
error: `Rebase failed: ${conflictedFiles.length} file(s) conflicted`,
|
|
37
|
+
conflictedFiles,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Attempt a merge-commit merge (--no-ff).
|
|
42
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
43
|
+
*/
|
|
44
|
+
export function tryMergeCommit(repoPath, sourceBranch, commitMessage) {
|
|
45
|
+
const mergeResult = runGitSync(['merge', sourceBranch, '--no-ff', '-m', commitMessage], repoPath);
|
|
46
|
+
if (mergeResult.success) {
|
|
47
|
+
return { success: true };
|
|
48
|
+
}
|
|
49
|
+
const isConflict = mergeResult.error.includes('CONFLICT') ||
|
|
50
|
+
mergeResult.error.includes('Automatic merge failed') ||
|
|
51
|
+
mergeResult.output.includes('CONFLICT');
|
|
52
|
+
if (isConflict) {
|
|
53
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
54
|
+
runGitSync(['merge', '--abort'], repoPath);
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
error: `Merge conflict: ${conflictedFiles.length} file(s) conflicted`,
|
|
58
|
+
conflictedFiles,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
error: `Merge failed: ${mergeResult.error}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Attempt a squash merge: stages all changes from the source branch as a
|
|
68
|
+
* single commit on the current branch.
|
|
69
|
+
*
|
|
70
|
+
* 1. `git merge --squash <sourceBranch>` -- stages all diffs without committing
|
|
71
|
+
* 2. `git commit -m <commitMessage>` -- creates a single squashed commit
|
|
72
|
+
* 3. Captures the resulting commit SHA via `git rev-parse HEAD`
|
|
73
|
+
*
|
|
74
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
75
|
+
*/
|
|
76
|
+
export function trySquashMerge(repoPath, sourceBranch, commitMessage) {
|
|
77
|
+
const squashResult = runGitSync(['merge', '--squash', sourceBranch], repoPath);
|
|
78
|
+
if (!squashResult.success) {
|
|
79
|
+
const isConflict = squashResult.error.includes('CONFLICT') ||
|
|
80
|
+
squashResult.error.includes('Automatic merge failed') ||
|
|
81
|
+
squashResult.output.includes('CONFLICT');
|
|
82
|
+
if (isConflict) {
|
|
83
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
84
|
+
runGitSync(['merge', '--abort'], repoPath);
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
error: `Squash merge conflict: ${conflictedFiles.length} file(s) conflicted`,
|
|
88
|
+
conflictedFiles,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
error: `Squash merge failed: ${squashResult.error}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Commit the squashed changes
|
|
97
|
+
const commitResult = runGitSync(['commit', '-m', commitMessage], repoPath);
|
|
98
|
+
if (!commitResult.success) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
error: `Squash merge commit failed: ${commitResult.error}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Capture the resulting commit SHA
|
|
105
|
+
const shaResult = runGitSync(['rev-parse', 'HEAD'], repoPath);
|
|
106
|
+
const commitSha = shaResult.success ? shaResult.output : undefined;
|
|
107
|
+
return { success: true, commitSha };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Dispatch to the appropriate merge strategy helper.
|
|
111
|
+
* For 'merge-commit', tries fast-forward first, then falls back to --no-ff.
|
|
112
|
+
*/
|
|
113
|
+
export function applyMergeStrategy(repoPath, sourceBranch, targetBranch, strategy) {
|
|
114
|
+
if (strategy === 'fast-forward') {
|
|
115
|
+
return tryFastForwardMerge(repoPath, sourceBranch);
|
|
116
|
+
}
|
|
117
|
+
if (strategy === 'rebase') {
|
|
118
|
+
return tryRebaseMerge(repoPath, sourceBranch);
|
|
119
|
+
}
|
|
120
|
+
// 'merge-commit': try ff first, fall back to --no-ff
|
|
121
|
+
const ffResult = tryFastForwardMerge(repoPath, sourceBranch);
|
|
122
|
+
if (ffResult.success) {
|
|
123
|
+
return ffResult;
|
|
124
|
+
}
|
|
125
|
+
return tryMergeCommit(repoPath, sourceBranch, `Advance ${targetBranch} to ${sourceBranch}`);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=git-merge-strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-merge-strategies.js","sourceRoot":"","sources":["../src/git-merge-strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge operations for the git subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Handles merging agent branches into integration, merge strategy dispatch,
|
|
5
|
+
* push failure handling with rollback, and stash management.
|
|
6
|
+
*/
|
|
7
|
+
import type { DaemonConfig, MergeBackResult } from './types.js';
|
|
8
|
+
import { type MergeResult, type MergeStrategy } from './git-types.js';
|
|
9
|
+
import { type CorruptionDetails } from './git-merge-lock.js';
|
|
10
|
+
interface PushFailureRollbackParams {
|
|
11
|
+
repoPath: string;
|
|
12
|
+
branch: string;
|
|
13
|
+
preMergeRef: string;
|
|
14
|
+
pushError: string;
|
|
15
|
+
sourceBranch: string;
|
|
16
|
+
targetBranch: string;
|
|
17
|
+
onRollbackFailure?: (details: CorruptionDetails) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Handle a push failure with rollback. If rollback also fails, marks the
|
|
21
|
+
* branch as corrupt and returns a result indicating the failure.
|
|
22
|
+
*/
|
|
23
|
+
export declare function handlePushFailureWithRollback(params: PushFailureRollbackParams): MergeResult;
|
|
24
|
+
/**
|
|
25
|
+
* Attempt a squash merge: stages all changes from the source branch as a
|
|
26
|
+
* single commit on the current branch.
|
|
27
|
+
*
|
|
28
|
+
* 1. `git merge --squash <sourceBranch>` -- stages all diffs without committing
|
|
29
|
+
* 2. `git commit -m <commitMessage>` -- creates a single squashed commit
|
|
30
|
+
* 3. Captures the resulting commit SHA via `git rev-parse HEAD`
|
|
31
|
+
*
|
|
32
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
33
|
+
*/
|
|
34
|
+
export declare function trySquashMerge(repoPath: string, sourceBranch: string, commitMessage: string): MergeResult;
|
|
35
|
+
/**
|
|
36
|
+
* Dispatch to the appropriate merge strategy helper.
|
|
37
|
+
* For 'merge-commit', tries fast-forward first, then falls back to --no-ff.
|
|
38
|
+
*/
|
|
39
|
+
export declare function applyMergeStrategy(repoPath: string, sourceBranch: string, targetBranch: string, strategy: MergeStrategy): MergeResult;
|
|
40
|
+
export interface MergeToIntegrationParams {
|
|
41
|
+
config: DaemonConfig;
|
|
42
|
+
branchName: string;
|
|
43
|
+
deliveryName: string;
|
|
44
|
+
deliveryId: string;
|
|
45
|
+
onRollbackFailure?: (details: {
|
|
46
|
+
branch: string;
|
|
47
|
+
attemptedRollbackRef: string;
|
|
48
|
+
currentHead: string;
|
|
49
|
+
}) => void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Merge an agent branch into the integration branch.
|
|
53
|
+
*
|
|
54
|
+
* Operates entirely within the persistent merge worktree -- the main
|
|
55
|
+
* repo working tree is never touched (no stash, no branch switch).
|
|
56
|
+
*
|
|
57
|
+
* Returns structured result with conflict details when merge fails.
|
|
58
|
+
* Serialized via the merge lock to prevent concurrent checkout races.
|
|
59
|
+
*/
|
|
60
|
+
export declare function mergeToIntegration(params: MergeToIntegrationParams): Promise<MergeResult>;
|
|
61
|
+
export interface MergeBackFromIntegrationParams {
|
|
62
|
+
/** Path to the strategy/delivery worktree. */
|
|
63
|
+
worktreePath: string;
|
|
64
|
+
/** Name of the integration branch (e.g., 'integration'). */
|
|
65
|
+
integrationBranch: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Merge the latest integration HEAD into the current branch of a worktree.
|
|
69
|
+
*
|
|
70
|
+
* This is the "prevent conflicts" layer: by syncing integration changes into
|
|
71
|
+
* the strategy branch before merging to integration, we guarantee the final
|
|
72
|
+
* merge will be conflict-free (or surface conflicts early for agent resolution).
|
|
73
|
+
*
|
|
74
|
+
* On conflict: does NOT abort -- leaves conflict markers in the worktree
|
|
75
|
+
* so the agent can resolve them (see Delivery 3/4).
|
|
76
|
+
* On error (e.g., dirty working tree): returns error status.
|
|
77
|
+
*/
|
|
78
|
+
export declare function mergeBackFromIntegration(params: MergeBackFromIntegrationParams): Promise<MergeBackResult>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=git-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-merge.d.ts","sourceRoot":"","sources":["../src/git-merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmCpG,UAAU,yBAAyB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC1D;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,yBAAyB,GAAG,WAAW,CA8C5F;AA0HD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,WAAW,CA8Cb;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,aAAa,GACtB,WAAW,CAmBb;AAID,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9G;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,WAAW,CAAC,CA+FtB;AAID,MAAM,WAAW,8BAA8B;IAC7C,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,eAAe,CAAC,CAgE1B"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge operations for the git subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Handles merging agent branches into integration, merge strategy dispatch,
|
|
5
|
+
* push failure handling with rollback, and stash management.
|
|
6
|
+
*/
|
|
7
|
+
import { runGitSync } from './git-types.js';
|
|
8
|
+
import { withMergeLock, markIntegrationCorrupt } from './git-merge-lock.js';
|
|
9
|
+
import { withRetry } from '@telora/daemon-core';
|
|
10
|
+
import { getMergeWorktreePath } from './worktree.js';
|
|
11
|
+
// ── Internal helpers (non-exported) ──────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Returns true if the repo at repoPath has an 'origin' remote configured.
|
|
14
|
+
* Used to gate all network operations so the daemon works in remote-less repos.
|
|
15
|
+
*/
|
|
16
|
+
function hasOriginRemote(repoPath) {
|
|
17
|
+
return runGitSync(['remote', 'get-url', 'origin'], repoPath, { timeoutMs: 3_000 }).success;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract the list of conflicted files from git status.
|
|
21
|
+
* Returns an empty array if the command fails or there are no conflicts.
|
|
22
|
+
*/
|
|
23
|
+
function extractConflictedFiles(repoPath) {
|
|
24
|
+
const statusResult = runGitSync(['diff', '--name-only', '--diff-filter=U'], repoPath);
|
|
25
|
+
if (!statusResult.success) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return statusResult.output.split('\n').filter(Boolean);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Hard-reset the current branch to a given ref.
|
|
32
|
+
* Returns whether the rollback succeeded.
|
|
33
|
+
*/
|
|
34
|
+
function rollbackToRef(repoPath, ref) {
|
|
35
|
+
const result = runGitSync(['reset', '--hard', ref], repoPath);
|
|
36
|
+
return result.success;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Handle a push failure with rollback. If rollback also fails, marks the
|
|
40
|
+
* branch as corrupt and returns a result indicating the failure.
|
|
41
|
+
*/
|
|
42
|
+
export function handlePushFailureWithRollback(params) {
|
|
43
|
+
const { repoPath, branch, preMergeRef, pushError, sourceBranch, targetBranch, onRollbackFailure } = params;
|
|
44
|
+
console.error(`Push to origin failed for ${branch}: ${pushError}`);
|
|
45
|
+
const rollbackSuccess = rollbackToRef(repoPath, preMergeRef);
|
|
46
|
+
if (rollbackSuccess) {
|
|
47
|
+
console.log(`Rolled back local merge to ${preMergeRef.slice(0, 8)}`);
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
error: `Push failed (local merge rolled back): ${pushError}. Branch ${sourceBranch} preserved for retry.`,
|
|
51
|
+
sourceBranch,
|
|
52
|
+
targetBranch,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Rollback also failed -- mark as corrupt
|
|
56
|
+
const currentHeadResult = runGitSync(['rev-parse', 'HEAD'], repoPath);
|
|
57
|
+
const currentHead = currentHeadResult.success ? currentHeadResult.output : 'unknown';
|
|
58
|
+
const details = {
|
|
59
|
+
branch,
|
|
60
|
+
attemptedRollbackRef: preMergeRef,
|
|
61
|
+
currentHead,
|
|
62
|
+
};
|
|
63
|
+
markIntegrationCorrupt(details);
|
|
64
|
+
console.error(`[merge-lock] CRITICAL: Push failed AND rollback failed for "${branch}". ` +
|
|
65
|
+
`Branch is in a corrupt state. Attempted rollback to ${preMergeRef}, ` +
|
|
66
|
+
`current HEAD: ${currentHead}. All further merge operations will be rejected ` +
|
|
67
|
+
`until manual recovery and daemon restart.`);
|
|
68
|
+
if (onRollbackFailure) {
|
|
69
|
+
onRollbackFailure(details);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Push failed AND rollback failed. Branch "${branch}" is corrupt. ` +
|
|
74
|
+
`Manual recovery required: git reset --hard origin/${branch}`,
|
|
75
|
+
sourceBranch,
|
|
76
|
+
targetBranch,
|
|
77
|
+
rollbackFailed: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handle untracked files that block a merge.
|
|
82
|
+
*
|
|
83
|
+
* When agents create new files (e.g. migrations) that also exist as
|
|
84
|
+
* untracked files in the main repo working directory, git refuses to
|
|
85
|
+
* merge. This helper parses the error output, removes the blocking
|
|
86
|
+
* files, and returns true if blocking files were cleaned.
|
|
87
|
+
*/
|
|
88
|
+
function handleUntrackedFilesBlockingMerge(repoPath, errorOutput) {
|
|
89
|
+
const isUntrackedBlock = errorOutput.includes('untracked working tree files would be overwritten') ||
|
|
90
|
+
errorOutput.includes('would be overwritten by merge');
|
|
91
|
+
if (!isUntrackedBlock) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const lines = errorOutput.split('\n');
|
|
95
|
+
const blockingFiles = lines
|
|
96
|
+
.map((l) => l.trim())
|
|
97
|
+
.filter((l) => l &&
|
|
98
|
+
!l.startsWith('error:') &&
|
|
99
|
+
!l.startsWith('Please') &&
|
|
100
|
+
!l.startsWith('Aborting'));
|
|
101
|
+
if (blockingFiles.length === 0) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
console.log(`Removing ${blockingFiles.length} untracked file(s) blocking merge: ${blockingFiles.join(', ')}`);
|
|
105
|
+
runGitSync(['clean', '-f', '--', ...blockingFiles], repoPath);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Attempt a fast-forward-only merge.
|
|
110
|
+
* Returns a MergeResult; on failure, no abort is needed (ff-only is atomic).
|
|
111
|
+
*/
|
|
112
|
+
function tryFastForwardMerge(repoPath, sourceBranch) {
|
|
113
|
+
const ffResult = runGitSync(['merge', '--ff-only', sourceBranch], repoPath);
|
|
114
|
+
if (ffResult.success) {
|
|
115
|
+
return { success: true };
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success: false,
|
|
119
|
+
error: `Fast-forward merge not possible: ${ffResult.error}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Attempt a rebase merge.
|
|
124
|
+
* On conflict, aborts the rebase and returns conflicted file details.
|
|
125
|
+
*/
|
|
126
|
+
function tryRebaseMerge(repoPath, sourceBranch) {
|
|
127
|
+
const rebaseResult = runGitSync(['rebase', sourceBranch], repoPath);
|
|
128
|
+
if (rebaseResult.success) {
|
|
129
|
+
return { success: true };
|
|
130
|
+
}
|
|
131
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
132
|
+
runGitSync(['rebase', '--abort'], repoPath);
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
error: `Rebase failed: ${conflictedFiles.length} file(s) conflicted`,
|
|
136
|
+
conflictedFiles,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Attempt a merge-commit merge (--no-ff).
|
|
141
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
142
|
+
*/
|
|
143
|
+
function tryMergeCommit(repoPath, sourceBranch, commitMessage) {
|
|
144
|
+
const mergeResult = runGitSync(['merge', sourceBranch, '--no-ff', '-m', commitMessage], repoPath);
|
|
145
|
+
if (mergeResult.success) {
|
|
146
|
+
return { success: true };
|
|
147
|
+
}
|
|
148
|
+
const isConflict = mergeResult.error.includes('CONFLICT') ||
|
|
149
|
+
mergeResult.error.includes('Automatic merge failed') ||
|
|
150
|
+
mergeResult.output.includes('CONFLICT');
|
|
151
|
+
if (isConflict) {
|
|
152
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
153
|
+
runGitSync(['merge', '--abort'], repoPath);
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
error: `Merge conflict: ${conflictedFiles.length} file(s) conflicted`,
|
|
157
|
+
conflictedFiles,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
error: `Merge failed: ${mergeResult.error}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Attempt a squash merge: stages all changes from the source branch as a
|
|
167
|
+
* single commit on the current branch.
|
|
168
|
+
*
|
|
169
|
+
* 1. `git merge --squash <sourceBranch>` -- stages all diffs without committing
|
|
170
|
+
* 2. `git commit -m <commitMessage>` -- creates a single squashed commit
|
|
171
|
+
* 3. Captures the resulting commit SHA via `git rev-parse HEAD`
|
|
172
|
+
*
|
|
173
|
+
* On conflict, aborts the merge and returns conflicted file details.
|
|
174
|
+
*/
|
|
175
|
+
export function trySquashMerge(repoPath, sourceBranch, commitMessage) {
|
|
176
|
+
const squashResult = runGitSync(['merge', '--squash', sourceBranch], repoPath);
|
|
177
|
+
if (!squashResult.success) {
|
|
178
|
+
const isConflict = squashResult.error.includes('CONFLICT') ||
|
|
179
|
+
squashResult.error.includes('Automatic merge failed') ||
|
|
180
|
+
squashResult.output.includes('CONFLICT');
|
|
181
|
+
if (isConflict) {
|
|
182
|
+
const conflictedFiles = extractConflictedFiles(repoPath);
|
|
183
|
+
runGitSync(['merge', '--abort'], repoPath);
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: `Squash merge conflict: ${conflictedFiles.length} file(s) conflicted`,
|
|
187
|
+
conflictedFiles,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
success: false,
|
|
192
|
+
error: `Squash merge failed: ${squashResult.error}`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// Commit the squashed changes
|
|
196
|
+
const commitResult = runGitSync(['commit', '-m', commitMessage], repoPath);
|
|
197
|
+
if (!commitResult.success) {
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: `Squash merge commit failed: ${commitResult.error}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Capture the resulting commit SHA
|
|
204
|
+
const shaResult = runGitSync(['rev-parse', 'HEAD'], repoPath);
|
|
205
|
+
const commitSha = shaResult.success ? shaResult.output : undefined;
|
|
206
|
+
return { success: true, commitSha };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Dispatch to the appropriate merge strategy helper.
|
|
210
|
+
* For 'merge-commit', tries fast-forward first, then falls back to --no-ff.
|
|
211
|
+
*/
|
|
212
|
+
export function applyMergeStrategy(repoPath, sourceBranch, targetBranch, strategy) {
|
|
213
|
+
if (strategy === 'fast-forward') {
|
|
214
|
+
return tryFastForwardMerge(repoPath, sourceBranch);
|
|
215
|
+
}
|
|
216
|
+
if (strategy === 'rebase') {
|
|
217
|
+
return tryRebaseMerge(repoPath, sourceBranch);
|
|
218
|
+
}
|
|
219
|
+
// 'merge-commit': try ff first, fall back to --no-ff
|
|
220
|
+
const ffResult = tryFastForwardMerge(repoPath, sourceBranch);
|
|
221
|
+
if (ffResult.success) {
|
|
222
|
+
return ffResult;
|
|
223
|
+
}
|
|
224
|
+
return tryMergeCommit(repoPath, sourceBranch, `Advance ${targetBranch} to ${sourceBranch}`);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Merge an agent branch into the integration branch.
|
|
228
|
+
*
|
|
229
|
+
* Operates entirely within the persistent merge worktree -- the main
|
|
230
|
+
* repo working tree is never touched (no stash, no branch switch).
|
|
231
|
+
*
|
|
232
|
+
* Returns structured result with conflict details when merge fails.
|
|
233
|
+
* Serialized via the merge lock to prevent concurrent checkout races.
|
|
234
|
+
*/
|
|
235
|
+
export function mergeToIntegration(params) {
|
|
236
|
+
const { config, branchName, deliveryName, deliveryId, onRollbackFailure } = params;
|
|
237
|
+
return withMergeLock(async () => {
|
|
238
|
+
const mwt = getMergeWorktreePath(config);
|
|
239
|
+
const withRemote = hasOriginRemote(config.repoPath);
|
|
240
|
+
// Fetch latest refs so the merge worktree sees agent branches and remote state
|
|
241
|
+
if (withRemote) {
|
|
242
|
+
runGitSync(['fetch', 'origin'], config.repoPath);
|
|
243
|
+
}
|
|
244
|
+
// Checkout integration branch in the merge worktree
|
|
245
|
+
const checkoutResult = runGitSync(['checkout', config.integrationBranch], mwt);
|
|
246
|
+
if (!checkoutResult.success) {
|
|
247
|
+
return {
|
|
248
|
+
success: false,
|
|
249
|
+
error: `Failed to checkout integration branch: ${checkoutResult.error}`,
|
|
250
|
+
sourceBranch: branchName,
|
|
251
|
+
targetBranch: config.integrationBranch,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Pull latest integration from remote (only if remote exists)
|
|
255
|
+
if (withRemote) {
|
|
256
|
+
runGitSync(['pull', 'origin', config.integrationBranch], mwt);
|
|
257
|
+
}
|
|
258
|
+
// Save pre-merge state so we can rollback if push fails
|
|
259
|
+
const preMergeRef = runGitSync(['rev-parse', 'HEAD'], mwt);
|
|
260
|
+
const commitMessage = `Merge agent work: ${deliveryName} [${deliveryId}]`;
|
|
261
|
+
// Try fast-forward first, fall back to merge commit.
|
|
262
|
+
// We use real merges (not squash) so git preserves the ancestry
|
|
263
|
+
// relationship -- this is critical for worktree cleanup, which uses
|
|
264
|
+
// `git log integration..<branch>` to detect unmerged commits.
|
|
265
|
+
let result = tryFastForwardMerge(mwt, branchName);
|
|
266
|
+
if (!result.success) {
|
|
267
|
+
result = tryMergeCommit(mwt, branchName, commitMessage);
|
|
268
|
+
}
|
|
269
|
+
if (!result.success && result.error && handleUntrackedFilesBlockingMerge(mwt, result.error)) {
|
|
270
|
+
result = tryMergeCommit(mwt, branchName, commitMessage);
|
|
271
|
+
}
|
|
272
|
+
if (!result.success) {
|
|
273
|
+
return {
|
|
274
|
+
...result,
|
|
275
|
+
error: `${result.error ?? 'Unknown error'} (merging ${branchName} into ${config.integrationBranch})`,
|
|
276
|
+
sourceBranch: branchName,
|
|
277
|
+
targetBranch: config.integrationBranch,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Capture the merge commit SHA (from --no-ff merge or ff HEAD)
|
|
281
|
+
const shaResult = runGitSync(['rev-parse', 'HEAD'], mwt);
|
|
282
|
+
if (!result.commitSha && shaResult.success) {
|
|
283
|
+
result = { ...result, commitSha: shaResult.output };
|
|
284
|
+
}
|
|
285
|
+
// Push to remote (only if remote exists)
|
|
286
|
+
if (withRemote) {
|
|
287
|
+
const pushResult = runGitSync(['push', 'origin', config.integrationBranch], mwt);
|
|
288
|
+
if (!pushResult.success) {
|
|
289
|
+
if (preMergeRef.success) {
|
|
290
|
+
return handlePushFailureWithRollback({
|
|
291
|
+
repoPath: mwt,
|
|
292
|
+
branch: config.integrationBranch,
|
|
293
|
+
preMergeRef: preMergeRef.output,
|
|
294
|
+
pushError: pushResult.error,
|
|
295
|
+
sourceBranch: branchName,
|
|
296
|
+
targetBranch: config.integrationBranch,
|
|
297
|
+
onRollbackFailure,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
success: false,
|
|
302
|
+
error: `Push failed (no pre-merge ref for rollback): ${pushResult.error}`,
|
|
303
|
+
sourceBranch: branchName,
|
|
304
|
+
targetBranch: config.integrationBranch,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
console.log(`Successfully merged ${branchName} into ${config.integrationBranch}`);
|
|
309
|
+
return { success: true, commitSha: result.commitSha };
|
|
310
|
+
}, `mergeToIntegration:${deliveryName}`);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Merge the latest integration HEAD into the current branch of a worktree.
|
|
314
|
+
*
|
|
315
|
+
* This is the "prevent conflicts" layer: by syncing integration changes into
|
|
316
|
+
* the strategy branch before merging to integration, we guarantee the final
|
|
317
|
+
* merge will be conflict-free (or surface conflicts early for agent resolution).
|
|
318
|
+
*
|
|
319
|
+
* On conflict: does NOT abort -- leaves conflict markers in the worktree
|
|
320
|
+
* so the agent can resolve them (see Delivery 3/4).
|
|
321
|
+
* On error (e.g., dirty working tree): returns error status.
|
|
322
|
+
*/
|
|
323
|
+
export async function mergeBackFromIntegration(params) {
|
|
324
|
+
const { worktreePath, integrationBranch } = params;
|
|
325
|
+
// Step 1: Fetch latest integration HEAD from remote (if origin exists)
|
|
326
|
+
const withRemote = hasOriginRemote(worktreePath);
|
|
327
|
+
if (withRemote) {
|
|
328
|
+
try {
|
|
329
|
+
await withRetry(async () => {
|
|
330
|
+
const fetchResult = runGitSync(['fetch', 'origin', integrationBranch], worktreePath);
|
|
331
|
+
if (!fetchResult.success) {
|
|
332
|
+
throw new Error(`git fetch failed: ${fetchResult.error}`);
|
|
333
|
+
}
|
|
334
|
+
}, { maxAttempts: 3, label: `merge-back-fetch-${integrationBranch}` });
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
return {
|
|
338
|
+
status: 'error',
|
|
339
|
+
message: `Failed to fetch integration branch: ${err.message}`,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Step 2: Merge integration into the current branch.
|
|
344
|
+
// Use origin/<branch> when remote exists (ensures we merge the pushed tip),
|
|
345
|
+
// otherwise merge the local branch directly.
|
|
346
|
+
const mergeRef = withRemote ? `origin/${integrationBranch}` : integrationBranch;
|
|
347
|
+
const mergeResult = runGitSync(['merge', mergeRef], worktreePath);
|
|
348
|
+
if (mergeResult.success) {
|
|
349
|
+
return {
|
|
350
|
+
status: 'clean',
|
|
351
|
+
message: `Merged ${mergeRef} cleanly`,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// Step 3: Determine if this is a conflict or an error
|
|
355
|
+
const isConflict = mergeResult.error.includes('CONFLICT') ||
|
|
356
|
+
mergeResult.error.includes('Automatic merge failed') ||
|
|
357
|
+
mergeResult.output.includes('CONFLICT');
|
|
358
|
+
if (isConflict) {
|
|
359
|
+
// Do NOT abort -- leave conflict markers for agent resolution
|
|
360
|
+
const conflictFiles = extractConflictedFiles(worktreePath);
|
|
361
|
+
return {
|
|
362
|
+
status: 'conflict',
|
|
363
|
+
conflictFiles,
|
|
364
|
+
message: `Merge conflict: ${conflictFiles.length} file(s) conflicted when merging origin/${integrationBranch}`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
// Non-conflict error (e.g., dirty working tree, merge already in progress)
|
|
368
|
+
return {
|
|
369
|
+
status: 'error',
|
|
370
|
+
message: `Merge failed: ${mergeResult.error}`,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=git-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-merge.js","sourceRoot":"","sources":["../src/git-merge.ts"],"names":[],"mappings":"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"}
|