@knowttl/ado-axi 0.0.0-stage → 0.5.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/LICENSE +21 -0
- package/README.md +261 -2
- package/SKILL.md +334 -0
- package/assets/ado-axi-header.png +0 -0
- package/dist/bin/ado-axi.d.ts +3 -0
- package/dist/bin/ado-axi.d.ts.map +1 -0
- package/dist/bin/ado-axi.js +192 -0
- package/dist/bin/ado-axi.js.map +1 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +26 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/api.d.ts +2 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +161 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/classification.d.ts +2 -0
- package/dist/commands/classification.d.ts.map +1 -0
- package/dist/commands/classification.js +54 -0
- package/dist/commands/classification.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +109 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/home.d.ts +2 -0
- package/dist/commands/home.d.ts.map +1 -0
- package/dist/commands/home.js +132 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/pipeline.d.ts +2 -0
- package/dist/commands/pipeline.d.ts.map +1 -0
- package/dist/commands/pipeline.js +572 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/pipelineAdmin.d.ts +3 -0
- package/dist/commands/pipelineAdmin.d.ts.map +1 -0
- package/dist/commands/pipelineAdmin.js +152 -0
- package/dist/commands/pipelineAdmin.js.map +1 -0
- package/dist/commands/pipelineArtifact.d.ts +3 -0
- package/dist/commands/pipelineArtifact.d.ts.map +1 -0
- package/dist/commands/pipelineArtifact.js +68 -0
- package/dist/commands/pipelineArtifact.js.map +1 -0
- package/dist/commands/policy.d.ts +3 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +31 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/pool.d.ts +3 -0
- package/dist/commands/pool.d.ts.map +1 -0
- package/dist/commands/pool.js +19 -0
- package/dist/commands/pool.js.map +1 -0
- package/dist/commands/pr.d.ts +9 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +1028 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/query.d.ts +2 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +29 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/queue.d.ts +3 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +21 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/ref.d.ts +3 -0
- package/dist/commands/ref.d.ts.map +1 -0
- package/dist/commands/ref.js +204 -0
- package/dist/commands/ref.js.map +1 -0
- package/dist/commands/release.d.ts +3 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +91 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/repo.d.ts +3 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +261 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/repoAdmin.d.ts +3 -0
- package/dist/commands/repoAdmin.d.ts.map +1 -0
- package/dist/commands/repoAdmin.js +195 -0
- package/dist/commands/repoAdmin.js.map +1 -0
- package/dist/commands/security.d.ts +3 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +57 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/commands/serviceEndpoint.d.ts +3 -0
- package/dist/commands/serviceEndpoint.d.ts.map +1 -0
- package/dist/commands/serviceEndpoint.js +29 -0
- package/dist/commands/serviceEndpoint.js.map +1 -0
- package/dist/commands/team.d.ts +3 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +33 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +183 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +20 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/variableGroup.d.ts +3 -0
- package/dist/commands/variableGroup.d.ts.map +1 -0
- package/dist/commands/variableGroup.js +23 -0
- package/dist/commands/variableGroup.js.map +1 -0
- package/dist/commands/workItem.d.ts +12 -0
- package/dist/commands/workItem.d.ts.map +1 -0
- package/dist/commands/workItem.js +940 -0
- package/dist/commands/workItem.js.map +1 -0
- package/dist/commands/workItemAttachment.d.ts +3 -0
- package/dist/commands/workItemAttachment.d.ts.map +1 -0
- package/dist/commands/workItemAttachment.js +136 -0
- package/dist/commands/workItemAttachment.js.map +1 -0
- package/dist/help.d.ts +4 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +383 -0
- package/dist/help.js.map +1 -0
- package/dist/lib/adoUrl.d.ts +19 -0
- package/dist/lib/adoUrl.d.ts.map +1 -0
- package/dist/lib/adoUrl.js +104 -0
- package/dist/lib/adoUrl.js.map +1 -0
- package/dist/lib/args.d.ts +14 -0
- package/dist/lib/args.d.ts.map +1 -0
- package/dist/lib/args.js +94 -0
- package/dist/lib/args.js.map +1 -0
- package/dist/lib/argv.d.ts +8 -0
- package/dist/lib/argv.d.ts.map +1 -0
- package/dist/lib/argv.js +35 -0
- package/dist/lib/argv.js.map +1 -0
- package/dist/lib/audit.d.ts +21 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +128 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/auth.d.ts +8 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +127 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/client.d.ts +32 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +181 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +39 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +150 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/context.d.ts +5 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +20 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/format.d.ts +17 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +65 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/paths.d.ts +3 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +13 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/repositoryPath.d.ts +2 -0
- package/dist/lib/repositoryPath.d.ts.map +1 -0
- package/dist/lib/repositoryPath.js +26 -0
- package/dist/lib/repositoryPath.js.map +1 -0
- package/dist/lib/stdin.d.ts +2 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +11 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/writes.d.ts +3 -0
- package/dist/lib/writes.d.ts.map +1 -0
- package/dist/lib/writes.js +37 -0
- package/dist/lib/writes.js.map +1 -0
- package/package.json +65 -4
package/dist/lib/args.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
export function argsToArgv(args) {
|
|
3
|
+
return [...args.positionals, ...Object.entries(args.flags).map(([key, value]) => value === true ? `--${key}` : `--${key}=${value}`)];
|
|
4
|
+
}
|
|
5
|
+
export function parseArgs(argv) {
|
|
6
|
+
const flags = {};
|
|
7
|
+
const positionals = [];
|
|
8
|
+
for (let i = 0; i < argv.length; i++) {
|
|
9
|
+
const arg = argv[i];
|
|
10
|
+
if (!arg)
|
|
11
|
+
continue;
|
|
12
|
+
if (!arg.startsWith("--")) {
|
|
13
|
+
positionals.push(arg);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const eq = arg.indexOf("=");
|
|
17
|
+
let key;
|
|
18
|
+
let value;
|
|
19
|
+
if (eq >= 0) {
|
|
20
|
+
key = arg.slice(2, eq);
|
|
21
|
+
value = arg.slice(eq + 1);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
key = arg.slice(2);
|
|
25
|
+
const next = argv[i + 1];
|
|
26
|
+
if (next !== undefined && !next.startsWith("--")) {
|
|
27
|
+
value = next;
|
|
28
|
+
i++;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
value = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
flags[key] = value;
|
|
35
|
+
}
|
|
36
|
+
return { flags, positionals };
|
|
37
|
+
}
|
|
38
|
+
export function flagString(args, name) {
|
|
39
|
+
const v = args.flags[name];
|
|
40
|
+
if (typeof v === "boolean") {
|
|
41
|
+
throw new AxiError(`flag --${name} requires a value`, "VALIDATION_ERROR", [
|
|
42
|
+
`Usage: --${name} <value>`,
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
return v;
|
|
46
|
+
}
|
|
47
|
+
export function flagBool(args, name) {
|
|
48
|
+
return args.flags[name] === true || args.flags[name] === "true";
|
|
49
|
+
}
|
|
50
|
+
export function flagNumber(args, name) {
|
|
51
|
+
const v = flagString(args, name);
|
|
52
|
+
if (v === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
const n = Number(v);
|
|
55
|
+
if (v.trim() === "" || !Number.isFinite(n)) {
|
|
56
|
+
throw new AxiError(`flag --${name} expects a number, got '${v}'`, "VALIDATION_ERROR", [
|
|
57
|
+
`Example: --${name} 20`,
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
return n;
|
|
61
|
+
}
|
|
62
|
+
export function flagList(args, name) {
|
|
63
|
+
const v = flagString(args, name);
|
|
64
|
+
if (v === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
return v
|
|
67
|
+
.split(",")
|
|
68
|
+
.map((s) => s.trim())
|
|
69
|
+
.filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
/** Flags accepted by every command, never reported as unknown. */
|
|
72
|
+
export const GLOBAL_FLAGS = ["profile", "org", "project", "help", "full", "fields"];
|
|
73
|
+
const RENAMED = {
|
|
74
|
+
organization: "org",
|
|
75
|
+
team_project: "project",
|
|
76
|
+
count: "limit",
|
|
77
|
+
top: "limit",
|
|
78
|
+
max: "limit",
|
|
79
|
+
};
|
|
80
|
+
export function assertKnownFlags(args, known, commandName, helpText) {
|
|
81
|
+
const knownSet = new Set([...known, ...GLOBAL_FLAGS]);
|
|
82
|
+
for (const key of Object.keys(args.flags)) {
|
|
83
|
+
if (knownSet.has(key))
|
|
84
|
+
continue;
|
|
85
|
+
const replacement = RENAMED[key];
|
|
86
|
+
const suggestions = replacement
|
|
87
|
+
? [`--${key} is not a flag here; use --${replacement} instead`]
|
|
88
|
+
: [`Valid flags for \`${commandName}\`: ${[...knownSet].map((k) => `--${k}`).join(", ")}`];
|
|
89
|
+
if (helpText)
|
|
90
|
+
suggestions.push(helpText);
|
|
91
|
+
throw new AxiError(`unknown flag --${key} for \`${commandName}\``, "UNKNOWN_FLAG", suggestions);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SDK requires `<bin> <command> ...flags`. Agents naturally write
|
|
3
|
+
* `ado-axi --profile acme pr list`, so leading selector flags are moved behind
|
|
4
|
+
* the command instead of being rejected. With no command they stay put and the
|
|
5
|
+
* home view receives them.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeArgv(argv: readonly string[]): string[];
|
|
8
|
+
//# sourceMappingURL=argv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argv.d.ts","sourceRoot":"","sources":["../../src/lib/argv.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAsB/D"}
|
package/dist/lib/argv.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const VALUE_FLAGS = new Set(["profile", "org", "project", "config"]);
|
|
2
|
+
/**
|
|
3
|
+
* The SDK requires `<bin> <command> ...flags`. Agents naturally write
|
|
4
|
+
* `ado-axi --profile acme pr list`, so leading selector flags are moved behind
|
|
5
|
+
* the command instead of being rejected. With no command they stay put and the
|
|
6
|
+
* home view receives them.
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeArgv(argv) {
|
|
9
|
+
const leading = [];
|
|
10
|
+
let index = 0;
|
|
11
|
+
while (index < argv.length) {
|
|
12
|
+
const arg = argv[index];
|
|
13
|
+
if (arg === undefined || !arg.startsWith("--"))
|
|
14
|
+
break;
|
|
15
|
+
const name = arg.slice(2).split("=")[0] ?? "";
|
|
16
|
+
if (!VALUE_FLAGS.has(name))
|
|
17
|
+
break;
|
|
18
|
+
leading.push(arg);
|
|
19
|
+
index++;
|
|
20
|
+
if (!arg.includes("=")) {
|
|
21
|
+
const value = argv[index];
|
|
22
|
+
if (value !== undefined && !value.startsWith("--")) {
|
|
23
|
+
leading.push(value);
|
|
24
|
+
index++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const rest = argv.slice(index);
|
|
29
|
+
if (leading.length === 0)
|
|
30
|
+
return [...argv];
|
|
31
|
+
if (rest.length === 0)
|
|
32
|
+
return ["home", ...leading];
|
|
33
|
+
return [rest[0], ...rest.slice(1), ...leading];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=argv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../src/lib/argv.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ParsedArgs } from "./args.js";
|
|
2
|
+
import { type RequestOptions } from "./client.js";
|
|
3
|
+
import type { ResolvedProfile } from "./config.js";
|
|
4
|
+
export type AuditRecord = Record<string, unknown>;
|
|
5
|
+
export declare function assertAuditPositionals(args: ParsedArgs, maximum: number): void;
|
|
6
|
+
export declare function auditLimit(args: ParsedArgs): number;
|
|
7
|
+
export declare function auditId(args: ParsedArgs, flag?: string, index?: number): string;
|
|
8
|
+
/** Untrusted API errors can echo credentials. Audit reads expose only the error category. */
|
|
9
|
+
export declare function auditRequest<T>(profile: ResolvedProfile, options: RequestOptions): Promise<T>;
|
|
10
|
+
/** Count every page while retaining at most the requested number of records. */
|
|
11
|
+
export declare function auditList(profile: ResolvedProfile, options: RequestOptions, limit: number, collection?: string): Promise<{
|
|
12
|
+
rows: AuditRecord[];
|
|
13
|
+
total: number;
|
|
14
|
+
}>;
|
|
15
|
+
/** Mask before selecting fields or expanding details, including nested secret variables. */
|
|
16
|
+
export declare function safeAudit(value: unknown, args: ParsedArgs): unknown;
|
|
17
|
+
export declare function auditOutput(name: string, result: {
|
|
18
|
+
rows: AuditRecord[];
|
|
19
|
+
total: number;
|
|
20
|
+
}, args: ParsedArgs, columns: readonly string[]): AuditRecord;
|
|
21
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACxF,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI9E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMnD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,SAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAKxE;AAED,6FAA6F;AAC7F,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CASnG;AAED,gFAAgF;AAChF,wBAAsB,SAAS,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,UAAU,SAAU,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBjD;AAED,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAkCnE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAC9C,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,WAAW,CAsBb"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { flagBool, flagList, flagNumber, flagString } from "./args.js";
|
|
3
|
+
import { request } from "./client.js";
|
|
4
|
+
import { pickFields, truncate } from "./format.js";
|
|
5
|
+
export function assertAuditPositionals(args, maximum) {
|
|
6
|
+
if (args.positionals.length > maximum) {
|
|
7
|
+
throw new AxiError("unexpected positional arguments", "VALIDATION_ERROR", ["Use --help for this command's arguments"]);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function auditLimit(args) {
|
|
11
|
+
const limit = flagNumber(args, "limit") ?? 100;
|
|
12
|
+
if (!Number.isSafeInteger(limit) || limit < 1) {
|
|
13
|
+
throw new AxiError("--limit must be a positive integer", "VALIDATION_ERROR");
|
|
14
|
+
}
|
|
15
|
+
return limit;
|
|
16
|
+
}
|
|
17
|
+
export function auditId(args, flag = "id", index = 0) {
|
|
18
|
+
assertAuditPositionals(args, index + 1);
|
|
19
|
+
const id = flagString(args, flag) ?? args.positionals[index];
|
|
20
|
+
if (!id)
|
|
21
|
+
throw new AxiError(`--${flag} or an identifier is required`, "VALIDATION_ERROR");
|
|
22
|
+
return encodeURIComponent(id);
|
|
23
|
+
}
|
|
24
|
+
/** Untrusted API errors can echo credentials. Audit reads expose only the error category. */
|
|
25
|
+
export async function auditRequest(profile, options) {
|
|
26
|
+
try {
|
|
27
|
+
return await request(profile, { ...options, method: "GET" });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const code = error instanceof AxiError ? error.code : "API_ERROR";
|
|
31
|
+
throw new AxiError("audit read failed; response details withheld to protect secrets", code, [
|
|
32
|
+
"Check the selected organization, project, identifier, and read permissions",
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Count every page while retaining at most the requested number of records. */
|
|
37
|
+
export async function auditList(profile, options, limit, collection = "value") {
|
|
38
|
+
const rows = [];
|
|
39
|
+
let total = 0;
|
|
40
|
+
let continuation;
|
|
41
|
+
const seen = new Set();
|
|
42
|
+
do {
|
|
43
|
+
let headerToken;
|
|
44
|
+
const response = await auditRequest(profile, {
|
|
45
|
+
...options,
|
|
46
|
+
query: { ...options.query, continuationToken: continuation },
|
|
47
|
+
onHeaders: (headers) => { headerToken = headers.get("x-ms-continuationtoken") || undefined; },
|
|
48
|
+
});
|
|
49
|
+
const page = (Array.isArray(response) ? response : response[collection] ?? []);
|
|
50
|
+
total += page.length;
|
|
51
|
+
rows.push(...page.slice(0, Math.max(0, limit - rows.length)));
|
|
52
|
+
continuation = headerToken || (Array.isArray(response) ? undefined : response.continuationToken);
|
|
53
|
+
if (continuation && seen.has(continuation)) {
|
|
54
|
+
throw new AxiError("audit pagination did not advance; no partial result returned", "RESPONSE_INVALID");
|
|
55
|
+
}
|
|
56
|
+
if (continuation)
|
|
57
|
+
seen.add(continuation);
|
|
58
|
+
} while (continuation);
|
|
59
|
+
return { rows, total };
|
|
60
|
+
}
|
|
61
|
+
/** Mask before selecting fields or expanding details, including nested secret variables. */
|
|
62
|
+
export function safeAudit(value, args) {
|
|
63
|
+
const limit = auditLimit(args);
|
|
64
|
+
const full = flagBool(args, "full");
|
|
65
|
+
function safe(item) {
|
|
66
|
+
if (typeof item === "string")
|
|
67
|
+
return full ? item : truncate(item, 1200).text;
|
|
68
|
+
if (Array.isArray(item)) {
|
|
69
|
+
const items = item.slice(0, limit).map(safe);
|
|
70
|
+
return item.length > limit ? { items, total: item.length, omitted: item.length - limit } : items;
|
|
71
|
+
}
|
|
72
|
+
if (!item || typeof item !== "object")
|
|
73
|
+
return item;
|
|
74
|
+
const record = item;
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const [key, child] of Object.entries(record)) {
|
|
77
|
+
if (/authorization|credential|password|secret|accesstoken|refreshtoken|privatekey|certificate|providerdata|capabilities/i.test(key) && key !== "isSecret") {
|
|
78
|
+
out[key] = "***";
|
|
79
|
+
}
|
|
80
|
+
else if (key === "value" && record.isSecret === true) {
|
|
81
|
+
out[key] = "***";
|
|
82
|
+
}
|
|
83
|
+
else if (key === "variables" && child && typeof child === "object") {
|
|
84
|
+
const variables = Object.entries(child);
|
|
85
|
+
out[key] = variables.slice(0, limit).map(([name, variable]) => ({ name, ...safe(variable) }));
|
|
86
|
+
out["variables-total"] = variables.length;
|
|
87
|
+
out["variables-omitted"] = Math.max(0, variables.length - limit);
|
|
88
|
+
}
|
|
89
|
+
else if (key === "acesDictionary" && child && typeof child === "object") {
|
|
90
|
+
const entries = Object.entries(child);
|
|
91
|
+
out[key] = Object.fromEntries(entries.slice(0, limit).map(([descriptor, ace]) => [descriptor, safe(ace)]));
|
|
92
|
+
out["aces-total"] = entries.length;
|
|
93
|
+
out["aces-omitted"] = Math.max(0, entries.length - limit);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
out[key] = safe(child);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
return safe(value);
|
|
102
|
+
}
|
|
103
|
+
export function auditOutput(name, result, args, columns) {
|
|
104
|
+
const safe = result.rows.map((row) => safeAudit(row, args));
|
|
105
|
+
const selected = flagList(args, "fields");
|
|
106
|
+
const fields = selected?.length ? selected : (flagBool(args, "full") ? undefined : [...columns]);
|
|
107
|
+
const rows = pickFields(safe, fields);
|
|
108
|
+
for (const [index, row] of rows.entries()) {
|
|
109
|
+
const record = safe[index];
|
|
110
|
+
for (const [collection, prefix] of [["acesDictionary", "aces"], ["variables", "variables"]]) {
|
|
111
|
+
if (!(collection in row))
|
|
112
|
+
continue;
|
|
113
|
+
for (const suffix of ["total", "omitted"]) {
|
|
114
|
+
const key = `${prefix}-${suffix}`;
|
|
115
|
+
if (key in record)
|
|
116
|
+
row[key] = record[key];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const omitted = result.total - rows.length;
|
|
121
|
+
return {
|
|
122
|
+
count: `${rows.length} of ${result.total} ${name}`,
|
|
123
|
+
omitted,
|
|
124
|
+
[name]: rows,
|
|
125
|
+
...(omitted > 0 ? { help: [`Pass --limit ${result.total} to include all ${name}; --full expands fields, not the limit`] } : {}),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResolvedProfile } from "./config.js";
|
|
2
|
+
export interface Credential {
|
|
3
|
+
header: string;
|
|
4
|
+
mode: "pat" | "az";
|
|
5
|
+
}
|
|
6
|
+
export declare function resolveCredential(profile: ResolvedProfile, signal?: AbortSignal): Promise<Credential>;
|
|
7
|
+
export declare function clearCredentialCache(): void;
|
|
8
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAOnD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;CACpB;AAID,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAU3G;AA6GD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import spawn from "cross-spawn";
|
|
2
|
+
import { AxiError } from "axi-sdk-js";
|
|
3
|
+
/** Azure DevOps AAD resource id — constant across all tenants. */
|
|
4
|
+
const ADO_RESOURCE = "499b84ac-1321-427f-aa17-267ca6975798";
|
|
5
|
+
const MAX_AZ_OUTPUT_BYTES = 8 * 1024 * 1024;
|
|
6
|
+
const cache = new Map();
|
|
7
|
+
export async function resolveCredential(profile, signal) {
|
|
8
|
+
signal?.throwIfAborted();
|
|
9
|
+
const key = `${profile.auth}:${profile.org}:${profile.patEnv ?? ""}:${profile.tenant ?? ""}`;
|
|
10
|
+
const hit = cache.get(key);
|
|
11
|
+
if (hit)
|
|
12
|
+
return hit;
|
|
13
|
+
const credential = profile.auth === "pat" ? patCredential(profile) : await azCredential(profile, signal);
|
|
14
|
+
signal?.throwIfAborted();
|
|
15
|
+
cache.set(key, credential);
|
|
16
|
+
return credential;
|
|
17
|
+
}
|
|
18
|
+
function patCredential(profile) {
|
|
19
|
+
const varName = profile.patEnv ?? "ADO_AXI_PAT";
|
|
20
|
+
const pat = process.env[varName];
|
|
21
|
+
if (!pat) {
|
|
22
|
+
throw new AxiError(`personal access token env var $${varName} is not set for org '${profile.org}'`, "AUTH_REQUIRED", [
|
|
23
|
+
`Set $${varName} to a PAT with the scopes you need (Work Items, Code, Build: read)`,
|
|
24
|
+
"Or switch the profile to az CLI auth: set \"auth\": \"az\" in the config file",
|
|
25
|
+
"Run `ado-axi doctor` to re-check authentication",
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
return { header: `Basic ${Buffer.from(`:${pat}`).toString("base64")}`, mode: "pat" };
|
|
29
|
+
}
|
|
30
|
+
async function azCredential(profile, signal) {
|
|
31
|
+
try {
|
|
32
|
+
const azArgs = ["account", "get-access-token", "--resource", ADO_RESOURCE, "--output", "json"];
|
|
33
|
+
if (profile.tenant)
|
|
34
|
+
azArgs.push("--tenant", profile.tenant);
|
|
35
|
+
const stdout = await runAz(azArgs, signal);
|
|
36
|
+
const parsed = JSON.parse(stdout);
|
|
37
|
+
if (!parsed.accessToken)
|
|
38
|
+
throw new Error("no accessToken in response");
|
|
39
|
+
return { header: `Bearer ${parsed.accessToken}`, mode: "az" };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
signal?.throwIfAborted();
|
|
43
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44
|
+
const notInstalled = /az CLI is not installed/i.test(message);
|
|
45
|
+
const notLoggedIn = !notInstalled && /az login|not logged in|AADSTS|Please run/i.test(message);
|
|
46
|
+
throw new AxiError(notInstalled
|
|
47
|
+
? "Azure CLI ('az') is not installed or not on PATH"
|
|
48
|
+
: notLoggedIn
|
|
49
|
+
? `not signed in to Azure CLI for org '${profile.org}'`
|
|
50
|
+
: `could not acquire an Azure DevOps access token for org '${profile.org}'`, "AUTH_REQUIRED", [
|
|
51
|
+
...(notInstalled
|
|
52
|
+
? ["Install the Azure CLI: https://learn.microsoft.com/cli/azure/install-azure-cli"]
|
|
53
|
+
: [
|
|
54
|
+
profile.tenant
|
|
55
|
+
? `Run \`az login --tenant ${profile.tenant} --scope ${ADO_RESOURCE}/.default\``
|
|
56
|
+
: "Run `az login` (and `az account set --subscription <id>` if needed)",
|
|
57
|
+
profile.tenant
|
|
58
|
+
? ""
|
|
59
|
+
: "If the organization lives in another Entra tenant, add \"tenant\": \"<tenant-id>\" to the profile",
|
|
60
|
+
]),
|
|
61
|
+
`Or switch the profile to a PAT: set "auth": "pat" and "patEnv": "ADO_${profile.org.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_PAT"`,
|
|
62
|
+
"Run `ado-axi doctor` to re-check authentication",
|
|
63
|
+
].filter(Boolean));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Spawns the Azure CLI and resolves with its stdout. Uses `cross-spawn` instead
|
|
68
|
+
* of a raw `child_process.execFile`/`spawn` call because on Windows `az` is a
|
|
69
|
+
* `.cmd` shim: Node's default (shell-less) spawn cannot execute it and fails
|
|
70
|
+
* with ENOENT, wrongly implying the CLI is missing. `cross-spawn` resolves
|
|
71
|
+
* `.cmd`/`.bat` shims correctly on Windows while still passing arguments
|
|
72
|
+
* through as an argv array (not a shell command string), so there's no
|
|
73
|
+
* shell-injection risk from argument values (e.g. `--tenant`).
|
|
74
|
+
*/
|
|
75
|
+
function runAz(args, signal) {
|
|
76
|
+
signal?.throwIfAborted();
|
|
77
|
+
let onAbort;
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const child = spawn("az", args, { windowsHide: true });
|
|
80
|
+
let stdout = "";
|
|
81
|
+
let stderr = "";
|
|
82
|
+
let truncated = false;
|
|
83
|
+
child.stdout?.on("data", (chunk) => {
|
|
84
|
+
if (stdout.length < MAX_AZ_OUTPUT_BYTES)
|
|
85
|
+
stdout += chunk.toString();
|
|
86
|
+
else
|
|
87
|
+
truncated = true;
|
|
88
|
+
});
|
|
89
|
+
child.stderr?.on("data", (chunk) => {
|
|
90
|
+
if (stderr.length < MAX_AZ_OUTPUT_BYTES)
|
|
91
|
+
stderr += chunk.toString();
|
|
92
|
+
});
|
|
93
|
+
child.on("error", (err) => {
|
|
94
|
+
if (err.code === "ENOENT") {
|
|
95
|
+
reject(new Error("az CLI is not installed or not on PATH"));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
reject(err);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
child.on("close", (code) => {
|
|
102
|
+
if (code === 0 && !truncated) {
|
|
103
|
+
resolve(stdout);
|
|
104
|
+
}
|
|
105
|
+
else if (truncated) {
|
|
106
|
+
reject(new Error("az CLI output exceeded the maximum buffer size"));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
reject(new Error(stderr.trim() || `az exited with code ${code}`));
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
onAbort = () => {
|
|
113
|
+
child.kill();
|
|
114
|
+
reject(signal?.reason);
|
|
115
|
+
};
|
|
116
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
117
|
+
if (signal?.aborted)
|
|
118
|
+
onAbort();
|
|
119
|
+
}).finally(() => {
|
|
120
|
+
if (onAbort)
|
|
121
|
+
signal?.removeEventListener("abort", onAbort);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
export function clearCredentialCache() {
|
|
125
|
+
cache.clear();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ResolvedProfile } from "./config.js";
|
|
2
|
+
import { type AdoHost } from "./adoUrl.js";
|
|
3
|
+
export declare const DEFAULT_API_VERSION = "7.1";
|
|
4
|
+
export type { AdoHost } from "./adoUrl.js";
|
|
5
|
+
export interface RequestOptions {
|
|
6
|
+
method?: string;
|
|
7
|
+
/** Path after the org (and project) segment, e.g. `_apis/wit/workitems/42`. */
|
|
8
|
+
path: string;
|
|
9
|
+
project?: string;
|
|
10
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
11
|
+
body?: unknown;
|
|
12
|
+
apiVersion?: string;
|
|
13
|
+
contentType?: string;
|
|
14
|
+
host?: AdoHost;
|
|
15
|
+
/** Override the Accept header — build logs and file content need `text/plain`. */
|
|
16
|
+
accept?: string;
|
|
17
|
+
/** Return the raw response text instead of parsed JSON (logs, files). */
|
|
18
|
+
raw?: boolean;
|
|
19
|
+
/** Read binary content with a hard bound, including responses without Content-Length. */
|
|
20
|
+
binaryMaxBytes?: number;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
/** Observe pagination headers without exposing response bodies to callers. */
|
|
23
|
+
onHeaders?: (headers: Headers) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function buildUrl(profile: ResolvedProfile, options: RequestOptions): string;
|
|
26
|
+
export declare function request<T = unknown>(profile: ResolvedProfile, options: RequestOptions): Promise<T>;
|
|
27
|
+
export interface ListResponse<T> {
|
|
28
|
+
count?: number;
|
|
29
|
+
value?: T[];
|
|
30
|
+
}
|
|
31
|
+
export declare function requestList<T>(profile: ResolvedProfile, options: RequestOptions): Promise<T[]>;
|
|
32
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAkD,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3F,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAiBlF;AAED,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,CAAC,CAAC,CAqFZ;AA2ED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;CACb;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,CAAC,EAAE,CAAC,CAGd"}
|