@git.zone/cli 6.0.1 → 6.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.
@@ -9,6 +9,7 @@ import {
9
9
  readPendingChangelog,
10
10
  } from "../helpers.changelog.js";
11
11
  import {
12
+ resolveReleaseDockerConfiguration,
12
13
  resolveReleaseWorkflow,
13
14
  resolveReleaseResumeConfiguration,
14
15
  type IResolvedReleaseResumeConfiguration,
@@ -27,13 +28,16 @@ import {
27
28
  } from "./helpers.releasebranch.js";
28
29
  import {
29
30
  ReleaseJournalStore,
31
+ createInitialReleaseDockerJournal,
30
32
  createInitialTargetStatus,
31
33
  finalizeJournalCompletion,
32
34
  normalizeReleaseGitRemoteName,
33
35
  normalizeReleaseVersion,
34
36
  resolveGitCommonDirectory,
35
37
  type IReleaseArtifact,
36
- type IReleaseJournal,
38
+ type TReleaseJournal,
39
+ type IReleaseJournalV1,
40
+ type IReleaseJournalV2,
37
41
  } from "./classes.releasejournal.js";
38
42
  import {
39
43
  assertNoLegacyNpmPublisher,
@@ -44,6 +48,13 @@ import {
44
48
  verifyStoredNpmArtifact,
45
49
  } from "./helpers.npmartifact.js";
46
50
  import { executeReleasePublication } from "./helpers.releasepublication.js";
51
+ import {
52
+ TsdockerReleaseClient,
53
+ canonicalReleaseJson,
54
+ createReleaseQualificationRequest,
55
+ type ITsdockerReleaseClient,
56
+ type IReleaseQualificationRequest,
57
+ } from "./helpers.tsdockerprotocol.js";
47
58
 
48
59
  export { buildReleaseGitPushArgs } from "./helpers.releasepublication.js";
49
60
 
@@ -92,7 +103,7 @@ const runInternal = async (argvArg: any): Promise<void> => {
92
103
  });
93
104
  const mergeRequested = resolveReleaseMergeFlag(argvArg);
94
105
  const workflow = await resolveReleaseWorkflow(argvArg);
95
- assertReleaseConfiguration(workflow);
106
+ assertReleaseConfiguration(workflow, mergeRequested);
96
107
  let branchContext: IReleaseBranchContext = await inspectReleaseBranch({
97
108
  smartshell: smartshellInstance,
98
109
  cwd: paths.cwd,
@@ -108,11 +119,15 @@ const runInternal = async (argvArg: any): Promise<void> => {
108
119
  return;
109
120
  }
110
121
 
122
+ const preflightTsdocker = workflow.targets.includes("docker")
123
+ ? new TsdockerReleaseClient(smartshellInstance, branchContext.sourceCwd)
124
+ : undefined;
111
125
  await assertFreshReleaseCapabilities(
112
126
  smartshellInstance,
113
127
  workflow,
114
128
  branchContext.sourceCwd,
115
129
  branchContext.pushUrl,
130
+ preflightTsdocker,
116
131
  );
117
132
 
118
133
  const pending = await readPendingChangelog(
@@ -135,6 +150,16 @@ const runInternal = async (argvArg: any): Promise<void> => {
135
150
  currentVersion,
136
151
  versionType,
137
152
  );
153
+ if (preflightTsdocker) {
154
+ await preflightTsdocker.validate(
155
+ createDockerQualificationRequest(
156
+ workflow,
157
+ branchContext.sourceCwd,
158
+ plannedVersion,
159
+ branchContext.sourceOid,
160
+ ),
161
+ );
162
+ }
138
163
 
139
164
  if (workflow.confirmation === "prompt") {
140
165
  if (!mode.interactive) {
@@ -234,6 +259,18 @@ const runInternal = async (argvArg: any): Promise<void> => {
234
259
  };
235
260
 
236
261
  await ensurePublicationState();
262
+ const tsdocker = workflow.targets.includes("docker")
263
+ ? new TsdockerReleaseClient(smartshellInstance, releaseCwd)
264
+ : undefined;
265
+ await tsdocker?.assertCapabilities();
266
+ const dockerRequest = tsdocker
267
+ ? createDockerQualificationRequest(
268
+ workflow,
269
+ releaseCwd,
270
+ newVersion,
271
+ releaseRefs.mainOid,
272
+ )
273
+ : undefined;
237
274
  const journalContext = await createReleaseJournal({
238
275
  smartshell: smartshellInstance,
239
276
  workflow,
@@ -242,6 +279,8 @@ const runInternal = async (argvArg: any): Promise<void> => {
242
279
  expectedRemoteMainOid,
243
280
  version: newVersion,
244
281
  refs: releaseRefs,
282
+ dockerRequest,
283
+ tsdocker,
245
284
  ensurePublicationState,
246
285
  });
247
286
  const finalJournal = await executeReleasePublication({
@@ -250,6 +289,7 @@ const runInternal = async (argvArg: any): Promise<void> => {
250
289
  store: journalContext.store,
251
290
  journal: journalContext.journal,
252
291
  pushUrl: releasePushUrl,
292
+ tsdocker,
253
293
  ensurePublicationState,
254
294
  });
255
295
  printReleaseJournalSummary(finalJournal);
@@ -260,14 +300,18 @@ const assertFreshReleaseCapabilities = async (
260
300
  workflowArg: IResolvedReleaseWorkflow,
261
301
  cwdArg: string,
262
302
  pushUrlArg?: string,
303
+ tsdockerArg?: ITsdockerReleaseClient,
263
304
  ): Promise<void> => {
264
305
  if (workflowArg.targets.includes("docker")) {
265
- throw new Error(
266
- "Journaled Docker publication requires the planned structured tSDocker digest capability. Disable the Docker target until that upstream release is installed.",
267
- );
306
+ if (!tsdockerArg) {
307
+ throw new Error("Docker release target requires project-local tSDocker.");
308
+ }
309
+ await tsdockerArg.assertCapabilities();
268
310
  }
269
311
  if (workflowArg.targets.includes("git") && !pushUrlArg) {
270
- throw new Error("The Git release target requires one resolved push destination.");
312
+ throw new Error(
313
+ "The Git release target requires one resolved push destination.",
314
+ );
271
315
  }
272
316
  if (
273
317
  workflowArg.targets.includes("git") ||
@@ -282,7 +326,20 @@ const assertFreshReleaseCapabilities = async (
282
326
 
283
327
  const assertReleaseConfiguration = (
284
328
  workflowArg: IResolvedReleaseWorkflow,
329
+ mergeRequestedArg: boolean,
285
330
  ): void => {
331
+ if (workflowArg.targets.includes("docker")) {
332
+ if (mergeRequestedArg) {
333
+ throw new Error(
334
+ "Docker releases cannot use --merge because qualification must precede every remote publication.",
335
+ );
336
+ }
337
+ if (workflowArg.dockerNoBuild) {
338
+ throw new Error(
339
+ "Journaled Docker qualification always builds; release.targets.docker.noBuild must be false or absent.",
340
+ );
341
+ }
342
+ }
286
343
  if (workflowArg.targets.includes("git")) {
287
344
  normalizeReleaseGitRemoteName(workflowArg.gitRemote);
288
345
  }
@@ -311,7 +368,8 @@ const assertReleaseConfiguration = (
311
368
  if (
312
369
  new Set(canonicalRegistries).size !== canonicalRegistries.length ||
313
370
  canonicalRegistries.some(
314
- (registryArg, indexArg) => registryArg !== workflowArg.npmRegistries[indexArg],
371
+ (registryArg, indexArg) =>
372
+ registryArg !== workflowArg.npmRegistries[indexArg],
315
373
  )
316
374
  ) {
317
375
  throw new Error(
@@ -328,12 +386,33 @@ interface ICreateReleaseJournalOptions {
328
386
  expectedRemoteMainOid?: string;
329
387
  version: string;
330
388
  refs: IReleaseRefs;
389
+ dockerRequest?: IReleaseQualificationRequest;
390
+ tsdocker?: ITsdockerReleaseClient;
331
391
  ensurePublicationState: (expectedRemoteMainOidArg?: string) => Promise<void>;
332
392
  }
333
393
 
394
+ const createDockerQualificationRequest = (
395
+ workflowArg: IResolvedReleaseWorkflow,
396
+ cwdArg: string,
397
+ versionArg: string,
398
+ revisionArg: string,
399
+ ): IReleaseQualificationRequest =>
400
+ createReleaseQualificationRequest({
401
+ buildRegistries: workflowArg.dockerBuildRegistries,
402
+ cached: workflowArg.dockerCached,
403
+ context: workflowArg.dockerContext,
404
+ cwd: cwdArg,
405
+ parallel: workflowArg.dockerParallel,
406
+ patterns: workflowArg.dockerPatterns,
407
+ registry: workflowArg.dockerRegistry,
408
+ revision: revisionArg,
409
+ test: workflowArg.dockerTest,
410
+ version: versionArg,
411
+ });
412
+
334
413
  const createReleaseJournal = async (
335
414
  optionsArg: ICreateReleaseJournalOptions,
336
- ): Promise<{ store: ReleaseJournalStore; journal: IReleaseJournal }> => {
415
+ ): Promise<{ store: ReleaseJournalStore; journal: TReleaseJournal }> => {
337
416
  const gitCommonDirectory = await resolveGitCommonDirectory(
338
417
  optionsArg.smartshell,
339
418
  optionsArg.releaseCwd,
@@ -353,7 +432,9 @@ const createReleaseJournal = async (
353
432
  );
354
433
  }
355
434
 
356
- let temporaryDirectory = await store.createTemporaryDirectory(optionsArg.version);
435
+ let temporaryDirectory = await store.createTemporaryDirectory(
436
+ optionsArg.version,
437
+ );
357
438
  try {
358
439
  let artifact: IReleaseArtifact | null = null;
359
440
  if (optionsArg.workflow.targets.includes("npm")) {
@@ -380,53 +461,75 @@ const createReleaseJournal = async (
380
461
  }
381
462
  const now = new Date().toISOString();
382
463
  const gitStatus = createInitialTargetStatus(gitEnabled);
383
- const journal = finalizeJournalCompletion({
384
- kind: "gitzone-release-journal",
385
- schemaVersion: 1,
386
- revision: 1,
387
- release: {
388
- version: optionsArg.version,
389
- tag: `v${optionsArg.version}`,
390
- mainOid: optionsArg.refs.mainOid,
391
- tagOid: optionsArg.refs.tagOid,
392
- },
393
- artifact,
394
- git: {
395
- state: gitStatus.state,
396
- attempts: gitStatus.attempts,
397
- attempt: gitStatus.attempt,
398
- error: gitStatus.error,
399
- remote: gitEnabled ? optionsArg.workflow.gitRemote : null,
400
- destinationHash: gitEnabled
401
- ? hashReleaseDestination(optionsArg.releasePushUrl as string)
402
- : null,
403
- expectedRemoteMainOid: gitEnabled
404
- ? (optionsArg.expectedRemoteMainOid as string)
405
- : null,
406
- },
407
- npm: {
408
- access: "public",
409
- tag: "latest",
410
- alreadyPublished: optionsArg.workflow.targets.includes("npm")
411
- ? optionsArg.workflow.npmAlreadyPublished
412
- : "success",
413
- registries: optionsArg.workflow.targets.includes("npm")
414
- ? optionsArg.workflow.npmRegistries.map((registryArg) => {
415
- const status = createInitialTargetStatus(true);
416
- return {
417
- state: status.state,
418
- attempts: status.attempts,
419
- attempt: status.attempt,
420
- error: status.error,
421
- registry: registryArg,
422
- };
423
- })
424
- : [],
425
- },
426
- createdAt: now,
427
- updatedAt: now,
428
- completedAt: null,
429
- }, now);
464
+ const journal = finalizeJournalCompletion(
465
+ {
466
+ kind: "gitzone-release-journal",
467
+ schemaVersion: optionsArg.dockerRequest ? 2 : 1,
468
+ revision: 1,
469
+ release: {
470
+ version: optionsArg.version,
471
+ tag: `v${optionsArg.version}`,
472
+ mainOid: optionsArg.refs.mainOid,
473
+ tagOid: optionsArg.refs.tagOid,
474
+ },
475
+ artifact,
476
+ git: {
477
+ state: gitStatus.state,
478
+ attempts: gitStatus.attempts,
479
+ attempt: gitStatus.attempt,
480
+ error: gitStatus.error,
481
+ remote: gitEnabled ? optionsArg.workflow.gitRemote : null,
482
+ destinationHash: gitEnabled
483
+ ? hashReleaseDestination(optionsArg.releasePushUrl as string)
484
+ : null,
485
+ expectedRemoteMainOid: gitEnabled
486
+ ? (optionsArg.expectedRemoteMainOid as string)
487
+ : null,
488
+ },
489
+ npm: {
490
+ access: "public",
491
+ tag: "latest",
492
+ alreadyPublished: optionsArg.workflow.targets.includes("npm")
493
+ ? optionsArg.workflow.npmAlreadyPublished
494
+ : "success",
495
+ registries: optionsArg.workflow.targets.includes("npm")
496
+ ? optionsArg.workflow.npmRegistries.map((registryArg) => {
497
+ const status = createInitialTargetStatus(true);
498
+ return {
499
+ state: status.state,
500
+ attempts: status.attempts,
501
+ attempt: status.attempt,
502
+ error: status.error,
503
+ registry: registryArg,
504
+ };
505
+ })
506
+ : [],
507
+ },
508
+ ...(optionsArg.dockerRequest
509
+ ? {
510
+ docker: createInitialReleaseDockerJournal(
511
+ optionsArg.dockerRequest,
512
+ ),
513
+ }
514
+ : {}),
515
+ createdAt: now,
516
+ updatedAt: now,
517
+ completedAt: null,
518
+ } as TReleaseJournal,
519
+ now,
520
+ );
521
+ await optionsArg.ensurePublicationState();
522
+ if (optionsArg.dockerRequest) {
523
+ if (!optionsArg.tsdocker) {
524
+ throw new Error(
525
+ "Docker release journal installation requires the verified tSDocker protocol client.",
526
+ );
527
+ }
528
+ await optionsArg.tsdocker.validate(
529
+ optionsArg.dockerRequest,
530
+ temporaryDirectory,
531
+ );
532
+ }
430
533
  const installed = await store.installPrepared(temporaryDirectory, journal);
431
534
  temporaryDirectory = "";
432
535
  return { store, journal: installed };
@@ -521,7 +624,9 @@ const runReleaseResume = async (
521
624
  (typeof recoveryAttemptId !== "string" ||
522
625
  !/^[0-9a-f]{32}$/.test(recoveryAttemptId))
523
626
  ) {
524
- throw new Error("--recover-attempt requires one exact 32-character owner ID.");
627
+ throw new Error(
628
+ "--recover-attempt requires one exact 32-character owner ID.",
629
+ );
525
630
  }
526
631
  const version = normalizeReleaseVersion(argvArg._[2]);
527
632
  const smartshellInstance = new plugins.smartshell.Smartshell({
@@ -538,10 +643,45 @@ const runReleaseResume = async (
538
643
  npm: journal.npm.registries.length > 0,
539
644
  });
540
645
  await assertResumeConfiguration(resumeConfiguration, journal, paths.cwd);
646
+ let tsdocker: ITsdockerReleaseClient | undefined;
647
+ if (journal.schemaVersion === 2 && !journal.completedAt) {
648
+ const dockerConfiguration = await resolveReleaseDockerConfiguration();
649
+ if (dockerConfiguration.dockerNoBuild) {
650
+ throw new Error(
651
+ "Journaled Docker qualification always builds; release.targets.docker.noBuild must be false or absent.",
652
+ );
653
+ }
654
+ const currentRequest = createReleaseQualificationRequest({
655
+ buildRegistries: dockerConfiguration.dockerBuildRegistries,
656
+ cached: dockerConfiguration.dockerCached,
657
+ context: dockerConfiguration.dockerContext,
658
+ cwd: paths.cwd,
659
+ parallel: dockerConfiguration.dockerParallel,
660
+ patterns: dockerConfiguration.dockerPatterns,
661
+ registry: dockerConfiguration.dockerRegistry,
662
+ revision: journal.release.mainOid,
663
+ test: dockerConfiguration.dockerTest,
664
+ version: journal.release.version,
665
+ });
666
+ if (
667
+ canonicalReleaseJson(currentRequest) !==
668
+ canonicalReleaseJson(journal.docker.request)
669
+ ) {
670
+ throw new Error(
671
+ "Current Docker release configuration does not match the journal.",
672
+ );
673
+ }
674
+ tsdocker = new TsdockerReleaseClient(smartshellInstance, paths.cwd);
675
+ await tsdocker.assertCapabilities();
676
+ await tsdocker.validate(journal.docker.request);
677
+ }
541
678
  if (journal.artifact) {
542
679
  await assertPnpmReleaseCapability(smartshellInstance, paths.cwd);
543
680
  await assertNoLegacyNpmPublisher(paths.cwd);
544
- await verifyStoredNpmArtifact(store.getArtifactPath(version), journal.artifact);
681
+ await verifyStoredNpmArtifact(
682
+ store.getArtifactPath(version),
683
+ journal.artifact,
684
+ );
545
685
  }
546
686
 
547
687
  const branchContext = await inspectReleaseBranch({
@@ -555,7 +695,9 @@ const runReleaseResume = async (
555
695
  planMode: false,
556
696
  });
557
697
  if (branchContext.sourceOid !== journal.release.mainOid) {
558
- throw new Error("Resume must run from the journaled release commit on main.");
698
+ throw new Error(
699
+ "Resume must run from the journaled release commit on main.",
700
+ );
559
701
  }
560
702
  const refs = await captureReleaseRefs(
561
703
  smartshellInstance,
@@ -569,7 +711,8 @@ const runReleaseResume = async (
569
711
  const pushUrl = gitEnabled ? branchContext.pushUrl : undefined;
570
712
  if (
571
713
  gitEnabled &&
572
- (!pushUrl || hashReleaseDestination(pushUrl) !== journal.git.destinationHash)
714
+ (!pushUrl ||
715
+ hashReleaseDestination(pushUrl) !== journal.git.destinationHash)
573
716
  ) {
574
717
  throw new Error("The Git push destination changed after journal creation.");
575
718
  }
@@ -607,6 +750,7 @@ const runReleaseResume = async (
607
750
  journal,
608
751
  pushUrl,
609
752
  recoveryAttemptId,
753
+ tsdocker,
610
754
  ensurePublicationState,
611
755
  });
612
756
  printReleaseJournalSummary(finalJournal);
@@ -614,7 +758,7 @@ const runReleaseResume = async (
614
758
 
615
759
  const assertResumeConfiguration = async (
616
760
  workflowArg: IResolvedReleaseResumeConfiguration,
617
- journalArg: IReleaseJournal,
761
+ journalArg: TReleaseJournal,
618
762
  cwdArg: string,
619
763
  ): Promise<void> => {
620
764
  if (
@@ -635,14 +779,16 @@ const assertResumeConfiguration = async (
635
779
  workflowArg.npmAccessLevel !== journalArg.npm.access ||
636
780
  workflowArg.npmAlreadyPublished !== journalArg.npm.alreadyPublished)
637
781
  ) {
638
- throw new Error("Current npm release configuration does not match the journal.");
782
+ throw new Error(
783
+ "Current npm release configuration does not match the journal.",
784
+ );
639
785
  }
640
786
  if (journalArg.git.state !== "skipped" || journalArg.artifact) {
641
787
  await assertNoLegacyNpmPublisher(cwdArg);
642
788
  }
643
789
  };
644
790
 
645
- const printReleaseJournalSummary = (journalArg: IReleaseJournal): void => {
791
+ const printReleaseJournalSummary = (journalArg: TReleaseJournal): void => {
646
792
  console.log("");
647
793
  console.log(`Release v${journalArg.release.version}`);
648
794
  console.log(`journal revision: ${journalArg.revision}`);
@@ -653,6 +799,17 @@ const printReleaseJournalSummary = (journalArg: IReleaseJournal): void => {
653
799
  for (const registry of journalArg.npm.registries) {
654
800
  console.log(`npm ${registry.registry}: ${registry.state}`);
655
801
  }
802
+ if (journalArg.schemaVersion === 2) {
803
+ console.log(
804
+ `docker qualification ${journalArg.docker.request.candidateId}: ${journalArg.docker.qualification.state}`,
805
+ );
806
+ for (const promotion of journalArg.docker.promotions) {
807
+ console.log(
808
+ `docker promotion ${promotion.promotionId}: ${promotion.state}`,
809
+ );
810
+ }
811
+ console.log(`docker cleanup: ${journalArg.docker.cleanup.state}`);
812
+ }
656
813
  console.log(`completed: ${journalArg.completedAt || "no"}`);
657
814
  console.log("");
658
815
  };
@@ -796,7 +953,9 @@ async function runReleaseCommitStep(
796
953
  "refs/heads/main^{commit}",
797
954
  );
798
955
  if (headOid !== mainOid) {
799
- throw new Error("HEAD and main diverged after creating the release commit.");
956
+ throw new Error(
957
+ "HEAD and main diverged after creating the release commit.",
958
+ );
800
959
  }
801
960
  return mainOid;
802
961
  }
@@ -916,7 +1075,6 @@ type TDockerCommandWorkflow = Pick<
916
1075
  | "dockerRegistry"
917
1076
  | "dockerBuildRegistries"
918
1077
  | "dockerTest"
919
- | "dockerNoBuild"
920
1078
  | "dockerCached"
921
1079
  | "dockerParallel"
922
1080
  | "dockerContext"
@@ -941,9 +1099,6 @@ export function buildTsdockerPushCommand(
941
1099
  if (workflow.dockerTest) {
942
1100
  commandParts.push("--test");
943
1101
  }
944
- if (workflow.dockerNoBuild) {
945
- commandParts.push("--no-build");
946
- }
947
1102
  if (workflow.dockerCached) {
948
1103
  commandParts.push("--cached");
949
1104
  }
@@ -1024,7 +1179,6 @@ function formatDockerOptions(workflow: IResolvedReleaseWorkflow): string {
1024
1179
  options.push(
1025
1180
  `parallel=${workflow.dockerParallel === true ? "true" : workflow.dockerParallel}`,
1026
1181
  );
1027
- if (workflow.dockerNoBuild) options.push("no-build");
1028
1182
  if (workflow.dockerContext) options.push(`context=${workflow.dockerContext}`);
1029
1183
  return options.length > 0 ? options.join(", ") : "default";
1030
1184
  }
@@ -1060,7 +1214,8 @@ export function showHelp(mode?: ICliMode): void {
1060
1214
  { flag: "--npm", description: "Explicitly select the npm target" },
1061
1215
  {
1062
1216
  flag: "--docker",
1063
- description: "Select Docker and fail closed under journal schema v1",
1217
+ description:
1218
+ "Select digest-qualified Docker publication through project-local tSDocker >= 3.5.1",
1064
1219
  },
1065
1220
  {
1066
1221
  flag: "--no-publish",
@@ -1078,11 +1233,13 @@ export function showHelp(mode?: ICliMode): void {
1078
1233
  },
1079
1234
  {
1080
1235
  flag: "inspect [version]",
1081
- description: "Read one or all durable release journals without mutation",
1236
+ description:
1237
+ "Read one or all durable release journals without mutation",
1082
1238
  },
1083
1239
  {
1084
1240
  flag: "resume <version>",
1085
- description: "Resume exact Git/npm publication without rebuilding or repacking",
1241
+ description:
1242
+ "Resume exact journaled publication without rebuilding or repacking npm artifacts",
1086
1243
  },
1087
1244
  {
1088
1245
  flag: "--recover-attempt <id>",
@@ -1114,7 +1271,7 @@ export function showHelp(mode?: ICliMode): void {
1114
1271
  );
1115
1272
  console.log(" --npm Explicitly select the npm target");
1116
1273
  console.log(
1117
- " --docker Select Docker (fails closed under journal schema v1)",
1274
+ " --docker Select digest-qualified Docker publication through project-local tSDocker >= 3.5.1",
1118
1275
  );
1119
1276
  console.log(
1120
1277
  " --no-publish Remove npm and Docker without implicitly enabling Git",
@@ -1130,7 +1287,7 @@ export function showHelp(mode?: ICliMode): void {
1130
1287
  " inspect [version] Read one or all durable release journals without mutation",
1131
1288
  );
1132
1289
  console.log(
1133
- " resume <version> Resume exact Git/npm publication without rebuilding or repacking",
1290
+ " resume <version> Resume exact journaled publication without rebuilding or repacking npm artifacts",
1134
1291
  );
1135
1292
  console.log(
1136
1293
  " --recover-attempt Recover one exact 32-character hexadecimal attempt ID after proving its publisher stopped",
package/ts/plugins.ts CHANGED
@@ -2,7 +2,9 @@ import * as smartlog from '@push.rocks/smartlog';
2
2
  import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
3
3
  import * as smartconfig from '@push.rocks/smartconfig';
4
4
  import * as path from 'path';
5
+ import * as os from 'node:os';
5
6
  import * as fs from 'node:fs/promises';
7
+ import { constants as fsConstants } from 'node:fs';
6
8
  import * as crypto from 'node:crypto';
7
9
  import * as projectinfo from '@push.rocks/projectinfo';
8
10
  import * as smartcli from '@push.rocks/smartcli';
@@ -17,6 +19,21 @@ import * as smartinteract from '@push.rocks/smartinteract';
17
19
  import * as smartdelay from '@push.rocks/smartdelay';
18
20
  import * as smartbucket from '@push.rocks/smartbucket';
19
21
  import * as s3 from '@aws-sdk/client-s3';
22
+ import * as tsdockerReleaseProtocol from '@git.zone/tsdocker/dist_ts/classes.releaseprotocol.js';
23
+
24
+ export type {
25
+ IReleaseCapabilitiesResult,
26
+ IReleaseCleanupResult,
27
+ IReleaseDestinationEvidence,
28
+ IReleaseProbeResult,
29
+ IReleasePromotionContext,
30
+ IReleasePromotionResult,
31
+ IReleaseQualificationRequest,
32
+ IReleaseQualificationResult,
33
+ IReleaseValidationResult,
34
+ TReleasePromotionEvidence,
35
+ TReleaseProtocolCommand,
36
+ } from '@git.zone/tsdocker/dist_ts/interfaces/index.js';
20
37
 
21
38
  // Create smartfs instance for filesystem operations
22
39
  export const smartfs = new SmartFs(new SmartFsProviderNode());
@@ -26,7 +43,9 @@ export {
26
43
  smartlogDestinationLocal,
27
44
  smartconfig,
28
45
  path,
46
+ os,
29
47
  fs,
48
+ fsConstants,
30
49
  crypto,
31
50
  projectinfo,
32
51
  smartcli,
@@ -40,4 +59,5 @@ export {
40
59
  smartdelay,
41
60
  smartbucket,
42
61
  s3,
62
+ tsdockerReleaseProtocol,
43
63
  };