gh-axi 0.1.30 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/src/args.d.ts +9 -0
- package/dist/src/args.js +30 -0
- package/dist/src/args.js.map +1 -1
- package/dist/src/cli.d.ts +1 -1
- package/dist/src/cli.js +36 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/api.d.ts +1 -1
- package/dist/src/commands/api.js +36 -13
- package/dist/src/commands/api.js.map +1 -1
- package/dist/src/commands/issue.d.ts +1 -1
- package/dist/src/commands/issue.js +74 -7
- package/dist/src/commands/issue.js.map +1 -1
- package/dist/src/commands/label.js +11 -1
- package/dist/src/commands/label.js.map +1 -1
- package/dist/src/commands/pr.js +87 -1
- package/dist/src/commands/pr.js.map +1 -1
- package/dist/src/commands/project.js +33 -1
- package/dist/src/commands/project.js.map +1 -1
- package/dist/src/commands/release.js +26 -1
- package/dist/src/commands/release.js.map +1 -1
- package/dist/src/commands/repo.js +21 -1
- package/dist/src/commands/repo.js.map +1 -1
- package/dist/src/commands/run.js +20 -1
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/search.js +19 -1
- package/dist/src/commands/search.js.map +1 -1
- package/dist/src/commands/stack.d.ts +2 -0
- package/dist/src/commands/stack.js +311 -0
- package/dist/src/commands/stack.js.map +1 -0
- package/dist/src/commands/variable.js +9 -1
- package/dist/src/commands/variable.js.map +1 -1
- package/dist/src/commands/workflow.js +13 -1
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/errors.d.ts +4 -0
- package/dist/src/errors.js +8 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/skill.js +8 -4
- package/dist/src/skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/gh-axi/SKILL.md +9 -5
package/README.md
CHANGED
|
@@ -43,6 +43,7 @@ npx skills add kunchenguid/gh-axi --skill gh-axi -g
|
|
|
43
43
|
That is the entire setup - no npm install needed.
|
|
44
44
|
The skill teaches your agent to run gh-axi through `npx -y gh-axi`, so the CLI comes along on demand.
|
|
45
45
|
You still need [`gh`](https://cli.github.com/) installed and authenticated via `gh auth login` (Node 20+ required).
|
|
46
|
+
Stacked PR commands also require GitHub's official extension: `gh extension install github/gh-stack`.
|
|
46
47
|
For GitHub Enterprise or another custom host, authenticate `gh` for that host and either pass `--hostname <host>` after the command or set `GH_HOST`.
|
|
47
48
|
|
|
48
49
|
The skill is not a user-facing slash command (`user-invocable: false`).
|
|
@@ -85,6 +86,9 @@ gh-axi # dashboard - live state, no args needed
|
|
|
85
86
|
gh-axi issue list # list issues in current repo
|
|
86
87
|
gh-axi issue subissue list 16 # list sub-issues for issue #16
|
|
87
88
|
gh-axi pr view 42 # view pull request #42
|
|
89
|
+
gh-axi stack init model api ui # create or adopt a stack of branches
|
|
90
|
+
gh-axi stack submit --open # create ready-for-review stacked PRs without prompts
|
|
91
|
+
gh-axi stack view # inspect the current stack as token-efficient TOON
|
|
88
92
|
gh-axi issue edit 42 --add-label bug --add-label chore # repeat a flag per value
|
|
89
93
|
gh-axi run list -R owner/repo # list workflow runs for a specific repo
|
|
90
94
|
gh-axi issue list --hostname git.example.com # target a GitHub Enterprise host
|
|
@@ -130,6 +134,10 @@ When truncation happens, gh-axi best-effort saves the complete log to a temp fil
|
|
|
130
134
|
`gh-axi pr checks <number>` and the `checks` summary of `gh-axi pr view <number>` bucket every entry of the PR's status-check rollup as `pass`, `fail`, `skip`, or `pending`, covering both check runs (GitHub Actions and similar) and legacy commit statuses (Vercel, `ci/circleci`, and similar).
|
|
131
135
|
Cancelled, stale, timed-out, action-required, and startup-failure check runs count as failed, so a red PR is never reported as merely unfinished.
|
|
132
136
|
|
|
137
|
+
`gh-axi stack` is a strict, non-interactive adapter over the official `github/gh-stack` extension. It supports `view`, `init`, `add`, `checkout`, `push`, `submit`, `sync`, `rebase`, `link`, `unstack`, `merge`, and branch navigation. It intentionally excludes the interactive `modify` and `switch` TUIs and the human-only `alias` and `feedback` utilities.
|
|
138
|
+
Stack commands operate on local branches and `.git/gh-stack`, so run them from the target repository's working directory. They reject `-R`, `--repo`, and `GH_REPO` rather than pretending a remote repository is enough. `--hostname` remains available for authenticated GitHub Enterprise hosts.
|
|
139
|
+
Agent-safe behavior is automatic: `stack view` requests JSON, `stack submit` adds `--auto`, and `stack merge` requires an explicit stack or PR target and adds `--yes`. Rebase conflicts and other extension exits retain their original exit codes and include recovery guidance.
|
|
140
|
+
|
|
133
141
|
`gh-axi secret set <name>` reads the value only from piped stdin because secret flags would be visible in the `gh-axi` process argv.
|
|
134
142
|
`gh-axi secret list` never prints values, matching `gh secret list`.
|
|
135
143
|
`gh-axi secret list`, `set`, and `delete` accept `--env`/`-e <environment>` to scope a secret to a deployment environment; without it the repository scope is used.
|
|
@@ -143,8 +151,9 @@ Gist visibility is fixed at creation; a secret gist is unlisted (anyone with the
|
|
|
143
151
|
Two file-on-disk input forms are available: positional paths (`gist create a.py b.py`) or repeatable `--file` flags (`gist create --file a.py --file b.py`); mixing the two is an error.
|
|
144
152
|
To create a gist from piped content, use `--filename <name>` together with a pipe (`echo "..." | gh-axi gist create --filename foo.txt --public`).
|
|
145
153
|
|
|
146
|
-
`gh-axi api` accepts `--field`, `--header`, `--paginate`, `--jq <expression>`,
|
|
154
|
+
`gh-axi api` accepts `--field`, `--header`, `--paginate`, `--jq <expression>`, `--template <format>`, and `--full`; any other flag, an extra positional argument, or a repeated `--jq`/`--template` is rejected with a clear error instead of being silently dropped.
|
|
147
155
|
JSON responses are normally stripped of noisy fields before TOON encoding, but a response you shaped yourself with `--jq` or `--template` keeps every key and value verbatim — only over-long strings are still truncated so one field cannot flood an agent's context.
|
|
156
|
+
`--full` is an explicit opt-in escape hatch: it keeps every field and every complete value, and it also returns non-JSON response bodies without the length cap. `--full` is a gh-axi flag only, and gh-axi does not send it to `gh`. Compact output stays the default without `--full`.
|
|
148
157
|
|
|
149
158
|
### Commands
|
|
150
159
|
|
|
@@ -152,6 +161,7 @@ JSON responses are normally stripped of noisy fields before TOON encoding, but a
|
|
|
152
161
|
| ---------- | --------------------------------------------------------------------------- |
|
|
153
162
|
| `issue` | Issues — list, view, create, edit, close, reopen, comment, subissue |
|
|
154
163
|
| `pr` | Pull requests — list, view, create, merge, review, checks |
|
|
164
|
+
| `stack` | Stacked branches and PRs - create, submit, sync, rebase, merge, navigate |
|
|
155
165
|
| `run` | Existing workflow runs - list, view, watch, rerun, cancel, delete, download |
|
|
156
166
|
| `workflow` | Workflows - list, view, run (trigger), enable, disable |
|
|
157
167
|
| `release` | Releases — list, view, create, edit, delete |
|
package/dist/src/args.d.ts
CHANGED
|
@@ -22,3 +22,12 @@ export declare function getPositional(args: string[], startIndex: number): strin
|
|
|
22
22
|
export declare function requireNumber(raw: string | undefined, label: string): number;
|
|
23
23
|
/** Find the first numeric positional arg, remove it from args, and return it as a number. */
|
|
24
24
|
export declare function takeNumber(args: string[], label: string): number;
|
|
25
|
+
/**
|
|
26
|
+
* Reject flags in `args` that are not listed in `known`, after the subcommand
|
|
27
|
+
* has parsed the flags it recognizes. Positionals and `--help`/`-h` always
|
|
28
|
+
* pass; `--` ends flag scanning. Value forms (`--flag=v`) are matched by flag
|
|
29
|
+
* name only. Throws VALIDATION_ERROR listing every offending flag plus a
|
|
30
|
+
* one-turn self-correction hint (usage + `--help`), per AXI principle 6:
|
|
31
|
+
* never silently drop an unknown flag.
|
|
32
|
+
*/
|
|
33
|
+
export declare function rejectUnknownFlags(args: string[], known: readonly string[], command: string, sub: string): void;
|
package/dist/src/args.js
CHANGED
|
@@ -121,4 +121,34 @@ export function takeNumber(args, label) {
|
|
|
121
121
|
args.splice(args.indexOf(raw), 1);
|
|
122
122
|
return Number(raw);
|
|
123
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Reject flags in `args` that are not listed in `known`, after the subcommand
|
|
126
|
+
* has parsed the flags it recognizes. Positionals and `--help`/`-h` always
|
|
127
|
+
* pass; `--` ends flag scanning. Value forms (`--flag=v`) are matched by flag
|
|
128
|
+
* name only. Throws VALIDATION_ERROR listing every offending flag plus a
|
|
129
|
+
* one-turn self-correction hint (usage + `--help`), per AXI principle 6:
|
|
130
|
+
* never silently drop an unknown flag.
|
|
131
|
+
*/
|
|
132
|
+
export function rejectUnknownFlags(args, known, command, sub) {
|
|
133
|
+
const knownSet = new Set(known);
|
|
134
|
+
const unknown = [];
|
|
135
|
+
for (let i = 0; i < args.length; i++) {
|
|
136
|
+
const tok = args[i];
|
|
137
|
+
if (tok === "--")
|
|
138
|
+
break;
|
|
139
|
+
if (!tok.startsWith("-"))
|
|
140
|
+
continue;
|
|
141
|
+
const name = tok.split("=", 1)[0];
|
|
142
|
+
if (name === "--help" || name === "-h")
|
|
143
|
+
continue;
|
|
144
|
+
if (knownSet.has(name))
|
|
145
|
+
continue;
|
|
146
|
+
if (!unknown.includes(name))
|
|
147
|
+
unknown.push(name);
|
|
148
|
+
}
|
|
149
|
+
if (unknown.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
const list = unknown.join(", ");
|
|
152
|
+
throw new AxiError(`unknown flag${unknown.length > 1 ? "s" : ""} for gh-axi ${command} ${sub}: ${list}`, "VALIDATION_ERROR", [`gh-axi ${command} ${sub} [flags]`, `gh-axi ${command} ${sub} --help`]);
|
|
153
|
+
}
|
|
124
154
|
//# sourceMappingURL=args.js.map
|
package/dist/src/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ type MainOptions = {
|
|
|
4
4
|
argv?: string[];
|
|
5
5
|
stdout?: CliStdout;
|
|
6
6
|
};
|
|
7
|
-
export declare const TOP_HELP = "usage: gh-axi [command] [args] [flags]\ncommands[
|
|
7
|
+
export declare const TOP_HELP = "usage: gh-axi [command] [args] [flags]\ncommands[16]:\n (none)=dashboard, issue, pr, stack, run, workflow, release, repo, label, gist, project, secret, variable, search, api, setup\nflags[4]:\n -R/--repo <OWNER/NAME> (after command), --hostname <host> (after command) or GH_HOST env, both flags accept space or equals form, --help, -v/-V/--version\nexamples:\n gh-axi\n gh-axi issue list --state open\n gh-axi issue list -R owner/name\n gh-axi issue list --repo=owner/name\n gh-axi issue list --hostname git.example.com\n gh-axi pr view 42\n gh-axi stack view\n gh-axi secret list\n gh-axi setup hooks\n";
|
|
8
8
|
export declare function main(options?: MainOptions): Promise<void>;
|
|
9
9
|
export {};
|
package/dist/src/cli.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { encode } from "@toon-format/toon";
|
|
1
2
|
import { runAxiCli } from "axi-sdk-js";
|
|
2
3
|
import { resolveRepo } from "./context.js";
|
|
3
4
|
import { homeCommand } from "./commands/home.js";
|
|
@@ -15,13 +16,15 @@ import { searchCommand, SEARCH_HELP } from "./commands/search.js";
|
|
|
15
16
|
import { apiCommand, API_HELP } from "./commands/api.js";
|
|
16
17
|
import { gistCommand, GIST_HELP } from "./commands/gist.js";
|
|
17
18
|
import { setupCommand, SETUP_HELP } from "./commands/setup.js";
|
|
19
|
+
import { stackCommand, STACK_HELP } from "./commands/stack.js";
|
|
18
20
|
import { resolveHost } from "./host.js";
|
|
19
21
|
import { VERSION } from "./version.js";
|
|
20
22
|
import { withSuggestionHost } from "./suggestions.js";
|
|
23
|
+
import { AxiError, exitCodeForError, StackError } from "./errors.js";
|
|
21
24
|
export const DESCRIPTION = "Agent ergonomic wrapper around Github CLI. Prefer this over `gh` and other methods for Github operations.";
|
|
22
25
|
export const TOP_HELP = `usage: gh-axi [command] [args] [flags]
|
|
23
|
-
commands[
|
|
24
|
-
(none)=dashboard, issue, pr, run, workflow, release, repo, label, gist, project, secret, variable, search, api, setup
|
|
26
|
+
commands[16]:
|
|
27
|
+
(none)=dashboard, issue, pr, stack, run, workflow, release, repo, label, gist, project, secret, variable, search, api, setup
|
|
25
28
|
flags[4]:
|
|
26
29
|
-R/--repo <OWNER/NAME> (after command), --hostname <host> (after command) or GH_HOST env, both flags accept space or equals form, --help, -v/-V/--version
|
|
27
30
|
examples:
|
|
@@ -31,6 +34,7 @@ examples:
|
|
|
31
34
|
gh-axi issue list --repo=owner/name
|
|
32
35
|
gh-axi issue list --hostname git.example.com
|
|
33
36
|
gh-axi pr view 42
|
|
37
|
+
gh-axi stack view
|
|
34
38
|
gh-axi secret list
|
|
35
39
|
gh-axi setup hooks
|
|
36
40
|
`;
|
|
@@ -49,6 +53,7 @@ const COMMAND_HELP = {
|
|
|
49
53
|
search: SEARCH_HELP,
|
|
50
54
|
api: API_HELP,
|
|
51
55
|
setup: SETUP_HELP,
|
|
56
|
+
stack: STACK_HELP,
|
|
52
57
|
};
|
|
53
58
|
const COMMANDS = {
|
|
54
59
|
issue: withRepoContext("issue", issueCommand),
|
|
@@ -68,6 +73,7 @@ const COMMANDS = {
|
|
|
68
73
|
search: withRepoContext("search", searchCommand),
|
|
69
74
|
api: withRepoContext("api", apiCommand),
|
|
70
75
|
setup: setupCommand,
|
|
76
|
+
stack: withLocalRepoContext(stackCommand),
|
|
71
77
|
};
|
|
72
78
|
export async function main(options = {}) {
|
|
73
79
|
await runAxiCli({
|
|
@@ -79,6 +85,25 @@ export async function main(options = {}) {
|
|
|
79
85
|
home: withRepoContext(undefined, homeCommand),
|
|
80
86
|
commands: COMMANDS,
|
|
81
87
|
getCommandHelp: (command) => COMMAND_HELP[command],
|
|
88
|
+
formatError: (error) => {
|
|
89
|
+
const axiError = error instanceof AxiError
|
|
90
|
+
? error
|
|
91
|
+
: new AxiError(error instanceof Error ? error.message : String(error), "UNKNOWN");
|
|
92
|
+
// Mirrors the SDK's defaultFormatError output byte-for-byte; the only
|
|
93
|
+
// difference this hook introduces is StackError's upstream exit code.
|
|
94
|
+
return {
|
|
95
|
+
output: `${encode({
|
|
96
|
+
error: axiError.message,
|
|
97
|
+
code: axiError.code,
|
|
98
|
+
...(axiError.suggestions.length > 0
|
|
99
|
+
? { help: axiError.suggestions }
|
|
100
|
+
: {}),
|
|
101
|
+
})}\n`,
|
|
102
|
+
exitCode: error instanceof StackError
|
|
103
|
+
? error.exitCode
|
|
104
|
+
: exitCodeForError(axiError),
|
|
105
|
+
};
|
|
106
|
+
},
|
|
82
107
|
resolveContext: ({ command, args }) => {
|
|
83
108
|
const { repoFlag, hostFlag } = parseRepoContextArgs(command, args);
|
|
84
109
|
// Explicit --hostname wins over the GH_HOST env var. Setting GH_HOST here
|
|
@@ -101,6 +126,15 @@ export async function main(options = {}) {
|
|
|
101
126
|
function withRepoContext(command, handler) {
|
|
102
127
|
return (args, ctx) => withSuggestionHost(ctx?.host, () => handler(parseRepoContextArgs(command, args).strippedArgs, repoContext(ctx)));
|
|
103
128
|
}
|
|
129
|
+
function withLocalRepoContext(handler) {
|
|
130
|
+
return (args, ctx) => {
|
|
131
|
+
const parsed = parseRepoContextArgs("stack", args);
|
|
132
|
+
if (parsed.repoFlag !== undefined || process.env["GH_REPO"]) {
|
|
133
|
+
throw new AxiError("stack commands operate on the repository in the current working directory and do not support -R, --repo, or GH_REPO", "VALIDATION_ERROR");
|
|
134
|
+
}
|
|
135
|
+
return withSuggestionHost(ctx?.host, () => handler(parsed.strippedArgs));
|
|
136
|
+
};
|
|
137
|
+
}
|
|
104
138
|
function repoContext(ctx) {
|
|
105
139
|
return ctx && "nwo" in ctx ? ctx : undefined;
|
|
106
140
|
}
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAoB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAoB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
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[
|
|
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[6]:\n --field <key=value> (repeatable), --header <key:value> (repeatable), --paginate, --jq <expression>, --template <format>, --full (preserve complete field values and response bodies without truncation)\nexamples:\n gh-axi api /repos/{owner}/{repo}\n gh-axi api POST /repos/{owner}/{repo}/issues --field title=\"Bug report\"\n gh-axi api /repos/{owner}/{repo}/pulls --paginate\n gh-axi api /repos/{owner}/{repo}/issues/1 --jq '[.labels[].name]'";
|
|
3
3
|
export declare function apiCommand(args: string[], ctx?: RepoContext): Promise<string>;
|
package/dist/src/commands/api.js
CHANGED
|
@@ -6,8 +6,8 @@ export const API_HELP = `usage: gh-axi api [<method>] <path>
|
|
|
6
6
|
description: Make an authenticated GitHub API request. Defaults to GET if no method specified.
|
|
7
7
|
methods[6]:
|
|
8
8
|
GET, POST, PUT, PATCH, DELETE, HEAD
|
|
9
|
-
flags[
|
|
10
|
-
--field <key=value> (repeatable), --header <key:value> (repeatable), --paginate, --jq <expression>, --template <format
|
|
9
|
+
flags[6]:
|
|
10
|
+
--field <key=value> (repeatable), --header <key:value> (repeatable), --paginate, --jq <expression>, --template <format>, --full (preserve complete field values and response bodies without truncation)
|
|
11
11
|
examples:
|
|
12
12
|
gh-axi api /repos/{owner}/{repo}
|
|
13
13
|
gh-axi api POST /repos/{owner}/{repo}/issues --field title="Bug report"
|
|
@@ -18,9 +18,16 @@ const HTTP_METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD']);
|
|
|
18
18
|
const REPEATABLE_VALUE_FLAGS = new Set(['--field', '--header']);
|
|
19
19
|
/** Value flags that gh accepts only one of, so a repeat is a caller mistake. */
|
|
20
20
|
const SINGLE_VALUE_FLAGS = new Set(['--jq', '--template']);
|
|
21
|
-
/** Flags that stand alone and must not consume the following argument. */
|
|
21
|
+
/** Flags that stand alone and must not consume the following argument, and are forwarded to gh. */
|
|
22
22
|
const BOOL_FLAGS = new Set(['--paginate']);
|
|
23
|
-
|
|
23
|
+
/** Flags that stand alone, are gh-axi-only, and must not be forwarded to gh. */
|
|
24
|
+
const LOCAL_BOOL_FLAGS = new Set(['--full']);
|
|
25
|
+
const SUPPORTED_FLAGS = [
|
|
26
|
+
...REPEATABLE_VALUE_FLAGS,
|
|
27
|
+
...SINGLE_VALUE_FLAGS,
|
|
28
|
+
...BOOL_FLAGS,
|
|
29
|
+
...LOCAL_BOOL_FLAGS,
|
|
30
|
+
];
|
|
24
31
|
/** The flag's name without any `=value` suffix, so errors never echo a value. */
|
|
25
32
|
function flagName(arg) {
|
|
26
33
|
const equals = arg.indexOf('=');
|
|
@@ -47,6 +54,7 @@ function parseArgs(args) {
|
|
|
47
54
|
fields: [],
|
|
48
55
|
headers: [],
|
|
49
56
|
paginate: false,
|
|
57
|
+
full: false,
|
|
50
58
|
};
|
|
51
59
|
for (let i = 0; i < args.length; i++) {
|
|
52
60
|
const arg = args[i];
|
|
@@ -61,6 +69,12 @@ function parseArgs(args) {
|
|
|
61
69
|
parsed.paginate = true;
|
|
62
70
|
continue;
|
|
63
71
|
}
|
|
72
|
+
if (LOCAL_BOOL_FLAGS.has(name)) {
|
|
73
|
+
if (name !== arg)
|
|
74
|
+
throw new AxiError(`${name} does not take a value`, 'VALIDATION_ERROR');
|
|
75
|
+
parsed.full = true;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
64
78
|
if (!REPEATABLE_VALUE_FLAGS.has(name) && !SINGLE_VALUE_FLAGS.has(name)) {
|
|
65
79
|
throw new AxiError(`unknown flag ${name} for gh-axi api. Supported flags: ${SUPPORTED_FLAGS.join(', ')}`, 'VALIDATION_ERROR');
|
|
66
80
|
}
|
|
@@ -104,7 +118,7 @@ const STRING_VALUE_TRUNCATION_LIMIT = 2000;
|
|
|
104
118
|
export async function apiCommand(args, ctx) {
|
|
105
119
|
if (args[0] === '--help' || args.length === 0)
|
|
106
120
|
return API_HELP;
|
|
107
|
-
const { positionals, fields, headers, jq, template, paginate } = parseArgs(args);
|
|
121
|
+
const { positionals, fields, headers, jq, template, paginate, full } = parseArgs(args);
|
|
108
122
|
const pathRequired = new AxiError('API path is required: gh-axi api [<method>] <path>', 'VALIDATION_ERROR');
|
|
109
123
|
if (positionals.length === 0)
|
|
110
124
|
throw pathRequired;
|
|
@@ -136,16 +150,21 @@ export async function apiCommand(args, ctx) {
|
|
|
136
150
|
// for by name (`url`, `node_id`, ...). The length clamp still applies, so a
|
|
137
151
|
// selected field cannot blow the caller's context with an unbounded blob.
|
|
138
152
|
const callerShapedOutput = jq !== undefined || template !== undefined;
|
|
153
|
+
// --full is an explicit opt-in escape hatch: it keeps every field (like
|
|
154
|
+
// caller-shaped output) and additionally lifts the string-length clamp, so
|
|
155
|
+
// compact output stays the default everywhere --full is not given.
|
|
156
|
+
const stripNoisyKeys = !callerShapedOutput && !full;
|
|
157
|
+
const truncateValues = !full;
|
|
139
158
|
// Try to parse as JSON, strip noisy fields, encode to TOON; fall back to raw output
|
|
140
159
|
const raw = await ghExec(ghArgs, ctx);
|
|
141
160
|
try {
|
|
142
161
|
const data = JSON.parse(raw);
|
|
143
|
-
return encode(shapeOutput(data,
|
|
162
|
+
return encode(shapeOutput(data, stripNoisyKeys, truncateValues));
|
|
144
163
|
}
|
|
145
164
|
catch {
|
|
146
165
|
// Not JSON — wrap in TOON envelope with truncation metadata
|
|
147
166
|
const trimmed = raw.trim();
|
|
148
|
-
const truncated = trimmed.length > RAW_OUTPUT_TRUNCATION_LIMIT;
|
|
167
|
+
const truncated = !full && trimmed.length > RAW_OUTPUT_TRUNCATION_LIMIT;
|
|
149
168
|
const result = {
|
|
150
169
|
api_response: {
|
|
151
170
|
body: truncated ? trimmed.slice(0, RAW_OUTPUT_TRUNCATION_LIMIT) : trimmed,
|
|
@@ -210,20 +229,21 @@ function clampString(value) {
|
|
|
210
229
|
* With `stripNoisyKeys` the noisy keys are dropped and long strings are cleaned
|
|
211
230
|
* as well. Output the caller shaped with --jq/--template keeps both its keys and
|
|
212
231
|
* its content verbatim and is only length-bounded, since rewriting a field they
|
|
213
|
-
* selected by name is the same silent mutation as deleting it.
|
|
232
|
+
* selected by name is the same silent mutation as deleting it. With
|
|
233
|
+
* `truncateValues` false (--full), string values pass through untouched.
|
|
214
234
|
*/
|
|
215
|
-
function shapeOutput(obj, stripNoisyKeys, depth = 0) {
|
|
235
|
+
function shapeOutput(obj, stripNoisyKeys, truncateValues, depth = 0) {
|
|
216
236
|
if (depth > 8)
|
|
217
237
|
return obj;
|
|
218
238
|
if (Array.isArray(obj)) {
|
|
219
|
-
return obj.map((item) => shapeOutput(item, stripNoisyKeys, depth + 1));
|
|
239
|
+
return obj.map((item) => shapeOutput(item, stripNoisyKeys, truncateValues, depth + 1));
|
|
220
240
|
}
|
|
221
241
|
if (obj !== null && typeof obj === 'object') {
|
|
222
242
|
const record = obj;
|
|
223
243
|
const result = {};
|
|
224
244
|
for (const [key, value] of Object.entries(record)) {
|
|
225
245
|
if (!stripNoisyKeys) {
|
|
226
|
-
result[key] = shapeOutput(value, stripNoisyKeys, depth + 1);
|
|
246
|
+
result[key] = shapeOutput(value, stripNoisyKeys, truncateValues, depth + 1);
|
|
227
247
|
continue;
|
|
228
248
|
}
|
|
229
249
|
if (NOISY_KEYS.has(key))
|
|
@@ -240,12 +260,15 @@ function shapeOutput(obj, stripNoisyKeys, depth = 0) {
|
|
|
240
260
|
result[key] = collapseRepo(value);
|
|
241
261
|
continue;
|
|
242
262
|
}
|
|
243
|
-
result[key] = shapeOutput(value, stripNoisyKeys, depth + 1);
|
|
263
|
+
result[key] = shapeOutput(value, stripNoisyKeys, truncateValues, depth + 1);
|
|
244
264
|
}
|
|
245
265
|
return result;
|
|
246
266
|
}
|
|
247
|
-
if (typeof obj === 'string')
|
|
267
|
+
if (typeof obj === 'string') {
|
|
268
|
+
if (!truncateValues)
|
|
269
|
+
return obj;
|
|
248
270
|
return stripNoisyKeys ? clampString(obj) : truncateString(obj);
|
|
271
|
+
}
|
|
249
272
|
return obj;
|
|
250
273
|
}
|
|
251
274
|
//# sourceMappingURL=api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;oEAU4C,CAAC;AAErE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,qFAAqF;AACrF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhE,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAE3D,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { RepoContext } from "../context.js";
|
|
2
|
-
export declare const ISSUE_HELP = "usage: gh-axi issue <subcommand> [flags]\nsubcommands[14]:\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>, subissue <add|remove|list>\nflags{list}:\n --state <open|closed|all>, --label <name> (repeatable), --assignee <login>, --author <login>, --milestone <name>, --sort <created|updated|comments>, --limit <n> (default 30), --fields <a,b,c>\nflags{view}:\n --comments, --full (show complete body without truncation)\nflags{create}:\n --title <text> (required), --body <text> or --body-file <path>, --assignee <login> (repeatable), --label <name> (repeatable), --milestone <name>, --project <name> (repeatable), --type <name>\nflags{edit}:\n --title, --body <text> or --body-file <path>, --add-label <name> (repeatable), --remove-label <name> (repeatable), --add-assignee <login> (repeatable), --remove-assignee <login> (repeatable), --milestone, --type <name>, --no-type\nflags{close}:\n --reason <completed|not_planned>, --comment <text>\nflags{comment}:\n --body <text> or --body-file <path> (required)\nflags{transfer}:\n --to-repo <owner/name> (required)\nsubissue:\n add <parent> <child> [<child> ...], remove <parent> <child>, list <parent>\nexamples:\n gh-axi issue list --state closed --label bug\n gh-axi issue view 42 --comments\n gh-axi issue create --title \"Fix login\" --body \"Steps to reproduce...\"\n gh-axi issue comment 42 --body-file comment.md\n gh-axi issue close 42 --reason completed\n gh-axi issue transfer 42 -R source/repo --to-repo dest/repo\n gh-axi issue subissue add 16 20 101 125\n gh-axi issue subissue list 16";
|
|
2
|
+
export declare const ISSUE_HELP = "usage: gh-axi issue <subcommand> [flags]\nsubcommands[14]:\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>, subissue <add|remove|list>\nflags{list}:\n --state <open|closed|all>, --label <name> (repeatable), --assignee <login>, --author <login>, --milestone <name>, --sort <created|updated|comments>, --limit <n> (default 30), --fields <a,b,c>\nflags{view}:\n --comments, --full (show the complete issue body and comment bodies without truncation)\nflags{create}:\n --title <text> (required), --body <text> or --body-file <path>, --assignee <login> (repeatable), --label <name> (repeatable), --milestone <name>, --project <name> (repeatable), --type <name>\nflags{edit}:\n --title, --body <text> or --body-file <path>, --add-label <name> (repeatable), --remove-label <name> (repeatable), --add-assignee <login> (repeatable), --remove-assignee <login> (repeatable), --milestone, --type <name>, --no-type\nflags{close}:\n --reason <completed|not_planned>, --comment <text>\nflags{comment}:\n --body <text> or --body-file <path> (required)\nflags{transfer}:\n --to-repo <owner/name> (required)\nsubissue:\n add <parent> <child> [<child> ...], remove <parent> <child>, list <parent>\nexamples:\n gh-axi issue list --state closed --label bug\n gh-axi issue view 42 --comments\n gh-axi issue create --title \"Fix login\" --body \"Steps to reproduce...\"\n gh-axi issue comment 42 --body-file comment.md\n gh-axi issue close 42 --reason completed\n gh-axi issue transfer 42 -R source/repo --to-repo dest/repo\n gh-axi issue subissue add 16 20 101 125\n gh-axi issue subissue list 16";
|
|
3
3
|
export declare const SUBISSUE_HELP = "usage: gh-axi issue subissue <add|remove|list> <parent> [child...]\nsubcommands[3]:\n add <parent> <child> [<child> ...], remove <parent> <child>, list <parent>\nexamples:\n gh-axi issue subissue add 16 20 101 125\n gh-axi issue subissue remove 16 101\n gh-axi issue subissue list 16";
|
|
4
4
|
export declare function issueCommand(args: string[], ctx?: RepoContext): Promise<string>;
|
|
@@ -2,7 +2,7 @@ import { resolveHost } from "../host.js";
|
|
|
2
2
|
import { ghJson, ghExec, ghRaw } from "../gh.js";
|
|
3
3
|
import { AxiError, mapGhError } from "../errors.js";
|
|
4
4
|
import { getSuggestions } from "../suggestions.js";
|
|
5
|
-
import { hasFlag, getFlag, getAllFlags, pushRepeated, getPositional, requireNumber, takeFlag, takeBoolFlag, } from "../args.js";
|
|
5
|
+
import { hasFlag, getFlag, getAllFlags, pushRepeated, getPositional, requireNumber, takeFlag, takeBoolFlag, rejectUnknownFlags, } from "../args.js";
|
|
6
6
|
import { takeBody, truncateBody } from "../body.js";
|
|
7
7
|
import { parseFields } from "../fields.js";
|
|
8
8
|
import { formatCountLine } from "../format.js";
|
|
@@ -17,7 +17,7 @@ subcommands[14]:
|
|
|
17
17
|
flags{list}:
|
|
18
18
|
--state <open|closed|all>, --label <name> (repeatable), --assignee <login>, --author <login>, --milestone <name>, --sort <created|updated|comments>, --limit <n> (default 30), --fields <a,b,c>
|
|
19
19
|
flags{view}:
|
|
20
|
-
--comments, --full (show complete body without truncation)
|
|
20
|
+
--comments, --full (show the complete issue body and comment bodies without truncation)
|
|
21
21
|
flags{create}:
|
|
22
22
|
--title <text> (required), --body <text> or --body-file <path>, --assignee <login> (repeatable), --label <name> (repeatable), --milestone <name>, --project <name> (repeatable), --type <name>
|
|
23
23
|
flags{edit}:
|
|
@@ -47,6 +47,58 @@ examples:
|
|
|
47
47
|
gh-axi issue subissue remove 16 101
|
|
48
48
|
gh-axi issue subissue list 16`;
|
|
49
49
|
// ---------------------------------------------------------------------------
|
|
50
|
+
// Per-subcommand known flags (for rejectUnknownFlags)
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// --search is intentionally listed: listIssues/prList reject it with a
|
|
53
|
+
// dedicated hint pointing at `gh-axi search`, so rejectUnknownFlags lets it
|
|
54
|
+
// through to that handler instead of shadowing the targeted error.
|
|
55
|
+
const ISSUE_FLAGS = {
|
|
56
|
+
list: [
|
|
57
|
+
"--fields",
|
|
58
|
+
"--state",
|
|
59
|
+
"--label",
|
|
60
|
+
"--assignee",
|
|
61
|
+
"--author",
|
|
62
|
+
"--milestone",
|
|
63
|
+
"--sort",
|
|
64
|
+
"--limit",
|
|
65
|
+
"--search",
|
|
66
|
+
],
|
|
67
|
+
view: ["--comments", "--full"],
|
|
68
|
+
create: [
|
|
69
|
+
"--title",
|
|
70
|
+
"--body",
|
|
71
|
+
"--body-file",
|
|
72
|
+
"--assignee",
|
|
73
|
+
"--label",
|
|
74
|
+
"--milestone",
|
|
75
|
+
"--project",
|
|
76
|
+
"--type",
|
|
77
|
+
],
|
|
78
|
+
edit: [
|
|
79
|
+
"--title",
|
|
80
|
+
"--body",
|
|
81
|
+
"--body-file",
|
|
82
|
+
"--add-label",
|
|
83
|
+
"--remove-label",
|
|
84
|
+
"--add-assignee",
|
|
85
|
+
"--remove-assignee",
|
|
86
|
+
"--milestone",
|
|
87
|
+
"--no-type",
|
|
88
|
+
"--type",
|
|
89
|
+
],
|
|
90
|
+
close: ["--reason", "--comment"],
|
|
91
|
+
reopen: [],
|
|
92
|
+
comment: ["--body", "--body-file"],
|
|
93
|
+
delete: [],
|
|
94
|
+
lock: [],
|
|
95
|
+
unlock: [],
|
|
96
|
+
pin: [],
|
|
97
|
+
unpin: [],
|
|
98
|
+
transfer: ["--to-repo"],
|
|
99
|
+
subissue: [],
|
|
100
|
+
};
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
50
102
|
// Field schemas
|
|
51
103
|
// ---------------------------------------------------------------------------
|
|
52
104
|
const listSchema = [
|
|
@@ -75,12 +127,11 @@ const viewSchema = [
|
|
|
75
127
|
custom("body", (item) => truncateBody(item.body, 500)),
|
|
76
128
|
];
|
|
77
129
|
const viewSchemaWithoutType = viewSchema.filter((f) => f !== issueTypeField);
|
|
78
|
-
const
|
|
79
|
-
? custom("body", (item) => typeof item.body === "string" ? item.body : "")
|
|
80
|
-
: f);
|
|
81
|
-
const viewSchemaFullWithoutType = viewSchemaWithoutType.map((f) => "as" in f && f.as === "body"
|
|
130
|
+
const withFullBody = (schema) => schema.map((f) => "as" in f && f.as === "body"
|
|
82
131
|
? custom("body", (item) => typeof item.body === "string" ? item.body : "")
|
|
83
132
|
: f);
|
|
133
|
+
const viewSchemaFull = withFullBody(viewSchema);
|
|
134
|
+
const viewSchemaFullWithoutType = withFullBody(viewSchemaWithoutType);
|
|
84
135
|
const createResultSchema = [
|
|
85
136
|
field("number"),
|
|
86
137
|
field("title"),
|
|
@@ -101,6 +152,7 @@ const commentResultSchema = [
|
|
|
101
152
|
relativeTime("createdAt", "created"),
|
|
102
153
|
custom("body", (item) => truncateBody(item.body, 800)),
|
|
103
154
|
];
|
|
155
|
+
const commentResultSchemaFull = withFullBody(commentResultSchema);
|
|
104
156
|
const lockResultSchema = [
|
|
105
157
|
field("number"),
|
|
106
158
|
lower("state"),
|
|
@@ -260,7 +312,8 @@ async function viewIssue(args, ctx) {
|
|
|
260
312
|
}
|
|
261
313
|
const blocks = [renderDetail("issue", augmented, schema)];
|
|
262
314
|
if (withComments && Array.isArray(item.comments)) {
|
|
263
|
-
|
|
315
|
+
const commentSchema = full ? commentResultSchemaFull : commentResultSchema;
|
|
316
|
+
blocks.push(renderList("comments", item.comments, commentSchema.filter((d) => ("key" in d ? d.key !== "number" : true))));
|
|
264
317
|
}
|
|
265
318
|
return renderOutput(blocks);
|
|
266
319
|
}
|
|
@@ -918,6 +971,7 @@ async function subissueCommand(args, ctx) {
|
|
|
918
971
|
export async function issueCommand(args, ctx) {
|
|
919
972
|
const sub = args[0];
|
|
920
973
|
if (sub === "subissue") {
|
|
974
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.subissue, "issue", "subissue");
|
|
921
975
|
return subissueCommand(args, ctx);
|
|
922
976
|
}
|
|
923
977
|
if (!sub || hasFlag(args, "--help")) {
|
|
@@ -929,30 +983,43 @@ export async function issueCommand(args, ctx) {
|
|
|
929
983
|
}
|
|
930
984
|
switch (sub) {
|
|
931
985
|
case "list":
|
|
986
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.list, "issue", "list");
|
|
932
987
|
return listIssues(args, ctx);
|
|
933
988
|
case "view":
|
|
989
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.view, "issue", "view");
|
|
934
990
|
return viewIssue(args, ctx);
|
|
935
991
|
case "create":
|
|
992
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.create, "issue", "create");
|
|
936
993
|
return createIssue(args, ctx);
|
|
937
994
|
case "edit":
|
|
995
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.edit, "issue", "edit");
|
|
938
996
|
return editIssue(args, ctx);
|
|
939
997
|
case "close":
|
|
998
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.close, "issue", "close");
|
|
940
999
|
return closeIssue(args, ctx);
|
|
941
1000
|
case "reopen":
|
|
1001
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.reopen, "issue", "reopen");
|
|
942
1002
|
return reopenIssue(args, ctx);
|
|
943
1003
|
case "comment":
|
|
1004
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.comment, "issue", "comment");
|
|
944
1005
|
return commentOnIssue(args, ctx);
|
|
945
1006
|
case "delete":
|
|
1007
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.delete, "issue", "delete");
|
|
946
1008
|
return deleteIssue(args, ctx);
|
|
947
1009
|
case "lock":
|
|
1010
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.lock, "issue", "lock");
|
|
948
1011
|
return lockIssue(args, ctx);
|
|
949
1012
|
case "unlock":
|
|
1013
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.unlock, "issue", "unlock");
|
|
950
1014
|
return unlockIssue(args, ctx);
|
|
951
1015
|
case "pin":
|
|
1016
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.pin, "issue", "pin");
|
|
952
1017
|
return pinIssue(args, ctx);
|
|
953
1018
|
case "unpin":
|
|
1019
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.unpin, "issue", "unpin");
|
|
954
1020
|
return unpinIssue(args, ctx);
|
|
955
1021
|
case "transfer":
|
|
1022
|
+
rejectUnknownFlags(args.slice(1), ISSUE_FLAGS.transfer, "issue", "transfer");
|
|
956
1023
|
return transferIssue(args, ctx);
|
|
957
1024
|
default:
|
|
958
1025
|
return renderError(`Unknown issue subcommand: ${sub}`, "VALIDATION_ERROR", ["Run `gh-axi issue --help` for usage"]);
|