@jacobsandersen/glab-axi 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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/dist/bin/glab-axi.d.ts +2 -0
  4. package/dist/bin/glab-axi.js +4 -0
  5. package/dist/bin/glab-axi.js.map +1 -0
  6. package/dist/src/args.d.ts +8 -0
  7. package/dist/src/args.js +84 -0
  8. package/dist/src/args.js.map +1 -0
  9. package/dist/src/body.d.ts +15 -0
  10. package/dist/src/body.js +132 -0
  11. package/dist/src/body.js.map +1 -0
  12. package/dist/src/cli.d.ts +9 -0
  13. package/dist/src/cli.js +124 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/commands/api.d.ts +3 -0
  16. package/dist/src/commands/api.js +155 -0
  17. package/dist/src/commands/api.js.map +1 -0
  18. package/dist/src/commands/home.d.ts +3 -0
  19. package/dist/src/commands/home.js +57 -0
  20. package/dist/src/commands/home.js.map +1 -0
  21. package/dist/src/commands/issue.d.ts +3 -0
  22. package/dist/src/commands/issue.js +364 -0
  23. package/dist/src/commands/issue.js.map +1 -0
  24. package/dist/src/commands/job.d.ts +3 -0
  25. package/dist/src/commands/job.js +119 -0
  26. package/dist/src/commands/job.js.map +1 -0
  27. package/dist/src/commands/label.d.ts +3 -0
  28. package/dist/src/commands/label.js +117 -0
  29. package/dist/src/commands/label.js.map +1 -0
  30. package/dist/src/commands/mr.d.ts +3 -0
  31. package/dist/src/commands/mr.js +365 -0
  32. package/dist/src/commands/mr.js.map +1 -0
  33. package/dist/src/commands/pipeline.d.ts +3 -0
  34. package/dist/src/commands/pipeline.js +168 -0
  35. package/dist/src/commands/pipeline.js.map +1 -0
  36. package/dist/src/commands/project.d.ts +3 -0
  37. package/dist/src/commands/project.js +138 -0
  38. package/dist/src/commands/project.js.map +1 -0
  39. package/dist/src/commands/release.d.ts +3 -0
  40. package/dist/src/commands/release.js +179 -0
  41. package/dist/src/commands/release.js.map +1 -0
  42. package/dist/src/commands/search.d.ts +3 -0
  43. package/dist/src/commands/search.js +266 -0
  44. package/dist/src/commands/search.js.map +1 -0
  45. package/dist/src/commands/setup.d.ts +2 -0
  46. package/dist/src/commands/setup.js +23 -0
  47. package/dist/src/commands/setup.js.map +1 -0
  48. package/dist/src/commands/variable.d.ts +3 -0
  49. package/dist/src/commands/variable.js +92 -0
  50. package/dist/src/commands/variable.js.map +1 -0
  51. package/dist/src/context.d.ts +7 -0
  52. package/dist/src/context.js +42 -0
  53. package/dist/src/context.js.map +1 -0
  54. package/dist/src/errors.d.ts +5 -0
  55. package/dist/src/errors.js +81 -0
  56. package/dist/src/errors.js.map +1 -0
  57. package/dist/src/fields.d.ts +10 -0
  58. package/dist/src/fields.js +26 -0
  59. package/dist/src/fields.js.map +1 -0
  60. package/dist/src/format.d.ts +8 -0
  61. package/dist/src/format.js +17 -0
  62. package/dist/src/format.js.map +1 -0
  63. package/dist/src/glab.d.ts +10 -0
  64. package/dist/src/glab.js +73 -0
  65. package/dist/src/glab.js.map +1 -0
  66. package/dist/src/secretValue.d.ts +1 -0
  67. package/dist/src/secretValue.js +33 -0
  68. package/dist/src/secretValue.js.map +1 -0
  69. package/dist/src/skill.d.ts +6 -0
  70. package/dist/src/skill.js +79 -0
  71. package/dist/src/skill.js.map +1 -0
  72. package/dist/src/stdin.d.ts +2 -0
  73. package/dist/src/stdin.js +15 -0
  74. package/dist/src/stdin.js.map +1 -0
  75. package/dist/src/suggestions.d.ts +11 -0
  76. package/dist/src/suggestions.js +262 -0
  77. package/dist/src/suggestions.js.map +1 -0
  78. package/dist/src/toon.d.ts +57 -0
  79. package/dist/src/toon.js +150 -0
  80. package/dist/src/toon.js.map +1 -0
  81. package/package.json +59 -0
  82. package/skills/glab-axi/SKILL.md +51 -0
@@ -0,0 +1,10 @@
1
+ import { type RepoContext } from "./context.js";
2
+ export interface ExecResult {
3
+ stdout: string;
4
+ stderr: string;
5
+ exitCode: number;
6
+ }
7
+ export declare function glabJson<T = unknown>(args: string[], ctx?: RepoContext): Promise<T>;
8
+ export declare function glabExec(args: string[], ctx?: RepoContext): Promise<string>;
9
+ export declare function glabRaw(args: string[], ctx?: RepoContext): Promise<ExecResult>;
10
+ export declare function glabExecWithStdin(args: string[], input: string, ctx?: RepoContext): Promise<string>;
@@ -0,0 +1,73 @@
1
+ import { execFile } from "node:child_process";
2
+ import { AxiError, glabNotInstalledError, mapGlabError } from "./errors.js";
3
+ function buildArgs(args, ctx) {
4
+ const out = [...args];
5
+ if (ctx && ctx.source !== "git") {
6
+ out.push("--repo", ctx.nwo);
7
+ }
8
+ return out;
9
+ }
10
+ const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
11
+ function toExecResult(resolve) {
12
+ return (error, stdout, stderr) => {
13
+ if (error && error.code === "ENOENT") {
14
+ resolve({ stdout: "", stderr: "ENOENT", exitCode: 127 });
15
+ return;
16
+ }
17
+ const exitCode = error
18
+ ? (error.code ?? 1)
19
+ : 0;
20
+ resolve({
21
+ stdout: stdout ?? "",
22
+ stderr: stderr ?? "",
23
+ exitCode: typeof exitCode === "number" ? exitCode : 1,
24
+ });
25
+ };
26
+ }
27
+ function run(args) {
28
+ return new Promise((resolve) => {
29
+ execFile("glab", args, { maxBuffer: MAX_BUFFER_BYTES }, toExecResult(resolve));
30
+ });
31
+ }
32
+ function runWithStdin(args, input) {
33
+ return new Promise((resolve) => {
34
+ const child = execFile("glab", args, { maxBuffer: MAX_BUFFER_BYTES }, toExecResult(resolve));
35
+ child.stdin?.end(input);
36
+ });
37
+ }
38
+ export async function glabJson(args, ctx) {
39
+ const result = await run(buildArgs(args, ctx));
40
+ if (result.stderr === "ENOENT")
41
+ throw glabNotInstalledError();
42
+ if (result.exitCode !== 0)
43
+ throw mapGlabError(result.stderr, result.exitCode);
44
+ try {
45
+ return JSON.parse(result.stdout);
46
+ }
47
+ catch {
48
+ throw new AxiError(`Unexpected glab output: ${result.stdout.slice(0, 200)}`, "UNKNOWN");
49
+ }
50
+ }
51
+ export async function glabExec(args, ctx) {
52
+ const result = await run(buildArgs(args, ctx));
53
+ if (result.stderr === "ENOENT")
54
+ throw glabNotInstalledError();
55
+ if (result.exitCode !== 0)
56
+ throw mapGlabError(result.stderr, result.exitCode);
57
+ return result.stdout;
58
+ }
59
+ export async function glabRaw(args, ctx) {
60
+ const result = await run(buildArgs(args, ctx));
61
+ if (result.stderr === "ENOENT")
62
+ throw glabNotInstalledError();
63
+ return result;
64
+ }
65
+ export async function glabExecWithStdin(args, input, ctx) {
66
+ const result = await runWithStdin(buildArgs(args, ctx), input);
67
+ if (result.stderr === "ENOENT")
68
+ throw glabNotInstalledError();
69
+ if (result.exitCode !== 0)
70
+ throw mapGlabError(result.stderr, result.exitCode);
71
+ return result.stdout;
72
+ }
73
+ //# sourceMappingURL=glab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glab.js","sourceRoot":"","sources":["../../src/glab.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function resolveValue(flagValue: string | undefined, noun: "secret" | "variable"): Promise<string>;
@@ -0,0 +1,33 @@
1
+ import { AxiError } from "./errors.js";
2
+ import { readStdin, isStdinTTY } from "./stdin.js";
3
+ function valueRequiredError(noun) {
4
+ if (noun === "secret") {
5
+ return new AxiError("secret value is required: pipe the value via stdin", "VALIDATION_ERROR", [`echo -n "<value>" | glab-axi secret set <name>`]);
6
+ }
7
+ return new AxiError("variable value is required: pass --body <value> or pipe the value via stdin", "VALIDATION_ERROR", [
8
+ `glab-axi variable set <name> --body <value>`,
9
+ `echo -n "<value>" | glab-axi variable set <name>`,
10
+ ]);
11
+ }
12
+ export async function resolveValue(flagValue, noun) {
13
+ if (flagValue !== undefined) {
14
+ if (noun === "secret") {
15
+ throw new AxiError("Secret values must be piped via stdin; --body/-b is not accepted for secrets", "VALIDATION_ERROR", [`echo -n "<value>" | glab-axi secret set <name>`]);
16
+ }
17
+ if (flagValue.length === 0) {
18
+ throw new AxiError(`--body requires a value`, "VALIDATION_ERROR", [
19
+ `glab-axi ${noun} set <name> --body <value>`,
20
+ ]);
21
+ }
22
+ return flagValue;
23
+ }
24
+ if (isStdinTTY()) {
25
+ throw valueRequiredError(noun);
26
+ }
27
+ const value = await readStdin();
28
+ if (value.length === 0) {
29
+ throw valueRequiredError(noun);
30
+ }
31
+ return value;
32
+ }
33
+ //# sourceMappingURL=secretValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretValue.js","sourceRoot":"","sources":["../../src/secretValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,SAAS,kBAAkB,CAAC,IAA2B;IACrD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,IAAI,QAAQ,CACjB,oDAAoD,EACpD,kBAAkB,EAClB,CAAC,gDAAgD,CAAC,CACnD,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,QAAQ,CACjB,6EAA6E,EAC7E,kBAAkB,EAClB;QACE,6CAA6C;QAC7C,kDAAkD;KACnD,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAA6B,EAC7B,IAA2B;IAE3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,QAAQ,CAChB,8EAA8E,EAC9E,kBAAkB,EAClB,CAAC,gDAAgD,CAAC,CACnD,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,kBAAkB,EAAE;gBAChE,YAAY,IAAI,4BAA4B;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const SKILL_DESCRIPTION: string;
2
+ export declare const SKILL_AUTHOR = "Jacob Andersen (jacobsandersen)";
3
+ export declare const HERMES_TAGS: string[];
4
+ export declare const HERMES_CATEGORY = "devops";
5
+ export declare function extractCommandsBlock(): string;
6
+ export declare function createSkillMarkdown(): string;
@@ -0,0 +1,79 @@
1
+ import { DESCRIPTION, TOP_HELP } from "./cli.js";
2
+ export const SKILL_DESCRIPTION = "Operate GitLab through the glab-axi CLI - issues, merge requests, pipelines, jobs, " +
3
+ "releases, projects, labels, CI/CD variables, search, and raw API access. " +
4
+ "Use whenever a task touches GitLab: listing or filing issues, reviewing or merging MRs, " +
5
+ "checking CI/CD pipelines and jobs, triggering pipelines, cutting releases, or managing variables.";
6
+ export const SKILL_AUTHOR = "Jacob Andersen (jacobsandersen)";
7
+ export const HERMES_TAGS = [
8
+ "gitlab",
9
+ "git",
10
+ "ci",
11
+ "cicd",
12
+ "merge-requests",
13
+ "releases",
14
+ ];
15
+ export const HERMES_CATEGORY = "devops";
16
+ function yamlDoubleQuote(value) {
17
+ return JSON.stringify(value);
18
+ }
19
+ export function extractCommandsBlock() {
20
+ const match = TOP_HELP.match(/^(commands\[\d+\]:\n(?: {2}.*\n)+)/m);
21
+ if (!match) {
22
+ throw new Error("Could not find commands block in TOP_HELP");
23
+ }
24
+ return match[1].trimEnd();
25
+ }
26
+ export function createSkillMarkdown() {
27
+ return `---
28
+ name: glab-axi
29
+ description: ${yamlDoubleQuote(SKILL_DESCRIPTION)}
30
+ user-invocable: false
31
+ author: ${SKILL_AUTHOR}
32
+ metadata:
33
+ hermes:
34
+ tags: [${HERMES_TAGS.join(", ")}]
35
+ category: ${HERMES_CATEGORY}
36
+ ---
37
+
38
+ # glab-axi
39
+
40
+ ${DESCRIPTION}
41
+
42
+ You do not need glab-axi installed globally - invoke it with \`npx -y @jacobsandersen/glab-axi <command>\`.
43
+ If glab-axi output shows a follow-up command starting with \`glab-axi\`, run it as \`npx -y @jacobsandersen/glab-axi ...\` instead.
44
+
45
+ glab-axi requires the [\`glab\`](https://gitlab.com/gitlab-org/cli) CLI installed and authenticated (\`glab auth login\`). If a command fails with an authentication error, ask the user to run \`glab auth login\` themselves.
46
+
47
+ ## When to use
48
+
49
+ Use glab-axi whenever a task touches GitLab: listing, filing, or editing issues; viewing, creating, reviewing, or merging MRs; inspecting pipeline runs and CI failures; triggering, retrying, or canceling pipelines; managing releases, projects, or labels; managing CI/CD variables; searching issues, MRs, projects, or code; or calling the GitLab API directly.
50
+
51
+ ## Workflow
52
+
53
+ 1. Run \`npx -y @jacobsandersen/glab-axi\` with no arguments for a dashboard of the current project - open issues, merge requests, and suggested next commands.
54
+ 2. Drill in command-first: \`issue list\`, \`issue view <n>\`, \`mr view <n>\`, \`pipeline list\`, \`job list --pipeline <id>\`, and so on.
55
+ 3. Target another project by placing \`-R owner/name\`, \`-R=owner/name\`, \`--repo owner/name\`, or \`--repo=owner/name\` AFTER the command, e.g. \`npx -y @jacobsandersen/glab-axi issue list --repo=owner/name\`.
56
+ 4. Debug CI with \`pipeline list\`, then \`job list --pipeline <id>\` and \`job log <job-id>\` for failing job logs.
57
+ 5. Every response ends with contextual next-step hints under \`help:\` - follow them.
58
+
59
+ ## Commands
60
+
61
+ \`\`\`
62
+ ${extractCommandsBlock()}
63
+ \`\`\`
64
+
65
+ Installed copies also inherit the SDK built-in \`update\` command.
66
+ Run \`glab-axi update --check\` to compare the installed version with npm, or \`glab-axi update\` to upgrade.
67
+ When using \`npx -y @jacobsandersen/glab-axi\`, npx already resolves the package on demand.
68
+
69
+ Run \`npx -y @jacobsandersen/glab-axi --help\` for global flags, or \`npx -y @jacobsandersen/glab-axi <command> --help\` for per-command usage.
70
+
71
+ ## Tips
72
+
73
+ - Output is TOON-encoded and token-efficient; pipe through grep/head only when a list is very long.
74
+ - Mutations are idempotent and report what changed; re-running a failed mutation is safe.
75
+ - For multi-line markdown bodies or comments, write the text to a UTF-8 file and pass \`--body-file <path>\`.
76
+ - Use \`api\` for anything the dedicated commands do not cover, e.g. \`npx -y @jacobsandersen/glab-axi api projects/{id}/variables\`.
77
+ `;
78
+ }
79
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAC5B,qFAAqF;IACrF,2EAA2E;IAC3E,0FAA0F;IAC1F,mGAAmG,CAAC;AAEtG,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ;IACR,KAAK;IACL,IAAI;IACJ,MAAM;IACN,gBAAgB;IAChB,UAAU;CACX,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;eAEM,eAAe,CAAC,iBAAiB,CAAC;;UAEvC,YAAY;;;aAGT,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnB,eAAe;;;;;EAK7B,WAAW;;;;;;;;;;;;;;;;;;;;;;EAsBX,oBAAoB,EAAE;;;;;;;;;;;;;;;CAevB,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function readStdin(): Promise<string>;
2
+ export declare function isStdinTTY(): boolean;
@@ -0,0 +1,15 @@
1
+ export function readStdin() {
2
+ return new Promise((resolve, reject) => {
3
+ let data = "";
4
+ process.stdin.setEncoding("utf8");
5
+ process.stdin.on("data", (chunk) => {
6
+ data += chunk;
7
+ });
8
+ process.stdin.on("end", () => resolve(data));
9
+ process.stdin.on("error", reject);
10
+ });
11
+ }
12
+ export function isStdinTTY() {
13
+ return Boolean(process.stdin.isTTY);
14
+ }
15
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/stdin.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RepoContext } from "./context.js";
2
+ interface SuggestionContext {
3
+ domain: string;
4
+ action: string;
5
+ state?: string;
6
+ isEmpty?: boolean;
7
+ id?: string | number;
8
+ repo?: RepoContext;
9
+ }
10
+ export declare function getSuggestions(ctx: SuggestionContext): string[];
11
+ export {};
@@ -0,0 +1,262 @@
1
+ function repoFlag(ctx) {
2
+ if (ctx.repo && ctx.repo.source !== "git") {
3
+ return ` -R ${ctx.repo.nwo}`;
4
+ }
5
+ return "";
6
+ }
7
+ const table = [
8
+ {
9
+ match: (c) => c.domain === "home",
10
+ lines: () => [
11
+ `Run \`glab-axi <command> <subcommand>\` — commands: issue, mr, pipeline, job, release, project, label, variable, search, api`,
12
+ ],
13
+ },
14
+ {
15
+ match: (c) => c.domain === "issue" && c.action === "list" && !c.isEmpty,
16
+ lines: (c) => [
17
+ `Run \`glab-axi${repoFlag(c)} issue view <number>\` to view details`,
18
+ `Run \`glab-axi${repoFlag(c)} issue create --title "..." --body-file <path>\` to create`,
19
+ ],
20
+ },
21
+ {
22
+ match: (c) => c.domain === "issue" && c.action === "list" && c.isEmpty === true,
23
+ lines: (c) => [
24
+ `Run \`glab-axi${repoFlag(c)} issue create --title "..." --body-file <path>\` to create an issue`,
25
+ `Run \`glab-axi${repoFlag(c)} issue list --state closed\` to see closed issues`,
26
+ ],
27
+ },
28
+ {
29
+ match: (c) => c.domain === "issue" && c.action === "view" && c.state === "opened",
30
+ lines: (c) => [
31
+ `Run \`glab-axi${repoFlag(c)} issue note ${c.id} --body-file <path>\` to comment`,
32
+ `Run \`glab-axi${repoFlag(c)} issue close ${c.id}\` to close`,
33
+ `Run \`glab-axi${repoFlag(c)} issue edit ${c.id} --add-label <label>\` to label`,
34
+ ],
35
+ },
36
+ {
37
+ match: (c) => c.domain === "issue" && c.action === "view" && c.state === "closed",
38
+ lines: (c) => [
39
+ `Run \`glab-axi${repoFlag(c)} issue reopen ${c.id}\` to reopen`,
40
+ `Run \`glab-axi${repoFlag(c)} issue note ${c.id} --body-file <path>\` to comment`,
41
+ ],
42
+ },
43
+ {
44
+ match: (c) => c.domain === "issue" && c.action === "create",
45
+ lines: (c) => [
46
+ `Run \`glab-axi${repoFlag(c)} issue view ${c.id}\` to see the full issue`,
47
+ ],
48
+ },
49
+ {
50
+ match: (c) => c.domain === "issue" && c.action === "close",
51
+ lines: (c) => [
52
+ `Run \`glab-axi${repoFlag(c)} issue reopen ${c.id}\` to reopen`,
53
+ ],
54
+ },
55
+ {
56
+ match: (c) => c.domain === "issue" && c.action === "reopen",
57
+ lines: (c) => [
58
+ `Run \`glab-axi${repoFlag(c)} issue close ${c.id}\` to close`,
59
+ `Run \`glab-axi${repoFlag(c)} issue view ${c.id}\` to see details`,
60
+ ],
61
+ },
62
+ {
63
+ match: (c) => c.domain === "issue" && c.action === "note",
64
+ lines: (c) => [
65
+ `Run \`glab-axi${repoFlag(c)} issue view ${c.id} --comments\` to see all comments`,
66
+ ],
67
+ },
68
+ {
69
+ match: (c) => c.domain === "mr" && c.action === "list" && !c.isEmpty,
70
+ lines: (c) => [
71
+ `Run \`glab-axi${repoFlag(c)} mr view <number>\` to view details`,
72
+ `Run \`glab-axi${repoFlag(c)} mr create --title "..." --body-file <path>\` to create`,
73
+ ],
74
+ },
75
+ {
76
+ match: (c) => c.domain === "mr" && c.action === "list" && c.isEmpty === true,
77
+ lines: (c) => [
78
+ `Run \`glab-axi${repoFlag(c)} mr create --title "..." --body-file <path>\` to create a MR`,
79
+ `Run \`glab-axi${repoFlag(c)} mr list --state closed\` to see closed MRs`,
80
+ ],
81
+ },
82
+ {
83
+ match: (c) => c.domain === "mr" && c.action === "view" && c.state === "opened",
84
+ lines: (c) => [
85
+ `Run \`glab-axi${repoFlag(c)} mr approve ${c.id}\` to approve`,
86
+ `Run \`glab-axi${repoFlag(c)} mr merge ${c.id}\` to merge`,
87
+ `Run \`glab-axi${repoFlag(c)} mr note ${c.id} --body-file <path>\` to comment`,
88
+ ],
89
+ },
90
+ {
91
+ match: (c) => c.domain === "mr" && c.action === "view" && c.state === "merged",
92
+ lines: () => [],
93
+ },
94
+ {
95
+ match: (c) => c.domain === "mr" && c.action === "view" && c.state === "closed",
96
+ lines: (c) => [
97
+ `Run \`glab-axi${repoFlag(c)} mr reopen ${c.id}\` to reopen`,
98
+ ],
99
+ },
100
+ {
101
+ match: (c) => c.domain === "mr" && c.action === "create",
102
+ lines: (c) => [
103
+ `Run \`glab-axi${repoFlag(c)} mr view ${c.id}\` to see the full MR`,
104
+ ],
105
+ },
106
+ {
107
+ match: (c) => c.domain === "mr" && c.action === "approve",
108
+ lines: (c) => [
109
+ `Run \`glab-axi${repoFlag(c)} mr merge ${c.id}\` to merge when ready`,
110
+ ],
111
+ },
112
+ {
113
+ match: (c) => c.domain === "mr" && c.action === "merge",
114
+ lines: () => [],
115
+ },
116
+ {
117
+ match: (c) => c.domain === "pipeline" && c.action === "list",
118
+ lines: (c) => [
119
+ `Run \`glab-axi${repoFlag(c)} pipeline view <id>\` to view details`,
120
+ ],
121
+ },
122
+ {
123
+ match: (c) => c.domain === "pipeline" && c.action === "view" && c.state === "running",
124
+ lines: (c) => [
125
+ `Run \`glab-axi${repoFlag(c)} pipeline retry ${c.id}\` to retry`,
126
+ `Run \`glab-axi${repoFlag(c)} pipeline cancel ${c.id}\` to cancel`,
127
+ ],
128
+ },
129
+ {
130
+ match: (c) => c.domain === "pipeline" && c.action === "view" && c.state === "failed",
131
+ lines: (c) => [
132
+ `Run \`glab-axi${repoFlag(c)} pipeline retry ${c.id}\` to retry`,
133
+ `Run \`glab-axi${repoFlag(c)} job list --pipeline ${c.id}\` to see job details`,
134
+ ],
135
+ },
136
+ {
137
+ match: (c) => c.domain === "pipeline" && c.action === "retry",
138
+ lines: (c) => [
139
+ `Run \`glab-axi${repoFlag(c)} pipeline view ${c.id}\` to monitor progress`,
140
+ ],
141
+ },
142
+ {
143
+ match: (c) => c.domain === "pipeline" && c.action === "cancel",
144
+ lines: (c) => [
145
+ `Run \`glab-axi${repoFlag(c)} pipeline view ${c.id}\` to see final state`,
146
+ ],
147
+ },
148
+ {
149
+ match: (c) => c.domain === "job" && c.action === "list",
150
+ lines: (c) => [
151
+ `Run \`glab-axi${repoFlag(c)} job view <id>\` to view details`,
152
+ `Run \`glab-axi${repoFlag(c)} job log <id>\` to see job logs`,
153
+ ],
154
+ },
155
+ {
156
+ match: (c) => c.domain === "job" && c.action === "view",
157
+ lines: (c) => [
158
+ `Run \`glab-axi${repoFlag(c)} job log ${c.id}\` to see job logs`,
159
+ ],
160
+ },
161
+ {
162
+ match: (c) => c.domain === "job" && c.action === "log",
163
+ lines: () => [],
164
+ },
165
+ {
166
+ match: (c) => c.domain === "release" && c.action === "list",
167
+ lines: (c) => [
168
+ `Run \`glab-axi${repoFlag(c)} release view <tag>\` to view details`,
169
+ `Run \`glab-axi${repoFlag(c)} release create <tag> --body-file <path>\` to create a release`,
170
+ ],
171
+ },
172
+ {
173
+ match: (c) => c.domain === "release" && c.action === "view",
174
+ lines: (c) => [
175
+ `Run \`glab-axi${repoFlag(c)} release download ${c.id}\` to download assets`,
176
+ ],
177
+ },
178
+ {
179
+ match: (c) => c.domain === "release" && c.action === "create",
180
+ lines: (c) => [
181
+ `Run \`glab-axi${repoFlag(c)} release view ${c.id}\` to view the release`,
182
+ ],
183
+ },
184
+ {
185
+ match: (c) => c.domain === "release" && c.action === "delete",
186
+ lines: (c) => [
187
+ `Run \`glab-axi${repoFlag(c)} release list\` to see remaining releases`,
188
+ ],
189
+ },
190
+ {
191
+ match: (c) => c.domain === "project" && c.action === "view",
192
+ lines: (c) => [
193
+ `Run \`glab-axi${repoFlag(c)} issue list\` to see issues`,
194
+ `Run \`glab-axi${repoFlag(c)} mr list\` to see merge requests`,
195
+ ],
196
+ },
197
+ {
198
+ match: (c) => c.domain === "project" && c.action === "list",
199
+ lines: () => [
200
+ `Run \`glab-axi project view -R <owner/name>\` to view a project`,
201
+ ],
202
+ },
203
+ {
204
+ match: (c) => c.domain === "label" && c.action === "list",
205
+ lines: (c) => [
206
+ `Run \`glab-axi${repoFlag(c)} label create --name "..." --color "..."\` to create a label`,
207
+ ],
208
+ },
209
+ {
210
+ match: (c) => c.domain === "label" && c.action === "create",
211
+ lines: (c) => [
212
+ `Run \`glab-axi${repoFlag(c)} label list\` to see all labels`,
213
+ ],
214
+ },
215
+ {
216
+ match: (c) => c.domain === "label" && c.action === "delete",
217
+ lines: (c) => [
218
+ `Run \`glab-axi${repoFlag(c)} label list\` to see remaining labels`,
219
+ ],
220
+ },
221
+ {
222
+ match: (c) => c.domain === "variable" && c.action === "list" && !c.isEmpty,
223
+ lines: (c) => [
224
+ `Run \`glab-axi variable set <name> --body <value>${repoFlag(c)}\` to add or update a variable`,
225
+ ],
226
+ },
227
+ {
228
+ match: (c) => c.domain === "variable" && c.action === "list" && c.isEmpty === true,
229
+ lines: (c) => [
230
+ `Run \`glab-axi variable set <name> --body <value>${repoFlag(c)}\` to add a variable`,
231
+ ],
232
+ },
233
+ {
234
+ match: (c) => c.domain === "variable" && c.action === "set",
235
+ lines: (c) => [
236
+ `Run \`glab-axi variable list${repoFlag(c)}\` to see all variables`,
237
+ ],
238
+ },
239
+ {
240
+ match: (c) => c.domain === "variable" && c.action === "delete",
241
+ lines: (c) => [
242
+ `Run \`glab-axi variable list${repoFlag(c)}\` to see remaining variables`,
243
+ ],
244
+ },
245
+ {
246
+ match: (c) => c.domain === "search",
247
+ lines: () => [],
248
+ },
249
+ {
250
+ match: (c) => c.domain === "api",
251
+ lines: () => [],
252
+ },
253
+ ];
254
+ export function getSuggestions(ctx) {
255
+ for (const entry of table) {
256
+ if (entry.match(ctx)) {
257
+ return entry.lines(ctx);
258
+ }
259
+ }
260
+ return [];
261
+ }
262
+ //# sourceMappingURL=suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../src/suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export type FieldDef = {
2
+ type: "field";
3
+ key: string;
4
+ as?: string;
5
+ } | {
6
+ type: "pluck";
7
+ key: string;
8
+ subkey: string;
9
+ as?: string;
10
+ } | {
11
+ type: "joinArray";
12
+ key: string;
13
+ subkey: string;
14
+ as?: string;
15
+ empty?: string;
16
+ } | {
17
+ type: "relativeTime";
18
+ key: string;
19
+ as?: string;
20
+ } | {
21
+ type: "boolYesNo";
22
+ key: string;
23
+ as?: string;
24
+ } | {
25
+ type: "mapEnum";
26
+ key: string;
27
+ map: Record<string, string>;
28
+ fallback?: string;
29
+ as?: string;
30
+ } | {
31
+ type: "lower";
32
+ key: string;
33
+ as?: string;
34
+ } | {
35
+ type: "checksSummary";
36
+ key: string;
37
+ as?: string;
38
+ } | {
39
+ type: "custom";
40
+ as: string;
41
+ fn: (item: Record<string, unknown>) => unknown;
42
+ };
43
+ export declare function field(key: string, as?: string): FieldDef;
44
+ export declare function pluck(key: string, subkey: string, as?: string): FieldDef;
45
+ export declare function joinArray(key: string, subkey: string, as?: string, empty?: string): FieldDef;
46
+ export declare function relativeTime(key: string, as?: string): FieldDef;
47
+ export declare function boolYesNo(key: string, as?: string): FieldDef;
48
+ export declare function mapEnum(key: string, map: Record<string, string>, fallback?: string, as?: string): FieldDef;
49
+ export declare function lower(key: string, as?: string): FieldDef;
50
+ export declare function checksSummary(key: string, as?: string): FieldDef;
51
+ export declare function custom(as: string, fn: (item: Record<string, unknown>) => unknown): FieldDef;
52
+ export declare function extract(item: Record<string, unknown>, schema: FieldDef[]): Record<string, unknown>;
53
+ export declare function renderList(label: string, items: Record<string, unknown>[], schema: FieldDef[]): string;
54
+ export declare function renderDetail(label: string, item: Record<string, unknown>, schema: FieldDef[]): string;
55
+ export declare function renderHelp(lines: string[]): string;
56
+ export declare function renderError(message: string, code: string, suggestions?: string[]): string;
57
+ export declare function renderOutput(blocks: string[]): string;