@knowttl/ado-axi 0.0.0-stage → 0.4.8
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,192 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { encode } from "@toon-format/toon";
|
|
6
|
+
import { AxiError, runAxiCli } from "axi-sdk-js";
|
|
7
|
+
import { normalizeArgv } from "../lib/argv.js";
|
|
8
|
+
import { assertWritesEnabled, isWriteCommand } from "../lib/writes.js";
|
|
9
|
+
import { COMMAND_HELP, DESCRIPTION, TOP_LEVEL_HELP } from "../help.js";
|
|
10
|
+
const USAGE_CODES = new Set([
|
|
11
|
+
"VALIDATION_ERROR",
|
|
12
|
+
"UNKNOWN_FLAG",
|
|
13
|
+
"AUTH_REQUIRED",
|
|
14
|
+
"NOT_FOUND",
|
|
15
|
+
"FORBIDDEN",
|
|
16
|
+
]);
|
|
17
|
+
function readVersion() {
|
|
18
|
+
try {
|
|
19
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const pkg = JSON.parse(readFileSync(join(here, "../../package.json"), "utf8"));
|
|
21
|
+
return typeof pkg.version === "string" ? pkg.version : "0.0.0";
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return "0.0.0";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function formatError(error) {
|
|
28
|
+
if (error instanceof AxiError) {
|
|
29
|
+
const out = { error: error.message, code: error.code };
|
|
30
|
+
if (error.code === "ATTACHMENT_UNLINKED" && "attachment" in error)
|
|
31
|
+
out.attachment = error.attachment;
|
|
32
|
+
if (error.suggestions.length > 0)
|
|
33
|
+
out.help = error.suggestions;
|
|
34
|
+
return { output: `${encode(out)}\n`, exitCode: USAGE_CODES.has(error.code) ? 2 : 1 };
|
|
35
|
+
}
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
return { output: `${encode({ error: message, code: "UNKNOWN" })}\n`, exitCode: 1 };
|
|
38
|
+
}
|
|
39
|
+
const aliases = {
|
|
40
|
+
wi: "work-item",
|
|
41
|
+
workitem: "work-item",
|
|
42
|
+
"work-items": "work-item",
|
|
43
|
+
pipelines: "pipeline",
|
|
44
|
+
repos: "repo",
|
|
45
|
+
refs: "ref",
|
|
46
|
+
projects: "project",
|
|
47
|
+
prs: "pr",
|
|
48
|
+
tests: "test",
|
|
49
|
+
};
|
|
50
|
+
function leadingFlagError(flag) {
|
|
51
|
+
return `${encode({
|
|
52
|
+
error: `\`${flag}\` must come after the command`,
|
|
53
|
+
code: "VALIDATION_ERROR",
|
|
54
|
+
help: [
|
|
55
|
+
`Run \`ado-axi <command> [args] ${flag} <value>\``,
|
|
56
|
+
"Selector flags (--profile, --org, --project, --config) may also come first",
|
|
57
|
+
"Run `ado-axi --help` for the full command surface",
|
|
58
|
+
],
|
|
59
|
+
})}\n`;
|
|
60
|
+
}
|
|
61
|
+
function unknownCommand(command) {
|
|
62
|
+
return `${encode({
|
|
63
|
+
error: `unknown command \`${command}\``,
|
|
64
|
+
code: "VALIDATION_ERROR",
|
|
65
|
+
help: [
|
|
66
|
+
"Commands: work-item | query | area | iteration | pr | pipeline | test | repo | ref | project | security | service-endpoint | variable-group | agent | pool | queue | user | team | api | doctor | config",
|
|
67
|
+
"Run `ado-axi --help` for the full command surface",
|
|
68
|
+
"Run `ado-axi` with no arguments for the dashboard",
|
|
69
|
+
],
|
|
70
|
+
})}\n`;
|
|
71
|
+
}
|
|
72
|
+
async function apiHandler(args) {
|
|
73
|
+
return (await import("../commands/api.js")).apiCommand(args);
|
|
74
|
+
}
|
|
75
|
+
async function configHandler(args) {
|
|
76
|
+
return (await import("../commands/config.js")).configCommand(args);
|
|
77
|
+
}
|
|
78
|
+
async function doctorHandler(args) {
|
|
79
|
+
return (await import("../commands/doctor.js")).doctorCommand(args);
|
|
80
|
+
}
|
|
81
|
+
async function homeHandler(args) {
|
|
82
|
+
return (await import("../commands/home.js")).homeCommand(args);
|
|
83
|
+
}
|
|
84
|
+
async function pipelineHandler(args) {
|
|
85
|
+
return (await import("../commands/pipeline.js")).pipelineCommand(args);
|
|
86
|
+
}
|
|
87
|
+
async function prHandler(args) {
|
|
88
|
+
return (await import("../commands/pr.js")).prCommand(args);
|
|
89
|
+
}
|
|
90
|
+
async function projectHandler(args) {
|
|
91
|
+
return (await import("../commands/repo.js")).projectCommand(args);
|
|
92
|
+
}
|
|
93
|
+
async function repoHandler(args) {
|
|
94
|
+
return (await import("../commands/repo.js")).repoCommand(args);
|
|
95
|
+
}
|
|
96
|
+
async function testHandler(args) {
|
|
97
|
+
return (await import("../commands/test.js")).testCommand(args);
|
|
98
|
+
}
|
|
99
|
+
async function refHandler(args) {
|
|
100
|
+
return (await import("../commands/ref.js")).refCommand(args);
|
|
101
|
+
}
|
|
102
|
+
async function workItemHandler(args) {
|
|
103
|
+
return (await import("../commands/workItem.js")).workItemCommand(args);
|
|
104
|
+
}
|
|
105
|
+
async function queryHandler(args) {
|
|
106
|
+
return (await import("../commands/query.js")).queryCommand(args);
|
|
107
|
+
}
|
|
108
|
+
async function areaHandler(args) {
|
|
109
|
+
return (await import("../commands/classification.js")).classificationCommand("area", args);
|
|
110
|
+
}
|
|
111
|
+
async function iterationHandler(args) {
|
|
112
|
+
return (await import("../commands/classification.js")).classificationCommand("iteration", args);
|
|
113
|
+
}
|
|
114
|
+
async function securityHandler(args) {
|
|
115
|
+
return (await import("../commands/security.js")).securityCommand(args);
|
|
116
|
+
}
|
|
117
|
+
async function serviceEndpointHandler(args) {
|
|
118
|
+
return (await import("../commands/serviceEndpoint.js")).serviceEndpointCommand(args);
|
|
119
|
+
}
|
|
120
|
+
async function variableGroupHandler(args) {
|
|
121
|
+
return (await import("../commands/variableGroup.js")).variableGroupCommand(args);
|
|
122
|
+
}
|
|
123
|
+
async function agentHandler(args) {
|
|
124
|
+
return (await import("../commands/agent.js")).agentCommand(args);
|
|
125
|
+
}
|
|
126
|
+
async function poolHandler(args) {
|
|
127
|
+
return (await import("../commands/pool.js")).poolCommand(args);
|
|
128
|
+
}
|
|
129
|
+
async function queueHandler(args) {
|
|
130
|
+
return (await import("../commands/queue.js")).queueCommand(args);
|
|
131
|
+
}
|
|
132
|
+
async function userHandler(args) {
|
|
133
|
+
return (await import("../commands/user.js")).userCommand(args);
|
|
134
|
+
}
|
|
135
|
+
async function teamHandler(args) {
|
|
136
|
+
return (await import("../commands/team.js")).teamCommand(args);
|
|
137
|
+
}
|
|
138
|
+
const normalized = normalizeArgv(process.argv.slice(2));
|
|
139
|
+
const first = normalized[0];
|
|
140
|
+
if (first !== undefined &&
|
|
141
|
+
first.startsWith("-") &&
|
|
142
|
+
!/^(--help|-v|--version)$/.test(first)) {
|
|
143
|
+
process.stdout.write(leadingFlagError(first));
|
|
144
|
+
process.exit(2);
|
|
145
|
+
}
|
|
146
|
+
await runAxiCli({
|
|
147
|
+
description: DESCRIPTION,
|
|
148
|
+
version: readVersion(),
|
|
149
|
+
argv: normalized,
|
|
150
|
+
topLevelHelp: TOP_LEVEL_HELP,
|
|
151
|
+
getCommandHelp: (command) => COMMAND_HELP[aliases[command] ?? command] ?? null,
|
|
152
|
+
renderUnknownCommand: unknownCommand,
|
|
153
|
+
formatError,
|
|
154
|
+
home: homeHandler,
|
|
155
|
+
commands: Object.fromEntries(Object.entries({
|
|
156
|
+
security: securityHandler,
|
|
157
|
+
"service-endpoint": serviceEndpointHandler,
|
|
158
|
+
"variable-group": variableGroupHandler,
|
|
159
|
+
agent: agentHandler,
|
|
160
|
+
pool: poolHandler,
|
|
161
|
+
queue: queueHandler,
|
|
162
|
+
user: userHandler,
|
|
163
|
+
team: teamHandler,
|
|
164
|
+
home: homeHandler,
|
|
165
|
+
"work-item": workItemHandler,
|
|
166
|
+
wi: workItemHandler,
|
|
167
|
+
workitem: workItemHandler,
|
|
168
|
+
"work-items": workItemHandler,
|
|
169
|
+
query: queryHandler,
|
|
170
|
+
area: areaHandler,
|
|
171
|
+
iteration: iterationHandler,
|
|
172
|
+
pr: prHandler,
|
|
173
|
+
prs: prHandler,
|
|
174
|
+
pipeline: pipelineHandler,
|
|
175
|
+
pipelines: pipelineHandler,
|
|
176
|
+
test: testHandler,
|
|
177
|
+
tests: testHandler,
|
|
178
|
+
repo: repoHandler,
|
|
179
|
+
repos: repoHandler,
|
|
180
|
+
ref: refHandler,
|
|
181
|
+
refs: refHandler,
|
|
182
|
+
project: projectHandler,
|
|
183
|
+
projects: projectHandler,
|
|
184
|
+
api: apiHandler,
|
|
185
|
+
doctor: doctorHandler,
|
|
186
|
+
config: configHandler,
|
|
187
|
+
}).map(([command, handler]) => [command, async (args) => {
|
|
188
|
+
assertWritesEnabled(isWriteCommand(aliases[command] ?? command, args));
|
|
189
|
+
return handler(args);
|
|
190
|
+
}])),
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=ado-axi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-axi.js","sourceRoot":"","sources":["../../src/bin/ado-axi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgG,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGjJ,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBvE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { assertKnownFlags, flagString, parseArgs } from "../lib/args.js";
|
|
3
|
+
import { assertAuditPositionals, auditId, auditLimit, auditList, auditOutput, auditRequest, safeAudit } from "../lib/audit.js";
|
|
4
|
+
import { profileFromArgs } from "../lib/context.js";
|
|
5
|
+
export async function agentCommand(argv) {
|
|
6
|
+
const args = parseArgs(argv);
|
|
7
|
+
const sub = args.positionals.shift() ?? "list";
|
|
8
|
+
if (!["list", "show"].includes(sub))
|
|
9
|
+
throw new AxiError("Use agent list|show --pool <id>", "VALIDATION_ERROR");
|
|
10
|
+
assertKnownFlags(args, sub === "show" ? ["pool", "id", "limit"] : ["pool", "limit"], `agent ${sub}`);
|
|
11
|
+
const limit = auditLimit(args);
|
|
12
|
+
assertAuditPositionals(args, sub === "show" ? 1 : 0);
|
|
13
|
+
const pool = flagString(args, "pool");
|
|
14
|
+
if (!pool)
|
|
15
|
+
throw new AxiError("--pool is required", "VALIDATION_ERROR");
|
|
16
|
+
const profile = profileFromArgs(args);
|
|
17
|
+
const path = `_apis/distributedtask/pools/${encodeURIComponent(pool)}/agents`;
|
|
18
|
+
// Capabilities are arbitrary environment variables and can contain unmarked credentials.
|
|
19
|
+
const query = { includeCapabilities: false };
|
|
20
|
+
if (sub === "show")
|
|
21
|
+
return { agent: safeAudit(await auditRequest(profile, {
|
|
22
|
+
path: `${path}/${auditId(args)}`, query,
|
|
23
|
+
}), args) };
|
|
24
|
+
return auditOutput("agents", await auditList(profile, { path, query }, limit), args, ["id", "name", "status", "enabled"]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AACjJ,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC;IAC/C,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,iCAAiC,EAAE,kBAAkB,CAAC,CAAC;IAC/G,gBAAgB,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;IACrG,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,sBAAsB,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9E,yFAAyF;IACzF,MAAM,KAAK,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC7C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE;gBACxE,IAAI,EAAE,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK;aACxC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IACZ,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5H,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"AAsCA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiIjF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { assertKnownFlags, flagBool, flagNumber, flagString, parseArgs } from "../lib/args.js";
|
|
3
|
+
import { buildUrl, request } from "../lib/client.js";
|
|
4
|
+
import { ADO_HOSTS, normalizeOrg, parseAdoApiUrl } from "../lib/adoUrl.js";
|
|
5
|
+
import { resolveProfile } from "../lib/config.js";
|
|
6
|
+
import { profileFromArgs } from "../lib/context.js";
|
|
7
|
+
import { truncate } from "../lib/format.js";
|
|
8
|
+
import { readStdinIfPiped } from "../lib/stdin.js";
|
|
9
|
+
import { assertWritesEnabled } from "../lib/writes.js";
|
|
10
|
+
const API_FLAGS = [
|
|
11
|
+
"config",
|
|
12
|
+
"method",
|
|
13
|
+
"body",
|
|
14
|
+
"query",
|
|
15
|
+
"api-version",
|
|
16
|
+
"host",
|
|
17
|
+
"no-project",
|
|
18
|
+
"raw",
|
|
19
|
+
"limit",
|
|
20
|
+
"content-type",
|
|
21
|
+
];
|
|
22
|
+
const HOSTS = Object.keys(ADO_HOSTS);
|
|
23
|
+
const CONTENT_TYPES = {
|
|
24
|
+
json: "application/json",
|
|
25
|
+
"json-patch": "application/json-patch+json",
|
|
26
|
+
"merge-patch": "application/merge-patch+json",
|
|
27
|
+
text: "text/plain",
|
|
28
|
+
};
|
|
29
|
+
function assertUrlMatch(flag, value, expected) {
|
|
30
|
+
if (value !== undefined && value.toLowerCase() !== expected?.toLowerCase()) {
|
|
31
|
+
throw new AxiError(`--${flag} conflicts with the API URL`, "VALIDATION_ERROR", [
|
|
32
|
+
`Remove --${flag} or use a URL with matching context; URL context is never silently overridden`,
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function apiCommand(argv) {
|
|
37
|
+
const args = parseArgs(argv);
|
|
38
|
+
assertKnownFlags(args, API_FLAGS, "api");
|
|
39
|
+
let method = flagString(args, "method")?.toUpperCase();
|
|
40
|
+
let path = args.positionals[0];
|
|
41
|
+
if (path && /^(GET|POST|PATCH|PUT|DELETE)$/i.test(path)) {
|
|
42
|
+
method = path.toUpperCase();
|
|
43
|
+
path = args.positionals[1];
|
|
44
|
+
}
|
|
45
|
+
if (!path) {
|
|
46
|
+
throw new AxiError("an API path is required", "VALIDATION_ERROR", [
|
|
47
|
+
"Usage: ado-axi api [GET|POST|PATCH|PUT|DELETE] <path|url> [--body '<json>'] [--query 'k=v&k2=v2']",
|
|
48
|
+
"Example: ado-axi api _apis/wiki/wikis",
|
|
49
|
+
"Example: ado-axi api POST _apis/wit/wiql --body '{\"query\":\"SELECT [System.Id] FROM WorkItems\"}'",
|
|
50
|
+
"Use a relative path (--no-project for org-level paths) or a full HTTPS Azure DevOps REST URL",
|
|
51
|
+
`Work item writes need JSON-Patch: --content-type json-patch --body '[{"op":"add","path":"/fields/System.State","value":"Active"}]'`,
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
const apiUrl = parseAdoApiUrl(path);
|
|
55
|
+
const host = (flagString(args, "host") ?? apiUrl?.host ?? "dev");
|
|
56
|
+
if (!HOSTS.includes(host)) {
|
|
57
|
+
throw new AxiError(`unknown --host '${host}'`, "VALIDATION_ERROR", [
|
|
58
|
+
`Valid hosts: ${HOSTS.join(", ")}`,
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
if (apiUrl) {
|
|
62
|
+
const org = flagString(args, "org");
|
|
63
|
+
assertUrlMatch("org", org === undefined ? undefined : normalizeOrg(org), apiUrl.org);
|
|
64
|
+
assertUrlMatch("project", flagString(args, "project"), apiUrl.project);
|
|
65
|
+
assertUrlMatch("host", flagString(args, "host"), apiUrl.host);
|
|
66
|
+
if (flagBool(args, "no-project") && apiUrl.project !== undefined) {
|
|
67
|
+
throw new AxiError("--no-project conflicts with the project in the API URL", "VALIDATION_ERROR", [
|
|
68
|
+
"Remove --no-project or use an organization-level API URL",
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
path = apiUrl.path;
|
|
72
|
+
}
|
|
73
|
+
const profile = apiUrl
|
|
74
|
+
? resolveProfile({
|
|
75
|
+
config: flagString(args, "config"),
|
|
76
|
+
profile: flagString(args, "profile"),
|
|
77
|
+
org: flagString(args, "profile") ? undefined : apiUrl.org,
|
|
78
|
+
project: apiUrl.project,
|
|
79
|
+
})
|
|
80
|
+
: profileFromArgs(args);
|
|
81
|
+
if (apiUrl) {
|
|
82
|
+
assertUrlMatch("profile", profile.org, apiUrl.org);
|
|
83
|
+
profile.project = apiUrl.project;
|
|
84
|
+
}
|
|
85
|
+
const query = Object.assign(Object.create(null), apiUrl?.query);
|
|
86
|
+
const setQuery = (key, value, flag) => {
|
|
87
|
+
if (apiUrl && Object.hasOwn(apiUrl.query, key) && apiUrl.query[key] !== value) {
|
|
88
|
+
throw new AxiError(`--${flag} conflicts with '${key}' in the API URL`, "VALIDATION_ERROR", [
|
|
89
|
+
`Remove --${flag} or update the URL query to match`,
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
query[key] = value;
|
|
93
|
+
};
|
|
94
|
+
const rawQuery = flagString(args, "query");
|
|
95
|
+
if (rawQuery) {
|
|
96
|
+
for (const [key, value] of new URLSearchParams(rawQuery))
|
|
97
|
+
setQuery(key, value, "query");
|
|
98
|
+
}
|
|
99
|
+
const limit = flagNumber(args, "limit");
|
|
100
|
+
if (limit !== undefined)
|
|
101
|
+
setQuery("$top", String(limit), "limit");
|
|
102
|
+
const apiVersion = flagString(args, "api-version");
|
|
103
|
+
if (apiUrl && apiVersion !== undefined)
|
|
104
|
+
setQuery("api-version", apiVersion, "api-version");
|
|
105
|
+
let body;
|
|
106
|
+
const rawBody = flagString(args, "body");
|
|
107
|
+
const stdinBody = rawBody === undefined ? await readStdinIfPiped() : undefined;
|
|
108
|
+
if (rawBody !== undefined) {
|
|
109
|
+
try {
|
|
110
|
+
body = JSON.parse(rawBody);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new AxiError("--body expects valid JSON", "VALIDATION_ERROR", [
|
|
114
|
+
`Example: --body '{"query":"SELECT [System.Id] FROM WorkItems"}'`,
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (stdinBody !== undefined) {
|
|
119
|
+
body = stdinBody;
|
|
120
|
+
}
|
|
121
|
+
let contentType;
|
|
122
|
+
const rawContentType = flagString(args, "content-type");
|
|
123
|
+
if (rawContentType) {
|
|
124
|
+
contentType = CONTENT_TYPES[rawContentType] ?? rawContentType;
|
|
125
|
+
if (!contentType.includes("/")) {
|
|
126
|
+
throw new AxiError(`unknown --content-type '${rawContentType}'`, "VALIDATION_ERROR", [
|
|
127
|
+
`Shorthands: ${Object.keys(CONTENT_TYPES).join(", ")} — or pass a full media type`,
|
|
128
|
+
]);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const options = {
|
|
132
|
+
method: method ?? (body !== undefined ? "POST" : "GET"),
|
|
133
|
+
path,
|
|
134
|
+
project: flagBool(args, "no-project") ? undefined : profile.project,
|
|
135
|
+
query,
|
|
136
|
+
body,
|
|
137
|
+
apiVersion,
|
|
138
|
+
contentType,
|
|
139
|
+
host,
|
|
140
|
+
raw: flagBool(args, "raw"),
|
|
141
|
+
};
|
|
142
|
+
assertWritesEnabled(!["GET", "HEAD", "OPTIONS"].includes(options.method));
|
|
143
|
+
const url = buildUrl(profile, options);
|
|
144
|
+
const result = await request(profile, options);
|
|
145
|
+
if (typeof result === "string") {
|
|
146
|
+
const text = truncate(result, flagBool(args, "full") ? Number.MAX_SAFE_INTEGER : 4000);
|
|
147
|
+
return { request: { method: options.method, url }, response: text.text };
|
|
148
|
+
}
|
|
149
|
+
const payload = result;
|
|
150
|
+
const out = { request: { method: options.method, url } };
|
|
151
|
+
if (payload && typeof payload === "object" && Array.isArray(payload.value)) {
|
|
152
|
+
const value = payload.value;
|
|
153
|
+
out.count = payload.count ?? value.length;
|
|
154
|
+
out.value = value;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
out.response = payload ?? "(empty response, the request succeeded)";
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../../src/commands/classification.ts"],"names":[],"mappings":"AAeA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0CxH"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { assertKnownFlags, flagBool, flagList, flagNumber, parseArgs } from "../lib/args.js";
|
|
3
|
+
import { request } from "../lib/client.js";
|
|
4
|
+
import { requireProject } from "../lib/config.js";
|
|
5
|
+
import { profileFromArgs } from "../lib/context.js";
|
|
6
|
+
import { countLine, pickFields } from "../lib/format.js";
|
|
7
|
+
export async function classificationCommand(kind, argv) {
|
|
8
|
+
const args = parseArgs(argv);
|
|
9
|
+
assertKnownFlags(args, ["limit", "depth"], `${kind} list`);
|
|
10
|
+
if ((args.positionals[0] ?? "list") !== "list" || args.positionals.length > 1) {
|
|
11
|
+
throw new AxiError(`Usage: ado-axi ${kind} list [--depth 10] [--limit 50] [--full]`, "VALIDATION_ERROR");
|
|
12
|
+
}
|
|
13
|
+
const limit = flagNumber(args, "limit") ?? 50;
|
|
14
|
+
const depth = flagNumber(args, "depth") ?? 10;
|
|
15
|
+
if (!Number.isInteger(limit) || limit < 1 || !Number.isInteger(depth) || depth < 0) {
|
|
16
|
+
throw new AxiError("--limit must be a positive integer and --depth a nonnegative integer", "VALIDATION_ERROR");
|
|
17
|
+
}
|
|
18
|
+
const profile = profileFromArgs(args);
|
|
19
|
+
const project = requireProject(profile, `${kind} list`);
|
|
20
|
+
const root = await request(profile, {
|
|
21
|
+
path: `_apis/wit/classificationnodes/${kind === "area" ? "areas" : "iterations"}`,
|
|
22
|
+
project,
|
|
23
|
+
query: { $depth: depth },
|
|
24
|
+
});
|
|
25
|
+
const rows = [];
|
|
26
|
+
let deeper = false;
|
|
27
|
+
function visit(node, parent) {
|
|
28
|
+
const path = parent ? `${parent}\\${node.name}` : node.name;
|
|
29
|
+
rows.push({ id: node.id, path, ...(kind === "iteration" ? {
|
|
30
|
+
start: node.attributes?.startDate?.slice(0, 10) ?? "",
|
|
31
|
+
finish: node.attributes?.finishDate?.slice(0, 10) ?? "",
|
|
32
|
+
} : {}) });
|
|
33
|
+
if (node.hasChildren && !node.children?.length)
|
|
34
|
+
deeper = true;
|
|
35
|
+
for (const child of node.children ?? [])
|
|
36
|
+
visit(child, path);
|
|
37
|
+
}
|
|
38
|
+
visit(root, "");
|
|
39
|
+
const shown = flagBool(args, "full") ? rows : rows.slice(0, limit);
|
|
40
|
+
const help = [];
|
|
41
|
+
if (shown.length < rows.length)
|
|
42
|
+
help.push(`Run \`ado-axi ${kind} list --depth ${depth} --full\` for all paths at this depth`);
|
|
43
|
+
if (deeper)
|
|
44
|
+
help.push(`Run \`ado-axi ${kind} list --depth ${depth + 1}\` to include deeper paths`);
|
|
45
|
+
return {
|
|
46
|
+
project,
|
|
47
|
+
depth,
|
|
48
|
+
count: `${countLine(shown.length, rows.length, `${kind} paths`)} within requested depth`,
|
|
49
|
+
[`${kind}s`]: pickFields(shown, flagList(args, "fields")),
|
|
50
|
+
"left-out": rows.length - shown.length,
|
|
51
|
+
...(help.length ? { help } : {}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification.js","sourceRoot":"","sources":["../../src/commands/classification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAgBA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBpF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { assertKnownFlags, flagBool, flagString, parseArgs } from "../lib/args.js";
|
|
3
|
+
import { configPath, envPatVarFor, loadConfig, saveConfig, } from "../lib/config.js";
|
|
4
|
+
import { collapseHomeDirectory } from "../lib/paths.js";
|
|
5
|
+
import { normalizeOrg } from "../lib/adoUrl.js";
|
|
6
|
+
const INIT_FLAGS = ["name", "auth", "pat-env", "tenant", "default", "config"];
|
|
7
|
+
const LIST_FLAGS = ["config"];
|
|
8
|
+
export async function configCommand(argv) {
|
|
9
|
+
const args = parseArgs(argv);
|
|
10
|
+
const sub = args.positionals[0] ?? "list";
|
|
11
|
+
const rest = { ...args, positionals: args.positionals.slice(1) };
|
|
12
|
+
switch (sub) {
|
|
13
|
+
case "list":
|
|
14
|
+
case "show":
|
|
15
|
+
return listProfiles(rest);
|
|
16
|
+
case "init":
|
|
17
|
+
case "add":
|
|
18
|
+
return initProfile(rest);
|
|
19
|
+
case "path":
|
|
20
|
+
return { config: collapseHomeDirectory(configPath(flagString(rest, "config"))) };
|
|
21
|
+
default:
|
|
22
|
+
throw new AxiError(`unknown subcommand \`config ${sub}\``, "VALIDATION_ERROR", [
|
|
23
|
+
"Subcommands: list | init | path",
|
|
24
|
+
"Run `ado-axi config --help` for the full reference",
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function listProfiles(args) {
|
|
29
|
+
assertKnownFlags(args, LIST_FLAGS, "config list");
|
|
30
|
+
const { path, config } = loadConfig(flagString(args, "config"));
|
|
31
|
+
const profiles = config?.profiles ?? {};
|
|
32
|
+
const names = Object.keys(profiles);
|
|
33
|
+
if (names.length === 0) {
|
|
34
|
+
return {
|
|
35
|
+
profiles: `0 profiles configured (no config file at ${collapseHomeDirectory(path)})`,
|
|
36
|
+
help: [
|
|
37
|
+
"Run `ado-axi config init --org <org> --project <project>` to create one",
|
|
38
|
+
"Or pass --org/--project on each command, or set $ADO_AXI_ORG",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
config: collapseHomeDirectory(path),
|
|
44
|
+
default: config?.defaultProfile ?? (names.length === 1 ? names[0] : "(none)"),
|
|
45
|
+
profiles: names.map((name) => {
|
|
46
|
+
const entry = profiles[name];
|
|
47
|
+
return {
|
|
48
|
+
name,
|
|
49
|
+
org: entry.org,
|
|
50
|
+
project: entry.project ?? "",
|
|
51
|
+
auth: entry.auth,
|
|
52
|
+
secret: entry.auth === "pat" ? `$${entry.patEnv ?? "ADO_AXI_PAT"}` : "az login",
|
|
53
|
+
};
|
|
54
|
+
}),
|
|
55
|
+
help: [
|
|
56
|
+
"Run `ado-axi --profile <name>` to use a specific profile",
|
|
57
|
+
"Run `ado-axi doctor` to verify authentication for every profile",
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function initProfile(args) {
|
|
62
|
+
assertKnownFlags(args, INIT_FLAGS, "config init");
|
|
63
|
+
const rawOrg = flagString(args, "org");
|
|
64
|
+
if (!rawOrg) {
|
|
65
|
+
throw new AxiError("--org is required", "VALIDATION_ERROR", [
|
|
66
|
+
"Usage: ado-axi config init --org <org> [--project <project>] [--name <profile>] [--auth az|pat] [--pat-env <VAR>]",
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
const org = normalizeOrg(rawOrg);
|
|
70
|
+
const auth = (flagString(args, "auth") ?? (envPatVarFor(org) ? "pat" : "az"));
|
|
71
|
+
if (auth !== "az" && auth !== "pat") {
|
|
72
|
+
throw new AxiError(`unknown --auth '${auth}'`, "VALIDATION_ERROR", ["Valid values: az | pat"]);
|
|
73
|
+
}
|
|
74
|
+
const name = flagString(args, "name") ?? org.toLowerCase();
|
|
75
|
+
const explicit = flagString(args, "config");
|
|
76
|
+
const { path, config } = loadConfig(explicit);
|
|
77
|
+
const next = config ?? { profiles: {} };
|
|
78
|
+
next.profiles[name] = {
|
|
79
|
+
org,
|
|
80
|
+
auth,
|
|
81
|
+
tenant: flagString(args, "tenant"),
|
|
82
|
+
project: flagString(args, "project"),
|
|
83
|
+
patEnv: auth === "pat"
|
|
84
|
+
? (flagString(args, "pat-env") ??
|
|
85
|
+
envPatVarFor(org) ??
|
|
86
|
+
`ADO_${org.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_PAT`)
|
|
87
|
+
: undefined,
|
|
88
|
+
};
|
|
89
|
+
if (!next.defaultProfile || flagBool(args, "default")) {
|
|
90
|
+
next.defaultProfile = name;
|
|
91
|
+
}
|
|
92
|
+
const written = saveConfig(next, explicit);
|
|
93
|
+
return {
|
|
94
|
+
saved: {
|
|
95
|
+
config: collapseHomeDirectory(written),
|
|
96
|
+
profile: name,
|
|
97
|
+
org,
|
|
98
|
+
project: flagString(args, "project") ?? "",
|
|
99
|
+
auth,
|
|
100
|
+
default: next.defaultProfile === name,
|
|
101
|
+
},
|
|
102
|
+
help: [
|
|
103
|
+
"Run `ado-axi doctor` to verify authentication",
|
|
104
|
+
"Run `ado-axi` to see the dashboard for this profile",
|
|
105
|
+
path === written ? "" : `Previous config path: ${collapseHomeDirectory(path)}`,
|
|
106
|
+
].filter(Boolean),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BpF"}
|