@silbaram/artifact-driven-agent 0.1.9 → 0.2.3
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 +296 -25
- package/ai-dev-team/.ada-status.template.json +10 -10
- package/ai-dev-team/README.md +39 -44
- package/ai-dev-team/artifacts/api.md +2 -212
- package/ai-dev-team/artifacts/features/_template/api.md +19 -19
- package/ai-dev-team/artifacts/features/_template/review.md +14 -14
- package/ai-dev-team/artifacts/features/_template/spec.md +28 -28
- package/ai-dev-team/artifacts/features/_template/ui.md +14 -14
- package/ai-dev-team/artifacts/improvement-reports/IMP-0000-template.md +57 -57
- package/ai-dev-team/artifacts/project.md +2 -193
- package/ai-dev-team/artifacts/rfc/RFC-0000-template.md +49 -49
- package/core/artifacts/decision.md +72 -72
- package/core/artifacts/plan.md +187 -187
- package/core/artifacts/project.md +193 -193
- package/core/artifacts/sprints/_template/docs/release-notes.md +37 -37
- package/core/artifacts/sprints/_template/meta.md +54 -54
- package/core/artifacts/sprints/_template/retrospective.md +50 -50
- package/core/artifacts/sprints/_template/review-reports/review-template.md +49 -49
- package/core/artifacts/sprints/_template/tasks/task-template.md +43 -43
- package/core/docs-templates/mkdocs/docs/architecture/overview.md +29 -29
- package/core/docs-templates/mkdocs/docs/changelog.md +36 -36
- package/core/docs-templates/mkdocs/docs/contributing/contributing.md +60 -60
- package/core/docs-templates/mkdocs/docs/getting-started/configuration.md +51 -51
- package/core/docs-templates/mkdocs/docs/getting-started/installation.md +41 -41
- package/core/docs-templates/mkdocs/docs/getting-started/quick-start.md +56 -56
- package/core/docs-templates/mkdocs/docs/guides/api-reference.md +83 -83
- package/core/docs-templates/mkdocs/docs/index.md +32 -32
- package/core/docs-templates/mkdocs/mkdocs.yml +86 -86
- package/core/roles/analyzer.md +265 -265
- package/core/roles/developer.md +6 -1
- package/core/roles/documenter.md +226 -715
- package/core/roles/improver.md +461 -461
- package/core/roles/manager.md +574 -544
- package/core/roles/planner.md +398 -398
- package/core/roles/reviewer.md +294 -294
- package/core/rules/document-priority.md +198 -198
- package/core/rules/escalation.md +172 -172
- package/core/rules/iteration.md +236 -236
- package/core/rules/rfc.md +31 -31
- package/core/rules/rollback.md +218 -218
- package/core/skills/_template/SKILL.md +50 -0
- package/core/skills/clean-code/SKILL.md +177 -0
- package/core/skills/code-review-checklist/SKILL.md +125 -0
- package/core/skills/error-handling/SKILL.md +155 -0
- package/core/skills/talk-game-dot-design/SKILL.md +85 -0
- package/core/skills/talk-game-dot-design/references/asset-specs.md +57 -0
- package/core/skills/talk-game-dot-design/references/review-checklist.md +34 -0
- package/core/skills/task-writing/SKILL.md +166 -0
- package/core/skills/testing-patterns/SKILL.md +140 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +121 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/commands/config.d.ts +4 -0
- package/dist/src/commands/config.js +427 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/docs.d.ts +12 -0
- package/dist/src/commands/docs.js +453 -0
- package/dist/src/commands/docs.js.map +1 -0
- package/dist/src/commands/interactive.d.ts +4 -0
- package/dist/src/commands/interactive.js +380 -0
- package/dist/src/commands/interactive.js.map +1 -0
- package/dist/src/commands/logs.d.ts +1 -0
- package/dist/src/commands/logs.js +76 -0
- package/dist/src/commands/logs.js.map +1 -0
- package/dist/src/commands/monitor.d.ts +6 -0
- package/dist/src/commands/monitor.js +216 -0
- package/dist/src/commands/monitor.js.map +1 -0
- package/dist/src/commands/reset.d.ts +4 -0
- package/dist/src/commands/reset.js +57 -0
- package/dist/src/commands/reset.js.map +1 -0
- package/dist/src/commands/run.d.ts +45 -0
- package/dist/src/commands/run.js +421 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/sessions.d.ts +5 -0
- package/dist/src/commands/sessions.js +563 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/setup.d.ts +1 -0
- package/dist/src/commands/setup.js +132 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/commands/skills.d.ts +4 -0
- package/dist/src/commands/skills.js +748 -0
- package/dist/src/commands/skills.js.map +1 -0
- package/dist/src/commands/sprint.d.ts +4 -0
- package/dist/src/commands/sprint.js +434 -0
- package/dist/src/commands/sprint.js.map +1 -0
- package/dist/src/commands/status.d.ts +1 -0
- package/dist/src/commands/status.js +97 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/upgrade.d.ts +6 -0
- package/dist/src/commands/upgrade.js +350 -0
- package/dist/src/commands/upgrade.js.map +1 -0
- package/dist/src/commands/validate.d.ts +8 -0
- package/dist/src/commands/validate.js +260 -0
- package/dist/src/commands/validate.js.map +1 -0
- package/dist/src/commands/validate.test.d.ts +1 -0
- package/dist/src/commands/validate.test.js +74 -0
- package/dist/src/commands/validate.test.js.map +1 -0
- package/{src/index.js → dist/src/index.d.ts} +1 -3
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types/common.d.ts +31 -0
- package/dist/src/types/common.js +2 -0
- package/dist/src/types/common.js.map +1 -0
- package/dist/src/types/config.d.ts +46 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/index.d.ts +53 -0
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/session.d.ts +87 -0
- package/dist/src/types/session.js +2 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/task.d.ts +32 -0
- package/dist/src/types/task.js +2 -0
- package/dist/src/types/task.js.map +1 -0
- package/dist/src/ui/dashboard.d.ts +9 -0
- package/dist/src/ui/dashboard.js +468 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/keyHandler.d.ts +47 -0
- package/dist/src/ui/keyHandler.js +132 -0
- package/dist/src/ui/keyHandler.js.map +1 -0
- package/dist/src/ui/quickActions.d.ts +25 -0
- package/dist/src/ui/quickActions.js +106 -0
- package/dist/src/ui/quickActions.js.map +1 -0
- package/dist/src/utils/config.d.ts +33 -0
- package/dist/src/utils/config.js +135 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/files.d.ts +84 -0
- package/dist/src/utils/files.js +202 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/promptBuilder.d.ts +39 -0
- package/dist/src/utils/promptBuilder.js +726 -0
- package/dist/src/utils/promptBuilder.js.map +1 -0
- package/dist/src/utils/sessionState.d.ts +83 -0
- package/dist/src/utils/sessionState.js +466 -0
- package/dist/src/utils/sessionState.js.map +1 -0
- package/dist/src/utils/sessionState.process.test.d.ts +1 -0
- package/dist/src/utils/sessionState.process.test.js +93 -0
- package/dist/src/utils/sessionState.process.test.js.map +1 -0
- package/dist/src/utils/sessionState.test.d.ts +1 -0
- package/dist/src/utils/sessionState.test.js +150 -0
- package/dist/src/utils/sessionState.test.js.map +1 -0
- package/dist/src/utils/sprintUtils.d.ts +13 -0
- package/dist/src/utils/sprintUtils.js +129 -0
- package/dist/src/utils/sprintUtils.js.map +1 -0
- package/dist/src/utils/taskParser.d.ts +9 -0
- package/dist/src/utils/taskParser.js +122 -0
- package/dist/src/utils/taskParser.js.map +1 -0
- package/dist/src/utils/taskParser.test.d.ts +1 -0
- package/dist/src/utils/taskParser.test.js +69 -0
- package/dist/src/utils/taskParser.test.js.map +1 -0
- package/package.json +62 -47
- package/templates/cli/artifacts/commands.md +262 -262
- package/templates/cli/artifacts/output-format.md +298 -298
- package/templates/cli/rules/command-change.md +225 -225
- package/templates/game/artifacts/assets.md +148 -148
- package/templates/game/artifacts/game-systems.md +217 -217
- package/templates/game/artifacts/hud.md +199 -199
- package/templates/game/rules/system-change.md +184 -184
- package/templates/library/artifacts/changelog.md +84 -84
- package/templates/library/artifacts/examples.md +157 -157
- package/templates/library/artifacts/public-api.md +197 -197
- package/templates/library/rules/versioning.md +186 -186
- package/templates/web-dev/artifacts/api.md +212 -212
- package/templates/web-dev/artifacts/ui.md +104 -104
- package/templates/web-dev/rules/api-change.md +198 -198
- package/ai-dev-team/.ada-status.json +0 -10
- package/ai-dev-team/.ada-version +0 -6
- package/ai-dev-team/.current-template +0 -1
- package/ai-dev-team/.gitkeep +0 -0
- package/ai-dev-team/.sessions/logs/20260124-014551-00f04724.log +0 -5
- package/ai-dev-team/.sessions/logs/20260124-014623-cb2b1d44.log +0 -5
- package/ai-dev-team/artifacts/.gitkeep +0 -0
- package/ai-dev-team/artifacts/decision.md +0 -72
- package/ai-dev-team/artifacts/plan.md +0 -187
- package/ai-dev-team/artifacts/sprints/_template/docs/release-notes.md +0 -37
- package/ai-dev-team/artifacts/sprints/_template/meta.md +0 -54
- package/ai-dev-team/artifacts/sprints/_template/retrospective.md +0 -50
- package/ai-dev-team/artifacts/sprints/_template/review-reports/review-template.md +0 -49
- package/ai-dev-team/artifacts/sprints/_template/tasks/task-template.md +0 -43
- package/ai-dev-team/artifacts/ui.md +0 -104
- package/ai-dev-team/roles/.gitkeep +0 -0
- package/ai-dev-team/roles/analyzer.md +0 -265
- package/ai-dev-team/roles/developer.md +0 -222
- package/ai-dev-team/roles/documenter.md +0 -715
- package/ai-dev-team/roles/improver.md +0 -461
- package/ai-dev-team/roles/manager.md +0 -544
- package/ai-dev-team/roles/planner.md +0 -398
- package/ai-dev-team/roles/reviewer.md +0 -294
- package/ai-dev-team/rules/.gitkeep +0 -0
- package/ai-dev-team/rules/api-change.md +0 -198
- package/ai-dev-team/rules/document-priority.md +0 -199
- package/ai-dev-team/rules/escalation.md +0 -172
- package/ai-dev-team/rules/iteration.md +0 -236
- package/ai-dev-team/rules/rfc.md +0 -31
- package/ai-dev-team/rules/rollback.md +0 -218
- package/bin/cli.js +0 -127
- package/src/commands/config.js +0 -371
- package/src/commands/docs.js +0 -502
- package/src/commands/interactive.js +0 -392
- package/src/commands/logs.js +0 -81
- package/src/commands/monitor.js +0 -236
- package/src/commands/reset.js +0 -66
- package/src/commands/run.js +0 -739
- package/src/commands/sessions.js +0 -646
- package/src/commands/setup.js +0 -149
- package/src/commands/sprint.js +0 -503
- package/src/commands/status.js +0 -109
- package/src/commands/upgrade.js +0 -416
- package/src/commands/validate.js +0 -289
- package/src/commands/validate.test.js +0 -84
- package/src/ui/dashboard.js +0 -518
- package/src/ui/keyHandler.js +0 -147
- package/src/ui/quickActions.js +0 -111
- package/src/utils/config.js +0 -74
- package/src/utils/files.js +0 -201
- package/src/utils/sessionState.js +0 -513
- package/src/utils/sessionState.process.test.js +0 -101
- package/src/utils/sessionState.test.js +0 -183
- package/src/utils/sprintUtils.js +0 -134
- package/src/utils/taskParser.js +0 -134
- package/src/utils/taskParser.test.js +0 -76
package/src/ui/quickActions.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { sessions } from '../commands/sessions.js';
|
|
3
|
-
import { logs } from '../commands/logs.js';
|
|
4
|
-
import { status } from '../commands/status.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Quick Action 정의
|
|
8
|
-
*/
|
|
9
|
-
export const QUICK_ACTIONS = {
|
|
10
|
-
'q': {
|
|
11
|
-
label: '종료',
|
|
12
|
-
description: '대시보드 종료',
|
|
13
|
-
handler: null // 특수 처리
|
|
14
|
-
},
|
|
15
|
-
'h': {
|
|
16
|
-
label: '도움말',
|
|
17
|
-
description: '도움말 표시',
|
|
18
|
-
handler: showHelp
|
|
19
|
-
},
|
|
20
|
-
// 알파벳 키 추가 명령어
|
|
21
|
-
's': {
|
|
22
|
-
label: 'sessions',
|
|
23
|
-
description: '활성 세션 목록',
|
|
24
|
-
handler: runSessions
|
|
25
|
-
},
|
|
26
|
-
'l': {
|
|
27
|
-
label: 'logs',
|
|
28
|
-
description: '최근 세션 로그',
|
|
29
|
-
handler: runLogs
|
|
30
|
-
},
|
|
31
|
-
't': {
|
|
32
|
-
label: 'status',
|
|
33
|
-
description: '프로젝트 상태 확인',
|
|
34
|
-
handler: runStatus
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 세션 목록 표시
|
|
40
|
-
*/
|
|
41
|
-
async function runSessions() {
|
|
42
|
-
console.log('');
|
|
43
|
-
await sessions({});
|
|
44
|
-
console.log('\n계속하려면 아무 키나 누르세요...');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 로그 확인
|
|
49
|
-
*/
|
|
50
|
-
async function runLogs() {
|
|
51
|
-
console.log('');
|
|
52
|
-
await logs();
|
|
53
|
-
console.log('\n계속하려면 아무 키나 누르세요...');
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 프로젝트 상태 확인
|
|
58
|
-
*/
|
|
59
|
-
async function runStatus() {
|
|
60
|
-
console.log('');
|
|
61
|
-
await status();
|
|
62
|
-
console.log('\n계속하려면 아무 키나 누르세요...');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* 도움말 표시
|
|
67
|
-
*/
|
|
68
|
-
async function showHelp() {
|
|
69
|
-
console.log('');
|
|
70
|
-
console.log(chalk.cyan('━'.repeat(60)));
|
|
71
|
-
console.log(chalk.cyan.bold(' ADA UI Mode 도움말'));
|
|
72
|
-
console.log(chalk.cyan('━'.repeat(60)));
|
|
73
|
-
console.log('');
|
|
74
|
-
console.log(chalk.white.bold(' 알파벳 키 (관리/모니터링):'));
|
|
75
|
-
console.log(' s - 활성 세션 목록');
|
|
76
|
-
console.log(' l - 최근 세션 로그');
|
|
77
|
-
console.log(' t - 프로젝트 상태 확인');
|
|
78
|
-
console.log('');
|
|
79
|
-
console.log(chalk.white.bold(' 기타 키:'));
|
|
80
|
-
console.log(' q - UI 모드 종료');
|
|
81
|
-
console.log(' h - 이 도움말 표시');
|
|
82
|
-
console.log('');
|
|
83
|
-
console.log(chalk.gray(' 화면은 2초마다 자동 갱신됩니다.'));
|
|
84
|
-
console.log(chalk.gray(' 에이전트 실행 중에는 UI가 일시 정지됩니다.'));
|
|
85
|
-
console.log('');
|
|
86
|
-
console.log(chalk.cyan('━'.repeat(60)));
|
|
87
|
-
console.log('\n계속하려면 아무 키나 누르세요...');
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Quick Action 실행
|
|
92
|
-
*/
|
|
93
|
-
export async function executeQuickAction(key, state) {
|
|
94
|
-
const action = QUICK_ACTIONS[key];
|
|
95
|
-
if (!action) {
|
|
96
|
-
return { handled: false };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (action.handler === null) {
|
|
100
|
-
// 특수 처리 (refresh, quit)
|
|
101
|
-
return { handled: true, special: key };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
await action.handler(state);
|
|
106
|
-
return { handled: true };
|
|
107
|
-
} catch (error) {
|
|
108
|
-
console.error(chalk.red(`액션 실행 오류: ${error.message}`));
|
|
109
|
-
return { handled: true, error: error.message };
|
|
110
|
-
}
|
|
111
|
-
}
|
package/src/utils/config.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { getWorkspaceDir } from './files.js';
|
|
4
|
-
|
|
5
|
-
const CONFIG_FILENAME = 'ada.config.json';
|
|
6
|
-
|
|
7
|
-
const DEFAULT_CONFIG = {
|
|
8
|
-
version: '1.0',
|
|
9
|
-
defaults: {
|
|
10
|
-
tool: 'claude'
|
|
11
|
-
},
|
|
12
|
-
roles: {
|
|
13
|
-
// 기본값은 모두 claude로 설정하되, 사용자가 변경 가능
|
|
14
|
-
manager: 'claude',
|
|
15
|
-
planner: 'claude',
|
|
16
|
-
architect: 'claude',
|
|
17
|
-
developer: 'claude',
|
|
18
|
-
reviewer: 'claude',
|
|
19
|
-
improver: 'claude',
|
|
20
|
-
documenter: 'claude'
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 설정 파일 경로 반환
|
|
26
|
-
*/
|
|
27
|
-
export function getConfigPath() {
|
|
28
|
-
return path.join(getWorkspaceDir(), CONFIG_FILENAME);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 설정 파일 읽기 (없으면 기본값 생성)
|
|
33
|
-
*/
|
|
34
|
-
export function readConfig() {
|
|
35
|
-
const configPath = getConfigPath();
|
|
36
|
-
|
|
37
|
-
if (!fs.existsSync(configPath)) {
|
|
38
|
-
// 설정 파일이 없으면 기본값 저장 후 반환
|
|
39
|
-
writeConfig(DEFAULT_CONFIG);
|
|
40
|
-
return DEFAULT_CONFIG;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const content = fs.readFileSync(configPath, 'utf-8');
|
|
45
|
-
const config = JSON.parse(content);
|
|
46
|
-
|
|
47
|
-
// 누락된 필드가 있으면 기본값으로 채움
|
|
48
|
-
return {
|
|
49
|
-
...DEFAULT_CONFIG,
|
|
50
|
-
...config,
|
|
51
|
-
defaults: { ...DEFAULT_CONFIG.defaults, ...(config.defaults || {}) },
|
|
52
|
-
roles: { ...DEFAULT_CONFIG.roles, ...(config.roles || {}) }
|
|
53
|
-
};
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.warn(`⚠️ 설정 파일(${CONFIG_FILENAME}) 파싱 실패, 기본값을 사용합니다.`);
|
|
56
|
-
return DEFAULT_CONFIG;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 설정 파일 쓰기
|
|
62
|
-
*/
|
|
63
|
-
export function writeConfig(config) {
|
|
64
|
-
const configPath = getConfigPath();
|
|
65
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* 역할에 대한 권장 도구 반환
|
|
70
|
-
*/
|
|
71
|
-
export function getToolForRole(role) {
|
|
72
|
-
const config = readConfig();
|
|
73
|
-
return config.roles[role] || config.defaults.tool || 'claude';
|
|
74
|
-
}
|
package/src/utils/files.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { createRequire } from 'node:module';
|
|
5
|
-
|
|
6
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
-
const __dirname = path.dirname(__filename);
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 패키지 루트 디렉토리 반환
|
|
12
|
-
*/
|
|
13
|
-
export function getPackageRoot() {
|
|
14
|
-
return path.resolve(__dirname, '../..');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* 작업 디렉토리 (ai-dev-team) 경로 반환
|
|
19
|
-
*/
|
|
20
|
-
export function getWorkspaceDir() {
|
|
21
|
-
return path.join(process.cwd(), 'ai-dev-team');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 세션 디렉토리 경로 반환
|
|
26
|
-
*/
|
|
27
|
-
export function getSessionsDir() {
|
|
28
|
-
return path.join(getWorkspaceDir(), '.sessions');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 로그 디렉토리 경로 반환
|
|
33
|
-
*/
|
|
34
|
-
export function getLogsDir() {
|
|
35
|
-
return path.join(getWorkspaceDir(), '.sessions', 'logs');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 현재 템플릿 파일 경로 반환
|
|
40
|
-
*/
|
|
41
|
-
export function getCurrentTemplateFile() {
|
|
42
|
-
return path.join(getWorkspaceDir(), '.current-template');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* 현재 세팅된 템플릿 반환
|
|
47
|
-
*/
|
|
48
|
-
export function getCurrentTemplate() {
|
|
49
|
-
const templateFile = getCurrentTemplateFile();
|
|
50
|
-
if (fs.existsSync(templateFile)) {
|
|
51
|
-
return fs.readFileSync(templateFile, 'utf-8').trim();
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 세션 ID 생성
|
|
58
|
-
*/
|
|
59
|
-
export function generateSessionId() {
|
|
60
|
-
const now = new Date();
|
|
61
|
-
const date = now.toISOString().slice(0, 10).replace(/-/g, '');
|
|
62
|
-
const time = now.toTimeString().slice(0, 8).replace(/:/g, '');
|
|
63
|
-
const random = Math.random().toString(16).slice(2, 10);
|
|
64
|
-
return `${date}-${time}-${random}`;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 타임스탬프 생성
|
|
69
|
-
*/
|
|
70
|
-
export function getTimestamp() {
|
|
71
|
-
return new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 사용 가능한 템플릿 목록
|
|
76
|
-
*/
|
|
77
|
-
export function getAvailableTemplates() {
|
|
78
|
-
const templatesDir = path.join(getPackageRoot(), 'templates');
|
|
79
|
-
if (!fs.existsSync(templatesDir)) {
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
return fs.readdirSync(templatesDir).filter(f => {
|
|
83
|
-
return fs.statSync(path.join(templatesDir, f)).isDirectory();
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* 사용 가능한 역할 목록
|
|
89
|
-
*/
|
|
90
|
-
export function getAvailableRoles() {
|
|
91
|
-
const workspaceRoles = path.join(getWorkspaceDir(), 'roles');
|
|
92
|
-
if (!fs.existsSync(workspaceRoles)) {
|
|
93
|
-
return [];
|
|
94
|
-
}
|
|
95
|
-
return fs.readdirSync(workspaceRoles)
|
|
96
|
-
.filter(f => f.endsWith('.md'))
|
|
97
|
-
.map(f => f.replace('.md', ''));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* 사용 가능한 도구 목록
|
|
102
|
-
*/
|
|
103
|
-
export function getAvailableTools() {
|
|
104
|
-
return ['claude', 'codex', 'gemini', 'copilot'];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 워크스페이스가 세팅되어 있는지 확인
|
|
109
|
-
*/
|
|
110
|
-
export function isWorkspaceSetup() {
|
|
111
|
-
const workspace = getWorkspaceDir();
|
|
112
|
-
const rolesDir = path.join(workspace, 'roles');
|
|
113
|
-
return fs.existsSync(rolesDir) && fs.readdirSync(rolesDir).filter(f => f.endsWith('.md')).length > 0;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* 디렉토리 복사 (머지)
|
|
118
|
-
*/
|
|
119
|
-
export function copyDirMerge(src, dest) {
|
|
120
|
-
if (!fs.existsSync(src)) return;
|
|
121
|
-
|
|
122
|
-
fs.ensureDirSync(dest);
|
|
123
|
-
const items = fs.readdirSync(src);
|
|
124
|
-
|
|
125
|
-
for (const item of items) {
|
|
126
|
-
const srcPath = path.join(src, item);
|
|
127
|
-
const destPath = path.join(dest, item);
|
|
128
|
-
const stat = fs.statSync(srcPath);
|
|
129
|
-
|
|
130
|
-
if (stat.isDirectory()) {
|
|
131
|
-
copyDirMerge(srcPath, destPath);
|
|
132
|
-
} else {
|
|
133
|
-
fs.copyFileSync(srcPath, destPath);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* 버전 파일 경로 반환
|
|
140
|
-
*/
|
|
141
|
-
export function getVersionFile() {
|
|
142
|
-
return path.join(getWorkspaceDir(), '.ada-version');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* 백업 디렉토리 경로 반환
|
|
147
|
-
*/
|
|
148
|
-
export function getBackupDir() {
|
|
149
|
-
return path.join(getWorkspaceDir(), '.backups');
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* 패키지 버전 반환
|
|
154
|
-
*/
|
|
155
|
-
export function getPackageVersion() {
|
|
156
|
-
const packageJson = require(path.join(getPackageRoot(), 'package.json'));
|
|
157
|
-
return packageJson.version;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* 작업공간 버전 정보 읽기
|
|
162
|
-
*/
|
|
163
|
-
export function readVersion() {
|
|
164
|
-
const versionFile = getVersionFile();
|
|
165
|
-
if (!fs.existsSync(versionFile)) {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
try {
|
|
169
|
-
const content = fs.readFileSync(versionFile, 'utf-8');
|
|
170
|
-
return JSON.parse(content);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* 작업공간 버전 정보 쓰기
|
|
178
|
-
*/
|
|
179
|
-
export function writeVersion(versionInfo) {
|
|
180
|
-
const versionFile = getVersionFile();
|
|
181
|
-
fs.writeFileSync(versionFile, JSON.stringify(versionInfo, null, 2));
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* 버전 비교 (semver 형식)
|
|
186
|
-
* @returns {number} a > b이면 1, a < b이면 -1, 같으면 0
|
|
187
|
-
*/
|
|
188
|
-
export function compareVersions(a, b) {
|
|
189
|
-
const aParts = a.split('.').map(Number);
|
|
190
|
-
const bParts = b.split('.').map(Number);
|
|
191
|
-
|
|
192
|
-
for (let i = 0; i < 3; i++) {
|
|
193
|
-
const aVal = aParts[i] || 0;
|
|
194
|
-
const bVal = bParts[i] || 0;
|
|
195
|
-
|
|
196
|
-
if (aVal > bVal) return 1;
|
|
197
|
-
if (aVal < bVal) return -1;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return 0;
|
|
201
|
-
}
|