pax8-cta 0.1.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.
Files changed (224) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +659 -0
  3. package/demo-data/solutions/ProductQADemo_1_0_0_2_managed.zip +0 -0
  4. package/dist/commands/analyze.d.ts +28 -0
  5. package/dist/commands/analyze.d.ts.map +1 -0
  6. package/dist/commands/analyze.js +571 -0
  7. package/dist/commands/analyze.js.map +1 -0
  8. package/dist/commands/auth.d.ts +18 -0
  9. package/dist/commands/auth.d.ts.map +1 -0
  10. package/dist/commands/auth.js +171 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/config.d.ts +34 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +299 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/demo.d.ts +33 -0
  17. package/dist/commands/demo.d.ts.map +1 -0
  18. package/dist/commands/demo.js +362 -0
  19. package/dist/commands/demo.js.map +1 -0
  20. package/dist/commands/deploy.d.ts +18 -0
  21. package/dist/commands/deploy.d.ts.map +1 -0
  22. package/dist/commands/deploy.js +1186 -0
  23. package/dist/commands/deploy.js.map +1 -0
  24. package/dist/commands/deployments/helpers.d.ts +68 -0
  25. package/dist/commands/deployments/helpers.d.ts.map +1 -0
  26. package/dist/commands/deployments/helpers.js +414 -0
  27. package/dist/commands/deployments/helpers.js.map +1 -0
  28. package/dist/commands/deployments/index.d.ts +24 -0
  29. package/dist/commands/deployments/index.d.ts.map +1 -0
  30. package/dist/commands/deployments/index.js +47 -0
  31. package/dist/commands/deployments/index.js.map +1 -0
  32. package/dist/commands/deployments/list.d.ts +18 -0
  33. package/dist/commands/deployments/list.d.ts.map +1 -0
  34. package/dist/commands/deployments/list.js +97 -0
  35. package/dist/commands/deployments/list.js.map +1 -0
  36. package/dist/commands/deployments/show.d.ts +18 -0
  37. package/dist/commands/deployments/show.d.ts.map +1 -0
  38. package/dist/commands/deployments/show.js +81 -0
  39. package/dist/commands/deployments/show.js.map +1 -0
  40. package/dist/commands/deployments/undo.d.ts +18 -0
  41. package/dist/commands/deployments/undo.d.ts.map +1 -0
  42. package/dist/commands/deployments/undo.js +295 -0
  43. package/dist/commands/deployments/undo.js.map +1 -0
  44. package/dist/commands/export.d.ts +18 -0
  45. package/dist/commands/export.d.ts.map +1 -0
  46. package/dist/commands/export.js +133 -0
  47. package/dist/commands/export.js.map +1 -0
  48. package/dist/commands/import.d.ts +18 -0
  49. package/dist/commands/import.d.ts.map +1 -0
  50. package/dist/commands/import.js +129 -0
  51. package/dist/commands/import.js.map +1 -0
  52. package/dist/commands/init-config.d.ts +26 -0
  53. package/dist/commands/init-config.d.ts.map +1 -0
  54. package/dist/commands/init-config.js +123 -0
  55. package/dist/commands/init-config.js.map +1 -0
  56. package/dist/commands/init-validation.d.ts +47 -0
  57. package/dist/commands/init-validation.d.ts.map +1 -0
  58. package/dist/commands/init-validation.js +339 -0
  59. package/dist/commands/init-validation.js.map +1 -0
  60. package/dist/commands/init-wizard.d.ts +25 -0
  61. package/dist/commands/init-wizard.d.ts.map +1 -0
  62. package/dist/commands/init-wizard.js +433 -0
  63. package/dist/commands/init-wizard.js.map +1 -0
  64. package/dist/commands/init.d.ts +18 -0
  65. package/dist/commands/init.d.ts.map +1 -0
  66. package/dist/commands/init.js +46 -0
  67. package/dist/commands/init.js.map +1 -0
  68. package/dist/commands/resolve-url.d.ts +18 -0
  69. package/dist/commands/resolve-url.d.ts.map +1 -0
  70. package/dist/commands/resolve-url.js +126 -0
  71. package/dist/commands/resolve-url.js.map +1 -0
  72. package/dist/commands/setup.d.ts +18 -0
  73. package/dist/commands/setup.d.ts.map +1 -0
  74. package/dist/commands/setup.js +239 -0
  75. package/dist/commands/setup.js.map +1 -0
  76. package/dist/commands/solutions/drift-analysis.d.ts +73 -0
  77. package/dist/commands/solutions/drift-analysis.d.ts.map +1 -0
  78. package/dist/commands/solutions/drift-analysis.js +416 -0
  79. package/dist/commands/solutions/drift-analysis.js.map +1 -0
  80. package/dist/commands/solutions/drift.d.ts +32 -0
  81. package/dist/commands/solutions/drift.d.ts.map +1 -0
  82. package/dist/commands/solutions/drift.js +641 -0
  83. package/dist/commands/solutions/drift.js.map +1 -0
  84. package/dist/commands/solutions/fix-planner.d.ts +48 -0
  85. package/dist/commands/solutions/fix-planner.d.ts.map +1 -0
  86. package/dist/commands/solutions/fix-planner.js +43 -0
  87. package/dist/commands/solutions/fix-planner.js.map +1 -0
  88. package/dist/commands/solutions/helpers.d.ts +35 -0
  89. package/dist/commands/solutions/helpers.d.ts.map +1 -0
  90. package/dist/commands/solutions/helpers.js +54 -0
  91. package/dist/commands/solutions/helpers.js.map +1 -0
  92. package/dist/commands/solutions/index.d.ts +18 -0
  93. package/dist/commands/solutions/index.d.ts.map +1 -0
  94. package/dist/commands/solutions/index.js +30 -0
  95. package/dist/commands/solutions/index.js.map +1 -0
  96. package/dist/commands/solutions/list.d.ts +18 -0
  97. package/dist/commands/solutions/list.d.ts.map +1 -0
  98. package/dist/commands/solutions/list.js +174 -0
  99. package/dist/commands/solutions/list.js.map +1 -0
  100. package/dist/commands/solutions/remove.d.ts +18 -0
  101. package/dist/commands/solutions/remove.d.ts.map +1 -0
  102. package/dist/commands/solutions/remove.js +137 -0
  103. package/dist/commands/solutions/remove.js.map +1 -0
  104. package/dist/commands/solutions/risk-calculator.d.ts +33 -0
  105. package/dist/commands/solutions/risk-calculator.d.ts.map +1 -0
  106. package/dist/commands/solutions/risk-calculator.js +79 -0
  107. package/dist/commands/solutions/risk-calculator.js.map +1 -0
  108. package/dist/commands/solutions/show.d.ts +18 -0
  109. package/dist/commands/solutions/show.d.ts.map +1 -0
  110. package/dist/commands/solutions/show.js +165 -0
  111. package/dist/commands/solutions/show.js.map +1 -0
  112. package/dist/commands/status.d.ts +18 -0
  113. package/dist/commands/status.d.ts.map +1 -0
  114. package/dist/commands/status.js +573 -0
  115. package/dist/commands/status.js.map +1 -0
  116. package/dist/commands/telemetry.d.ts +18 -0
  117. package/dist/commands/telemetry.d.ts.map +1 -0
  118. package/dist/commands/telemetry.js +85 -0
  119. package/dist/commands/telemetry.js.map +1 -0
  120. package/dist/commands/tenants/health.d.ts +18 -0
  121. package/dist/commands/tenants/health.d.ts.map +1 -0
  122. package/dist/commands/tenants/health.js +172 -0
  123. package/dist/commands/tenants/health.js.map +1 -0
  124. package/dist/commands/tenants/helpers.d.ts +44 -0
  125. package/dist/commands/tenants/helpers.d.ts.map +1 -0
  126. package/dist/commands/tenants/helpers.js +72 -0
  127. package/dist/commands/tenants/helpers.js.map +1 -0
  128. package/dist/commands/tenants/index.d.ts +19 -0
  129. package/dist/commands/tenants/index.d.ts.map +1 -0
  130. package/dist/commands/tenants/index.js +39 -0
  131. package/dist/commands/tenants/index.js.map +1 -0
  132. package/dist/commands/tenants/inspect.d.ts +18 -0
  133. package/dist/commands/tenants/inspect.d.ts.map +1 -0
  134. package/dist/commands/tenants/inspect.js +176 -0
  135. package/dist/commands/tenants/inspect.js.map +1 -0
  136. package/dist/commands/tenants/list.d.ts +18 -0
  137. package/dist/commands/tenants/list.d.ts.map +1 -0
  138. package/dist/commands/tenants/list.js +144 -0
  139. package/dist/commands/tenants/list.js.map +1 -0
  140. package/dist/commands/tenants/manage.d.ts +20 -0
  141. package/dist/commands/tenants/manage.d.ts.map +1 -0
  142. package/dist/commands/tenants/manage.js +206 -0
  143. package/dist/commands/tenants/manage.js.map +1 -0
  144. package/dist/commands/tenants/show.d.ts +18 -0
  145. package/dist/commands/tenants/show.d.ts.map +1 -0
  146. package/dist/commands/tenants/show.js +191 -0
  147. package/dist/commands/tenants/show.js.map +1 -0
  148. package/dist/commands/validate.d.ts +18 -0
  149. package/dist/commands/validate.d.ts.map +1 -0
  150. package/dist/commands/validate.js +536 -0
  151. package/dist/commands/validate.js.map +1 -0
  152. package/dist/index.d.ts +19 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +258 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/auth.d.ts +51 -0
  157. package/dist/lib/auth.d.ts.map +1 -0
  158. package/dist/lib/auth.js +153 -0
  159. package/dist/lib/auth.js.map +1 -0
  160. package/dist/lib/banner.d.ts +19 -0
  161. package/dist/lib/banner.d.ts.map +1 -0
  162. package/dist/lib/banner.js +78 -0
  163. package/dist/lib/banner.js.map +1 -0
  164. package/dist/lib/command-wrapper.d.ts +56 -0
  165. package/dist/lib/command-wrapper.d.ts.map +1 -0
  166. package/dist/lib/command-wrapper.js +71 -0
  167. package/dist/lib/command-wrapper.js.map +1 -0
  168. package/dist/lib/credentials.d.ts +56 -0
  169. package/dist/lib/credentials.d.ts.map +1 -0
  170. package/dist/lib/credentials.js +146 -0
  171. package/dist/lib/credentials.js.map +1 -0
  172. package/dist/lib/demo-banner.d.ts +15 -0
  173. package/dist/lib/demo-banner.d.ts.map +1 -0
  174. package/dist/lib/demo-banner.js +33 -0
  175. package/dist/lib/demo-banner.js.map +1 -0
  176. package/dist/lib/error-handler.d.ts +51 -0
  177. package/dist/lib/error-handler.d.ts.map +1 -0
  178. package/dist/lib/error-handler.js +458 -0
  179. package/dist/lib/error-handler.js.map +1 -0
  180. package/dist/lib/errors.d.ts +61 -0
  181. package/dist/lib/errors.d.ts.map +1 -0
  182. package/dist/lib/errors.js +168 -0
  183. package/dist/lib/errors.js.map +1 -0
  184. package/dist/lib/formatters.d.ts +55 -0
  185. package/dist/lib/formatters.d.ts.map +1 -0
  186. package/dist/lib/formatters.js +163 -0
  187. package/dist/lib/formatters.js.map +1 -0
  188. package/dist/lib/graph-client.d.ts +74 -0
  189. package/dist/lib/graph-client.d.ts.map +1 -0
  190. package/dist/lib/graph-client.js +231 -0
  191. package/dist/lib/graph-client.js.map +1 -0
  192. package/dist/lib/input.d.ts +22 -0
  193. package/dist/lib/input.d.ts.map +1 -0
  194. package/dist/lib/input.js +120 -0
  195. package/dist/lib/input.js.map +1 -0
  196. package/dist/lib/interactive-wizard.d.ts +26 -0
  197. package/dist/lib/interactive-wizard.d.ts.map +1 -0
  198. package/dist/lib/interactive-wizard.js +550 -0
  199. package/dist/lib/interactive-wizard.js.map +1 -0
  200. package/dist/lib/oss-surface.d.ts +21 -0
  201. package/dist/lib/oss-surface.d.ts.map +1 -0
  202. package/dist/lib/oss-surface.js +29 -0
  203. package/dist/lib/oss-surface.js.map +1 -0
  204. package/dist/lib/output.d.ts +74 -0
  205. package/dist/lib/output.d.ts.map +1 -0
  206. package/dist/lib/output.js +156 -0
  207. package/dist/lib/output.js.map +1 -0
  208. package/dist/lib/picker.d.ts +75 -0
  209. package/dist/lib/picker.d.ts.map +1 -0
  210. package/dist/lib/picker.js +115 -0
  211. package/dist/lib/picker.js.map +1 -0
  212. package/dist/lib/repl.d.ts +19 -0
  213. package/dist/lib/repl.d.ts.map +1 -0
  214. package/dist/lib/repl.js +158 -0
  215. package/dist/lib/repl.js.map +1 -0
  216. package/dist/lib/spinner.d.ts +41 -0
  217. package/dist/lib/spinner.d.ts.map +1 -0
  218. package/dist/lib/spinner.js +126 -0
  219. package/dist/lib/spinner.js.map +1 -0
  220. package/dist/lib/telemetry.d.ts +96 -0
  221. package/dist/lib/telemetry.d.ts.map +1 -0
  222. package/dist/lib/telemetry.js +367 -0
  223. package/dist/lib/telemetry.js.map +1 -0
  224. package/package.json +68 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ import { resolve, join } from "node:path";
18
+ import chalk from "chalk";
19
+ import { createSpinner } from "../lib/spinner.js";
20
+ import Table from "cli-table3";
21
+ import { loadConfig, TokenManager, DataverseClient, SolutionOperations, AgentResolver, } from "@pax8-cta/core";
22
+ import { getClientSecretWithFallback } from "../lib/credentials.js";
23
+ import { handleCommandError } from "../lib/errors.js";
24
+ export const resolveUrlCommand = new Command("resolve-url")
25
+ .description("Find which solution contains a given M365 agent URL")
26
+ .requiredOption("-u, --url <url>", "M365 agent URL (e.g., https://m365.cloud.microsoft/chat/?titleId=...)")
27
+ .option("-o, --output <path>", "Output directory for the solution", "./agent packages")
28
+ .option("-c, --config <path>", "Path to config file", "./config/tenants.yaml")
29
+ .option("--unmanaged", "Export as unmanaged solution (default: managed)")
30
+ .option("--list-bots", "List all bots in the environment instead of resolving")
31
+ .option("--dry-run", "Parse URL and show info without exporting")
32
+ .action(async (options) => {
33
+ const spinner = createSpinner("Loading configuration...").start();
34
+ try {
35
+ // Load config
36
+ const configPath = resolve(process.cwd(), options.config);
37
+ const config = await loadConfig(configPath);
38
+ spinner.succeed("Configuration loaded");
39
+ // Authenticate
40
+ spinner.start("Authenticating...");
41
+ const clientSecret = await getClientSecretWithFallback();
42
+ const tokenManager = new TokenManager({
43
+ tenantId: config.partner.tenantId,
44
+ clientId: config.partner.clientId,
45
+ clientSecret,
46
+ });
47
+ const dataverseClient = new DataverseClient({
48
+ environmentUrl: config.source.environmentUrl,
49
+ tokenManager,
50
+ });
51
+ const resolver = new AgentResolver(dataverseClient);
52
+ spinner.succeed("Connected to source environment");
53
+ // List bots mode
54
+ if (options.listBots) {
55
+ spinner.start("Fetching bots...");
56
+ const botsWithSolutions = await resolver.listBotsWithSolutions();
57
+ spinner.succeed(`Found ${botsWithSolutions.length} bot(s)`);
58
+ console.log();
59
+ const table = new Table({
60
+ head: ["Bot Name", "Bot ID", "Solution", "Status", "Modified"],
61
+ style: { head: ["cyan"] },
62
+ });
63
+ for (const { bot, solution } of botsWithSolutions) {
64
+ table.push([
65
+ bot.name || "(unnamed)",
66
+ bot.botid.slice(0, 8) + "...",
67
+ solution?.uniquename || chalk.gray("(no solution)"),
68
+ bot.statecode === 0 ? chalk.green("Active") : chalk.gray("Inactive"),
69
+ new Date(bot.modifiedon).toLocaleDateString(),
70
+ ]);
71
+ }
72
+ console.log(table.toString());
73
+ return;
74
+ }
75
+ // Parse URL
76
+ spinner.start("Parsing agent URL...");
77
+ const parsed = resolver.parseAgentUrl(options.url);
78
+ spinner.succeed("URL parsed");
79
+ console.log();
80
+ console.log(chalk.bold("Parsed URL Info:"));
81
+ console.log(` Title ID: ${chalk.cyan(parsed.titleId)}`);
82
+ console.log(` Prefix: ${parsed.prefix || "(none)"}`);
83
+ console.log(` Possible Bot: ${parsed.possibleBotId || "(not a direct GUID)"}`);
84
+ console.log();
85
+ if (options.dryRun) {
86
+ console.log(chalk.yellow("Dry run - not resolving or exporting"));
87
+ return;
88
+ }
89
+ // Resolve to solution
90
+ spinner.start("Resolving agent to solution...");
91
+ const resolved = await resolver.resolveUrlToSolution(options.url);
92
+ spinner.succeed("Agent resolved");
93
+ console.log(chalk.bold("Resolved Agent:"));
94
+ console.log(` Bot Name: ${chalk.green(resolved.bot.name)}`);
95
+ console.log(` Bot ID: ${resolved.bot.botid}`);
96
+ console.log(` Solution: ${chalk.cyan(resolved.solution.uniquename)}`);
97
+ console.log(` Version: ${resolved.solution.version}`);
98
+ console.log(` Managed: ${resolved.solution.ismanaged ? "Yes" : "No"}`);
99
+ console.log();
100
+ // Export solution
101
+ const solutionOps = new SolutionOperations(dataverseClient);
102
+ const managed = !options.unmanaged;
103
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
104
+ const suffix = managed ? "managed" : "unmanaged";
105
+ const outputDir = resolve(options.output);
106
+ const outputPath = join(outputDir, `${resolved.solution.uniquename}_${timestamp}_${suffix}.zip`);
107
+ spinner.start(`Exporting solution '${resolved.solution.uniquename}'...`);
108
+ const metadata = await solutionOps.exportSolution(resolved.solution.uniquename, {
109
+ managed,
110
+ outputPath,
111
+ });
112
+ spinner.succeed(`Solution exported: ${chalk.green(metadata.friendlyName)} v${metadata.version}`);
113
+ console.log();
114
+ console.log(chalk.bold("Export Complete:"));
115
+ console.log(` Solution: ${metadata.friendlyName}`);
116
+ console.log(` Version: ${metadata.version}`);
117
+ console.log(` Type: ${managed ? "Managed" : "Unmanaged"}`);
118
+ console.log(` Output: ${chalk.cyan(outputPath)}`);
119
+ console.log();
120
+ console.log(chalk.gray(`Use 'deploy <solution> --all' to deploy to your tenants`));
121
+ }
122
+ catch (error) {
123
+ handleCommandError(error, spinner, "URL resolution failed");
124
+ }
125
+ });
126
+ //# sourceMappingURL=resolve-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-url.js","sourceRoot":"","sources":["../../src/commands/resolve-url.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ export declare const setupCommand: Command;
18
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,YAAY,SA+MrB,CAAC"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ import { resolve } from "node:path";
18
+ import chalk from "chalk";
19
+ import { createSpinner } from "../lib/spinner.js";
20
+ import Table from "cli-table3";
21
+ import { loadConfig, TokenManager, DataverseClient, environmentSetupService, } from "@pax8-cta/core";
22
+ import { getClientSecretWithFallback } from "../lib/credentials.js";
23
+ import { UsageError, CliError, handleCommandError } from "../lib/errors.js";
24
+ import { isInteractivePrompt, pickFromList, printRunningCommand } from "../lib/picker.js";
25
+ export const setupCommand = new Command("setup")
26
+ .description("Register your app as an application user in tenant environments")
27
+ .option("-c, --config <path>", "Path to config file", "./config/tenants.yaml")
28
+ .option("--check", "Check setup status without making changes")
29
+ .option("--all", "Setup all environments")
30
+ .option("-t, --tenant <name>", "Setup specific environment by name")
31
+ .addHelpText("after", `
32
+ Examples:
33
+ setup --check Check setup status without making changes
34
+ setup --all Register app user in all environments
35
+ setup -t Pax8CTA-Test2 Setup a specific tenant environment
36
+ `)
37
+ .action(async (options, cmd) => {
38
+ // Pull global flags (--json, --quiet) so the interactive picker check
39
+ // doesn't fire when the caller explicitly opted out of prompts.
40
+ const globalOpts = cmd?.optsWithGlobals?.() ?? {};
41
+ const interactiveOpts = { json: globalOpts.json, quiet: globalOpts.quiet };
42
+ const spinner = createSpinner("Loading configuration...").start();
43
+ try {
44
+ const configPath = resolve(process.cwd(), options.config);
45
+ let config;
46
+ // No selector flag in an interactive terminal? Try to load the config
47
+ // and offer a picker drawn from the enabled tenants. Scripts (--json,
48
+ // --quiet, non-TTY) fall through to the existing UsageError below so
49
+ // they fail fast instead of hanging on stdin.
50
+ if (!options.check &&
51
+ !options.all &&
52
+ !options.tenant &&
53
+ isInteractivePrompt(interactiveOpts)) {
54
+ try {
55
+ config = await loadConfig(configPath);
56
+ spinner.succeed("Configuration loaded");
57
+ }
58
+ catch {
59
+ // No config available — let validation below produce the friendly
60
+ // UsageError instead of a config-not-found error.
61
+ spinner.stop();
62
+ }
63
+ if (config) {
64
+ const enabledTenants = config.tenants.filter((t) => t.enabled);
65
+ const picked = await pickFromList(enabledTenants, {
66
+ prompt: "Pick a tenant to set up:",
67
+ label: (t) => t.name,
68
+ hint: (t) => (t.tags?.length ? t.tags.join(", ") : undefined),
69
+ });
70
+ if (picked) {
71
+ options.tenant = picked.name;
72
+ printRunningCommand(["setup", "--tenant", picked.name]);
73
+ }
74
+ }
75
+ }
76
+ // Validate options (after the picker has had a chance to populate them).
77
+ if (!options.check && !options.all && !options.tenant) {
78
+ spinner.stop();
79
+ throw new UsageError("Must specify --check, --all, or --tenant <name>. Run 'setup --help' for usage.");
80
+ }
81
+ // Load config if the picker didn't already.
82
+ if (!config) {
83
+ config = await loadConfig(configPath);
84
+ spinner.succeed("Configuration loaded");
85
+ }
86
+ // Get target tenants
87
+ let targets;
88
+ if (options.all) {
89
+ targets = config.tenants.filter((t) => t.enabled);
90
+ }
91
+ else if (options.tenant) {
92
+ const tenant = config.tenants.find((t) => t.name.toLowerCase() === options.tenant.toLowerCase());
93
+ if (!tenant) {
94
+ spinner.stop();
95
+ throw new CliError(`Tenant '${options.tenant}' not found in configuration. Run 'tenants list' to see available tenants.`);
96
+ }
97
+ targets = [tenant];
98
+ }
99
+ else {
100
+ // Check mode - check all enabled tenants
101
+ targets = config.tenants.filter((t) => t.enabled);
102
+ }
103
+ if (targets.length === 0) {
104
+ spinner.fail(chalk.red("No environments matched the selection criteria"));
105
+ process.exit(1);
106
+ }
107
+ // Verify client secret is available
108
+ await getClientSecretWithFallback();
109
+ console.log();
110
+ console.log(chalk.bold(`Checking ${targets.length} environment(s)...`));
111
+ console.log();
112
+ // Check setup status for each tenant
113
+ const clientSecret = await getClientSecretWithFallback();
114
+ const statuses = [];
115
+ for (const tenant of targets) {
116
+ const tokenManager = new TokenManager({
117
+ tenantId: tenant.tenantId,
118
+ clientId: config.partner.clientId,
119
+ clientSecret,
120
+ });
121
+ const client = new DataverseClient({
122
+ environmentUrl: tenant.environmentUrl,
123
+ tokenManager,
124
+ });
125
+ const status = await environmentSetupService.checkSetupStatus(client, config.partner.clientId, tenant.name, tenant.environmentUrl);
126
+ statuses.push(status);
127
+ }
128
+ // Display results
129
+ displaySetupStatus(statuses);
130
+ // If in check mode, we're done
131
+ if (options.check) {
132
+ const needsSetup = statuses.filter((s) => s.status === "needs_setup" || s.status === "partial").length;
133
+ if (needsSetup > 0) {
134
+ console.log();
135
+ console.log(chalk.yellow(`${needsSetup} environment(s) need setup. Run 'setup --all' to configure them.`));
136
+ }
137
+ return;
138
+ }
139
+ // Setup environments that need it
140
+ const needsSetup = statuses.filter((s) => s.status === "needs_setup" || s.status === "partial");
141
+ if (needsSetup.length === 0) {
142
+ console.log();
143
+ console.log(chalk.green("All environments are properly configured!"));
144
+ return;
145
+ }
146
+ console.log();
147
+ console.log(chalk.bold(`Setting up ${needsSetup.length} environment(s)...`));
148
+ console.log();
149
+ let successCount = 0;
150
+ let errorCount = 0;
151
+ for (const status of needsSetup) {
152
+ const tenant = targets.find((t) => t.name === status.tenantName);
153
+ if (!tenant)
154
+ continue;
155
+ const setupSpinner = createSpinner(`Setting up ${status.tenantName}...`).start();
156
+ try {
157
+ const tokenManager = new TokenManager({
158
+ tenantId: tenant.tenantId,
159
+ clientId: config.partner.clientId,
160
+ clientSecret,
161
+ });
162
+ const client = new DataverseClient({
163
+ environmentUrl: tenant.environmentUrl,
164
+ tokenManager,
165
+ });
166
+ await environmentSetupService.setupTenant(client, config.partner.clientId, tenant.environmentUrl, status);
167
+ setupSpinner.succeed(chalk.green(`Setup completed: ${status.tenantName}`));
168
+ successCount++;
169
+ }
170
+ catch (error) {
171
+ setupSpinner.fail(chalk.red(`Setup failed: ${status.tenantName}`));
172
+ console.error(chalk.red(` Error: ${error instanceof Error ? error.message : String(error)}`));
173
+ errorCount++;
174
+ }
175
+ }
176
+ console.log();
177
+ console.log(chalk.bold("Setup Summary:"));
178
+ console.log(` ${chalk.green(`✓ ${successCount} successful`)}`);
179
+ if (errorCount > 0) {
180
+ console.log(` ${chalk.red(`✗ ${errorCount} failed`)}`);
181
+ }
182
+ }
183
+ catch (error) {
184
+ handleCommandError(error, spinner, "Setup failed");
185
+ }
186
+ });
187
+ /**
188
+ * Display setup status in a table
189
+ */
190
+ function displaySetupStatus(statuses) {
191
+ const table = new Table({
192
+ head: ["Environment", "App Registered", "Role", "Status"],
193
+ style: { head: ["cyan"] },
194
+ });
195
+ for (const status of statuses) {
196
+ const appRegistered = status.appRegistered ? chalk.green("✓") : chalk.red("✗");
197
+ const roleAssigned = status.roleAssigned
198
+ ? chalk.green("System Admin")
199
+ : status.appRegistered
200
+ ? chalk.yellow("None")
201
+ : chalk.gray("-");
202
+ let statusText;
203
+ if (status.status === "ready") {
204
+ statusText = chalk.green("Ready");
205
+ }
206
+ else if (status.status === "needs_setup") {
207
+ statusText = chalk.yellow("Needs setup");
208
+ }
209
+ else if (status.status === "partial") {
210
+ statusText = chalk.yellow("Needs role");
211
+ }
212
+ else {
213
+ statusText = chalk.red("Error");
214
+ }
215
+ const row = [status.tenantName, appRegistered, roleAssigned, statusText];
216
+ table.push(row);
217
+ }
218
+ console.log(table.toString());
219
+ // Show errors if any
220
+ const errors = statuses.filter((s) => s.error);
221
+ if (errors.length > 0) {
222
+ console.log();
223
+ console.log(chalk.bold("Notes:"));
224
+ for (const status of errors) {
225
+ console.log(chalk.yellow(` ${status.tenantName}: ${status.error}`));
226
+ }
227
+ }
228
+ // Show bootstrap message if needed
229
+ const needsBootstrap = statuses.filter((s) => s.status === "needs_setup" && s.error?.includes("bootstrap"));
230
+ if (needsBootstrap.length > 0) {
231
+ console.log();
232
+ console.log(chalk.bold("Bootstrap Required:"));
233
+ console.log(chalk.gray(" Some environments require manual app user setup first (one-time bootstrap)."));
234
+ console.log(chalk.gray(" Go to: https://admin.powerplatform.microsoft.com"));
235
+ console.log(chalk.gray(" → Environment → Settings → Users + permissions → Application users"));
236
+ console.log(chalk.gray(` → Add app: ${statuses[0]?.environmentUrl ? "your app ID" : ""}`));
237
+ }
238
+ }
239
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { FleetDriftAnalysis, TenantConfig, TenantDeploymentHistory, TenantDriftAnalysis, TenantVersionStatus, VersionChecker, VersionDriftSummary } from "@pax8-cta/core";
17
+ import type { UnmanagedCustomizationResult } from "@pax8-cta/core";
18
+ /**
19
+ * The set of tenants in a fleet drift analysis that are "outdated" — i.e. the
20
+ * report's actionable rows. We treat anything that isn't `current` as
21
+ * outdated; this matches what the table-mode renderer surfaces and what
22
+ * `--fix` would touch.
23
+ */
24
+ export declare function selectOutdated(fleet: FleetDriftAnalysis): TenantDriftAnalysis[];
25
+ /**
26
+ * Build the after-action hint shown beneath the drift table.
27
+ *
28
+ * Mirrors the analyze → test-deploy nudge: a one-paragraph "what should I do
29
+ * about this?" string driven by the result shape. Returns an empty string
30
+ * when there is nothing to suggest, so the caller can `if (hint) console.log`.
31
+ *
32
+ * Pure / side-effect-free so the unit tests can pin the wording without
33
+ * shelling out.
34
+ *
35
+ * @param solutionLabel The solution name to interpolate into per-tenant
36
+ * suggestions. When the drift run wasn't scoped to a
37
+ * single solution we fall back to `<solution>` so the
38
+ * user knows to substitute.
39
+ */
40
+ export declare function buildAfterActionHint(outdated: TenantDriftAnalysis[], solutionLabel?: string): string;
41
+ export declare function displayTenantStatus(status: TenantVersionStatus): void;
42
+ export declare function buildSummary(statuses: TenantVersionStatus[], expectedSolutions: Array<{
43
+ uniqueName: string;
44
+ friendlyName: string;
45
+ version: string;
46
+ }>): VersionDriftSummary;
47
+ export declare function displayTenantRiskAnalysis(analysis: TenantDriftAnalysis): void;
48
+ export declare function displayFleetRiskAnalysis(fleet: FleetDriftAnalysis, riskFilter?: string | true): void;
49
+ export declare function generateDemoDeployHistory(tenantId: string): TenantDeploymentHistory;
50
+ export declare function displayFleetSummary(summary: VersionDriftSummary, options: {
51
+ agent?: string;
52
+ outdated?: boolean;
53
+ }, tenants: TenantConfig[], statuses: TenantVersionStatus[], _checker: VersionChecker, _expectedSolutions: Array<{
54
+ uniqueName: string;
55
+ friendlyName: string;
56
+ version: string;
57
+ }>): void;
58
+ /**
59
+ * Display unmanaged customization details for a single tenant
60
+ */
61
+ export declare function displayCustomizationDetails(result: UnmanagedCustomizationResult): void;
62
+ /**
63
+ * Display fleet-wide unmanaged customization summary
64
+ */
65
+ export declare function displayCustomizationFleetSummary(summary: {
66
+ totalTenants: number;
67
+ tenantsWithCustomizations: number;
68
+ tenantsClean: number;
69
+ totalCustomizations: number;
70
+ highRiskTenants: string[];
71
+ results: UnmanagedCustomizationResult[];
72
+ }): void;
73
+ //# sourceMappingURL=drift-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-analysis.d.ts","sourceRoot":"","sources":["../../../src/commands/solutions/drift-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAEV,kBAAkB,EAElB,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAGnE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,EAAE,CAE/E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,aAAa,GAAE,MAAqB,GACnC,MAAM,CAyBR;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAmCrE;AAiBD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,iBAAiB,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACtF,mBAAmB,CAsCrB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAsD7E;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,EACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,IAAI,CAiEN;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,CAuCnF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EAC/C,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,QAAQ,EAAE,cAAc,EACxB,kBAAkB,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACvF,IAAI,CAqEN;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI,CA+CtF;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB,EAAE,MAAM,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,4BAA4B,EAAE,CAAC;CACzC,GAAG,IAAI,CA4CP"}