@aifabrix/builder 2.53.0 → 2.54.1

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 (321) hide show
  1. package/bin/aifabrix.js +2 -2
  2. package/lib/api/assistants.api.js +8 -5
  3. package/lib/api/channel-identity.api.js +41 -0
  4. package/lib/api/evidence-authoring.api.js +5 -1
  5. package/lib/api/evidence.api.js +2 -0
  6. package/lib/api/types/evidence.types.js +2 -0
  7. package/lib/api/work-search.api.js +136 -0
  8. package/lib/channels/add-channel.js +163 -126
  9. package/lib/channels/approval-guides/chatgpt.js +14 -18
  10. package/lib/channels/approval-guides/claude.js +29 -0
  11. package/lib/channels/approval-guides/index.js +88 -22
  12. package/lib/channels/approval-guides/mcp-client.js +27 -0
  13. package/lib/channels/approval-guides/microsoft-copilot.js +52 -3
  14. package/lib/channels/approval-guides/slack.js +10 -10
  15. package/lib/channels/approval-guides/teams-bot.js +8 -12
  16. package/lib/channels/channel-add-continuations.js +91 -0
  17. package/lib/channels/channel-add-ensure.js +124 -27
  18. package/lib/channels/channel-add-existing.js +160 -28
  19. package/lib/channels/channel-add-failure.js +60 -0
  20. package/lib/channels/channel-add-remaining.js +486 -0
  21. package/lib/channels/channel-add-tty.js +190 -0
  22. package/lib/channels/channel-add-wizard-config.js +138 -0
  23. package/lib/channels/channel-add-wizard.js +250 -0
  24. package/lib/channels/channel-artifact-generator.js +27 -13
  25. package/lib/channels/channel-cardinality.js +83 -0
  26. package/lib/channels/channel-catalog-icon.js +45 -0
  27. package/lib/channels/channel-cli-instructions.js +75 -0
  28. package/lib/channels/channel-configuration-map.js +213 -0
  29. package/lib/channels/channel-credential.js +11 -14
  30. package/lib/channels/channel-definition-project.js +101 -0
  31. package/lib/channels/channel-definition-registry.js +154 -0
  32. package/lib/channels/channel-description.js +59 -2
  33. package/lib/channels/channel-discovery.js +16 -2
  34. package/lib/channels/channel-external-system.js +86 -9
  35. package/lib/channels/channel-install-envelope-actions.js +88 -0
  36. package/lib/channels/channel-install-envelope-microsoft.js +155 -0
  37. package/lib/channels/channel-install-envelope.js +356 -0
  38. package/lib/channels/channel-install-help-md.js +172 -0
  39. package/lib/channels/channel-install-http-payload.js +62 -0
  40. package/lib/channels/channel-install-inventory.js +115 -0
  41. package/lib/channels/channel-install-profiles.js +90 -0
  42. package/lib/channels/channel-instance-collision.js +118 -0
  43. package/lib/channels/channel-instance-key.js +100 -0
  44. package/lib/channels/channel-instance-materialize.js +240 -0
  45. package/lib/channels/channel-integration-generator.js +16 -9
  46. package/lib/channels/channel-integration-template.js +101 -22
  47. package/lib/channels/channel-inventory-fetch.js +79 -0
  48. package/lib/channels/channel-oauth-preflight.js +104 -0
  49. package/lib/channels/channel-package-version.js +76 -0
  50. package/lib/channels/channel-predefined-client.js +154 -0
  51. package/lib/channels/channel-probe.js +7 -2
  52. package/lib/channels/channel-runtime-resolver.js +180 -72
  53. package/lib/channels/channel-status-display.js +86 -16
  54. package/lib/channels/channel-targets.js +106 -92
  55. package/lib/channels/chatgpt-callback.js +318 -0
  56. package/lib/channels/chatgpt-channel-add.js +229 -0
  57. package/lib/channels/chatgpt-preflight.js +396 -0
  58. package/lib/channels/chatgpt-runtime-contract.js +17 -0
  59. package/lib/channels/chatgpt-setup-values.js +124 -0
  60. package/lib/channels/claude-callback.js +67 -0
  61. package/lib/channels/claude-channel-add.js +254 -0
  62. package/lib/channels/claude-runtime-contract.js +40 -0
  63. package/lib/channels/claude-runtime.js +58 -0
  64. package/lib/channels/claude-setup-values.js +89 -0
  65. package/lib/channels/mcp-client/config-merge.js +148 -0
  66. package/lib/channels/mcp-client/ensure-client.js +231 -0
  67. package/lib/channels/mcp-client/paths.js +53 -0
  68. package/lib/channels/mcp-client/profiles.js +122 -0
  69. package/lib/channels/mcp-client/redirect-uris.js +99 -0
  70. package/lib/channels/mcp-client/runtime.js +59 -0
  71. package/lib/channels/mcp-client-channel-add.js +186 -0
  72. package/lib/channels/microsoft-copilot-channel-add.js +117 -7
  73. package/lib/channels/microsoft-copilot-entra-identifier-uris.js +187 -0
  74. package/lib/channels/microsoft-copilot-entra-sso-form.js +106 -18
  75. package/lib/channels/microsoft-copilot-entra-sso.js +31 -2
  76. package/lib/channels/microsoft-copilot-package-prior.js +107 -0
  77. package/lib/channels/microsoft-copilot-package.js +29 -28
  78. package/lib/channels/microsoft-provisioning/a365.js +80 -0
  79. package/lib/channels/microsoft-provisioning/auth-config.js +240 -0
  80. package/lib/channels/microsoft-provisioning/auth.js +179 -0
  81. package/lib/channels/microsoft-provisioning/cli.js +71 -0
  82. package/lib/channels/microsoft-provisioning/constants.js +75 -0
  83. package/lib/channels/microsoft-provisioning/errors.js +117 -0
  84. package/lib/channels/microsoft-provisioning/index.js +55 -0
  85. package/lib/channels/microsoft-provisioning/install-atk.js +158 -0
  86. package/lib/channels/microsoft-provisioning/install-teams.js +115 -0
  87. package/lib/channels/microsoft-provisioning/login-portal-device.js +236 -0
  88. package/lib/channels/microsoft-provisioning/login-portal-parse.js +71 -0
  89. package/lib/channels/microsoft-provisioning/login-portal-teams.js +193 -0
  90. package/lib/channels/microsoft-provisioning/login-portal.js +230 -0
  91. package/lib/channels/microsoft-provisioning/persist.js +110 -0
  92. package/lib/channels/microsoft-provisioning/teams-bot-args.js +119 -0
  93. package/lib/channels/microsoft-provisioning/teams-bot-controller.js +123 -0
  94. package/lib/channels/microsoft-provisioning/teams-bot-parse.js +134 -0
  95. package/lib/channels/microsoft-provisioning/teams-bot-persist.js +113 -0
  96. package/lib/channels/microsoft-provisioning/teams-bot-provision.js +234 -0
  97. package/lib/channels/microsoft-provisioning/teams-bot-secrets.js +45 -0
  98. package/lib/channels/microsoft-provisioning/teams-cli.js +82 -0
  99. package/lib/channels/runtime-tool-catalog.js +5 -2
  100. package/lib/channels/slack-channel-add-portal.js +130 -0
  101. package/lib/channels/slack-channel-add-tty-auth.js +95 -0
  102. package/lib/channels/slack-channel-add.js +258 -0
  103. package/lib/channels/slack-provisioning/apps.js +181 -0
  104. package/lib/channels/slack-provisioning/auth-store.js +110 -0
  105. package/lib/channels/slack-provisioning/auth-ticket.js +185 -0
  106. package/lib/channels/slack-provisioning/auth.js +115 -0
  107. package/lib/channels/slack-provisioning/callbacks.js +41 -0
  108. package/lib/channels/slack-provisioning/cli.js +226 -0
  109. package/lib/channels/slack-provisioning/constants.js +37 -0
  110. package/lib/channels/slack-provisioning/credentials.js +169 -0
  111. package/lib/channels/slack-provisioning/curl-shim.js +132 -0
  112. package/lib/channels/slack-provisioning/developer-install.js +118 -0
  113. package/lib/channels/slack-provisioning/env-file.js +120 -0
  114. package/lib/channels/slack-provisioning/errors.js +47 -0
  115. package/lib/channels/slack-provisioning/go-ca-bundle.js +137 -0
  116. package/lib/channels/slack-provisioning/index.js +250 -0
  117. package/lib/channels/slack-provisioning/install-cli.js +323 -0
  118. package/lib/channels/slack-provisioning/manifest.js +89 -0
  119. package/lib/channels/slack-provisioning/oauth-lock.js +33 -0
  120. package/lib/channels/slack-provisioning/offer-cli.js +113 -0
  121. package/lib/channels/slack-provisioning/onboard-members.js +122 -0
  122. package/lib/channels/slack-provisioning/onboard.js +89 -0
  123. package/lib/channels/slack-provisioning/persist.js +95 -0
  124. package/lib/channels/slack-provisioning/remaining-urls.js +158 -0
  125. package/lib/channels/slack-provisioning/with-curl-on-path.js +48 -0
  126. package/lib/channels/teams-bot-channel-add.js +94 -0
  127. package/lib/channels/vendor-dataplane-url.js +249 -0
  128. package/lib/cli/setup-certification.help.js +2 -0
  129. package/lib/cli/setup-external-system-help.js +2 -0
  130. package/lib/cli/setup-external-system.js +1 -1
  131. package/lib/commands/channel-add-help.js +366 -0
  132. package/lib/commands/channel-add-setup.js +162 -80
  133. package/lib/commands/channel-configure.js +118 -0
  134. package/lib/commands/channel.js +10 -1
  135. package/lib/commands/governance-upload-external.js +6 -3
  136. package/lib/commands/lifecycle-command-action.js +2 -5
  137. package/lib/commands/lifecycle-external.js +93 -21
  138. package/lib/commands/repair-datasource-test-payload.js +4 -2
  139. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +23 -2
  140. package/lib/commands/repair-datasource.js +3 -0
  141. package/lib/commands/repair-external-run.js +59 -25
  142. package/lib/commands/repair-openapi-rest-runtime.js +127 -0
  143. package/lib/commands/repair-orchestration-tag-merge.js +339 -0
  144. package/lib/commands/repair-rbac-catalog-defaults.js +96 -0
  145. package/lib/commands/repair-rbac-platform-preset.js +26 -15
  146. package/lib/commands/repair-rbac-reader-roles.js +8 -21
  147. package/lib/commands/repair-rbac.js +10 -34
  148. package/lib/commands/repair-system-permissions.js +24 -22
  149. package/lib/commands/role-assistant-test-output.js +14 -0
  150. package/lib/commands/role-assistant.js +59 -21
  151. package/lib/commands/test-e2e-external.js +148 -21
  152. package/lib/commands/upload-credential-push-log.js +2 -1
  153. package/lib/commands/upload-publish-context.js +1 -1
  154. package/lib/commands/upload-role-assistant-shell.js +124 -0
  155. package/lib/commands/upload-sidecar-followups.js +6 -3
  156. package/lib/commands/upload.js +18 -3
  157. package/lib/core/secrets-docker-env.js +4 -1
  158. package/lib/core/secrets-env-content.js +17 -3
  159. package/lib/datasource/capability/capability-manifest.js +0 -3
  160. package/lib/datasource/capability/copy-test-payload.js +3 -0
  161. package/lib/external-system/deploy-helpers.js +26 -1
  162. package/lib/external-system/deploy.js +10 -6
  163. package/lib/external-system/download-helpers.js +29 -2
  164. package/lib/external-system/download-role-assistant.js +83 -4
  165. package/lib/external-system/download.js +40 -30
  166. package/lib/external-system/sync-deploy-manifest.js +3 -2
  167. package/lib/external-system/upload-identity.js +42 -0
  168. package/lib/generator/index.js +19 -15
  169. package/lib/generator/split.js +13 -2
  170. package/lib/lifecycle/role-assistant-governance.js +146 -0
  171. package/lib/lifecycle/scenario-upload.js +181 -30
  172. package/lib/programmatic/builder-api-cors.js +143 -0
  173. package/lib/programmatic/builder-api-request.js +6 -0
  174. package/lib/programmatic/builder-api-route-dispatch.js +56 -42
  175. package/lib/programmatic/builder-api-server.js +8 -1
  176. package/lib/programmatic/capability-registry.js +54 -0
  177. package/lib/programmatic/channel-install-help-resolve.js +359 -0
  178. package/lib/programmatic/channel-install-session.js +218 -0
  179. package/lib/programmatic/help-content/channel-onboarding.md +2 -0
  180. package/lib/programmatic/help-content/cip-overview.md +3 -1
  181. package/lib/programmatic/http-raw-response.js +62 -0
  182. package/lib/programmatic/openapi-channel-install-bindings.js +179 -0
  183. package/lib/programmatic/openapi-channel-install-schemas.js +286 -0
  184. package/lib/programmatic/openapi-component-schemas.js +18 -1
  185. package/lib/programmatic/openapi-description-enricher.js +3 -1
  186. package/lib/programmatic/openapi-descriptions.js +74 -3
  187. package/lib/programmatic/openapi-envelope-examples.js +117 -0
  188. package/lib/programmatic/openapi-operation-bindings.js +4 -1
  189. package/lib/programmatic/openapi-schema-descriptions-channel.js +316 -0
  190. package/lib/programmatic/openapi-spec.js +12 -8
  191. package/lib/programmatic/platform-rbac-catalog.js +36 -18
  192. package/lib/programmatic/route-handler-map.js +51 -1
  193. package/lib/programmatic/route-handlers-context.js +2 -1
  194. package/lib/programmatic/run-auth-permissions.js +54 -0
  195. package/lib/programmatic/run-channel-catalog.js +196 -0
  196. package/lib/programmatic/run-channel-install-artifacts.js +137 -0
  197. package/lib/programmatic/run-channel-install-copilot.js +353 -0
  198. package/lib/programmatic/run-channel-install-options.js +232 -0
  199. package/lib/programmatic/run-channel-install-teams-bot.js +204 -0
  200. package/lib/programmatic/run-channel-install.js +346 -0
  201. package/lib/programmatic/run-channel-package.js +87 -7
  202. package/lib/programmatic/workspace-context.js +2 -0
  203. package/lib/role-assistant/evidence-sync.js +4 -2
  204. package/lib/role-assistant/evidence-validation-issues.js +51 -0
  205. package/lib/role-assistant/knowledge-sync.js +10 -4
  206. package/lib/role-assistant/settings.js +49 -2
  207. package/lib/role-assistant/test-cases-evaluate.js +30 -2
  208. package/lib/role-assistant/test-cases-evidence.js +175 -0
  209. package/lib/role-assistant/test-cases-search.js +229 -0
  210. package/lib/role-assistant/test-cases.js +37 -4
  211. package/lib/role-assistant/test-runner-search.js +149 -0
  212. package/lib/role-assistant/test-runner-workhub-helpers.js +40 -2
  213. package/lib/role-assistant/test-runner-workhub-soft.js +9 -3
  214. package/lib/role-assistant/test-runner-workhub.js +29 -11
  215. package/lib/role-assistant/test-runner.js +16 -1
  216. package/lib/schema/external-datasource.schema.json +119 -16
  217. package/lib/schema/external-system.schema.json +159 -2
  218. package/lib/schema/mcp-client-profile.schema.json +103 -0
  219. package/lib/utils/app-path-resolve.js +4 -0
  220. package/lib/utils/authentication-env-template.js +44 -6
  221. package/lib/utils/credential-secrets-env.js +6 -1
  222. package/lib/utils/env-copy.js +19 -7
  223. package/lib/utils/external-env-template.js +20 -2
  224. package/lib/utils/paths.js +18 -1
  225. package/lib/utils/platform-shell-package.js +69 -0
  226. package/lib/utils/port-resolver.js +50 -1
  227. package/lib/utils/rewrite-name-flag.js +20 -0
  228. package/lib/utils/role-assistant-paths.js +13 -10
  229. package/lib/utils/schema-resolver.js +11 -1
  230. package/lib/utils/secrets-helpers.js +12 -21
  231. package/lib/utils/token-manager.js +10 -5
  232. package/lib/validation/validate.js +40 -0
  233. package/package.json +1 -1
  234. package/templates/README.md +1 -1
  235. package/templates/applications/builder-api/Dockerfile +1 -1
  236. package/templates/applications/builder-api/env.template +7 -0
  237. package/templates/applications/dataplane/application.yaml +6 -5
  238. package/templates/applications/dataplane/env.template +2 -2
  239. package/templates/applications/dataplane/rbac.yaml +7 -2
  240. package/templates/applications/keycloak/Dockerfile +30 -4
  241. package/templates/applications/keycloak/application.yaml +2 -2
  242. package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +896 -0
  243. package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +19 -0
  244. package/templates/applications/keycloak/env.template +3 -0
  245. package/templates/applications/miso-controller/application.yaml +1 -2
  246. package/templates/applications/miso-controller/env.template +2 -0
  247. package/templates/channels/README.md +5 -5
  248. package/templates/channels/chatgpt/TROUBLESHOOTING.md +51 -0
  249. package/templates/channels/chatgpt/channel.json +59 -0
  250. package/templates/channels/chatgpt/icon.svg +1 -0
  251. package/templates/channels/chatgpt/install.template.md.hbs +20 -95
  252. package/templates/channels/chatgpt/integration/README.md +1 -1
  253. package/templates/channels/chatgpt/integration/application.json +2 -2
  254. package/templates/channels/chatgpt/integration/chatgpt-system.json +49 -4
  255. package/templates/channels/chatgpt/integration/env.template +2 -4
  256. package/templates/channels/chatgpt/integration/rbac.json +13 -0
  257. package/templates/channels/claude/TROUBLESHOOTING.md +41 -0
  258. package/templates/channels/claude/channel.json +59 -0
  259. package/templates/channels/claude/icon.svg +1 -0
  260. package/templates/channels/claude/install.template.md.hbs +21 -0
  261. package/templates/channels/claude/integration/README.md +14 -0
  262. package/templates/channels/claude/integration/application.json +15 -0
  263. package/templates/channels/claude/integration/claude-system.json +59 -0
  264. package/templates/channels/claude/integration/env.template +2 -0
  265. package/templates/channels/claude/integration/rbac.json +13 -0
  266. package/templates/channels/claude/manifest.template.json.hbs +40 -0
  267. package/templates/channels/mcp-client/channel.json +72 -0
  268. package/templates/channels/mcp-client/icon.svg +1 -0
  269. package/templates/channels/mcp-client/install.template.md.hbs +24 -0
  270. package/templates/channels/mcp-client/integration/README.md +13 -0
  271. package/templates/channels/mcp-client/integration/application.json +15 -0
  272. package/templates/channels/mcp-client/integration/env.template +2 -0
  273. package/templates/channels/mcp-client/integration/mcp-client-system.json +72 -0
  274. package/templates/channels/mcp-client/integration/rbac.json +13 -0
  275. package/templates/channels/mcp-client/manifest.template.json.hbs +41 -0
  276. package/templates/channels/mcp-client/profiles/cursor.json +26 -0
  277. package/templates/channels/mcp-client/profiles/github-copilot.json +29 -0
  278. package/templates/channels/mcp-client/profiles/vscode.json +29 -0
  279. package/templates/channels/microsoft-copilot/channel.json +73 -0
  280. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +8 -4
  281. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +65 -5
  282. package/templates/channels/microsoft-copilot/icon.svg +1 -0
  283. package/templates/channels/microsoft-copilot/install.template.md.hbs +9 -9
  284. package/templates/channels/microsoft-copilot/integration/README.md +1 -1
  285. package/templates/channels/microsoft-copilot/integration/application.json +2 -2
  286. package/templates/channels/microsoft-copilot/integration/env.template +3 -6
  287. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +63 -4
  288. package/templates/channels/microsoft-copilot/integration/rbac.json +13 -0
  289. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +5 -5
  290. package/templates/channels/slack/channel.json +223 -0
  291. package/templates/channels/slack/icon.svg +1 -0
  292. package/templates/channels/slack/install.template.md.hbs +36 -28
  293. package/templates/channels/slack/integration/README.md +245 -22
  294. package/templates/channels/slack/integration/application.json +44 -7
  295. package/templates/channels/slack/integration/env.template +15 -6
  296. package/templates/channels/slack/integration/openapi/openapi.json +126 -0
  297. package/templates/channels/slack/integration/rbac.json +84 -0
  298. package/templates/channels/slack/integration/slack-datasource-commands.json +154 -0
  299. package/templates/channels/slack/integration/slack-datasource-conversations.json +28 -3
  300. package/templates/channels/slack/integration/slack-datasource-events.json +154 -0
  301. package/templates/channels/slack/integration/slack-datasource-interactive.json +154 -0
  302. package/templates/channels/slack/integration/slack-datasource-messages.json +40 -2
  303. package/templates/channels/slack/integration/slack-system.json +155 -77
  304. package/templates/channels/slack/manifest.template.json.hbs +5 -2
  305. package/templates/channels/teams-bot/channel.json +161 -0
  306. package/templates/channels/teams-bot/icon.svg +1 -0
  307. package/templates/channels/teams-bot/install.template.md.hbs +12 -13
  308. package/templates/channels/teams-bot/integration/README.md +5 -4
  309. package/templates/channels/teams-bot/integration/application.json +6 -4
  310. package/templates/channels/teams-bot/integration/env.template +5 -4
  311. package/templates/channels/teams-bot/integration/openapi/openapi.json +68 -0
  312. package/templates/channels/teams-bot/integration/rbac.json +21 -0
  313. package/templates/channels/teams-bot/integration/teams-bot-datasource-activities.json +154 -0
  314. package/templates/channels/teams-bot/integration/teams-bot-system.json +128 -23
  315. package/templates/channels/web-embed/channel.json +60 -0
  316. package/templates/channels/web-embed/install.template.md.hbs +1 -1
  317. package/templates/channels/web-embed/integration/README.md +2 -2
  318. package/templates/channels/web-embed/integration/application.json +2 -2
  319. package/templates/channels/web-embed/integration/env.template +1 -1
  320. package/templates/channels/web-embed/integration/rbac.json +13 -0
  321. package/templates/channels/web-embed/integration/web-embed-system.json +50 -4
@@ -1,108 +1,153 @@
1
1
  /**
2
2
  * Register `channel add` (and optional deprecated aliases).
3
3
  *
4
- * @fileoverview Shared Commander wiring for assistant channel install (plan 152)
4
+ * @fileoverview Shared Commander wiring for assistant channel install
5
5
  */
6
6
 
7
7
  'use strict';
8
8
 
9
9
  const chalk = require('chalk');
10
10
  const logger = require('../utils/logger');
11
- const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
12
11
  const {
13
- formatSupportedChannelTargetsHelp,
12
+ formatUnknownChannelTargetError,
14
13
  isChannelTargetKey
15
14
  } = require('../channels/channel-targets');
16
- const { addChannelCommand } = require('../channels/add-channel');
17
-
18
- const CHANNEL_ADD_HELP_AFTER = `
19
- ${formatSupportedChannelTargetsHelp()}
20
-
21
- One command covers scaffold → upload → install:
22
- $ aifabrix channel add slack --name "Elsa" --probe
23
-
24
- Examples:
25
- $ aifabrix channel add slack --name "Elsa"
26
- $ aifabrix channel add teams-bot --name "Elsa" --description "Enterprise AI assistant for employees"
27
- $ aifabrix channel add chatgpt --name "Your Assistant"
28
- $ aifabrix channel add microsoft-copilot --name "Your Assistant" \\
29
- --oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
30
-
31
- # Slack slash-command prefix (registers /{prefix}-help in manifest)
32
- $ aifabrix channel add slack --name "Elsa" --command-prefix af
33
-
34
- # Generate artifacts only; no dataplane patch / upload
35
- $ aifabrix channel add slack --name "Elsa" --dry-run
36
-
37
- # Re-upload communication system + regenerate channel config (does not rotate secrets)
38
- $ aifabrix channel add slack --name "Elsa" --force
39
-
40
- # Validate callbacks and assistant catalog after install
41
- $ aifabrix channel add slack --name "Elsa" --probe
15
+ const { addChannelCommand, runAddChannel } = require('../channels/add-channel');
16
+ const { toChannelInstallEnvelope } = require('../channels/channel-install-envelope');
17
+ const {
18
+ isChannelAddCancelled,
19
+ promptChannelAddWizard
20
+ } = require('../channels/channel-add-wizard');
21
+ const { formatChannelAddFailure } = require('../channels/channel-add-failure');
22
+ const {
23
+ CHANNEL_ADD_HELP_AFTER,
24
+ channelAddHelpAfter,
25
+ configureChannelAddHelp,
26
+ resolveChannelAddHelpTarget
27
+ } = require('./channel-add-help');
42
28
 
43
- Behavior:
44
- - Scaffolds integration/<target>/ when missing (does not overwrite existing files)
45
- - Uploads when the system is not on the dataplane; with --force uploads every time
46
- - Then configures the channel install (artifacts, credentials, admin guide)
47
- - microsoft-copilot uses Entra SSO (trustedIssuer); pass --oauth-plugin-vault-reference-id
48
- from Teams Developer Portal. Does not create Fabrix oauth2 channel credentials.
29
+ /**
30
+ * @param {Object} options
31
+ * @returns {Object}
32
+ */
33
+ function toAddChannelCommandOptions(options) {
34
+ return {
35
+ name: options.name,
36
+ description: options.description,
37
+ icon: options.icon,
38
+ template: options.template,
39
+ commandPrefix: options.commandPrefix,
40
+ systemKey: options.systemKey,
41
+ oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
42
+ packageVersion: options.packageVersion,
43
+ callbackUrl: options.callbackUrl,
44
+ allowExperimental: options.allowExperimental === true,
45
+ dryRun: options.dryRun === true,
46
+ force: options.force === true,
47
+ probe: options.probe === true,
48
+ verbose: options.verbose === true,
49
+ onboardUsers:
50
+ options.noOnboardUsers === true ? false : options.onboardUsers === true ? true : undefined,
51
+ target: options.target,
52
+ profile: options.profile,
53
+ mcpClientProfile: options.mcpClientProfile
54
+ };
55
+ }
49
56
 
50
- Requires: aifabrix login
51
- `;
57
+ /**
58
+ * Resolve wizard vs explicit target. Explicit path still requires --name.
59
+ * @param {string|undefined} channelTarget
60
+ * @param {Object} options
61
+ * @returns {Promise<{ channelTarget: string, name: string }>}
62
+ */
63
+ async function resolveChannelAddSelection(channelTarget, options) {
64
+ if (!channelTarget) {
65
+ return promptChannelAddWizard(options);
66
+ }
67
+ if (!isChannelTargetKey(channelTarget)) {
68
+ throw new Error(formatUnknownChannelTargetError(channelTarget));
69
+ }
70
+ if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
71
+ throw new Error('--name is required for channel add');
72
+ }
73
+ return {
74
+ channelTarget,
75
+ name: options.name,
76
+ mcpClientProfile: options.target || options.profile
77
+ };
78
+ }
52
79
 
53
80
  /**
54
81
  * @param {string} channelTarget
55
82
  * @param {Object} options
56
83
  * @param {{ deprecatedVia?: string }} [meta]
84
+ * @returns {Promise<void>}
57
85
  */
58
86
  async function runChannelAddAction(channelTarget, options, meta = {}) {
59
87
  if (meta.deprecatedVia) {
60
88
  logger.warn(
61
89
  chalk.yellow(
62
- `Deprecated: use "aifabrix channel add ${channelTarget} ..." instead of "${meta.deprecatedVia}".`
90
+ `Deprecated: use "aifabrix channel add ${channelTarget || ''} ..." instead of "${meta.deprecatedVia}".`
63
91
  )
64
92
  );
65
93
  }
66
- if (!isChannelTargetKey(channelTarget)) {
67
- throw new Error(
68
- `Unknown channel target "${channelTarget}". ${formatSupportedChannelTargetsHelp()}`
69
- );
70
- }
71
- await addChannelCommand(channelTarget, {
72
- name: options.name,
73
- description: options.description,
74
- icon: options.icon,
75
- template: options.template,
76
- commandPrefix: options.commandPrefix,
77
- oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
78
- dryRun: options.dryRun === true,
79
- force: options.force === true,
80
- probe: options.probe === true
94
+ const selection = await resolveChannelAddSelection(channelTarget, options);
95
+ const addOptions = toAddChannelCommandOptions({
96
+ ...options,
97
+ ...selection,
98
+ name: selection.name,
99
+ mcpClientProfile: selection.mcpClientProfile || options.target || options.profile
81
100
  });
101
+ if (options.json === true) {
102
+ addOptions.quiet = true;
103
+ const result = await runAddChannel(selection.channelTarget, addOptions);
104
+ const envelope = toChannelInstallEnvelope({
105
+ channelTarget: selection.channelTarget,
106
+ displayName: addOptions.name,
107
+ runtimeValues: (result && result.runtimeValues) || { appName: addOptions.name },
108
+ ctx: { projectRoot: process.cwd() }
109
+ });
110
+ process.stdout.write(`${JSON.stringify(envelope)}\n`);
111
+ return;
112
+ }
113
+ await addChannelCommand(selection.channelTarget, addOptions);
82
114
  }
83
115
 
84
116
  /**
85
- * @param {import('commander').Command} parent
86
- * @param {{ deprecatedVia?: string, commandName?: string, hidden?: boolean }} [meta]
117
+ * @param {Error} error
118
+ * @returns {void}
119
+ */
120
+ function handleChannelAddError(error) {
121
+ if (isChannelAddCancelled(error)) {
122
+ process.exit(0);
123
+ }
124
+ if (!error.message?.includes('Authentication required')) {
125
+ logger.error(formatChannelAddFailure(error));
126
+ }
127
+ process.exit(1);
128
+ }
129
+
130
+ /**
131
+ * @param {import('commander').Command} cmd
87
132
  * @returns {import('commander').Command}
88
133
  */
89
- function registerChannelAddCommand(parent, meta = {}) {
90
- const description =
91
- 'Scaffold (if needed), upload (if needed/--force), then configure channel install';
92
- const commandName = meta.commandName || 'add <channelTarget>';
93
- const cmd = meta.hidden
94
- ? parent.command(commandName, { hidden: true })
95
- : parent.command(commandName);
96
- cmd
97
- .description(meta.deprecatedVia ? `(deprecated) ${description}` : description)
98
- .requiredOption('-n, --name <name>', 'Customer-visible channel name (e.g. "Elsa")')
134
+ function attachChannelAddOptions(cmd) {
135
+ return cmd
136
+ .option(
137
+ '-n, --name <name>',
138
+ 'Customer-visible channel name (e.g. "Elsa"); required when the target is specified. Quoted names may contain spaces'
139
+ )
99
140
  .option('-d, --description <text>', 'Channel description (default generated)')
100
141
  .option('--icon <path>', 'Path to channel icon asset')
101
142
  .option('--template <name>', 'Template override (default from channel target)')
102
143
  .option('--dry-run', 'Generate artifacts only; do not upload, patch, or set credentials')
103
144
  .option(
104
145
  '--force',
105
- 'Re-upload communication system and regenerate channel config (does not rotate secrets)'
146
+ 'Refresh integration files from the channel template, re-upload, and regenerate channel config (does not rotate secrets)'
147
+ )
148
+ .option(
149
+ '--system-key <key>',
150
+ 'Connected System instance key (default: derived from the channel and --name)'
106
151
  )
107
152
  .option(
108
153
  '--command-prefix <key>',
@@ -110,26 +155,63 @@ function registerChannelAddCommand(parent, meta = {}) {
110
155
  )
111
156
  .option(
112
157
  '--oauth-plugin-vault-reference-id <id>',
113
- 'Teams Developer Portal Entra SSO OAuth auth-config id (microsoft-copilot)'
158
+ 'Teams Entra SSO auth-config id (microsoft-copilot); optional when Agents Toolkit can create it'
159
+ )
160
+ .option(
161
+ '--package-version <semver>',
162
+ 'Teams manifest version (microsoft-copilot); default auto-bumps minor on regenerate'
114
163
  )
115
164
  .option('--probe', 'After install, validate callbacks and assistant catalog')
116
- .addHelpText('after', CHANNEL_ADD_HELP_AFTER)
117
- .action(async(channelTarget, options) => {
118
- try {
119
- await runChannelAddAction(channelTarget, options, meta);
120
- } catch (error) {
121
- if (!error.message?.includes('Authentication required')) {
122
- const detail = error.message || String(error);
123
- logger.error(formatBlockingError(`Channel install failed:\n${detail}`));
124
- }
125
- process.exit(1);
126
- }
127
- });
165
+ .option('--onboard-users', 'Onboard Slack users by matching email after install')
166
+ .option('--no-onboard-users', 'Skip Slack user onboard')
167
+ .option('-v, --verbose', 'Print scaffold file list and upload internals')
168
+ .option('--callback-url <url>', 'ChatGPT or Claude OAuth callback URL to register on the matching profile')
169
+ .option(
170
+ '--target <profile>',
171
+ 'MCP client installation profile when the channel is mcp-client (cursor, vscode, github-copilot)'
172
+ )
173
+ .option('--profile <profile>', 'Alias for --target (MCP client installation profile)')
174
+ .option('--allow-experimental', 'Allow experimental targets such as web-embed')
175
+ .option('--json', 'Machine-readable install envelope (no TTY glyphs)');
176
+ }
177
+
178
+ /**
179
+ * @param {{ deprecatedVia?: string }} meta
180
+ * @returns {Function}
181
+ */
182
+ function handleChannelAddAction(meta) {
183
+ return async(channelTarget, options) => {
184
+ try {
185
+ await runChannelAddAction(channelTarget, options, meta);
186
+ } catch (error) {
187
+ handleChannelAddError(error);
188
+ }
189
+ };
190
+ }
191
+
192
+ /**
193
+ * @param {import('commander').Command} parent
194
+ * @param {{ deprecatedVia?: string, commandName?: string, hidden?: boolean }} [meta]
195
+ * @returns {import('commander').Command}
196
+ */
197
+ function registerChannelAddCommand(parent, meta = {}) {
198
+ const description =
199
+ 'Scaffold (if needed), upload (if needed/--force), then configure channel install';
200
+ const commandName = meta.commandName || 'add [channelTarget]';
201
+ const cmd = meta.hidden
202
+ ? parent.command(commandName, { hidden: true })
203
+ : parent.command(commandName);
204
+ cmd.description(meta.deprecatedVia ? `(deprecated) ${description}` : description);
205
+ attachChannelAddOptions(cmd);
206
+ configureChannelAddHelp(cmd);
207
+ cmd.addHelpText('after', () => channelAddHelpAfter(resolveChannelAddHelpTarget()));
208
+ cmd.action(handleChannelAddAction(meta));
128
209
  return cmd;
129
210
  }
130
211
 
131
212
  module.exports = {
132
213
  CHANNEL_ADD_HELP_AFTER,
133
214
  registerChannelAddCommand,
134
- runChannelAddAction
215
+ runChannelAddAction,
216
+ resolveChannelAddSelection
135
217
  };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Register `channel configure` (callback URL on the existing Integration Client).
3
+ *
4
+ * @fileoverview Thin wrapper over Integration Client redirect URI update
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const logger = require('../utils/logger');
10
+ const {
11
+ formatWarningLine,
12
+ formatBlockingError
13
+ } = require('../utils/cli-layout-chalk');
14
+ const { printCallbackRegistered } = require('../channels/channel-add-tty');
15
+ const { isChannelTargetKey, formatUnknownChannelTargetError } = require('../channels/channel-targets');
16
+ const { resolveChannelAuthContext } = require('../channels/channel-auth-context');
17
+ const { registerChatGptCallbackUrl } = require('../channels/chatgpt-callback');
18
+ const { runChatGptConfigureValidate } = require('../channels/chatgpt-channel-add');
19
+ const { registerClaudeCallbackUrl } = require('../channels/claude-callback');
20
+ const { runClaudeConfigureValidate } = require('../channels/claude-channel-add');
21
+
22
+ const CONFIGURE_TARGETS = new Set(['chatgpt', 'claude']);
23
+
24
+ const CHANNEL_CONFIGURE_HELP_AFTER = `
25
+ Examples:
26
+ $ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
27
+ $ aifabrix channel configure claude --callback-url "https://claude.ai/api/mcp/auth_callback"
28
+
29
+ Registers an HTTPS OAuth callback on the existing ChatGPT or Claude Integration Client.
30
+ Does not rotate the client secret. Extra redirect URIs are preserved.
31
+
32
+ Requires: aifabrix login and integration-client:read plus integration-client:update
33
+ `;
34
+
35
+ /**
36
+ * @param {string} channelTarget
37
+ * @param {Object} ctx
38
+ * @param {string} callbackUrl
39
+ * @returns {Promise<Object>}
40
+ */
41
+ async function registerConfigureCallback(channelTarget, ctx, callbackUrl) {
42
+ if (channelTarget === 'claude') {
43
+ return registerClaudeCallbackUrl({ ctx, callbackUrl });
44
+ }
45
+ return registerChatGptCallbackUrl({ ctx, callbackUrl });
46
+ }
47
+
48
+ /**
49
+ * @param {string} channelTarget
50
+ * @param {Object} ctx
51
+ * @returns {Promise<void>}
52
+ */
53
+ async function validateAfterConfigure(channelTarget, ctx) {
54
+ if (channelTarget === 'claude') {
55
+ await runClaudeConfigureValidate(ctx);
56
+ return;
57
+ }
58
+ await runChatGptConfigureValidate(ctx);
59
+ }
60
+
61
+ /**
62
+ * @param {string} channelTarget
63
+ * @param {Object} options
64
+ * @returns {Promise<void>}
65
+ */
66
+ async function runChannelConfigure(channelTarget, options = {}) {
67
+ if (!isChannelTargetKey(channelTarget)) {
68
+ throw new Error(formatUnknownChannelTargetError(channelTarget));
69
+ }
70
+ if (!CONFIGURE_TARGETS.has(channelTarget)) {
71
+ throw new Error(
72
+ `channel configure currently supports chatgpt and claude. Received "${channelTarget}".`
73
+ );
74
+ }
75
+ const callbackUrl =
76
+ typeof options.callbackUrl === 'string' ? options.callbackUrl.trim() : '';
77
+ if (!callbackUrl) {
78
+ throw new Error(`--callback-url is required for channel configure ${channelTarget}.`);
79
+ }
80
+ const ctx = await resolveChannelAuthContext(channelTarget, { silent: true });
81
+ const result = await registerConfigureCallback(channelTarget, ctx, callbackUrl);
82
+ if (result.fallback) {
83
+ logger.log(
84
+ formatWarningLine(
85
+ `Missing integration-client:update. Add the callback on the ${channelTarget} profile: ${result.profileUrl}`
86
+ )
87
+ );
88
+ return;
89
+ }
90
+ printCallbackRegistered();
91
+ await validateAfterConfigure(channelTarget, ctx);
92
+ }
93
+
94
+ /**
95
+ * @param {import('commander').Command} parent
96
+ * @returns {import('commander').Command}
97
+ */
98
+ function registerChannelConfigureCommand(parent) {
99
+ return parent
100
+ .command('configure <channelTarget>')
101
+ .description('Register a ChatGPT or Claude callback URL on the existing OAuth2 profile')
102
+ .option('--callback-url <url>', 'HTTPS redirect URI from ChatGPT or Claude OAuth')
103
+ .addHelpText('after', CHANNEL_CONFIGURE_HELP_AFTER)
104
+ .action(async(channelTarget, options) => {
105
+ try {
106
+ await runChannelConfigure(channelTarget, options);
107
+ } catch (error) {
108
+ logger.error(formatBlockingError(error.message || String(error)));
109
+ process.exit(1);
110
+ }
111
+ });
112
+ }
113
+
114
+ module.exports = {
115
+ CHANNEL_CONFIGURE_HELP_AFTER,
116
+ registerChannelConfigureCommand,
117
+ runChannelConfigure
118
+ };
@@ -22,15 +22,23 @@ const {
22
22
  } = require('../channels/channel-targets');
23
23
  const { scaffoldChannelIntegration } = require('../channels/channel-integration-generator');
24
24
  const { registerChannelAddCommand } = require('./channel-add-setup');
25
+ const { registerChannelConfigureCommand } = require('./channel-configure');
25
26
 
26
27
  const CHANNEL_HELP_AFTER = `
27
28
  Subcommands:
28
- add <target> One command: scaffold (if needed) → upload (if needed/--force) → install
29
+ add [target] One command: scaffold (if needed) → upload (if needed/--force) → install
30
+ configure chatgpt Register the ChatGPT callback URL on the existing OAuth2 profile
29
31
  scaffold <target> Optional: create integration/<target>/ files only (local)
30
32
 
31
33
  ${formatSupportedChannelTargetsHelp()}
32
34
 
35
+ Examples:
36
+ $ aifabrix channel add
37
+ $ aifabrix channel add slack --name "Elsa" --probe
38
+ $ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
39
+
33
40
  Typical flow:
41
+ aifabrix channel add
34
42
  aifabrix channel add slack --name "Elsa" --probe
35
43
 
36
44
  # Force re-upload of the communication system, then reinstall channel
@@ -102,6 +110,7 @@ function setupChannelCommands(program) {
102
110
  });
103
111
 
104
112
  registerChannelAddCommand(channel);
113
+ registerChannelConfigureCommand(channel);
105
114
  }
106
115
 
107
116
  module.exports = { setupChannelCommands };
@@ -4,7 +4,10 @@
4
4
 
5
5
  'use strict';
6
6
 
7
- const { uploadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
7
+ const {
8
+ uploadGovernanceScenarioPacks,
9
+ normalizeGovernanceUploadResult
10
+ } = require('../lifecycle/scenario-upload');
8
11
  const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
9
12
 
10
13
  /**
@@ -18,7 +21,7 @@ async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
18
21
  systemKey,
19
22
  options
20
23
  );
21
- const uploaded = await uploadGovernanceScenarioPacks(
24
+ const result = await uploadGovernanceScenarioPacks(
22
25
  resolvedKey,
23
26
  dataplaneUrl,
24
27
  authConfig,
@@ -27,7 +30,7 @@ async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
27
30
  return {
28
31
  systemKey: resolvedKey,
29
32
  command: 'governance upload',
30
- uploaded
33
+ ...normalizeGovernanceUploadResult(result)
31
34
  };
32
35
  }
33
36
 
@@ -14,6 +14,7 @@ const { displayLifecycleReportTTY } = require('../lifecycle/report-display');
14
14
  const { VERDICT } = require('../lifecycle/product-model');
15
15
  const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
16
16
  const { lifecycleHasGovernanceSubjects } = require('../lifecycle/lifecycle-governance-options');
17
+ const { lifecyclePillarSatisfied } = require('../lifecycle/role-assistant-governance');
17
18
 
18
19
  /**
19
20
  * @param {Object} options
@@ -48,11 +49,7 @@ function lifecycleVerdictFromReport(report) {
48
49
  if (ops === VERDICT.FAILED || trust === VERDICT.FAILED || gov === VERDICT.FAILED) {
49
50
  return VERDICT.FAILED;
50
51
  }
51
- if (
52
- ops === VERDICT.VERIFIED &&
53
- trust === VERDICT.VERIFIED &&
54
- gov === VERDICT.VERIFIED
55
- ) {
52
+ if (lifecyclePillarSatisfied(ops) && lifecyclePillarSatisfied(trust) && lifecyclePillarSatisfied(gov)) {
56
53
  return VERDICT.VERIFIED;
57
54
  }
58
55
  return VERDICT.NOT_VERIFIED;