@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.
- package/README.md +397 -0
- package/dist/commands/cherry-pick.d.ts +14 -0
- package/dist/commands/cherry-pick.d.ts.map +1 -0
- package/dist/commands/cherry-pick.js +337 -0
- package/dist/commands/cherry-pick.js.map +1 -0
- package/dist/commands/cherry-pick.test.d.ts +2 -0
- package/dist/commands/cherry-pick.test.d.ts.map +1 -0
- package/dist/commands/cherry-pick.test.js +377 -0
- package/dist/commands/cherry-pick.test.js.map +1 -0
- package/dist/commands/completion.d.ts +11 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +195 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/completion.test.d.ts +2 -0
- package/dist/commands/completion.test.d.ts.map +1 -0
- package/dist/commands/completion.test.js +142 -0
- package/dist/commands/completion.test.js.map +1 -0
- package/dist/commands/create.d.ts +15 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +107 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/create.test.d.ts +2 -0
- package/dist/commands/create.test.d.ts.map +1 -0
- package/dist/commands/create.test.js +274 -0
- package/dist/commands/create.test.js.map +1 -0
- package/dist/commands/list.d.ts +14 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +69 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/notes.d.ts +15 -0
- package/dist/commands/notes.d.ts.map +1 -0
- package/dist/commands/notes.js +374 -0
- package/dist/commands/notes.js.map +1 -0
- package/dist/commands/publish.d.ts +14 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +220 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/publish.test.d.ts +2 -0
- package/dist/commands/publish.test.d.ts.map +1 -0
- package/dist/commands/publish.test.js +371 -0
- package/dist/commands/publish.test.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +258 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +48 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatter.d.ts +161 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +398 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatter.test.d.ts +2 -0
- package/dist/output/formatter.test.d.ts.map +1 -0
- package/dist/output/formatter.test.js +223 -0
- package/dist/output/formatter.test.js.map +1 -0
- package/dist/services/ai.d.ts +69 -0
- package/dist/services/ai.d.ts.map +1 -0
- package/dist/services/ai.js +235 -0
- package/dist/services/ai.js.map +1 -0
- package/dist/services/ai.test.d.ts +2 -0
- package/dist/services/ai.test.d.ts.map +1 -0
- package/dist/services/ai.test.js +101 -0
- package/dist/services/ai.test.js.map +1 -0
- package/dist/services/github.d.ts +200 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +465 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/github.test.d.ts +2 -0
- package/dist/services/github.test.d.ts.map +1 -0
- package/dist/services/github.test.js +64 -0
- package/dist/services/github.test.js.map +1 -0
- package/dist/services/version.d.ts +106 -0
- package/dist/services/version.d.ts.map +1 -0
- package/dist/services/version.js +158 -0
- package/dist/services/version.js.map +1 -0
- package/dist/services/version.test.d.ts +2 -0
- package/dist/services/version.test.d.ts.map +1 -0
- package/dist/services/version.test.js +136 -0
- package/dist/services/version.test.js.map +1 -0
- package/dist/utils/errors.d.ts +66 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +154 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/errors.test.d.ts +2 -0
- package/dist/utils/errors.test.d.ts.map +1 -0
- package/dist/utils/errors.test.js +147 -0
- package/dist/utils/errors.test.js.map +1 -0
- package/dist/utils/prompts.d.ts +54 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +108 -0
- package/dist/utils/prompts.js.map +1 -0
- 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"}
|
package/dist/context.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|