Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ describe('install service', () => {
expect(report.warnings).toEqual([]);
});

it('prompts and skips conflicting artifacts when overwrite is not confirmed', async () => {
it('reinstalls existing generated artifacts without prompting for overwrite', async () => {
mockTemplateManager.checkEnvironmentExists
.mockResolvedValueOnce(true)
.mockResolvedValueOnce(true);
Expand All @@ -101,31 +101,19 @@ describe('install service', () => {

const report = await reconcileAndInstall(installConfig, {});

expect(mockConfirm).toHaveBeenCalledTimes(1);
expect(report.environments.skipped).toBe(1);
expect(report.phases.skipped).toBe(1);
expect(mockConfirm).not.toHaveBeenCalled();
expect(mockTemplateManager.checkEnvironmentExists).not.toHaveBeenCalled();
expect(mockTemplateManager.fileExists).not.toHaveBeenCalled();
expect(report.environments.installed).toBe(1);
expect(report.phases.installed).toBe(1);
expect(report.skills.installed).toBe(1);
expect(mockConfigManager.update).toHaveBeenCalledWith({
environments: ['codex'],
phases: ['requirements'],
skills: [{ registry: 'codeaholicguy/ai-devkit', name: 'debug' }],
});
});

it('overwrites conflicting artifacts when overwrite is confirmed via prompt', async () => {
mockTemplateManager.checkEnvironmentExists
.mockResolvedValueOnce(true)
.mockResolvedValueOnce(true);
mockTemplateManager.fileExists
.mockResolvedValueOnce(true)
.mockResolvedValueOnce(true);
mockConfirm.mockResolvedValue(true);

const report = await reconcileAndInstall(installConfig, {});

expect(mockConfirm).toHaveBeenCalledTimes(1);
expect(report.environments.installed).toBe(1);
expect(report.phases.installed).toBe(1);
});

it('auto-overwrites and does not prompt when --overwrite is set', async () => {
mockTemplateManager.checkEnvironmentExists
.mockResolvedValueOnce(true)
Expand Down
53 changes: 0 additions & 53 deletions packages/cli/src/services/install/install.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { TemplateManager } from '../../lib/TemplateManager.js';
import { InstallConfigData } from '../../util/config.js';
import { installMcpServers, McpInstallReport } from './mcp/index.js';
import type { DevKitConfig } from '../../types.js';
import { confirm } from '@inquirer/prompts';

export interface InstallRunOptions {
overwrite?: boolean;
Expand Down Expand Up @@ -42,9 +41,6 @@ export async function reconcileAndInstall(
warnings: []
};

const hasConflicts = await hasOverwriteConflicts(templateManager, config);
const shouldOverwrite = await resolveOverwritePolicy(options, hasConflicts);

let projectConfig = await configManager.read();
if (!projectConfig) {
await configManager.create();
Expand All @@ -61,12 +57,6 @@ export async function reconcileAndInstall(

for (const envCode of config.environments) {
try {
const exists = await templateManager.checkEnvironmentExists(envCode);
if (exists && !shouldOverwrite) {
report.environments.skipped += 1;
continue;
}

await templateManager.setupMultipleEnvironments([envCode]);
report.environments.installed += 1;
successfulEnvironments.push(envCode);
Expand All @@ -80,12 +70,6 @@ export async function reconcileAndInstall(

for (const phase of config.phases) {
try {
const exists = await templateManager.fileExists(phase);
if (exists && !shouldOverwrite) {
report.phases.skipped += 1;
continue;
}

await templateManager.copyPhaseTemplate(phase);
await configManager.addPhase(phase);
report.phases.installed += 1;
Expand Down Expand Up @@ -162,40 +146,3 @@ export function getInstallExitCode(report: InstallReport, options: InstallRunOpt

return 0;
}

async function hasOverwriteConflicts(
templateManager: TemplateManager,
config: InstallConfigData
): Promise<boolean> {
for (const env of config.environments) {
if (await templateManager.checkEnvironmentExists(env)) {
return true;
}
}

for (const phase of config.phases) {
if (await templateManager.fileExists(phase)) {
return true;
}
}

return false;
}

async function resolveOverwritePolicy(
options: InstallRunOptions,
hasConflicts: boolean
): Promise<boolean> {
if (!hasConflicts) {
return false;
}

if (options.overwrite) {
return true;
}

return confirm({
message: 'Existing install artifacts were found. Overwrite them?',
default: false
});
}
Loading