feat: v2.2.92 → v2.2.158 — god-file 분해 + Stocks feature + 대화 연속성
R56–R59: agent.ts 2731→1529줄 god-file 분해 (25 modules) · attrParsers + LLM 메서드 8개 (callNonStreaming, streamChatOnce 등) · executeActions 415줄 → 8 handler 그룹 (file/run/list/brain/calendar/sheets/tasks) · handlePrompt 1100줄 → 7 phase 모듈 (system prompt + budget + autoContinue 등) R50–R55: extension.ts 1145→349줄 (telegram/settings/provider commands 분리) Stocks feature 신규: /stocks slash command (v2.2.152~158) · .astra/stocks.json 저장소 + Yahoo Finance 현재가 갱신 · 8 키워드 필터 (ROE/성장성/유동성/수익성/영업효율/기술력/안정성/PBR) · Naver 시가총액 페이지 JSON API (m.stock.naver.com) 발굴 · LLM Top 5 매력도 분석 + Telegram 자동 보고서 · KST 09:00/15:00 watcher 자동 모니터링 대화 연속성 (v2.2.150~157): · [PRIOR TURN CONCLUSION] block 으로 직전 결론 anchor · thin follow-up 분류 → boilerplate 헤더 suppression · slash 명령 결과 chatHistory mirror (capture wrapper) · echo/parrot 금지 system prompt rule 기타: /stocks 슬래시 자동완성 dropdown UI, Naver JSON API 전환 (cheerio 제거) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
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));
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user