@google/gemini-cli-core 0.35.0-preview.2 → 0.36.0-nightly.20260321.fc03891a1
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/README.md +0 -1
- package/dist/docs/CONTRIBUTING.md +0 -15
- package/dist/docs/admin/enterprise-controls.md +61 -0
- package/dist/docs/changelogs/index.md +11 -0
- package/dist/docs/changelogs/latest.md +459 -209
- package/dist/docs/changelogs/preview.md +355 -454
- package/dist/docs/cli/checkpointing.md +3 -1
- package/dist/docs/cli/cli-reference.md +1 -0
- package/dist/docs/cli/custom-commands.md +7 -5
- package/dist/docs/cli/enterprise.md +15 -9
- package/dist/docs/cli/git-worktrees.md +107 -0
- package/dist/docs/cli/model-steering.md +4 -3
- package/dist/docs/cli/model.md +3 -1
- package/dist/docs/cli/notifications.md +4 -3
- package/dist/docs/cli/plan-mode.md +28 -8
- package/dist/docs/cli/sandbox.md +24 -4
- package/dist/docs/cli/session-management.md +6 -0
- package/dist/docs/cli/settings.md +14 -1
- package/dist/docs/cli/skills.md +4 -2
- package/dist/docs/cli/system-prompt.md +3 -1
- package/dist/docs/cli/telemetry.md +6 -3
- package/dist/docs/cli/themes.md +12 -8
- package/dist/docs/cli/tutorials/file-management.md +8 -6
- package/dist/docs/cli/tutorials/mcp-setup.md +5 -3
- package/dist/docs/cli/tutorials/memory-management.md +6 -6
- package/dist/docs/cli/tutorials/plan-mode-steering.md +4 -3
- package/dist/docs/cli/tutorials/shell-commands.md +3 -3
- package/dist/docs/core/remote-agents.md +8 -3
- package/dist/docs/core/subagents.md +21 -13
- package/dist/docs/extensions/reference.md +8 -3
- package/dist/docs/get-started/authentication.md +60 -50
- package/dist/docs/get-started/examples.md +3 -1
- package/dist/docs/get-started/gemini-3.md +11 -5
- package/dist/docs/hooks/index.md +3 -1
- package/dist/docs/hooks/writing-hooks.md +2 -2
- package/dist/docs/ide-integration/ide-companion-spec.md +5 -3
- package/dist/docs/ide-integration/index.md +8 -4
- package/dist/docs/issue-and-pr-automation.md +3 -1
- package/dist/docs/local-development.md +3 -1
- package/dist/docs/reference/commands.md +2 -2
- package/dist/docs/reference/configuration.md +410 -16
- package/dist/docs/reference/policy-engine.md +47 -19
- package/dist/docs/reference/tools.md +3 -1
- package/dist/docs/release-confidence.md +7 -3
- package/dist/docs/releases.md +11 -7
- package/dist/docs/resources/faq.md +13 -0
- package/dist/docs/resources/tos-privacy.md +4 -2
- package/dist/docs/resources/troubleshooting.md +3 -1
- package/dist/docs/sidebar.json +5 -0
- package/dist/docs/tools/mcp-server.md +17 -9
- package/dist/docs/tools/planning.md +3 -1
- package/dist/docs/tools/shell.md +4 -4
- package/dist/docs/tools/todos.md +2 -1
- package/dist/{google-gemini-cli-core-0.35.0-preview.1.tgz → google-gemini-cli-core-0.36.0-nightly.20260317.2f90b4653.tgz} +0 -0
- package/dist/src/agent/agent-session.d.ts +37 -0
- package/dist/src/agent/agent-session.js +168 -0
- package/dist/src/agent/agent-session.js.map +1 -0
- package/dist/src/agent/agent-session.test.d.ts +6 -0
- package/dist/src/agent/agent-session.test.js +217 -0
- package/dist/src/agent/agent-session.test.js.map +1 -0
- package/dist/src/agent/content-utils.d.ts +33 -0
- package/dist/src/agent/content-utils.js +135 -0
- package/dist/src/agent/content-utils.js.map +1 -0
- package/dist/src/agent/content-utils.test.d.ts +6 -0
- package/dist/src/agent/content-utils.test.js +223 -0
- package/dist/src/agent/content-utils.test.js.map +1 -0
- package/dist/src/agent/mock.d.ts +9 -12
- package/dist/src/agent/mock.js +88 -129
- package/dist/src/agent/mock.js.map +1 -1
- package/dist/src/agent/mock.test.js +114 -144
- package/dist/src/agent/mock.test.js.map +1 -1
- package/dist/src/agent/types.d.ts +21 -21
- package/dist/src/agents/a2a-client-manager.d.ts +2 -11
- package/dist/src/agents/a2a-client-manager.js +3 -19
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/a2a-client-manager.test.js +6 -10
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/agent-scheduler.d.ts +6 -0
- package/dist/src/agents/agent-scheduler.js +3 -2
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agent-scheduler.test.js +6 -0
- package/dist/src/agents/agent-scheduler.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentDefinition.js +10 -1
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.js +62 -1
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js +73 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.js +2 -97
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +30 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/browserManager.js +11 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -1
- package/dist/src/agents/browser/browserManager.test.js +37 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +4 -2
- package/dist/src/agents/browser/mcpToolWrapper.js +30 -8
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +30 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +3 -3
- package/dist/src/agents/codebase-investigator.js +3 -3
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +3 -1
- package/dist/src/agents/local-executor.js +138 -39
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +305 -12
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.js +43 -24
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +89 -14
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.d.ts +25 -0
- package/dist/src/agents/memory-manager-agent.js +137 -0
- package/dist/src/agents/memory-manager-agent.js.map +1 -0
- package/dist/src/agents/memory-manager-agent.test.d.ts +6 -0
- package/dist/src/agents/memory-manager-agent.test.js +117 -0
- package/dist/src/agents/memory-manager-agent.test.js.map +1 -0
- package/dist/src/agents/registry.js +21 -3
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +23 -24
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +3 -1
- package/dist/src/agents/remote-invocation.js +10 -5
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +64 -41
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/types.d.ts +12 -0
- package/dist/src/agents/types.js +14 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +41 -1
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +47 -0
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +11 -0
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.test.js +68 -0
- package/dist/src/code_assist/admin/admin_controls.test.js.map +1 -1
- package/dist/src/code_assist/admin/mcpUtils.d.ts +16 -1
- package/dist/src/code_assist/admin/mcpUtils.js +43 -0
- package/dist/src/code_assist/admin/mcpUtils.js.map +1 -1
- package/dist/src/code_assist/admin/mcpUtils.test.js +130 -1
- package/dist/src/code_assist/admin/mcpUtils.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +458 -0
- package/dist/src/code_assist/types.js +26 -0
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/agent-loop-context.d.ts +6 -0
- package/dist/src/config/config.d.ts +41 -10
- package/dist/src/config/config.js +96 -19
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +29 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +265 -9
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.d.ts +13 -2
- package/dist/src/config/models.js +31 -3
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +52 -7
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/path-validation.test.d.ts +6 -0
- package/dist/src/config/path-validation.test.js +59 -0
- package/dist/src/config/path-validation.test.js.map +1 -0
- package/dist/src/core/client.d.ts +1 -0
- package/dist/src/core/client.js +6 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +9 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +36 -6
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +97 -3
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +2 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/prompts.test.js +10 -0
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +2 -7
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.test.js +7 -0
- package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.js +2 -0
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +15 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/memory-manager-policy.test.d.ts +6 -0
- package/dist/src/policy/memory-manager-policy.test.js +80 -0
- package/dist/src/policy/memory-manager-policy.test.js.map +1 -0
- package/dist/src/policy/policies/memory-manager.toml +10 -0
- package/dist/src/policy/policies/plan.toml +14 -0
- package/dist/src/policy/policies/yolo.toml +1 -0
- package/dist/src/policy/policy-engine.js +33 -6
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +85 -3
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.js +44 -0
- package/dist/src/policy/policy-updater.test.js.map +1 -1
- package/dist/src/policy/toml-loader.js +2 -0
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/types.d.ts +11 -0
- package/dist/src/policy/types.js +5 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +5 -3
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +1 -0
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.d.ts +6 -0
- package/dist/src/prompts/snippets-memory-manager.test.js +31 -0
- package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +2 -0
- package/dist/src/prompts/snippets.js +7 -3
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +5 -0
- package/dist/src/prompts/snippets.legacy.js +30 -2
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.js +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +28 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.d.ts +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +160 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +33 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.d.ts +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +87 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -0
- package/dist/src/sandbox/macos/baseProfile.d.ts +20 -0
- package/dist/src/sandbox/macos/baseProfile.js +93 -0
- package/dist/src/sandbox/macos/baseProfile.js.map +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +25 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +58 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.d.ts +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +80 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -0
- package/dist/src/scheduler/scheduler.js +2 -0
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/services/contextManager.js +2 -3
- package/dist/src/services/contextManager.js.map +1 -1
- package/dist/src/services/contextManager.test.js +1 -1
- package/dist/src/services/contextManager.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +36 -1
- package/dist/src/services/modelConfigService.js +66 -0
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +3 -4
- package/dist/src/services/sandboxManager.js +1 -14
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +13 -16
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxManagerFactory.d.ts +11 -0
- package/dist/src/services/sandboxManagerFactory.js +31 -0
- package/dist/src/services/sandboxManagerFactory.js.map +1 -0
- package/dist/src/services/sandboxedFileSystemService.d.ts +17 -0
- package/dist/src/services/sandboxedFileSystemService.js +95 -0
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -0
- package/dist/src/services/sandboxedFileSystemService.test.d.ts +6 -0
- package/dist/src/services/sandboxedFileSystemService.test.js +87 -0
- package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -0
- package/dist/src/services/scripts/GeminiSandbox.cs +370 -0
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +79 -75
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/trackerTypes.d.ts +1 -0
- package/dist/src/services/trackerTypes.js +1 -0
- package/dist/src/services/trackerTypes.js.map +1 -1
- package/dist/src/services/windowsSandboxManager.d.ts +27 -0
- package/dist/src/services/windowsSandboxManager.js +148 -0
- package/dist/src/services/windowsSandboxManager.js.map +1 -0
- package/dist/src/services/windowsSandboxManager.test.d.ts +6 -0
- package/dist/src/services/windowsSandboxManager.test.js +59 -0
- package/dist/src/services/windowsSandboxManager.test.js.map +1 -0
- package/dist/src/services/worktreeService.d.ts +33 -0
- package/dist/src/services/worktreeService.js +174 -0
- package/dist/src/services/worktreeService.js.map +1 -0
- package/dist/src/services/worktreeService.test.d.ts +6 -0
- package/dist/src/services/worktreeService.test.js +200 -0
- package/dist/src/services/worktreeService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +62 -40
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +1 -0
- package/dist/src/telemetry/types.js +3 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +8 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +8 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.d.ts +6 -1
- package/dist/src/tools/exit-plan-mode.js +17 -6
- package/dist/src/tools/exit-plan-mode.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.test.js +22 -1
- package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +22 -3
- package/dist/src/tools/mcp-client-manager.js +84 -32
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +76 -56
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +15 -6
- package/dist/src/tools/mcp-client.js +85 -71
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +195 -88
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +2 -1
- package/dist/src/tools/tool-registry.js +12 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +15 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -1
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/trackerTools.js +6 -1
- package/dist/src/tools/trackerTools.js.map +1 -1
- package/dist/src/tools/trackerTools.test.js +9 -1
- package/dist/src/tools/trackerTools.test.js.map +1 -1
- package/dist/src/tools/write-todos.js +1 -0
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +4 -1
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/agent-sanitization-utils.d.ts +23 -0
- package/dist/src/utils/agent-sanitization-utils.js +123 -0
- package/dist/src/utils/agent-sanitization-utils.js.map +1 -0
- package/dist/src/utils/agent-sanitization-utils.test.d.ts +6 -0
- package/dist/src/utils/agent-sanitization-utils.test.js +83 -0
- package/dist/src/utils/agent-sanitization-utils.test.js.map +1 -0
- package/dist/src/utils/browserConsent.d.ts +17 -0
- package/dist/src/utils/browserConsent.js +78 -0
- package/dist/src/utils/browserConsent.js.map +1 -0
- package/dist/src/utils/browserConsent.test.d.ts +6 -0
- package/dist/src/utils/browserConsent.test.js +93 -0
- package/dist/src/utils/browserConsent.test.js.map +1 -0
- package/dist/src/utils/compatibility.d.ts +16 -0
- package/dist/src/utils/compatibility.js +58 -9
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +127 -29
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -2
- package/dist/src/utils/memoryDiscovery.js +5 -10
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +37 -37
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +5 -5
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/surface.js +4 -3
- package/dist/src/utils/surface.js.map +1 -1
- package/dist/src/utils/toolCallContext.d.ts +2 -0
- package/dist/src/utils/toolCallContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface WorktreeInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
baseSha: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Service for managing Git worktrees within Gemini CLI.
|
|
13
|
+
* Handles creation, cleanup, and environment setup for isolated sessions.
|
|
14
|
+
*/
|
|
15
|
+
export declare class WorktreeService {
|
|
16
|
+
private readonly projectRoot;
|
|
17
|
+
constructor(projectRoot: string);
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new worktree and prepares the environment.
|
|
20
|
+
*/
|
|
21
|
+
setup(name?: string): Promise<WorktreeInfo>;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a worktree has changes and cleans it up if it's unmodified.
|
|
24
|
+
*/
|
|
25
|
+
maybeCleanup(info: WorktreeInfo): Promise<boolean>;
|
|
26
|
+
}
|
|
27
|
+
export declare function createWorktreeService(cwd: string): Promise<WorktreeService>;
|
|
28
|
+
export declare function getProjectRootForWorktree(cwd: string): Promise<string>;
|
|
29
|
+
export declare function getWorktreePath(projectRoot: string, name: string): string;
|
|
30
|
+
export declare function createWorktree(projectRoot: string, name: string): Promise<string>;
|
|
31
|
+
export declare function isGeminiWorktree(dirPath: string, projectRoot: string): boolean;
|
|
32
|
+
export declare function hasWorktreeChanges(dirPath: string, baseSha?: string): Promise<boolean>;
|
|
33
|
+
export declare function cleanupWorktree(dirPath: string, projectRoot: string): Promise<void>;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import { realpathSync } from 'node:fs';
|
|
9
|
+
import { execa } from 'execa';
|
|
10
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
11
|
+
/**
|
|
12
|
+
* Service for managing Git worktrees within Gemini CLI.
|
|
13
|
+
* Handles creation, cleanup, and environment setup for isolated sessions.
|
|
14
|
+
*/
|
|
15
|
+
export class WorktreeService {
|
|
16
|
+
projectRoot;
|
|
17
|
+
constructor(projectRoot) {
|
|
18
|
+
this.projectRoot = projectRoot;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new worktree and prepares the environment.
|
|
22
|
+
*/
|
|
23
|
+
async setup(name) {
|
|
24
|
+
let worktreeName = name?.trim();
|
|
25
|
+
if (!worktreeName) {
|
|
26
|
+
const now = new Date();
|
|
27
|
+
const timestamp = now
|
|
28
|
+
.toISOString()
|
|
29
|
+
.replace(/[:.]/g, '-')
|
|
30
|
+
.replace('T', '-')
|
|
31
|
+
.replace('Z', '');
|
|
32
|
+
const randomSuffix = Math.random().toString(36).substring(2, 6);
|
|
33
|
+
worktreeName = `${timestamp}-${randomSuffix}`;
|
|
34
|
+
}
|
|
35
|
+
// Capture the base commit before creating the worktree
|
|
36
|
+
const { stdout: baseSha } = await execa('git', ['rev-parse', 'HEAD'], {
|
|
37
|
+
cwd: this.projectRoot,
|
|
38
|
+
});
|
|
39
|
+
const worktreePath = await createWorktree(this.projectRoot, worktreeName);
|
|
40
|
+
return {
|
|
41
|
+
name: worktreeName,
|
|
42
|
+
path: worktreePath,
|
|
43
|
+
baseSha: baseSha.trim(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Checks if a worktree has changes and cleans it up if it's unmodified.
|
|
48
|
+
*/
|
|
49
|
+
async maybeCleanup(info) {
|
|
50
|
+
const hasChanges = await hasWorktreeChanges(info.path, info.baseSha);
|
|
51
|
+
if (!hasChanges) {
|
|
52
|
+
try {
|
|
53
|
+
await cleanupWorktree(info.path, this.projectRoot);
|
|
54
|
+
debugLogger.log(`Automatically cleaned up unmodified worktree: ${info.path}`);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
debugLogger.error(`Failed to clean up worktree ${info.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
debugLogger.debug(`Preserving worktree ${info.path} because it has changes.`);
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function createWorktreeService(cwd) {
|
|
68
|
+
const projectRoot = await getProjectRootForWorktree(cwd);
|
|
69
|
+
return new WorktreeService(projectRoot);
|
|
70
|
+
}
|
|
71
|
+
// Low-level worktree utilities
|
|
72
|
+
export async function getProjectRootForWorktree(cwd) {
|
|
73
|
+
try {
|
|
74
|
+
const { stdout } = await execa('git', ['rev-parse', '--git-common-dir'], {
|
|
75
|
+
cwd,
|
|
76
|
+
});
|
|
77
|
+
const gitCommonDir = stdout.trim();
|
|
78
|
+
const absoluteGitDir = path.isAbsolute(gitCommonDir)
|
|
79
|
+
? gitCommonDir
|
|
80
|
+
: path.resolve(cwd, gitCommonDir);
|
|
81
|
+
// The project root is the parent of the .git directory/file
|
|
82
|
+
return path.dirname(absoluteGitDir);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
debugLogger.debug(`Failed to get project root for worktree at ${cwd}: ${e instanceof Error ? e.message : String(e)}`);
|
|
86
|
+
return cwd;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function getWorktreePath(projectRoot, name) {
|
|
90
|
+
return path.join(projectRoot, '.gemini', 'worktrees', name);
|
|
91
|
+
}
|
|
92
|
+
export async function createWorktree(projectRoot, name) {
|
|
93
|
+
const worktreePath = getWorktreePath(projectRoot, name);
|
|
94
|
+
const branchName = `worktree-${name}`;
|
|
95
|
+
await execa('git', ['worktree', 'add', worktreePath, '-b', branchName], {
|
|
96
|
+
cwd: projectRoot,
|
|
97
|
+
});
|
|
98
|
+
return worktreePath;
|
|
99
|
+
}
|
|
100
|
+
export function isGeminiWorktree(dirPath, projectRoot) {
|
|
101
|
+
try {
|
|
102
|
+
const realDirPath = realpathSync(dirPath);
|
|
103
|
+
const realProjectRoot = realpathSync(projectRoot);
|
|
104
|
+
const worktreesBaseDir = path.join(realProjectRoot, '.gemini', 'worktrees');
|
|
105
|
+
const relative = path.relative(worktreesBaseDir, realDirPath);
|
|
106
|
+
return !relative.startsWith('..') && !path.isAbsolute(relative);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export async function hasWorktreeChanges(dirPath, baseSha) {
|
|
113
|
+
try {
|
|
114
|
+
// 1. Check for uncommitted changes (index or working tree)
|
|
115
|
+
const { stdout: status } = await execa('git', ['status', '--porcelain'], {
|
|
116
|
+
cwd: dirPath,
|
|
117
|
+
});
|
|
118
|
+
if (status.trim() !== '') {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
// 2. Check if the current commit has moved from the base
|
|
122
|
+
if (baseSha) {
|
|
123
|
+
const { stdout: currentSha } = await execa('git', ['rev-parse', 'HEAD'], {
|
|
124
|
+
cwd: dirPath,
|
|
125
|
+
});
|
|
126
|
+
if (currentSha.trim() !== baseSha) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
debugLogger.debug(`Failed to check worktree changes at ${dirPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
134
|
+
// If any git command fails, assume the worktree is dirty to be safe.
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function cleanupWorktree(dirPath, projectRoot) {
|
|
139
|
+
try {
|
|
140
|
+
await fs.access(dirPath);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return; // Worktree already gone
|
|
144
|
+
}
|
|
145
|
+
let branchName;
|
|
146
|
+
try {
|
|
147
|
+
// 1. Discover the branch name associated with this worktree path
|
|
148
|
+
const { stdout } = await execa('git', ['-C', dirPath, 'branch', '--show-current'], {
|
|
149
|
+
cwd: projectRoot,
|
|
150
|
+
});
|
|
151
|
+
branchName = stdout.trim() || undefined;
|
|
152
|
+
// 2. Remove the worktree
|
|
153
|
+
await execa('git', ['worktree', 'remove', dirPath, '--force'], {
|
|
154
|
+
cwd: projectRoot,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
debugLogger.debug(`Failed to remove worktree ${dirPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
// 3. Delete the branch if we found it
|
|
162
|
+
if (branchName) {
|
|
163
|
+
try {
|
|
164
|
+
await execa('git', ['branch', '-D', branchName], {
|
|
165
|
+
cwd: projectRoot,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
debugLogger.debug(`Failed to delete branch ${branchName}: ${e instanceof Error ? e.message : String(e)}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=worktreeService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeService.js","sourceRoot":"","sources":["../../../src/services/worktreeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import * as fs from 'node:fs/promises';
|
|
9
|
+
import { getProjectRootForWorktree, createWorktree, isGeminiWorktree, hasWorktreeChanges, cleanupWorktree, getWorktreePath, WorktreeService, } from './worktreeService.js';
|
|
10
|
+
import { execa } from 'execa';
|
|
11
|
+
vi.mock('execa');
|
|
12
|
+
vi.mock('node:fs/promises');
|
|
13
|
+
vi.mock('node:fs', async (importOriginal) => {
|
|
14
|
+
const actual = await importOriginal();
|
|
15
|
+
return {
|
|
16
|
+
...actual,
|
|
17
|
+
realpathSync: vi.fn((p) => p),
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
describe('worktree utilities', () => {
|
|
21
|
+
const projectRoot = '/mock/project';
|
|
22
|
+
const worktreeName = 'test-feature';
|
|
23
|
+
const expectedPath = path.join(projectRoot, '.gemini', 'worktrees', worktreeName);
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
vi.clearAllMocks();
|
|
26
|
+
});
|
|
27
|
+
describe('getProjectRootForWorktree', () => {
|
|
28
|
+
it('should return the project root from git common dir', async () => {
|
|
29
|
+
// In main repo, git-common-dir is often just ".git"
|
|
30
|
+
vi.mocked(execa).mockResolvedValue({
|
|
31
|
+
stdout: '.git\n',
|
|
32
|
+
});
|
|
33
|
+
const result = await getProjectRootForWorktree('/mock/project');
|
|
34
|
+
expect(result).toBe('/mock/project');
|
|
35
|
+
expect(execa).toHaveBeenCalledWith('git', ['rev-parse', '--git-common-dir'], { cwd: '/mock/project' });
|
|
36
|
+
});
|
|
37
|
+
it('should resolve absolute git common dir paths (as seen in worktrees)', async () => {
|
|
38
|
+
// Inside a worktree, git-common-dir is usually an absolute path to the main .git folder
|
|
39
|
+
vi.mocked(execa).mockResolvedValue({
|
|
40
|
+
stdout: '/mock/project/.git\n',
|
|
41
|
+
});
|
|
42
|
+
const result = await getProjectRootForWorktree('/mock/project/.gemini/worktrees/my-feature');
|
|
43
|
+
expect(result).toBe('/mock/project');
|
|
44
|
+
});
|
|
45
|
+
it('should fallback to cwd if git command fails', async () => {
|
|
46
|
+
vi.mocked(execa).mockRejectedValue(new Error('not a git repo'));
|
|
47
|
+
const result = await getProjectRootForWorktree('/mock/non-git/src');
|
|
48
|
+
expect(result).toBe('/mock/non-git/src');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('getWorktreePath', () => {
|
|
52
|
+
it('should return the correct path for a given name', () => {
|
|
53
|
+
expect(getWorktreePath(projectRoot, worktreeName)).toBe(expectedPath);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('createWorktree', () => {
|
|
57
|
+
it('should execute git worktree add with correct branch and path', async () => {
|
|
58
|
+
vi.mocked(execa).mockResolvedValue({ stdout: '' });
|
|
59
|
+
const resultPath = await createWorktree(projectRoot, worktreeName);
|
|
60
|
+
expect(resultPath).toBe(expectedPath);
|
|
61
|
+
expect(execa).toHaveBeenCalledWith('git', ['worktree', 'add', expectedPath, '-b', `worktree-${worktreeName}`], { cwd: projectRoot });
|
|
62
|
+
});
|
|
63
|
+
it('should throw an error if git worktree add fails', async () => {
|
|
64
|
+
vi.mocked(execa).mockRejectedValue(new Error('git failed'));
|
|
65
|
+
await expect(createWorktree(projectRoot, worktreeName)).rejects.toThrow('git failed');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('isGeminiWorktree', () => {
|
|
69
|
+
it('should return true for a valid gemini worktree path', () => {
|
|
70
|
+
expect(isGeminiWorktree(expectedPath, projectRoot)).toBe(true);
|
|
71
|
+
expect(isGeminiWorktree(path.join(expectedPath, 'src'), projectRoot)).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('should return false for a path outside gemini worktrees', () => {
|
|
74
|
+
expect(isGeminiWorktree(path.join(projectRoot, 'src'), projectRoot)).toBe(false);
|
|
75
|
+
expect(isGeminiWorktree('/some/other/path', projectRoot)).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('hasWorktreeChanges', () => {
|
|
79
|
+
it('should return true if git status --porcelain has output', async () => {
|
|
80
|
+
vi.mocked(execa).mockResolvedValue({
|
|
81
|
+
stdout: ' M somefile.txt\n?? newfile.txt',
|
|
82
|
+
});
|
|
83
|
+
const hasChanges = await hasWorktreeChanges(expectedPath);
|
|
84
|
+
expect(hasChanges).toBe(true);
|
|
85
|
+
expect(execa).toHaveBeenCalledWith('git', ['status', '--porcelain'], {
|
|
86
|
+
cwd: expectedPath,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
it('should return true if there are untracked files', async () => {
|
|
90
|
+
vi.mocked(execa).mockResolvedValue({
|
|
91
|
+
stdout: '?? untracked-file.txt\n',
|
|
92
|
+
});
|
|
93
|
+
const hasChanges = await hasWorktreeChanges(expectedPath);
|
|
94
|
+
expect(hasChanges).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('should return true if HEAD differs from baseSha', async () => {
|
|
97
|
+
vi.mocked(execa)
|
|
98
|
+
.mockResolvedValueOnce({ stdout: '' }) // status clean
|
|
99
|
+
.mockResolvedValueOnce({ stdout: 'different-sha' }); // HEAD moved
|
|
100
|
+
const hasChanges = await hasWorktreeChanges(expectedPath, 'base-sha');
|
|
101
|
+
expect(hasChanges).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it('should return false if status is clean and HEAD matches baseSha', async () => {
|
|
104
|
+
vi.mocked(execa)
|
|
105
|
+
.mockResolvedValueOnce({ stdout: '' }) // status clean
|
|
106
|
+
.mockResolvedValueOnce({ stdout: 'base-sha' }); // HEAD same
|
|
107
|
+
const hasChanges = await hasWorktreeChanges(expectedPath, 'base-sha');
|
|
108
|
+
expect(hasChanges).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it('should return true if any git command fails', async () => {
|
|
111
|
+
vi.mocked(execa).mockRejectedValue(new Error('git error'));
|
|
112
|
+
const hasChanges = await hasWorktreeChanges(expectedPath);
|
|
113
|
+
expect(hasChanges).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('cleanupWorktree', () => {
|
|
117
|
+
it('should remove the worktree and delete the branch', async () => {
|
|
118
|
+
vi.mocked(fs.access).mockResolvedValue(undefined);
|
|
119
|
+
vi.mocked(execa)
|
|
120
|
+
.mockResolvedValueOnce({
|
|
121
|
+
stdout: `worktree-${worktreeName}\n`,
|
|
122
|
+
}) // branch --show-current
|
|
123
|
+
.mockResolvedValueOnce({ stdout: '' }) // remove
|
|
124
|
+
.mockResolvedValueOnce({ stdout: '' }); // branch -D
|
|
125
|
+
await cleanupWorktree(expectedPath, projectRoot);
|
|
126
|
+
expect(execa).toHaveBeenCalledTimes(3);
|
|
127
|
+
expect(execa).toHaveBeenNthCalledWith(1, 'git', ['-C', expectedPath, 'branch', '--show-current'], { cwd: projectRoot });
|
|
128
|
+
expect(execa).toHaveBeenNthCalledWith(2, 'git', ['worktree', 'remove', expectedPath, '--force'], { cwd: projectRoot });
|
|
129
|
+
expect(execa).toHaveBeenNthCalledWith(3, 'git', ['branch', '-D', `worktree-${worktreeName}`], { cwd: projectRoot });
|
|
130
|
+
});
|
|
131
|
+
it('should handle branch discovery failure gracefully', async () => {
|
|
132
|
+
vi.mocked(fs.access).mockResolvedValue(undefined);
|
|
133
|
+
vi.mocked(execa)
|
|
134
|
+
.mockResolvedValueOnce({ stdout: '' }) // no branch found
|
|
135
|
+
.mockResolvedValueOnce({ stdout: '' }); // remove
|
|
136
|
+
await cleanupWorktree(expectedPath, projectRoot);
|
|
137
|
+
expect(execa).toHaveBeenCalledTimes(2);
|
|
138
|
+
expect(execa).toHaveBeenNthCalledWith(2, 'git', ['worktree', 'remove', expectedPath, '--force'], { cwd: projectRoot });
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('WorktreeService', () => {
|
|
143
|
+
const projectRoot = '/mock/project';
|
|
144
|
+
const service = new WorktreeService(projectRoot);
|
|
145
|
+
beforeEach(() => {
|
|
146
|
+
vi.clearAllMocks();
|
|
147
|
+
});
|
|
148
|
+
describe('setup', () => {
|
|
149
|
+
it('should capture baseSha and create a worktree', async () => {
|
|
150
|
+
vi.mocked(execa).mockResolvedValue({
|
|
151
|
+
stdout: 'current-sha\n',
|
|
152
|
+
});
|
|
153
|
+
const info = await service.setup('feature-x');
|
|
154
|
+
expect(execa).toHaveBeenCalledWith('git', ['rev-parse', 'HEAD'], {
|
|
155
|
+
cwd: projectRoot,
|
|
156
|
+
});
|
|
157
|
+
expect(info.name).toBe('feature-x');
|
|
158
|
+
expect(info.baseSha).toBe('current-sha');
|
|
159
|
+
expect(info.path).toContain('feature-x');
|
|
160
|
+
});
|
|
161
|
+
it('should generate a timestamped name if none provided', async () => {
|
|
162
|
+
vi.mocked(execa).mockResolvedValue({
|
|
163
|
+
stdout: 'current-sha\n',
|
|
164
|
+
});
|
|
165
|
+
const info = await service.setup();
|
|
166
|
+
expect(info.name).toMatch(/^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\w+/);
|
|
167
|
+
expect(info.path).toContain(info.name);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('maybeCleanup', () => {
|
|
171
|
+
const info = {
|
|
172
|
+
name: 'feature-x',
|
|
173
|
+
path: '/mock/project/.gemini/worktrees/feature-x',
|
|
174
|
+
baseSha: 'base-sha',
|
|
175
|
+
};
|
|
176
|
+
it('should cleanup unmodified worktrees', async () => {
|
|
177
|
+
// Mock hasWorktreeChanges -> false (no changes)
|
|
178
|
+
vi.mocked(execa)
|
|
179
|
+
.mockResolvedValueOnce({ stdout: '' }) // status check
|
|
180
|
+
.mockResolvedValueOnce({ stdout: 'base-sha' }); // SHA check
|
|
181
|
+
vi.mocked(fs.access).mockResolvedValue(undefined);
|
|
182
|
+
vi.mocked(execa).mockResolvedValue({ stdout: '' }); // cleanup calls
|
|
183
|
+
const cleanedUp = await service.maybeCleanup(info);
|
|
184
|
+
expect(cleanedUp).toBe(true);
|
|
185
|
+
// Verify cleanupWorktree utilities were called (execa calls inside cleanupWorktree)
|
|
186
|
+
expect(execa).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['worktree', 'remove', info.path, '--force']), expect.anything());
|
|
187
|
+
});
|
|
188
|
+
it('should preserve modified worktrees', async () => {
|
|
189
|
+
// Mock hasWorktreeChanges -> true (changes detected)
|
|
190
|
+
vi.mocked(execa).mockResolvedValue({
|
|
191
|
+
stdout: ' M modified-file.ts',
|
|
192
|
+
});
|
|
193
|
+
const cleanedUp = await service.maybeCleanup(info);
|
|
194
|
+
expect(cleanedUp).toBe(false);
|
|
195
|
+
// Ensure cleanupWorktree was NOT called
|
|
196
|
+
expect(execa).not.toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['worktree', 'remove']), expect.anything());
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=worktreeService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeService.test.js","sourceRoot":"","sources":["../../../src/services/worktreeService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -520,6 +520,10 @@ export class ClearcutLogger {
|
|
|
520
520
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EXTENSION_IDS,
|
|
521
521
|
value: event.extension_ids.toString(),
|
|
522
522
|
},
|
|
523
|
+
{
|
|
524
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_WORKTREE_ACTIVE,
|
|
525
|
+
value: event.worktree_active.toString(),
|
|
526
|
+
},
|
|
523
527
|
];
|
|
524
528
|
// Add hardware information only to the start session event
|
|
525
529
|
const cpus = os.cpus();
|