@goondan/cli 0.0.3-alpha1

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.
Files changed (124) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.js +148 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/commands/context.d.ts +8 -0
  5. package/dist/commands/context.js +2 -0
  6. package/dist/commands/context.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +12 -0
  8. package/dist/commands/doctor.js +7 -0
  9. package/dist/commands/doctor.js.map +1 -0
  10. package/dist/commands/init.d.ts +12 -0
  11. package/dist/commands/init.js +29 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/instance-interactive.d.ts +19 -0
  14. package/dist/commands/instance-interactive.js +259 -0
  15. package/dist/commands/instance-interactive.js.map +1 -0
  16. package/dist/commands/instance.d.ts +30 -0
  17. package/dist/commands/instance.js +36 -0
  18. package/dist/commands/instance.js.map +1 -0
  19. package/dist/commands/logs.d.ts +12 -0
  20. package/dist/commands/logs.js +23 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/package.d.ts +30 -0
  23. package/dist/commands/package.js +51 -0
  24. package/dist/commands/package.js.map +1 -0
  25. package/dist/commands/restart.d.ts +12 -0
  26. package/dist/commands/restart.js +14 -0
  27. package/dist/commands/restart.js.map +1 -0
  28. package/dist/commands/run.d.ts +12 -0
  29. package/dist/commands/run.js +33 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/validate.d.ts +12 -0
  32. package/dist/commands/validate.js +22 -0
  33. package/dist/commands/validate.js.map +1 -0
  34. package/dist/constants.d.ts +2 -0
  35. package/dist/constants.js +3 -0
  36. package/dist/constants.js.map +1 -0
  37. package/dist/errors.d.ts +22 -0
  38. package/dist/errors.js +93 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/formatter.d.ts +7 -0
  41. package/dist/formatter.js +141 -0
  42. package/dist/formatter.js.map +1 -0
  43. package/dist/help.d.ts +1 -0
  44. package/dist/help.js +25 -0
  45. package/dist/help.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.js +9 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/options.d.ts +13 -0
  50. package/dist/options.js +57 -0
  51. package/dist/options.js.map +1 -0
  52. package/dist/parser.d.ts +85 -0
  53. package/dist/parser.js +123 -0
  54. package/dist/parser.js.map +1 -0
  55. package/dist/router.d.ts +2 -0
  56. package/dist/router.js +130 -0
  57. package/dist/router.js.map +1 -0
  58. package/dist/services/config.d.ts +13 -0
  59. package/dist/services/config.js +141 -0
  60. package/dist/services/config.js.map +1 -0
  61. package/dist/services/conversation-state.d.ts +20 -0
  62. package/dist/services/conversation-state.js +198 -0
  63. package/dist/services/conversation-state.js.map +1 -0
  64. package/dist/services/defaults.d.ts +2 -0
  65. package/dist/services/defaults.js +92 -0
  66. package/dist/services/defaults.js.map +1 -0
  67. package/dist/services/doctor.d.ts +8 -0
  68. package/dist/services/doctor.js +160 -0
  69. package/dist/services/doctor.js.map +1 -0
  70. package/dist/services/env.d.ts +6 -0
  71. package/dist/services/env.js +76 -0
  72. package/dist/services/env.js.map +1 -0
  73. package/dist/services/init.d.ts +4 -0
  74. package/dist/services/init.js +174 -0
  75. package/dist/services/init.js.map +1 -0
  76. package/dist/services/instances.d.ts +7 -0
  77. package/dist/services/instances.js +393 -0
  78. package/dist/services/instances.js.map +1 -0
  79. package/dist/services/logs.d.ts +6 -0
  80. package/dist/services/logs.js +131 -0
  81. package/dist/services/logs.js.map +1 -0
  82. package/dist/services/package.d.ts +11 -0
  83. package/dist/services/package.js +630 -0
  84. package/dist/services/package.js.map +1 -0
  85. package/dist/services/path.d.ts +5 -0
  86. package/dist/services/path.js +25 -0
  87. package/dist/services/path.js.map +1 -0
  88. package/dist/services/registry.d.ts +12 -0
  89. package/dist/services/registry.js +219 -0
  90. package/dist/services/registry.js.map +1 -0
  91. package/dist/services/runtime-restart-signal.d.ts +5 -0
  92. package/dist/services/runtime-restart-signal.js +18 -0
  93. package/dist/services/runtime-restart-signal.js.map +1 -0
  94. package/dist/services/runtime-restart.d.ts +11 -0
  95. package/dist/services/runtime-restart.js +151 -0
  96. package/dist/services/runtime-restart.js.map +1 -0
  97. package/dist/services/runtime-routing.d.ts +40 -0
  98. package/dist/services/runtime-routing.js +154 -0
  99. package/dist/services/runtime-routing.js.map +1 -0
  100. package/dist/services/runtime-runner-connector-child.d.ts +1 -0
  101. package/dist/services/runtime-runner-connector-child.js +188 -0
  102. package/dist/services/runtime-runner-connector-child.js.map +1 -0
  103. package/dist/services/runtime-runner-protocol.d.ts +12 -0
  104. package/dist/services/runtime-runner-protocol.js +14 -0
  105. package/dist/services/runtime-runner-protocol.js.map +1 -0
  106. package/dist/services/runtime-runner.d.ts +1 -0
  107. package/dist/services/runtime-runner.js +2595 -0
  108. package/dist/services/runtime-runner.js.map +1 -0
  109. package/dist/services/runtime.d.ts +10 -0
  110. package/dist/services/runtime.js +569 -0
  111. package/dist/services/runtime.js.map +1 -0
  112. package/dist/services/turn-policy.d.ts +7 -0
  113. package/dist/services/turn-policy.js +13 -0
  114. package/dist/services/turn-policy.js.map +1 -0
  115. package/dist/services/validator.d.ts +6 -0
  116. package/dist/services/validator.js +126 -0
  117. package/dist/services/validator.js.map +1 -0
  118. package/dist/types.d.ts +243 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/utils.d.ts +7 -0
  122. package/dist/utils.js +72 -0
  123. package/dist/utils.js.map +1 -0
  124. package/package.json +30 -0
@@ -0,0 +1,198 @@
1
+ import { isJsonObject } from '@goondan/runtime';
2
+ export function trimConversation(turns, maxTurns) {
3
+ const limit = Math.max(1, maxTurns) * 2;
4
+ if (turns.length <= limit) {
5
+ return turns;
6
+ }
7
+ return turns.slice(turns.length - limit);
8
+ }
9
+ export function toConversationTurns(messages) {
10
+ const turns = [];
11
+ for (const message of messages) {
12
+ const role = message.data.role;
13
+ if (role !== 'user' && role !== 'assistant') {
14
+ continue;
15
+ }
16
+ turns.push({
17
+ role,
18
+ content: message.data.content,
19
+ });
20
+ }
21
+ return turns;
22
+ }
23
+ export function toPersistentMessages(turns) {
24
+ const messages = [];
25
+ for (let index = 0; index < turns.length; index += 1) {
26
+ const turn = turns[index];
27
+ if (!turn) {
28
+ continue;
29
+ }
30
+ if (turn.role === 'assistant') {
31
+ messages.push({
32
+ id: `persist-${index}`,
33
+ data: {
34
+ role: 'assistant',
35
+ content: turn.content,
36
+ },
37
+ metadata: {},
38
+ createdAt: new Date(),
39
+ source: {
40
+ type: 'assistant',
41
+ stepId: `persist-step-${index}`,
42
+ },
43
+ });
44
+ continue;
45
+ }
46
+ messages.push({
47
+ id: `persist-${index}`,
48
+ data: {
49
+ role: 'user',
50
+ content: turn.content,
51
+ },
52
+ metadata: {},
53
+ createdAt: new Date(),
54
+ source: {
55
+ type: 'user',
56
+ },
57
+ });
58
+ }
59
+ return messages;
60
+ }
61
+ export function toAnthropicMessages(turns) {
62
+ return turns.map((turn) => ({
63
+ role: turn.role,
64
+ content: turn.content,
65
+ }));
66
+ }
67
+ export function toConversationTurnsFromAnthropicMessages(messages) {
68
+ const turns = [];
69
+ for (const message of messages) {
70
+ if (!isJsonObject(message)) {
71
+ continue;
72
+ }
73
+ const role = message.role;
74
+ if (role !== 'user' && role !== 'assistant') {
75
+ continue;
76
+ }
77
+ if (!Object.hasOwn(message, 'content')) {
78
+ continue;
79
+ }
80
+ turns.push({
81
+ role,
82
+ content: message.content,
83
+ });
84
+ }
85
+ return turns;
86
+ }
87
+ function safeStringify(value) {
88
+ try {
89
+ return JSON.stringify(value);
90
+ }
91
+ catch {
92
+ return String(value);
93
+ }
94
+ }
95
+ function toSystemText(content) {
96
+ if (typeof content === 'string') {
97
+ return content;
98
+ }
99
+ if (Array.isArray(content)) {
100
+ const lines = [];
101
+ for (const item of content) {
102
+ if (isJsonObject(item) && item.type === 'text' && typeof item.text === 'string') {
103
+ lines.push(item.text);
104
+ continue;
105
+ }
106
+ lines.push(safeStringify(item));
107
+ }
108
+ return lines.join('\n');
109
+ }
110
+ if (isJsonObject(content) && content.type === 'text' && typeof content.text === 'string') {
111
+ return content.text;
112
+ }
113
+ return safeStringify(content);
114
+ }
115
+ function extractToolUseIds(content) {
116
+ const ids = new Set();
117
+ if (!Array.isArray(content)) {
118
+ return ids;
119
+ }
120
+ for (const block of content) {
121
+ if (!isJsonObject(block) || block.type !== 'tool_use') {
122
+ continue;
123
+ }
124
+ const id = block.id;
125
+ if (typeof id === 'string' && id.trim().length > 0) {
126
+ ids.add(id);
127
+ }
128
+ }
129
+ return ids;
130
+ }
131
+ function sanitizeUserContent(content, allowedToolUseIds) {
132
+ if (!Array.isArray(content)) {
133
+ return {
134
+ content,
135
+ hasContent: true,
136
+ hadToolResult: false,
137
+ };
138
+ }
139
+ const sanitized = [];
140
+ let hadToolResult = false;
141
+ for (const block of content) {
142
+ if (!isJsonObject(block) || block.type !== 'tool_result') {
143
+ sanitized.push(block);
144
+ continue;
145
+ }
146
+ hadToolResult = true;
147
+ const toolUseId = block.tool_use_id;
148
+ if (typeof toolUseId !== 'string') {
149
+ continue;
150
+ }
151
+ if (allowedToolUseIds.has(toolUseId)) {
152
+ sanitized.push(block);
153
+ }
154
+ }
155
+ return {
156
+ content: sanitized,
157
+ hasContent: sanitized.length > 0,
158
+ hadToolResult,
159
+ };
160
+ }
161
+ export function prepareAnthropicConversation(messages) {
162
+ const anthropicMessages = [];
163
+ const systemParts = [];
164
+ let previousAssistantToolUseIds;
165
+ for (const message of messages) {
166
+ if (message.role === 'assistant') {
167
+ anthropicMessages.push({
168
+ role: 'assistant',
169
+ content: message.content,
170
+ });
171
+ previousAssistantToolUseIds = extractToolUseIds(message.content);
172
+ continue;
173
+ }
174
+ if (message.role === 'user') {
175
+ const sanitized = sanitizeUserContent(message.content, previousAssistantToolUseIds ?? new Set());
176
+ previousAssistantToolUseIds = undefined;
177
+ if (sanitized.hadToolResult && !sanitized.hasContent) {
178
+ continue;
179
+ }
180
+ anthropicMessages.push({
181
+ role: 'user',
182
+ content: sanitized.content,
183
+ });
184
+ continue;
185
+ }
186
+ if (message.role === 'system') {
187
+ const text = toSystemText(message.content).trim();
188
+ if (text.length > 0) {
189
+ systemParts.push(text);
190
+ }
191
+ }
192
+ }
193
+ return {
194
+ messages: anthropicMessages,
195
+ systemAddendum: systemParts.join('\n\n'),
196
+ };
197
+ }
198
+ //# sourceMappingURL=conversation-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-state.js","sourceRoot":"","sources":["../../src/services/conversation-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CliDependencies } from '../types.js';
2
+ export declare function createDefaultDependencies(): CliDependencies;
@@ -0,0 +1,92 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { isObjectRecord } from '../utils.js';
4
+ import { DefaultDoctorService } from './doctor.js';
5
+ import { DefaultInitService } from './init.js';
6
+ import { FileInstanceStore } from './instances.js';
7
+ import { FileLogService } from './logs.js';
8
+ import { DefaultPackageService } from './package.js';
9
+ import { HttpRegistryClient } from './registry.js';
10
+ import { LocalRuntimeController } from './runtime.js';
11
+ import { DefaultBundleValidator } from './validator.js';
12
+ async function readCliVersion(cwd) {
13
+ const localPackageJson = path.join(cwd, 'package.json');
14
+ try {
15
+ const raw = await readFile(localPackageJson, 'utf8');
16
+ const parsed = JSON.parse(raw);
17
+ if (isObjectRecord(parsed)) {
18
+ const version = parsed['version'];
19
+ if (typeof version === 'string') {
20
+ return version;
21
+ }
22
+ }
23
+ }
24
+ catch {
25
+ return '0.0.0';
26
+ }
27
+ return '0.0.0';
28
+ }
29
+ export function createDefaultDependencies() {
30
+ const cwd = process.cwd();
31
+ const env = process.env;
32
+ const validator = new DefaultBundleValidator(cwd);
33
+ const registry = new HttpRegistryClient();
34
+ const io = {
35
+ out(message) {
36
+ process.stdout.write(`${message}\n`);
37
+ },
38
+ err(message) {
39
+ process.stderr.write(`${message}\n`);
40
+ },
41
+ };
42
+ const terminal = {
43
+ stdinIsTTY: !!process.stdin.isTTY,
44
+ stdoutIsTTY: !!process.stdout.isTTY,
45
+ columns: process.stdout.columns ?? 80,
46
+ setRawMode(enable) {
47
+ if (process.stdin.setRawMode) {
48
+ process.stdin.setRawMode(enable);
49
+ }
50
+ },
51
+ onData(cb) {
52
+ process.stdin.on('data', cb);
53
+ },
54
+ offData(cb) {
55
+ process.stdin.removeListener('data', cb);
56
+ },
57
+ resume() {
58
+ process.stdin.resume();
59
+ },
60
+ pause() {
61
+ process.stdin.pause();
62
+ },
63
+ write(data) {
64
+ process.stdout.write(data);
65
+ },
66
+ };
67
+ const runtime = new LocalRuntimeController(cwd, env);
68
+ const instances = new FileInstanceStore(env);
69
+ const logs = new FileLogService(env);
70
+ const packages = new DefaultPackageService(cwd, env, registry, validator);
71
+ const doctor = new DefaultDoctorService(cwd, env, validator);
72
+ const init = new DefaultInitService();
73
+ const deps = {
74
+ io,
75
+ terminal,
76
+ env,
77
+ cwd,
78
+ version: '0.0.0',
79
+ runtime,
80
+ validator,
81
+ instances,
82
+ packages,
83
+ doctor,
84
+ logs,
85
+ init,
86
+ };
87
+ void readCliVersion(cwd).then((version) => {
88
+ deps.version = version;
89
+ });
90
+ return deps;
91
+ }
92
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/services/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BundleValidator, DoctorReport, DoctorService } from '../types.js';
2
+ export declare class DefaultDoctorService implements DoctorService {
3
+ private readonly cwd;
4
+ private readonly env;
5
+ private readonly validator;
6
+ constructor(cwd: string, env: NodeJS.ProcessEnv, validator: BundleValidator);
7
+ run(bundlePath: string, _fix: boolean, stateRootInput?: string): Promise<DoctorReport>;
8
+ }
@@ -0,0 +1,160 @@
1
+ import path from 'node:path';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { exists, isObjectRecord } from '../utils.js';
5
+ import { resolveStateRoot } from './config.js';
6
+ import { resolveManifestPath } from './path.js';
7
+ function commandExists(command) {
8
+ const result = spawnSync(command, ['--version'], {
9
+ stdio: 'pipe',
10
+ encoding: 'utf8',
11
+ });
12
+ return result.status === 0;
13
+ }
14
+ async function readPackageVersion(packageJsonPath) {
15
+ const found = await exists(packageJsonPath);
16
+ if (!found) {
17
+ return undefined;
18
+ }
19
+ const raw = await readFile(packageJsonPath, 'utf8');
20
+ try {
21
+ const parsed = JSON.parse(raw);
22
+ if (!isObjectRecord(parsed)) {
23
+ return undefined;
24
+ }
25
+ const version = parsed['version'];
26
+ if (typeof version === 'string') {
27
+ return version;
28
+ }
29
+ return undefined;
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }
35
+ export class DefaultDoctorService {
36
+ cwd;
37
+ env;
38
+ validator;
39
+ constructor(cwd, env, validator) {
40
+ this.cwd = cwd;
41
+ this.env = env;
42
+ this.validator = validator;
43
+ }
44
+ async run(bundlePath, _fix, stateRootInput) {
45
+ const checks = [];
46
+ if (commandExists('bun')) {
47
+ checks.push({
48
+ category: 'System',
49
+ name: 'Bun',
50
+ level: 'ok',
51
+ detail: 'bun is installed',
52
+ });
53
+ }
54
+ else {
55
+ checks.push({
56
+ category: 'System',
57
+ name: 'Bun',
58
+ level: 'fail',
59
+ detail: 'bun is not installed',
60
+ suggestion: 'https://bun.sh 에서 설치하세요.',
61
+ });
62
+ }
63
+ checks.push({
64
+ category: 'System',
65
+ name: 'pnpm',
66
+ level: commandExists('pnpm') ? 'ok' : 'warn',
67
+ detail: commandExists('pnpm') ? 'pnpm is installed' : 'pnpm not found',
68
+ suggestion: commandExists('pnpm') ? undefined : 'pnpm 사용 시 설치가 필요합니다.',
69
+ });
70
+ const keyMap = [
71
+ 'ANTHROPIC_API_KEY',
72
+ 'OPENAI_API_KEY',
73
+ 'GOOGLE_GENERATIVE_AI_API_KEY',
74
+ ];
75
+ for (const key of keyMap) {
76
+ const value = this.env[key];
77
+ if (value && value.length > 0) {
78
+ checks.push({
79
+ category: 'API Keys',
80
+ name: key,
81
+ level: 'ok',
82
+ detail: `${key} is set`,
83
+ });
84
+ }
85
+ else {
86
+ checks.push({
87
+ category: 'API Keys',
88
+ name: key,
89
+ level: 'warn',
90
+ detail: `${key} is not set`,
91
+ suggestion: `필요 시 export ${key}=... 로 설정하세요.`,
92
+ });
93
+ }
94
+ }
95
+ const cliVersion = await readPackageVersion(path.join(this.cwd, 'package.json'));
96
+ checks.push({
97
+ category: 'Goondan Packages',
98
+ name: '@goondan/cli',
99
+ level: cliVersion ? 'ok' : 'warn',
100
+ detail: cliVersion ? `@goondan/cli@${cliVersion}` : 'version unknown',
101
+ });
102
+ const stateRoot = resolveStateRoot(stateRootInput, this.env);
103
+ checks.push({
104
+ category: 'Project',
105
+ name: 'State Root',
106
+ level: 'ok',
107
+ detail: stateRoot,
108
+ });
109
+ const manifestPath = resolveManifestPath(this.cwd, bundlePath);
110
+ const hasManifest = await exists(manifestPath);
111
+ if (!hasManifest) {
112
+ checks.push({
113
+ category: 'Project',
114
+ name: 'Bundle Config',
115
+ level: 'warn',
116
+ detail: `missing: ${manifestPath}`,
117
+ suggestion: 'goondan.yaml 파일을 생성하거나 --config 경로를 지정하세요.',
118
+ });
119
+ }
120
+ else {
121
+ checks.push({
122
+ category: 'Project',
123
+ name: 'Bundle Config',
124
+ level: 'ok',
125
+ detail: `found: ${manifestPath}`,
126
+ });
127
+ const validation = await this.validator.validate(manifestPath, false, false);
128
+ checks.push({
129
+ category: 'Project',
130
+ name: 'Bundle Validation',
131
+ level: validation.valid ? 'ok' : 'fail',
132
+ detail: validation.valid
133
+ ? `valid (${validation.warnings.length} warnings)`
134
+ : `invalid (${validation.errors.length} errors, ${validation.warnings.length} warnings)`,
135
+ suggestion: validation.valid ? undefined : 'gdn validate --format json 으로 상세 오류를 확인하세요.',
136
+ });
137
+ }
138
+ let passed = 0;
139
+ let warnings = 0;
140
+ let errors = 0;
141
+ for (const check of checks) {
142
+ if (check.level === 'ok') {
143
+ passed += 1;
144
+ }
145
+ else if (check.level === 'warn') {
146
+ warnings += 1;
147
+ }
148
+ else {
149
+ errors += 1;
150
+ }
151
+ }
152
+ return {
153
+ checks,
154
+ passed,
155
+ warnings,
156
+ errors,
157
+ };
158
+ }
159
+ }
160
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/services/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface LoadRuntimeEnvInput {
2
+ projectRoot: string;
3
+ envFile?: string;
4
+ }
5
+ export declare function loadRuntimeEnv(baseEnv: NodeJS.ProcessEnv, input: LoadRuntimeEnvInput): Promise<NodeJS.ProcessEnv>;
6
+ export {};
@@ -0,0 +1,76 @@
1
+ import path from 'node:path';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { parseEnv } from 'node:util';
4
+ import { configError } from '../errors.js';
5
+ import { exists } from '../utils.js';
6
+ function resolveEnvFilePath(projectRoot, inputPath) {
7
+ if (path.isAbsolute(inputPath)) {
8
+ return inputPath;
9
+ }
10
+ return path.resolve(projectRoot, inputPath);
11
+ }
12
+ function buildEnvFileQueue(projectRoot, envFile) {
13
+ const queue = [];
14
+ if (envFile && envFile.trim().length > 0) {
15
+ queue.push({
16
+ filePath: resolveEnvFilePath(projectRoot, envFile.trim()),
17
+ required: true,
18
+ });
19
+ }
20
+ queue.push({
21
+ filePath: path.join(projectRoot, '.env.local'),
22
+ required: false,
23
+ }, {
24
+ filePath: path.join(projectRoot, '.env'),
25
+ required: false,
26
+ });
27
+ const deduped = new Set();
28
+ const uniqueQueue = [];
29
+ for (const item of queue) {
30
+ if (deduped.has(item.filePath)) {
31
+ continue;
32
+ }
33
+ deduped.add(item.filePath);
34
+ uniqueQueue.push(item);
35
+ }
36
+ return uniqueQueue;
37
+ }
38
+ function mergeDotEnvValues(target, parsed) {
39
+ for (const [key, value] of Object.entries(parsed)) {
40
+ if (target[key] !== undefined || value === undefined) {
41
+ continue;
42
+ }
43
+ target[key] = value;
44
+ }
45
+ }
46
+ export async function loadRuntimeEnv(baseEnv, input) {
47
+ const mergedEnv = { ...baseEnv };
48
+ const envFiles = buildEnvFileQueue(input.projectRoot, input.envFile);
49
+ for (const envFile of envFiles) {
50
+ const fileExists = await exists(envFile.filePath);
51
+ if (!fileExists) {
52
+ if (envFile.required) {
53
+ throw configError(`--env-file로 지정한 파일을 찾을 수 없습니다: ${envFile.filePath}`, '파일 경로를 확인하세요.');
54
+ }
55
+ continue;
56
+ }
57
+ let rawContent;
58
+ try {
59
+ rawContent = await readFile(envFile.filePath, 'utf8');
60
+ }
61
+ catch {
62
+ throw configError(`환경 변수 파일을 읽지 못했습니다: ${envFile.filePath}`, '파일 접근 권한과 경로를 확인하세요.');
63
+ }
64
+ let parsed;
65
+ try {
66
+ parsed = parseEnv(rawContent);
67
+ }
68
+ catch (error) {
69
+ const reason = error instanceof Error ? error.message : '알 수 없는 오류';
70
+ throw configError(`환경 변수 파일 파싱 실패: ${envFile.filePath} (${reason})`, 'KEY=VALUE 형식인지 확인하세요.');
71
+ }
72
+ mergeDotEnvValues(mergedEnv, parsed);
73
+ }
74
+ return mergedEnv;
75
+ }
76
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/services/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { InitRequest, InitResult, InitService } from '../types.js';
2
+ export declare class DefaultInitService implements InitService {
3
+ init(request: InitRequest): Promise<InitResult>;
4
+ }