@codefresh-io/gitops-release 0.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 (98) hide show
  1. package/README.md +397 -0
  2. package/dist/commands/cherry-pick.d.ts +14 -0
  3. package/dist/commands/cherry-pick.d.ts.map +1 -0
  4. package/dist/commands/cherry-pick.js +337 -0
  5. package/dist/commands/cherry-pick.js.map +1 -0
  6. package/dist/commands/cherry-pick.test.d.ts +2 -0
  7. package/dist/commands/cherry-pick.test.d.ts.map +1 -0
  8. package/dist/commands/cherry-pick.test.js +377 -0
  9. package/dist/commands/cherry-pick.test.js.map +1 -0
  10. package/dist/commands/completion.d.ts +11 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +195 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/completion.test.d.ts +2 -0
  15. package/dist/commands/completion.test.d.ts.map +1 -0
  16. package/dist/commands/completion.test.js +142 -0
  17. package/dist/commands/completion.test.js.map +1 -0
  18. package/dist/commands/create.d.ts +15 -0
  19. package/dist/commands/create.d.ts.map +1 -0
  20. package/dist/commands/create.js +107 -0
  21. package/dist/commands/create.js.map +1 -0
  22. package/dist/commands/create.test.d.ts +2 -0
  23. package/dist/commands/create.test.d.ts.map +1 -0
  24. package/dist/commands/create.test.js +274 -0
  25. package/dist/commands/create.test.js.map +1 -0
  26. package/dist/commands/list.d.ts +14 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +69 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/notes.d.ts +15 -0
  31. package/dist/commands/notes.d.ts.map +1 -0
  32. package/dist/commands/notes.js +374 -0
  33. package/dist/commands/notes.js.map +1 -0
  34. package/dist/commands/publish.d.ts +14 -0
  35. package/dist/commands/publish.d.ts.map +1 -0
  36. package/dist/commands/publish.js +220 -0
  37. package/dist/commands/publish.js.map +1 -0
  38. package/dist/commands/publish.test.d.ts +2 -0
  39. package/dist/commands/publish.test.d.ts.map +1 -0
  40. package/dist/commands/publish.test.js +371 -0
  41. package/dist/commands/publish.test.js.map +1 -0
  42. package/dist/commands/status.d.ts +8 -0
  43. package/dist/commands/status.d.ts.map +1 -0
  44. package/dist/commands/status.js +258 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/context.d.ts +35 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/context.js +48 -0
  49. package/dist/context.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +152 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/output/formatter.d.ts +161 -0
  55. package/dist/output/formatter.d.ts.map +1 -0
  56. package/dist/output/formatter.js +398 -0
  57. package/dist/output/formatter.js.map +1 -0
  58. package/dist/output/formatter.test.d.ts +2 -0
  59. package/dist/output/formatter.test.d.ts.map +1 -0
  60. package/dist/output/formatter.test.js +223 -0
  61. package/dist/output/formatter.test.js.map +1 -0
  62. package/dist/services/ai.d.ts +69 -0
  63. package/dist/services/ai.d.ts.map +1 -0
  64. package/dist/services/ai.js +235 -0
  65. package/dist/services/ai.js.map +1 -0
  66. package/dist/services/ai.test.d.ts +2 -0
  67. package/dist/services/ai.test.d.ts.map +1 -0
  68. package/dist/services/ai.test.js +101 -0
  69. package/dist/services/ai.test.js.map +1 -0
  70. package/dist/services/github.d.ts +200 -0
  71. package/dist/services/github.d.ts.map +1 -0
  72. package/dist/services/github.js +465 -0
  73. package/dist/services/github.js.map +1 -0
  74. package/dist/services/github.test.d.ts +2 -0
  75. package/dist/services/github.test.d.ts.map +1 -0
  76. package/dist/services/github.test.js +64 -0
  77. package/dist/services/github.test.js.map +1 -0
  78. package/dist/services/version.d.ts +106 -0
  79. package/dist/services/version.d.ts.map +1 -0
  80. package/dist/services/version.js +158 -0
  81. package/dist/services/version.js.map +1 -0
  82. package/dist/services/version.test.d.ts +2 -0
  83. package/dist/services/version.test.d.ts.map +1 -0
  84. package/dist/services/version.test.js +136 -0
  85. package/dist/services/version.test.js.map +1 -0
  86. package/dist/utils/errors.d.ts +66 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +154 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/errors.test.d.ts +2 -0
  91. package/dist/utils/errors.test.d.ts.map +1 -0
  92. package/dist/utils/errors.test.js +147 -0
  93. package/dist/utils/errors.test.js.map +1 -0
  94. package/dist/utils/prompts.d.ts +54 -0
  95. package/dist/utils/prompts.d.ts.map +1 -0
  96. package/dist/utils/prompts.js +108 -0
  97. package/dist/utils/prompts.js.map +1 -0
  98. package/package.json +70 -0
@@ -0,0 +1,258 @@
1
+ // ABOUTME: Status command that shows release status, PRs, drafts, and pipelines.
2
+ // ABOUTME: Supports overview mode (all releases) and specific version mode.
3
+ import { parseVersion, formatStableBranch, formatPrepBranch, formatReleaseTag, ensureFullVersion, extractPatchFromTag, } from "../services/version.js";
4
+ /**
5
+ * Prepare-release label that triggers the promote pipeline on merge.
6
+ */
7
+ const PREPARE_RELEASE_LABEL = "prepare-release";
8
+ /**
9
+ * Executes the status command.
10
+ * If version is provided, shows status for that specific version.
11
+ * Otherwise, shows an overview of all active releases.
12
+ */
13
+ export async function statusCommand(ctx, version) {
14
+ if (version) {
15
+ await showVersionStatus(ctx, version);
16
+ }
17
+ else {
18
+ await showOverviewStatus(ctx);
19
+ }
20
+ }
21
+ /**
22
+ * Shows status overview for all active releases.
23
+ */
24
+ async function showOverviewStatus(ctx) {
25
+ const { github, formatter } = ctx;
26
+ const spinner = formatter.spinner("Fetching release status...");
27
+ spinner.start();
28
+ // Fetch data in parallel
29
+ const [branches, allPRs, releases] = await Promise.all([
30
+ github.listBranches("^stable/"),
31
+ github.listPullRequests({ state: "open" }),
32
+ github.listReleases(true),
33
+ ]);
34
+ // Filter prepare-release PRs
35
+ const prepareReleasePRs = allPRs.filter((pr) => pr.labels.includes(PREPARE_RELEASE_LABEL));
36
+ // Get checks for each prepare-release PR
37
+ const prChecks = await Promise.all(prepareReleasePRs.map(async (pr) => {
38
+ const checks = await github.getCommitChecks(pr.headBranch);
39
+ return { pr, checks };
40
+ }));
41
+ spinner.stop();
42
+ // Separate draft and published releases
43
+ const draftReleases = releases.filter((r) => r.draft);
44
+ const publishedReleases = releases.filter((r) => !r.draft).slice(0, 5);
45
+ // Handle JSON output
46
+ if (formatter.isJsonMode()) {
47
+ const jsonOutput = {
48
+ stableBranches: branches.map((b) => {
49
+ const majorMinor = b.name.replace("stable/", "");
50
+ const relatedRelease = releases.find((r) => r.tag.startsWith(majorMinor + "."));
51
+ return {
52
+ name: b.name,
53
+ sha: b.sha,
54
+ latestRelease: relatedRelease?.tag ?? null,
55
+ releaseStatus: relatedRelease ? (relatedRelease.draft ? "draft" : "published") : null,
56
+ };
57
+ }),
58
+ openPrepareReleasePRs: prChecks.map(({ pr, checks }) => ({
59
+ number: pr.number,
60
+ title: pr.title,
61
+ headBranch: pr.headBranch,
62
+ baseBranch: pr.baseBranch,
63
+ url: pr.url,
64
+ checksStatus: formatter.checksStatusLabel(checks),
65
+ readyToMerge: checks.allPassing && pr.labels.includes(PREPARE_RELEASE_LABEL),
66
+ })),
67
+ draftReleases: draftReleases.map((r) => ({
68
+ tag: r.tag,
69
+ name: r.name,
70
+ url: r.url,
71
+ createdAt: r.publishedAt,
72
+ })),
73
+ recentPublishedReleases: publishedReleases.map((r) => ({
74
+ tag: r.tag,
75
+ publishedAt: r.publishedAt,
76
+ url: r.url,
77
+ })),
78
+ };
79
+ formatter.json(jsonOutput);
80
+ return;
81
+ }
82
+ // Human-readable output
83
+ const repo = github.getRepo();
84
+ formatter.header(`Release Status for ${repo.owner}/${repo.repo}`);
85
+ // Stable Branches section
86
+ formatter.section("Stable Branches");
87
+ if (branches.length === 0) {
88
+ formatter.text(" No stable branches found");
89
+ }
90
+ else {
91
+ for (const branch of branches) {
92
+ const majorMinor = branch.name.replace("stable/", "");
93
+ const relatedRelease = releases.find((r) => r.tag.startsWith(majorMinor + "."));
94
+ const releaseInfo = relatedRelease
95
+ ? `latest: ${relatedRelease.tag} (${relatedRelease.draft ? "draft" : "published"})`
96
+ : "no releases";
97
+ formatter.text(` ${branch.name} ${releaseInfo}`);
98
+ }
99
+ }
100
+ // Open Prepare-Release PRs section
101
+ formatter.section("Open Prepare-Release PRs");
102
+ if (prepareReleasePRs.length === 0) {
103
+ formatter.text(" No open prepare-release PRs");
104
+ }
105
+ else {
106
+ for (const { pr, checks } of prChecks) {
107
+ const checksSymbol = formatter.checksSymbol(checks);
108
+ const isReady = checks.allPassing && pr.labels.includes(PREPARE_RELEASE_LABEL);
109
+ const readyText = isReady ? "Ready to publish"
110
+ : checks.pending > 0 ? "Checks running"
111
+ : "Checks failing";
112
+ formatter.text(` #${pr.number} ${pr.headBranch} → ${pr.baseBranch} ${checksSymbol} ${readyText}`);
113
+ }
114
+ }
115
+ // Draft Releases section
116
+ formatter.section("Draft Releases");
117
+ if (draftReleases.length === 0) {
118
+ formatter.text(" No draft releases");
119
+ }
120
+ else {
121
+ for (const release of draftReleases) {
122
+ const timeAgo = release.publishedAt ? formatter.relativeTime(release.publishedAt) : "unknown";
123
+ formatter.text(` ${release.tag} Created ${timeAgo}`);
124
+ }
125
+ }
126
+ // Recent Published Releases section
127
+ formatter.section("Recent Published Releases");
128
+ if (publishedReleases.length === 0) {
129
+ formatter.text(" No published releases");
130
+ }
131
+ else {
132
+ for (const release of publishedReleases) {
133
+ formatter.text(` ${release.tag} Published ${formatter.shortDate(release.publishedAt)}`);
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Shows detailed status for a specific version.
139
+ */
140
+ async function showVersionStatus(ctx, versionInput) {
141
+ const { github, formatter } = ctx;
142
+ // Parse version - accept both 0.27 and 0.27.0
143
+ const version = parseVersion(versionInput);
144
+ const stableBranchName = formatStableBranch(version);
145
+ const spinner = formatter.spinner(`Fetching status for ${versionInput}...`);
146
+ spinner.start();
147
+ // Fetch branch info
148
+ const branch = await github.getBranch(stableBranchName);
149
+ // Find the latest tag for this version to determine patch number
150
+ const releases = await github.listReleases(true);
151
+ const versionPrefix = `${version.major}.${version.minor}.`;
152
+ const relatedReleases = releases.filter((r) => r.tag.startsWith(versionPrefix));
153
+ // Determine the target version (latest patch or .0 if no releases)
154
+ const targetVersion = relatedReleases.length > 0
155
+ ? { ...version, patch: extractPatchFromTag(relatedReleases[0].tag) }
156
+ : ensureFullVersion(version);
157
+ const fullVersion = ensureFullVersion(targetVersion);
158
+ const prepBranchName = formatPrepBranch(fullVersion);
159
+ const releaseTag = formatReleaseTag(fullVersion);
160
+ // Find prepare-release PR
161
+ const pr = await github.findPullRequestByHead(prepBranchName);
162
+ // Get checks if PR exists
163
+ let checks = null;
164
+ if (pr) {
165
+ checks = await github.getCommitChecks(pr.headBranch);
166
+ }
167
+ // Find draft release
168
+ const draftRelease = releases.find((r) => r.tag === releaseTag && r.draft);
169
+ spinner.stop();
170
+ // Determine if ready to publish
171
+ const readyToPublish = pr !== null &&
172
+ pr.labels.includes(PREPARE_RELEASE_LABEL) &&
173
+ checks !== null &&
174
+ checks.allPassing;
175
+ // Handle JSON output
176
+ if (formatter.isJsonMode()) {
177
+ const jsonOutput = {
178
+ version: versionInput,
179
+ branch: {
180
+ name: stableBranchName,
181
+ exists: branch !== null,
182
+ sha: branch?.sha ?? null,
183
+ },
184
+ prepareReleasePR: pr
185
+ ? {
186
+ number: pr.number,
187
+ title: pr.title,
188
+ url: pr.url,
189
+ state: pr.state,
190
+ mergeable: pr.mergeable,
191
+ checksPassing: checks?.allPassing ?? false,
192
+ labels: pr.labels,
193
+ }
194
+ : null,
195
+ draftRelease: draftRelease
196
+ ? {
197
+ tag: draftRelease.tag,
198
+ name: draftRelease.name,
199
+ draft: draftRelease.draft,
200
+ url: draftRelease.url,
201
+ }
202
+ : null,
203
+ readyToPublish,
204
+ };
205
+ formatter.json(jsonOutput);
206
+ return;
207
+ }
208
+ // Human-readable output
209
+ formatter.header(`Release Status: ${versionInput}`);
210
+ formatter.newline();
211
+ // Branch status
212
+ formatter.keyValue("Branch", `${stableBranchName} (${branch ? "exists" : "not found"})`);
213
+ if (relatedReleases.length > 0) {
214
+ formatter.keyValue("Latest", relatedReleases[0].tag);
215
+ }
216
+ formatter.newline();
217
+ // Prepare-Release PR section
218
+ formatter.section("Prepare-Release PR");
219
+ if (pr) {
220
+ formatter.text(` #${pr.number} ${pr.headBranch} → ${pr.baseBranch}`);
221
+ if (checks) {
222
+ formatter.text(` Status: ${formatter.status(formatter.checksStatusLabel(checks))}`);
223
+ }
224
+ formatter.text(` URL: ${pr.url}`);
225
+ }
226
+ else {
227
+ formatter.text(" No prepare-release PR found");
228
+ }
229
+ // Draft Release section
230
+ if (draftRelease) {
231
+ formatter.section("Draft Release");
232
+ const timeAgo = draftRelease.publishedAt
233
+ ? formatter.relativeTime(draftRelease.publishedAt)
234
+ : "unknown";
235
+ formatter.text(` ${draftRelease.tag} Created ${timeAgo}`);
236
+ formatter.text(` URL: ${draftRelease.url}`);
237
+ }
238
+ else {
239
+ formatter.section("Draft Release");
240
+ formatter.text(" No draft release found");
241
+ }
242
+ // Ready to publish?
243
+ formatter.newline();
244
+ formatter.keyValue("Ready to publish?", formatter.yesNo(readyToPublish));
245
+ if (readyToPublish) {
246
+ formatter.text(` Run: gitops-release publish ${releaseTag}`);
247
+ }
248
+ else if (!branch) {
249
+ formatter.text(` Create the stable branch first: gitops-release create ${version.major}.${version.minor}`);
250
+ }
251
+ else if (!pr) {
252
+ formatter.text(" Waiting for prepare-release pipeline to create PR");
253
+ }
254
+ else if (checks && !checks.allPassing) {
255
+ formatter.text(" PR checks must pass before publishing");
256
+ }
257
+ }
258
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { GitHubService } from "./services/github.js";
2
+ import { Formatter } from "./output/formatter.js";
3
+ /**
4
+ * Global options passed from the CLI.
5
+ */
6
+ export interface GlobalOptions {
7
+ repo: string;
8
+ json: boolean;
9
+ quiet: boolean;
10
+ verbose: boolean;
11
+ noColor?: boolean;
12
+ }
13
+ /**
14
+ * Command context containing initialized services.
15
+ */
16
+ export interface CommandContext {
17
+ github: GitHubService;
18
+ formatter: Formatter;
19
+ options: GlobalOptions;
20
+ }
21
+ /**
22
+ * Validates that GITHUB_TOKEN is set and returns it.
23
+ */
24
+ export declare function requireGitHubToken(): string;
25
+ /**
26
+ * Creates a command context from global options.
27
+ * Initializes GitHub service and formatter.
28
+ */
29
+ export declare function createContext(options: GlobalOptions): CommandContext;
30
+ /**
31
+ * Creates a formatter without requiring GitHub authentication.
32
+ * Useful for commands that don't need GitHub access.
33
+ */
34
+ export declare function createFormatterOnly(options: GlobalOptions): Formatter;
35
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAkC,MAAM,uBAAuB,CAAC;AAGlF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAS3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAepE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CASrE"}
@@ -0,0 +1,48 @@
1
+ // ABOUTME: Shared context for CLI commands containing services and utilities.
2
+ // ABOUTME: Provides a single point of initialization for GitHub service and formatter.
3
+ import { GitHubService } from "./services/github.js";
4
+ import { createFormatter } from "./output/formatter.js";
5
+ import { ValidationError } from "./utils/errors.js";
6
+ /**
7
+ * Validates that GITHUB_TOKEN is set and returns it.
8
+ */
9
+ export function requireGitHubToken() {
10
+ const token = process.env.GITHUB_TOKEN;
11
+ if (!token) {
12
+ throw new ValidationError("GITHUB_TOKEN environment variable is required.\n" +
13
+ "Create a token at https://github.com/settings/tokens with 'repo' scope.");
14
+ }
15
+ return token;
16
+ }
17
+ /**
18
+ * Creates a command context from global options.
19
+ * Initializes GitHub service and formatter.
20
+ */
21
+ export function createContext(options) {
22
+ const token = requireGitHubToken();
23
+ const outputOptions = {
24
+ json: options.json,
25
+ quiet: options.quiet,
26
+ verbose: options.verbose,
27
+ noColor: options.noColor,
28
+ };
29
+ return {
30
+ github: new GitHubService(token, options.repo),
31
+ formatter: createFormatter(outputOptions),
32
+ options,
33
+ };
34
+ }
35
+ /**
36
+ * Creates a formatter without requiring GitHub authentication.
37
+ * Useful for commands that don't need GitHub access.
38
+ */
39
+ export function createFormatterOnly(options) {
40
+ const outputOptions = {
41
+ json: options.json,
42
+ quiet: options.quiet,
43
+ verbose: options.verbose,
44
+ noColor: options.noColor,
45
+ };
46
+ return createFormatter(outputOptions);
47
+ }
48
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uFAAuF;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAa,eAAe,EAAiB,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAsBpD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CACvB,kDAAkD;YAChD,yEAAyE,CAC5E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IAEnC,MAAM,aAAa,GAAkB;QACnC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;QAC9C,SAAS,EAAE,eAAe,CAAC,aAAa,CAAC;QACzC,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,aAAa,GAAkB;QACnC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { GlobalOptions } from "./context.js";
3
+ export type { GlobalOptions };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAC;AAW5D,YAAY,EAAE,aAAa,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+ // ABOUTME: Entry point for the gitops-release CLI.
3
+ // ABOUTME: Sets up Commander.js with global flags and command registration.
4
+ import { Command } from "commander";
5
+ import { handleError } from "./utils/errors.js";
6
+ import { createContext } from "./context.js";
7
+ import { listCommand } from "./commands/list.js";
8
+ import { statusCommand } from "./commands/status.js";
9
+ import { notesCommand } from "./commands/notes.js";
10
+ import { createCommand } from "./commands/create.js";
11
+ import { publishCommand } from "./commands/publish.js";
12
+ import { cherryPickCommand } from "./commands/cherry-pick.js";
13
+ import { completionCommand } from "./commands/completion.js";
14
+ import { createFormatterOnly } from "./context.js";
15
+ /**
16
+ * Default repository to operate on.
17
+ */
18
+ const DEFAULT_REPO = "codefresh-io/gitops-runtime-helm";
19
+ /**
20
+ * Extracts global options from a Command instance.
21
+ * Works for both the root program and subcommands.
22
+ */
23
+ function getGlobalOptions(command) {
24
+ // Walk up to the root program to get global options
25
+ let root = command;
26
+ while (root.parent) {
27
+ root = root.parent;
28
+ }
29
+ const opts = root.opts();
30
+ return {
31
+ repo: opts.repo ?? DEFAULT_REPO,
32
+ json: opts.json ?? false,
33
+ quiet: opts.quiet ?? false,
34
+ verbose: opts.verbose ?? false,
35
+ noColor: opts.color === false, // --no-color sets color to false
36
+ };
37
+ }
38
+ /**
39
+ * Creates and configures the main CLI program.
40
+ */
41
+ function createProgram() {
42
+ const program = new Command();
43
+ program
44
+ .name("gitops-release")
45
+ .description("Automate GitOps runtime release lifecycle operations")
46
+ .version("0.1.0", "-V, --version", "Show CLI version")
47
+ .option("--repo <owner/repo>", "Target repository", DEFAULT_REPO)
48
+ .option("--json", "Output as JSON", false)
49
+ .option("-q, --quiet", "Minimal output", false)
50
+ .option("-v, --verbose", "Verbose output", false)
51
+ .option("--no-color", "Disable colored output");
52
+ program
53
+ .command("create <major.minor>")
54
+ .description("Create a new stable release branch (triggers prepare-release pipeline)")
55
+ .option("--from <commit-sha>", "Commit SHA to branch from (default: main HEAD)")
56
+ .option("--dry-run", "Preview without making changes", false)
57
+ .option("-f, --force", "Skip confirmation prompt", false)
58
+ .action(async (version, options, command) => {
59
+ const globalOpts = getGlobalOptions(command);
60
+ const ctx = createContext(globalOpts);
61
+ await createCommand(ctx, version, {
62
+ from: options.from,
63
+ dryRun: options.dryRun,
64
+ force: options.force,
65
+ });
66
+ });
67
+ program
68
+ .command("status [version]")
69
+ .description("Show status of releases, PRs, drafts, and pipelines")
70
+ .action(async (version, _options, command) => {
71
+ const globalOpts = getGlobalOptions(command);
72
+ const ctx = createContext(globalOpts);
73
+ await statusCommand(ctx, version);
74
+ });
75
+ program
76
+ .command("publish <version>")
77
+ .description("Publish a release by merging prepare-release PR")
78
+ .option("-f, --force", "Skip confirmation prompt", false)
79
+ .option("--dry-run", "Preview without merging", false)
80
+ .action(async (version, options, command) => {
81
+ const globalOpts = getGlobalOptions(command);
82
+ const ctx = createContext(globalOpts);
83
+ await publishCommand(ctx, version, {
84
+ force: options.force,
85
+ dryRun: options.dryRun,
86
+ });
87
+ });
88
+ program
89
+ .command("list")
90
+ .description("List releases and their states")
91
+ .option("-n, --limit <number>", "Number of releases to show", "10")
92
+ .option("--include-drafts", "Include draft releases", false)
93
+ .action(async (options, command) => {
94
+ const globalOpts = getGlobalOptions(command);
95
+ const ctx = createContext(globalOpts);
96
+ await listCommand(ctx, {
97
+ limit: parseInt(options.limit, 10),
98
+ includeDrafts: options.includeDrafts,
99
+ });
100
+ });
101
+ program
102
+ .command("notes <version>")
103
+ .description("Generate AI-powered release notes for review")
104
+ .option("-e, --edit", "Open generated notes in $EDITOR for review/editing", false)
105
+ .option("-a, --apply", "Apply notes to draft release and Chart.yaml", false)
106
+ .option("--dry-run", "Preview without making changes", false)
107
+ .action(async (version, options, command) => {
108
+ const globalOpts = getGlobalOptions(command);
109
+ const ctx = createContext(globalOpts);
110
+ await notesCommand(ctx, version, {
111
+ edit: options.edit,
112
+ apply: options.apply,
113
+ dryRun: options.dryRun,
114
+ });
115
+ });
116
+ program
117
+ .command("cherry-pick <major.minor> <commits...>")
118
+ .description("Cherry-pick commits to a stable branch and create a PR")
119
+ .option("--dry-run", "Preview without making changes", false)
120
+ .option("-f, --force", "Skip confirmation prompt", false)
121
+ .action(async (version, commits, options, command) => {
122
+ const globalOpts = getGlobalOptions(command);
123
+ const ctx = createContext(globalOpts);
124
+ await cherryPickCommand(ctx, version, commits, {
125
+ dryRun: options.dryRun,
126
+ force: options.force,
127
+ });
128
+ });
129
+ program
130
+ .command("completion <shell>")
131
+ .description("Generate shell completion script (bash, zsh)")
132
+ .action(async (shell, _options, command) => {
133
+ const globalOpts = getGlobalOptions(command);
134
+ const formatter = createFormatterOnly(globalOpts);
135
+ await completionCommand(formatter, shell);
136
+ });
137
+ return program;
138
+ }
139
+ /**
140
+ * Main entry point.
141
+ */
142
+ async function main() {
143
+ const program = createProgram();
144
+ try {
145
+ await program.parseAsync(process.argv);
146
+ }
147
+ catch (error) {
148
+ handleError(error);
149
+ }
150
+ }
151
+ main().catch(handleError);
152
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}