@microwiseai/snapshot 0.3.5

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 (46) hide show
  1. package/README.md +92 -0
  2. package/dist/commands/current.d.ts +2 -0
  3. package/dist/commands/current.d.ts.map +1 -0
  4. package/dist/commands/current.js +32 -0
  5. package/dist/commands/current.js.map +1 -0
  6. package/dist/commands/install.d.ts +2 -0
  7. package/dist/commands/install.d.ts.map +1 -0
  8. package/dist/commands/install.js +211 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/list.d.ts +2 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +45 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/publish.d.ts +11 -0
  15. package/dist/commands/publish.d.ts.map +1 -0
  16. package/dist/commands/publish.js +111 -0
  17. package/dist/commands/publish.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +62 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/lib/config.d.ts +4 -0
  23. package/dist/lib/config.d.ts.map +1 -0
  24. package/dist/lib/config.js +27 -0
  25. package/dist/lib/config.js.map +1 -0
  26. package/dist/lib/gitlab.d.ts +57 -0
  27. package/dist/lib/gitlab.d.ts.map +1 -0
  28. package/dist/lib/gitlab.js +268 -0
  29. package/dist/lib/gitlab.js.map +1 -0
  30. package/dist/lib/gitlab.test.d.ts +2 -0
  31. package/dist/lib/gitlab.test.d.ts.map +1 -0
  32. package/dist/lib/gitlab.test.js +63 -0
  33. package/dist/lib/gitlab.test.js.map +1 -0
  34. package/dist/lib/registry.d.ts +3 -0
  35. package/dist/lib/registry.d.ts.map +1 -0
  36. package/dist/lib/registry.js +53 -0
  37. package/dist/lib/registry.js.map +1 -0
  38. package/dist/lib/snapshot.d.ts +10 -0
  39. package/dist/lib/snapshot.d.ts.map +1 -0
  40. package/dist/lib/snapshot.js +25 -0
  41. package/dist/lib/snapshot.js.map +1 -0
  42. package/dist/lib/types.d.ts +24 -0
  43. package/dist/lib/types.d.ts.map +1 -0
  44. package/dist/lib/types.js +2 -0
  45. package/dist/lib/types.js.map +1 -0
  46. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,SAAS,IAAI,cAAc,CAO1C;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAe9C"}
@@ -0,0 +1,27 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ import { execSync } from 'child_process';
4
+ export function getConfig() {
5
+ const configDir = join(homedir(), '.config', 'ist-snapshot');
6
+ return {
7
+ configDir,
8
+ currentFile: join(configDir, 'current.json'),
9
+ };
10
+ }
11
+ export function getGitlabToken() {
12
+ // Try gitlab-config first
13
+ try {
14
+ const token = execSync('gitlab-config get', { encoding: 'utf-8', stdio: 'pipe' }).trim();
15
+ if (token)
16
+ return token;
17
+ }
18
+ catch {
19
+ // Ignore
20
+ }
21
+ // Try environment variable
22
+ if (process.env.GITLAB_TOKEN) {
23
+ return process.env.GITLAB_TOKEN;
24
+ }
25
+ return null;
26
+ }
27
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,UAAU,SAAS;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7D,OAAO;QACL,SAAS;QACT,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { Snapshot } from './types.js';
2
+ export interface GitLabProject {
3
+ id: number;
4
+ name: string;
5
+ path: string;
6
+ description: string;
7
+ web_url: string;
8
+ created_at: string;
9
+ }
10
+ /**
11
+ * Parse snapshot spec into name and version
12
+ * @ist/minimal@0.2.1 → { name: "@ist/minimal", version: "0.2.1" }
13
+ * @ist/minimal → { name: "@ist/minimal", version: undefined }
14
+ */
15
+ export declare function parseSnapshotSpec(spec: string): {
16
+ name: string;
17
+ version?: string;
18
+ };
19
+ /**
20
+ * Convert snapshot name to generic package name
21
+ * @ist/minimal → ist__minimal
22
+ */
23
+ export declare function snapshotNameToPackageName(name: string): string;
24
+ /**
25
+ * Convert snapshot name to repo name
26
+ * @ist/minimal → snapshot.ist.minimal
27
+ */
28
+ export declare function snapshotNameToRepoName(nameOrSpec: string): string;
29
+ /**
30
+ * Convert repo name back to snapshot name
31
+ * snapshot.ist.minimal → @ist/minimal
32
+ */
33
+ export declare function repoNameToSnapshotName(repoName: string): string;
34
+ /**
35
+ * Fetch snapshot from GitLab generic package registry
36
+ */
37
+ export declare function fetchSnapshotFromRegistry(snapshotSpec: string): Promise<Snapshot>;
38
+ /**
39
+ * Fetch snapshot - tries registry first, falls back to repo
40
+ */
41
+ export declare function fetchSnapshotFromRepo(snapshotSpec: string): Promise<Snapshot>;
42
+ /**
43
+ * Find project by name in group
44
+ */
45
+ export declare function findProjectByName(repoName: string): Promise<GitLabProject | null>;
46
+ /**
47
+ * List all snapshot packages in the group
48
+ */
49
+ export declare function listSnapshotPackages(): Promise<Array<{
50
+ name: string;
51
+ version: string;
52
+ }>>;
53
+ /**
54
+ * List all snapshot repos in the group (legacy)
55
+ */
56
+ export declare function listSnapshotRepos(): Promise<GitLabProject[]>;
57
+ //# sourceMappingURL=gitlab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../src/lib/gitlab.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ3C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAeD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAWlF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAcjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO/D;AAyHD;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkBvF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoCnF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkBvF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyB9F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAkBlE"}
@@ -0,0 +1,268 @@
1
+ import { getGitlabToken } from './config.js';
2
+ import { createGunzip } from 'zlib';
3
+ import { Readable } from 'stream';
4
+ import { extract } from 'tar-stream';
5
+ const GITLAB_API = 'https://gitlab.com/api/v4';
6
+ const GROUP_ID = '110834981';
7
+ /**
8
+ * Parse snapshot spec into name and version
9
+ * @ist/minimal@0.2.1 → { name: "@ist/minimal", version: "0.2.1" }
10
+ * @ist/minimal → { name: "@ist/minimal", version: undefined }
11
+ */
12
+ export function parseSnapshotSpec(spec) {
13
+ // Find last @ that's not the scope prefix
14
+ const atIndex = spec.lastIndexOf('@');
15
+ if (atIndex > 0 && spec[0] === '@') {
16
+ // Has version: @ist/minimal@0.2.1
17
+ return {
18
+ name: spec.slice(0, atIndex),
19
+ version: spec.slice(atIndex + 1),
20
+ };
21
+ }
22
+ return { name: spec };
23
+ }
24
+ /**
25
+ * Convert snapshot name to generic package name
26
+ * @ist/minimal → ist__minimal
27
+ */
28
+ export function snapshotNameToPackageName(name) {
29
+ // Remove @ and replace / with __
30
+ return name.slice(1).replace('/', '__');
31
+ }
32
+ /**
33
+ * Convert snapshot name to repo name
34
+ * @ist/minimal → snapshot.ist.minimal
35
+ */
36
+ export function snapshotNameToRepoName(nameOrSpec) {
37
+ const { name } = parseSnapshotSpec(nameOrSpec);
38
+ if (!name.startsWith('@') || !name.includes('/')) {
39
+ throw new Error(`Invalid snapshot name: "${name}". Use @scope/name format (e.g., @ist/minimal)`);
40
+ }
41
+ const cleanName = name.slice(1);
42
+ const [scope, snapshotName] = cleanName.split('/');
43
+ if (!scope || !snapshotName) {
44
+ throw new Error(`Invalid snapshot name: "${name}". Use @scope/name format (e.g., @ist/minimal)`);
45
+ }
46
+ return `snapshot.${scope}.${snapshotName}`;
47
+ }
48
+ /**
49
+ * Convert repo name back to snapshot name
50
+ * snapshot.ist.minimal → @ist/minimal
51
+ */
52
+ export function repoNameToSnapshotName(repoName) {
53
+ const withoutPrefix = repoName.replace('snapshot.', '');
54
+ const parts = withoutPrefix.split('.');
55
+ if (parts.length >= 2) {
56
+ return `@${parts[0]}/${parts.slice(1).join('.')}`;
57
+ }
58
+ return repoName;
59
+ }
60
+ /**
61
+ * Find package in group registry
62
+ */
63
+ async function findPackage(packageName, version) {
64
+ const token = getGitlabToken();
65
+ if (!token) {
66
+ throw new Error('GitLab token not found');
67
+ }
68
+ const url = `${GITLAB_API}/groups/${GROUP_ID}/packages?package_name=${encodeURIComponent(packageName)}&package_type=generic&per_page=50`;
69
+ const response = await fetch(url, {
70
+ headers: { 'PRIVATE-TOKEN': token },
71
+ });
72
+ if (!response.ok) {
73
+ throw new Error(`GitLab API error: ${response.status}`);
74
+ }
75
+ const packages = await response.json();
76
+ if (version) {
77
+ // Find exact version
78
+ return packages.find(p => p.name === packageName && p.version === version) || null;
79
+ }
80
+ else {
81
+ // Find latest version (first in list, sorted by created_at desc)
82
+ return packages.find(p => p.name === packageName) || null;
83
+ }
84
+ }
85
+ /**
86
+ * Get package file info
87
+ */
88
+ async function getPackageFile(projectId, packageId) {
89
+ const token = getGitlabToken();
90
+ if (!token) {
91
+ throw new Error('GitLab token not found');
92
+ }
93
+ const url = `${GITLAB_API}/projects/${projectId}/packages/${packageId}/package_files`;
94
+ const response = await fetch(url, {
95
+ headers: { 'PRIVATE-TOKEN': token },
96
+ });
97
+ if (!response.ok) {
98
+ return null;
99
+ }
100
+ const files = await response.json();
101
+ return files[0] || null;
102
+ }
103
+ /**
104
+ * Download and extract snapshot.json from tarball
105
+ */
106
+ async function downloadAndExtractSnapshot(projectId, packageName, version, fileName) {
107
+ const token = getGitlabToken();
108
+ if (!token) {
109
+ throw new Error('GitLab token not found');
110
+ }
111
+ const url = `${GITLAB_API}/projects/${projectId}/packages/generic/${packageName}/${version}/${fileName}`;
112
+ const response = await fetch(url, {
113
+ headers: { 'PRIVATE-TOKEN': token },
114
+ });
115
+ if (!response.ok) {
116
+ throw new Error(`Failed to download package: ${response.status}`);
117
+ }
118
+ const buffer = Buffer.from(await response.arrayBuffer());
119
+ return new Promise((resolve, reject) => {
120
+ const extractor = extract();
121
+ let snapshotJson = null;
122
+ extractor.on('entry', (header, stream, next) => {
123
+ const chunks = [];
124
+ stream.on('data', (chunk) => chunks.push(chunk));
125
+ stream.on('end', () => {
126
+ if (header.name === 'snapshot.json' || header.name.endsWith('/snapshot.json')) {
127
+ try {
128
+ const content = Buffer.concat(chunks).toString('utf-8');
129
+ snapshotJson = JSON.parse(content);
130
+ }
131
+ catch {
132
+ reject(new Error('Failed to parse snapshot.json'));
133
+ }
134
+ }
135
+ next();
136
+ });
137
+ stream.on('error', reject);
138
+ stream.resume();
139
+ });
140
+ extractor.on('finish', () => {
141
+ if (snapshotJson) {
142
+ resolve(snapshotJson);
143
+ }
144
+ else {
145
+ reject(new Error('snapshot.json not found in package'));
146
+ }
147
+ });
148
+ extractor.on('error', reject);
149
+ // Pipe: buffer → gunzip → tar extract
150
+ const readable = Readable.from(buffer);
151
+ readable.pipe(createGunzip()).pipe(extractor);
152
+ });
153
+ }
154
+ /**
155
+ * Fetch snapshot from GitLab generic package registry
156
+ */
157
+ export async function fetchSnapshotFromRegistry(snapshotSpec) {
158
+ const { name, version } = parseSnapshotSpec(snapshotSpec);
159
+ const packageName = snapshotNameToPackageName(name);
160
+ // Find package
161
+ const pkg = await findPackage(packageName, version);
162
+ if (!pkg) {
163
+ throw new Error(`Snapshot package not found: ${name}${version ? `@${version}` : ''}`);
164
+ }
165
+ // Get package file
166
+ const file = await getPackageFile(pkg.project_id, pkg.id);
167
+ if (!file) {
168
+ throw new Error(`Package file not found for: ${name}@${pkg.version}`);
169
+ }
170
+ // Download and extract
171
+ return downloadAndExtractSnapshot(pkg.project_id, packageName, pkg.version, file.file_name);
172
+ }
173
+ /**
174
+ * Fetch snapshot - tries registry first, falls back to repo
175
+ */
176
+ export async function fetchSnapshotFromRepo(snapshotSpec) {
177
+ // Try generic registry first
178
+ try {
179
+ return await fetchSnapshotFromRegistry(snapshotSpec);
180
+ }
181
+ catch {
182
+ // Fall back to repo (for backwards compatibility)
183
+ const token = getGitlabToken();
184
+ if (!token) {
185
+ throw new Error('GitLab token not found');
186
+ }
187
+ const { name, version } = parseSnapshotSpec(snapshotSpec);
188
+ const repoName = snapshotNameToRepoName(name);
189
+ // Find the project
190
+ const project = await findProjectByName(repoName);
191
+ if (!project) {
192
+ throw new Error(`Snapshot not found: ${name}${version ? `@${version}` : ''}`);
193
+ }
194
+ // Try to fetch from repo
195
+ const refs = version ? [`v${version}`, version] : ['main', 'master'];
196
+ for (const ref of refs) {
197
+ const url = `${GITLAB_API}/projects/${project.id}/repository/files/snapshot.json/raw?ref=${ref}`;
198
+ const response = await fetch(url, {
199
+ headers: { 'PRIVATE-TOKEN': token },
200
+ });
201
+ if (response.ok) {
202
+ return await response.json();
203
+ }
204
+ }
205
+ throw new Error(`snapshot.json not found in ${repoName}${version ? ` at version ${version}` : ''}`);
206
+ }
207
+ }
208
+ /**
209
+ * Find project by name in group
210
+ */
211
+ export async function findProjectByName(repoName) {
212
+ const token = getGitlabToken();
213
+ if (!token) {
214
+ throw new Error('GitLab token not found');
215
+ }
216
+ const url = `${GITLAB_API}/groups/${GROUP_ID}/projects?search=${encodeURIComponent(repoName)}&per_page=20`;
217
+ const response = await fetch(url, {
218
+ headers: { 'PRIVATE-TOKEN': token },
219
+ });
220
+ if (!response.ok) {
221
+ throw new Error(`GitLab API error: ${response.status}`);
222
+ }
223
+ const projects = await response.json();
224
+ return projects.find(p => p.path === repoName || p.name === repoName) || null;
225
+ }
226
+ /**
227
+ * List all snapshot packages in the group
228
+ */
229
+ export async function listSnapshotPackages() {
230
+ const token = getGitlabToken();
231
+ if (!token) {
232
+ throw new Error('GitLab token not found');
233
+ }
234
+ const url = `${GITLAB_API}/groups/${GROUP_ID}/packages?package_type=generic&per_page=100`;
235
+ const response = await fetch(url, {
236
+ headers: { 'PRIVATE-TOKEN': token },
237
+ });
238
+ if (!response.ok) {
239
+ throw new Error(`GitLab API error: ${response.status}`);
240
+ }
241
+ const packages = await response.json();
242
+ // Filter to snapshot packages (ist__*) and convert names back
243
+ return packages
244
+ .filter(p => p.name.includes('__'))
245
+ .map(p => ({
246
+ name: '@' + p.name.replace('__', '/'),
247
+ version: p.version,
248
+ }));
249
+ }
250
+ /**
251
+ * List all snapshot repos in the group (legacy)
252
+ */
253
+ export async function listSnapshotRepos() {
254
+ const token = getGitlabToken();
255
+ if (!token) {
256
+ throw new Error('GitLab token not found');
257
+ }
258
+ const url = `${GITLAB_API}/groups/${GROUP_ID}/projects?search=snapshot.&per_page=100`;
259
+ const response = await fetch(url, {
260
+ headers: { 'PRIVATE-TOKEN': token },
261
+ });
262
+ if (!response.ok) {
263
+ throw new Error(`GitLab API error: ${response.status}`);
264
+ }
265
+ const projects = await response.json();
266
+ return projects.filter(p => p.path.startsWith('snapshot.') || p.name.startsWith('snapshot.'));
267
+ }
268
+ //# sourceMappingURL=gitlab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/lib/gitlab.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gitlab.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.test.d.ts","sourceRoot":"","sources":["../../src/lib/gitlab.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseSnapshotSpec, snapshotNameToPackageName, snapshotNameToRepoName, repoNameToSnapshotName, } from './gitlab.js';
3
+ describe('parseSnapshotSpec', () => {
4
+ it('should parse name with version', () => {
5
+ const result = parseSnapshotSpec('@ist/minimal@0.2.1');
6
+ expect(result).toEqual({ name: '@ist/minimal', version: '0.2.1' });
7
+ });
8
+ it('should parse name without version', () => {
9
+ const result = parseSnapshotSpec('@ist/minimal');
10
+ expect(result).toEqual({ name: '@ist/minimal' });
11
+ });
12
+ it('should handle complex version strings', () => {
13
+ const result = parseSnapshotSpec('@ist/core@1.0.0-beta.1');
14
+ expect(result).toEqual({ name: '@ist/core', version: '1.0.0-beta.1' });
15
+ });
16
+ it('should handle scope with multiple parts in name', () => {
17
+ const result = parseSnapshotSpec('@ist/my-snapshot@2.0.0');
18
+ expect(result).toEqual({ name: '@ist/my-snapshot', version: '2.0.0' });
19
+ });
20
+ });
21
+ describe('snapshotNameToPackageName', () => {
22
+ it('should convert @ist/minimal to ist__minimal', () => {
23
+ expect(snapshotNameToPackageName('@ist/minimal')).toBe('ist__minimal');
24
+ });
25
+ it('should convert @ist/core to ist__core', () => {
26
+ expect(snapshotNameToPackageName('@ist/core')).toBe('ist__core');
27
+ });
28
+ it('should handle hyphenated names', () => {
29
+ expect(snapshotNameToPackageName('@ist/my-package')).toBe('ist__my-package');
30
+ });
31
+ });
32
+ describe('snapshotNameToRepoName', () => {
33
+ it('should convert @ist/minimal to snapshot.ist.minimal', () => {
34
+ expect(snapshotNameToRepoName('@ist/minimal')).toBe('snapshot.ist.minimal');
35
+ });
36
+ it('should convert @ist/core to snapshot.ist.core', () => {
37
+ expect(snapshotNameToRepoName('@ist/core')).toBe('snapshot.ist.core');
38
+ });
39
+ it('should handle spec with version', () => {
40
+ expect(snapshotNameToRepoName('@ist/minimal@0.2.1')).toBe('snapshot.ist.minimal');
41
+ });
42
+ it('should throw for invalid format (no @)', () => {
43
+ expect(() => snapshotNameToRepoName('ist/minimal')).toThrow('Invalid snapshot name');
44
+ });
45
+ it('should throw for invalid format (no /)', () => {
46
+ expect(() => snapshotNameToRepoName('@istminimal')).toThrow('Invalid snapshot name');
47
+ });
48
+ });
49
+ describe('repoNameToSnapshotName', () => {
50
+ it('should convert snapshot.ist.minimal to @ist/minimal', () => {
51
+ expect(repoNameToSnapshotName('snapshot.ist.minimal')).toBe('@ist/minimal');
52
+ });
53
+ it('should convert snapshot.ist.core to @ist/core', () => {
54
+ expect(repoNameToSnapshotName('snapshot.ist.core')).toBe('@ist/core');
55
+ });
56
+ it('should handle names with multiple dots after scope', () => {
57
+ expect(repoNameToSnapshotName('snapshot.ist.my.package')).toBe('@ist/my.package');
58
+ });
59
+ it('should return original if not matching format', () => {
60
+ expect(repoNameToSnapshotName('someother')).toBe('someother');
61
+ });
62
+ });
63
+ //# sourceMappingURL=gitlab.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab.test.js","sourceRoot":"","sources":["../../src/lib/gitlab.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function setupNpmrc(): boolean;
2
+ export declare function getRegistryScopes(): string[];
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AAuBA,wBAAgB,UAAU,IAAI,OAAO,CAuCpC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}
@@ -0,0 +1,53 @@
1
+ import { writeFileSync, readFileSync, existsSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ import { getGitlabToken } from './config.js';
5
+ const NPMRC_PATH = join(homedir(), '.npmrc');
6
+ const REGISTRY_CONFIGS = [
7
+ { scope: '@ist', groupId: '110834981' },
8
+ { scope: '@glpkg', groupId: '117429707' },
9
+ { scope: '@anthropic', groupId: '110834981' },
10
+ { scope: '@anthropic-ist', groupId: '110834981' },
11
+ { scope: '@skit', groupId: '110834981' },
12
+ { scope: '@skit-marketplace', groupId: '110834981' },
13
+ { scope: '@pevo', groupId: '110834981' },
14
+ { scope: '@microwiseai', groupId: '110834981' },
15
+ ];
16
+ export function setupNpmrc() {
17
+ const token = getGitlabToken();
18
+ if (!token) {
19
+ return false;
20
+ }
21
+ // Read existing .npmrc if exists
22
+ let existingContent = '';
23
+ if (existsSync(NPMRC_PATH)) {
24
+ existingContent = readFileSync(NPMRC_PATH, 'utf-8');
25
+ }
26
+ // Build new registry entries
27
+ const newEntries = [];
28
+ for (const config of REGISTRY_CONFIGS) {
29
+ const registryUrl = `https://gitlab.com/api/v4/groups/${config.groupId}/-/packages/npm/`;
30
+ const scopeEntry = `${config.scope}:registry=${registryUrl}`;
31
+ const tokenEntry = `//${registryUrl.replace('https://', '')}:_authToken=\${GITLAB_TOKEN}`;
32
+ // Only add if not already present
33
+ if (!existingContent.includes(scopeEntry)) {
34
+ newEntries.push(scopeEntry);
35
+ }
36
+ if (!existingContent.includes(`:_authToken=`) || !existingContent.includes(registryUrl.replace('https://', ''))) {
37
+ // Add token entry for this registry
38
+ const tokenLine = `//gitlab.com/api/v4/groups/${config.groupId}/-/packages/npm/:_authToken=${token}`;
39
+ if (!existingContent.includes(tokenLine)) {
40
+ newEntries.push(tokenLine);
41
+ }
42
+ }
43
+ }
44
+ if (newEntries.length > 0) {
45
+ const finalContent = existingContent.trim() + '\n' + newEntries.join('\n') + '\n';
46
+ writeFileSync(NPMRC_PATH, finalContent);
47
+ }
48
+ return true;
49
+ }
50
+ export function getRegistryScopes() {
51
+ return REGISTRY_CONFIGS.map(c => c.scope);
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { InstalledSnapshot } from './types.js';
2
+ /**
3
+ * Get currently installed snapshot info
4
+ */
5
+ export declare function getCurrentSnapshot(): InstalledSnapshot | null;
6
+ /**
7
+ * Save current snapshot info
8
+ */
9
+ export declare function saveCurrentSnapshot(snapshot: InstalledSnapshot): void;
10
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/lib/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,GAAG,IAAI,CAS7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CASrE"}
@@ -0,0 +1,25 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { getConfig } from './config.js';
3
+ /**
4
+ * Get currently installed snapshot info
5
+ */
6
+ export function getCurrentSnapshot() {
7
+ const config = getConfig();
8
+ if (!existsSync(config.currentFile)) {
9
+ return null;
10
+ }
11
+ const content = readFileSync(config.currentFile, 'utf-8');
12
+ return JSON.parse(content);
13
+ }
14
+ /**
15
+ * Save current snapshot info
16
+ */
17
+ export function saveCurrentSnapshot(snapshot) {
18
+ const config = getConfig();
19
+ // Ensure config directory exists
20
+ if (!existsSync(config.configDir)) {
21
+ mkdirSync(config.configDir, { recursive: true });
22
+ }
23
+ writeFileSync(config.currentFile, JSON.stringify(snapshot, null, 2));
24
+ }
25
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/lib/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA2B;IAC7D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,iCAAiC;IACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface RegistryConfig {
2
+ group: string;
3
+ }
4
+ export interface Snapshot {
5
+ name: string;
6
+ version: string;
7
+ description?: string;
8
+ extends?: string;
9
+ registry?: Record<string, RegistryConfig>;
10
+ packages?: Record<string, string>;
11
+ skits?: Record<string, string>;
12
+ }
13
+ export interface InstalledSnapshot {
14
+ name: string;
15
+ version: string;
16
+ installedAt: string;
17
+ packages: string[];
18
+ skits?: string[];
19
+ }
20
+ export interface SnapshotConfig {
21
+ configDir: string;
22
+ currentFile: string;
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IAEvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}