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
9 changes: 5 additions & 4 deletions cli/src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,17 +101,18 @@ async function templateInstall(
targetDir: string,
aiType: AIType,
spinner: ReturnType<typeof ora>,
isGlobal = false
isGlobal = false,
force = false
): Promise<string[]> {
spinner.text = isGlobal
? 'Generating skill files globally...'
: 'Generating skill files from templates...';

if (aiType === 'all') {
return generateAllPlatformFiles(targetDir, isGlobal);
return generateAllPlatformFiles(targetDir, isGlobal, force);
}

return generatePlatformFiles(targetDir, aiType, isGlobal);
return generatePlatformFiles(targetDir, aiType, isGlobal, force);
}

export async function initCommand(options: InitOptions): Promise<void> {
Expand Down Expand Up @@ -178,7 +179,7 @@ export async function initCommand(options: InitOptions): Promise<void> {
}
} else {
// Use new template-based generation (default)
copiedFolders = await templateInstall(cwd, aiType, spinner, isGlobal);
copiedFolders = await templateInstall(cwd, aiType, spinner, isGlobal, options.force);
installMethod = 'template';
}

Expand Down
14 changes: 11 additions & 3 deletions cli/src/utils/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@ async function copyDataAndScripts(targetSkillDir: string): Promise<void> {
export async function generatePlatformFiles(
targetDir: string,
aiType: string,
isGlobal = false
isGlobal = false,
force = false
): Promise<string[]> {
const config = await loadPlatformConfig(aiType);
const createdFolders: string[] = [];
Expand All @@ -208,6 +209,13 @@ export async function generatePlatformFiles(
// Render and write skill file (pass isGlobal to adjust paths)
const skillContent = await renderSkillFile(config, isGlobal);
const skillFilePath = join(skillDir, config.folderStructure.filename);

const fileAlreadyExists = await exists(skillFilePath);
if (fileAlreadyExists && !force) {
console.log(` Skipped (already exists): ${skillFilePath} — use --force to overwrite`);
return [];
}

await writeFile(skillFilePath, skillContent, 'utf-8');
createdFolders.push(config.folderStructure.root);

Expand All @@ -220,12 +228,12 @@ export async function generatePlatformFiles(
/**
* Generate files for all AI types
*/
export async function generateAllPlatformFiles(targetDir: string, isGlobal = false): Promise<string[]> {
export async function generateAllPlatformFiles(targetDir: string, isGlobal = false, force = false): Promise<string[]> {
const allFolders = new Set<string>();

for (const aiType of Object.keys(AI_TO_PLATFORM)) {
try {
const folders = await generatePlatformFiles(targetDir, aiType, isGlobal);
const folders = await generatePlatformFiles(targetDir, aiType, isGlobal, force);
folders.forEach(f => allFolders.add(f));
} catch {
// Skip if generation fails for a platform
Expand Down