@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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree safety checks and guards.
|
|
3
|
+
*
|
|
4
|
+
* Uncommitted change detection, unmerged commit checks, safety commits,
|
|
5
|
+
* guarded worktree removal, and WIP commit after agent exit.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { runGitSync } from './git-types.js';
|
|
9
|
+
import { commitWip, removeWorktreeBase, } from '@telora/daemon-core';
|
|
10
|
+
/**
|
|
11
|
+
* Check if a worktree has uncommitted changes (dirty working tree).
|
|
12
|
+
*/
|
|
13
|
+
export function worktreeHasUncommittedChanges(worktreePath) {
|
|
14
|
+
if (!existsSync(worktreePath))
|
|
15
|
+
return false;
|
|
16
|
+
const result = runGitSync(['status', '--porcelain'], worktreePath);
|
|
17
|
+
return result.success && result.output.trim().length > 0;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a branch has commits not yet merged into a target branch.
|
|
21
|
+
*/
|
|
22
|
+
export function branchHasUnmergedCommits(branchName, targetBranch, repoPath) {
|
|
23
|
+
const result = runGitSync(['log', '--oneline', `${targetBranch}..${branchName}`, '--'], repoPath);
|
|
24
|
+
return result.success && result.output.trim().length > 0;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Commit all uncommitted changes in a worktree as a safety net.
|
|
28
|
+
* Returns the commit hash if successful, null otherwise.
|
|
29
|
+
*/
|
|
30
|
+
export function safetyCommitWorktree(worktreePath, deliveryName) {
|
|
31
|
+
// Stage everything
|
|
32
|
+
const addResult = runGitSync(['add', '-A'], worktreePath);
|
|
33
|
+
if (!addResult.success) {
|
|
34
|
+
console.error(`Safety commit: failed to stage changes: ${addResult.error}`);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Commit
|
|
38
|
+
const commitResult = runGitSync(['commit', '-m', `wip: uncommitted agent work for "${deliveryName}" (safety commit)`], worktreePath);
|
|
39
|
+
if (!commitResult.success) {
|
|
40
|
+
console.warn(`Safety commit: commit failed (may be empty): ${commitResult.error}`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
// Return the new commit hash
|
|
44
|
+
const hashResult = runGitSync(['rev-parse', 'HEAD'], worktreePath);
|
|
45
|
+
return hashResult.success ? hashResult.output : null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Remove a worktree when an agent session ends.
|
|
49
|
+
* The branch is preserved for PR creation.
|
|
50
|
+
*
|
|
51
|
+
* SAFETY: Refuses to remove a worktree that has uncommitted changes or
|
|
52
|
+
* unmerged commits. Uncommitted changes are auto-committed as a safety
|
|
53
|
+
* net to prevent losing agent work.
|
|
54
|
+
*
|
|
55
|
+
* @returns true if the worktree was actually removed, false if it was preserved
|
|
56
|
+
*/
|
|
57
|
+
export function removeWorktree(repoPath, worktreePath, options = {}) {
|
|
58
|
+
const { branchName, integrationBranch, deliveryName, mergeSucceeded } = options;
|
|
59
|
+
try {
|
|
60
|
+
if (!existsSync(worktreePath)) {
|
|
61
|
+
console.log(`Worktree already removed: ${worktreePath}`);
|
|
62
|
+
runGitSync(['worktree', 'prune'], repoPath);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// Guard 1: Check for uncommitted changes and safety-commit them
|
|
66
|
+
if (worktreeHasUncommittedChanges(worktreePath)) {
|
|
67
|
+
console.warn(`Worktree has uncommitted changes: ${worktreePath}. ` +
|
|
68
|
+
`Creating safety commit to preserve work...`);
|
|
69
|
+
const hash = safetyCommitWorktree(worktreePath, deliveryName ?? 'unknown');
|
|
70
|
+
if (hash) {
|
|
71
|
+
console.log(`Safety commit created: ${hash.slice(0, 8)}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Could not commit -- refuse to delete
|
|
75
|
+
console.error(`REFUSING to remove worktree ${worktreePath}: ` +
|
|
76
|
+
`has uncommitted changes and safety commit failed. ` +
|
|
77
|
+
`Manual cleanup required.`);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Guard 2: Check for unmerged commits (if we know the branch and integration)
|
|
82
|
+
if (branchName && integrationBranch && !mergeSucceeded) {
|
|
83
|
+
if (branchHasUnmergedCommits(branchName, integrationBranch, repoPath)) {
|
|
84
|
+
console.error(`REFUSING to remove worktree ${worktreePath}: ` +
|
|
85
|
+
`branch ${branchName} has commits not merged to ${integrationBranch}. ` +
|
|
86
|
+
`Branch preserved for manual merge/review.`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Safe to remove -- delegate to daemon-core's base removal
|
|
91
|
+
return removeWorktreeBase(repoPath, worktreePath);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
console.error('Error removing worktree:', err instanceof Error ? err.message : String(err));
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Commit any uncommitted changes in a worktree as a WIP commit.
|
|
100
|
+
*
|
|
101
|
+
* Called by the daemon after an agent process exits but before worktree
|
|
102
|
+
* removal. Captures in-flight work that the agent didn't commit before
|
|
103
|
+
* being terminated.
|
|
104
|
+
*
|
|
105
|
+
* Delegates to daemon-core's commitWip for the actual git operations.
|
|
106
|
+
*
|
|
107
|
+
* @returns The commit hash if a WIP commit was created, null if no changes or failure.
|
|
108
|
+
*/
|
|
109
|
+
export function commitWipChanges(worktreePath, contextName) {
|
|
110
|
+
console.log(`[worktree] Committing WIP changes in ${worktreePath} for "${contextName}"`);
|
|
111
|
+
return commitWip(worktreePath, `Uncommitted work captured by daemon on agent exit (${contextName})`);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=worktree-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-safety.js","sourceRoot":"","sources":["../src/worktree-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy worktree lifecycle: canonical removal and orphan cleanup.
|
|
3
|
+
*
|
|
4
|
+
* safeRemoveStrategyWorktree is the single code path for all strategy
|
|
5
|
+
* worktree removals -- it merges before removing and conditionally
|
|
6
|
+
* clears in-memory state.
|
|
7
|
+
*
|
|
8
|
+
* cleanupOrphanStrategyWorktrees scans the worktree directory on startup
|
|
9
|
+
* and removes worktrees that no longer match any active strategy.
|
|
10
|
+
*/
|
|
11
|
+
import type { DaemonConfig } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Parameters for the canonical worktree removal function.
|
|
14
|
+
*/
|
|
15
|
+
export interface SafeRemoveStrategyWorktreeParams {
|
|
16
|
+
config: DaemonConfig;
|
|
17
|
+
worktreePath: string;
|
|
18
|
+
branchName: string;
|
|
19
|
+
/** Human-readable name for logging and merge commit messages. */
|
|
20
|
+
deliveryName: string;
|
|
21
|
+
/** Delivery/strategy ID for merge traceability. Falls back to deliveryName. */
|
|
22
|
+
deliveryId?: string;
|
|
23
|
+
/** If provided, clears in-memory worktree state on successful removal. */
|
|
24
|
+
strategyId?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result of a canonical worktree removal attempt.
|
|
28
|
+
*/
|
|
29
|
+
export interface SafeRemoveResult {
|
|
30
|
+
/** Whether the worktree was actually removed from disk. */
|
|
31
|
+
removed: boolean;
|
|
32
|
+
/** Whether a merge to integration was attempted and succeeded. */
|
|
33
|
+
merged: boolean;
|
|
34
|
+
/** Error message if merge failed. */
|
|
35
|
+
mergeError?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Canonical strategy worktree removal: merge-before-remove + conditional cleanup.
|
|
39
|
+
*
|
|
40
|
+
* Every code path that removes a strategy worktree should route through this
|
|
41
|
+
* function. It encapsulates the full lifecycle:
|
|
42
|
+
* 1. Check for unmerged commits on the branch
|
|
43
|
+
* 2. Attempt merge to integration if needed
|
|
44
|
+
* 3. Call removeWorktree with safety guards (handles uncommitted changes)
|
|
45
|
+
* 4. Conditionally clear in-memory state based on whether removal succeeded
|
|
46
|
+
*
|
|
47
|
+
* Returns structured result so callers can count cleaned/preserved and log.
|
|
48
|
+
*/
|
|
49
|
+
export declare function safeRemoveStrategyWorktree(params: SafeRemoveStrategyWorktreeParams): Promise<SafeRemoveResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Clean up orphan strategy worktrees on daemon startup.
|
|
52
|
+
*
|
|
53
|
+
* Scans the worktree directory and cross-references against active
|
|
54
|
+
* strategies (those with assigned agent roles and queued deliveries).
|
|
55
|
+
* Worktrees that don't match any active strategy are orphans from a
|
|
56
|
+
* previous daemon run and are cleaned up.
|
|
57
|
+
*
|
|
58
|
+
* Conservative approach:
|
|
59
|
+
* - Safety-commits any uncommitted changes before removal
|
|
60
|
+
* - Checks for unmerged commits before deleting
|
|
61
|
+
* - Logs all actions for auditability
|
|
62
|
+
*
|
|
63
|
+
* @returns Count of orphans cleaned up and preserved
|
|
64
|
+
*/
|
|
65
|
+
export declare function cleanupOrphanStrategyWorktrees(config: DaemonConfig): Promise<{
|
|
66
|
+
cleaned: number;
|
|
67
|
+
preserved: number;
|
|
68
|
+
}>;
|
|
69
|
+
//# sourceMappingURL=worktree-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-strategy.d.ts","sourceRoot":"","sources":["../src/worktree-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,MAAM,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,gBAAgB,CAAC,CA8D3B;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAsHjD"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy worktree lifecycle: canonical removal and orphan cleanup.
|
|
3
|
+
*
|
|
4
|
+
* safeRemoveStrategyWorktree is the single code path for all strategy
|
|
5
|
+
* worktree removals -- it merges before removing and conditionally
|
|
6
|
+
* clears in-memory state.
|
|
7
|
+
*
|
|
8
|
+
* cleanupOrphanStrategyWorktrees scans the worktree directory on startup
|
|
9
|
+
* and removes worktrees that no longer match any active strategy.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { runGitSync } from './git-types.js';
|
|
14
|
+
import { mergeToIntegration } from './git-merge.js';
|
|
15
|
+
import { getActiveStrategies } from './queries/deliveries.js';
|
|
16
|
+
import { removeStrategyWorktree as removeStrategyWorktreeState } from './strategy-worktree-state.js';
|
|
17
|
+
import { sanitizeGitSegment } from './git-utils.js';
|
|
18
|
+
import { branchHasUnmergedCommits, removeWorktree } from './worktree-safety.js';
|
|
19
|
+
// ── Canonical worktree removal ────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Canonical strategy worktree removal: merge-before-remove + conditional cleanup.
|
|
22
|
+
*
|
|
23
|
+
* Every code path that removes a strategy worktree should route through this
|
|
24
|
+
* function. It encapsulates the full lifecycle:
|
|
25
|
+
* 1. Check for unmerged commits on the branch
|
|
26
|
+
* 2. Attempt merge to integration if needed
|
|
27
|
+
* 3. Call removeWorktree with safety guards (handles uncommitted changes)
|
|
28
|
+
* 4. Conditionally clear in-memory state based on whether removal succeeded
|
|
29
|
+
*
|
|
30
|
+
* Returns structured result so callers can count cleaned/preserved and log.
|
|
31
|
+
*/
|
|
32
|
+
export async function safeRemoveStrategyWorktree(params) {
|
|
33
|
+
const { config, worktreePath, branchName, deliveryName, deliveryId, strategyId } = params;
|
|
34
|
+
const { repoPath, integrationBranch } = config;
|
|
35
|
+
// 1. Attempt merge if there are unmerged commits
|
|
36
|
+
let mergeSucceeded = false;
|
|
37
|
+
let merged = false;
|
|
38
|
+
let mergeError;
|
|
39
|
+
try {
|
|
40
|
+
if (branchHasUnmergedCommits(branchName, integrationBranch, repoPath)) {
|
|
41
|
+
console.log(`[worktree] Attempting merge for ${branchName} before removal`);
|
|
42
|
+
const mergeResult = await mergeToIntegration({
|
|
43
|
+
config,
|
|
44
|
+
branchName,
|
|
45
|
+
deliveryName,
|
|
46
|
+
deliveryId: deliveryId ?? deliveryName,
|
|
47
|
+
});
|
|
48
|
+
mergeSucceeded = mergeResult.success;
|
|
49
|
+
merged = true;
|
|
50
|
+
if (mergeResult.success) {
|
|
51
|
+
console.log(`[worktree] Merge succeeded for ${branchName}`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
mergeError = mergeResult.error ?? 'unknown';
|
|
55
|
+
console.warn(`[worktree] Merge failed for ${branchName}: ${mergeError}. ` +
|
|
56
|
+
`Safety guards will preserve the branch.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
mergeSucceeded = true; // Nothing to merge
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
mergeError = err.message;
|
|
65
|
+
console.warn(`[worktree] Merge attempt failed for ${branchName}: ${mergeError}`);
|
|
66
|
+
}
|
|
67
|
+
// 2. Remove worktree (safety guards handle uncommitted changes and unmerged commits)
|
|
68
|
+
let removed = false;
|
|
69
|
+
try {
|
|
70
|
+
removed = removeWorktree(repoPath, worktreePath, {
|
|
71
|
+
branchName,
|
|
72
|
+
integrationBranch,
|
|
73
|
+
deliveryName,
|
|
74
|
+
mergeSucceeded,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.warn(`[worktree] Failed to remove worktree ${worktreePath}: ${err.message}`);
|
|
79
|
+
}
|
|
80
|
+
// 3. Conditionally clear in-memory state
|
|
81
|
+
if (strategyId) {
|
|
82
|
+
if (removed) {
|
|
83
|
+
removeStrategyWorktreeState(strategyId);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(`[worktree] Worktree preserved for strategy ${strategyId} -- keeping in-memory state`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { removed, merged, mergeError };
|
|
90
|
+
}
|
|
91
|
+
// ── Orphan strategy worktree cleanup ──────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Clean up orphan strategy worktrees on daemon startup.
|
|
94
|
+
*
|
|
95
|
+
* Scans the worktree directory and cross-references against active
|
|
96
|
+
* strategies (those with assigned agent roles and queued deliveries).
|
|
97
|
+
* Worktrees that don't match any active strategy are orphans from a
|
|
98
|
+
* previous daemon run and are cleaned up.
|
|
99
|
+
*
|
|
100
|
+
* Conservative approach:
|
|
101
|
+
* - Safety-commits any uncommitted changes before removal
|
|
102
|
+
* - Checks for unmerged commits before deleting
|
|
103
|
+
* - Logs all actions for auditability
|
|
104
|
+
*
|
|
105
|
+
* @returns Count of orphans cleaned up and preserved
|
|
106
|
+
*/
|
|
107
|
+
export async function cleanupOrphanStrategyWorktrees(config) {
|
|
108
|
+
const { worktreeDir, repoPath, organizationId, productId } = config;
|
|
109
|
+
let cleaned = 0;
|
|
110
|
+
let preserved = 0;
|
|
111
|
+
if (!existsSync(worktreeDir)) {
|
|
112
|
+
return { cleaned, preserved };
|
|
113
|
+
}
|
|
114
|
+
// 1. List all subdirectories in the worktree directory
|
|
115
|
+
let entries;
|
|
116
|
+
try {
|
|
117
|
+
entries = readdirSync(worktreeDir).filter((entry) => {
|
|
118
|
+
try {
|
|
119
|
+
return statSync(join(worktreeDir, entry)).isDirectory();
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
console.debug(`[worktree] Failed to stat ${entry} (may have been deleted):`, e.message);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.warn(`[worktree] Failed to scan worktree directory: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
+
return { cleaned, preserved };
|
|
130
|
+
}
|
|
131
|
+
if (entries.length === 0) {
|
|
132
|
+
return { cleaned, preserved };
|
|
133
|
+
}
|
|
134
|
+
// 2. Query active strategies
|
|
135
|
+
let activeStrategyBranchDirs;
|
|
136
|
+
try {
|
|
137
|
+
const activeStrategiesList = await getActiveStrategies(organizationId, productId);
|
|
138
|
+
activeStrategyBranchDirs = new Set();
|
|
139
|
+
for (const s of activeStrategiesList) {
|
|
140
|
+
const shortId = s.strategy_id.slice(0, 8);
|
|
141
|
+
const sanitizedRole = sanitizeGitSegment(s.agent_role_name ?? 'reviewer');
|
|
142
|
+
const sanitizedName = sanitizeGitSegment(s.strategy_name);
|
|
143
|
+
const expectedDir = `agent-${sanitizedRole}-${sanitizedName}-${shortId}`;
|
|
144
|
+
if (entries.includes(expectedDir)) {
|
|
145
|
+
activeStrategyBranchDirs.add(expectedDir);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Fallback: match by strategy ID prefix in case sanitization differs
|
|
149
|
+
for (const entry of entries) {
|
|
150
|
+
if (entry.endsWith(shortId)) {
|
|
151
|
+
activeStrategyBranchDirs.add(entry);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
console.warn(`[worktree] Failed to query active strategies for orphan detection: ` +
|
|
159
|
+
`${err instanceof Error ? err.message : String(err)}. Skipping orphan cleanup.`);
|
|
160
|
+
return { cleaned, preserved };
|
|
161
|
+
}
|
|
162
|
+
// 3. Identify orphans: agent worktree dirs not matching any active strategy
|
|
163
|
+
const orphanDirs = entries.filter((entry) => {
|
|
164
|
+
if (!entry.startsWith('agent-'))
|
|
165
|
+
return false;
|
|
166
|
+
return !activeStrategyBranchDirs.has(entry);
|
|
167
|
+
});
|
|
168
|
+
if (orphanDirs.length === 0) {
|
|
169
|
+
console.log('[worktree] No orphan strategy worktrees found');
|
|
170
|
+
return { cleaned, preserved };
|
|
171
|
+
}
|
|
172
|
+
console.log(`[worktree] Found ${orphanDirs.length} orphan strategy worktree(s)`);
|
|
173
|
+
// 4. Parse git worktree list to get branch names for each path
|
|
174
|
+
const worktreeListResult = runGitSync(['worktree', 'list', '--porcelain'], repoPath);
|
|
175
|
+
const pathToBranch = new Map();
|
|
176
|
+
if (worktreeListResult.success) {
|
|
177
|
+
let currentPath = null;
|
|
178
|
+
for (const line of worktreeListResult.output.split('\n')) {
|
|
179
|
+
if (line.startsWith('worktree ')) {
|
|
180
|
+
currentPath = line.slice('worktree '.length);
|
|
181
|
+
}
|
|
182
|
+
else if (line.startsWith('branch refs/heads/') && currentPath) {
|
|
183
|
+
pathToBranch.set(resolve(currentPath), line.slice('branch refs/heads/'.length));
|
|
184
|
+
currentPath = null;
|
|
185
|
+
}
|
|
186
|
+
else if (line === '') {
|
|
187
|
+
currentPath = null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// 5. Clean up each orphan via canonical removal path
|
|
192
|
+
for (const dir of orphanDirs) {
|
|
193
|
+
const worktreePath = resolve(join(worktreeDir, dir));
|
|
194
|
+
const branchName = pathToBranch.get(worktreePath) ?? dir.replace(/-/g, '/');
|
|
195
|
+
const deliveryName = branchName.split('/').slice(2).join('/') || dir;
|
|
196
|
+
console.log(`[worktree] Cleaning up orphan strategy worktree: ${worktreePath} [${branchName}]`);
|
|
197
|
+
const result = await safeRemoveStrategyWorktree({
|
|
198
|
+
config,
|
|
199
|
+
worktreePath,
|
|
200
|
+
branchName,
|
|
201
|
+
deliveryName,
|
|
202
|
+
deliveryId: dir, // No real delivery ID -- use dir name for traceability
|
|
203
|
+
});
|
|
204
|
+
if (result.removed) {
|
|
205
|
+
cleaned++;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
preserved++;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
console.log(`[worktree] Orphan strategy worktree cleanup: ${cleaned} cleaned, ${preserved} preserved`);
|
|
212
|
+
return { cleaned, preserved };
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=worktree-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-strategy.js","sourceRoot":"","sources":["../src/worktree-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree management for the daemon.
|
|
3
|
+
*
|
|
4
|
+
* Handles worktree creation, cleanup, pruning, and safety checks
|
|
5
|
+
* for agent session isolation.
|
|
6
|
+
*
|
|
7
|
+
* Base operations (prune, existence check, WIP commit, removal, creation)
|
|
8
|
+
* are imported from @telora/daemon-core. Daemon-specific extensions
|
|
9
|
+
* (safety guards, merge-before-remove, orphan cleanup) are implemented here.
|
|
10
|
+
*/
|
|
11
|
+
import type { DaemonConfig } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Derive the merge worktree path from config. Deterministic — no state.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getMergeWorktreePath(config: DaemonConfig): string;
|
|
16
|
+
/**
|
|
17
|
+
* Create or validate the persistent merge worktree.
|
|
18
|
+
*
|
|
19
|
+
* Uses a detached HEAD worktree at `.telora/merge-worktree/` so merge
|
|
20
|
+
* functions can checkout any branch without "already checked out" conflicts.
|
|
21
|
+
* The main repo working tree is never touched during merge operations.
|
|
22
|
+
*
|
|
23
|
+
* Called once from initGit() after ensureIntegrationBranch().
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureMergeWorktree(config: DaemonConfig): string;
|
|
26
|
+
/**
|
|
27
|
+
* Parameters for the canonical worktree removal function.
|
|
28
|
+
*/
|
|
29
|
+
export interface SafeRemoveStrategyWorktreeParams {
|
|
30
|
+
config: DaemonConfig;
|
|
31
|
+
worktreePath: string;
|
|
32
|
+
branchName: string;
|
|
33
|
+
/** Human-readable name for logging and merge commit messages. */
|
|
34
|
+
deliveryName: string;
|
|
35
|
+
/** Delivery/strategy ID for merge traceability. Falls back to deliveryName. */
|
|
36
|
+
deliveryId?: string;
|
|
37
|
+
/** If provided, clears in-memory worktree state on successful removal. */
|
|
38
|
+
strategyId?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Result of a canonical worktree removal attempt.
|
|
42
|
+
*/
|
|
43
|
+
export interface SafeRemoveResult {
|
|
44
|
+
/** Whether the worktree was actually removed from disk. */
|
|
45
|
+
removed: boolean;
|
|
46
|
+
/** Whether a merge to integration was attempted and succeeded. */
|
|
47
|
+
merged: boolean;
|
|
48
|
+
/** Error message if merge failed. */
|
|
49
|
+
mergeError?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Ensure the worktree directory exists.
|
|
53
|
+
*/
|
|
54
|
+
export declare function ensureWorktreeDir(config: DaemonConfig): void;
|
|
55
|
+
/**
|
|
56
|
+
* Clean up stale worktree entries on startup.
|
|
57
|
+
*
|
|
58
|
+
* Delegates to daemon-core's pruneWorktrees.
|
|
59
|
+
*/
|
|
60
|
+
export declare function pruneWorktrees(repoPath: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a worktree exists for a branch.
|
|
63
|
+
*
|
|
64
|
+
* Delegates to daemon-core's worktreeExistsForBranch.
|
|
65
|
+
*/
|
|
66
|
+
export declare function worktreeExistsForBranch(branchName: string, repoPath: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Ensure MCP server build artifacts are available in a worktree.
|
|
69
|
+
*
|
|
70
|
+
* The MCP server dist/ directories are gitignored build artifacts that only
|
|
71
|
+
* exist in the main repo. Worktrees created via `git worktree add` won't have
|
|
72
|
+
* them, which prevents Claude Code from loading MCP tools (the .mcp.json
|
|
73
|
+
* references relative paths like `mcp/telora-products/dist/index.js`).
|
|
74
|
+
*
|
|
75
|
+
* This function symlinks each MCP dist/ directory from the main repo into the
|
|
76
|
+
* worktree so the relative paths in .mcp.json resolve correctly.
|
|
77
|
+
*/
|
|
78
|
+
export declare function ensureMcpServerInWorktree(repoPath: string, worktreePath: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Create a worktree for an agent session.
|
|
81
|
+
* The worktree is created from the integration branch.
|
|
82
|
+
*
|
|
83
|
+
* @returns The path to the created worktree
|
|
84
|
+
*/
|
|
85
|
+
export declare function createWorktree(config: DaemonConfig, branchName: string): Promise<string>;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a worktree has uncommitted changes (dirty working tree).
|
|
88
|
+
*/
|
|
89
|
+
export declare function worktreeHasUncommittedChanges(worktreePath: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Check if a branch has commits not yet merged into a target branch.
|
|
92
|
+
*/
|
|
93
|
+
export declare function branchHasUnmergedCommits(branchName: string, targetBranch: string, repoPath: string): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Commit all uncommitted changes in a worktree as a safety net.
|
|
96
|
+
* Returns the commit hash if successful, null otherwise.
|
|
97
|
+
*/
|
|
98
|
+
export declare function safetyCommitWorktree(worktreePath: string, deliveryName: string): string | null;
|
|
99
|
+
/**
|
|
100
|
+
* Remove a worktree when an agent session ends.
|
|
101
|
+
* The branch is preserved for PR creation.
|
|
102
|
+
*
|
|
103
|
+
* SAFETY: Refuses to remove a worktree that has uncommitted changes or
|
|
104
|
+
* unmerged commits. Uncommitted changes are auto-committed as a safety
|
|
105
|
+
* net to prevent losing agent work.
|
|
106
|
+
*
|
|
107
|
+
* @returns true if the worktree was actually removed, false if it was preserved
|
|
108
|
+
*/
|
|
109
|
+
export declare function removeWorktree(repoPath: string, worktreePath: string, options?: {
|
|
110
|
+
branchName?: string;
|
|
111
|
+
integrationBranch?: string;
|
|
112
|
+
deliveryName?: string;
|
|
113
|
+
mergeSucceeded?: boolean;
|
|
114
|
+
}): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Commit any uncommitted changes in a worktree as a WIP commit.
|
|
117
|
+
*
|
|
118
|
+
* Called by the daemon after an agent process exits but before worktree
|
|
119
|
+
* removal. Captures in-flight work that the agent didn't commit before
|
|
120
|
+
* being terminated.
|
|
121
|
+
*
|
|
122
|
+
* Delegates to daemon-core's commitWip for the actual git operations.
|
|
123
|
+
*
|
|
124
|
+
* @returns The commit hash if a WIP commit was created, null if no changes or failure.
|
|
125
|
+
*/
|
|
126
|
+
export declare function commitWipChanges(worktreePath: string, contextName: string): string | null;
|
|
127
|
+
/**
|
|
128
|
+
* Canonical strategy worktree removal: merge-before-remove + conditional cleanup.
|
|
129
|
+
*
|
|
130
|
+
* Every code path that removes a strategy worktree should route through this
|
|
131
|
+
* function. It encapsulates the full lifecycle:
|
|
132
|
+
* 1. Check for unmerged commits on the branch
|
|
133
|
+
* 2. Attempt merge to integration if needed
|
|
134
|
+
* 3. Call removeWorktree with safety guards (handles uncommitted changes)
|
|
135
|
+
* 4. Conditionally clear in-memory state based on whether removal succeeded
|
|
136
|
+
*
|
|
137
|
+
* Returns structured result so callers can count cleaned/preserved and log.
|
|
138
|
+
*/
|
|
139
|
+
export declare function safeRemoveStrategyWorktree(params: SafeRemoveStrategyWorktreeParams): Promise<SafeRemoveResult>;
|
|
140
|
+
/**
|
|
141
|
+
* Clean up orphan strategy worktrees on daemon startup.
|
|
142
|
+
*
|
|
143
|
+
* Scans the worktree directory and cross-references against active
|
|
144
|
+
* strategies (those with assigned agent roles and queued deliveries).
|
|
145
|
+
* Worktrees that don't match any active strategy are orphans from a
|
|
146
|
+
* previous daemon run and are cleaned up.
|
|
147
|
+
*
|
|
148
|
+
* Conservative approach:
|
|
149
|
+
* - Safety-commits any uncommitted changes before removal
|
|
150
|
+
* - Checks for unmerged commits before deleting
|
|
151
|
+
* - Logs all actions for auditability
|
|
152
|
+
*
|
|
153
|
+
* @returns Count of orphans cleaned up and preserved
|
|
154
|
+
*/
|
|
155
|
+
export declare function cleanupOrphanStrategyWorktrees(config: DaemonConfig): Promise<{
|
|
156
|
+
cleaned: number;
|
|
157
|
+
preserved: number;
|
|
158
|
+
}>;
|
|
159
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqChE;AAID;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,MAAM,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAK5D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CA6CtF;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CA+DjB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAI3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAMT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,OAAO,CAgDT;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzF;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,gBAAgB,CAAC,CA8D3B;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAoIjD"}
|