import * as vscode from 'vscode'; import { FileSystemProjectScaffolder } from '../scaffolder/projectScaffolder'; import type { ProjectTemplateId } from '../scaffolder/templates'; /** * Project Scaffolder — Astra 의 Developer 빠른 시작 명령 (`g1nation.scaffoldProject`). * * activate() 안에 inline 으로 있던 ~35줄 wizard 를 별도 모듈로 분리. scaffolder * 인스턴스는 명령 등록 시 1회 생성 — 매 실행마다 new 할 필요 없고 외부에서 참조도 * 안 됨 → 모듈 안에 가둠. */ export function registerScaffoldCommand(): vscode.Disposable { const scaffolder = new FileSystemProjectScaffolder(); return vscode.commands.registerCommand('g1nation.scaffoldProject', async () => { const folders = vscode.workspace.workspaceFolders; if (!folders || folders.length === 0) { vscode.window.showErrorMessage('워크스페이스 폴더를 먼저 여세요.'); return; } const name = await vscode.window.showInputBox({ placeHolder: '프로젝트 이름 (영문/숫자/_/-, 2~40자)', prompt: 'Astra가 워크스페이스 안에 만들 프로젝트 폴더 이름', validateInput: (v) => /^[a-zA-Z0-9_-]{2,40}$/.test(v.trim()) ? null : '영문/숫자/_/- 만, 2~40자', }); if (!name) return; const picked = await vscode.window.showQuickPick( scaffolder.listTemplates().map(t => ({ label: t.label, detail: t.detail, id: t.id })), { placeHolder: '템플릿 선택' } ); if (!picked) return; const result = await scaffolder.scaffold({ name: name.trim(), template: picked.id as ProjectTemplateId, rootDir: folders[0].uri.fsPath, }); if (!result.ok) { vscode.window.showErrorMessage(`프로젝트 생성 실패: ${result.error}`); return; } const action = await vscode.window.showInformationMessage( `✅ ${name} 생성 완료 — ${result.projectPath}`, '폴더 열기', '닫기' ); if (action === '폴더 열기') { await vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(result.projectPath)); } }); }