@intentius/chant 0.124.33 → 0.124.35

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 (218) hide show
  1. package/dist/cli/handlers/graph.js +2 -2
  2. package/dist/cli/handlers/pr.d.ts.map +1 -1
  3. package/dist/cli/handlers/pr.js +147 -51
  4. package/dist/cli/handlers/promote.d.ts.map +1 -1
  5. package/dist/cli/handlers/promote.js +284 -81
  6. package/dist/cli/handlers/release.d.ts +12 -0
  7. package/dist/cli/handlers/release.d.ts.map +1 -1
  8. package/dist/cli/handlers/release.js +125 -10
  9. package/dist/cli/handlers/run.d.ts +3 -1
  10. package/dist/cli/handlers/run.d.ts.map +1 -1
  11. package/dist/cli/handlers/run.js +12 -2
  12. package/dist/cli/main.d.ts.map +1 -1
  13. package/dist/cli/main.js +37 -2
  14. package/dist/cli/parse-args.d.ts.map +1 -1
  15. package/dist/cli/parse-args.js +24 -0
  16. package/dist/cli/registry.d.ts +17 -1
  17. package/dist/cli/registry.d.ts.map +1 -1
  18. package/dist/components/auto-release.d.ts +8 -1
  19. package/dist/components/auto-release.d.ts.map +1 -1
  20. package/dist/components/auto-release.js +3 -2
  21. package/dist/components/green-cover.d.ts +77 -0
  22. package/dist/components/green-cover.d.ts.map +1 -0
  23. package/dist/components/green-cover.js +153 -0
  24. package/dist/components/pr-pipeline.d.ts +34 -0
  25. package/dist/components/pr-pipeline.d.ts.map +1 -1
  26. package/dist/components/pr-pipeline.js +39 -5
  27. package/dist/components/promote-rounds.d.ts +102 -0
  28. package/dist/components/promote-rounds.d.ts.map +1 -0
  29. package/dist/components/promote-rounds.js +174 -0
  30. package/dist/components/promote.d.ts +4 -1
  31. package/dist/components/promote.d.ts.map +1 -1
  32. package/dist/components/promote.js +6 -3
  33. package/dist/components/release-gate.d.ts +30 -0
  34. package/dist/components/release-gate.d.ts.map +1 -1
  35. package/dist/components/release-gate.js +92 -42
  36. package/dist/components/release-promote.d.ts +9 -0
  37. package/dist/components/release-promote.d.ts.map +1 -1
  38. package/dist/components/release-promote.js +15 -0
  39. package/dist/config.d.ts +2 -0
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/deep-observation.d.ts +11 -0
  42. package/dist/deep-observation.d.ts.map +1 -1
  43. package/dist/graph-declared.d.ts +9 -1
  44. package/dist/graph-declared.d.ts.map +1 -1
  45. package/dist/graph-declared.js +18 -3
  46. package/dist/graph-detail.d.ts.map +1 -1
  47. package/dist/graph-detail.js +30 -1
  48. package/dist/graph-ir.d.ts.map +1 -1
  49. package/dist/graph-ir.js +13 -2
  50. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -1
  51. package/dist/lifecycle/__fixtures__/publish-fakes.js +5 -1
  52. package/dist/lifecycle/compose-refs.d.ts +52 -0
  53. package/dist/lifecycle/compose-refs.d.ts.map +1 -0
  54. package/dist/lifecycle/compose-refs.js +115 -0
  55. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  56. package/dist/lifecycle/deep-observe.js +3 -2
  57. package/dist/lifecycle/green-apply.d.ts +39 -0
  58. package/dist/lifecycle/green-apply.d.ts.map +1 -0
  59. package/dist/lifecycle/green-apply.js +51 -0
  60. package/dist/lifecycle/publish-declaration.d.ts +4 -0
  61. package/dist/lifecycle/publish-declaration.d.ts.map +1 -1
  62. package/dist/lifecycle/publish-declaration.js +15 -0
  63. package/dist/lifecycle/publish-npm.d.ts +7 -4
  64. package/dist/lifecycle/publish-npm.d.ts.map +1 -1
  65. package/dist/lifecycle/publish-npm.js +60 -13
  66. package/dist/lifecycle/release-compose.d.ts +91 -0
  67. package/dist/lifecycle/release-compose.d.ts.map +1 -0
  68. package/dist/lifecycle/release-compose.js +235 -0
  69. package/dist/lifecycle/release-cut.d.ts +8 -0
  70. package/dist/lifecycle/release-cut.d.ts.map +1 -1
  71. package/dist/lifecycle/release-cut.js +2 -0
  72. package/dist/lifecycle/release-publish.d.ts +2 -0
  73. package/dist/lifecycle/release-publish.d.ts.map +1 -1
  74. package/dist/lifecycle/release-publish.js +2 -1
  75. package/dist/lifecycle/release-store.d.ts +15 -0
  76. package/dist/lifecycle/release-store.d.ts.map +1 -1
  77. package/dist/lifecycle/release-store.js +5 -1
  78. package/dist/wave-runtime.mjs +226 -224
  79. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  80. package/dist/workspace/__fixtures__/contract-repo.js +13 -2
  81. package/dist/workspace/check.schema.json +20 -2
  82. package/dist/workspace/checks/ci-workflow.d.ts +17 -0
  83. package/dist/workspace/checks/ci-workflow.d.ts.map +1 -0
  84. package/dist/workspace/checks/ci-workflow.js +130 -0
  85. package/dist/workspace/checks/security.d.ts +16 -1
  86. package/dist/workspace/checks/security.d.ts.map +1 -1
  87. package/dist/workspace/checks/security.js +4 -4
  88. package/dist/workspace/checks.d.ts +1 -1
  89. package/dist/workspace/checks.d.ts.map +1 -1
  90. package/dist/workspace/checks.js +4 -1
  91. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  92. package/dist/workspace/ci-green-cli.js +5 -3
  93. package/dist/workspace/ci-green-workflow.d.ts +18 -2
  94. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  95. package/dist/workspace/ci-green-workflow.js +27 -5
  96. package/dist/workspace/ci-green.d.ts +31 -0
  97. package/dist/workspace/ci-green.d.ts.map +1 -1
  98. package/dist/workspace/ci-green.js +78 -4
  99. package/dist/workspace/ci-init.d.ts +100 -0
  100. package/dist/workspace/ci-init.d.ts.map +1 -0
  101. package/dist/workspace/ci-init.js +434 -0
  102. package/dist/workspace/ci-run.d.ts +6 -0
  103. package/dist/workspace/ci-run.d.ts.map +1 -1
  104. package/dist/workspace/ci-run.js +2 -1
  105. package/dist/workspace/ci-serve.d.ts +94 -13
  106. package/dist/workspace/ci-serve.d.ts.map +1 -1
  107. package/dist/workspace/ci-serve.js +248 -30
  108. package/dist/workspace/ci-workflow.d.ts +91 -0
  109. package/dist/workspace/ci-workflow.d.ts.map +1 -0
  110. package/dist/workspace/ci-workflow.js +33 -0
  111. package/dist/workspace/declaration.d.ts +18 -0
  112. package/dist/workspace/declaration.d.ts.map +1 -1
  113. package/dist/workspace/declaration.js +9 -2
  114. package/dist/workspace/declaration.schema.json +28 -0
  115. package/dist/workspace/delivery-metrics.d.ts +3 -1
  116. package/dist/workspace/delivery-metrics.d.ts.map +1 -1
  117. package/dist/workspace/delivery-metrics.js +12 -3
  118. package/dist/workspace/init.js +2 -2
  119. package/dist/workspace/member-commands.d.ts.map +1 -1
  120. package/dist/workspace/member-commands.js +4 -0
  121. package/dist/workspace/nested-graph.d.ts.map +1 -1
  122. package/dist/workspace/nested-graph.js +1 -0
  123. package/dist/workspace/reason-codes.d.ts +9 -0
  124. package/dist/workspace/reason-codes.d.ts.map +1 -1
  125. package/dist/workspace/reason-codes.js +10 -0
  126. package/dist/workspace/release-candidates.d.ts +28 -0
  127. package/dist/workspace/release-candidates.d.ts.map +1 -1
  128. package/dist/workspace/release-candidates.js +38 -2
  129. package/dist/workspace/release-candidates.schema.json +51 -0
  130. package/dist/workspace/release-workflow.d.ts +31 -0
  131. package/dist/workspace/release-workflow.d.ts.map +1 -0
  132. package/dist/workspace/release-workflow.js +150 -0
  133. package/dist/workspace/releases.schema.json +30 -0
  134. package/package.json +1 -1
  135. package/src/cli/handlers/graph.ts +2 -2
  136. package/src/cli/handlers/pr-green.test.ts +230 -0
  137. package/src/cli/handlers/pr.ts +148 -66
  138. package/src/cli/handlers/promote.test.ts +34 -0
  139. package/src/cli/handlers/promote.ts +302 -91
  140. package/src/cli/handlers/release-compose.e2e.test.ts +133 -0
  141. package/src/cli/handlers/release.ts +112 -10
  142. package/src/cli/handlers/run.ts +12 -1
  143. package/src/cli/main.ts +37 -2
  144. package/src/cli/parse-args.ts +18 -0
  145. package/src/cli/registry.ts +17 -1
  146. package/src/codegen/release-wiring.test.ts +56 -9
  147. package/src/components/auto-release.test.ts +22 -0
  148. package/src/components/auto-release.ts +9 -2
  149. package/src/components/green-cover.test.ts +170 -0
  150. package/src/components/green-cover.ts +186 -0
  151. package/src/components/pr-pipeline.test.ts +14 -4
  152. package/src/components/pr-pipeline.ts +56 -5
  153. package/src/components/promote-rounds.test.ts +220 -0
  154. package/src/components/promote-rounds.ts +232 -0
  155. package/src/components/promote.test.ts +7 -0
  156. package/src/components/promote.ts +9 -4
  157. package/src/components/release-gate.test.ts +47 -0
  158. package/src/components/release-gate.ts +111 -46
  159. package/src/components/release-promote.test.ts +24 -1
  160. package/src/components/release-promote.ts +15 -0
  161. package/src/deep-observation.ts +8 -0
  162. package/src/graph-declared-exports.test.ts +40 -0
  163. package/src/graph-declared.test.ts +18 -0
  164. package/src/graph-declared.ts +17 -2
  165. package/src/graph-detail.test.ts +68 -1
  166. package/src/graph-detail.ts +29 -1
  167. package/src/graph-ir.ts +12 -4
  168. package/src/lifecycle/__fixtures__/publish-fakes.ts +5 -1
  169. package/src/lifecycle/compose-refs.ts +125 -0
  170. package/src/lifecycle/deep-observe.test.ts +20 -0
  171. package/src/lifecycle/deep-observe.ts +4 -2
  172. package/src/lifecycle/green-apply.ts +71 -0
  173. package/src/lifecycle/publish-declaration.ts +15 -0
  174. package/src/lifecycle/publish-npm.ts +55 -13
  175. package/src/lifecycle/publish-targets.test.ts +45 -0
  176. package/src/lifecycle/release-compose.test.ts +125 -0
  177. package/src/lifecycle/release-compose.ts +312 -0
  178. package/src/lifecycle/release-cut.ts +6 -0
  179. package/src/lifecycle/release-publish.ts +4 -1
  180. package/src/lifecycle/release-store.ts +16 -1
  181. package/src/workspace/__fixtures__/contract-repo.ts +11 -2
  182. package/src/workspace/check-contract.test.ts +3 -2
  183. package/src/workspace/check.schema.json +20 -2
  184. package/src/workspace/checks/ci-workflow.test.ts +160 -0
  185. package/src/workspace/checks/ci-workflow.ts +135 -0
  186. package/src/workspace/checks/security.ts +4 -4
  187. package/src/workspace/checks.ts +4 -1
  188. package/src/workspace/ci-green-cli.ts +5 -3
  189. package/src/workspace/ci-green-workflow.test.ts +52 -0
  190. package/src/workspace/ci-green-workflow.ts +34 -5
  191. package/src/workspace/ci-green.test.ts +33 -0
  192. package/src/workspace/ci-green.ts +85 -4
  193. package/src/workspace/ci-init.test.ts +159 -0
  194. package/src/workspace/ci-init.ts +445 -0
  195. package/src/workspace/ci-report-url.test.ts +6 -1
  196. package/src/workspace/ci-run.test.ts +18 -13
  197. package/src/workspace/ci-run.ts +8 -1
  198. package/src/workspace/ci-serve-land.e2e.test.ts +138 -0
  199. package/src/workspace/ci-serve-land.test.ts +176 -0
  200. package/src/workspace/ci-serve.test.ts +77 -43
  201. package/src/workspace/ci-serve.ts +268 -34
  202. package/src/workspace/ci-workflow.ts +71 -0
  203. package/src/workspace/declaration.schema.json +28 -0
  204. package/src/workspace/declaration.ts +32 -3
  205. package/src/workspace/delivery-metrics.ts +12 -3
  206. package/src/workspace/graph-contract.test.ts +3 -2
  207. package/src/workspace/init.ts +2 -2
  208. package/src/workspace/member-commands.test.ts +11 -4
  209. package/src/workspace/member-commands.ts +3 -0
  210. package/src/workspace/nested-graph.test.ts +4 -0
  211. package/src/workspace/nested-graph.ts +1 -0
  212. package/src/workspace/reason-codes.test.ts +2 -0
  213. package/src/workspace/reason-codes.ts +10 -0
  214. package/src/workspace/release-candidates.schema.json +51 -0
  215. package/src/workspace/release-candidates.test.ts +30 -3
  216. package/src/workspace/release-candidates.ts +54 -2
  217. package/src/workspace/release-workflow.ts +167 -0
  218. package/src/workspace/releases.schema.json +30 -0
@@ -0,0 +1,167 @@
1
+ /**
2
+ * `chant release workflow` (#4168 step 6): the publish workflow, generated
3
+ * the way `chant ci workflow` writes the tick, where the guides used to have
4
+ * one pasted (guide/release-from-workstation.mdx).
5
+ *
6
+ * The job runs on a `release/**` tag, checks the tag out, fetches the ci tags
7
+ * and `chant/lifecycle`, builds what the targets upload, and runs `chant
8
+ * release publish` for the label the tag names. The security groups decide
9
+ * the rest, and nothing is on without one (#4168 section 8):
10
+ *
11
+ * - `supply-chain` adds `--require-provenance`, so a run with no OIDC token
12
+ * fails rather than publishing without provenance.
13
+ * - `verified-releases` adds a `chant release verify` step before the publish.
14
+ *
15
+ * The OIDC permission (`id-token: write`, or GitLab's `id_tokens`) is always
16
+ * there: it costs nothing, and with it what the job uploads carries
17
+ * provenance whether or not the group requires it.
18
+ */
19
+ import { GENERATED_MARKER } from "../discovery/files";
20
+ import type { SecurityGroup } from "./security";
21
+
22
+ export const RELEASE_WORKFLOW_FORGES = ["github", "forgejo", "gitlab"] as const;
23
+ export type ReleaseWorkflowForge = (typeof RELEASE_WORKFLOW_FORGES)[number];
24
+
25
+ /** Where each forge's publish workflow is written, relative to the repository root. */
26
+ export const RELEASE_WORKFLOW_FILES: Record<ReleaseWorkflowForge, string> = {
27
+ github: ".github/workflows/chant-release.yml",
28
+ forgejo: ".forgejo/workflows/chant-release.yml",
29
+ // GitLab reads one .gitlab-ci.yml, which includes this file: `include: { local: .gitlab/chant-release.yml }`.
30
+ gitlab: ".gitlab/chant-release.yml",
31
+ };
32
+
33
+ export interface ReleaseWorkflowInput {
34
+ forge: ReleaseWorkflowForge;
35
+ /** The security groups the workspace opts into at its root. */
36
+ groups: ReadonlySet<SecurityGroup>;
37
+ /** The command that installs what the build needs. Default `npm ci`. */
38
+ install?: string;
39
+ /** The command that builds what the targets upload, or none. Default `npm run build`. */
40
+ build?: string | null;
41
+ /** What runs chant. Default `npx chant`. */
42
+ chant?: string;
43
+ /** The workspace root relative to the repository root, `.` at the top. */
44
+ workspaceRoot?: string;
45
+ }
46
+
47
+ /** The flags `chant release publish` gets under the groups. */
48
+ export function publishFlags(groups: ReadonlySet<SecurityGroup>): string[] {
49
+ return [...(groups.has("supply-chain") ? ["--require-provenance"] : []), "--yes"];
50
+ }
51
+
52
+ /** The workflow file's text, without the generated-by header. */
53
+ export function renderReleaseWorkflow(input: ReleaseWorkflowInput): string {
54
+ const chant = input.chant ?? "npx chant";
55
+ const install = input.install ?? "npm ci";
56
+ const build = input.build === undefined ? "npm run build" : input.build;
57
+ const root = input.workspaceRoot && input.workspaceRoot !== "." ? input.workspaceRoot : null;
58
+ const verify = input.groups.has("verified-releases");
59
+ const flags = publishFlags(input.groups).join(" ");
60
+ if (input.forge === "gitlab") {
61
+ const label = '"${CI_COMMIT_TAG#release/}"';
62
+ const lines = [
63
+ "chant-release-publish:",
64
+ " rules:",
65
+ " - if: $CI_COMMIT_TAG =~ /^release\\//",
66
+ " id_tokens:",
67
+ " SIGSTORE_ID_TOKEN:",
68
+ " aud: sigstore",
69
+ " script:",
70
+ ...(root ? [` - cd ${root}`] : []),
71
+ ` - ${install}`,
72
+ ...(build ? [` - ${build}`] : []),
73
+ " - git fetch origin 'refs/tags/ci/*:refs/tags/ci/*'",
74
+ " - git fetch origin chant/lifecycle:chant/lifecycle",
75
+ ...(verify ? [` - ${chant} release verify ${label}`] : []),
76
+ ` - ${chant} release publish ${label} ${flags}`,
77
+ ];
78
+ return `${lines.join("\n")}\n`;
79
+ }
80
+ const label = '"${GITHUB_REF_NAME#release/}"';
81
+ const lines = [
82
+ "name: chant release publish",
83
+ "on:",
84
+ " push:",
85
+ ' tags: ["release/**"]',
86
+ "permissions:",
87
+ " contents: write",
88
+ " id-token: write",
89
+ "jobs:",
90
+ " publish:",
91
+ " runs-on: ubuntu-latest",
92
+ ...(root ? [" defaults:", " run:", ` working-directory: ${root}`] : []),
93
+ " steps:",
94
+ " - uses: actions/checkout@v4",
95
+ " with:",
96
+ " fetch-depth: 0",
97
+ " - uses: actions/setup-node@v4",
98
+ " with:",
99
+ " node-version: 24",
100
+ " registry-url: https://registry.npmjs.org",
101
+ ` - run: ${install}`,
102
+ ...(build ? [` - run: ${build}`] : []),
103
+ " - run: git fetch origin 'refs/tags/ci/*:refs/tags/ci/*'",
104
+ " - run: git fetch origin chant/lifecycle:chant/lifecycle",
105
+ ...(verify ? [` - run: ${chant} release verify ${label}`] : []),
106
+ ` - run: ${chant} release publish ${label} ${flags}`,
107
+ ];
108
+ return `${lines.join("\n")}\n`;
109
+ }
110
+
111
+ /** The header that marks the file generated, naming the command that regenerates it. */
112
+ export function releaseWorkflowHeader(command: string): string {
113
+ return `# ${GENERATED_MARKER}. Regenerate with: ${command} (in the workspace root)\n`;
114
+ }
115
+
116
+ /**
117
+ * `chant release workflow [--forge github|gitlab|forgejo] [--install <command>]
118
+ * [--build <command>|--no-build] [--chant <command>] [--output <file>]`: write
119
+ * the publish workflow for the workspace's forge, under its security groups.
120
+ */
121
+ export async function runReleaseWorkflow(ctx: import("../cli/registry").CommandContext): Promise<number> {
122
+ const { existsSync, mkdirSync, realpathSync, writeFileSync } = await import("node:fs");
123
+ const { dirname, join, relative, resolve, sep } = await import("node:path");
124
+ const { formatError, formatSuccess } = await import("../cli/format");
125
+ const { findWorkspaceRoot } = await import("../project-root");
126
+ const { gitTop } = await import("./tree");
127
+ const { securityGroupsAt } = await import("./security");
128
+ const { shellArg } = await import("./member-pipeline");
129
+ const usage = "chant release workflow [--forge github|gitlab|forgejo] [--install <command>] [--build <command>] [--chant <command>] [--output <file>]";
130
+ const { args } = ctx;
131
+ const found = findWorkspaceRoot(process.cwd());
132
+ if (!found) {
133
+ console.error(formatError({ message: "no chant.workspace.json between this directory and the git root", hint: usage }));
134
+ return 1;
135
+ }
136
+ const root = realpathSync(found.dir);
137
+ const repoRoot = gitTop(root) ?? root;
138
+ const forge = (args.forge ??
139
+ (existsSync(join(repoRoot, ".github", "workflows")) ? "github" : existsSync(join(repoRoot, ".forgejo", "workflows")) ? "forgejo" : existsSync(join(repoRoot, ".gitlab-ci.yml")) ? "gitlab" : "github")) as ReleaseWorkflowForge;
140
+ if (!(RELEASE_WORKFLOW_FORGES as readonly string[]).includes(forge)) {
141
+ console.error(formatError({ message: `--forge ${JSON.stringify(forge)} is not one of ${RELEASE_WORKFLOW_FORGES.join(", ")}`, hint: usage }));
142
+ return 1;
143
+ }
144
+ const groups = securityGroupsAt(root);
145
+ const workspaceRoot = relative(repoRoot, root).split(sep).join("/") || ".";
146
+ const text = renderReleaseWorkflow({
147
+ forge,
148
+ groups,
149
+ workspaceRoot,
150
+ ...(args.ciInstall ? { install: args.ciInstall } : {}),
151
+ ...(args.buildCommand ? { build: args.buildCommand } : {}),
152
+ ...(args.ciChant ? { chant: args.ciChant } : {}),
153
+ });
154
+ const target = args.output ? resolve(process.cwd(), args.output) : join(repoRoot, RELEASE_WORKFLOW_FILES[forge]);
155
+ const parts = ["chant", "release", "workflow", "--forge", forge];
156
+ if (args.ciInstall) parts.push("--install", args.ciInstall);
157
+ if (args.buildCommand) parts.push("--build", args.buildCommand);
158
+ if (args.ciChant) parts.push("--chant", args.ciChant);
159
+ if (args.output) parts.push("--output", relative(root, target).split(sep).join("/"));
160
+ mkdirSync(dirname(target), { recursive: true });
161
+ writeFileSync(target, releaseWorkflowHeader(parts.map(shellArg).join(" ")) + text);
162
+ const shown = relative(process.cwd(), target).split(sep).join("/") || target;
163
+ const extras = [groups.has("supply-chain") ? "requires OIDC provenance (supply-chain)" : null, groups.has("verified-releases") ? "verifies the release first (verified-releases)" : null].filter(Boolean);
164
+ console.log(formatSuccess(`Wrote ${shown}: publishes the release a release/** tag names${extras.length > 0 ? `, and ${extras.join(" and ")}` : ""}.`));
165
+ if (forge === "gitlab") console.log(`Include it from .gitlab-ci.yml: include: [{ local: ${RELEASE_WORKFLOW_FILES.gitlab} }]`);
166
+ return 0;
167
+ }
@@ -363,6 +363,36 @@
363
363
  "type": "string"
364
364
  }
365
365
  }
366
+ },
367
+ "composed": {
368
+ "type": "object",
369
+ "required": [
370
+ "branch",
371
+ "base",
372
+ "sources"
373
+ ],
374
+ "properties": {
375
+ "branch": {
376
+ "type": [
377
+ "string",
378
+ "null"
379
+ ]
380
+ },
381
+ "base": {
382
+ "type": "string"
383
+ },
384
+ "sources": {
385
+ "type": "array",
386
+ "items": {
387
+ "type": "string"
388
+ }
389
+ }
390
+ },
391
+ "description": "Added by #4168 4.3, written by chant 0.124.35 and newer. On a cut of a composed commit only: its chant/compose/<name> branch, the trunk commit it was composed on, and the trunk commits picked onto that base, oldest first."
392
+ },
393
+ "channel": {
394
+ "type": "string",
395
+ "description": "Added by #4168 4.3, written by chant 0.124.35 and newer. The tag release publish moves in place of latest (an npm dist-tag, an image tag), from release cut --channel. Absent for latest."
366
396
  }
367
397
  }
368
398
  },