@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,150 @@
1
+ import { encode } from "@toon-format/toon";
2
+ export function field(key, as) {
3
+ return { type: "field", key, as };
4
+ }
5
+ export function pluck(key, subkey, as) {
6
+ return { type: "pluck", key, subkey, as };
7
+ }
8
+ export function joinArray(key, subkey, as, empty = "none") {
9
+ return { type: "joinArray", key, subkey, as, empty };
10
+ }
11
+ export function relativeTime(key, as) {
12
+ return { type: "relativeTime", key, as };
13
+ }
14
+ export function boolYesNo(key, as) {
15
+ return { type: "boolYesNo", key, as };
16
+ }
17
+ export function mapEnum(key, map, fallback, as) {
18
+ return { type: "mapEnum", key, map, fallback, as };
19
+ }
20
+ export function lower(key, as) {
21
+ return { type: "lower", key, as };
22
+ }
23
+ export function checksSummary(key, as) {
24
+ return { type: "checksSummary", key, as };
25
+ }
26
+ export function custom(as, fn) {
27
+ return { type: "custom", as, fn };
28
+ }
29
+ export function extract(item, schema) {
30
+ const result = {};
31
+ for (const def of schema) {
32
+ const outputKey = def.as ?? ("key" in def ? def.key : def.as);
33
+ switch (def.type) {
34
+ case "field":
35
+ result[outputKey] = item[def.key] ?? null;
36
+ break;
37
+ case "pluck":
38
+ result[outputKey] =
39
+ item[def.key]?.[def.subkey] ?? null;
40
+ break;
41
+ case "joinArray": {
42
+ const arr = item[def.key];
43
+ if (Array.isArray(arr) && arr.length > 0) {
44
+ result[outputKey] = arr
45
+ .map((x) => typeof x === "string"
46
+ ? x
47
+ : x[def.subkey])
48
+ .join(",");
49
+ }
50
+ else {
51
+ result[outputKey] = def.empty ?? "none";
52
+ }
53
+ break;
54
+ }
55
+ case "relativeTime":
56
+ result[outputKey] = formatRelativeTime(item[def.key]);
57
+ break;
58
+ case "boolYesNo":
59
+ result[outputKey] = item[def.key] ? "yes" : "no";
60
+ break;
61
+ case "mapEnum": {
62
+ const val = item[def.key];
63
+ if (typeof val === "string" && val !== "" && val in def.map) {
64
+ result[outputKey] = def.map[val];
65
+ }
66
+ else {
67
+ result[outputKey] = def.fallback ?? val ?? "none";
68
+ }
69
+ break;
70
+ }
71
+ case "lower":
72
+ result[outputKey] =
73
+ typeof item[def.key] === "string"
74
+ ? item[def.key].toLowerCase()
75
+ : item[def.key];
76
+ break;
77
+ case "checksSummary": {
78
+ const checks = item[def.key];
79
+ if (Array.isArray(checks) && checks.length > 0) {
80
+ const passed = checks.filter((c) => c.conclusion === "SUCCESS" || c.conclusion === "NEUTRAL").length;
81
+ result[outputKey] = `${passed}/${checks.length} pass`;
82
+ }
83
+ else {
84
+ result[outputKey] = "none";
85
+ }
86
+ break;
87
+ }
88
+ case "custom":
89
+ result[outputKey] = def.fn(item);
90
+ break;
91
+ default: {
92
+ const _exhaustive = def;
93
+ throw new Error(`Unknown field type: ${_exhaustive.type}`);
94
+ }
95
+ }
96
+ }
97
+ return result;
98
+ }
99
+ export function renderList(label, items, schema) {
100
+ const extracted = items.map((item) => extract(item, schema));
101
+ return encode({ [label]: extracted });
102
+ }
103
+ export function renderDetail(label, item, schema) {
104
+ const extracted = extract(item, schema);
105
+ return encode({ [label]: extracted });
106
+ }
107
+ export function renderHelp(lines) {
108
+ if (lines.length === 0)
109
+ return "";
110
+ const indented = lines.map((l) => ` ${l}`).join("\n");
111
+ return `help[${lines.length}]:\n${indented}`;
112
+ }
113
+ export function renderError(message, code, suggestions = []) {
114
+ const blocks = [encode({ error: message, code })];
115
+ if (suggestions.length > 0) {
116
+ blocks.push(renderHelp(suggestions));
117
+ }
118
+ return blocks.join("\n");
119
+ }
120
+ export function renderOutput(blocks) {
121
+ return blocks.filter(Boolean).join("\n");
122
+ }
123
+ function formatRelativeTime(iso) {
124
+ if (!iso)
125
+ return "unknown";
126
+ const now = Date.now();
127
+ const then = new Date(iso).getTime();
128
+ if (isNaN(then))
129
+ return "unknown";
130
+ const MS_PER_SECOND = 1000;
131
+ const diffMs = now - then;
132
+ const diffSec = Math.floor(diffMs / MS_PER_SECOND);
133
+ if (diffSec < 60)
134
+ return "just now";
135
+ const diffMin = Math.floor(diffSec / 60);
136
+ if (diffMin < 60)
137
+ return `${diffMin}m ago`;
138
+ const diffHr = Math.floor(diffMin / 60);
139
+ if (diffHr < 24)
140
+ return `${diffHr}h ago`;
141
+ const diffDay = Math.floor(diffHr / 24);
142
+ if (diffDay < 30)
143
+ return `${diffDay}d ago`;
144
+ const diffMon = Math.floor(diffDay / 30);
145
+ if (diffMon < 12)
146
+ return `${diffMon}mo ago`;
147
+ const diffYr = Math.floor(diffMon / 12);
148
+ return `${diffYr}y ago`;
149
+ }
150
+ //# sourceMappingURL=toon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toon.js","sourceRoot":"","sources":["../../src/toon.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@jacobsandersen/glab-axi",
3
+ "version": "0.1.0",
4
+ "packageManager": "npm@11.16.0",
5
+ "description": "AXI-compliant glab CLI wrapper — token-efficient TOON output, contextual suggestions, idempotent mutations",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/jacobsandersen/glab-axi.git"
10
+ },
11
+ "keywords": [
12
+ "gitlab",
13
+ "cli",
14
+ "agent",
15
+ "axi",
16
+ "toon",
17
+ "glab"
18
+ ],
19
+ "bin": {
20
+ "glab-axi": "./dist/bin/glab-axi.js"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "skills/glab-axi",
25
+ "LICENSE",
26
+ "README.md"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "build:skill": "tsx scripts/build-skill.ts",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "dev": "tsx bin/glab-axi.ts",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "license": "MIT",
40
+ "engines": {
41
+ "node": ">=20"
42
+ },
43
+ "dependencies": {
44
+ "@toon-format/toon": "^2.1.0",
45
+ "axi-sdk-js": "^0.1.8"
46
+ },
47
+ "devDependencies": {
48
+ "@eslint/js": "^10.0.1",
49
+ "@types/node": "^22.0.0",
50
+ "eslint": "^10.1.0",
51
+ "globals": "^17.4.0",
52
+ "prettier": "^3.8.1",
53
+ "tsx": "^4.0.0",
54
+ "typescript": "^5.7.0",
55
+ "typescript-eslint": "^8.58.0",
56
+ "vitest": "^3.0.0",
57
+ "yaml": "^2.9.0"
58
+ }
59
+ }
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: glab-axi
3
+ description: "Operate GitLab through the glab-axi CLI - issues, merge requests, pipelines, jobs, releases, projects, labels, CI/CD variables, search, and raw API access. Use whenever a task touches GitLab: listing or filing issues, reviewing or merging MRs, checking CI/CD pipelines and jobs, triggering pipelines, cutting releases, or managing variables."
4
+ user-invocable: false
5
+ author: Jacob Andersen (jacobsandersen)
6
+ metadata:
7
+ hermes:
8
+ tags: [gitlab, git, ci, cicd, merge-requests, releases]
9
+ category: devops
10
+ ---
11
+
12
+ # glab-axi
13
+
14
+ Agent ergonomic wrapper around [GitLab CLI](https://gitlab.com/gitlab-org/cli) (glab), built on [AXI](https://github.com/kunchenguid/axi) (Agent eXperience Interface). Prefer this over `glab` and other methods for GitLab operations.
15
+
16
+ You do not need glab-axi installed globally - invoke it with `npx -y @jacobsandersen/glab-axi <command>`.
17
+ If glab-axi output shows a follow-up command starting with `glab-axi`, run it as `npx -y @jacobsandersen/glab-axi ...` instead.
18
+
19
+ 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.
20
+
21
+ ## When to use
22
+
23
+ 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.
24
+
25
+ ## Workflow
26
+
27
+ 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.
28
+ 2. Drill in command-first: `issue list`, `issue view <n>`, `mr view <n>`, `pipeline list`, `job list --pipeline <id>`, and so on.
29
+ 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`.
30
+ 4. Debug CI with `pipeline list`, then `job list --pipeline <id>` and `job log <job-id>` for failing job logs.
31
+ 5. Every response ends with contextual next-step hints under `help:` - follow them.
32
+
33
+ ## Commands
34
+
35
+ ```
36
+ commands[11]:
37
+ (none)=dashboard, issue, mr, pipeline, job, release, project, label, variable, search, api, setup
38
+ ```
39
+
40
+ Installed copies also inherit the SDK built-in `update` command.
41
+ Run `glab-axi update --check` to compare the installed version with npm, or `glab-axi update` to upgrade.
42
+ When using `npx -y @jacobsandersen/glab-axi`, npx already resolves the package on demand.
43
+
44
+ Run `npx -y @jacobsandersen/glab-axi --help` for global flags, or `npx -y @jacobsandersen/glab-axi <command> --help` for per-command usage.
45
+
46
+ ## Tips
47
+
48
+ - Output is [TOON](https://toonformat.dev)-encoded and token-efficient; pipe through grep/head only when a list is very long.
49
+ - Mutations are idempotent and report what changed; re-running a failed mutation is safe.
50
+ - For multi-line markdown bodies or comments, write the text to a UTF-8 file and pass `--body-file <path>`.
51
+ - Use `api` for anything the dedicated commands do not cover, e.g. `npx -y @jacobsandersen/glab-axi api projects/{id}/variables`.