feat: scaffold CLI and minimal issue list (task 0001)

Tracer bullet for gitea-axi: runnable npm package on axi-sdk-js with
gitea-js as the sole HTTP layer, ESM on Node 20+.

- issue list with --state/--limit, default fields, count line from
  X-Total-Count, type=issues guard, explicit empty state, and next-step
  suggestions
- repo context detection from the git origin remote (SSH/scp/HTTPS),
  tea credential discovery with the three-way login-matching split, and
  -R/--repo and --login overrides (flag > env > auto)
- token retrieval via tea login helper get: tea's login list JSON
  carries no token (ADR 0001 amended)
- full AxiError classification table with path-based 404 split, TOON
  errors on stdout, exit codes 0/1/2
- test mode (GITEA_AXI_API_URL/TOKEN/REPO) suppressing subprocesses,
  fixture server, and vitest suites driving the CLI seam (50 tests)
This commit is contained in:
2026-07-11 07:11:07 -04:00
parent 21a075f8cd
commit 38026f963d
34 changed files with 3892 additions and 0 deletions

42
test/harness.ts Normal file
View File

@@ -0,0 +1,42 @@
import { runCli } from "../src/cli.js";
export interface CliResult {
stdout: string;
exitCode: number;
}
export interface CliTestOptions {
env?: Record<string, string | undefined>;
cwd?: string;
}
/**
* Drive the CLI seam: argv in, stdout and exit code out. The environment is
* fully explicit — nothing leaks in from the test process's own env.
*/
export async function runCliTest(
argv: string[],
options: CliTestOptions = {},
): Promise<CliResult> {
let stdout = "";
const exitCode = await runCli({
argv,
env: options.env ?? {},
cwd: options.cwd ?? process.cwd(),
stdout: {
write: (chunk: string) => {
stdout += chunk;
},
},
});
process.exitCode = 0;
return { stdout, exitCode };
}
export function testModeEnv(apiUrl: string): Record<string, string> {
return {
GITEA_AXI_API_URL: apiUrl,
GITEA_AXI_TOKEN: "test-token",
GITEA_AXI_REPO: "testowner/testrepo",
};
}