@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.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +148 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.js +2 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +12 -0
- package/dist/commands/doctor.js +7 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.js +29 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/instance-interactive.d.ts +19 -0
- package/dist/commands/instance-interactive.js +259 -0
- package/dist/commands/instance-interactive.js.map +1 -0
- package/dist/commands/instance.d.ts +30 -0
- package/dist/commands/instance.js +36 -0
- package/dist/commands/instance.js.map +1 -0
- package/dist/commands/logs.d.ts +12 -0
- package/dist/commands/logs.js +23 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/package.d.ts +30 -0
- package/dist/commands/package.js +51 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/restart.d.ts +12 -0
- package/dist/commands/restart.js +14 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/run.d.ts +12 -0
- package/dist/commands/run.js +33 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/validate.d.ts +12 -0
- package/dist/commands/validate.js +22 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +93 -0
- package/dist/errors.js.map +1 -0
- package/dist/formatter.d.ts +7 -0
- package/dist/formatter.js +141 -0
- package/dist/formatter.js.map +1 -0
- package/dist/help.d.ts +1 -0
- package/dist/help.js +25 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +13 -0
- package/dist/options.js +57 -0
- package/dist/options.js.map +1 -0
- package/dist/parser.d.ts +85 -0
- package/dist/parser.js +123 -0
- package/dist/parser.js.map +1 -0
- package/dist/router.d.ts +2 -0
- package/dist/router.js +130 -0
- package/dist/router.js.map +1 -0
- package/dist/services/config.d.ts +13 -0
- package/dist/services/config.js +141 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/conversation-state.d.ts +20 -0
- package/dist/services/conversation-state.js +198 -0
- package/dist/services/conversation-state.js.map +1 -0
- package/dist/services/defaults.d.ts +2 -0
- package/dist/services/defaults.js +92 -0
- package/dist/services/defaults.js.map +1 -0
- package/dist/services/doctor.d.ts +8 -0
- package/dist/services/doctor.js +160 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/env.d.ts +6 -0
- package/dist/services/env.js +76 -0
- package/dist/services/env.js.map +1 -0
- package/dist/services/init.d.ts +4 -0
- package/dist/services/init.js +174 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/instances.d.ts +7 -0
- package/dist/services/instances.js +393 -0
- package/dist/services/instances.js.map +1 -0
- package/dist/services/logs.d.ts +6 -0
- package/dist/services/logs.js +131 -0
- package/dist/services/logs.js.map +1 -0
- package/dist/services/package.d.ts +11 -0
- package/dist/services/package.js +630 -0
- package/dist/services/package.js.map +1 -0
- package/dist/services/path.d.ts +5 -0
- package/dist/services/path.js +25 -0
- package/dist/services/path.js.map +1 -0
- package/dist/services/registry.d.ts +12 -0
- package/dist/services/registry.js +219 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/runtime-restart-signal.d.ts +5 -0
- package/dist/services/runtime-restart-signal.js +18 -0
- package/dist/services/runtime-restart-signal.js.map +1 -0
- package/dist/services/runtime-restart.d.ts +11 -0
- package/dist/services/runtime-restart.js +151 -0
- package/dist/services/runtime-restart.js.map +1 -0
- package/dist/services/runtime-routing.d.ts +40 -0
- package/dist/services/runtime-routing.js +154 -0
- package/dist/services/runtime-routing.js.map +1 -0
- package/dist/services/runtime-runner-connector-child.d.ts +1 -0
- package/dist/services/runtime-runner-connector-child.js +188 -0
- package/dist/services/runtime-runner-connector-child.js.map +1 -0
- package/dist/services/runtime-runner-protocol.d.ts +12 -0
- package/dist/services/runtime-runner-protocol.js +14 -0
- package/dist/services/runtime-runner-protocol.js.map +1 -0
- package/dist/services/runtime-runner.d.ts +1 -0
- package/dist/services/runtime-runner.js +2595 -0
- package/dist/services/runtime-runner.js.map +1 -0
- package/dist/services/runtime.d.ts +10 -0
- package/dist/services/runtime.js +569 -0
- package/dist/services/runtime.js.map +1 -0
- package/dist/services/turn-policy.d.ts +7 -0
- package/dist/services/turn-policy.js +13 -0
- package/dist/services/turn-policy.js.map +1 -0
- package/dist/services/validator.d.ts +6 -0
- package/dist/services/validator.js +126 -0
- package/dist/services/validator.js.map +1 -0
- package/dist/types.d.ts +243 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +72 -0
- package/dist/utils.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { configError, networkError, validateError } from '../errors.js';
|
|
7
|
+
import { exists, splitYamlDocuments, trimQuotes } from '../utils.js';
|
|
8
|
+
import { readCliConfig, resolveRegistryToken, resolveRegistryUrl, resolveStateRoot } from './config.js';
|
|
9
|
+
import { packagePathParts, resolveManifestPath } from './path.js';
|
|
10
|
+
import { parsePackageRef } from './registry.js';
|
|
11
|
+
function quoteYaml(value) {
|
|
12
|
+
return `"${value.replaceAll('"', '\\"')}"`;
|
|
13
|
+
}
|
|
14
|
+
function buildDefaultPackageDocument(packageName) {
|
|
15
|
+
return [
|
|
16
|
+
'apiVersion: goondan.ai/v1',
|
|
17
|
+
'kind: Package',
|
|
18
|
+
'metadata:',
|
|
19
|
+
` name: ${quoteYaml(packageName)}`,
|
|
20
|
+
'spec:',
|
|
21
|
+
' version: "0.1.0"',
|
|
22
|
+
].join('\n');
|
|
23
|
+
}
|
|
24
|
+
function normalizeNewline(content) {
|
|
25
|
+
return content.replace(/\r\n/g, '\n');
|
|
26
|
+
}
|
|
27
|
+
function lineIsTopLevel(line) {
|
|
28
|
+
return line.length > 0 && !line.startsWith(' ');
|
|
29
|
+
}
|
|
30
|
+
function isPackageDoc(doc) {
|
|
31
|
+
return /^kind:\s*Package\s*$/m.test(doc);
|
|
32
|
+
}
|
|
33
|
+
function updateDependenciesInPackageDoc(doc, entry) {
|
|
34
|
+
const lines = doc.split('\n');
|
|
35
|
+
const specIndex = lines.findIndex((line) => line.trim() === 'spec:');
|
|
36
|
+
if (specIndex < 0) {
|
|
37
|
+
lines.push('spec:');
|
|
38
|
+
}
|
|
39
|
+
const realSpecIndex = lines.findIndex((line) => line.trim() === 'spec:');
|
|
40
|
+
if (realSpecIndex < 0) {
|
|
41
|
+
return { doc: lines.join('\n'), added: false };
|
|
42
|
+
}
|
|
43
|
+
let specEnd = lines.length;
|
|
44
|
+
for (let i = realSpecIndex + 1; i < lines.length; i += 1) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
if (typeof line === 'string' && lineIsTopLevel(line)) {
|
|
47
|
+
specEnd = i;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
let dependenciesIndex = -1;
|
|
52
|
+
for (let i = realSpecIndex + 1; i < specEnd; i += 1) {
|
|
53
|
+
const line = lines[i];
|
|
54
|
+
if (typeof line === 'string' && line.trim() === 'dependencies:') {
|
|
55
|
+
dependenciesIndex = i;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const nameLine = ` - name: ${quoteYaml(entry.name)}`;
|
|
60
|
+
const versionLine = ` version: ${quoteYaml(entry.version)}`;
|
|
61
|
+
if (dependenciesIndex < 0) {
|
|
62
|
+
lines.splice(specEnd, 0, ' dependencies:', nameLine, versionLine);
|
|
63
|
+
return {
|
|
64
|
+
doc: lines.join('\n'),
|
|
65
|
+
added: true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
let depBlockEnd = dependenciesIndex + 1;
|
|
69
|
+
while (depBlockEnd < specEnd) {
|
|
70
|
+
const line = lines[depBlockEnd];
|
|
71
|
+
if (typeof line === 'string' && (line.startsWith(' ') || line.trim() === '')) {
|
|
72
|
+
depBlockEnd += 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
for (let i = dependenciesIndex + 1; i < depBlockEnd; i += 1) {
|
|
78
|
+
const line = lines[i];
|
|
79
|
+
if (typeof line !== 'string') {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const trimmed = line.trim();
|
|
83
|
+
if (trimmed.startsWith('- name:')) {
|
|
84
|
+
const candidate = trimQuotes(trimmed.slice('- name:'.length).trim());
|
|
85
|
+
if (candidate === entry.name) {
|
|
86
|
+
return {
|
|
87
|
+
doc: lines.join('\n'),
|
|
88
|
+
added: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
lines.splice(depBlockEnd, 0, nameLine, versionLine);
|
|
94
|
+
return {
|
|
95
|
+
doc: lines.join('\n'),
|
|
96
|
+
added: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function parsePackageManifest(packageDoc) {
|
|
100
|
+
const lines = packageDoc.split('\n');
|
|
101
|
+
let packageName;
|
|
102
|
+
let packageVersion;
|
|
103
|
+
const dependencies = [];
|
|
104
|
+
let inMetadata = false;
|
|
105
|
+
let inSpec = false;
|
|
106
|
+
let inDependencies = false;
|
|
107
|
+
let currentName;
|
|
108
|
+
let currentVersion;
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
if (line.trim() === 'metadata:') {
|
|
111
|
+
inMetadata = true;
|
|
112
|
+
inSpec = false;
|
|
113
|
+
inDependencies = false;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (line.trim() === 'spec:') {
|
|
117
|
+
inMetadata = false;
|
|
118
|
+
inSpec = true;
|
|
119
|
+
inDependencies = false;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (lineIsTopLevel(line)) {
|
|
123
|
+
inMetadata = false;
|
|
124
|
+
inSpec = false;
|
|
125
|
+
inDependencies = false;
|
|
126
|
+
}
|
|
127
|
+
const trimmed = line.trim();
|
|
128
|
+
if (inMetadata && trimmed.startsWith('name:')) {
|
|
129
|
+
packageName = trimQuotes(trimmed.slice('name:'.length).trim());
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (inSpec && !inDependencies && trimmed.startsWith('version:')) {
|
|
133
|
+
packageVersion = trimQuotes(trimmed.slice('version:'.length).trim());
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (inSpec && trimmed === 'dependencies:') {
|
|
137
|
+
inDependencies = true;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (inDependencies) {
|
|
141
|
+
if (!line.startsWith(' ') && trimmed.length > 0) {
|
|
142
|
+
inDependencies = false;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (trimmed.startsWith('- name:')) {
|
|
146
|
+
if (currentName && currentVersion) {
|
|
147
|
+
dependencies.push({ name: currentName, version: currentVersion });
|
|
148
|
+
}
|
|
149
|
+
currentName = trimQuotes(trimmed.slice('- name:'.length).trim());
|
|
150
|
+
currentVersion = undefined;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (trimmed.startsWith('version:')) {
|
|
154
|
+
currentVersion = trimQuotes(trimmed.slice('version:'.length).trim());
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (currentName && currentVersion) {
|
|
160
|
+
dependencies.push({ name: currentName, version: currentVersion });
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
packageName,
|
|
164
|
+
packageVersion,
|
|
165
|
+
dependencies,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function chooseDependencyVersion(requested, resolved, exact) {
|
|
169
|
+
if (requested && requested.length > 0) {
|
|
170
|
+
return requested;
|
|
171
|
+
}
|
|
172
|
+
if (exact) {
|
|
173
|
+
return resolved;
|
|
174
|
+
}
|
|
175
|
+
return `^${resolved}`;
|
|
176
|
+
}
|
|
177
|
+
function serializeYamlDocuments(documents) {
|
|
178
|
+
if (documents.length === 0) {
|
|
179
|
+
return '';
|
|
180
|
+
}
|
|
181
|
+
return `${documents.join('\n---\n').replace(/\n+$/g, '')}\n`;
|
|
182
|
+
}
|
|
183
|
+
function defaultPackageNameFromManifestPath(manifestPath) {
|
|
184
|
+
const dirName = path.basename(path.dirname(manifestPath));
|
|
185
|
+
const normalized = dirName
|
|
186
|
+
.toLowerCase()
|
|
187
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
188
|
+
.replace(/-+/g, '-')
|
|
189
|
+
.replace(/^-|-$/g, '');
|
|
190
|
+
if (normalized.length === 0) {
|
|
191
|
+
return 'goondan-package';
|
|
192
|
+
}
|
|
193
|
+
return normalized;
|
|
194
|
+
}
|
|
195
|
+
function dependencyEntriesToRecord(entries) {
|
|
196
|
+
const dependencies = {};
|
|
197
|
+
for (const entry of entries) {
|
|
198
|
+
dependencies[entry.name] = entry.version;
|
|
199
|
+
}
|
|
200
|
+
return dependencies;
|
|
201
|
+
}
|
|
202
|
+
function toTarballFileName(packageName, version) {
|
|
203
|
+
const parts = packagePathParts(packageName);
|
|
204
|
+
return `${parts.name}-${version}.tgz`;
|
|
205
|
+
}
|
|
206
|
+
function readCommandError(error) {
|
|
207
|
+
if (error instanceof Error && error.message.length > 0) {
|
|
208
|
+
return error.message;
|
|
209
|
+
}
|
|
210
|
+
return String(error);
|
|
211
|
+
}
|
|
212
|
+
function runCommand(command, args, cwd) {
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
214
|
+
execFile(command, args, {
|
|
215
|
+
cwd,
|
|
216
|
+
encoding: 'utf8',
|
|
217
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
218
|
+
}, (error, stdout, stderr) => {
|
|
219
|
+
if (error) {
|
|
220
|
+
const stderrMessage = typeof stderr === 'string' ? stderr.trim() : '';
|
|
221
|
+
const detail = stderrMessage.length > 0 ? stderrMessage : readCommandError(error);
|
|
222
|
+
reject(new Error(detail));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
resolve({
|
|
226
|
+
stdout: typeof stdout === 'string' ? stdout : '',
|
|
227
|
+
stderr: typeof stderr === 'string' ? stderr : '',
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
async function runPnpmPack(packageDir, outputDir) {
|
|
233
|
+
await runCommand('pnpm', ['pack', '--pack-destination', outputDir], packageDir);
|
|
234
|
+
}
|
|
235
|
+
function splitLines(text) {
|
|
236
|
+
const normalized = text.replace(/\r\n/g, '\n');
|
|
237
|
+
return normalized
|
|
238
|
+
.split('\n')
|
|
239
|
+
.map((line) => line.trim())
|
|
240
|
+
.filter((line) => line.length > 0);
|
|
241
|
+
}
|
|
242
|
+
function hasPathTraversal(value) {
|
|
243
|
+
const normalized = path.posix.normalize(value.replaceAll('\\', '/'));
|
|
244
|
+
if (normalized === '..') {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
return normalized.startsWith('../');
|
|
248
|
+
}
|
|
249
|
+
function isUnsafeTarEntry(entryPath) {
|
|
250
|
+
if (entryPath.startsWith('/')) {
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
if (entryPath.startsWith('\\')) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return hasPathTraversal(entryPath);
|
|
257
|
+
}
|
|
258
|
+
async function listTarEntries(tarballPath) {
|
|
259
|
+
const result = await runCommand('tar', ['-tzf', tarballPath]);
|
|
260
|
+
return splitLines(result.stdout);
|
|
261
|
+
}
|
|
262
|
+
function hasPackageManifestEntry(entries) {
|
|
263
|
+
for (const entry of entries) {
|
|
264
|
+
const normalized = entry.replaceAll('\\', '/');
|
|
265
|
+
if (normalized === 'package/goondan.yaml') {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
if (normalized === 'package/dist/goondan.yaml') {
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
function validateTarEntries(entries) {
|
|
275
|
+
for (const entry of entries) {
|
|
276
|
+
if (isUnsafeTarEntry(entry)) {
|
|
277
|
+
throw validateError(`tarball에 허용되지 않은 경로가 포함되어 있습니다: ${entry}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
async function ensurePackManifestInTarball(tarballPath) {
|
|
282
|
+
const entries = await listTarEntries(tarballPath);
|
|
283
|
+
validateTarEntries(entries);
|
|
284
|
+
if (!hasPackageManifestEntry(entries)) {
|
|
285
|
+
throw configError('publish 대상 tarball에 goondan manifest가 없습니다.', "패키지 빌드 산출물(dist)에 goondan.yaml 또는 dist/goondan.yaml을 포함하세요.");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function verifyIntegrity(tarball, expectedIntegrity) {
|
|
289
|
+
if (!expectedIntegrity.includes('-')) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const delimiter = expectedIntegrity.indexOf('-');
|
|
293
|
+
if (delimiter <= 0 || delimiter >= expectedIntegrity.length - 1) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const algorithm = expectedIntegrity.slice(0, delimiter);
|
|
297
|
+
const expectedDigest = expectedIntegrity.slice(delimiter + 1);
|
|
298
|
+
if (algorithm !== 'sha512' && algorithm !== 'sha1') {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const actualDigest = createHash(algorithm).update(tarball).digest('base64');
|
|
302
|
+
if (actualDigest !== expectedDigest) {
|
|
303
|
+
throw validateError('패키지 무결성 검증에 실패했습니다.', `expected=${expectedIntegrity}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function fetchTarball(tarballUrl, token) {
|
|
307
|
+
const headers = {};
|
|
308
|
+
if (token && token.length > 0) {
|
|
309
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
310
|
+
}
|
|
311
|
+
let response;
|
|
312
|
+
try {
|
|
313
|
+
response = await fetch(tarballUrl, {
|
|
314
|
+
method: 'GET',
|
|
315
|
+
headers,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
throw networkError(`패키지 tarball 다운로드 네트워크 요청에 실패했습니다: ${tarballUrl}`, `--registry 또는 GOONDAN_REGISTRY를 확인하세요. 원인: ${readCommandError(error)}`);
|
|
320
|
+
}
|
|
321
|
+
if (response.status === 401 || response.status === 403) {
|
|
322
|
+
throw configError('패키지 tarball 다운로드 인증에 실패했습니다.', '레지스트리 토큰을 확인하세요.');
|
|
323
|
+
}
|
|
324
|
+
if (!response.ok) {
|
|
325
|
+
throw configError(`패키지 tarball 다운로드 실패: ${response.status} ${response.statusText}`);
|
|
326
|
+
}
|
|
327
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
328
|
+
return bytes;
|
|
329
|
+
}
|
|
330
|
+
async function extractTarballToDirectory(tarballPath, installBase) {
|
|
331
|
+
await runCommand('tar', ['-xzf', tarballPath, '-C', installBase, '--strip-components=1']);
|
|
332
|
+
}
|
|
333
|
+
function toInstallPath(stateRoot, packageName, version) {
|
|
334
|
+
const parts = packagePathParts(packageName);
|
|
335
|
+
if (parts.scope) {
|
|
336
|
+
return path.join(stateRoot, 'packages', parts.scope, parts.name, version);
|
|
337
|
+
}
|
|
338
|
+
return path.join(stateRoot, 'packages', parts.name, version);
|
|
339
|
+
}
|
|
340
|
+
async function ensureInstalledPackageManifest(installBase, packageName, version) {
|
|
341
|
+
const rootManifest = path.join(installBase, 'goondan.yaml');
|
|
342
|
+
const distManifest = path.join(installBase, 'dist', 'goondan.yaml');
|
|
343
|
+
const hasRoot = await exists(rootManifest);
|
|
344
|
+
const hasDist = await exists(distManifest);
|
|
345
|
+
if (!hasRoot && !hasDist) {
|
|
346
|
+
throw validateError(`${packageName}@${version} 패키지에 goondan manifest가 없습니다.`, "패키지 tarball에 goondan.yaml 또는 dist/goondan.yaml을 포함해야 합니다.");
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function formatLockKey(packageName, version) {
|
|
350
|
+
return `${packageName}@${version}`;
|
|
351
|
+
}
|
|
352
|
+
function buildLockfileText(records) {
|
|
353
|
+
const keys = [...records.keys()].sort((left, right) => left.localeCompare(right));
|
|
354
|
+
const lines = ['lockfileVersion: 1', 'packages:'];
|
|
355
|
+
for (const key of keys) {
|
|
356
|
+
const entry = records.get(key);
|
|
357
|
+
if (!entry) {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
lines.push(` ${quoteYaml(key)}:`);
|
|
361
|
+
lines.push(` version: ${quoteYaml(entry.version)}`);
|
|
362
|
+
lines.push(` resolved: ${quoteYaml(entry.resolved)}`);
|
|
363
|
+
lines.push(` integrity: ${quoteYaml(entry.integrity)}`);
|
|
364
|
+
const dependencies = Object.entries(entry.dependencies).sort(([left], [right]) => left.localeCompare(right));
|
|
365
|
+
if (dependencies.length === 0) {
|
|
366
|
+
lines.push(' dependencies: {}');
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
lines.push(' dependencies:');
|
|
370
|
+
for (const [depName, depVersion] of dependencies) {
|
|
371
|
+
lines.push(` ${quoteYaml(depName)}: ${quoteYaml(depVersion)}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return `${lines.join('\n')}\n`;
|
|
375
|
+
}
|
|
376
|
+
async function createPackedAttachment(packageDir, packageName, version) {
|
|
377
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), 'goondan-pack-'));
|
|
378
|
+
try {
|
|
379
|
+
await runPnpmPack(packageDir, tempDir);
|
|
380
|
+
const entries = await readdir(tempDir);
|
|
381
|
+
const tarballs = entries.filter((entry) => entry.endsWith('.tgz')).sort();
|
|
382
|
+
const packedFile = tarballs[0];
|
|
383
|
+
if (!packedFile) {
|
|
384
|
+
throw configError('패키지 tarball 생성 결과를 찾을 수 없습니다.', 'pnpm pack 출력 경로를 확인하세요.');
|
|
385
|
+
}
|
|
386
|
+
const packedPath = path.join(tempDir, packedFile);
|
|
387
|
+
await ensurePackManifestInTarball(packedPath);
|
|
388
|
+
const bytes = await readFile(packedPath);
|
|
389
|
+
const fileName = toTarballFileName(packageName, version);
|
|
390
|
+
return {
|
|
391
|
+
fileName,
|
|
392
|
+
data: bytes.toString('base64'),
|
|
393
|
+
length: bytes.byteLength,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
if (error instanceof Error && 'code' in error && error.code === 'CONFIG_ERROR') {
|
|
398
|
+
throw error;
|
|
399
|
+
}
|
|
400
|
+
throw configError('publish용 tarball 생성에 실패했습니다.', `pnpm pack 실행 실패: ${readCommandError(error)}`);
|
|
401
|
+
}
|
|
402
|
+
finally {
|
|
403
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
export class DefaultPackageService {
|
|
407
|
+
cwd;
|
|
408
|
+
env;
|
|
409
|
+
registryClient;
|
|
410
|
+
validator;
|
|
411
|
+
constructor(cwd, env, registryClient, validator) {
|
|
412
|
+
this.cwd = cwd;
|
|
413
|
+
this.env = env;
|
|
414
|
+
this.registryClient = registryClient;
|
|
415
|
+
this.validator = validator;
|
|
416
|
+
}
|
|
417
|
+
async addDependency(request) {
|
|
418
|
+
const manifestPath = resolveManifestPath(this.cwd, request.bundlePath);
|
|
419
|
+
const manifestExists = await exists(manifestPath);
|
|
420
|
+
let originalText = '';
|
|
421
|
+
if (manifestExists) {
|
|
422
|
+
originalText = normalizeNewline(await readFile(manifestPath, 'utf8'));
|
|
423
|
+
}
|
|
424
|
+
const parsedRef = parsePackageRef(request.ref);
|
|
425
|
+
const stateRoot = resolveStateRoot(request.stateRoot, this.env);
|
|
426
|
+
const config = await readCliConfig(stateRoot);
|
|
427
|
+
const registryUrl = resolveRegistryUrl(request.registry, this.env, config, parsedRef.name);
|
|
428
|
+
const token = resolveRegistryToken(registryUrl, this.env, config);
|
|
429
|
+
const metadata = await this.registryClient.resolvePackage(request.ref, registryUrl, token);
|
|
430
|
+
const dependencyVersion = chooseDependencyVersion(parsedRef.version, metadata.latestVersion, request.exact);
|
|
431
|
+
const docs = originalText.length > 0 ? splitYamlDocuments(originalText) : [];
|
|
432
|
+
let nextDocs = docs.slice();
|
|
433
|
+
if (nextDocs.length === 0) {
|
|
434
|
+
const packageDoc = buildDefaultPackageDocument(defaultPackageNameFromManifestPath(manifestPath));
|
|
435
|
+
const updated = updateDependenciesInPackageDoc(packageDoc, {
|
|
436
|
+
name: parsedRef.name,
|
|
437
|
+
version: dependencyVersion,
|
|
438
|
+
});
|
|
439
|
+
nextDocs = [updated.doc];
|
|
440
|
+
await mkdir(path.dirname(manifestPath), { recursive: true });
|
|
441
|
+
await writeFile(manifestPath, serializeYamlDocuments(nextDocs), 'utf8');
|
|
442
|
+
return {
|
|
443
|
+
ref: request.ref,
|
|
444
|
+
added: updated.added,
|
|
445
|
+
manifestPath,
|
|
446
|
+
resolvedVersion: dependencyVersion,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
const firstDoc = nextDocs[0];
|
|
450
|
+
if (typeof firstDoc !== 'string') {
|
|
451
|
+
throw configError('Bundle 문서를 읽는 중 오류가 발생했습니다.', 'goondan.yaml 내용을 확인하세요.');
|
|
452
|
+
}
|
|
453
|
+
if (!isPackageDoc(firstDoc)) {
|
|
454
|
+
const packageDoc = buildDefaultPackageDocument(defaultPackageNameFromManifestPath(manifestPath));
|
|
455
|
+
const updatedPackageDoc = updateDependenciesInPackageDoc(packageDoc, {
|
|
456
|
+
name: parsedRef.name,
|
|
457
|
+
version: dependencyVersion,
|
|
458
|
+
});
|
|
459
|
+
nextDocs = [updatedPackageDoc.doc, ...nextDocs];
|
|
460
|
+
await writeFile(manifestPath, serializeYamlDocuments(nextDocs), 'utf8');
|
|
461
|
+
return {
|
|
462
|
+
ref: request.ref,
|
|
463
|
+
added: updatedPackageDoc.added,
|
|
464
|
+
manifestPath,
|
|
465
|
+
resolvedVersion: dependencyVersion,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
const updated = updateDependenciesInPackageDoc(firstDoc, {
|
|
469
|
+
name: parsedRef.name,
|
|
470
|
+
version: dependencyVersion,
|
|
471
|
+
});
|
|
472
|
+
nextDocs[0] = updated.doc;
|
|
473
|
+
await writeFile(manifestPath, serializeYamlDocuments(nextDocs), 'utf8');
|
|
474
|
+
return {
|
|
475
|
+
ref: request.ref,
|
|
476
|
+
added: updated.added,
|
|
477
|
+
manifestPath,
|
|
478
|
+
resolvedVersion: dependencyVersion,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
async installDependencies(request) {
|
|
482
|
+
const manifestPath = resolveManifestPath(this.cwd, request.bundlePath);
|
|
483
|
+
const manifestExists = await exists(manifestPath);
|
|
484
|
+
if (!manifestExists) {
|
|
485
|
+
throw configError(`Bundle 파일을 찾을 수 없습니다: ${manifestPath}`, 'goondan.yaml 경로를 확인하세요.');
|
|
486
|
+
}
|
|
487
|
+
const source = normalizeNewline(await readFile(manifestPath, 'utf8'));
|
|
488
|
+
const docs = splitYamlDocuments(source);
|
|
489
|
+
const firstDoc = docs[0];
|
|
490
|
+
if (docs.length === 0 || typeof firstDoc !== 'string' || !isPackageDoc(firstDoc)) {
|
|
491
|
+
throw configError('Package 문서를 찾을 수 없습니다.', 'goondan.yaml 첫 번째 문서에 kind: Package를 선언하세요.');
|
|
492
|
+
}
|
|
493
|
+
const manifest = parsePackageManifest(firstDoc);
|
|
494
|
+
if (manifest.dependencies.length === 0) {
|
|
495
|
+
return {
|
|
496
|
+
installed: 0,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
const stateRoot = resolveStateRoot(request.stateRoot, this.env);
|
|
500
|
+
const config = await readCliConfig(stateRoot);
|
|
501
|
+
const resolvedVersions = new Map();
|
|
502
|
+
const installedRecords = new Map();
|
|
503
|
+
const queue = [...manifest.dependencies];
|
|
504
|
+
while (queue.length > 0) {
|
|
505
|
+
const dep = queue.shift();
|
|
506
|
+
if (!dep) {
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
const registryUrl = resolveRegistryUrl(request.registry, this.env, config, dep.name);
|
|
510
|
+
const token = resolveRegistryToken(registryUrl, this.env, config);
|
|
511
|
+
const resolved = await this.registryClient.resolvePackage(`${dep.name}@${dep.version}`, registryUrl, token);
|
|
512
|
+
const resolvedVersion = resolved.latestVersion;
|
|
513
|
+
const previousVersion = resolvedVersions.get(dep.name);
|
|
514
|
+
if (previousVersion !== undefined && previousVersion !== resolvedVersion) {
|
|
515
|
+
throw validateError(`의존성 버전 충돌: ${dep.name} (${previousVersion} vs ${resolvedVersion})`, 'goondan.yaml dependency 버전 범위를 조정하세요.');
|
|
516
|
+
}
|
|
517
|
+
resolvedVersions.set(dep.name, resolvedVersion);
|
|
518
|
+
const lockKey = formatLockKey(dep.name, resolvedVersion);
|
|
519
|
+
if (installedRecords.has(lockKey)) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
const versionMetadata = await this.registryClient.getPackageVersion(dep.name, resolvedVersion, registryUrl, token);
|
|
523
|
+
const tarball = await fetchTarball(versionMetadata.dist.tarball, token);
|
|
524
|
+
verifyIntegrity(tarball, versionMetadata.dist.integrity);
|
|
525
|
+
const installBase = toInstallPath(stateRoot, dep.name, resolvedVersion);
|
|
526
|
+
await rm(installBase, { recursive: true, force: true });
|
|
527
|
+
await mkdir(installBase, { recursive: true });
|
|
528
|
+
const tempDir = await mkdtemp(path.join(os.tmpdir(), 'goondan-install-'));
|
|
529
|
+
try {
|
|
530
|
+
const tarballPath = path.join(tempDir, 'package.tgz');
|
|
531
|
+
await writeFile(tarballPath, tarball);
|
|
532
|
+
const entries = await listTarEntries(tarballPath);
|
|
533
|
+
validateTarEntries(entries);
|
|
534
|
+
await extractTarballToDirectory(tarballPath, installBase);
|
|
535
|
+
}
|
|
536
|
+
finally {
|
|
537
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
538
|
+
}
|
|
539
|
+
await ensureInstalledPackageManifest(installBase, dep.name, resolvedVersion);
|
|
540
|
+
installedRecords.set(lockKey, {
|
|
541
|
+
version: resolvedVersion,
|
|
542
|
+
resolved: versionMetadata.dist.tarball,
|
|
543
|
+
integrity: versionMetadata.dist.integrity,
|
|
544
|
+
dependencies: versionMetadata.dependencies,
|
|
545
|
+
});
|
|
546
|
+
for (const [childName, childVersion] of Object.entries(versionMetadata.dependencies)) {
|
|
547
|
+
queue.push({
|
|
548
|
+
name: childName,
|
|
549
|
+
version: childVersion,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
const lockfilePath = path.join(path.dirname(manifestPath), 'goondan.lock.yaml');
|
|
554
|
+
const lockfileText = buildLockfileText(installedRecords);
|
|
555
|
+
if (request.frozenLockfile && (await exists(lockfilePath))) {
|
|
556
|
+
const existing = await readFile(lockfilePath, 'utf8');
|
|
557
|
+
if (existing !== lockfileText) {
|
|
558
|
+
throw validateError('frozen-lockfile 모드에서 lockfile이 현재 의존성과 일치하지 않습니다.');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
await writeFile(lockfilePath, lockfileText, 'utf8');
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
installed: installedRecords.size,
|
|
566
|
+
lockfilePath,
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
async publishPackage(request) {
|
|
570
|
+
const manifestPath = resolveManifestPath(this.cwd, request.path);
|
|
571
|
+
const hasManifest = await exists(manifestPath);
|
|
572
|
+
if (!hasManifest) {
|
|
573
|
+
throw configError(`Bundle 파일을 찾을 수 없습니다: ${manifestPath}`, 'publish할 패키지 경로를 확인하세요.');
|
|
574
|
+
}
|
|
575
|
+
const validation = await this.validator.validate(manifestPath, false, false);
|
|
576
|
+
if (!validation.valid) {
|
|
577
|
+
throw validateError('publish 전 validate에 실패했습니다.', 'gdn validate 결과를 해결한 뒤 다시 시도하세요.');
|
|
578
|
+
}
|
|
579
|
+
const source = normalizeNewline(await readFile(manifestPath, 'utf8'));
|
|
580
|
+
const docs = splitYamlDocuments(source);
|
|
581
|
+
const firstDoc = docs[0];
|
|
582
|
+
if (docs.length === 0 || typeof firstDoc !== 'string' || !isPackageDoc(firstDoc)) {
|
|
583
|
+
throw configError('publish 대상에 Package 문서가 없습니다.', 'goondan.yaml 첫 번째 문서에 kind: Package를 선언하세요.');
|
|
584
|
+
}
|
|
585
|
+
const manifest = parsePackageManifest(firstDoc);
|
|
586
|
+
if (!manifest.packageName) {
|
|
587
|
+
throw configError('Package metadata.name이 없습니다.', 'Package metadata.name을 설정하세요.');
|
|
588
|
+
}
|
|
589
|
+
if (!manifest.packageVersion) {
|
|
590
|
+
throw configError('Package spec.version이 없습니다.', 'publish 전에 spec.version을 설정하세요.');
|
|
591
|
+
}
|
|
592
|
+
const stateRoot = resolveStateRoot(request.stateRoot, this.env);
|
|
593
|
+
const config = await readCliConfig(stateRoot);
|
|
594
|
+
const registryUrl = resolveRegistryUrl(request.registry, this.env, config, manifest.packageName);
|
|
595
|
+
const token = resolveRegistryToken(registryUrl, this.env, config);
|
|
596
|
+
const packageDir = path.dirname(manifestPath);
|
|
597
|
+
const packedAttachment = await createPackedAttachment(packageDir, manifest.packageName, manifest.packageVersion);
|
|
598
|
+
const dependencies = dependencyEntriesToRecord(manifest.dependencies);
|
|
599
|
+
if (!request.dryRun) {
|
|
600
|
+
const response = await this.registryClient.publishPackage({
|
|
601
|
+
name: manifest.packageName,
|
|
602
|
+
version: manifest.packageVersion,
|
|
603
|
+
access: request.access,
|
|
604
|
+
dependencies,
|
|
605
|
+
'dist-tags': {
|
|
606
|
+
[request.tag]: manifest.packageVersion,
|
|
607
|
+
},
|
|
608
|
+
_attachments: {
|
|
609
|
+
[packedAttachment.fileName]: {
|
|
610
|
+
data: packedAttachment.data,
|
|
611
|
+
contentType: 'application/gzip',
|
|
612
|
+
length: packedAttachment.length,
|
|
613
|
+
},
|
|
614
|
+
},
|
|
615
|
+
}, registryUrl, token);
|
|
616
|
+
if (!response.ok) {
|
|
617
|
+
throw configError('레지스트리 publish 요청이 실패했습니다.');
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
return {
|
|
621
|
+
published: !request.dryRun,
|
|
622
|
+
registryUrl,
|
|
623
|
+
packageName: manifest.packageName,
|
|
624
|
+
version: manifest.packageVersion,
|
|
625
|
+
tag: request.tag,
|
|
626
|
+
dryRun: request.dryRun,
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/services/package.ts"],"names":[],"mappings":"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"}
|