@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
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { resolveCredential } from "./auth.js";
|
|
3
|
+
import { ADO_HOSTS, assertRelativeApiPath, normalizeOrg } from "./adoUrl.js";
|
|
4
|
+
export const DEFAULT_API_VERSION = "7.1";
|
|
5
|
+
export function buildUrl(profile, options) {
|
|
6
|
+
assertRelativeApiPath(options.path);
|
|
7
|
+
const host = ADO_HOSTS[options.host ?? "dev"];
|
|
8
|
+
const segments = [encodeURIComponent(normalizeOrg(profile.org))];
|
|
9
|
+
const project = options.project;
|
|
10
|
+
if (project)
|
|
11
|
+
segments.push(encodeURIComponent(project));
|
|
12
|
+
const path = options.path.replace(/^\/+/, "");
|
|
13
|
+
const url = new URL(`https://${host}/${segments.join("/")}/${path}`);
|
|
14
|
+
const query = options.query ?? {};
|
|
15
|
+
for (const [key, value] of Object.entries(query)) {
|
|
16
|
+
if (value === undefined)
|
|
17
|
+
continue;
|
|
18
|
+
url.searchParams.set(key, String(value));
|
|
19
|
+
}
|
|
20
|
+
if (!url.searchParams.has("api-version")) {
|
|
21
|
+
url.searchParams.set("api-version", options.apiVersion ?? DEFAULT_API_VERSION);
|
|
22
|
+
}
|
|
23
|
+
return url.toString();
|
|
24
|
+
}
|
|
25
|
+
export async function request(profile, options) {
|
|
26
|
+
const url = buildUrl(profile, options);
|
|
27
|
+
options.signal?.throwIfAborted();
|
|
28
|
+
const credential = await (options.signal
|
|
29
|
+
? resolveCredential(profile, options.signal)
|
|
30
|
+
: resolveCredential(profile));
|
|
31
|
+
options.signal?.throwIfAborted();
|
|
32
|
+
const method = (options.method ?? "GET").toUpperCase();
|
|
33
|
+
const headers = {
|
|
34
|
+
Authorization: credential.header,
|
|
35
|
+
Accept: options.accept ?? "application/json",
|
|
36
|
+
"User-Agent": "ado-axi",
|
|
37
|
+
};
|
|
38
|
+
let body;
|
|
39
|
+
if (options.body !== undefined) {
|
|
40
|
+
headers["Content-Type"] = options.contentType ?? "application/json";
|
|
41
|
+
body =
|
|
42
|
+
typeof options.body === "string" || options.body instanceof Uint8Array
|
|
43
|
+
? options.body
|
|
44
|
+
: JSON.stringify(options.body);
|
|
45
|
+
}
|
|
46
|
+
let response;
|
|
47
|
+
try {
|
|
48
|
+
response = await fetch(url, { method, headers, body, signal: options.signal });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
options.signal?.throwIfAborted();
|
|
52
|
+
throw new AxiError(`network error contacting Azure DevOps (${profile.org})`, "NETWORK_ERROR", [
|
|
53
|
+
`Check connectivity to https://${ADO_HOSTS[options.host ?? "dev"]}`,
|
|
54
|
+
err.message,
|
|
55
|
+
"Run `ado-axi doctor` to verify the profile",
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
let binary;
|
|
59
|
+
if (options.binaryMaxBytes !== undefined) {
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
await response.body?.cancel();
|
|
62
|
+
throw new AxiError(`attachment download failed (HTTP ${response.status})`, "API_ERROR");
|
|
63
|
+
}
|
|
64
|
+
const max = options.binaryMaxBytes;
|
|
65
|
+
const chunks = [];
|
|
66
|
+
let size = 0;
|
|
67
|
+
const reader = response.body?.getReader();
|
|
68
|
+
try {
|
|
69
|
+
if (Number(response.headers.get("content-length")) > max) {
|
|
70
|
+
throw new AxiError(`attachment exceeds the ${max} byte limit`, "SIZE_LIMIT");
|
|
71
|
+
}
|
|
72
|
+
if (reader) {
|
|
73
|
+
while (true) {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done)
|
|
76
|
+
break;
|
|
77
|
+
size += value.byteLength;
|
|
78
|
+
if (size > max)
|
|
79
|
+
throw new AxiError(`attachment exceeds the ${max} byte limit`, "SIZE_LIMIT");
|
|
80
|
+
chunks.push(value);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await reader?.cancel();
|
|
86
|
+
}
|
|
87
|
+
binary = Buffer.concat(chunks, size);
|
|
88
|
+
}
|
|
89
|
+
const text = binary === undefined ? await response.text() : binary.toString("utf8");
|
|
90
|
+
options.signal?.throwIfAborted();
|
|
91
|
+
if (!response.ok)
|
|
92
|
+
throw translateError(response, text, profile, url);
|
|
93
|
+
options.onHeaders?.(response.headers);
|
|
94
|
+
if (/<title>[\s\S]*Azure DevOps Services \| Sign In/i.test(text)) {
|
|
95
|
+
throw translateError(new Response(null, { status: 401 }), text, profile, url);
|
|
96
|
+
}
|
|
97
|
+
if (binary !== undefined)
|
|
98
|
+
return binary;
|
|
99
|
+
if (options.raw)
|
|
100
|
+
return text;
|
|
101
|
+
if (!text)
|
|
102
|
+
return undefined;
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(text);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
throw new AxiError(`invalid JSON response from Azure DevOps (HTTP ${response.status}; content-type: ${response.headers.get("content-type") ?? "unknown"})`, "RESPONSE_INVALID", ["Check whether a proxy or gateway is returning a non-JSON response"]);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function translateError(response, text, profile, url) {
|
|
111
|
+
let message = text.slice(0, 400);
|
|
112
|
+
let typeKey;
|
|
113
|
+
try {
|
|
114
|
+
const parsed = JSON.parse(text);
|
|
115
|
+
if (parsed.message)
|
|
116
|
+
message = parsed.message;
|
|
117
|
+
typeKey = parsed.typeKey;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* HTML sign-in pages and empty bodies fall through */
|
|
121
|
+
}
|
|
122
|
+
const path = new URL(url).pathname;
|
|
123
|
+
if (response.status === 401 || /Azure DevOps Services \| Sign In/i.test(text)) {
|
|
124
|
+
return new AxiError(`not authorized for org '${profile.org}'`, "AUTH_REQUIRED", [
|
|
125
|
+
profile.auth === "pat"
|
|
126
|
+
? `The PAT in $${profile.patEnv ?? "ADO_AXI_PAT"} is missing, expired, or lacks scope`
|
|
127
|
+
: "Run `az login` — the Azure CLI token was rejected or expired",
|
|
128
|
+
"Run `ado-axi doctor` to verify authentication for this profile",
|
|
129
|
+
]);
|
|
130
|
+
}
|
|
131
|
+
if (response.status === 403) {
|
|
132
|
+
return new AxiError(`access denied: ${message}`, "FORBIDDEN", [
|
|
133
|
+
"The identity is authenticated but lacks permission for this resource",
|
|
134
|
+
profile.auth === "pat" ? "Check the PAT scopes" : "Check the account's Azure DevOps permissions",
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
if (response.status === 404) {
|
|
138
|
+
const wrongProject = /TF200016|does not exist/i.test(message);
|
|
139
|
+
return new AxiError(`not found: ${path}`, "NOT_FOUND", [
|
|
140
|
+
message,
|
|
141
|
+
wrongProject
|
|
142
|
+
? `Project '${profile.project ?? ""}' was not found in org '${profile.org}' — pass --org <org> or use a profile that points at the right org`
|
|
143
|
+
: "Check the org, project, id, and repository name",
|
|
144
|
+
wrongProject
|
|
145
|
+
? "Run `ado-axi config list` to see configured orgs and profiles"
|
|
146
|
+
: "Run `ado-axi project list` to see available projects",
|
|
147
|
+
]);
|
|
148
|
+
}
|
|
149
|
+
if (response.status === 400) {
|
|
150
|
+
return new AxiError(message || "bad request", "VALIDATION_ERROR", [
|
|
151
|
+
typeKey ? `type: ${typeKey}` : "Check the flag values passed to this command",
|
|
152
|
+
]);
|
|
153
|
+
}
|
|
154
|
+
if (response.status === 409) {
|
|
155
|
+
return new AxiError(message || "conflict", "CONFLICT", [
|
|
156
|
+
"The resource changed concurrently or the requested transition conflicts with its current state",
|
|
157
|
+
"Re-read the resource before retrying",
|
|
158
|
+
]);
|
|
159
|
+
}
|
|
160
|
+
if (response.status === 412) {
|
|
161
|
+
return new AxiError(message || "precondition failed", "PRECONDITION_FAILED", [
|
|
162
|
+
/VS403351|Test Operation/i.test(message)
|
|
163
|
+
? "The resource changed since the revision you tested against — re-read it and retry"
|
|
164
|
+
: "A precondition (If-Match / test operation) on this request failed",
|
|
165
|
+
]);
|
|
166
|
+
}
|
|
167
|
+
if (response.status === 429) {
|
|
168
|
+
return new AxiError("rate limited by Azure DevOps", "RATE_LIMITED", [
|
|
169
|
+
`Retry after ${response.headers.get("retry-after") ?? "a few"} seconds`,
|
|
170
|
+
"Narrow the query with --limit or more filters",
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
return new AxiError(message || `HTTP ${response.status}`, "API_ERROR", [
|
|
174
|
+
`HTTP ${response.status} from ${path}`,
|
|
175
|
+
]);
|
|
176
|
+
}
|
|
177
|
+
export async function requestList(profile, options) {
|
|
178
|
+
const result = await request(profile, options);
|
|
179
|
+
return result?.value ?? [];
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAE3F,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAyBzC,MAAM,UAAU,QAAQ,CAAC,OAAwB,EAAE,OAAuB;IACxE,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,CAAC,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAwB,EACxB,OAAuB;IAEvB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM;QACtC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,CAAC,MAAM;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,kBAAkB;QAC5C,YAAY,EAAE,SAAS;KACxB,CAAC;IACF,IAAI,IAAqC,CAAC;IAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;QACpE,IAAI;YACF,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,YAAY,UAAU;gBACpE,CAAC,CAAC,OAAO,CAAC,IAAI;gBACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAChB,0CAA0C,OAAO,CAAC,GAAG,GAAG,EACxD,eAAe,EACf;YACE,iCAAiC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;YAClE,GAAa,CAAC,OAAO;YACtB,4CAA4C;SAC7C,CACF,CAAC;IACJ,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,oCAAoC,QAAQ,CAAC,MAAM,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;QACnC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBACzD,MAAM,IAAI,QAAQ,CAAC,0BAA0B,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAChB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;oBACzB,IAAI,IAAI,GAAG,GAAG;wBAAE,MAAM,IAAI,QAAQ,CAAC,0BAA0B,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC;oBAC7F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACrE,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,cAAc,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAsB,CAAC;IACxD,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,IAAoB,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAyB,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,iDAAiD,QAAQ,CAAC,MAAM,mBAAmB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,GAAG,EACvI,kBAAkB,EAClB,CAAC,mEAAmE,CAAC,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAkB,EAClB,IAAY,EACZ,OAAwB,EACxB,GAAW;IAEX,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2C,CAAC;QAC1E,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7C,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,QAAQ,CAAC,2BAA2B,OAAO,CAAC,GAAG,GAAG,EAAE,eAAe,EAAE;YAC9E,OAAO,CAAC,IAAI,KAAK,KAAK;gBACpB,CAAC,CAAC,eAAe,OAAO,CAAC,MAAM,IAAI,aAAa,sCAAsC;gBACtF,CAAC,CAAC,8DAA8D;YAClE,gEAAgE;SACjE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,kBAAkB,OAAO,EAAE,EAAE,WAAW,EAAE;YAC5D,sEAAsE;YACtE,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,8CAA8C;SACjG,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,QAAQ,CAAC,cAAc,IAAI,EAAE,EAAE,WAAW,EAAE;YACrD,OAAO;YACP,YAAY;gBACV,CAAC,CAAC,YAAY,OAAO,CAAC,OAAO,IAAI,EAAE,2BAA2B,OAAO,CAAC,GAAG,oEAAoE;gBAC7I,CAAC,CAAC,iDAAiD;YACrD,YAAY;gBACV,CAAC,CAAC,+DAA+D;gBACjE,CAAC,CAAC,sDAAsD;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,aAAa,EAAE,kBAAkB,EAAE;YAChE,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,8CAA8C;SAC9E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,UAAU,EAAE,UAAU,EAAE;YACrD,gGAAgG;YAChG,sCAAsC;SACvC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,EAAE;YAC3E,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,CAAC,CAAC,mFAAmF;gBACrF,CAAC,CAAC,mEAAmE;SACxE,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,8BAA8B,EAAE,cAAc,EAAE;YAClE,eAAe,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,UAAU;YACvE,+CAA+C;SAChD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE;QACrE,QAAQ,QAAQ,CAAC,MAAM,SAAS,IAAI,EAAE;KACvC,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAwB,EACxB,OAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAkB,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type AuthMode = "az" | "pat";
|
|
2
|
+
export interface Profile {
|
|
3
|
+
org: string;
|
|
4
|
+
auth: AuthMode;
|
|
5
|
+
tenant?: string;
|
|
6
|
+
patEnv?: string;
|
|
7
|
+
project?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ConfigFile {
|
|
11
|
+
defaultProfile?: string;
|
|
12
|
+
profiles: Record<string, Profile>;
|
|
13
|
+
}
|
|
14
|
+
export interface ResolvedProfile extends Profile {
|
|
15
|
+
name: string;
|
|
16
|
+
source: "flags" | "env" | "config" | "config-default";
|
|
17
|
+
configPath?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function configPath(explicit?: string): string;
|
|
20
|
+
export declare function loadConfig(explicit?: string): {
|
|
21
|
+
path: string;
|
|
22
|
+
config?: ConfigFile;
|
|
23
|
+
};
|
|
24
|
+
export declare function saveConfig(config: ConfigFile, explicit?: string): string;
|
|
25
|
+
export interface ProfileFlags {
|
|
26
|
+
profile?: string;
|
|
27
|
+
org?: string;
|
|
28
|
+
project?: string;
|
|
29
|
+
config?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolution order: explicit --org (with --project) > --profile > $ADO_AXI_ORG >
|
|
33
|
+
* config defaultProfile > the only profile in the config.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveProfile(flags?: ProfileFlags): ResolvedProfile;
|
|
36
|
+
/** `ADO_<ORG>_PAT` — the conventional per-org PAT env var. */
|
|
37
|
+
export declare function envPatVarFor(org: string): string | undefined;
|
|
38
|
+
export declare function requireProject(profile: ResolvedProfile, command: string): string;
|
|
39
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;AAEpC,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,gBAAgB,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,CA4BnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,GAAE,YAAiB,GAAG,eAAe,CA6ExE;AAuBD,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO5D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOhF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve as resolvePath } from "node:path";
|
|
4
|
+
import { AxiError } from "axi-sdk-js";
|
|
5
|
+
import { normalizeOrg } from "./adoUrl.js";
|
|
6
|
+
export function configPath(explicit) {
|
|
7
|
+
if (explicit)
|
|
8
|
+
return resolvePath(explicit);
|
|
9
|
+
if (process.env.ADO_AXI_CONFIG)
|
|
10
|
+
return resolvePath(process.env.ADO_AXI_CONFIG);
|
|
11
|
+
const local = resolvePath(process.cwd(), "ado-axi.config.json");
|
|
12
|
+
if (existsSync(local))
|
|
13
|
+
return local;
|
|
14
|
+
return join(homedir(), ".ado-axi", "config.json");
|
|
15
|
+
}
|
|
16
|
+
export function loadConfig(explicit) {
|
|
17
|
+
const path = configPath(explicit);
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return { path };
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
throw new AxiError(`config file at ${path} is not valid JSON: ${err.message}`, "VALIDATION_ERROR", ["Fix the JSON syntax", "Or run `ado-axi config init --org <org> --project <project>`"]);
|
|
26
|
+
}
|
|
27
|
+
if (!parsed || typeof parsed !== "object" || !parsed.profiles) {
|
|
28
|
+
throw new AxiError(`config file at ${path} is missing a 'profiles' object`, "VALIDATION_ERROR", [
|
|
29
|
+
"Expected shape: { defaultProfile, profiles: { name: { org, auth, project } } }",
|
|
30
|
+
"Run `ado-axi config init --org <org> --project <project>` to rewrite it",
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
for (const [name, profile] of Object.entries(parsed.profiles)) {
|
|
34
|
+
if (!profile || typeof profile.org !== "string") {
|
|
35
|
+
throw new AxiError(`profile '${name}' is missing an organization name`, "VALIDATION_ERROR", [
|
|
36
|
+
"Set 'org' to an organization name or organization-root URL",
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
profile.org = normalizeOrg(profile.org);
|
|
40
|
+
}
|
|
41
|
+
return { path, config: parsed };
|
|
42
|
+
}
|
|
43
|
+
export function saveConfig(config, explicit) {
|
|
44
|
+
const path = configPath(explicit);
|
|
45
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
46
|
+
writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
47
|
+
return path;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolution order: explicit --org (with --project) > --profile > $ADO_AXI_ORG >
|
|
51
|
+
* config defaultProfile > the only profile in the config.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveProfile(flags = {}) {
|
|
54
|
+
flags = { ...flags, org: flags.org === undefined ? undefined : normalizeOrg(flags.org) };
|
|
55
|
+
const { path, config } = loadConfig(flags.config);
|
|
56
|
+
if (flags.profile) {
|
|
57
|
+
const entry = config?.profiles?.[flags.profile];
|
|
58
|
+
if (!entry) {
|
|
59
|
+
throw new AxiError(`profile '${flags.profile}' not found`, "VALIDATION_ERROR", [
|
|
60
|
+
`Known profiles: ${Object.keys(config?.profiles ?? {}).join(", ") || "(none)"}`,
|
|
61
|
+
"Run `ado-axi config list` to see configured profiles",
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
return applyOverrides({ ...entry, name: flags.profile, source: "config", configPath: path }, flags);
|
|
65
|
+
}
|
|
66
|
+
if (flags.org) {
|
|
67
|
+
const matched = matchProfileByOrg(config, flags.org);
|
|
68
|
+
if (matched) {
|
|
69
|
+
return applyOverrides({ ...matched.profile, name: matched.name, source: "flags", configPath: path }, flags);
|
|
70
|
+
}
|
|
71
|
+
const patEnv = envPatVarFor(flags.org);
|
|
72
|
+
return {
|
|
73
|
+
name: flags.org,
|
|
74
|
+
org: flags.org,
|
|
75
|
+
auth: patEnv ? "pat" : "az",
|
|
76
|
+
patEnv,
|
|
77
|
+
project: flags.project ?? process.env.ADO_AXI_PROJECT,
|
|
78
|
+
source: "flags",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const envOrg = process.env.ADO_AXI_ORG ? normalizeOrg(process.env.ADO_AXI_ORG) : undefined;
|
|
82
|
+
if (envOrg) {
|
|
83
|
+
const matched = matchProfileByOrg(config, envOrg);
|
|
84
|
+
if (matched) {
|
|
85
|
+
return applyOverrides({ ...matched.profile, name: matched.name, source: "env", configPath: path }, flags);
|
|
86
|
+
}
|
|
87
|
+
const patEnv = envPatVarFor(envOrg);
|
|
88
|
+
return {
|
|
89
|
+
name: envOrg,
|
|
90
|
+
org: envOrg,
|
|
91
|
+
auth: patEnv ? "pat" : "az",
|
|
92
|
+
patEnv,
|
|
93
|
+
project: flags.project ?? process.env.ADO_AXI_PROJECT,
|
|
94
|
+
source: "env",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const profiles = config?.profiles ?? {};
|
|
98
|
+
const names = Object.keys(profiles);
|
|
99
|
+
const target = config?.defaultProfile ?? (names.length === 1 ? names[0] : undefined);
|
|
100
|
+
if (target) {
|
|
101
|
+
const entry = profiles[target];
|
|
102
|
+
if (!entry) {
|
|
103
|
+
throw new AxiError(`defaultProfile '${target}' is not defined in profiles`, "VALIDATION_ERROR", [
|
|
104
|
+
`Known profiles: ${names.join(", ") || "(none)"}`,
|
|
105
|
+
"Fix 'defaultProfile' in the config file",
|
|
106
|
+
]);
|
|
107
|
+
}
|
|
108
|
+
return applyOverrides({ ...entry, name: target, source: "config-default", configPath: path }, flags);
|
|
109
|
+
}
|
|
110
|
+
throw new AxiError("no Azure DevOps organization configured", "AUTH_REQUIRED", [
|
|
111
|
+
"Run `ado-axi config init --org <org> --project <project>` to create ~/.ado-axi/config.json",
|
|
112
|
+
"Or pass --org <org> [--project <project>] on any command",
|
|
113
|
+
"Or set $ADO_AXI_ORG (and optionally $ADO_AXI_PROJECT)",
|
|
114
|
+
names.length > 0 ? `Known profiles: ${names.join(", ")} (set 'defaultProfile')` : "",
|
|
115
|
+
].filter(Boolean));
|
|
116
|
+
}
|
|
117
|
+
/** An --org / $ADO_AXI_ORG value that names a configured org inherits that profile's auth. */
|
|
118
|
+
function matchProfileByOrg(config, org) {
|
|
119
|
+
const profiles = config?.profiles ?? {};
|
|
120
|
+
const name = Object.keys(profiles).find((key) => profiles[key].org.toLowerCase() === org.toLowerCase());
|
|
121
|
+
if (!name)
|
|
122
|
+
return undefined;
|
|
123
|
+
return { name, profile: profiles[name] };
|
|
124
|
+
}
|
|
125
|
+
function applyOverrides(profile, flags) {
|
|
126
|
+
return {
|
|
127
|
+
...profile,
|
|
128
|
+
org: flags.org ?? profile.org,
|
|
129
|
+
project: flags.project ?? process.env.ADO_AXI_PROJECT ?? profile.project,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** `ADO_<ORG>_PAT` — the conventional per-org PAT env var. */
|
|
133
|
+
export function envPatVarFor(org) {
|
|
134
|
+
const candidates = [
|
|
135
|
+
`ADO_${org.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_PAT`,
|
|
136
|
+
"ADO_AXI_PAT",
|
|
137
|
+
"AZURE_DEVOPS_EXT_PAT",
|
|
138
|
+
];
|
|
139
|
+
return candidates.find((name) => Boolean(process.env[name]));
|
|
140
|
+
}
|
|
141
|
+
export function requireProject(profile, command) {
|
|
142
|
+
if (profile.project)
|
|
143
|
+
return profile.project;
|
|
144
|
+
throw new AxiError(`no project configured for org '${profile.org}'`, "VALIDATION_ERROR", [
|
|
145
|
+
`Pass --project <project> to \`${command}\``,
|
|
146
|
+
"Or set 'project' on the profile in the config file",
|
|
147
|
+
"Run `ado-axi project list` to see available projects",
|
|
148
|
+
]);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ResolvedProfile } from "./config.js";
|
|
2
|
+
import { type ParsedArgs } from "./args.js";
|
|
3
|
+
export declare function profileFromArgs(args: ParsedArgs): ResolvedProfile;
|
|
4
|
+
export declare function subcommandOf(args: ParsedArgs, known: readonly string[], command: string, fallback?: string): string;
|
|
5
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAOjE;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAOR"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { resolveProfile } from "./config.js";
|
|
2
|
+
import { flagString } from "./args.js";
|
|
3
|
+
export function profileFromArgs(args) {
|
|
4
|
+
return resolveProfile({
|
|
5
|
+
profile: flagString(args, "profile"),
|
|
6
|
+
org: flagString(args, "org"),
|
|
7
|
+
project: flagString(args, "project"),
|
|
8
|
+
config: flagString(args, "config"),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function subcommandOf(args, known, command, fallback) {
|
|
12
|
+
const sub = args.positionals[0];
|
|
13
|
+
if (!sub) {
|
|
14
|
+
if (fallback)
|
|
15
|
+
return fallback;
|
|
16
|
+
throw new Error(`missing subcommand for \`${command}\` (expected: ${known.join(" | ")})`);
|
|
17
|
+
}
|
|
18
|
+
return sub;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAExD,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,OAAO,cAAc,CAAC;QACpB,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC;QACpC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC;QACpC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAgB,EAChB,KAAwB,EACxB,OAAe,EACf,QAAiB;IAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const DEFAULT_TRUNCATE = 1200;
|
|
2
|
+
export interface Truncated {
|
|
3
|
+
text: string;
|
|
4
|
+
truncated: boolean;
|
|
5
|
+
total: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function truncate(value: string, limit?: number): Truncated;
|
|
8
|
+
/** Azure DevOps stores work item descriptions and PR bodies as HTML. */
|
|
9
|
+
export declare function htmlToText(html: string): string;
|
|
10
|
+
/** `2025-01-08T14:22:31.123Z` -> `2025-01-08` (or `2025-01-08 14:22` when recent). */
|
|
11
|
+
export declare function shortDate(value: string | undefined): string;
|
|
12
|
+
/** `Jane Doe <jane@example.com>` -> `Jane Doe` */
|
|
13
|
+
export declare function personName(identity: unknown): string;
|
|
14
|
+
export declare function emptyState(noun: string, context: string): string;
|
|
15
|
+
export declare function pickFields<T extends Record<string, unknown>>(rows: T[], fields: string[] | undefined): Array<Record<string, unknown>>;
|
|
16
|
+
export declare function countLine(shown: number, total: number | undefined, noun: string): string;
|
|
17
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAmB,GAAG,SAAS,CAQ3E;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe/C;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAO3D;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,IAAI,EAAE,CAAC,EAAE,EACT,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAC3B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOhC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const DEFAULT_TRUNCATE = 1200;
|
|
2
|
+
export function truncate(value, limit = DEFAULT_TRUNCATE) {
|
|
3
|
+
const total = value.length;
|
|
4
|
+
if (total <= limit)
|
|
5
|
+
return { text: value, truncated: false, total };
|
|
6
|
+
return {
|
|
7
|
+
text: `${value.slice(0, limit)}\n... (truncated, ${total} chars total)`,
|
|
8
|
+
truncated: true,
|
|
9
|
+
total,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Azure DevOps stores work item descriptions and PR bodies as HTML. */
|
|
13
|
+
export function htmlToText(html) {
|
|
14
|
+
return html
|
|
15
|
+
.replace(/<\s*(br|BR)\s*\/?>/g, "\n")
|
|
16
|
+
.replace(/<\/\s*(p|div|li|tr|h[1-6])\s*>/gi, "\n")
|
|
17
|
+
.replace(/<\s*li\s*>/gi, "- ")
|
|
18
|
+
.replace(/<[^>]+>/g, "")
|
|
19
|
+
.replace(/ /g, " ")
|
|
20
|
+
.replace(/&/g, "&")
|
|
21
|
+
.replace(/</g, "<")
|
|
22
|
+
.replace(/>/g, ">")
|
|
23
|
+
.replace(/"/g, '"')
|
|
24
|
+
.replace(/'/g, "'")
|
|
25
|
+
.replace(/\r/g, "")
|
|
26
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
/** `2025-01-08T14:22:31.123Z` -> `2025-01-08` (or `2025-01-08 14:22` when recent). */
|
|
30
|
+
export function shortDate(value) {
|
|
31
|
+
if (!value)
|
|
32
|
+
return "";
|
|
33
|
+
const date = new Date(value);
|
|
34
|
+
if (Number.isNaN(date.getTime()))
|
|
35
|
+
return value;
|
|
36
|
+
const iso = date.toISOString();
|
|
37
|
+
const ageDays = (Date.now() - date.getTime()) / 86_400_000;
|
|
38
|
+
return ageDays < 7 ? `${iso.slice(0, 10)} ${iso.slice(11, 16)}` : iso.slice(0, 10);
|
|
39
|
+
}
|
|
40
|
+
/** `Jane Doe <jane@example.com>` -> `Jane Doe` */
|
|
41
|
+
export function personName(identity) {
|
|
42
|
+
if (!identity || typeof identity !== "object")
|
|
43
|
+
return "";
|
|
44
|
+
const value = identity;
|
|
45
|
+
return value.displayName ?? value.name ?? value.uniqueName ?? "";
|
|
46
|
+
}
|
|
47
|
+
export function emptyState(noun, context) {
|
|
48
|
+
return `0 ${noun} found ${context}`;
|
|
49
|
+
}
|
|
50
|
+
export function pickFields(rows, fields) {
|
|
51
|
+
if (!fields || fields.length === 0)
|
|
52
|
+
return rows;
|
|
53
|
+
return rows.map((row) => {
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const field of fields)
|
|
56
|
+
out[field] = row[field] ?? "";
|
|
57
|
+
return out;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function countLine(shown, total, noun) {
|
|
61
|
+
if (total === undefined || total === shown)
|
|
62
|
+
return `${shown} ${noun}`;
|
|
63
|
+
return `${shown} of ${total} ${noun}`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,MAAM,CAG/E;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKtE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
export function collapseHomeDirectory(path, homeDir = homedir()) {
|
|
3
|
+
if (!path.startsWith(homeDir))
|
|
4
|
+
return path;
|
|
5
|
+
return `~${path.slice(homeDir.length)}`;
|
|
6
|
+
}
|
|
7
|
+
export function homeHeader(description) {
|
|
8
|
+
return {
|
|
9
|
+
bin: collapseHomeDirectory(process.argv[1] ?? ""),
|
|
10
|
+
description,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAO,GAAG,OAAO,EAAE;IACrE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,OAAO;QACL,GAAG,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryPath.d.ts","sourceRoot":"","sources":["../../src/lib/repositoryPath.ts"],"names":[],"mappings":"AAQA,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,SAAW,EACf,YAAY,SAA2B,EACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAgBR"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
function gitBashRoot(env) {
|
|
3
|
+
if (!env.MSYSTEM)
|
|
4
|
+
return undefined;
|
|
5
|
+
const exePath = env.EXEPATH?.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
6
|
+
return exePath ? exePath.replace(/\/(usr\/)?bin$/i, "") : "C:/Program Files/Git";
|
|
7
|
+
}
|
|
8
|
+
export function normalizeRepositoryPath(path, flag = "--file", retryCommand = "ado-axi pr comment ...", env = process.env) {
|
|
9
|
+
if (!/^[a-z]:[\\/]/i.test(path))
|
|
10
|
+
return path;
|
|
11
|
+
const root = gitBashRoot(env);
|
|
12
|
+
const forward = path.replace(/\\/g, "/");
|
|
13
|
+
if (root) {
|
|
14
|
+
const lower = forward.toLowerCase();
|
|
15
|
+
const rootLower = root.toLowerCase();
|
|
16
|
+
if (lower.startsWith(`${rootLower}/`) && !lower.startsWith(`${rootLower}/usr/bin/`)) {
|
|
17
|
+
return forward.slice(root.length);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
throw new AxiError(`${flag} received a Windows path: ${path}`, "VALIDATION_ERROR", [
|
|
21
|
+
"Git Bash may have converted the Azure DevOps repository path",
|
|
22
|
+
`Retry with \`MSYS_NO_PATHCONV=1 ${retryCommand}\``,
|
|
23
|
+
"Repository paths must look like `/src/Project/File.cs`",
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=repositoryPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryPath.js","sourceRoot":"","sources":["../../src/lib/repositoryPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,SAAS,WAAW,CAAC,GAAsB;IACzC,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAI,GAAG,QAAQ,EACf,YAAY,GAAG,wBAAwB,EACvC,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,WAAW,CAAC,EAAE,CAAC;YACpF,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,6BAA6B,IAAI,EAAE,EAAE,kBAAkB,EAAE;QACjF,8DAA8D;QAC9D,mCAAmC,YAAY,IAAI;QACnD,wDAAwD;KACzD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA,wBAAsB,gBAAgB,CACpC,MAAM,GAAE,MAAM,CAAC,cAA8B,GAC5C,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export async function readStdinIfPiped(stream = process.stdin) {
|
|
2
|
+
if (stream.isTTY === true)
|
|
3
|
+
return undefined;
|
|
4
|
+
const chunks = [];
|
|
5
|
+
for await (const chunk of stream) {
|
|
6
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
7
|
+
}
|
|
8
|
+
const buffer = Buffer.concat(chunks);
|
|
9
|
+
return buffer.length === 0 ? undefined : buffer;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAgC,OAAO,CAAC,KAAK;IAE7C,IAAK,MAA4B,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writes.d.ts","sourceRoot":"","sources":["../../src/lib/writes.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAMxD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0BvE"}
|