@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.
Files changed (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -2
  3. package/SKILL.md +334 -0
  4. package/assets/ado-axi-header.png +0 -0
  5. package/dist/bin/ado-axi.d.ts +3 -0
  6. package/dist/bin/ado-axi.d.ts.map +1 -0
  7. package/dist/bin/ado-axi.js +192 -0
  8. package/dist/bin/ado-axi.js.map +1 -0
  9. package/dist/commands/agent.d.ts +3 -0
  10. package/dist/commands/agent.d.ts.map +1 -0
  11. package/dist/commands/agent.js +26 -0
  12. package/dist/commands/agent.js.map +1 -0
  13. package/dist/commands/api.d.ts +2 -0
  14. package/dist/commands/api.d.ts.map +1 -0
  15. package/dist/commands/api.js +161 -0
  16. package/dist/commands/api.js.map +1 -0
  17. package/dist/commands/classification.d.ts +2 -0
  18. package/dist/commands/classification.d.ts.map +1 -0
  19. package/dist/commands/classification.js +54 -0
  20. package/dist/commands/classification.js.map +1 -0
  21. package/dist/commands/config.d.ts +2 -0
  22. package/dist/commands/config.d.ts.map +1 -0
  23. package/dist/commands/config.js +109 -0
  24. package/dist/commands/config.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +2 -0
  26. package/dist/commands/doctor.d.ts.map +1 -0
  27. package/dist/commands/doctor.js +67 -0
  28. package/dist/commands/doctor.js.map +1 -0
  29. package/dist/commands/home.d.ts +2 -0
  30. package/dist/commands/home.d.ts.map +1 -0
  31. package/dist/commands/home.js +132 -0
  32. package/dist/commands/home.js.map +1 -0
  33. package/dist/commands/pipeline.d.ts +2 -0
  34. package/dist/commands/pipeline.d.ts.map +1 -0
  35. package/dist/commands/pipeline.js +572 -0
  36. package/dist/commands/pipeline.js.map +1 -0
  37. package/dist/commands/pipelineAdmin.d.ts +3 -0
  38. package/dist/commands/pipelineAdmin.d.ts.map +1 -0
  39. package/dist/commands/pipelineAdmin.js +152 -0
  40. package/dist/commands/pipelineAdmin.js.map +1 -0
  41. package/dist/commands/pipelineArtifact.d.ts +3 -0
  42. package/dist/commands/pipelineArtifact.d.ts.map +1 -0
  43. package/dist/commands/pipelineArtifact.js +68 -0
  44. package/dist/commands/pipelineArtifact.js.map +1 -0
  45. package/dist/commands/policy.d.ts +3 -0
  46. package/dist/commands/policy.d.ts.map +1 -0
  47. package/dist/commands/policy.js +31 -0
  48. package/dist/commands/policy.js.map +1 -0
  49. package/dist/commands/pool.d.ts +3 -0
  50. package/dist/commands/pool.d.ts.map +1 -0
  51. package/dist/commands/pool.js +19 -0
  52. package/dist/commands/pool.js.map +1 -0
  53. package/dist/commands/pr.d.ts +9 -0
  54. package/dist/commands/pr.d.ts.map +1 -0
  55. package/dist/commands/pr.js +1028 -0
  56. package/dist/commands/pr.js.map +1 -0
  57. package/dist/commands/query.d.ts +2 -0
  58. package/dist/commands/query.d.ts.map +1 -0
  59. package/dist/commands/query.js +29 -0
  60. package/dist/commands/query.js.map +1 -0
  61. package/dist/commands/queue.d.ts +3 -0
  62. package/dist/commands/queue.d.ts.map +1 -0
  63. package/dist/commands/queue.js +21 -0
  64. package/dist/commands/queue.js.map +1 -0
  65. package/dist/commands/ref.d.ts +3 -0
  66. package/dist/commands/ref.d.ts.map +1 -0
  67. package/dist/commands/ref.js +204 -0
  68. package/dist/commands/ref.js.map +1 -0
  69. package/dist/commands/release.d.ts +3 -0
  70. package/dist/commands/release.d.ts.map +1 -0
  71. package/dist/commands/release.js +91 -0
  72. package/dist/commands/release.js.map +1 -0
  73. package/dist/commands/repo.d.ts +3 -0
  74. package/dist/commands/repo.d.ts.map +1 -0
  75. package/dist/commands/repo.js +261 -0
  76. package/dist/commands/repo.js.map +1 -0
  77. package/dist/commands/repoAdmin.d.ts +3 -0
  78. package/dist/commands/repoAdmin.d.ts.map +1 -0
  79. package/dist/commands/repoAdmin.js +195 -0
  80. package/dist/commands/repoAdmin.js.map +1 -0
  81. package/dist/commands/security.d.ts +3 -0
  82. package/dist/commands/security.d.ts.map +1 -0
  83. package/dist/commands/security.js +57 -0
  84. package/dist/commands/security.js.map +1 -0
  85. package/dist/commands/serviceEndpoint.d.ts +3 -0
  86. package/dist/commands/serviceEndpoint.d.ts.map +1 -0
  87. package/dist/commands/serviceEndpoint.js +29 -0
  88. package/dist/commands/serviceEndpoint.js.map +1 -0
  89. package/dist/commands/team.d.ts +3 -0
  90. package/dist/commands/team.d.ts.map +1 -0
  91. package/dist/commands/team.js +33 -0
  92. package/dist/commands/team.js.map +1 -0
  93. package/dist/commands/test.d.ts +2 -0
  94. package/dist/commands/test.d.ts.map +1 -0
  95. package/dist/commands/test.js +183 -0
  96. package/dist/commands/test.js.map +1 -0
  97. package/dist/commands/user.d.ts +3 -0
  98. package/dist/commands/user.d.ts.map +1 -0
  99. package/dist/commands/user.js +20 -0
  100. package/dist/commands/user.js.map +1 -0
  101. package/dist/commands/variableGroup.d.ts +3 -0
  102. package/dist/commands/variableGroup.d.ts.map +1 -0
  103. package/dist/commands/variableGroup.js +23 -0
  104. package/dist/commands/variableGroup.js.map +1 -0
  105. package/dist/commands/workItem.d.ts +12 -0
  106. package/dist/commands/workItem.d.ts.map +1 -0
  107. package/dist/commands/workItem.js +940 -0
  108. package/dist/commands/workItem.js.map +1 -0
  109. package/dist/commands/workItemAttachment.d.ts +3 -0
  110. package/dist/commands/workItemAttachment.d.ts.map +1 -0
  111. package/dist/commands/workItemAttachment.js +136 -0
  112. package/dist/commands/workItemAttachment.js.map +1 -0
  113. package/dist/help.d.ts +4 -0
  114. package/dist/help.d.ts.map +1 -0
  115. package/dist/help.js +383 -0
  116. package/dist/help.js.map +1 -0
  117. package/dist/lib/adoUrl.d.ts +19 -0
  118. package/dist/lib/adoUrl.d.ts.map +1 -0
  119. package/dist/lib/adoUrl.js +104 -0
  120. package/dist/lib/adoUrl.js.map +1 -0
  121. package/dist/lib/args.d.ts +14 -0
  122. package/dist/lib/args.d.ts.map +1 -0
  123. package/dist/lib/args.js +94 -0
  124. package/dist/lib/args.js.map +1 -0
  125. package/dist/lib/argv.d.ts +8 -0
  126. package/dist/lib/argv.d.ts.map +1 -0
  127. package/dist/lib/argv.js +35 -0
  128. package/dist/lib/argv.js.map +1 -0
  129. package/dist/lib/audit.d.ts +21 -0
  130. package/dist/lib/audit.d.ts.map +1 -0
  131. package/dist/lib/audit.js +128 -0
  132. package/dist/lib/audit.js.map +1 -0
  133. package/dist/lib/auth.d.ts +8 -0
  134. package/dist/lib/auth.d.ts.map +1 -0
  135. package/dist/lib/auth.js +127 -0
  136. package/dist/lib/auth.js.map +1 -0
  137. package/dist/lib/client.d.ts +32 -0
  138. package/dist/lib/client.d.ts.map +1 -0
  139. package/dist/lib/client.js +181 -0
  140. package/dist/lib/client.js.map +1 -0
  141. package/dist/lib/config.d.ts +39 -0
  142. package/dist/lib/config.d.ts.map +1 -0
  143. package/dist/lib/config.js +150 -0
  144. package/dist/lib/config.js.map +1 -0
  145. package/dist/lib/context.d.ts +5 -0
  146. package/dist/lib/context.d.ts.map +1 -0
  147. package/dist/lib/context.js +20 -0
  148. package/dist/lib/context.js.map +1 -0
  149. package/dist/lib/format.d.ts +17 -0
  150. package/dist/lib/format.d.ts.map +1 -0
  151. package/dist/lib/format.js +65 -0
  152. package/dist/lib/format.js.map +1 -0
  153. package/dist/lib/paths.d.ts +3 -0
  154. package/dist/lib/paths.d.ts.map +1 -0
  155. package/dist/lib/paths.js +13 -0
  156. package/dist/lib/paths.js.map +1 -0
  157. package/dist/lib/repositoryPath.d.ts +2 -0
  158. package/dist/lib/repositoryPath.d.ts.map +1 -0
  159. package/dist/lib/repositoryPath.js +26 -0
  160. package/dist/lib/repositoryPath.js.map +1 -0
  161. package/dist/lib/stdin.d.ts +2 -0
  162. package/dist/lib/stdin.d.ts.map +1 -0
  163. package/dist/lib/stdin.js +11 -0
  164. package/dist/lib/stdin.js.map +1 -0
  165. package/dist/lib/writes.d.ts +3 -0
  166. package/dist/lib/writes.d.ts.map +1 -0
  167. package/dist/lib/writes.js +37 -0
  168. package/dist/lib/writes.js.map +1 -0
  169. 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,3 @@
1
+ import { type AuditRecord } from "../lib/audit.js";
2
+ export declare function agentCommand(argv: string[]): Promise<AuditRecord>;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -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,2 @@
1
+ export declare function apiCommand(argv: string[]): Promise<Record<string, unknown>>;
2
+ //# sourceMappingURL=api.d.ts.map
@@ -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,2 @@
1
+ export declare function classificationCommand(kind: "area" | "iteration", argv: string[]): Promise<Record<string, unknown>>;
2
+ //# sourceMappingURL=classification.d.ts.map
@@ -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,2 @@
1
+ export declare function configCommand(argv: string[]): Promise<Record<string, unknown>>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -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,2 @@
1
+ export declare function doctorCommand(argv: string[]): Promise<Record<string, unknown>>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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"}