@abe-ing/cli 0.2.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.
- package/README.md +125 -0
- package/dist/api.js +104 -0
- package/dist/api.js.map +1 -0
- package/dist/api.test.js +73 -0
- package/dist/api.test.js.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.js +102 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/auth.test.js +129 -0
- package/dist/commands/auth.test.js.map +1 -0
- package/dist/commands/boards.js +41 -0
- package/dist/commands/boards.js.map +1 -0
- package/dist/commands/boards.test.js +32 -0
- package/dist/commands/boards.test.js.map +1 -0
- package/dist/commands/members.js +29 -0
- package/dist/commands/members.js.map +1 -0
- package/dist/commands/tasks.js +193 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/tasks.test.js +85 -0
- package/dist/commands/tasks.test.js.map +1 -0
- package/dist/config.js +56 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.js +70 -0
- package/dist/config.test.js.map +1 -0
- package/dist/context.js +10 -0
- package/dist/context.js.map +1 -0
- package/dist/enums.js +18 -0
- package/dist/enums.js.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/output.js +70 -0
- package/dist/output.js.map +1 -0
- package/dist/output.test.js +49 -0
- package/dist/output.test.js.map +1 -0
- package/package.json +35 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { CliError, EXIT } from './errors.js';
|
|
3
|
+
import { registerAuthCommands } from './commands/auth.js';
|
|
4
|
+
import { registerBoardCommands } from './commands/boards.js';
|
|
5
|
+
import { registerTaskCommands } from './commands/tasks.js';
|
|
6
|
+
import { registerMembersCommands } from './commands/members.js';
|
|
7
|
+
export function buildProgram() {
|
|
8
|
+
const program = new Command('abe');
|
|
9
|
+
program
|
|
10
|
+
.description('Drive ABE project boards and tasks from the command line.')
|
|
11
|
+
.version('0.1.0')
|
|
12
|
+
.option('--json', 'machine-readable JSON output on stdout (status text goes to stderr)')
|
|
13
|
+
.option('--api-url <url>', 'ABE API base URL (env: ABE_API_URL)')
|
|
14
|
+
.option('--token <pat>', 'Personal Access Token (env: ABE_TOKEN)')
|
|
15
|
+
.option('--no-color', 'disable colored output')
|
|
16
|
+
// Let parse/usage errors flow through our error boundary with EXIT.USAGE
|
|
17
|
+
// instead of Commander calling process.exit itself.
|
|
18
|
+
.exitOverride();
|
|
19
|
+
registerAuthCommands(program);
|
|
20
|
+
registerBoardCommands(program);
|
|
21
|
+
registerTaskCommands(program);
|
|
22
|
+
registerMembersCommands(program);
|
|
23
|
+
return program;
|
|
24
|
+
}
|
|
25
|
+
// Run the CLI and translate any thrown error into a stable exit code. Returns
|
|
26
|
+
// the exit code (the bin entry calls process.exit with it). Importing this
|
|
27
|
+
// module has no side effects — only `cli.ts` invokes run().
|
|
28
|
+
export async function run(argv = process.argv) {
|
|
29
|
+
const program = buildProgram();
|
|
30
|
+
try {
|
|
31
|
+
await program.parseAsync(argv);
|
|
32
|
+
return EXIT.OK;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
// Commander throws a CommanderError (code starts with "commander.") on
|
|
36
|
+
// usage/parse problems and on --help/--version (exitCode 0). It has
|
|
37
|
+
// ALREADY written the error (plus help hint) to stderr before throwing —
|
|
38
|
+
// exitOverride() only suppresses the process.exit, not the output — so
|
|
39
|
+
// re-printing ce.message here would double-print every usage error.
|
|
40
|
+
if (err && typeof err === 'object' && 'code' in err && String(err.code).startsWith('commander')) {
|
|
41
|
+
const ce = err;
|
|
42
|
+
const code = ce.exitCode ?? EXIT.USAGE;
|
|
43
|
+
return code === 0 ? EXIT.OK : EXIT.USAGE;
|
|
44
|
+
}
|
|
45
|
+
if (err instanceof CliError) {
|
|
46
|
+
process.stderr.write(`${err.message}\n`);
|
|
47
|
+
return err.exitCode;
|
|
48
|
+
}
|
|
49
|
+
process.stderr.write(`${err?.message ?? 'Unknown error'}\n`);
|
|
50
|
+
return EXIT.GENERIC;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;IAClC,OAAO;SACJ,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,QAAQ,EAAE,qEAAqE,CAAC;SACvF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;SACjE,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;QAC/C,yEAAyE;QACzE,oDAAoD;SACnD,YAAY,EAAE,CAAA;IAEjB,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAEhC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAiB,OAAO,CAAC,IAAI;IACrD,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC9B,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uEAAuE;QACvE,oEAAoE;QACpE,yEAAyE;QACzE,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,CAAE,GAAwB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACtH,MAAM,EAAE,GAAG,GAA4B,CAAA;YACvC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAA;YACtC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QAC1C,CAAC;QACD,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;YACxC,OAAO,GAAG,CAAC,QAAQ,CAAA;QACrB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,GAAa,EAAE,OAAO,IAAI,eAAe,IAAI,CAAC,CAAA;QACvE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;AACH,CAAC"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// CRITICAL agent invariant: in --json mode, stdout carries ONLY the JSON
|
|
2
|
+
// payload. All human/status text goes to stderr, so an agent piping stdout to
|
|
3
|
+
// a parser never trips over a status line.
|
|
4
|
+
export function emit(data, opts) {
|
|
5
|
+
if (opts.json) {
|
|
6
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function status(message) {
|
|
10
|
+
process.stderr.write(`${message}\n`);
|
|
11
|
+
}
|
|
12
|
+
function pad(s, width) {
|
|
13
|
+
const str = s ?? '';
|
|
14
|
+
return str.length >= width ? str : str + ' '.repeat(width - str.length);
|
|
15
|
+
}
|
|
16
|
+
function table(headers, rows) {
|
|
17
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)));
|
|
18
|
+
const line = (cells) => cells.map((c, i) => pad(c, widths[i])).join(' ').trimEnd();
|
|
19
|
+
return [line(headers), line(widths.map((w) => '-'.repeat(w))), ...rows.map(line)].join('\n');
|
|
20
|
+
}
|
|
21
|
+
export function printBoards(boards, opts) {
|
|
22
|
+
if (opts.json)
|
|
23
|
+
return emit({ boards }, opts);
|
|
24
|
+
if (!boards.length) {
|
|
25
|
+
status('No boards.');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const rows = boards.map((b) => [
|
|
29
|
+
String(b.id),
|
|
30
|
+
b.slug,
|
|
31
|
+
b.name,
|
|
32
|
+
String(b.task_count ?? ''),
|
|
33
|
+
(b.columns ?? []).join(', '),
|
|
34
|
+
]);
|
|
35
|
+
process.stdout.write(`${table(['ID', 'SLUG', 'NAME', 'OPEN', 'COLUMNS'], rows)}\n`);
|
|
36
|
+
}
|
|
37
|
+
export function printTasks(tasks, opts) {
|
|
38
|
+
if (opts.json)
|
|
39
|
+
return emit({ tasks }, opts);
|
|
40
|
+
if (!tasks.length) {
|
|
41
|
+
status('No tasks.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const rows = tasks.map((t) => [
|
|
45
|
+
String(t.id),
|
|
46
|
+
t.title,
|
|
47
|
+
t.status,
|
|
48
|
+
t.priority,
|
|
49
|
+
t.task_type,
|
|
50
|
+
t.board_column,
|
|
51
|
+
t.assignee_name ?? '',
|
|
52
|
+
]);
|
|
53
|
+
process.stdout.write(`${table(['ID', 'TITLE', 'STATUS', 'PRIORITY', 'TYPE', 'COLUMN', 'ASSIGNEE'], rows)}\n`);
|
|
54
|
+
}
|
|
55
|
+
export function printTask(task, opts) {
|
|
56
|
+
if (opts.json)
|
|
57
|
+
return emit({ task }, opts);
|
|
58
|
+
const lines = [
|
|
59
|
+
`#${task.id} ${task.title}`,
|
|
60
|
+
`status: ${task.status}`,
|
|
61
|
+
`priority: ${task.priority}`,
|
|
62
|
+
`type: ${task.task_type}`,
|
|
63
|
+
`column: ${task.board_column}`,
|
|
64
|
+
`board: ${task.task_board_id ?? '(none)'}`,
|
|
65
|
+
`assignee: ${task.assignee_name ?? '(unassigned)'}`,
|
|
66
|
+
`labels: ${(task.labels ?? []).join(', ') || '(none)'}`,
|
|
67
|
+
];
|
|
68
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { buildProgram } from './index.js';
|
|
3
|
+
function fetchReturning(status, body) {
|
|
4
|
+
return vi.fn().mockResolvedValue({
|
|
5
|
+
ok: status >= 200 && status < 300,
|
|
6
|
+
status,
|
|
7
|
+
text: async () => JSON.stringify(body),
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
let outChunks;
|
|
11
|
+
let errChunks;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
process.env.ABE_NO_CONFIG = '1';
|
|
14
|
+
outChunks = [];
|
|
15
|
+
errChunks = [];
|
|
16
|
+
vi.spyOn(process.stdout, 'write').mockImplementation((c) => {
|
|
17
|
+
outChunks.push(String(c));
|
|
18
|
+
return true;
|
|
19
|
+
});
|
|
20
|
+
vi.spyOn(process.stderr, 'write').mockImplementation((c) => {
|
|
21
|
+
errChunks.push(String(c));
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
vi.unstubAllGlobals();
|
|
27
|
+
vi.restoreAllMocks();
|
|
28
|
+
delete process.env.ABE_NO_CONFIG;
|
|
29
|
+
});
|
|
30
|
+
describe('--json output is stdout-pure', () => {
|
|
31
|
+
it('writes ONLY valid JSON to stdout for board list', async () => {
|
|
32
|
+
vi.stubGlobal('fetch', fetchReturning(200, { boards: [{ id: 1, name: 'Eng', slug: 'eng', columns: ['todo'] }] }));
|
|
33
|
+
await buildProgram().parseAsync(['node', 'abe', '--json', 'board', 'list', '--token', 'abe_pat_secret', '--api-url', 'http://h']);
|
|
34
|
+
const stdout = outChunks.join('');
|
|
35
|
+
expect(() => JSON.parse(stdout)).not.toThrow();
|
|
36
|
+
expect(JSON.parse(stdout)).toEqual({ boards: [{ id: 1, name: 'Eng', slug: 'eng', columns: ['todo'] }] });
|
|
37
|
+
});
|
|
38
|
+
it('never leaks the token to stdout or stderr, even on a 401', async () => {
|
|
39
|
+
vi.stubGlobal('fetch', fetchReturning(401, { error: 'Unauthorized' }));
|
|
40
|
+
await buildProgram()
|
|
41
|
+
.parseAsync(['node', 'abe', 'board', 'list', '--token', 'abe_pat_secret', '--api-url', 'http://h'])
|
|
42
|
+
.catch(() => {
|
|
43
|
+
/* expected to reject — assert on captured output below */
|
|
44
|
+
});
|
|
45
|
+
const all = outChunks.join('') + errChunks.join('');
|
|
46
|
+
expect(all).not.toContain('abe_pat_secret');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=output.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.test.js","sourceRoot":"","sources":["../src/output.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@abe-ing/cli",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Command-line interface for driving ABE project boards and tasks.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"abe": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=18"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"dev": "tsc -w",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"commander": "^12"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "^5",
|
|
29
|
+
"vitest": "^2",
|
|
30
|
+
"@types/node": "^20"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|