@minionry/minion 0.7.36
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/LICENSE +14 -0
- package/PRIVACY.md +357 -0
- package/README.md +57 -0
- package/THIRD_PARTY_NOTICES.md +245 -0
- package/bin/branding.js +4 -0
- package/bin/commands/browser-install.js +483 -0
- package/bin/commands/create-sandbox.js +542 -0
- package/bin/commands/fingerprint.js +101 -0
- package/bin/commands/login.js +400 -0
- package/bin/commands/logout.js +93 -0
- package/bin/commands/minions.js +211 -0
- package/bin/commands/sandboxes.js +309 -0
- package/bin/commands/status.js +298 -0
- package/bin/commands/whoami.js +153 -0
- package/bin/launch-env.js +35 -0
- package/bin/machine-identity.js +221 -0
- package/bin/machine-layout.js +200 -0
- package/bin/minion.js +839 -0
- package/bin/platform-endpoints.js +8 -0
- package/bin/postinstall.js +52 -0
- package/bin/pty-doctor.js +326 -0
- package/bin/pty-locator.js +110 -0
- package/bin/pty-provision.js +186 -0
- package/bin/sandbox/Dockerfile +78 -0
- package/bin/sandbox/entrypoint.sh +14 -0
- package/bin/sandbox/install-repo.sh +53 -0
- package/bin/sandbox/seccomp-userns.json +883 -0
- package/bin/sandbox-config.js +306 -0
- package/dist/bin/machine-identity.js +221 -0
- package/dist/bin/machine-layout.js +200 -0
- package/dist/electron-host/agent-lease.js +141 -0
- package/dist/electron-host/dom-driver.js +642 -0
- package/dist/electron-host/ipc-protocol.js +89 -0
- package/dist/electron-host/js-driver.js +216 -0
- package/dist/electron-host/view-manager.js +254 -0
- package/dist/server/cli/engine-resume.js +49 -0
- package/dist/server/cli/eta-estimator.js +278 -0
- package/dist/server/cli/headless/background-activity.js +109 -0
- package/dist/server/cli/headless/claude-invoker-process.js +614 -0
- package/dist/server/cli/headless/claude-invoker-stall.js +150 -0
- package/dist/server/cli/headless/claude-invoker-stream.js +555 -0
- package/dist/server/cli/headless/claude-invoker-tools.js +148 -0
- package/dist/server/cli/headless/claude-invoker.js +151 -0
- package/dist/server/cli/headless/engine-availability.js +92 -0
- package/dist/server/cli/headless/engine-notice.js +185 -0
- package/dist/server/cli/headless/haiku-assessments.js +293 -0
- package/dist/server/cli/headless/headless-logger.js +75 -0
- package/dist/server/cli/headless/index.js +9 -0
- package/dist/server/cli/headless/mcp-config.js +314 -0
- package/dist/server/cli/headless/native-timeout-detector.js +72 -0
- package/dist/server/cli/headless/output-utils.js +71 -0
- package/dist/server/cli/headless/prompt-utils.js +82 -0
- package/dist/server/cli/headless/resilient-runner.js +326 -0
- package/dist/server/cli/headless/retry-strategies.js +292 -0
- package/dist/server/cli/headless/runner.js +245 -0
- package/dist/server/cli/headless/stall-assessor.js +295 -0
- package/dist/server/cli/headless/tool-watchdog.js +447 -0
- package/dist/server/cli/headless/types.js +18 -0
- package/dist/server/cli/history-portability.js +85 -0
- package/dist/server/cli/improvisation-attachments.js +99 -0
- package/dist/server/cli/improvisation-history-store.js +121 -0
- package/dist/server/cli/improvisation-movements.js +137 -0
- package/dist/server/cli/improvisation-output-queue.js +34 -0
- package/dist/server/cli/improvisation-retry.js +8 -0
- package/dist/server/cli/improvisation-session-manager.js +1016 -0
- package/dist/server/cli/improvisation-types.js +31 -0
- package/dist/server/cli/plan-lifecycle.js +72 -0
- package/dist/server/cli/prompt-builders.js +371 -0
- package/dist/server/cli/retry/retry-best-result.js +28 -0
- package/dist/server/cli/retry/retry-context-loss.js +75 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +213 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +20 -0
- package/dist/server/cli/retry/retry-runner-factory.js +92 -0
- package/dist/server/cli/retry/retry-tool-results.js +22 -0
- package/dist/server/cli/retry/retry-types.js +3 -0
- package/dist/server/engines/EngineEvent.js +57 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.js +316 -0
- package/dist/server/engines/claude/claude-command.js +32 -0
- package/dist/server/engines/codex/CodexEngine.js +469 -0
- package/dist/server/engines/codex/codex-auth.js +203 -0
- package/dist/server/engines/codex/codex-invoker.js +205 -0
- package/dist/server/engines/codex/codex-provision.js +215 -0
- package/dist/server/engines/credentials/credential-probe.js +88 -0
- package/dist/server/engines/credentials/model-profiles.js +249 -0
- package/dist/server/engines/credentials/provider-credentials.js +146 -0
- package/dist/server/engines/engine-event-stream.js +52 -0
- package/dist/server/engines/execution/engine-session.js +380 -0
- package/dist/server/engines/factory.js +42 -0
- package/dist/server/engines/hermes/HermesEngine.js +628 -0
- package/dist/server/engines/hermes/hermes-auth.js +159 -0
- package/dist/server/engines/hermes/hermes-gateway-home.js +271 -0
- package/dist/server/engines/hermes/hermes-invoker.js +350 -0
- package/dist/server/engines/hermes/hermes-provision.js +318 -0
- package/dist/server/engines/read-only.js +20 -0
- package/dist/server/engines/types.js +27 -0
- package/dist/server/handlers/company-execution-registry.js +67 -0
- package/dist/server/handlers/company-handlers.js +514 -0
- package/dist/server/handlers/company-triggers.js +189 -0
- package/dist/server/handlers/company-types.js +3 -0
- package/dist/server/index.js +244 -0
- package/dist/server/mcp/app-tools-bridge.js +110 -0
- package/dist/server/mcp/app-tools-mcp-server.js +99 -0
- package/dist/server/mcp/bouncer-integration.js +744 -0
- package/dist/server/mcp/browser-mcp-server.js +915 -0
- package/dist/server/mcp/browser-redaction.js +103 -0
- package/dist/server/mcp/classifier/BouncerClassifier.js +3 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +212 -0
- package/dist/server/mcp/classifier/factory.js +124 -0
- package/dist/server/mcp/classifier/health.js +54 -0
- package/dist/server/mcp/classifier/telemetry.js +0 -0
- package/dist/server/mcp/company-patterns.js +104 -0
- package/dist/server/mcp/department-profiles.js +133 -0
- package/dist/server/mcp/quality-bridge.js +153 -0
- package/dist/server/mcp/quality-mcp-server.js +105 -0
- package/dist/server/mcp/security-analysis.js +384 -0
- package/dist/server/mcp/security-audit.js +152 -0
- package/dist/server/mcp/security-patterns.js +314 -0
- package/dist/server/mcp/server.js +194 -0
- package/dist/server/mcp/test-utils/agent-simulator.js +301 -0
- package/dist/server/mcp/test-utils/e2e-agent.js +103 -0
- package/dist/server/mcp/test-utils/e2e-capture.js +92 -0
- package/dist/server/mcp/test-utils/e2e-client.js +116 -0
- package/dist/server/mcp/test-utils/e2e-fixtures.js +87 -0
- package/dist/server/mcp/test-utils/e2e-gating.js +8 -0
- package/dist/server/mcp/test-utils/e2e-harness.js +8 -0
- package/dist/server/mcp/test-utils/e2e-scenarios.js +105 -0
- package/dist/server/routes/files.js +18 -0
- package/dist/server/routes/improvise.js +64 -0
- package/dist/server/routes/index.js +7 -0
- package/dist/server/routes/instances.js +41 -0
- package/dist/server/routes/internal.js +900 -0
- package/dist/server/routes/notifications.js +110 -0
- package/dist/server/server-setup.js +282 -0
- package/dist/server/services/agent-push.js +148 -0
- package/dist/server/services/analytics.js +197 -0
- package/dist/server/services/apps/build.js +249 -0
- package/dist/server/services/apps/greenlight.js +199 -0
- package/dist/server/services/apps/install.js +101 -0
- package/dist/server/services/apps/layout.js +35 -0
- package/dist/server/services/apps/serve.js +665 -0
- package/dist/server/services/apps/space-apps.js +248 -0
- package/dist/server/services/auth.js +48 -0
- package/dist/server/services/browser/chrome-sandbox.js +245 -0
- package/dist/server/services/browser/chromium-launch-spec.js +51 -0
- package/dist/server/services/browser/claude-reasoner.js +669 -0
- package/dist/server/services/browser/debug-log.js +3 -0
- package/dist/server/services/browser/driver-state.js +546 -0
- package/dist/server/services/browser/electron-provision.js +256 -0
- package/dist/server/services/browser/host-internal.js +245 -0
- package/dist/server/services/browser/host-mock.js +334 -0
- package/dist/server/services/browser/host-types.js +3 -0
- package/dist/server/services/browser/host.js +1067 -0
- package/dist/server/services/browser/index.js +4 -0
- package/dist/server/services/browser/ipc-client.js +354 -0
- package/dist/server/services/browser/pipewire-sink.js +199 -0
- package/dist/server/services/browser/preflight.js +590 -0
- package/dist/server/services/browser/reasoning-agent.js +659 -0
- package/dist/server/services/browser/sandbox-policy.js +169 -0
- package/dist/server/services/browser/stderr-noise-filter.js +26 -0
- package/dist/server/services/browser/telemetry.js +107 -0
- package/dist/server/services/browser/xvfb-supervisor.js +139 -0
- package/dist/server/services/browser-frame-policy.js +56 -0
- package/dist/server/services/client-id.js +32 -0
- package/dist/server/services/collab/registry.js +408 -0
- package/dist/server/services/collab/session.js +489 -0
- package/dist/server/services/collab/text-diff.js +28 -0
- package/dist/server/services/collab/types.js +19 -0
- package/dist/server/services/e2ee-group-key.js +197 -0
- package/dist/server/services/e2ee-identity.js +203 -0
- package/dist/server/services/file-explorer-ops.js +328 -0
- package/dist/server/services/file-transfer-zip.js +188 -0
- package/dist/server/services/files.js +111 -0
- package/dist/server/services/git/branch-ops.js +62 -0
- package/dist/server/services/git/command.js +68 -0
- package/dist/server/services/git/commit-message.js +74 -0
- package/dist/server/services/git/diff-ops.js +56 -0
- package/dist/server/services/git/haiku.js +76 -0
- package/dist/server/services/git/head-watcher.js +226 -0
- package/dist/server/services/git/index.js +17 -0
- package/dist/server/services/git/log-ops.js +98 -0
- package/dist/server/services/git/merge-ops.js +314 -0
- package/dist/server/services/git/parsers.js +401 -0
- package/dist/server/services/git/remote-ops.js +192 -0
- package/dist/server/services/git/status-ops.js +105 -0
- package/dist/server/services/git/suggestion-ops.js +80 -0
- package/dist/server/services/git/tag-ops.js +36 -0
- package/dist/server/services/git/types.js +4 -0
- package/dist/server/services/git/worktree-ops.js +114 -0
- package/dist/server/services/instances.js +337 -0
- package/dist/server/services/model-catalog.js +247 -0
- package/dist/server/services/observability/posthog.js +153 -0
- package/dist/server/services/pathUtils.js +114 -0
- package/dist/server/services/plan/agent-loader.js +97 -0
- package/dist/server/services/plan/agent-manager.js +363 -0
- package/dist/server/services/plan/agent-resolver.js +74 -0
- package/dist/server/services/plan/agents/assess-stall.md +33 -0
- package/dist/server/services/plan/agents/browser-planner.md +53 -0
- package/dist/server/services/plan/agents/browser-reasoner.md +114 -0
- package/dist/server/services/plan/agents/check-injection.md +95 -0
- package/dist/server/services/plan/agents/classify-error.md +30 -0
- package/dist/server/services/plan/agents/code-review.md +142 -0
- package/dist/server/services/plan/agents/commit-message.md +28 -0
- package/dist/server/services/plan/agents/detect-context-loss.md +30 -0
- package/dist/server/services/plan/agents/execute-issue.md +58 -0
- package/dist/server/services/plan/agents/fix-quality.md +25 -0
- package/dist/server/services/plan/agents/plan-coordinator.md +72 -0
- package/dist/server/services/plan/agents/pr-description.md +29 -0
- package/dist/server/services/plan/agents/retry-task.md +27 -0
- package/dist/server/services/plan/agents/review-code.md +38 -0
- package/dist/server/services/plan/agents/review-quality.md +45 -0
- package/dist/server/services/plan/agents/triage-findings.md +78 -0
- package/dist/server/services/plan/agents/verify-review.md +57 -0
- package/dist/server/services/plan/approval-evaluator.js +143 -0
- package/dist/server/services/plan/board-archive.js +102 -0
- package/dist/server/services/plan/board-config.js +108 -0
- package/dist/server/services/plan/board-export.js +214 -0
- package/dist/server/services/plan/composer-prompt.js +115 -0
- package/dist/server/services/plan/composer.js +664 -0
- package/dist/server/services/plan/config-installer.js +103 -0
- package/dist/server/services/plan/dependency-resolver.js +137 -0
- package/dist/server/services/plan/executor.js +696 -0
- package/dist/server/services/plan/front-matter.js +43 -0
- package/dist/server/services/plan/issue-classification.js +10 -0
- package/dist/server/services/plan/issue-effort.js +182 -0
- package/dist/server/services/plan/issue-loader.js +35 -0
- package/dist/server/services/plan/issue-prompt-builder.js +152 -0
- package/dist/server/services/plan/issue-retry.js +42 -0
- package/dist/server/services/plan/issue-writer.js +102 -0
- package/dist/server/services/plan/metrics-collector.js +272 -0
- package/dist/server/services/plan/output-manager.js +77 -0
- package/dist/server/services/plan/parser-core.js +435 -0
- package/dist/server/services/plan/parser-migration.js +108 -0
- package/dist/server/services/plan/parser.js +258 -0
- package/dist/server/services/plan/plan-runner-factory.js +68 -0
- package/dist/server/services/plan/pm-timeline.js +320 -0
- package/dist/server/services/plan/progress-log.js +101 -0
- package/dist/server/services/plan/prompt-builder.js +142 -0
- package/dist/server/services/plan/quality-delta.js +274 -0
- package/dist/server/services/plan/readiness-planner.js +34 -0
- package/dist/server/services/plan/review-gate.js +409 -0
- package/dist/server/services/plan/review-report.js +134 -0
- package/dist/server/services/plan/review-verdict-stream.js +161 -0
- package/dist/server/services/plan/state-reconciler.js +238 -0
- package/dist/server/services/plan/template-diff.js +175 -0
- package/dist/server/services/plan/template-instantiator.js +516 -0
- package/dist/server/services/plan/template-manifest.js +56 -0
- package/dist/server/services/plan/template-types.js +3 -0
- package/dist/server/services/plan/trigger-evaluator.js +211 -0
- package/dist/server/services/plan/types.js +3 -0
- package/dist/server/services/plan/watcher.js +73 -0
- package/dist/server/services/platform-credentials.js +56 -0
- package/dist/server/services/platform-e2ee.js +421 -0
- package/dist/server/services/platform-envelope.js +102 -0
- package/dist/server/services/platform-heartbeat.js +88 -0
- package/dist/server/services/platform-reconnect.js +60 -0
- package/dist/server/services/platform-token-lifecycle.js +95 -0
- package/dist/server/services/platform-url.js +17 -0
- package/dist/server/services/platform.js +656 -0
- package/dist/server/services/runtime-info.js +9 -0
- package/dist/server/services/schedule/agent-schedule-store.js +232 -0
- package/dist/server/services/schedule/agent-scheduler.js +323 -0
- package/dist/server/services/schedule/daily-timing.js +105 -0
- package/dist/server/services/schedule/quality-schedule-launch.js +11 -0
- package/dist/server/services/schedule/quality-schedule-store.js +211 -0
- package/dist/server/services/schedule/quality-scheduler.js +215 -0
- package/dist/server/services/schedule/run-bootstrap.js +329 -0
- package/dist/server/services/schedule/schedule-store.js +238 -0
- package/dist/server/services/schedule/schedule-wire.js +77 -0
- package/dist/server/services/schedule/scheduler.js +310 -0
- package/dist/server/services/schedule/template-source.js +97 -0
- package/dist/server/services/sdk/agent-sessions.js +264 -0
- package/dist/server/services/sdk/agents.js +557 -0
- package/dist/server/services/sdk/app-endpoints.js +48 -0
- package/dist/server/services/sdk/app-tools.js +303 -0
- package/dist/server/services/sdk/audit.js +48 -0
- package/dist/server/services/sdk/browser-transport.js +188 -0
- package/dist/server/services/sdk/browser.js +605 -0
- package/dist/server/services/sdk/composer.js +129 -0
- package/dist/server/services/sdk/connect.js +273 -0
- package/dist/server/services/sdk/consent-cooldown.js +31 -0
- package/dist/server/services/sdk/endpoint-url.js +141 -0
- package/dist/server/services/sdk/endpoints.js +314 -0
- package/dist/server/services/sdk/file-change-notify.js +36 -0
- package/dist/server/services/sdk/files-app.js +163 -0
- package/dist/server/services/sdk/files-search.js +131 -0
- package/dist/server/services/sdk/files-transfer.js +279 -0
- package/dist/server/services/sdk/files-workspace.js +233 -0
- package/dist/server/services/sdk/git.js +520 -0
- package/dist/server/services/sdk/grant-store.js +318 -0
- package/dist/server/services/sdk/host-ops.js +84 -0
- package/dist/server/services/sdk/inference-claude.js +214 -0
- package/dist/server/services/sdk/inference.js +247 -0
- package/dist/server/services/sdk/live-registry.js +42 -0
- package/dist/server/services/sdk/local-app-bindings.js +71 -0
- package/dist/server/services/sdk/pipeline.js +190 -0
- package/dist/server/services/sdk/pm-execute.js +228 -0
- package/dist/server/services/sdk/pm-planning-tap.js +29 -0
- package/dist/server/services/sdk/pm-schedule.js +165 -0
- package/dist/server/services/sdk/pm.js +634 -0
- package/dist/server/services/sdk/quality-change-notify.js +20 -0
- package/dist/server/services/sdk/quality-schedule.js +165 -0
- package/dist/server/services/sdk/quality.js +602 -0
- package/dist/server/services/sdk/rate-limits.js +198 -0
- package/dist/server/services/sdk/registry.js +597 -0
- package/dist/server/services/sdk/revoke.js +86 -0
- package/dist/server/services/sdk/run-profile.js +41 -0
- package/dist/server/services/sdk/sandbox.js +89 -0
- package/dist/server/services/sdk/storage.js +110 -0
- package/dist/server/services/sdk/streams.js +147 -0
- package/dist/server/services/sdk/terminal.js +201 -0
- package/dist/server/services/sdk/test-utils/workshop-browser-app.js +466 -0
- package/dist/server/services/sentry.js +99 -0
- package/dist/server/services/settings.js +374 -0
- package/dist/server/services/snippets/expander.js +87 -0
- package/dist/server/services/snippets/index.js +6 -0
- package/dist/server/services/snippets/loader.js +119 -0
- package/dist/server/services/snippets/parser.js +52 -0
- package/dist/server/services/snippets/types.js +3 -0
- package/dist/server/services/snippets/watcher.js +60 -0
- package/dist/server/services/space-layout.js +80 -0
- package/dist/server/services/system-prompts.js +219 -0
- package/dist/server/services/terminal/pty-manager.js +206 -0
- package/dist/server/services/terminal/pty-utils.js +150 -0
- package/dist/server/services/timeline/assembler.js +890 -0
- package/dist/server/services/timeline/contract.js +196 -0
- package/dist/server/services/timeline/index.js +4 -0
- package/dist/server/services/websocket/agent-schedule-handlers.js +217 -0
- package/dist/server/services/websocket/apps-handlers.js +399 -0
- package/dist/server/services/websocket/ask-user-question-bridge.js +112 -0
- package/dist/server/services/websocket/autocomplete-index.js +415 -0
- package/dist/server/services/websocket/autocomplete-match.js +243 -0
- package/dist/server/services/websocket/autocomplete.js +407 -0
- package/dist/server/services/websocket/browser-agent-runtime.js +208 -0
- package/dist/server/services/websocket/browser-device-profile.js +46 -0
- package/dist/server/services/websocket/browser-handlers.js +377 -0
- package/dist/server/services/websocket/browser-host-broadcast.js +179 -0
- package/dist/server/services/websocket/browser-ice-config.js +121 -0
- package/dist/server/services/websocket/browser-payloads.js +222 -0
- package/dist/server/services/websocket/browser-viewer-lifecycle.js +84 -0
- package/dist/server/services/websocket/browser-viewer-registry.js +118 -0
- package/dist/server/services/websocket/collab-broadcast.js +11 -0
- package/dist/server/services/websocket/collab-handlers.js +116 -0
- package/dist/server/services/websocket/commit-suggestion-service.js +132 -0
- package/dist/server/services/websocket/debug-log.js +38 -0
- package/dist/server/services/websocket/dispatch-util.js +10 -0
- package/dist/server/services/websocket/engine-auth-handlers.js +323 -0
- package/dist/server/services/websocket/engine-credential-watcher.js +83 -0
- package/dist/server/services/websocket/engine-profile-handlers.js +92 -0
- package/dist/server/services/websocket/file-definition-handlers.js +180 -0
- package/dist/server/services/websocket/file-download-handler.js +291 -0
- package/dist/server/services/websocket/file-explorer-handlers.js +291 -0
- package/dist/server/services/websocket/file-search-handlers.js +267 -0
- package/dist/server/services/websocket/file-share-handlers.js +328 -0
- package/dist/server/services/websocket/file-transfer-http.js +361 -0
- package/dist/server/services/websocket/file-upload-handler.js +267 -0
- package/dist/server/services/websocket/file-utils.js +346 -0
- package/dist/server/services/websocket/git-branch-handlers.js +90 -0
- package/dist/server/services/websocket/git-diff-handlers.js +59 -0
- package/dist/server/services/websocket/git-handlers.js +212 -0
- package/dist/server/services/websocket/git-head-watcher.js +85 -0
- package/dist/server/services/websocket/git-log-handlers.js +104 -0
- package/dist/server/services/websocket/git-pr-handlers.js +56 -0
- package/dist/server/services/websocket/git-tag-handlers.js +53 -0
- package/dist/server/services/websocket/git-utils.js +11 -0
- package/dist/server/services/websocket/git-worktree-handlers.js +521 -0
- package/dist/server/services/websocket/handler-context.js +113 -0
- package/dist/server/services/websocket/handler.js +1197 -0
- package/dist/server/services/websocket/index.js +5 -0
- package/dist/server/services/websocket/movement-written-files.js +26 -0
- package/dist/server/services/websocket/msg-id-tracker.js +48 -0
- package/dist/server/services/websocket/plan-board-handlers.js +410 -0
- package/dist/server/services/websocket/plan-execution-handlers.js +244 -0
- package/dist/server/services/websocket/plan-handlers.js +67 -0
- package/dist/server/services/websocket/plan-helpers.js +161 -0
- package/dist/server/services/websocket/plan-issue-handlers.js +168 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js +190 -0
- package/dist/server/services/websocket/plan-transfer-handlers.js +310 -0
- package/dist/server/services/websocket/pm-timeline-broadcast.js +28 -0
- package/dist/server/services/websocket/post-session-scan.js +132 -0
- package/dist/server/services/websocket/prompt-queue-handlers.js +96 -0
- package/dist/server/services/websocket/quality-agent-cost.js +229 -0
- package/dist/server/services/websocket/quality-agent-notes.js +113 -0
- package/dist/server/services/websocket/quality-change-activity.js +187 -0
- package/dist/server/services/websocket/quality-complexity.js +345 -0
- package/dist/server/services/websocket/quality-dependencies.js +445 -0
- package/dist/server/services/websocket/quality-duplication.js +162 -0
- package/dist/server/services/websocket/quality-eta.js +65 -0
- package/dist/server/services/websocket/quality-fingerprint.js +104 -0
- package/dist/server/services/websocket/quality-grading.js +575 -0
- package/dist/server/services/websocket/quality-handlers.js +48 -0
- package/dist/server/services/websocket/quality-linting.js +270 -0
- package/dist/server/services/websocket/quality-operations.js +54 -0
- package/dist/server/services/websocket/quality-persistence.js +410 -0
- package/dist/server/services/websocket/quality-review-agent.js +526 -0
- package/dist/server/services/websocket/quality-run.js +220 -0
- package/dist/server/services/websocket/quality-secrets.js +0 -0
- package/dist/server/services/websocket/quality-service.js +775 -0
- package/dist/server/services/websocket/quality-tools.js +383 -0
- package/dist/server/services/websocket/quality-triage-agent.js +101 -0
- package/dist/server/services/websocket/quality-types.js +149 -0
- package/dist/server/services/websocket/recommended-answers.js +28 -0
- package/dist/server/services/websocket/schedule-handlers.js +197 -0
- package/dist/server/services/websocket/sdk-agent-host.js +569 -0
- package/dist/server/services/websocket/sdk-browser-host.js +459 -0
- package/dist/server/services/websocket/sdk-composer-host.js +10 -0
- package/dist/server/services/websocket/sdk-git-host.js +115 -0
- package/dist/server/services/websocket/sdk-handlers.js +242 -0
- package/dist/server/services/websocket/sdk-pm-execution-host.js +63 -0
- package/dist/server/services/websocket/sdk-pm-schedule-host.js +21 -0
- package/dist/server/services/websocket/sdk-quality-schedule-host.js +34 -0
- package/dist/server/services/websocket/sdk-terminal-host.js +140 -0
- package/dist/server/services/websocket/session-handlers.js +565 -0
- package/dist/server/services/websocket/session-history.js +335 -0
- package/dist/server/services/websocket/session-initialization.js +315 -0
- package/dist/server/services/websocket/session-registry.js +340 -0
- package/dist/server/services/websocket/session-role-directory.js +39 -0
- package/dist/server/services/websocket/settings-handlers.js +276 -0
- package/dist/server/services/websocket/skill-handlers.js +324 -0
- package/dist/server/services/websocket/skill-watcher.js +83 -0
- package/dist/server/services/websocket/snippet-handlers.js +261 -0
- package/dist/server/services/websocket/tab-broadcast.js +35 -0
- package/dist/server/services/websocket/tab-event-buffer.js +110 -0
- package/dist/server/services/websocket/tab-event-replay.js +47 -0
- package/dist/server/services/websocket/tab-handlers.js +211 -0
- package/dist/server/services/websocket/terminal-handlers.js +268 -0
- package/dist/server/services/websocket/types.js +96 -0
- package/dist/server/types/company-messages.js +102 -0
- package/dist/server/utils/agent-manager.js +202 -0
- package/dist/server/utils/console-timestamps.js +24 -0
- package/dist/server/utils/file-store.js +112 -0
- package/dist/server/utils/paths.js +28 -0
- package/dist/server/utils/port-manager.js +43 -0
- package/dist/server/utils/port.js +204 -0
- package/electron-host/dist/agent-lease.js +141 -0
- package/electron-host/dist/capture-recovery.js +77 -0
- package/electron-host/dist/codec-policy.js +37 -0
- package/electron-host/dist/controller-channel.js +60 -0
- package/electron-host/dist/controller-handlers.js +153 -0
- package/electron-host/dist/device-emulator.js +106 -0
- package/electron-host/dist/dom-driver.js +642 -0
- package/electron-host/dist/domain-registry.js +159 -0
- package/electron-host/dist/domain-validators.js +308 -0
- package/electron-host/dist/editable-focus-reporter.js +143 -0
- package/electron-host/dist/fake-peer.test-util.js +105 -0
- package/electron-host/dist/host-log.js +31 -0
- package/electron-host/dist/host-wire.js +11 -0
- package/electron-host/dist/input-router.js +421 -0
- package/electron-host/dist/ipc-protocol.js +89 -0
- package/electron-host/dist/ipc-server.js +193 -0
- package/electron-host/dist/js-driver.js +216 -0
- package/electron-host/dist/main-guards.js +70 -0
- package/electron-host/dist/main.js +716 -0
- package/electron-host/dist/roster-sync.js +87 -0
- package/electron-host/dist/rpc-context.js +1 -0
- package/electron-host/dist/rpc-tab-methods.js +138 -0
- package/electron-host/dist/rpc-webrtc-methods.js +121 -0
- package/electron-host/dist/screen-capture-cache.js +147 -0
- package/electron-host/dist/sdk-injector.js +166 -0
- package/electron-host/dist/sdp.js +102 -0
- package/electron-host/dist/session-surface.js +78 -0
- package/electron-host/dist/surface-sizing.js +59 -0
- package/electron-host/dist/view-manager.js +254 -0
- package/electron-host/dist/viewer-registry.js +46 -0
- package/electron-host/dist/viewer-session.js +288 -0
- package/electron-host/dist/webrtc-channels.js +14 -0
- package/electron-host/dist/webrtc-controller.js +57 -0
- package/electron-host/dist/webrtc-ice-filter.js +13 -0
- package/electron-host/dist/webrtc-peer.js +45 -0
- package/electron-host/package.json +12 -0
- package/electron-host/tsconfig.json +23 -0
- package/electron-host/webrtc-controller-preload.cjs +3 -0
- package/electron-host/webrtc-controller.html +14 -0
- package/package.json +85 -0
- package/vendor/e2ee/LICENSE +14 -0
- package/vendor/e2ee/package.json +14 -0
- package/vendor/e2ee/src/index.js +310 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Minionry, Inc.
|
|
2
|
+
// SPDX-License-Identifier: LicenseRef-Minionry-Software
|
|
3
|
+
import { executeGitCommand, gitErrorText } from './command.js';
|
|
4
|
+
import { findWorktreePathForBranch, parseGitStatus, parseMergeCommits, parseMergeTreeConflicts, parseMergeTreeOid, parseOverwritePaths, } from './parsers.js';
|
|
5
|
+
import { gitFail, gitOk, } from './types.js';
|
|
6
|
+
import { resolveMainWorktreePath } from './worktree-ops.js';
|
|
7
|
+
export async function detectMergeBlockers(targetWorktreePath, sourceBranch, targetBranch) {
|
|
8
|
+
const statusResult = await executeGitCommand(['status', '--porcelain=v1'], targetWorktreePath);
|
|
9
|
+
if (statusResult.exitCode !== 0)
|
|
10
|
+
return [];
|
|
11
|
+
const { staged, unstaged, untracked } = parseGitStatus(statusResult.stdout);
|
|
12
|
+
const diffResult = await executeGitCommand(['diff', '--name-only', `${targetBranch}..${sourceBranch}`], targetWorktreePath);
|
|
13
|
+
if (diffResult.exitCode !== 0)
|
|
14
|
+
return [];
|
|
15
|
+
const mergeTouches = new Set(diffResult.stdout.split('\n').map(s => s.trim()).filter(Boolean));
|
|
16
|
+
if (mergeTouches.size === 0)
|
|
17
|
+
return [];
|
|
18
|
+
const seen = new Map();
|
|
19
|
+
const consider = (entries) => {
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
if (!mergeTouches.has(entry.path))
|
|
22
|
+
continue;
|
|
23
|
+
if (seen.has(entry.path))
|
|
24
|
+
continue;
|
|
25
|
+
seen.set(entry.path, { path: entry.path, status: entry.status, staged: entry.staged });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
consider(unstaged);
|
|
29
|
+
consider(staged);
|
|
30
|
+
consider(untracked);
|
|
31
|
+
return Array.from(seen.values()).sort((a, b) => {
|
|
32
|
+
if (a.status === 'D' && b.status !== 'D')
|
|
33
|
+
return 1;
|
|
34
|
+
if (a.status !== 'D' && b.status === 'D')
|
|
35
|
+
return -1;
|
|
36
|
+
return a.path.localeCompare(b.path);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export async function resolveTargetWorktree({ cwd, targetBranch }) {
|
|
40
|
+
const wtList = await executeGitCommand(['worktree', 'list', '--porcelain'], cwd);
|
|
41
|
+
return findWorktreePathForBranch(wtList.stdout, targetBranch);
|
|
42
|
+
}
|
|
43
|
+
export async function previewMerge({ cwd, sourceBranch, targetBranch }) {
|
|
44
|
+
let clean = true;
|
|
45
|
+
let conflicts = [];
|
|
46
|
+
const mergeTreeResult = await executeGitCommand(['merge-tree', '--write-tree', targetBranch, sourceBranch], cwd);
|
|
47
|
+
if (mergeTreeResult.exitCode !== 0) {
|
|
48
|
+
clean = false;
|
|
49
|
+
conflicts = parseMergeTreeConflicts(mergeTreeResult.stdout);
|
|
50
|
+
}
|
|
51
|
+
const statResult = await executeGitCommand(['diff', `${targetBranch}...${sourceBranch}`, '--stat'], cwd);
|
|
52
|
+
const stat = statResult.stdout.trim();
|
|
53
|
+
const logResult = await executeGitCommand(['log', `${targetBranch}..${sourceBranch}`, '--oneline', '--format=%h|%s'], cwd);
|
|
54
|
+
const commits = parseMergeCommits(logResult.stdout);
|
|
55
|
+
const targetWorktreePath = await resolveTargetWorktree({ cwd, targetBranch });
|
|
56
|
+
const blockers = targetWorktreePath
|
|
57
|
+
? await detectMergeBlockers(targetWorktreePath, sourceBranch, targetBranch)
|
|
58
|
+
: [];
|
|
59
|
+
return {
|
|
60
|
+
clean,
|
|
61
|
+
conflicts,
|
|
62
|
+
stat,
|
|
63
|
+
commits,
|
|
64
|
+
ahead: commits.length,
|
|
65
|
+
targetWorktreePath: targetWorktreePath ?? undefined,
|
|
66
|
+
targetWorktreeBlockers: blockers,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function executeMergeStrategy(strategy, sourceBranch, commitMessage, targetPath) {
|
|
70
|
+
if (strategy === 'squash') {
|
|
71
|
+
const squashResult = await executeGitCommand(['merge', '--squash', sourceBranch], targetPath);
|
|
72
|
+
if (squashResult.exitCode !== 0)
|
|
73
|
+
return { exitCode: squashResult.exitCode, error: squashResult.stderr };
|
|
74
|
+
const msg2 = commitMessage || `Squash merge branch '${sourceBranch}'`;
|
|
75
|
+
const commitResult = await executeGitCommand(['commit', '-m', msg2], targetPath);
|
|
76
|
+
if (commitResult.exitCode !== 0)
|
|
77
|
+
return { exitCode: commitResult.exitCode, error: commitResult.stderr || 'Failed to commit squash merge' };
|
|
78
|
+
return { exitCode: 0 };
|
|
79
|
+
}
|
|
80
|
+
if (strategy === 'rebase') {
|
|
81
|
+
const result = await executeGitCommand(['merge', '--ff-only', sourceBranch], targetPath);
|
|
82
|
+
return { exitCode: result.exitCode, error: result.stderr };
|
|
83
|
+
}
|
|
84
|
+
const mergeArgs = commitMessage ? ['merge', sourceBranch, '-m', commitMessage] : ['merge', sourceBranch];
|
|
85
|
+
const result = await executeGitCommand(mergeArgs, targetPath);
|
|
86
|
+
return { exitCode: result.exitCode, error: result.stderr };
|
|
87
|
+
}
|
|
88
|
+
async function detectMergeConflicts(targetPath) {
|
|
89
|
+
const result = await executeGitCommand(['diff', '--name-only', '--diff-filter=U'], targetPath);
|
|
90
|
+
return result.stdout.trim().split('\n').filter(f => f.trim());
|
|
91
|
+
}
|
|
92
|
+
async function removeWorktreeWithFallback(mainPath, worktreePath) {
|
|
93
|
+
const removeResult = await executeGitCommand(['worktree', 'remove', worktreePath], mainPath);
|
|
94
|
+
if (removeResult.exitCode === 0)
|
|
95
|
+
return { success: true };
|
|
96
|
+
const forceResult = await executeGitCommand(['worktree', 'remove', '--force', worktreePath], mainPath);
|
|
97
|
+
if (forceResult.exitCode === 0)
|
|
98
|
+
return { success: true };
|
|
99
|
+
return { success: false, warning: `Failed to remove worktree: ${forceResult.stderr || 'unknown error'}` };
|
|
100
|
+
}
|
|
101
|
+
async function isAncestor(cwd, ancestor, descendant) {
|
|
102
|
+
const result = await executeGitCommand(['merge-base', '--is-ancestor', ancestor, descendant], cwd);
|
|
103
|
+
return result.exitCode === 0;
|
|
104
|
+
}
|
|
105
|
+
async function deleteBranchAfterMerge(mainPath, branchName, targetBranch, strategy) {
|
|
106
|
+
const force = strategy === 'squash' || (await isAncestor(mainPath, branchName, targetBranch));
|
|
107
|
+
const result = await executeGitCommand(['branch', force ? '-D' : '-d', branchName], mainPath);
|
|
108
|
+
if (result.exitCode !== 0) {
|
|
109
|
+
return `Failed to delete branch: ${result.stderr || 'unknown error'}`;
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
async function cleanupAfterMerge(mainPath, sourceBranch, targetBranch, strategy, deleteWorktree, deleteBranch) {
|
|
114
|
+
const warnings = [];
|
|
115
|
+
let removedWorktreePath = null;
|
|
116
|
+
if (deleteWorktree) {
|
|
117
|
+
const wtList = await executeGitCommand(['worktree', 'list', '--porcelain'], mainPath);
|
|
118
|
+
const worktreePath = findWorktreePathForBranch(wtList.stdout, sourceBranch);
|
|
119
|
+
if (worktreePath && worktreePath !== mainPath) {
|
|
120
|
+
const result = await removeWorktreeWithFallback(mainPath, worktreePath);
|
|
121
|
+
if (result.success) {
|
|
122
|
+
removedWorktreePath = worktreePath;
|
|
123
|
+
}
|
|
124
|
+
else if (result.warning) {
|
|
125
|
+
warnings.push(result.warning);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (deleteBranch) {
|
|
130
|
+
const warning = await deleteBranchAfterMerge(mainPath, sourceBranch, targetBranch, strategy);
|
|
131
|
+
if (warning)
|
|
132
|
+
warnings.push(warning);
|
|
133
|
+
}
|
|
134
|
+
await executeGitCommand(['worktree', 'prune'], mainPath);
|
|
135
|
+
return { warnings, removedWorktreePath };
|
|
136
|
+
}
|
|
137
|
+
const STASH_MESSAGE_TAG = 'minionry:pre-merge';
|
|
138
|
+
async function pushMergeStash(targetWorktreePath, sourceBranch, targetBranch) {
|
|
139
|
+
const message = `${STASH_MESSAGE_TAG} ${targetBranch} <- ${sourceBranch} @ ${new Date().toISOString()}`;
|
|
140
|
+
const result = await executeGitCommand(['stash', 'push', '-u', '-m', message], targetWorktreePath);
|
|
141
|
+
if (result.exitCode !== 0)
|
|
142
|
+
return null;
|
|
143
|
+
const top = await executeGitCommand(['stash', 'list', '-n', '1', '--format=%H%x09%gs'], targetWorktreePath);
|
|
144
|
+
if (top.exitCode !== 0)
|
|
145
|
+
return null;
|
|
146
|
+
const [sha, ...rest] = top.stdout.trim().split('\t');
|
|
147
|
+
const stashedMsg = rest.join('\t');
|
|
148
|
+
if (!sha || !stashedMsg.includes(STASH_MESSAGE_TAG))
|
|
149
|
+
return null;
|
|
150
|
+
return { ref: 'stash@{0}', sha, message };
|
|
151
|
+
}
|
|
152
|
+
export async function popMergeStashBySha(targetWorktreePath, sha) {
|
|
153
|
+
const list = await executeGitCommand(['stash', 'list', '--format=%gd%x09%H'], targetWorktreePath);
|
|
154
|
+
if (list.exitCode !== 0)
|
|
155
|
+
return { exitCode: list.exitCode, error: list.stderr || 'Failed to read stash list' };
|
|
156
|
+
const ref = list.stdout.split('\n').map(l => l.split('\t')).find(([, h]) => h === sha)?.[0];
|
|
157
|
+
if (!ref)
|
|
158
|
+
return { exitCode: 1, error: 'Stash no longer exists — it may have already been popped or dropped.' };
|
|
159
|
+
const pop = await executeGitCommand(['stash', 'pop', ref], targetWorktreePath);
|
|
160
|
+
return { exitCode: pop.exitCode, error: pop.exitCode !== 0 ? pop.stderr : undefined };
|
|
161
|
+
}
|
|
162
|
+
function alreadyUpToDateError(sourceBranch, targetBranch) {
|
|
163
|
+
return `Already up to date — "${sourceBranch}" has no new commits to merge into "${targetBranch}"`;
|
|
164
|
+
}
|
|
165
|
+
async function buildMergeFailurePayload(targetPath, sourceBranch, targetBranch, mergeError) {
|
|
166
|
+
const conflictFiles = await detectMergeConflicts(targetPath);
|
|
167
|
+
if (conflictFiles.length > 0) {
|
|
168
|
+
return { success: false, conflictFiles, targetWorktreePath: targetPath };
|
|
169
|
+
}
|
|
170
|
+
const overwritten = parseOverwritePaths(mergeError || '');
|
|
171
|
+
if (overwritten.length > 0) {
|
|
172
|
+
const blockers = await detectMergeBlockers(targetPath, sourceBranch, targetBranch);
|
|
173
|
+
const targetWorktreeBlockers = blockers.length > 0
|
|
174
|
+
? blockers
|
|
175
|
+
: overwritten.map(p => ({ path: p, status: 'M', staged: false }));
|
|
176
|
+
return { success: false, targetWorktreePath: targetPath, targetWorktreeBlockers };
|
|
177
|
+
}
|
|
178
|
+
return { success: false, error: mergeError || 'Merge failed', targetWorktreePath: targetPath };
|
|
179
|
+
}
|
|
180
|
+
function buildMergeSuccessPayload(targetPath, mergeCommit, warnings, stash) {
|
|
181
|
+
const data = { success: true, mergeCommit, targetWorktreePath: targetPath };
|
|
182
|
+
if (warnings.length > 0)
|
|
183
|
+
data.warnings = warnings;
|
|
184
|
+
if (stash) {
|
|
185
|
+
data.stashRef = stash.ref;
|
|
186
|
+
data.stashSha = stash.sha;
|
|
187
|
+
data.stashMessage = stash.message;
|
|
188
|
+
}
|
|
189
|
+
return data;
|
|
190
|
+
}
|
|
191
|
+
export async function mergeWorktreeBranch(args) {
|
|
192
|
+
const targetPath = await resolveTargetWorktree({ cwd: args.cwd, targetBranch: args.targetBranch });
|
|
193
|
+
return targetPath ? mergeInWorktree(args, targetPath) : mergeRefOnly(args);
|
|
194
|
+
}
|
|
195
|
+
async function mergeInWorktree(args, targetPath) {
|
|
196
|
+
const { cwd, sourceBranch, targetBranch, strategy, commitMessage, deleteWorktree, deleteBranch, stashFirst } = args;
|
|
197
|
+
const stash = stashFirst ? await pushMergeStash(targetPath, sourceBranch, targetBranch) : null;
|
|
198
|
+
const headBefore = await executeGitCommand(['rev-parse', 'HEAD'], targetPath);
|
|
199
|
+
const mergeResult = await executeMergeStrategy(strategy, sourceBranch, commitMessage, targetPath);
|
|
200
|
+
if (mergeResult.exitCode !== 0) {
|
|
201
|
+
if (stash)
|
|
202
|
+
await popMergeStashBySha(targetPath, stash.sha).catch(() => undefined);
|
|
203
|
+
const data = await buildMergeFailurePayload(targetPath, sourceBranch, targetBranch, mergeResult.error);
|
|
204
|
+
return { data, removedWorktreePath: null };
|
|
205
|
+
}
|
|
206
|
+
const headAfter = await executeGitCommand(['rev-parse', 'HEAD'], targetPath);
|
|
207
|
+
if (headBefore.stdout.trim() === headAfter.stdout.trim()) {
|
|
208
|
+
if (stash)
|
|
209
|
+
await popMergeStashBySha(targetPath, stash.sha).catch(() => undefined);
|
|
210
|
+
return {
|
|
211
|
+
data: { success: false, error: alreadyUpToDateError(sourceBranch, targetBranch), targetWorktreePath: targetPath },
|
|
212
|
+
removedWorktreePath: null,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const commitHashResult = await executeGitCommand(['rev-parse', '--short', 'HEAD'], targetPath);
|
|
216
|
+
const mainPath = await resolveMainWorktreePath(cwd);
|
|
217
|
+
const { warnings, removedWorktreePath } = await cleanupAfterMerge(mainPath, sourceBranch, targetBranch, strategy, !!deleteWorktree, !!deleteBranch);
|
|
218
|
+
return {
|
|
219
|
+
data: buildMergeSuccessPayload(targetPath, commitHashResult.stdout.trim(), warnings, stash),
|
|
220
|
+
removedWorktreePath,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function refOnlyFailure(data) {
|
|
224
|
+
return { failure: { success: false, ...data } };
|
|
225
|
+
}
|
|
226
|
+
async function readCommitSha(cwd, ref) {
|
|
227
|
+
const result = await executeGitCommand(['rev-parse', '--verify', '--quiet', ref], cwd);
|
|
228
|
+
const sha = result.stdout.trim();
|
|
229
|
+
return result.exitCode === 0 && sha ? sha : null;
|
|
230
|
+
}
|
|
231
|
+
async function resolveRefOnlyEndpoints(cwd, sourceBranch, targetBranch) {
|
|
232
|
+
const targetSha = await readCommitSha(cwd, `refs/heads/${targetBranch}`);
|
|
233
|
+
if (!targetSha)
|
|
234
|
+
return refOnlyFailure({ error: `Unknown target branch "${targetBranch}"` });
|
|
235
|
+
const sourceSha = await readCommitSha(cwd, `${sourceBranch}^{commit}`);
|
|
236
|
+
if (!sourceSha)
|
|
237
|
+
return refOnlyFailure({ error: `Unknown source branch "${sourceBranch}"` });
|
|
238
|
+
if (await isAncestor(cwd, sourceSha, targetSha))
|
|
239
|
+
return refOnlyFailure({ error: alreadyUpToDateError(sourceBranch, targetBranch) });
|
|
240
|
+
return { targetSha, sourceSha };
|
|
241
|
+
}
|
|
242
|
+
async function writeMergedCommit(cwd, sourceBranch, targetBranch, parents, message) {
|
|
243
|
+
const mergeTree = await executeGitCommand(['merge-tree', '--write-tree', targetBranch, sourceBranch], cwd);
|
|
244
|
+
if (mergeTree.exitCode !== 0) {
|
|
245
|
+
const conflictFiles = parseMergeTreeConflicts(mergeTree.stdout);
|
|
246
|
+
if (conflictFiles.length === 0)
|
|
247
|
+
return refOnlyFailure({ error: gitErrorText(mergeTree, 'Failed to compute merge') });
|
|
248
|
+
return refOnlyFailure({ conflictFiles, error: `Merge has conflicts — check out "${targetBranch}" in a worktree to resolve them` });
|
|
249
|
+
}
|
|
250
|
+
const tree = parseMergeTreeOid(mergeTree.stdout);
|
|
251
|
+
const commitTree = await executeGitCommand(['commit-tree', tree, ...parents.flatMap(p => ['-p', p]), '-m', message], cwd);
|
|
252
|
+
if (commitTree.exitCode !== 0)
|
|
253
|
+
return refOnlyFailure({ error: commitTree.stderr || 'Failed to write merge commit' });
|
|
254
|
+
return { sha: commitTree.stdout.trim() };
|
|
255
|
+
}
|
|
256
|
+
async function resolveRefOnlyTip(args, targetSha, sourceSha) {
|
|
257
|
+
const { cwd, sourceBranch, targetBranch, strategy, commitMessage } = args;
|
|
258
|
+
if (strategy === 'squash') {
|
|
259
|
+
const message = commitMessage || `Squash merge branch '${sourceBranch}'`;
|
|
260
|
+
return writeMergedCommit(cwd, sourceBranch, targetBranch, [targetSha], message);
|
|
261
|
+
}
|
|
262
|
+
if (await isAncestor(cwd, targetSha, sourceSha))
|
|
263
|
+
return { sha: sourceSha };
|
|
264
|
+
if (strategy === 'rebase') {
|
|
265
|
+
return refOnlyFailure({ error: `Cannot fast-forward "${targetBranch}" to "${sourceBranch}" — check out "${targetBranch}" in a worktree to rebase` });
|
|
266
|
+
}
|
|
267
|
+
const message = commitMessage || `Merge branch '${sourceBranch}' into ${targetBranch}`;
|
|
268
|
+
return writeMergedCommit(cwd, sourceBranch, targetBranch, [targetSha, sourceSha], message);
|
|
269
|
+
}
|
|
270
|
+
async function mergeRefOnly(args) {
|
|
271
|
+
const { cwd, sourceBranch, targetBranch, strategy, deleteWorktree, deleteBranch } = args;
|
|
272
|
+
const endpoints = await resolveRefOnlyEndpoints(cwd, sourceBranch, targetBranch);
|
|
273
|
+
if ('failure' in endpoints)
|
|
274
|
+
return { data: endpoints.failure, removedWorktreePath: null };
|
|
275
|
+
const tip = await resolveRefOnlyTip(args, endpoints.targetSha, endpoints.sourceSha);
|
|
276
|
+
if ('failure' in tip)
|
|
277
|
+
return { data: tip.failure, removedWorktreePath: null };
|
|
278
|
+
const update = await executeGitCommand(['update-ref', '-m', `merge ${sourceBranch}: ref-only ${strategy}`, `refs/heads/${targetBranch}`, tip.sha, endpoints.targetSha], cwd);
|
|
279
|
+
if (update.exitCode !== 0) {
|
|
280
|
+
return { data: { success: false, error: update.stderr || `Failed to update "${targetBranch}"` }, removedWorktreePath: null };
|
|
281
|
+
}
|
|
282
|
+
const shortResult = await executeGitCommand(['rev-parse', '--short', tip.sha], cwd);
|
|
283
|
+
const mainPath = await resolveMainWorktreePath(cwd);
|
|
284
|
+
const { warnings, removedWorktreePath } = await cleanupAfterMerge(mainPath, sourceBranch, targetBranch, strategy, !!deleteWorktree, !!deleteBranch);
|
|
285
|
+
const data = { success: true, mergeCommit: shortResult.stdout.trim() };
|
|
286
|
+
if (warnings.length > 0)
|
|
287
|
+
data.warnings = warnings;
|
|
288
|
+
return { data, removedWorktreePath };
|
|
289
|
+
}
|
|
290
|
+
export async function abortMerge({ cwd, targetWorktreePath }) {
|
|
291
|
+
const path = targetWorktreePath || (await resolveMainWorktreePath(cwd));
|
|
292
|
+
const result = await executeGitCommand(['merge', '--abort'], path);
|
|
293
|
+
if (result.exitCode !== 0) {
|
|
294
|
+
return gitFail(result.stderr || 'Failed to abort merge');
|
|
295
|
+
}
|
|
296
|
+
return gitOk(null);
|
|
297
|
+
}
|
|
298
|
+
export async function completeMerge({ cwd, targetWorktreePath }) {
|
|
299
|
+
const path = targetWorktreePath || (await resolveMainWorktreePath(cwd));
|
|
300
|
+
const result = await executeGitCommand(['commit', '--no-edit'], path);
|
|
301
|
+
if (result.exitCode !== 0) {
|
|
302
|
+
return gitFail(result.stderr || 'Failed to complete merge');
|
|
303
|
+
}
|
|
304
|
+
const hashResult = await executeGitCommand(['rev-parse', '--short', 'HEAD'], path);
|
|
305
|
+
return gitOk({ mergeCommit: hashResult.stdout.trim() });
|
|
306
|
+
}
|
|
307
|
+
export async function discardMergeBlockers({ cwd, paths }) {
|
|
308
|
+
const checkoutResult = await executeGitCommand(['checkout', 'HEAD', '--', ...paths], cwd);
|
|
309
|
+
const cleanResult = await executeGitCommand(['clean', '-f', '--', ...paths], cwd);
|
|
310
|
+
if (checkoutResult.exitCode !== 0 && cleanResult.exitCode !== 0) {
|
|
311
|
+
return gitFail(checkoutResult.stderr || cleanResult.stderr || 'Failed to discard changes');
|
|
312
|
+
}
|
|
313
|
+
return gitOk({ paths });
|
|
314
|
+
}
|