@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,377 @@
1
+ // ABOUTME: Unit tests for the cherry-pick command.
2
+ // ABOUTME: Tests validation, dry-run mode, git operations, and error handling.
3
+ import { describe, it, expect, vi, beforeEach } from "vitest";
4
+ import { cherryPickCommand } from "./cherry-pick.js";
5
+ import { ValidationError, NotFoundError } from "../utils/errors.js";
6
+ // Mock child_process
7
+ vi.mock("child_process", () => ({
8
+ execSync: vi.fn(),
9
+ spawnSync: vi.fn(),
10
+ }));
11
+ // Mock the prompts module
12
+ vi.mock("../utils/prompts.js", () => ({
13
+ confirm: vi.fn().mockResolvedValue(true),
14
+ }));
15
+ import { execSync, spawnSync } from "child_process";
16
+ /**
17
+ * Creates a mock GitHubService with default implementations.
18
+ */
19
+ function createMockGitHub() {
20
+ const getBranch = vi.fn();
21
+ const getRefSha = vi.fn();
22
+ const createPullRequest = vi.fn();
23
+ const getRepo = vi.fn().mockReturnValue({ owner: "codefresh-io", repo: "gitops-runtime-helm" });
24
+ const github = {
25
+ getBranch,
26
+ getRefSha,
27
+ createPullRequest,
28
+ getRepo,
29
+ };
30
+ return { github, mocks: { getBranch, getRefSha, createPullRequest, getRepo } };
31
+ }
32
+ /**
33
+ * Creates a mock Formatter that captures output.
34
+ */
35
+ function createMockFormatter() {
36
+ const output = {
37
+ json: null,
38
+ texts: [],
39
+ successes: [],
40
+ warnings: [],
41
+ };
42
+ const formatter = {
43
+ spinner: vi.fn().mockReturnValue({
44
+ start: vi.fn(),
45
+ stop: vi.fn(),
46
+ }),
47
+ isJsonMode: vi.fn().mockReturnValue(false),
48
+ json: vi.fn((data) => {
49
+ output.json = data;
50
+ }),
51
+ header: vi.fn(),
52
+ newline: vi.fn(),
53
+ keyValue: vi.fn(),
54
+ info: vi.fn(),
55
+ text: vi.fn((msg) => {
56
+ output.texts.push(msg);
57
+ }),
58
+ section: vi.fn(),
59
+ success: vi.fn((msg) => {
60
+ output.successes.push(msg);
61
+ }),
62
+ warning: vi.fn((msg) => {
63
+ output.warnings.push(msg);
64
+ }),
65
+ };
66
+ return { formatter, output };
67
+ }
68
+ /**
69
+ * Creates a CommandContext with mocked services.
70
+ */
71
+ function createMockContext() {
72
+ const { github, mocks } = createMockGitHub();
73
+ const { formatter, output } = createMockFormatter();
74
+ const ctx = {
75
+ github,
76
+ formatter,
77
+ options: {
78
+ repo: "codefresh-io/gitops-runtime-helm",
79
+ json: false,
80
+ quiet: false,
81
+ verbose: false,
82
+ },
83
+ };
84
+ return { ctx, mocks, output };
85
+ }
86
+ /**
87
+ * Sets up git mocks for a successful scenario.
88
+ */
89
+ function setupSuccessfulGitMocks() {
90
+ // Mock execSync for isGitRepo check
91
+ execSync.mockImplementation((cmd) => {
92
+ if (cmd.includes("rev-parse --is-inside-work-tree")) {
93
+ return Buffer.from("true");
94
+ }
95
+ if (cmd.includes("remote get-url")) {
96
+ return Buffer.from("git@github.com:codefresh-io/gitops-runtime-helm.git");
97
+ }
98
+ return Buffer.from("");
99
+ });
100
+ // Mock spawnSync for git commands
101
+ spawnSync.mockImplementation((cmd, args) => {
102
+ const fullCmd = `${cmd} ${args.join(" ")}`;
103
+ if (fullCmd.includes("log -1 --format")) {
104
+ return { status: 0, stdout: "abc1234|Fix bug in feature" };
105
+ }
106
+ if (fullCmd.includes("rev-parse --abbrev-ref HEAD")) {
107
+ return { status: 0, stdout: "main" };
108
+ }
109
+ if (fullCmd.includes("rev-parse --verify")) {
110
+ return { status: 1, stderr: "not found" }; // branch doesn't exist locally
111
+ }
112
+ if (fullCmd.includes("fetch origin")) {
113
+ return { status: 0, stdout: "" };
114
+ }
115
+ if (fullCmd.includes("checkout -b")) {
116
+ return { status: 0, stdout: "" };
117
+ }
118
+ if (fullCmd.includes("cherry-pick")) {
119
+ return { status: 0, stdout: "" };
120
+ }
121
+ if (fullCmd.includes("push -u origin")) {
122
+ return { status: 0, stdout: "" };
123
+ }
124
+ if (fullCmd.includes("checkout main")) {
125
+ return { status: 0, stdout: "" };
126
+ }
127
+ if (fullCmd.includes("branch -D")) {
128
+ return { status: 0, stdout: "" };
129
+ }
130
+ return { status: 0, stdout: "" };
131
+ });
132
+ }
133
+ describe("cherryPickCommand", () => {
134
+ beforeEach(() => {
135
+ vi.clearAllMocks();
136
+ });
137
+ describe("validation", () => {
138
+ it("rejects when no commits are provided", async () => {
139
+ const { ctx } = createMockContext();
140
+ const options = { dryRun: false };
141
+ await expect(cherryPickCommand(ctx, "0.26", [], options)).rejects.toThrow(ValidationError);
142
+ await expect(cherryPickCommand(ctx, "0.26", [], options)).rejects.toThrow("At least one commit SHA is required");
143
+ });
144
+ it("rejects full semver format (X.Y.Z)", async () => {
145
+ const { ctx } = createMockContext();
146
+ const options = { dryRun: false };
147
+ setupSuccessfulGitMocks();
148
+ await expect(cherryPickCommand(ctx, "0.26.0", ["abc123"], options)).rejects.toThrow(ValidationError);
149
+ });
150
+ it("rejects invalid version formats", async () => {
151
+ const { ctx } = createMockContext();
152
+ const options = { dryRun: false };
153
+ setupSuccessfulGitMocks();
154
+ await expect(cherryPickCommand(ctx, "26", ["abc123"], options)).rejects.toThrow(ValidationError);
155
+ await expect(cherryPickCommand(ctx, "v0.26", ["abc123"], options)).rejects.toThrow(ValidationError);
156
+ });
157
+ it("accepts valid major.minor format", async () => {
158
+ const { ctx, mocks } = createMockContext();
159
+ const options = { dryRun: true };
160
+ setupSuccessfulGitMocks();
161
+ mocks.getBranch.mockResolvedValue({
162
+ name: "stable/0.26",
163
+ sha: "abc1234567890",
164
+ protected: false,
165
+ });
166
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
167
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).resolves.not.toThrow();
168
+ });
169
+ });
170
+ describe("git repository check", () => {
171
+ it("throws error when not in a git repository", async () => {
172
+ const { ctx, mocks } = createMockContext();
173
+ const options = { dryRun: false };
174
+ // Mock execSync to throw (not in git repo)
175
+ execSync.mockImplementation(() => {
176
+ throw new Error("not a git repository");
177
+ });
178
+ mocks.getBranch.mockResolvedValue({
179
+ name: "stable/0.26",
180
+ sha: "abc1234567890",
181
+ protected: false,
182
+ });
183
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow(ValidationError);
184
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow("Not in a git repository");
185
+ });
186
+ it("throws error when remote does not match target repo", async () => {
187
+ const { ctx, mocks } = createMockContext();
188
+ const options = { dryRun: false };
189
+ execSync.mockImplementation((cmd) => {
190
+ if (cmd.includes("rev-parse --is-inside-work-tree")) {
191
+ return Buffer.from("true");
192
+ }
193
+ if (cmd.includes("remote get-url")) {
194
+ return Buffer.from("git@github.com:other-org/other-repo.git");
195
+ }
196
+ return Buffer.from("");
197
+ });
198
+ mocks.getBranch.mockResolvedValue({
199
+ name: "stable/0.26",
200
+ sha: "abc1234567890",
201
+ protected: false,
202
+ });
203
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow(ValidationError);
204
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow("does not match target repo");
205
+ });
206
+ });
207
+ describe("stable branch check", () => {
208
+ it("throws error when stable branch does not exist", async () => {
209
+ const { ctx, mocks } = createMockContext();
210
+ const options = { dryRun: false };
211
+ setupSuccessfulGitMocks();
212
+ mocks.getBranch.mockResolvedValue(null); // stable branch doesn't exist
213
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow(NotFoundError);
214
+ await expect(cherryPickCommand(ctx, "0.26", ["abc123"], options)).rejects.toThrow("stable/0.26");
215
+ });
216
+ });
217
+ describe("commit validation", () => {
218
+ it("throws error when commit does not exist", async () => {
219
+ const { ctx, mocks } = createMockContext();
220
+ const options = { dryRun: false };
221
+ setupSuccessfulGitMocks();
222
+ mocks.getBranch.mockResolvedValue({
223
+ name: "stable/0.26",
224
+ sha: "abc1234567890",
225
+ protected: false,
226
+ });
227
+ mocks.getRefSha.mockRejectedValue(new Error("Not found"));
228
+ await expect(cherryPickCommand(ctx, "0.26", ["nonexistent"], options)).rejects.toThrow(ValidationError);
229
+ await expect(cherryPickCommand(ctx, "0.26", ["nonexistent"], options)).rejects.toThrow("not found in repository");
230
+ });
231
+ });
232
+ describe("dry run mode", () => {
233
+ it("does not perform git operations in dry run mode", async () => {
234
+ const { ctx, mocks } = createMockContext();
235
+ const options = { dryRun: true };
236
+ setupSuccessfulGitMocks();
237
+ mocks.getBranch.mockResolvedValue({
238
+ name: "stable/0.26",
239
+ sha: "abc1234567890",
240
+ protected: false,
241
+ });
242
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
243
+ await cherryPickCommand(ctx, "0.26", ["abc123"], options);
244
+ // Should not have called createPullRequest
245
+ expect(mocks.createPullRequest).not.toHaveBeenCalled();
246
+ });
247
+ it("outputs dry run header in human mode", async () => {
248
+ const { ctx, mocks } = createMockContext();
249
+ const options = { dryRun: true };
250
+ setupSuccessfulGitMocks();
251
+ mocks.getBranch.mockResolvedValue({
252
+ name: "stable/0.26",
253
+ sha: "abc1234567890",
254
+ protected: false,
255
+ });
256
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
257
+ await cherryPickCommand(ctx, "0.26", ["abc123"], options);
258
+ expect(ctx.formatter.header).toHaveBeenCalledWith(expect.stringContaining("Dry Run"));
259
+ });
260
+ it("outputs JSON with dryRun=true in JSON mode", async () => {
261
+ const { ctx, mocks, output } = createMockContext();
262
+ const options = { dryRun: true };
263
+ setupSuccessfulGitMocks();
264
+ ctx.formatter.isJsonMode.mockReturnValue(true);
265
+ mocks.getBranch.mockResolvedValue({
266
+ name: "stable/0.26",
267
+ sha: "abc1234567890",
268
+ protected: false,
269
+ });
270
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
271
+ await cherryPickCommand(ctx, "0.26", ["abc123"], options);
272
+ expect(output.json).toMatchObject({
273
+ version: "0.26",
274
+ stableBranch: "stable/0.26",
275
+ dryRun: true,
276
+ created: false,
277
+ });
278
+ });
279
+ });
280
+ describe("successful cherry-pick", () => {
281
+ it("creates PR after successful cherry-pick", async () => {
282
+ const { ctx, mocks, output } = createMockContext();
283
+ const options = { dryRun: false, force: true };
284
+ setupSuccessfulGitMocks();
285
+ mocks.getBranch.mockResolvedValue({
286
+ name: "stable/0.26",
287
+ sha: "abc1234567890",
288
+ protected: false,
289
+ });
290
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
291
+ mocks.createPullRequest.mockResolvedValue({
292
+ number: 123,
293
+ title: "[Backport 0.26] Fix bug in feature",
294
+ url: "https://github.com/codefresh-io/gitops-runtime-helm/pull/123",
295
+ state: "open",
296
+ draft: false,
297
+ headBranch: "cherry-pick/0.26-xyz",
298
+ baseBranch: "stable/0.26",
299
+ labels: [],
300
+ mergeable: true,
301
+ createdAt: "2025-01-06T00:00:00Z",
302
+ updatedAt: "2025-01-06T00:00:00Z",
303
+ });
304
+ await cherryPickCommand(ctx, "0.26", ["abc123"], options);
305
+ expect(mocks.createPullRequest).toHaveBeenCalledWith(expect.objectContaining({
306
+ base: "stable/0.26",
307
+ title: expect.stringContaining("Backport 0.26"),
308
+ }));
309
+ expect(output.successes.some((s) => s.includes("Cherry-picked"))).toBe(true);
310
+ });
311
+ it("outputs JSON with PR info in JSON mode", async () => {
312
+ const { ctx, mocks, output } = createMockContext();
313
+ const options = { dryRun: false, force: true };
314
+ setupSuccessfulGitMocks();
315
+ ctx.formatter.isJsonMode.mockReturnValue(true);
316
+ mocks.getBranch.mockResolvedValue({
317
+ name: "stable/0.26",
318
+ sha: "abc1234567890",
319
+ protected: false,
320
+ });
321
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
322
+ mocks.createPullRequest.mockResolvedValue({
323
+ number: 123,
324
+ title: "[Backport 0.26] Fix bug in feature",
325
+ url: "https://github.com/codefresh-io/gitops-runtime-helm/pull/123",
326
+ state: "open",
327
+ draft: false,
328
+ headBranch: "cherry-pick/0.26-xyz",
329
+ baseBranch: "stable/0.26",
330
+ labels: [],
331
+ mergeable: true,
332
+ createdAt: "2025-01-06T00:00:00Z",
333
+ updatedAt: "2025-01-06T00:00:00Z",
334
+ });
335
+ await cherryPickCommand(ctx, "0.26", ["abc123"], options);
336
+ expect(output.json).toMatchObject({
337
+ version: "0.26",
338
+ stableBranch: "stable/0.26",
339
+ dryRun: false,
340
+ created: true,
341
+ pr: {
342
+ number: 123,
343
+ url: "https://github.com/codefresh-io/gitops-runtime-helm/pull/123",
344
+ },
345
+ });
346
+ });
347
+ it("handles multiple commits", async () => {
348
+ const { ctx, mocks } = createMockContext();
349
+ const options = { dryRun: false, force: true };
350
+ setupSuccessfulGitMocks();
351
+ mocks.getBranch.mockResolvedValue({
352
+ name: "stable/0.26",
353
+ sha: "abc1234567890",
354
+ protected: false,
355
+ });
356
+ mocks.getRefSha.mockResolvedValue("abc1234567890");
357
+ mocks.createPullRequest.mockResolvedValue({
358
+ number: 123,
359
+ title: "[Backport 0.26] Cherry-pick 2 commits",
360
+ url: "https://github.com/codefresh-io/gitops-runtime-helm/pull/123",
361
+ state: "open",
362
+ draft: false,
363
+ headBranch: "cherry-pick/0.26-xyz",
364
+ baseBranch: "stable/0.26",
365
+ labels: [],
366
+ mergeable: true,
367
+ createdAt: "2025-01-06T00:00:00Z",
368
+ updatedAt: "2025-01-06T00:00:00Z",
369
+ });
370
+ await cherryPickCommand(ctx, "0.26", ["abc123", "def456"], options);
371
+ expect(mocks.createPullRequest).toHaveBeenCalledWith(expect.objectContaining({
372
+ title: expect.stringContaining("Cherry-pick 2 commits"),
373
+ }));
374
+ });
375
+ });
376
+ });
377
+ //# sourceMappingURL=cherry-pick.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cherry-pick.test.js","sourceRoot":"","sources":["../../src/commands/cherry-pick.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Formatter } from "../output/formatter.js";
2
+ /**
3
+ * Supported shell types for completion.
4
+ */
5
+ export type ShellType = "bash" | "zsh";
6
+ /**
7
+ * Executes the completion command.
8
+ * Generates shell completion scripts for bash or zsh.
9
+ */
10
+ export declare function completionCommand(_formatter: Formatter, shell: string): Promise<void>;
11
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAyKvC;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B3F"}
@@ -0,0 +1,195 @@
1
+ // ABOUTME: Shell completion script generator for bash and zsh.
2
+ // ABOUTME: Outputs completion scripts that users can source in their shell config.
3
+ import { ValidationError } from "../utils/errors.js";
4
+ /**
5
+ * Generates a bash completion script for gitops-release.
6
+ */
7
+ function generateBashCompletion() {
8
+ return `# Bash completion for gitops-release
9
+ # Add to ~/.bashrc or ~/.bash_profile:
10
+ # source <(gitops-release completion bash)
11
+ # Or save to a file:
12
+ # gitops-release completion bash > /etc/bash_completion.d/gitops-release
13
+
14
+ _gitops_release_completions() {
15
+ local cur prev words cword
16
+ _init_completion || return
17
+
18
+ local commands="create status publish list notes cherry-pick completion"
19
+ local global_opts="--repo --json --quiet --verbose --no-color --help --version"
20
+
21
+ case "\${COMP_CWORD}" in
22
+ 1)
23
+ COMPREPLY=( $(compgen -W "\${commands} \${global_opts}" -- "\${cur}") )
24
+ return 0
25
+ ;;
26
+ *)
27
+ local command="\${COMP_WORDS[1]}"
28
+ case "\${command}" in
29
+ create)
30
+ local create_opts="--from --dry-run --force"
31
+ COMPREPLY=( $(compgen -W "\${create_opts} \${global_opts}" -- "\${cur}") )
32
+ return 0
33
+ ;;
34
+ status)
35
+ COMPREPLY=( $(compgen -W "\${global_opts}" -- "\${cur}") )
36
+ return 0
37
+ ;;
38
+ publish)
39
+ local publish_opts="--force --dry-run"
40
+ COMPREPLY=( $(compgen -W "\${publish_opts} \${global_opts}" -- "\${cur}") )
41
+ return 0
42
+ ;;
43
+ list)
44
+ local list_opts="--limit --include-drafts"
45
+ COMPREPLY=( $(compgen -W "\${list_opts} \${global_opts}" -- "\${cur}") )
46
+ return 0
47
+ ;;
48
+ notes)
49
+ local notes_opts="--edit --apply --dry-run"
50
+ COMPREPLY=( $(compgen -W "\${notes_opts} \${global_opts}" -- "\${cur}") )
51
+ return 0
52
+ ;;
53
+ cherry-pick)
54
+ local cp_opts="--dry-run --force"
55
+ COMPREPLY=( $(compgen -W "\${cp_opts} \${global_opts}" -- "\${cur}") )
56
+ return 0
57
+ ;;
58
+ completion)
59
+ COMPREPLY=( $(compgen -W "bash zsh" -- "\${cur}") )
60
+ return 0
61
+ ;;
62
+ esac
63
+ ;;
64
+ esac
65
+ }
66
+
67
+ complete -F _gitops_release_completions gitops-release
68
+ `;
69
+ }
70
+ /**
71
+ * Generates a zsh completion script for gitops-release.
72
+ */
73
+ function generateZshCompletion() {
74
+ return `#compdef gitops-release
75
+
76
+ # Zsh completion for gitops-release
77
+ # Add to your fpath or save to ~/.zsh/completions/_gitops-release:
78
+ # gitops-release completion zsh > ~/.zsh/completions/_gitops-release
79
+ # Then add to ~/.zshrc:
80
+ # fpath=(~/.zsh/completions $fpath)
81
+ # autoload -Uz compinit && compinit
82
+
83
+ _gitops_release() {
84
+ local -a commands
85
+ local -a global_opts
86
+
87
+ commands=(
88
+ 'create:Create a new stable release branch (triggers prepare-release pipeline)'
89
+ 'status:Show status of releases, PRs, drafts, and pipelines'
90
+ 'publish:Publish a release by merging prepare-release PR'
91
+ 'list:List releases and their states'
92
+ 'notes:Generate AI-powered release notes for review'
93
+ 'cherry-pick:Cherry-pick commits to a stable branch and create a PR'
94
+ 'completion:Generate shell completion script'
95
+ )
96
+
97
+ global_opts=(
98
+ '--repo[Target repository]:repo:_files'
99
+ '--json[Output as JSON]'
100
+ '(-q --quiet)'{-q,--quiet}'[Minimal output]'
101
+ '(-v --verbose)'{-v,--verbose}'[Verbose output]'
102
+ '--no-color[Disable colored output]'
103
+ '(-h --help)'{-h,--help}'[Show help]'
104
+ '(-V --version)'{-V,--version}'[Show version]'
105
+ )
106
+
107
+ local curcontext="$curcontext" state line
108
+ typeset -A opt_args
109
+
110
+ _arguments -C \\
111
+ $global_opts \\
112
+ '1: :->command' \\
113
+ '*:: :->args'
114
+
115
+ case $state in
116
+ command)
117
+ _describe -t commands 'gitops-release commands' commands
118
+ ;;
119
+ args)
120
+ case $line[1] in
121
+ create)
122
+ _arguments \\
123
+ '--from[Commit SHA to branch from]:sha:' \\
124
+ '--dry-run[Preview without making changes]' \\
125
+ '(-f --force)'{-f,--force}'[Skip confirmation prompt]' \\
126
+ '1:version (major.minor):'
127
+ ;;
128
+ status)
129
+ _arguments \\
130
+ '1:version (optional):'
131
+ ;;
132
+ publish)
133
+ _arguments \\
134
+ '(-f --force)'{-f,--force}'[Skip confirmation prompt]' \\
135
+ '--dry-run[Preview without merging]' \\
136
+ '1:version (major.minor.patch):'
137
+ ;;
138
+ list)
139
+ _arguments \\
140
+ '(-n --limit)'{-n,--limit}'[Number of releases to show]:number:' \\
141
+ '--include-drafts[Include draft releases]'
142
+ ;;
143
+ notes)
144
+ _arguments \\
145
+ '(-e --edit)'{-e,--edit}'[Open generated notes in \\$EDITOR]' \\
146
+ '(-a --apply)'{-a,--apply}'[Apply notes to draft release and Chart.yaml]' \\
147
+ '--dry-run[Preview without making changes]' \\
148
+ '1:version (major.minor.patch):'
149
+ ;;
150
+ cherry-pick)
151
+ _arguments \\
152
+ '--dry-run[Preview without making changes]' \\
153
+ '(-f --force)'{-f,--force}'[Skip confirmation prompt]' \\
154
+ '1:version (major.minor):' \\
155
+ '*:commit SHA:'
156
+ ;;
157
+ completion)
158
+ _arguments \\
159
+ '1:shell:(bash zsh)'
160
+ ;;
161
+ esac
162
+ ;;
163
+ esac
164
+ }
165
+
166
+ _gitops_release "$@"
167
+ `;
168
+ }
169
+ /**
170
+ * Executes the completion command.
171
+ * Generates shell completion scripts for bash or zsh.
172
+ */
173
+ export async function completionCommand(_formatter, shell) {
174
+ const normalizedShell = shell.toLowerCase();
175
+ if (normalizedShell !== "bash" && normalizedShell !== "zsh") {
176
+ throw new ValidationError(`Unsupported shell '${shell}'.\n` +
177
+ "Supported shells: bash, zsh\n\n" +
178
+ "Usage:\n" +
179
+ " gitops-release completion bash\n" +
180
+ " gitops-release completion zsh");
181
+ }
182
+ let script;
183
+ switch (normalizedShell) {
184
+ case "bash":
185
+ script = generateBashCompletion();
186
+ break;
187
+ case "zsh":
188
+ script = generateZshCompletion();
189
+ break;
190
+ }
191
+ // Output the raw script to stdout (not through formatter)
192
+ // This allows users to pipe it directly: gitops-release completion bash > file
193
+ console.log(script);
194
+ }
195
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mFAAmF;AAGnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD;;GAEG;AACH,SAAS,sBAAsB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAqB,EAAE,KAAa;IAC1E,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAe,CAAC;IAEzD,IAAI,eAAe,KAAK,MAAM,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;QAC5D,MAAM,IAAI,eAAe,CACvB,sBAAsB,KAAK,MAAM;YAC/B,iCAAiC;YACjC,UAAU;YACV,oCAAoC;YACpC,iCAAiC,CACpC,CAAC;IACJ,CAAC;IAED,IAAI,MAAc,CAAC;IAEnB,QAAQ,eAAe,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,MAAM,GAAG,sBAAsB,EAAE,CAAC;YAClC,MAAM;QACR,KAAK,KAAK;YACR,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACjC,MAAM;IACV,CAAC;IAED,0DAA0D;IAC1D,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=completion.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.test.d.ts","sourceRoot":"","sources":["../../src/commands/completion.test.ts"],"names":[],"mappings":""}