gh-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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/dist/bin/gh-axg.d.ts +2 -0
  4. package/dist/bin/gh-axg.js +4 -0
  5. package/dist/bin/gh-axg.js.map +1 -0
  6. package/dist/bin/gh-axi.d.ts +2 -0
  7. package/dist/bin/gh-axi.js +4 -0
  8. package/dist/bin/gh-axi.js.map +1 -0
  9. package/dist/src/args.d.ts +16 -0
  10. package/dist/src/args.js +66 -0
  11. package/dist/src/args.js.map +1 -0
  12. package/dist/src/body.d.ts +14 -0
  13. package/dist/src/body.js +44 -0
  14. package/dist/src/body.js.map +1 -0
  15. package/dist/src/cli.d.ts +1 -0
  16. package/dist/src/cli.js +112 -0
  17. package/dist/src/cli.js.map +1 -0
  18. package/dist/src/commands/api.d.ts +3 -0
  19. package/dist/src/commands/api.js +144 -0
  20. package/dist/src/commands/api.js.map +1 -0
  21. package/dist/src/commands/home.d.ts +3 -0
  22. package/dist/src/commands/home.js +42 -0
  23. package/dist/src/commands/home.js.map +1 -0
  24. package/dist/src/commands/issue.d.ts +3 -0
  25. package/dist/src/commands/issue.js +432 -0
  26. package/dist/src/commands/issue.js.map +1 -0
  27. package/dist/src/commands/label.d.ts +3 -0
  28. package/dist/src/commands/label.js +121 -0
  29. package/dist/src/commands/label.js.map +1 -0
  30. package/dist/src/commands/pr.d.ts +3 -0
  31. package/dist/src/commands/pr.js +544 -0
  32. package/dist/src/commands/pr.js.map +1 -0
  33. package/dist/src/commands/release.d.ts +3 -0
  34. package/dist/src/commands/release.js +209 -0
  35. package/dist/src/commands/release.js.map +1 -0
  36. package/dist/src/commands/repo.d.ts +3 -0
  37. package/dist/src/commands/repo.js +182 -0
  38. package/dist/src/commands/repo.js.map +1 -0
  39. package/dist/src/commands/run.d.ts +3 -0
  40. package/dist/src/commands/run.js +218 -0
  41. package/dist/src/commands/run.js.map +1 -0
  42. package/dist/src/commands/search.d.ts +3 -0
  43. package/dist/src/commands/search.js +295 -0
  44. package/dist/src/commands/search.js.map +1 -0
  45. package/dist/src/commands/workflow.d.ts +3 -0
  46. package/dist/src/commands/workflow.js +126 -0
  47. package/dist/src/commands/workflow.js.map +1 -0
  48. package/dist/src/context.d.ts +13 -0
  49. package/dist/src/context.js +48 -0
  50. package/dist/src/context.js.map +1 -0
  51. package/dist/src/errors.d.ts +8 -0
  52. package/dist/src/errors.js +84 -0
  53. package/dist/src/errors.js.map +1 -0
  54. package/dist/src/gh.d.ts +12 -0
  55. package/dist/src/gh.js +54 -0
  56. package/dist/src/gh.js.map +1 -0
  57. package/dist/src/suggestions.d.ts +12 -0
  58. package/dist/src/suggestions.js +431 -0
  59. package/dist/src/suggestions.js.map +1 -0
  60. package/dist/src/toon.d.ts +65 -0
  61. package/dist/src/toon.js +151 -0
  62. package/dist/src/toon.js.map +1 -0
  63. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kun Chen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # gh-axi
2
+
3
+ GitHub CLI for agents — designed with [AXI](https://github.com/kunchenguid/axi) (Agent eXperience Interface).
4
+
5
+ Wraps the official `gh` cli with token-efficient TOON output, contextual next-step suggestions, and structured error handling.
6
+ Built for autonomous agents that interact with GitHub via shell execution.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install -g gh-axi
12
+ ```
13
+
14
+ Requires Node 20+ and [`gh`](https://cli.github.com/) authenticated via `gh auth login`.
15
+
16
+ ## Usage
17
+
18
+ ```bash
19
+ gh-axi # dashboard — live state, no args needed
20
+ gh-axi issue list # list issues in current repo
21
+ gh-axi pr view 42 # view pull request #42
22
+ gh-axi run list -R owner/repo # list workflow runs for a specific repo
23
+ ```
24
+
25
+ ### Commands
26
+
27
+ | Command | Description |
28
+ | ---------- | --------------------------------------------------------- |
29
+ | `issue` | Issues — list, view, create, edit, close, reopen, comment |
30
+ | `pr` | Pull requests — list, view, create, merge, review, checks |
31
+ | `run` | Workflow runs — list, view, rerun, cancel, watch |
32
+ | `workflow` | Workflows — list, view, run, enable, disable |
33
+ | `release` | Releases — list, view, create, edit, delete |
34
+ | `repo` | Repositories — list, view, create, edit, clone, fork |
35
+ | `label` | Labels — list, create, edit, delete |
36
+ | `search` | Search repositories |
37
+ | `api` | Raw GitHub API access |
38
+
39
+ ### Global flags
40
+
41
+ - `-R, --repo OWNER/NAME` — target repository (auto-detected from git remote if omitted)
42
+ - `--help` — show help for any command
43
+
44
+ ## License
45
+
46
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../src/cli.js';
3
+ main(process.argv.slice(2));
4
+ //# sourceMappingURL=gh-axg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-axg.js","sourceRoot":"","sources":["../../bin/gh-axg.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../src/cli.js';
3
+ main(process.argv.slice(2));
4
+ //# sourceMappingURL=gh-axi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-axi.js","sourceRoot":"","sources":["../../bin/gh-axi.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** Get a flag's value without modifying the args array. */
2
+ export declare function getFlag(args: string[], name: string): string | undefined;
3
+ /** Get a flag's value and remove both the flag and value from args. */
4
+ export declare function takeFlag(args: string[], flag: string): string | undefined;
5
+ /** Check if a boolean flag is present. */
6
+ export declare function hasFlag(args: string[], flag: string): boolean;
7
+ /** Check if a boolean flag is present and remove it from args. */
8
+ export declare function takeBoolFlag(args: string[], flag: string): boolean;
9
+ /** Collect all values for a repeatable flag. */
10
+ export declare function getAllFlags(args: string[], flag: string): string[];
11
+ /** Get the first positional arg (non-flag) starting from startIndex. */
12
+ export declare function getPositional(args: string[], startIndex: number): string | undefined;
13
+ /** Parse and validate a required numeric argument. */
14
+ export declare function requireNumber(raw: string | undefined, label: string): number;
15
+ /** Find the first numeric positional arg, remove it from args, and return it as a number. */
16
+ export declare function takeNumber(args: string[], label: string): number;
@@ -0,0 +1,66 @@
1
+ import { AxiError } from './errors.js';
2
+ /** Get a flag's value without modifying the args array. */
3
+ export function getFlag(args, name) {
4
+ const idx = args.indexOf(name);
5
+ if (idx === -1 || idx + 1 >= args.length)
6
+ return undefined;
7
+ return args[idx + 1];
8
+ }
9
+ /** Get a flag's value and remove both the flag and value from args. */
10
+ export function takeFlag(args, flag) {
11
+ const idx = args.indexOf(flag);
12
+ if (idx === -1)
13
+ return undefined;
14
+ const val = args[idx + 1];
15
+ args.splice(idx, 2);
16
+ return val;
17
+ }
18
+ /** Check if a boolean flag is present. */
19
+ export function hasFlag(args, flag) {
20
+ return args.includes(flag);
21
+ }
22
+ /** Check if a boolean flag is present and remove it from args. */
23
+ export function takeBoolFlag(args, flag) {
24
+ const idx = args.indexOf(flag);
25
+ if (idx === -1)
26
+ return false;
27
+ args.splice(idx, 1);
28
+ return true;
29
+ }
30
+ /** Collect all values for a repeatable flag. */
31
+ export function getAllFlags(args, flag) {
32
+ const result = [];
33
+ for (let i = 0; i < args.length; i++) {
34
+ if (args[i] === flag && i + 1 < args.length) {
35
+ result.push(args[i + 1]);
36
+ i++;
37
+ }
38
+ }
39
+ return result;
40
+ }
41
+ /** Get the first positional arg (non-flag) starting from startIndex. */
42
+ export function getPositional(args, startIndex) {
43
+ for (let i = startIndex; i < args.length; i++) {
44
+ if (!args[i].startsWith('--'))
45
+ return args[i];
46
+ }
47
+ return undefined;
48
+ }
49
+ /** Parse and validate a required numeric argument. */
50
+ export function requireNumber(raw, label) {
51
+ if (!raw)
52
+ throw new AxiError(`Missing ${label} number`, 'VALIDATION_ERROR');
53
+ const n = parseInt(raw, 10);
54
+ if (isNaN(n))
55
+ throw new AxiError(`Invalid ${label} number: ${raw}`, 'VALIDATION_ERROR');
56
+ return n;
57
+ }
58
+ /** Find the first numeric positional arg, remove it from args, and return it as a number. */
59
+ export function takeNumber(args, label) {
60
+ const raw = args.find((a) => /^\d+$/.test(a));
61
+ if (!raw)
62
+ throw new AxiError(`Missing ${label} number`, 'VALIDATION_ERROR');
63
+ args.splice(args.indexOf(raw), 1);
64
+ return Number(raw);
65
+ }
66
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared body cleaning and truncation for all entity types.
3
+ *
4
+ * Cleanups are only applied when content needs truncation.
5
+ * When --full is used, the raw body is returned as-is.
6
+ */
7
+ /** Clean up a body string to reduce token cost before truncation. */
8
+ export declare function cleanBody(text: string): string;
9
+ /**
10
+ * Truncate a body field for display.
11
+ * Cleanups are only applied when truncation is needed.
12
+ * Returns the raw body when it fits within maxLen.
13
+ */
14
+ export declare function truncateBody(body: unknown, maxLen?: number): string;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Shared body cleaning and truncation for all entity types.
3
+ *
4
+ * Cleanups are only applied when content needs truncation.
5
+ * When --full is used, the raw body is returned as-is.
6
+ */
7
+ /** Clean up a body string to reduce token cost before truncation. */
8
+ export function cleanBody(text) {
9
+ // Normalize GitHub PR/issue URLs to short references
10
+ let s = text.replace(/\[([^\]]+)\]\(https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)\)/g, '[$1](PR#$2)');
11
+ s = s.replace(/\[([^\]]+)\]\(https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/(\d+)\)/g, '[$1](Issue#$2)');
12
+ s = s.replace(/(?<!\()https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)/g, 'PR#$1');
13
+ s = s.replace(/(?<!\()https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/(\d+)/g, 'Issue#$1');
14
+ // Strip markdown image embeds: ![alt](url) → [image: alt]
15
+ s = s.replace(/!\[([^\]]*)\]\([^)]+\)/g, (_m, alt) => alt ? `[image: ${alt}]` : '[image]');
16
+ // Strip long URLs (>80 chars) in markdown links: [text](longurl) → [text]
17
+ s = s.replace(/\[([^\]]+)\]\(([^)]{80,})\)/g, '[$1]');
18
+ // Strip standalone long URLs (>100 chars) not in markdown
19
+ s = s.replace(/(?<!\()https?:\/\/\S{100,}/g, '[long URL removed]');
20
+ // Collapse email-style quoted blocks (lines starting with >) to a summary
21
+ s = s.replace(/(^|\n)(>\s?[^\n]*\n?){3,}/gm, '$1[quoted text removed]\n');
22
+ return s;
23
+ }
24
+ /**
25
+ * Truncate a body field for display.
26
+ * Cleanups are only applied when truncation is needed.
27
+ * Returns the raw body when it fits within maxLen.
28
+ */
29
+ export function truncateBody(body, maxLen = 500) {
30
+ if (typeof body !== 'string' || !body)
31
+ return '';
32
+ if (body.length <= maxLen)
33
+ return body;
34
+ const cleaned = cleanBody(body);
35
+ if (cleaned.length <= maxLen) {
36
+ // Cleanup made it fit, but content was modified — offer --full for the original
37
+ if (cleaned !== body) {
38
+ return cleaned + '\n(cleaned from ' + body.length + ' chars — use --full to see original)';
39
+ }
40
+ return cleaned;
41
+ }
42
+ return cleaned.slice(0, maxLen) + '\n... (truncated, ' + cleaned.length + ' chars total — use --full to see complete body)';
43
+ }
44
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/body.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,qDAAqD;IACrD,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,mEAAmE,EAAE,aAAa,CAAC,CAAC;IACzG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,qEAAqE,EAAE,gBAAgB,CAAC,CAAC;IACvG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,0DAA0D,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,4DAA4D,EAAE,UAAU,CAAC,CAAC;IACxF,0DAA0D;IAC1D,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3F,0EAA0E;IAC1E,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IACtD,0DAA0D;IAC1D,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,oBAAoB,CAAC,CAAC;IACnE,0EAA0E;IAC1E,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IACtD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAC7B,gFAAgF;QAChF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAAC,MAAM,GAAG,sCAAsC,CAAC;QAC7F,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,iDAAiD,CAAC;AAC9H,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function main(argv: string[]): Promise<void>;
@@ -0,0 +1,112 @@
1
+ import { resolveRepo } from './context.js';
2
+ import { AxiError } from './errors.js';
3
+ import { renderError } from './toon.js';
4
+ import { homeCommand } from './commands/home.js';
5
+ import { issueCommand, ISSUE_HELP } from './commands/issue.js';
6
+ import { prCommand, PR_HELP } from './commands/pr.js';
7
+ import { runCommand, RUN_HELP } from './commands/run.js';
8
+ import { workflowCommand, WORKFLOW_HELP } from './commands/workflow.js';
9
+ import { releaseCommand, RELEASE_HELP } from './commands/release.js';
10
+ import { repoCommand, REPO_HELP } from './commands/repo.js';
11
+ import { labelCommand, LABEL_HELP } from './commands/label.js';
12
+ import { searchCommand, SEARCH_HELP } from './commands/search.js';
13
+ import { apiCommand, API_HELP } from './commands/api.js';
14
+ const TOP_HELP = `usage: gh-axi [command] [flags]
15
+ commands[10]:
16
+ (none)=dashboard, issue, pr, run, workflow, release, repo, label, search, api
17
+ flags[2]:
18
+ -R/--repo <OWNER/NAME>, --help
19
+ `;
20
+ const COMMAND_HELP = {
21
+ issue: ISSUE_HELP,
22
+ pr: PR_HELP,
23
+ run: RUN_HELP,
24
+ workflow: WORKFLOW_HELP,
25
+ release: RELEASE_HELP,
26
+ repo: REPO_HELP,
27
+ label: LABEL_HELP,
28
+ search: SEARCH_HELP,
29
+ api: API_HELP,
30
+ };
31
+ const COMMANDS = {
32
+ issue: issueCommand,
33
+ pr: prCommand,
34
+ run: runCommand,
35
+ workflow: workflowCommand,
36
+ release: releaseCommand,
37
+ repo: repoCommand,
38
+ label: labelCommand,
39
+ search: searchCommand,
40
+ api: apiCommand,
41
+ };
42
+ export async function main(argv) {
43
+ // Extract global flags
44
+ const args = [...argv];
45
+ let repoFlag;
46
+ // Extract --repo / -R
47
+ for (let i = 0; i < args.length; i++) {
48
+ if ((args[i] === '--repo' || args[i] === '-R') && i + 1 < args.length) {
49
+ repoFlag = args[i + 1];
50
+ args.splice(i, 2);
51
+ i--;
52
+ }
53
+ }
54
+ // Top-level --help
55
+ if (args.includes('--help') && args.length === 1) {
56
+ process.stdout.write(TOP_HELP);
57
+ return;
58
+ }
59
+ // Determine command
60
+ const command = args[0];
61
+ if (!command) {
62
+ // No command = home dashboard
63
+ if (args.includes('--help')) {
64
+ process.stdout.write(TOP_HELP);
65
+ return;
66
+ }
67
+ const ctx = resolveRepo(repoFlag);
68
+ try {
69
+ const output = await homeCommand(args.slice(1), ctx);
70
+ process.stdout.write(output + '\n');
71
+ }
72
+ catch (err) {
73
+ writeError(err);
74
+ }
75
+ return;
76
+ }
77
+ // Command-level --help
78
+ if (args.includes('--help')) {
79
+ const help = COMMAND_HELP[command];
80
+ if (help) {
81
+ process.stdout.write(help);
82
+ return;
83
+ }
84
+ }
85
+ const handler = COMMANDS[command];
86
+ if (!handler) {
87
+ process.stdout.write(renderError(`Unknown command: ${command}`, 'UNKNOWN', [
88
+ 'Run `gh-axi --help` to see available commands',
89
+ ]) + '\n');
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ const ctx = resolveRepo(repoFlag);
94
+ try {
95
+ const output = await handler(args.slice(1), ctx);
96
+ process.stdout.write(output + '\n');
97
+ }
98
+ catch (err) {
99
+ writeError(err);
100
+ }
101
+ }
102
+ function writeError(err) {
103
+ if (err instanceof AxiError) {
104
+ process.stdout.write(renderError(err.message, err.code, err.suggestions) + '\n');
105
+ }
106
+ else {
107
+ const message = err instanceof Error ? err.message : String(err);
108
+ process.stdout.write(renderError(message, 'UNKNOWN') + '\n');
109
+ }
110
+ process.exitCode = 1;
111
+ }
112
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RepoContext } from '../context.js';
2
+ export declare const API_HELP = "usage: gh-axi api [<method>] <path>\ndescription: Make an authenticated GitHub API request. Defaults to GET if no method specified.\nmethods[6]:\n GET, POST, PUT, PATCH, DELETE, HEAD\nflags[3]:\n --field <key=value> (repeatable), --header <key:value> (repeatable), --paginate";
3
+ export declare function apiCommand(args: string[], ctx?: RepoContext): Promise<string>;
@@ -0,0 +1,144 @@
1
+ import { encode } from '@toon-format/toon';
2
+ import { ghExec } from '../gh.js';
3
+ import { AxiError } from '../errors.js';
4
+ import { hasFlag, getAllFlags } from '../args.js';
5
+ import { cleanBody } from '../body.js';
6
+ export const API_HELP = `usage: gh-axi api [<method>] <path>
7
+ description: Make an authenticated GitHub API request. Defaults to GET if no method specified.
8
+ methods[6]:
9
+ GET, POST, PUT, PATCH, DELETE, HEAD
10
+ flags[3]:
11
+ --field <key=value> (repeatable), --header <key:value> (repeatable), --paginate`;
12
+ const HTTP_METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD']);
13
+ /** Maximum length for raw (non-JSON) API output before truncation. */
14
+ const RAW_OUTPUT_TRUNCATION_LIMIT = 4000;
15
+ /** Strings longer than this threshold are cleaned up (image/URL stripping). */
16
+ const LONG_STRING_CLEANUP_THRESHOLD = 200;
17
+ /** Maximum length for cleaned string values before truncation. */
18
+ const STRING_VALUE_TRUNCATION_LIMIT = 2000;
19
+ export async function apiCommand(args, ctx) {
20
+ if (args[0] === '--help' || args.length === 0)
21
+ return API_HELP;
22
+ // Parse method and path from positional args
23
+ const positionals = [];
24
+ for (let i = 0; i < args.length; i++) {
25
+ if (args[i].startsWith('--')) {
26
+ i++; // skip flag value
27
+ }
28
+ else {
29
+ positionals.push(args[i]);
30
+ }
31
+ }
32
+ let method;
33
+ let path;
34
+ if (positionals.length >= 2 && HTTP_METHODS.has(positionals[0].toUpperCase())) {
35
+ method = positionals[0].toUpperCase();
36
+ path = positionals[1];
37
+ }
38
+ else if (positionals.length >= 1) {
39
+ method = 'GET';
40
+ path = positionals[0];
41
+ }
42
+ else {
43
+ throw new AxiError('API path is required: gh-axi api [<method>] <path>', 'VALIDATION_ERROR');
44
+ }
45
+ const ghArgs = ['api', path, '--method', method];
46
+ const fields = getAllFlags(args, '--field');
47
+ for (const f of fields) {
48
+ ghArgs.push('--field', f);
49
+ }
50
+ const headers = getAllFlags(args, '--header');
51
+ for (const h of headers) {
52
+ ghArgs.push('--header', h);
53
+ }
54
+ if (hasFlag(args, '--paginate'))
55
+ ghArgs.push('--paginate');
56
+ // Try to parse as JSON, strip noisy fields, encode to TOON; fall back to raw output
57
+ const raw = await ghExec(ghArgs, ctx);
58
+ try {
59
+ const data = JSON.parse(raw);
60
+ const cleaned = stripNoisyFields(data);
61
+ return encode(cleaned);
62
+ }
63
+ catch {
64
+ // Not JSON — return raw output (truncated if too long)
65
+ const trimmed = raw.trim();
66
+ if (trimmed.length > RAW_OUTPUT_TRUNCATION_LIMIT) {
67
+ return trimmed.slice(0, RAW_OUTPUT_TRUNCATION_LIMIT) + '\n... (truncated)';
68
+ }
69
+ return trimmed;
70
+ }
71
+ }
72
+ /** Fields from raw GitHub API responses that are noisy/useless for agents */
73
+ const NOISY_KEYS = new Set([
74
+ 'avatar_url', 'gravatar_id', 'followers_url', 'following_url',
75
+ 'gists_url', 'starred_url', 'subscriptions_url', 'organizations_url',
76
+ 'repos_url', 'events_url', 'received_events_url', 'labels_url',
77
+ 'comments_url', 'events_url', 'timeline_url', 'performed_via_github_app',
78
+ 'node_id', 'url', 'repository_url', 'html_url',
79
+ 'reactions', 'user_view_type', 'site_admin',
80
+ 'issue_dependencies_summary', 'sub_issues_summary', 'pinned_comment',
81
+ 'score', 'permissions', 'verification', '_links',
82
+ ]);
83
+ /** Keys ending in _url that are template URLs agents never use */
84
+ function isTemplateUrlKey(key) {
85
+ if (!key.endsWith('_url'))
86
+ return false;
87
+ // Keep a few meaningful URL keys
88
+ const KEEP_URL_KEYS = new Set([
89
+ 'diff_url', 'patch_url', 'clone_url', 'ssh_url', 'git_url', 'svn_url',
90
+ 'commit_url', // useful for linking to specific commits
91
+ ]);
92
+ return !KEEP_URL_KEYS.has(key);
93
+ }
94
+ /** Collapse repo/repository objects to essential fields only */
95
+ function collapseRepo(obj) {
96
+ if ('full_name' in obj) {
97
+ const collapsed = { full_name: obj.full_name };
98
+ if (obj.default_branch)
99
+ collapsed.default_branch = obj.default_branch;
100
+ if (obj.private)
101
+ collapsed.private = obj.private;
102
+ return collapsed;
103
+ }
104
+ return obj;
105
+ }
106
+ function stripNoisyFields(obj, depth = 0) {
107
+ if (depth > 8)
108
+ return obj;
109
+ if (Array.isArray(obj)) {
110
+ return obj.map((item) => stripNoisyFields(item, depth + 1));
111
+ }
112
+ if (obj !== null && typeof obj === 'object') {
113
+ const record = obj;
114
+ const result = {};
115
+ for (const [key, value] of Object.entries(record)) {
116
+ if (NOISY_KEYS.has(key))
117
+ continue;
118
+ if (isTemplateUrlKey(key))
119
+ continue;
120
+ // Strip nested user objects down to just login
121
+ if (key === 'user' && value && typeof value === 'object' && 'login' in value) {
122
+ result[key] = value.login;
123
+ continue;
124
+ }
125
+ // Collapse repo/repository objects to essential fields
126
+ if ((key === 'repo' || key === 'repository') && value && typeof value === 'object') {
127
+ result[key] = collapseRepo(value);
128
+ continue;
129
+ }
130
+ result[key] = stripNoisyFields(value, depth + 1);
131
+ }
132
+ return result;
133
+ }
134
+ // Clean and truncate long string values (e.g. bodies, comments)
135
+ if (typeof obj === 'string' && obj.length > LONG_STRING_CLEANUP_THRESHOLD) {
136
+ const s = cleanBody(obj);
137
+ if (s.length > STRING_VALUE_TRUNCATION_LIMIT) {
138
+ return s.slice(0, STRING_VALUE_TRUNCATION_LIMIT) + '... (truncated)';
139
+ }
140
+ return s;
141
+ }
142
+ return obj;
143
+ }
144
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RepoContext } from '../context.js';
2
+ export declare const HOME_HELP = "";
3
+ export declare function homeCommand(_args: string[], ctx?: RepoContext): Promise<string>;
@@ -0,0 +1,42 @@
1
+ import { ghJson } from '../gh.js';
2
+ import { field, lower, pluck, mapEnum, renderList, renderHelp, renderOutput, } from '../toon.js';
3
+ import { getSuggestions } from '../suggestions.js';
4
+ import { encode } from '@toon-format/toon';
5
+ export const HOME_HELP = '';
6
+ const issueSchema = [
7
+ field('number'),
8
+ field('title'),
9
+ lower('state'),
10
+ pluck('author', 'login', 'author'),
11
+ ];
12
+ const prSchema = [
13
+ field('number'),
14
+ field('title'),
15
+ pluck('author', 'login', 'author'),
16
+ mapEnum('reviewDecision', { APPROVED: 'approved', CHANGES_REQUESTED: 'changes_requested', REVIEW_REQUIRED: 'required' }, 'none', 'review'),
17
+ ];
18
+ const runSchema = [
19
+ field('databaseId', 'id'),
20
+ field('displayTitle', 'title'),
21
+ lower('status'),
22
+ field('workflowName', 'workflow'),
23
+ ];
24
+ export async function homeCommand(_args, ctx) {
25
+ // Run 3 queries in parallel
26
+ const [issues, prs, runs] = await Promise.all([
27
+ ghJson(['issue', 'list', '--json', 'number,title,state,author', '--limit', '2'], ctx).catch(() => []),
28
+ ghJson(['pr', 'list', '--json', 'number,title,author,reviewDecision', '--limit', '1'], ctx).catch(() => []),
29
+ ghJson(['run', 'list', '--json', 'databaseId,displayTitle,status,workflowName', '--limit', '1'], ctx).catch(() => []),
30
+ ]);
31
+ const blocks = [];
32
+ if (ctx) {
33
+ blocks.push(encode({ repo: ctx.nwo }));
34
+ }
35
+ blocks.push(renderList('issues', issues, issueSchema));
36
+ blocks.push(renderList('prs', prs, prSchema));
37
+ blocks.push(renderList('runs', runs, runSchema));
38
+ const suggestions = getSuggestions({ domain: 'home', action: 'home', repo: ctx });
39
+ blocks.push(renderHelp(suggestions));
40
+ return renderOutput(blocks);
41
+ }
42
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B,MAAM,WAAW,GAAe;IAC9B,KAAK,CAAC,QAAQ,CAAC;IACf,KAAK,CAAC,OAAO,CAAC;IACd,KAAK,CAAC,OAAO,CAAC;IACd,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;CACnC,CAAC;AAEF,MAAM,QAAQ,GAAe;IAC3B,KAAK,CAAC,QAAQ,CAAC;IACf,KAAK,CAAC,OAAO,CAAC;IACd,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;IAClC,OAAO,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC3I,CAAC;AAEF,MAAM,SAAS,GAAe;IAC5B,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC;IACzB,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,QAAQ,CAAC;IACf,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAe,EAAE,GAAiB;IAClE,4BAA4B;IAC5B,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,MAAM,CACJ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B,EAAE,SAAS,EAAE,GAAG,CAAC,EACxE,GAAG,CACJ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAA+B,CAAC;QAC9C,MAAM,CACJ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oCAAoC,EAAE,SAAS,EAAE,GAAG,CAAC,EAC9E,GAAG,CACJ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAA+B,CAAC;QAC9C,MAAM,CACJ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,6CAA6C,EAAE,SAAS,EAAE,GAAG,CAAC,EACxF,GAAG,CACJ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAA+B,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAErC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RepoContext } from '../context.js';
2
+ export declare const ISSUE_HELP = "usage: gh-axi issue <subcommand> [flags]\nsubcommands[13]:\n list, view <number>, create, edit <number>, close <number>, reopen <number>, comment <number>, delete <number>, lock <number>, unlock <number>, pin <number>, unpin <number>, transfer <number>\nflags{list}:\n --state <open|closed|all>, --label <name>, --assignee <login>, --author <login>, --milestone <name>, --sort <created|updated|comments>, --limit <n> (default 30)\nflags{view}:\n --comments, --full (show complete body without truncation)\nflags{create}:\n --title <text> (required), --body <text>, --assignee <login>, --label <name>, --milestone <name>\nflags{edit}:\n --title, --body, --add-label, --remove-label, --add-assignee, --remove-assignee, --milestone\nflags{close}:\n --reason <completed|not_planned>, --comment <text>\nflags{comment}:\n --body <text> (required)\nflags{transfer}:\n --repo <owner/name> (required)";
3
+ export declare function issueCommand(args: string[], ctx?: RepoContext): Promise<string>;