@serve.zone/gitops 2.13.1 → 3.1.0

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 (47) hide show
  1. package/changelog.md +23 -0
  2. package/deno.json +1 -1
  3. package/dist_serve/bundle.js +726 -694
  4. package/dist_ts/00_commitinfo_data.js +2 -2
  5. package/dist_ts/classes/connectionmanager.d.ts +5 -1
  6. package/dist_ts/classes/connectionmanager.js +62 -7
  7. package/dist_ts/classes/syncmanager.d.ts +40 -0
  8. package/dist_ts/classes/syncmanager.js +804 -111
  9. package/dist_ts/classes/syncpath.d.ts +13 -0
  10. package/dist_ts/classes/syncpath.js +53 -0
  11. package/dist_ts/opsserver/handlers/connections.handler.js +8 -2
  12. package/dist_ts/opsserver/handlers/sync.handler.js +5 -1
  13. package/dist_ts/providers/classes.baseprovider.d.ts +22 -0
  14. package/dist_ts/providers/classes.baseprovider.js +93 -1
  15. package/dist_ts/providers/classes.giteaprovider.d.ts +18 -1
  16. package/dist_ts/providers/classes.giteaprovider.js +236 -1
  17. package/dist_ts/providers/classes.gitlabprovider.d.ts +16 -1
  18. package/dist_ts/providers/classes.gitlabprovider.js +235 -1
  19. package/dist_ts_interfaces/data/artifact.d.ts +39 -0
  20. package/dist_ts_interfaces/data/artifact.js +2 -0
  21. package/dist_ts_interfaces/data/connection.d.ts +3 -0
  22. package/dist_ts_interfaces/data/index.d.ts +1 -0
  23. package/dist_ts_interfaces/data/index.js +2 -1
  24. package/dist_ts_interfaces/data/sync.d.ts +21 -0
  25. package/dist_ts_interfaces/requests/connections.d.ts +6 -0
  26. package/dist_ts_interfaces/requests/sync.d.ts +4 -0
  27. package/package.json +3 -3
  28. package/readme.md +8 -4
  29. package/ts/00_commitinfo_data.ts +1 -1
  30. package/ts/classes/connectionmanager.ts +61 -6
  31. package/ts/classes/syncmanager.ts +1095 -119
  32. package/ts/classes/syncpath.ts +71 -0
  33. package/ts/opsserver/handlers/connections.handler.ts +9 -0
  34. package/ts/opsserver/handlers/sync.handler.ts +4 -0
  35. package/ts/providers/classes.baseprovider.ts +137 -0
  36. package/ts/providers/classes.giteaprovider.ts +293 -1
  37. package/ts/providers/classes.gitlabprovider.ts +292 -1
  38. package/ts_interfaces/data/artifact.ts +43 -0
  39. package/ts_interfaces/data/connection.ts +3 -0
  40. package/ts_interfaces/data/index.ts +1 -0
  41. package/ts_interfaces/data/sync.ts +22 -0
  42. package/ts_interfaces/requests/connections.ts +6 -0
  43. package/ts_interfaces/requests/sync.ts +4 -0
  44. package/ts_web/00_commitinfo_data.ts +1 -1
  45. package/ts_web/appstate.ts +10 -0
  46. package/ts_web/elements/views/connections/index.ts +26 -0
  47. package/ts_web/elements/views/sync/index.ts +26 -4
@@ -138,7 +138,241 @@ export class GitLabProvider extends BaseProvider {
138
138
  return null;
139
139
  }
140
140
  }
141
+ // --- Releases / Release Assets ---
142
+ async getReleases(projectFullPath) {
143
+ const encodedProject = encodeURIComponent(projectFullPath);
144
+ try {
145
+ const releases = await this.requestPaginated(`/api/v4/projects/${encodedProject}/releases?order_by=released_at&sort=desc`);
146
+ return releases.map((release) => this.mapRelease(release));
147
+ }
148
+ catch (err) {
149
+ if (this.isNotFoundError(err))
150
+ return [];
151
+ throw err;
152
+ }
153
+ }
154
+ async upsertRelease(projectFullPath, release) {
155
+ const encodedProject = encodeURIComponent(projectFullPath);
156
+ const encodedTag = encodeURIComponent(release.tagName);
157
+ const body = {
158
+ name: release.name || release.tagName,
159
+ tag_name: release.tagName,
160
+ description: release.description || '',
161
+ };
162
+ if (release.releasedAt)
163
+ body.released_at = release.releasedAt;
164
+ try {
165
+ await this.requestJson('GET', `/api/v4/projects/${encodedProject}/releases/${encodedTag}`);
166
+ const updated = await this.requestJson('PUT', `/api/v4/projects/${encodedProject}/releases/${encodedTag}`, body);
167
+ return this.mapRelease(updated);
168
+ }
169
+ catch (err) {
170
+ if (!this.isNotFoundError(err))
171
+ throw err;
172
+ const created = await this.requestJson('POST', `/api/v4/projects/${encodedProject}/releases`, body);
173
+ return this.mapRelease(created);
174
+ }
175
+ }
176
+ async deleteRelease(projectFullPath, tagName) {
177
+ const encodedProject = encodeURIComponent(projectFullPath);
178
+ const encodedTag = encodeURIComponent(tagName);
179
+ try {
180
+ await this.requestVoid('DELETE', `/api/v4/projects/${encodedProject}/releases/${encodedTag}`);
181
+ }
182
+ catch (err) {
183
+ if (!this.isNotFoundError(err))
184
+ throw err;
185
+ }
186
+ }
187
+ async deleteReleaseAsset(projectFullPath, release, asset) {
188
+ if (asset.kind !== 'link' || !asset.id)
189
+ return;
190
+ const encodedProject = encodeURIComponent(projectFullPath);
191
+ const encodedTag = encodeURIComponent(release.tagName);
192
+ await this.requestVoid('DELETE', `/api/v4/projects/${encodedProject}/releases/${encodedTag}/assets/links/${encodeURIComponent(asset.id)}`);
193
+ }
194
+ async downloadReleaseAsset(projectFullPath, release, asset, options) {
195
+ const baseOrigin = new URL(this.baseUrl).origin;
196
+ if (asset.url && new URL(asset.url, this.baseUrl).origin !== baseOrigin) {
197
+ return null;
198
+ }
199
+ let url;
200
+ if (asset.directAssetPath) {
201
+ const encodedProject = encodeURIComponent(projectFullPath);
202
+ const encodedTag = encodeURIComponent(release.tagName);
203
+ const encodedDirectPath = asset.directAssetPath
204
+ .replace(/^\/+/, '')
205
+ .split('/')
206
+ .map((segment) => encodeURIComponent(segment))
207
+ .join('/');
208
+ url = `${this.baseUrl}/api/v4/projects/${encodedProject}/releases/${encodedTag}/downloads/${encodedDirectPath}`;
209
+ }
210
+ else if (asset.downloadUrl || asset.url) {
211
+ const resolvedUrl = new URL(asset.downloadUrl || asset.url || '', this.baseUrl);
212
+ if (resolvedUrl.origin !== baseOrigin) {
213
+ return null;
214
+ }
215
+ url = resolvedUrl.toString();
216
+ }
217
+ if (!url)
218
+ return null;
219
+ const response = await fetch(url, {
220
+ headers: { 'PRIVATE-TOKEN': this.token },
221
+ signal: options?.signal,
222
+ });
223
+ if (!response.ok) {
224
+ const text = await response.text();
225
+ throw new Error(`GET release asset ${asset.name}: ${response.status} - ${text}`);
226
+ }
227
+ return await this.readReleaseAssetPayload(response, asset.name, asset.contentType, options);
228
+ }
229
+ async uploadReleaseAsset(projectFullPath, release, asset, payload, options) {
230
+ const encodedProject = encodeURIComponent(projectFullPath);
231
+ const formData = new FormData();
232
+ const blob = new Blob([this.getPayloadArrayBuffer(payload)], {
233
+ type: payload.contentType || asset.contentType || 'application/octet-stream',
234
+ });
235
+ formData.append('file', blob, asset.name);
236
+ const uploadResponse = await fetch(`${this.baseUrl}/api/v4/projects/${encodedProject}/uploads`, {
237
+ method: 'POST',
238
+ headers: { 'PRIVATE-TOKEN': this.token },
239
+ body: formData,
240
+ signal: options?.signal,
241
+ });
242
+ if (!uploadResponse.ok) {
243
+ const text = await uploadResponse.text();
244
+ throw new Error(`POST project upload ${asset.name}: ${uploadResponse.status} - ${text}`);
245
+ }
246
+ const upload = await uploadResponse.json();
247
+ const uploadPath = upload.full_path || upload.url;
248
+ if (!uploadPath) {
249
+ throw new Error(`GitLab upload response did not include a path for ${asset.name}`);
250
+ }
251
+ const uploadUrl = uploadPath.startsWith('http') ? uploadPath : `${this.baseUrl}${uploadPath}`;
252
+ return await this.createReleaseAssetLink(projectFullPath, release, {
253
+ ...asset,
254
+ kind: 'link',
255
+ url: uploadUrl,
256
+ directAssetPath: asset.directAssetPath || `/gitops-mirror-assets/${release.tagName}/${asset.name}`,
257
+ });
258
+ }
259
+ async createReleaseAssetLink(projectFullPath, release, asset) {
260
+ if (!asset.url) {
261
+ throw new Error(`Release asset "${asset.name}" has no URL to link`);
262
+ }
263
+ const encodedProject = encodeURIComponent(projectFullPath);
264
+ const encodedTag = encodeURIComponent(release.tagName);
265
+ const body = {
266
+ name: asset.name,
267
+ url: asset.url,
268
+ link_type: asset.linkType || 'other',
269
+ };
270
+ if (asset.directAssetPath)
271
+ body.direct_asset_path = asset.directAssetPath;
272
+ const created = await this.requestJson('POST', `/api/v4/projects/${encodedProject}/releases/${encodedTag}/assets/links`, body);
273
+ return this.mapReleaseLink(created);
274
+ }
275
+ // --- Container Images ---
276
+ async getContainerImageRepositories(projectFullPath) {
277
+ const encodedProject = encodeURIComponent(projectFullPath);
278
+ try {
279
+ const repositories = await this.requestPaginated(`/api/v4/projects/${encodedProject}/registry/repositories?tags_count=true`);
280
+ const result = [];
281
+ for (const repo of repositories) {
282
+ const tags = await this.requestPaginated(`/api/v4/projects/${encodedProject}/registry/repositories/${repo.id}/tags`);
283
+ result.push({
284
+ id: String(repo.id),
285
+ name: repo.name || '',
286
+ path: repo.path,
287
+ location: repo.location,
288
+ projectFullPath,
289
+ tags: tags.map((tag) => ({
290
+ name: tag.name,
291
+ location: tag.location || `${repo.location}:${tag.name}`,
292
+ })),
293
+ });
294
+ }
295
+ return result;
296
+ }
297
+ catch (err) {
298
+ if (this.isNotFoundError(err))
299
+ return [];
300
+ throw err;
301
+ }
302
+ }
303
+ async deleteContainerImageTag(projectFullPath, repositoryId, tagName) {
304
+ const encodedProject = encodeURIComponent(projectFullPath);
305
+ try {
306
+ await this.requestVoid('DELETE', `/api/v4/projects/${encodedProject}/registry/repositories/${encodeURIComponent(repositoryId)}/tags/${encodeURIComponent(tagName)}`);
307
+ }
308
+ catch (err) {
309
+ if (!this.isNotFoundError(err))
310
+ throw err;
311
+ }
312
+ }
141
313
  // --- Mappers ---
314
+ async requestPaginated(path) {
315
+ const items = [];
316
+ const perPage = 100;
317
+ const maxPages = 1000;
318
+ for (let page = 1; page <= maxPages; page++) {
319
+ const separator = path.includes('?') ? '&' : '?';
320
+ const requestPath = `${path}${separator}page=${page}&per_page=${perPage}`;
321
+ const pageItems = await this.requestJson('GET', requestPath);
322
+ if (!Array.isArray(pageItems) || pageItems.length === 0)
323
+ break;
324
+ items.push(...pageItems);
325
+ if (pageItems.length < perPage)
326
+ break;
327
+ }
328
+ if (items.length >= perPage * maxPages) {
329
+ throw new Error(`Pagination exceeded ${maxPages} pages for ${path}`);
330
+ }
331
+ return items;
332
+ }
333
+ async requestJson(method, path, body) {
334
+ const headers = { 'PRIVATE-TOKEN': this.token };
335
+ if (body)
336
+ headers['Content-Type'] = 'application/json';
337
+ return await this.fetchJsonWithTimeout(`${this.baseUrl.replace(/\/+$/, '')}${path}`, {
338
+ method,
339
+ headers,
340
+ body: body ? JSON.stringify(body) : undefined,
341
+ }, `GitLab ${method} ${path}`);
342
+ }
343
+ async requestVoid(method, path) {
344
+ await this.fetchVoidWithTimeout(`${this.baseUrl.replace(/\/+$/, '')}${path}`, {
345
+ method,
346
+ headers: { 'PRIVATE-TOKEN': this.token },
347
+ }, `GitLab ${method} ${path}`);
348
+ }
349
+ isNotFoundError(err) {
350
+ const errMsg = err instanceof Error ? err.message : String(err);
351
+ return errMsg.includes(': 404 ') || errMsg.includes(': 404 -') || errMsg.includes(' 404 Not Found');
352
+ }
353
+ mapRelease(raw) {
354
+ const links = Array.isArray(raw.assets?.links) ? raw.assets.links : [];
355
+ return {
356
+ tagName: raw.tag_name,
357
+ name: raw.name || raw.tag_name,
358
+ description: raw.description || '',
359
+ releasedAt: raw.released_at,
360
+ createdAt: raw.created_at,
361
+ targetCommitish: raw.commit?.id,
362
+ assets: links.map((link) => this.mapReleaseLink(link)),
363
+ };
364
+ }
365
+ mapReleaseLink(link) {
366
+ return {
367
+ id: link.id ? String(link.id) : undefined,
368
+ name: link.name || '',
369
+ kind: 'link',
370
+ url: link.url,
371
+ downloadUrl: link.direct_asset_url,
372
+ directAssetPath: link.direct_asset_path,
373
+ linkType: link.link_type || 'other',
374
+ };
375
+ }
142
376
  mapProject(p) {
143
377
  return {
144
378
  id: String(p.id),
@@ -204,4 +438,4 @@ export class GitLabProvider extends BaseProvider {
204
438
  };
205
439
  }
206
440
  }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRsYWJwcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3ZpZGVycy9jbGFzc2VzLmdpdGxhYnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQTRFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkk7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLFlBQVk7SUFDdEMsTUFBTSxDQUFvQztJQUVsRCxZQUFZLFlBQW9CLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxhQUFzQjtRQUN0RixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQW1CO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhO1lBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMs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
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRsYWJwcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3ZpZGVycy9jbGFzc2VzLmdpdGxhYnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQTBJLE1BQU0sMkJBQTJCLENBQUM7QUFFak07O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLFlBQVk7SUFDdEMsTUFBTSxDQUFvQztJQUVsRCxZQUFZLFlBQW9CLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxhQUFzQjtRQUN0RixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQW1CO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhO1lBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMs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
@@ -0,0 +1,39 @@
1
+ export type TReleaseAssetKind = 'link' | 'attachment' | 'source';
2
+ export interface IReleaseAsset {
3
+ id?: string;
4
+ name: string;
5
+ kind: TReleaseAssetKind;
6
+ url?: string;
7
+ downloadUrl?: string;
8
+ directAssetPath?: string;
9
+ linkType?: 'other' | 'runbook' | 'image' | 'package';
10
+ contentType?: string;
11
+ size?: number;
12
+ }
13
+ export interface IRelease {
14
+ id?: string;
15
+ tagName: string;
16
+ name: string;
17
+ description: string;
18
+ releasedAt?: string;
19
+ createdAt?: string;
20
+ draft?: boolean;
21
+ preRelease?: boolean;
22
+ targetCommitish?: string;
23
+ assets: IReleaseAsset[];
24
+ }
25
+ export interface IContainerImageTag {
26
+ name: string;
27
+ digest?: string;
28
+ location: string;
29
+ createdAt?: string;
30
+ size?: number;
31
+ }
32
+ export interface IContainerImageRepository {
33
+ id: string;
34
+ name: string;
35
+ path: string;
36
+ location: string;
37
+ projectFullPath: string;
38
+ tags: IContainerImageTag[];
39
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvYXJ0aWZhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -9,4 +9,7 @@ export interface IProviderConnection {
9
9
  status: 'connected' | 'disconnected' | 'error' | 'paused';
10
10
  groupFilter?: string;
11
11
  groupFilterId?: string;
12
+ registryUrl?: string;
13
+ registryUsername?: string;
14
+ registryToken?: string;
12
15
  }
@@ -5,6 +5,7 @@ export * from './group.js';
5
5
  export * from './branch.js';
6
6
  export * from './secret.js';
7
7
  export * from './pipeline.js';
8
+ export * from './artifact.js';
8
9
  export * from './actionlog.js';
9
10
  export * from './sync.js';
10
11
  export * from './managedsecret.js';
@@ -5,8 +5,9 @@ export * from './group.js';
5
5
  export * from './branch.js';
6
6
  export * from './secret.js';
7
7
  export * from './pipeline.js';
8
+ export * from './artifact.js';
8
9
  export * from './actionlog.js';
9
10
  export * from './sync.js';
10
11
  export * from './managedsecret.js';
11
12
  export * from './job.js';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxVQUFVLENBQUMifQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxVQUFVLENBQUMifQ==
@@ -11,8 +11,12 @@ export interface ISyncConfig {
11
11
  lastSyncError?: string;
12
12
  lastSyncDurationMs?: number;
13
13
  reposSynced: number;
14
+ releasesSynced?: number;
15
+ imagesSynced?: number;
14
16
  enforceDelete: boolean;
15
17
  enforceGroupDelete: boolean;
18
+ syncReleases?: boolean;
19
+ syncContainerImages?: boolean;
16
20
  addMirrorHint?: boolean;
17
21
  useGroupAvatarsForProjects?: boolean;
18
22
  createdAt: number;
@@ -24,8 +28,25 @@ export interface ISyncRepoStatus {
24
28
  targetFullPath: string;
25
29
  lastSyncAt: number;
26
30
  lastSyncError?: string;
31
+ sourceProjectId?: string;
32
+ targetProjectId?: string;
33
+ releasesSynced?: number;
34
+ imagesSynced?: number;
35
+ releaseSyncError?: string;
36
+ imageSyncError?: string;
27
37
  status: 'synced' | 'error' | 'pending';
28
38
  }
39
+ export interface ISyncProjectMapping {
40
+ id: string;
41
+ syncConfigId: string;
42
+ sourceConnectionId: string;
43
+ sourceProjectId: string;
44
+ sourceFullPath: string;
45
+ targetConnectionId: string;
46
+ targetFullPath: string;
47
+ targetProjectId?: string;
48
+ updatedAt: number;
49
+ }
29
50
  export interface ISyncLogEntry {
30
51
  timestamp: number;
31
52
  level: 'info' | 'warn' | 'error' | 'success' | 'debug';
@@ -18,6 +18,9 @@ export interface IReq_CreateConnection extends plugins.typedrequestInterfaces.im
18
18
  baseUrl: string;
19
19
  token: string;
20
20
  groupFilter?: string;
21
+ registryUrl?: string;
22
+ registryUsername?: string;
23
+ registryToken?: string;
21
24
  };
22
25
  response: {
23
26
  connection: data.IProviderConnection;
@@ -32,6 +35,9 @@ export interface IReq_UpdateConnection extends plugins.typedrequestInterfaces.im
32
35
  baseUrl?: string;
33
36
  token?: string;
34
37
  groupFilter?: string;
38
+ registryUrl?: string;
39
+ registryUsername?: string;
40
+ registryToken?: string;
35
41
  };
36
42
  response: {
37
43
  connection: data.IProviderConnection;
@@ -20,6 +20,8 @@ export interface IReq_CreateSyncConfig extends plugins.typedrequestInterfaces.im
20
20
  intervalMinutes?: number;
21
21
  enforceDelete?: boolean;
22
22
  enforceGroupDelete?: boolean;
23
+ syncReleases?: boolean;
24
+ syncContainerImages?: boolean;
23
25
  addMirrorHint?: boolean;
24
26
  useGroupAvatarsForProjects?: boolean;
25
27
  };
@@ -37,6 +39,8 @@ export interface IReq_UpdateSyncConfig extends plugins.typedrequestInterfaces.im
37
39
  intervalMinutes?: number;
38
40
  enforceDelete?: boolean;
39
41
  enforceGroupDelete?: boolean;
42
+ syncReleases?: boolean;
43
+ syncContainerImages?: boolean;
40
44
  addMirrorHint?: boolean;
41
45
  useGroupAvatarsForProjects?: boolean;
42
46
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/gitops",
3
- "version": "2.13.1",
3
+ "version": "3.1.0",
4
4
  "description": "GitOps management app for Gitea and GitLab - manage secrets, browse projects, view CI pipelines, and stream build logs",
5
5
  "main": "./dist_ts/index.js",
6
6
  "typings": "./dist_ts/index.d.ts",
@@ -22,8 +22,8 @@
22
22
  "author": "Task Venture Capital GmbH",
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "@api.global/typedrequest-interfaces": "^3.0.19",
26
25
  "@api.global/typedrequest": "3.3.0",
26
+ "@api.global/typedrequest-interfaces": "^3.0.19",
27
27
  "@api.global/typedserver": "^8.4.7",
28
28
  "@api.global/typedsocket": "^4.1.4",
29
29
  "@apiclient.xyz/bookstack": "^1.1.1",
@@ -41,7 +41,7 @@
41
41
  "@git.zone/tsbuild": "^4.4.2",
42
42
  "@git.zone/tsbundle": "^2.10.4",
43
43
  "@git.zone/tsdeno": "^1.5.0",
44
- "@git.zone/tsdocker": "2.4.2",
44
+ "@git.zone/tsdocker": "2.4.3",
45
45
  "@git.zone/tsrun": "^2.0.4",
46
46
  "@git.zone/tstest": "^3.6.6",
47
47
  "@git.zone/tswatch": "^3.3.5",
package/readme.md CHANGED
@@ -12,7 +12,7 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community
12
12
  - Stores provider tokens and BookStack job tokens through `@push.rocks/smartsecret`, using OS keychain support where available and an encrypted fallback otherwise.
13
13
  - Serves a bundled Lit/dees-catalog single page app through `@api.global/typedserver` with TypedRequest handlers for all backend actions.
14
14
  - Scans project and group CI/CD secrets into an embedded SmartMongo cache and refreshes that cache on startup and every 24 hours.
15
- - Mirrors repositories from a source connection to a target connection with group offset support, metadata sync, stale repository handling, and live sync logs.
15
+ - Mirrors repositories from a source connection to a target connection with group offset support, stable source-project mapping for subgroup/path shifts, metadata sync, optional release/asset and OCI image sync, stale target handling, and live sync logs.
16
16
  - Manages reusable secret definitions that can be pushed to selected project or group targets.
17
17
  - Runs scheduled jobs, currently focused on syncing `readme.md`, `changelog.md`, and `docs/*.md` content into BookStack shelves, books, and pages.
18
18
  - Receives provider webhooks at `POST /webhook/:connectionId` and broadcasts events to connected browser clients.
@@ -48,6 +48,8 @@ node ./cli.js server
48
48
  GITOPS_PORT=3001 node ./cli.js server
49
49
  ```
50
50
 
51
+ Container image sync shells out to `skopeo copy --all`; source runs need `skopeo` on `PATH`. The packaged Docker image installs `skopeo` for this path.
52
+
51
53
  The package exports the application API and shared request/data contracts for typed integrations:
52
54
 
53
55
  ```typescript
@@ -63,7 +65,7 @@ import type * as gitopsInterfaces from '@serve.zone/gitops/interfaces';
63
65
  | `ConnectionManager` | Persists Gitea/GitLab connections, migrates old plaintext tokens into SmartSecret, and background-checks connection health. |
64
66
  | `GiteaProvider` / `GitLabProvider` | Provider-specific adapters behind a shared `BaseProvider` interface. |
65
67
  | `SecretsScanService` | Fetches project and group secrets in batches and upserts them into cached SmartData documents. |
66
- | `SyncManager` | Mirrors repositories with bare git clones, source/target path mapping, deletion safeguards, branch/default-branch handling, and metadata sync. |
68
+ | `SyncManager` | Mirrors repositories with bare git clones, stable source/target path mapping, deletion safeguards, branch/default-branch handling, metadata sync, release/asset sync, and OCI image sync. |
67
69
  | `ManagedSecretsManager` | Stores define-once secret records and pushes them to selected project or group targets. |
68
70
  | `JobManager` | Stores scheduled jobs, starts interval timers, masks persisted secrets, and dispatches job execution to registered runners. |
69
71
  | `AutoBookstackDocsRunner` | Maps git groups to BookStack shelves, repos to books, and markdown files to pages with content hashes to avoid noisy updates. |
@@ -78,6 +80,8 @@ import type * as gitopsInterfaces from '@serve.zone/gitops/interfaces';
78
80
 
79
81
  Provider connections, sync configs, jobs, managed secrets, and action logs are persisted as JSON records below `~/.serve.zone/gitops/storage/`. Cached projects and secrets live in the embedded SmartMongo directory below `~/.serve.zone/gitops/tsmdb/`.
80
82
 
83
+ Provider connections may also define `registryUrl`, `registryUsername`, and `registryToken` for OCI registry mirroring. Registry tokens are stored through SmartSecret and masked in API/UI responses. GitLab image sync falls back to `oauth2:<provider token>` when no dedicated registry credentials are configured; Gitea requires an explicit registry username when registry auth is needed.
84
+
81
85
  ## API Surface
82
86
 
83
87
  The backend exposes TypedRequest methods through `/typedrequest` and a custom webhook route. The important handler groups are:
@@ -85,12 +89,12 @@ The backend exposes TypedRequest methods through `/typedrequest` and a custom we
85
89
  | Handler | Examples |
86
90
  | --- | --- |
87
91
  | Admin | `adminLogin`, `adminLogout`, `verifyIdentity` |
88
- | Connections | `getConnections`, `createConnection`, `updateConnection`, `testConnection`, `pauseConnection`, `deleteConnection` |
92
+ | Connections | `getConnections`, `createConnection`, `updateConnection`, `testConnection`, `pauseConnection`, `deleteConnection`, optional registry auth fields |
89
93
  | Projects and Groups | Provider browsing with search/pagination style request contracts |
90
94
  | Secrets | Cached and direct project/group secret CRUD |
91
95
  | Managed Secrets | Definition CRUD plus push-to-target operations |
92
96
  | Pipelines and Logs | Pipeline listing, jobs, retry/cancel, and raw job log fetches |
93
- | Sync | Sync config CRUD, preview, trigger, status, and logs |
97
+ | Sync | Sync config CRUD, preview, trigger, status, logs, optional `syncReleases` and `syncContainerImages` artifact mirroring |
94
98
  | Jobs | Scheduled job CRUD, trigger, pause/resume, and logs |
95
99
  | Webhooks | `POST /webhook/:connectionId` for provider event fan-out |
96
100
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/gitops',
6
- version: '2.13.1',
6
+ version: '3.1.0',
7
7
  description: 'GitOps management app for Gitea and GitLab - manage secrets, browse projects, view CI pipelines, and stream build logs'
8
8
  }