@aifabrix/builder 2.53.1 → 2.55.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 (470) hide show
  1. package/README.md +8 -0
  2. package/bin/aifabrix.js +2 -2
  3. package/lib/agent-kit/apply-ops.js +82 -0
  4. package/lib/agent-kit/checksums.js +28 -0
  5. package/lib/agent-kit/classify.js +113 -0
  6. package/lib/agent-kit/claude-shim.js +61 -0
  7. package/lib/agent-kit/constants.js +55 -0
  8. package/lib/agent-kit/file-list.js +103 -0
  9. package/lib/agent-kit/host-approve.js +130 -0
  10. package/lib/agent-kit/hosting/github.js +63 -0
  11. package/lib/agent-kit/hosts.js +71 -0
  12. package/lib/agent-kit/init.js +319 -0
  13. package/lib/agent-kit/kit-root.js +17 -0
  14. package/lib/agent-kit/managed-section.js +79 -0
  15. package/lib/agent-kit/package-load.js +45 -0
  16. package/lib/agent-kit/plan-ops.js +69 -0
  17. package/lib/agent-kit/remote-prompts.js +239 -0
  18. package/lib/agent-kit/render-host-markdown.js +40 -0
  19. package/lib/agent-kit/repo-guard.js +47 -0
  20. package/lib/agent-kit/report.js +107 -0
  21. package/lib/agent-kit/run.js +82 -0
  22. package/lib/agent-kit/scm/git.js +122 -0
  23. package/lib/agent-kit/state-file.js +83 -0
  24. package/lib/agent-kit/status.js +50 -0
  25. package/lib/agent-kit/v1-detect.js +81 -0
  26. package/lib/agent-kit/validate-kit.js +87 -0
  27. package/lib/agent-kit/workspace-name.js +40 -0
  28. package/lib/agent-kit/workspace-skeleton.js +103 -0
  29. package/lib/api/assistants.api.js +8 -5
  30. package/lib/api/channel-identity.api.js +41 -0
  31. package/lib/api/evidence-authoring.api.js +5 -1
  32. package/lib/api/evidence.api.js +2 -0
  33. package/lib/api/role-assistant-test-pack.api.js +86 -0
  34. package/lib/api/types/evidence.types.js +2 -0
  35. package/lib/api/work-search.api.js +163 -0
  36. package/lib/api/work.api.js +19 -12
  37. package/lib/app/list-external-systems.js +2 -1
  38. package/lib/app/show-display.js +33 -6
  39. package/lib/app/show.js +25 -2
  40. package/lib/channels/add-channel.js +164 -126
  41. package/lib/channels/approval-guides/chatgpt.js +14 -18
  42. package/lib/channels/approval-guides/claude.js +29 -0
  43. package/lib/channels/approval-guides/index.js +88 -22
  44. package/lib/channels/approval-guides/mcp-client.js +27 -0
  45. package/lib/channels/approval-guides/microsoft-copilot.js +52 -3
  46. package/lib/channels/approval-guides/slack.js +10 -10
  47. package/lib/channels/approval-guides/teams-bot.js +8 -12
  48. package/lib/channels/channel-add-continuations.js +91 -0
  49. package/lib/channels/channel-add-ensure.js +124 -27
  50. package/lib/channels/channel-add-existing.js +160 -28
  51. package/lib/channels/channel-add-failure.js +61 -0
  52. package/lib/channels/channel-add-remaining.js +492 -0
  53. package/lib/channels/channel-add-tty.js +190 -0
  54. package/lib/channels/channel-add-wizard-config.js +138 -0
  55. package/lib/channels/channel-add-wizard.js +250 -0
  56. package/lib/channels/channel-artifact-generator.js +27 -13
  57. package/lib/channels/channel-cardinality.js +83 -0
  58. package/lib/channels/channel-catalog-icon.js +45 -0
  59. package/lib/channels/channel-cli-instructions.js +75 -0
  60. package/lib/channels/channel-configuration-map.js +213 -0
  61. package/lib/channels/channel-credential.js +11 -14
  62. package/lib/channels/channel-definition-project.js +101 -0
  63. package/lib/channels/channel-definition-registry.js +154 -0
  64. package/lib/channels/channel-definition-status.js +115 -0
  65. package/lib/channels/channel-description.js +60 -2
  66. package/lib/channels/channel-discovery.js +16 -2
  67. package/lib/channels/channel-external-system.js +86 -9
  68. package/lib/channels/channel-install-envelope-actions.js +88 -0
  69. package/lib/channels/channel-install-envelope-microsoft.js +155 -0
  70. package/lib/channels/channel-install-envelope.js +358 -0
  71. package/lib/channels/channel-install-help-md.js +172 -0
  72. package/lib/channels/channel-install-http-payload.js +62 -0
  73. package/lib/channels/channel-install-inventory.js +115 -0
  74. package/lib/channels/channel-install-profiles.js +90 -0
  75. package/lib/channels/channel-instance-collision.js +118 -0
  76. package/lib/channels/channel-instance-key.js +100 -0
  77. package/lib/channels/channel-instance-materialize.js +240 -0
  78. package/lib/channels/channel-integration-generator.js +18 -9
  79. package/lib/channels/channel-integration-template.js +101 -22
  80. package/lib/channels/channel-inventory-fetch.js +79 -0
  81. package/lib/channels/channel-oauth-preflight.js +104 -0
  82. package/lib/channels/channel-package-version.js +76 -0
  83. package/lib/channels/channel-predefined-client.js +154 -0
  84. package/lib/channels/channel-probe.js +7 -2
  85. package/lib/channels/channel-runtime-resolver.js +194 -72
  86. package/lib/channels/channel-status-display.js +86 -16
  87. package/lib/channels/channel-targets.js +132 -92
  88. package/lib/channels/chatgpt-callback.js +318 -0
  89. package/lib/channels/chatgpt-channel-add.js +229 -0
  90. package/lib/channels/chatgpt-preflight.js +396 -0
  91. package/lib/channels/chatgpt-runtime-contract.js +17 -0
  92. package/lib/channels/chatgpt-setup-values.js +124 -0
  93. package/lib/channels/claude-callback.js +67 -0
  94. package/lib/channels/claude-channel-add.js +254 -0
  95. package/lib/channels/claude-runtime-contract.js +40 -0
  96. package/lib/channels/claude-runtime.js +58 -0
  97. package/lib/channels/claude-setup-values.js +92 -0
  98. package/lib/channels/mcp-client/config-merge.js +148 -0
  99. package/lib/channels/mcp-client/ensure-client.js +231 -0
  100. package/lib/channels/mcp-client/paths.js +53 -0
  101. package/lib/channels/mcp-client/profiles.js +122 -0
  102. package/lib/channels/mcp-client/redirect-uris.js +99 -0
  103. package/lib/channels/mcp-client/runtime.js +59 -0
  104. package/lib/channels/mcp-client-channel-add.js +186 -0
  105. package/lib/channels/microsoft-copilot-channel-add.js +117 -7
  106. package/lib/channels/microsoft-copilot-entra-identifier-uris.js +187 -0
  107. package/lib/channels/microsoft-copilot-entra-sso-form.js +106 -18
  108. package/lib/channels/microsoft-copilot-entra-sso.js +31 -2
  109. package/lib/channels/microsoft-copilot-package-prior.js +107 -0
  110. package/lib/channels/microsoft-copilot-package.js +29 -28
  111. package/lib/channels/microsoft-provisioning/a365.js +80 -0
  112. package/lib/channels/microsoft-provisioning/auth-config.js +240 -0
  113. package/lib/channels/microsoft-provisioning/auth.js +179 -0
  114. package/lib/channels/microsoft-provisioning/cli.js +71 -0
  115. package/lib/channels/microsoft-provisioning/constants.js +75 -0
  116. package/lib/channels/microsoft-provisioning/errors.js +117 -0
  117. package/lib/channels/microsoft-provisioning/index.js +55 -0
  118. package/lib/channels/microsoft-provisioning/install-atk.js +158 -0
  119. package/lib/channels/microsoft-provisioning/install-teams.js +115 -0
  120. package/lib/channels/microsoft-provisioning/login-portal-device.js +236 -0
  121. package/lib/channels/microsoft-provisioning/login-portal-parse.js +71 -0
  122. package/lib/channels/microsoft-provisioning/login-portal-teams.js +193 -0
  123. package/lib/channels/microsoft-provisioning/login-portal.js +230 -0
  124. package/lib/channels/microsoft-provisioning/persist.js +110 -0
  125. package/lib/channels/microsoft-provisioning/teams-bot-args.js +119 -0
  126. package/lib/channels/microsoft-provisioning/teams-bot-controller.js +123 -0
  127. package/lib/channels/microsoft-provisioning/teams-bot-parse.js +134 -0
  128. package/lib/channels/microsoft-provisioning/teams-bot-persist.js +113 -0
  129. package/lib/channels/microsoft-provisioning/teams-bot-provision.js +234 -0
  130. package/lib/channels/microsoft-provisioning/teams-bot-secrets.js +45 -0
  131. package/lib/channels/microsoft-provisioning/teams-cli.js +82 -0
  132. package/lib/channels/runtime-tool-catalog.js +5 -2
  133. package/lib/channels/slack-channel-add-portal.js +130 -0
  134. package/lib/channels/slack-channel-add-tty-auth.js +95 -0
  135. package/lib/channels/slack-channel-add.js +311 -0
  136. package/lib/channels/slack-mcp-callback.js +51 -0
  137. package/lib/channels/slack-mcp-runtime.js +156 -0
  138. package/lib/channels/slack-provisioning/apps.js +181 -0
  139. package/lib/channels/slack-provisioning/auth-store.js +110 -0
  140. package/lib/channels/slack-provisioning/auth-ticket.js +185 -0
  141. package/lib/channels/slack-provisioning/auth.js +115 -0
  142. package/lib/channels/slack-provisioning/callbacks.js +41 -0
  143. package/lib/channels/slack-provisioning/cli.js +226 -0
  144. package/lib/channels/slack-provisioning/constants.js +37 -0
  145. package/lib/channels/slack-provisioning/credentials.js +169 -0
  146. package/lib/channels/slack-provisioning/curl-shim.js +132 -0
  147. package/lib/channels/slack-provisioning/developer-install.js +118 -0
  148. package/lib/channels/slack-provisioning/env-file.js +120 -0
  149. package/lib/channels/slack-provisioning/errors.js +47 -0
  150. package/lib/channels/slack-provisioning/go-ca-bundle.js +137 -0
  151. package/lib/channels/slack-provisioning/index.js +250 -0
  152. package/lib/channels/slack-provisioning/install-cli.js +335 -0
  153. package/lib/channels/slack-provisioning/manifest.js +89 -0
  154. package/lib/channels/slack-provisioning/oauth-lock.js +33 -0
  155. package/lib/channels/slack-provisioning/offer-cli.js +113 -0
  156. package/lib/channels/slack-provisioning/onboard-members.js +122 -0
  157. package/lib/channels/slack-provisioning/onboard.js +89 -0
  158. package/lib/channels/slack-provisioning/persist.js +95 -0
  159. package/lib/channels/slack-provisioning/remaining-urls.js +158 -0
  160. package/lib/channels/slack-provisioning/with-curl-on-path.js +53 -0
  161. package/lib/channels/teams-bot-channel-add.js +94 -0
  162. package/lib/channels/vendor-dataplane-url.js +249 -0
  163. package/lib/cli/index.js +4 -0
  164. package/lib/cli/setup-certification-commands.js +2 -2
  165. package/lib/cli/setup-certification.help.js +5 -1
  166. package/lib/cli/setup-external-system-help.js +2 -0
  167. package/lib/cli/setup-external-system.js +1 -1
  168. package/lib/commands/agent-kit-help.js +79 -0
  169. package/lib/commands/agent-kit.js +346 -0
  170. package/lib/commands/channel-add-help.js +366 -0
  171. package/lib/commands/channel-add-setup.js +162 -80
  172. package/lib/commands/channel-configure.js +118 -0
  173. package/lib/commands/channel.js +10 -1
  174. package/lib/commands/datasource-capability-relate-cli.js +5 -4
  175. package/lib/commands/governance-upload-external.js +6 -3
  176. package/lib/commands/lifecycle-command-action.js +2 -5
  177. package/lib/commands/lifecycle-external.js +93 -21
  178. package/lib/commands/repair-auth-apply.js +1 -1
  179. package/lib/commands/repair-datasource-key-skip.js +39 -0
  180. package/lib/commands/repair-datasource-keys.js +24 -12
  181. package/lib/commands/repair-datasource-test-payload.js +4 -2
  182. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +23 -2
  183. package/lib/commands/repair-datasource.js +3 -0
  184. package/lib/commands/repair-external-run.js +59 -25
  185. package/lib/commands/repair-openapi-rest-runtime.js +127 -0
  186. package/lib/commands/repair-orchestration-tag-merge.js +339 -0
  187. package/lib/commands/repair-rbac-catalog-defaults.js +96 -0
  188. package/lib/commands/repair-rbac-platform-preset.js +26 -15
  189. package/lib/commands/repair-rbac-reader-roles.js +8 -21
  190. package/lib/commands/repair-rbac.js +26 -44
  191. package/lib/commands/repair-system-permissions.js +24 -22
  192. package/lib/commands/role-assistant-copy-output.js +61 -0
  193. package/lib/commands/role-assistant-copy.js +155 -0
  194. package/lib/commands/role-assistant-test-output.js +22 -9
  195. package/lib/commands/role-assistant-test-result-rows.js +42 -0
  196. package/lib/commands/role-assistant.js +150 -43
  197. package/lib/commands/search.js +143 -0
  198. package/lib/commands/test-e2e-external.js +148 -21
  199. package/lib/commands/test-trust-external.js +7 -5
  200. package/lib/commands/upload-credential-push-log.js +2 -1
  201. package/lib/commands/upload-publish-context.js +1 -1
  202. package/lib/commands/upload-role-assistant-shell.js +124 -0
  203. package/lib/commands/upload-sidecar-followups.js +10 -4
  204. package/lib/commands/upload.js +18 -3
  205. package/lib/commands/verify-operations-skip-e2e.js +131 -0
  206. package/lib/commands/verify-operations-step-plan.js +6 -33
  207. package/lib/commands/verify-operations-steps.js +3 -1
  208. package/lib/core/secrets-docker-env.js +4 -1
  209. package/lib/core/secrets-env-content.js +17 -3
  210. package/lib/datasource/capability/capability-manifest.js +0 -3
  211. package/lib/datasource/capability/copy-test-payload.js +3 -0
  212. package/lib/datasource/capability/relate-operations.js +28 -10
  213. package/lib/datasource/capability/run-capability-relate.js +48 -25
  214. package/lib/datasource/datasource-identifier.js +13 -5
  215. package/lib/deployment/deployer-poll-run.js +117 -35
  216. package/lib/external-system/deploy-dataplane-published.js +70 -0
  217. package/lib/external-system/deploy-helpers.js +26 -1
  218. package/lib/external-system/deploy.js +22 -8
  219. package/lib/external-system/download-helpers.js +29 -2
  220. package/lib/external-system/download-role-assistant.js +109 -4
  221. package/lib/external-system/download.js +46 -30
  222. package/lib/external-system/sync-deploy-manifest.js +3 -2
  223. package/lib/external-system/upload-identity.js +42 -0
  224. package/lib/generator/index.js +19 -15
  225. package/lib/generator/split.js +13 -2
  226. package/lib/generator/wizard-datasource-key.js +54 -0
  227. package/lib/generator/wizard.js +55 -54
  228. package/lib/integration-definition/apply-datasource-keys.js +75 -0
  229. package/lib/integration-definition/apply-relationships.js +195 -0
  230. package/lib/integration-definition/apply-static-enterprise.js +229 -0
  231. package/lib/integration-definition/apply-system-file.js +71 -0
  232. package/lib/integration-definition/apply-test-endpoint.js +89 -0
  233. package/lib/integration-definition/apply-viewpoint-defaults.js +157 -0
  234. package/lib/integration-definition/apply.js +78 -59
  235. package/lib/integration-definition/enrich-openapi-operations.js +36 -10
  236. package/lib/integration-definition/enrich-openapi-pick.js +87 -0
  237. package/lib/lifecycle/role-assistant-governance.js +181 -0
  238. package/lib/lifecycle/scenario-upload.js +181 -30
  239. package/lib/programmatic/builder-api-cors.js +143 -0
  240. package/lib/programmatic/builder-api-request.js +6 -0
  241. package/lib/programmatic/builder-api-route-dispatch.js +56 -42
  242. package/lib/programmatic/builder-api-server.js +8 -1
  243. package/lib/programmatic/capability-registry.js +55 -0
  244. package/lib/programmatic/channel-install-help-resolve.js +359 -0
  245. package/lib/programmatic/channel-install-session.js +218 -0
  246. package/lib/programmatic/help-content/channel-onboarding.md +2 -0
  247. package/lib/programmatic/help-content/cip-overview.md +3 -1
  248. package/lib/programmatic/http-raw-response.js +62 -0
  249. package/lib/programmatic/index.js +2 -0
  250. package/lib/programmatic/openapi-apply-result-schemas.js +8 -0
  251. package/lib/programmatic/openapi-channel-install-bindings.js +179 -0
  252. package/lib/programmatic/openapi-channel-install-schemas.js +289 -0
  253. package/lib/programmatic/openapi-component-schemas.js +19 -1
  254. package/lib/programmatic/openapi-description-enricher.js +3 -1
  255. package/lib/programmatic/openapi-descriptions.js +80 -3
  256. package/lib/programmatic/openapi-envelope-examples.js +124 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +9 -1
  258. package/lib/programmatic/openapi-request-schemas.js +5 -0
  259. package/lib/programmatic/openapi-schema-descriptions-channel.js +319 -0
  260. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  261. package/lib/programmatic/openapi-spec.js +13 -8
  262. package/lib/programmatic/platform-rbac-catalog.js +36 -18
  263. package/lib/programmatic/request-timeout.js +3 -0
  264. package/lib/programmatic/route-handler-map.js +58 -1
  265. package/lib/programmatic/route-handlers-context.js +2 -1
  266. package/lib/programmatic/run-auth-permissions.js +54 -0
  267. package/lib/programmatic/run-channel-catalog.js +238 -0
  268. package/lib/programmatic/run-channel-install-artifacts.js +137 -0
  269. package/lib/programmatic/run-channel-install-copilot.js +353 -0
  270. package/lib/programmatic/run-channel-install-options.js +236 -0
  271. package/lib/programmatic/run-channel-install-teams-bot.js +204 -0
  272. package/lib/programmatic/run-channel-install.js +346 -0
  273. package/lib/programmatic/run-channel-package.js +87 -7
  274. package/lib/programmatic/run-download.js +41 -0
  275. package/lib/programmatic/workspace-context.js +2 -0
  276. package/lib/protection/auth-context.js +3 -1
  277. package/lib/protection/protection-display.js +3 -2
  278. package/lib/protection/report-exit.js +50 -0
  279. package/lib/protection/run-commands.js +2 -0
  280. package/lib/role-assistant/evidence-sync.js +4 -2
  281. package/lib/role-assistant/evidence-validation-issues.js +51 -0
  282. package/lib/role-assistant/knowledge-sync.js +10 -4
  283. package/lib/role-assistant/package-validate.js +175 -0
  284. package/lib/role-assistant/settings.js +49 -2
  285. package/lib/role-assistant/test-case-assertion-row.js +36 -0
  286. package/lib/role-assistant/test-case-copy-bind.js +77 -0
  287. package/lib/role-assistant/test-case-copy-expected.js +127 -0
  288. package/lib/role-assistant/test-case-copy-from-work.js +90 -0
  289. package/lib/role-assistant/test-case-copy-interactions.js +67 -0
  290. package/lib/role-assistant/test-case-copy.js +119 -0
  291. package/lib/role-assistant/test-case-expected-catalog.js +135 -0
  292. package/lib/role-assistant/test-case-validate.js +88 -0
  293. package/lib/role-assistant/test-cases-bid.js +117 -4
  294. package/lib/role-assistant/test-cases-evaluate.js +159 -24
  295. package/lib/role-assistant/test-cases-evidence.js +175 -0
  296. package/lib/role-assistant/test-cases-honesty.js +155 -6
  297. package/lib/role-assistant/test-cases-lifecycle.js +291 -0
  298. package/lib/role-assistant/test-cases-search-graph.js +122 -0
  299. package/lib/role-assistant/test-cases-search.js +247 -0
  300. package/lib/role-assistant/test-cases.js +71 -172
  301. package/lib/role-assistant/test-pack-map.js +180 -0
  302. package/lib/role-assistant/test-pack-sync.js +187 -0
  303. package/lib/role-assistant/test-runner-debug.js +54 -0
  304. package/lib/role-assistant/test-runner-respond-body.js +36 -0
  305. package/lib/role-assistant/test-runner-search.js +164 -0
  306. package/lib/role-assistant/test-runner-start-payload.js +63 -10
  307. package/lib/role-assistant/test-runner-workhub-answers.js +45 -16
  308. package/lib/role-assistant/test-runner-workhub-helpers.js +40 -2
  309. package/lib/role-assistant/test-runner-workhub-soft.js +9 -3
  310. package/lib/role-assistant/test-runner-workhub.js +74 -32
  311. package/lib/role-assistant/test-runner.js +66 -11
  312. package/lib/schema/external-datasource.schema.json +146 -21
  313. package/lib/schema/external-system.schema.json +177 -2
  314. package/lib/schema/mcp-client-profile.schema.json +103 -0
  315. package/lib/schema/role-assistant-test-case.schema.json +408 -0
  316. package/lib/search/dataplane-context.js +23 -0
  317. package/lib/search/search-args.js +211 -0
  318. package/lib/search/search-display.js +238 -0
  319. package/lib/search/search-errors.js +50 -0
  320. package/lib/search/search-prompts.js +119 -0
  321. package/lib/search/search-roles.js +85 -0
  322. package/lib/search/search-run.js +241 -0
  323. package/lib/search/search-skills.js +198 -0
  324. package/lib/utils/app-path-resolve.js +4 -0
  325. package/lib/utils/authentication-env-template.js +44 -6
  326. package/lib/utils/authentication-slot-show.js +153 -0
  327. package/lib/utils/credential-display.js +43 -1
  328. package/lib/utils/credential-secrets-env.js +6 -1
  329. package/lib/utils/env-copy.js +19 -7
  330. package/lib/utils/external-env-template.js +20 -2
  331. package/lib/utils/external-system-readiness-compact-blocks.js +5 -1
  332. package/lib/utils/external-system-readiness-compact-display.js +30 -1
  333. package/lib/utils/external-system-validators.js +2 -1
  334. package/lib/utils/help-builder.js +3 -1
  335. package/lib/utils/paths.js +18 -1
  336. package/lib/utils/platform-shell-package.js +69 -0
  337. package/lib/utils/port-resolver.js +50 -1
  338. package/lib/utils/rewrite-name-flag.js +20 -0
  339. package/lib/utils/role-assistant-paths.js +13 -10
  340. package/lib/utils/schema-loader.js +37 -0
  341. package/lib/utils/schema-resolver.js +11 -1
  342. package/lib/utils/secrets-helpers.js +12 -21
  343. package/lib/utils/token-manager.js +10 -5
  344. package/lib/validation/validate-external-file.js +5 -1
  345. package/lib/validation/validate.js +41 -0
  346. package/package.json +1 -1
  347. package/templates/README.md +1 -1
  348. package/templates/agent-kit/adapters/claude/nested.CLAUDE.md +1 -0
  349. package/templates/agent-kit/adapters/claude/root.CLAUDE.md +5 -0
  350. package/templates/agent-kit/adapters/cursor/commands/cust-0-plan.md +5 -0
  351. package/templates/agent-kit/adapters/cursor/commands/cust-1-validate.md +5 -0
  352. package/templates/agent-kit/adapters/cursor/commands/cust-2-build.md +5 -0
  353. package/templates/agent-kit/adapters/cursor/commands/cust-3-push.md +5 -0
  354. package/templates/agent-kit/adapters/cursor/commands/cust-biz-1-validate.md +5 -0
  355. package/templates/agent-kit/adapters/cursor/commands/cust-biz-2-build.md +5 -0
  356. package/templates/agent-kit/adapters/cursor/commands/cust-biz-3-prove.md +5 -0
  357. package/templates/agent-kit/agent-kit.yaml +45 -0
  358. package/templates/agent-kit/instructions/AGENTKIT.md +83 -0
  359. package/templates/agent-kit/instructions/integration.AGENTS.md +25 -0
  360. package/templates/agent-kit/instructions/role-assistant.AGENTS.md +22 -0
  361. package/templates/agent-kit/instructions/root.AGENTS.md +37 -0
  362. package/templates/agent-kit/parity-inventory.yaml +188 -0
  363. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +58 -0
  364. package/templates/agent-kit/skills/aifabrix-connected-system/references/contract-checklist.md +40 -0
  365. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +54 -0
  366. package/templates/agent-kit/skills/aifabrix-connected-system/references/production-safety.md +35 -0
  367. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/reserved-system-key.js +19 -0
  368. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +51 -0
  369. package/templates/agent-kit/skills/aifabrix-plan/references/challenge-checklist.md +108 -0
  370. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +34 -0
  371. package/templates/agent-kit/skills/aifabrix-plan/references/plan-template.md +182 -0
  372. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +50 -0
  373. package/templates/agent-kit/skills/aifabrix-prove/references/demo-template.md +65 -0
  374. package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +68 -0
  375. package/templates/agent-kit/skills/aifabrix-prove/references/learning-template.md +66 -0
  376. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +42 -0
  377. package/templates/agent-kit/skills/aifabrix-role-assistant/references/package-boundary.md +21 -0
  378. package/templates/agent-kit/skills/shared/hosts.md +78 -0
  379. package/templates/agent-kit/workspace/.cursor/plans/README.md +22 -0
  380. package/templates/agent-kit/workspace/LICENSE.mit +21 -0
  381. package/templates/agent-kit/workspace/README.md +89 -0
  382. package/templates/applications/builder-api/Dockerfile +3 -1
  383. package/templates/applications/builder-api/env.template +7 -0
  384. package/templates/applications/dataplane/application.yaml +6 -5
  385. package/templates/applications/dataplane/env.template +2 -2
  386. package/templates/applications/dataplane/rbac.yaml +35 -2
  387. package/templates/applications/keycloak/Dockerfile +30 -4
  388. package/templates/applications/keycloak/application.yaml +2 -2
  389. package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +896 -0
  390. package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +19 -0
  391. package/templates/applications/keycloak/env.template +3 -0
  392. package/templates/applications/miso-controller/application.yaml +1 -2
  393. package/templates/applications/miso-controller/env.template +10 -9
  394. package/templates/channels/README.md +5 -5
  395. package/templates/channels/chatgpt/TROUBLESHOOTING.md +51 -0
  396. package/templates/channels/chatgpt/channel.json +59 -0
  397. package/templates/channels/chatgpt/icon.svg +1 -0
  398. package/templates/channels/chatgpt/install.template.md.hbs +20 -95
  399. package/templates/channels/chatgpt/integration/README.md +1 -1
  400. package/templates/channels/chatgpt/integration/application.json +2 -2
  401. package/templates/channels/chatgpt/integration/chatgpt-system.json +49 -4
  402. package/templates/channels/chatgpt/integration/env.template +2 -4
  403. package/templates/channels/chatgpt/integration/rbac.json +13 -0
  404. package/templates/channels/claude/TROUBLESHOOTING.md +44 -0
  405. package/templates/channels/claude/channel.json +59 -0
  406. package/templates/channels/claude/icon.svg +1 -0
  407. package/templates/channels/claude/install.template.md.hbs +22 -0
  408. package/templates/channels/claude/integration/README.md +14 -0
  409. package/templates/channels/claude/integration/application.json +15 -0
  410. package/templates/channels/claude/integration/claude-system.json +59 -0
  411. package/templates/channels/claude/integration/env.template +2 -0
  412. package/templates/channels/claude/integration/rbac.json +13 -0
  413. package/templates/channels/claude/manifest.template.json.hbs +40 -0
  414. package/templates/channels/mcp-client/channel.json +72 -0
  415. package/templates/channels/mcp-client/icon.svg +1 -0
  416. package/templates/channels/mcp-client/install.template.md.hbs +24 -0
  417. package/templates/channels/mcp-client/integration/README.md +13 -0
  418. package/templates/channels/mcp-client/integration/application.json +15 -0
  419. package/templates/channels/mcp-client/integration/env.template +2 -0
  420. package/templates/channels/mcp-client/integration/mcp-client-system.json +72 -0
  421. package/templates/channels/mcp-client/integration/rbac.json +13 -0
  422. package/templates/channels/mcp-client/manifest.template.json.hbs +41 -0
  423. package/templates/channels/mcp-client/profiles/cursor.json +26 -0
  424. package/templates/channels/mcp-client/profiles/github-copilot.json +29 -0
  425. package/templates/channels/mcp-client/profiles/vscode.json +29 -0
  426. package/templates/channels/microsoft-copilot/channel.json +73 -0
  427. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +8 -4
  428. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +65 -5
  429. package/templates/channels/microsoft-copilot/icon.svg +1 -0
  430. package/templates/channels/microsoft-copilot/install.template.md.hbs +9 -9
  431. package/templates/channels/microsoft-copilot/integration/README.md +1 -1
  432. package/templates/channels/microsoft-copilot/integration/application.json +2 -2
  433. package/templates/channels/microsoft-copilot/integration/env.template +3 -6
  434. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +63 -4
  435. package/templates/channels/microsoft-copilot/integration/rbac.json +13 -0
  436. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +5 -5
  437. package/templates/channels/slack/channel.json +234 -0
  438. package/templates/channels/slack/icon.svg +1 -0
  439. package/templates/channels/slack/install.template.md.hbs +45 -28
  440. package/templates/channels/slack/integration/README.md +245 -22
  441. package/templates/channels/slack/integration/application.json +44 -7
  442. package/templates/channels/slack/integration/env.template +15 -6
  443. package/templates/channels/slack/integration/openapi/openapi.json +126 -0
  444. package/templates/channels/slack/integration/rbac.json +84 -0
  445. package/templates/channels/slack/integration/slack-datasource-commands.json +154 -0
  446. package/templates/channels/slack/integration/slack-datasource-conversations.json +28 -3
  447. package/templates/channels/slack/integration/slack-datasource-events.json +154 -0
  448. package/templates/channels/slack/integration/slack-datasource-interactive.json +154 -0
  449. package/templates/channels/slack/integration/slack-datasource-messages.json +40 -2
  450. package/templates/channels/slack/integration/slack-system.json +161 -72
  451. package/templates/channels/slack/manifest.template.json.hbs +10 -4
  452. package/templates/channels/teams-bot/channel.json +162 -0
  453. package/templates/channels/teams-bot/icon.svg +1 -0
  454. package/templates/channels/teams-bot/install.template.md.hbs +12 -13
  455. package/templates/channels/teams-bot/integration/README.md +5 -4
  456. package/templates/channels/teams-bot/integration/application.json +6 -4
  457. package/templates/channels/teams-bot/integration/env.template +5 -4
  458. package/templates/channels/teams-bot/integration/openapi/openapi.json +68 -0
  459. package/templates/channels/teams-bot/integration/rbac.json +21 -0
  460. package/templates/channels/teams-bot/integration/teams-bot-datasource-activities.json +154 -0
  461. package/templates/channels/teams-bot/integration/teams-bot-system.json +128 -23
  462. package/templates/channels/web-embed/channel.json +60 -0
  463. package/templates/channels/web-embed/install.template.md.hbs +1 -1
  464. package/templates/channels/web-embed/integration/README.md +2 -2
  465. package/templates/channels/web-embed/integration/application.json +2 -2
  466. package/templates/channels/web-embed/integration/env.template +1 -1
  467. package/templates/channels/web-embed/integration/rbac.json +13 -0
  468. package/templates/channels/web-embed/integration/web-embed-system.json +50 -4
  469. package/templates/python/docker-compose.hbs +14 -0
  470. package/templates/typescript/docker-compose.hbs +14 -0
@@ -9,9 +9,15 @@
9
9
  'use strict';
10
10
 
11
11
  const path = require('path');
12
- const { getChannelTarget, getDefaultChannelDescription } = require('./channel-targets');
12
+ const {
13
+ assertChannelTargetInstallable,
14
+ getDefaultChannelDescription
15
+ } = require('./channel-targets');
16
+ const { deriveChannelInstanceKey } = require('./channel-instance-key');
13
17
  const { resolveAppDescription } = require('./channel-description');
14
18
  const { resolveChannelRuntimeValues } = require('./channel-runtime-resolver');
19
+ const { vendorFacingUrlsFromCtx } = require('./vendor-dataplane-url');
20
+ const { applySlackPackageVersion } = require('./channel-package-version');
15
21
  const { generateChannelArtifact } = require('./channel-artifact-generator');
16
22
  const { fetchRuntimeLayerBToolNames } = require('./runtime-tool-catalog');
17
23
  const { loadChannelPackageContext } = require('./channel-discovery');
@@ -36,21 +42,30 @@ const { runChannelProbe } = require('./channel-probe');
36
42
  const { resolveChannelAuthContext } = require('./channel-auth-context');
37
43
  const { ensureChannelCredential } = require('./channel-credential');
38
44
  const {
39
- buildChannelApprovalGuide,
45
+ buildLiveInstallApprovalGuide,
40
46
  resolveApprovalPortalUrl
41
47
  } = require('./channel-approval-guide');
42
48
  const {
43
49
  normalizeBaseChannelName,
44
50
  resolveChannelDisplayName
45
51
  } = require('./channel-display-name');
46
- const { displayChannelInstallResult } = require('./channel-status-display');
52
+ const { printLiveChannelCanonicalTty } = require('./channel-add-remaining');
47
53
  const { ensureChannelReadyForAdd } = require('./channel-add-ensure');
48
- const { showExistingChannelStatus } = require('./channel-add-existing');
54
+ const { liveInstallTtyCtx, showExistingChannelStatus, shouldReturnSkippedChannel } = require('./channel-add-existing');
49
55
  const {
50
56
  assertMicrosoftCopilotOauthReference,
51
57
  assertMicrosoftCopilotOauthReferenceBeforeForce,
52
58
  loadMicrosoftCopilotEntraContext
53
59
  } = require('./microsoft-copilot-channel-add');
60
+ const {
61
+ maybeAssertMcpClientProfile
62
+ } = require('./mcp-client-channel-add');
63
+ const {
64
+ runChannelAddPreflights,
65
+ runChannelAddContinuations
66
+ } = require('./channel-add-continuations');
67
+ const { maybeProvisionSlackChannel, applySlackOnboardToCtx } = require('./slack-channel-add');
68
+ const { maybeProvisionTeamsBotChannel } = require('./teams-bot-channel-add');
54
69
 
55
70
  /**
56
71
  * @param {typeof import('./channel-targets').CHANNEL_TARGETS[string]} target
@@ -66,22 +81,6 @@ function resolveInstallStatus(target, channelExt, dryRun) {
66
81
  return 'installed';
67
82
  }
68
83
 
69
- /**
70
- * @param {Object|null} validation
71
- * @returns {Object|null}
72
- */
73
- function toValidationDisplay(validation) {
74
- if (!validation) return null;
75
- return {
76
- callbackReachable: validation.callbackReachable,
77
- credentialValid: validation.credentialValid,
78
- assistantCatalogReachable: validation.assistantCatalogReachable,
79
- inboundVerification: Object.values(validation.inboundVerification).every(Boolean),
80
- probeTiers: validation.probeTiers || null,
81
- runtimeChecks: validation.runtimeChecks || null
82
- };
83
- }
84
-
85
84
  /**
86
85
  * @param {string} channelTarget
87
86
  * @param {Object} artifactParams
@@ -102,6 +101,26 @@ function generateArtifactWithAudit(channelTarget, artifactParams) {
102
101
  }
103
102
  }
104
103
 
104
+ /**
105
+ * @param {string} channelTarget
106
+ * @param {Object} packageContext
107
+ * @param {Object} ctx
108
+ * @returns {Promise<string[]>}
109
+ */
110
+ async function resolveInstallLayerBToolNames(channelTarget, packageContext, ctx) {
111
+ const usesLayerB = channelTarget === 'chatgpt'
112
+ || channelTarget === 'microsoft-copilot'
113
+ || channelTarget === 'mcp-client'
114
+ || channelTarget === 'claude';
115
+ if (!usesLayerB) {
116
+ return [];
117
+ }
118
+ if (packageContext?.governedToolNames?.length > 0) {
119
+ return packageContext.governedToolNames;
120
+ }
121
+ return fetchRuntimeLayerBToolNames(ctx.dataplaneUrl, ctx.authConfig, channelTarget);
122
+ }
123
+
105
124
  /**
106
125
  * @param {Object} ctx
107
126
  * @param {string} channelTarget
@@ -113,7 +132,7 @@ function generateArtifactWithAudit(channelTarget, artifactParams) {
113
132
  async function patchConfigWithAudit(ctx, channelTarget, channelBlock, status, artifactHash) {
114
133
  try {
115
134
  await patchChannelExtension(
116
- { dataplaneUrl: ctx.dataplaneUrl, authConfig: ctx.authConfig, channelTarget },
135
+ { ...ctx, channelTarget },
117
136
  channelBlock
118
137
  );
119
138
  auditConfigPatched(channelTarget, { status, artifactHash });
@@ -156,18 +175,20 @@ async function maybeRunProbe(ctx, channelBlock, channelTarget, probe) {
156
175
  * @returns {Promise<{ target: Object, name: string, baseName: string, description: string, ctx: Object, existing: Object|null }>}
157
176
  */
158
177
  async function prepareChannelContext(channelTarget, options) {
159
- const target = getChannelTarget(channelTarget);
160
- if (target.experimental) {
161
- throw new Error(
162
- `Channel target "${channelTarget}" is experimental. Confirm product requirement before use.`
163
- );
164
- }
178
+ const target = assertChannelTargetInstallable(channelTarget, options);
165
179
  if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
166
180
  throw new Error('--name is required for channel add');
167
181
  }
168
182
 
169
183
  const baseName = normalizeBaseChannelName(options.name);
170
- const ctx = await resolveChannelAuthContext(channelTarget, { silent: options.quiet });
184
+ const ctx =
185
+ options.authContext && typeof options.authContext === 'object'
186
+ ? options.authContext
187
+ : await resolveChannelAuthContext(channelTarget, {
188
+ silent: options.verbose !== true
189
+ });
190
+ ctx.instanceSystemKey = options.systemKey;
191
+ ctx.projectRoot = options.projectRoot;
171
192
  const name = resolveChannelDisplayName(baseName, ctx.environment);
172
193
  const rawDescription =
173
194
  options.description && String(options.description).trim()
@@ -176,9 +197,9 @@ async function prepareChannelContext(channelTarget, options) {
176
197
  const description = resolveAppDescription(channelTarget, rawDescription);
177
198
 
178
199
  const system = await fetchCommunicationSystem({
179
- dataplaneUrl: ctx.dataplaneUrl,
180
- authConfig: ctx.authConfig,
181
- channelTarget
200
+ ...ctx,
201
+ channelTarget,
202
+ allowMissing: channelTarget === 'slack'
182
203
  });
183
204
  const existing = getExistingChannelExtension(system);
184
205
  return { target, name, baseName, description, ctx, existing };
@@ -189,58 +210,42 @@ async function prepareChannelContext(channelTarget, options) {
189
210
  * @returns {Promise<Object>}
190
211
  */
191
212
  async function completeLiveInstall(params) {
192
- const { ctx, channelTarget, channelBlock, status, artifact, target, name, baseName, options } = params;
193
-
213
+ const { ctx, channelTarget, channelBlock, status, artifact, target, options } = params;
194
214
  await ensureChannelCredential({
195
215
  ctx,
196
216
  channelTarget,
197
217
  target,
198
218
  force: options.force === true
199
219
  });
200
-
201
220
  await patchConfigWithAudit(ctx, channelTarget, channelBlock, status, artifact.artifactHash);
202
-
203
- const projectRoot = options.projectRoot || process.cwd();
204
- const approvalGuide =
205
- status === 'approvalRequired'
206
- ? buildChannelApprovalGuide(channelTarget, {
207
- projectRoot,
208
- name,
209
- baseName,
210
- artifactPath: artifact.outputPath,
211
- dataplaneBaseUrl: ctx.dataplaneUrl,
212
- environment: ctx.environment || options.environment || 'dev'
213
- })
214
- : null;
221
+ const approvalGuide = buildLiveInstallApprovalGuide(params);
215
222
  if (approvalGuide?.portalUrl) {
216
223
  auditApprovalRequired(channelTarget, { approvalUrl: approvalGuide.portalUrl });
217
224
  }
218
-
219
225
  const validation = await maybeRunProbe(ctx, channelBlock, channelTarget, options.probe);
220
-
221
- displayChannelInstallResult({
222
- channelTarget,
223
- name,
224
- baseName,
225
- statusLabel: status === 'approvalRequired' ? 'Approval required' : 'Installed',
226
- credentialKey: target.credentialKey,
227
- capabilities: target.capabilities,
228
- artifactPath: artifact.outputPath,
229
- installGuidePath: artifact.installPath,
230
- zipPath: artifact.zipPath,
231
- installReady: artifact.installReady,
232
- blocker: artifact.blocker,
233
- packageReady: artifact.packageReady,
234
- packageBlocker: artifact.packageBlocker,
235
- microsoftPublicationPending:
236
- artifact.microsoftPublicationPending !== undefined
237
- ? artifact.microsoftPublicationPending
238
- : status === 'approvalRequired',
239
- validation: toValidationDisplay(validation),
240
- approvalGuide
241
- });
242
-
243
- return { channelBlock, artifact, validation, approvalGuide };
226
+ const slack = params.slackProvision || null;
227
+ const teamsBot = params.teamsBotProvision || null;
228
+ let ttyCtx = liveInstallTtyCtx(ctx, slack, teamsBot);
229
+ if (channelTarget === 'slack') {
230
+ ttyCtx = await applySlackOnboardToCtx(ttyCtx, options);
231
+ }
232
+ if (options.quiet !== true) {
233
+ printLiveChannelCanonicalTty({
234
+ channelTarget,
235
+ ctx: ttyCtx,
236
+ options,
237
+ runtimeValues: params.runtimeValues
238
+ });
239
+ }
240
+ return {
241
+ channelBlock,
242
+ artifact,
243
+ validation,
244
+ approvalGuide,
245
+ slackProvision: slack,
246
+ teamsBotProvision: teamsBot,
247
+ runtimeValues: params.runtimeValues
248
+ };
244
249
  }
245
250
 
246
251
  /**
@@ -248,26 +253,24 @@ async function completeLiveInstall(params) {
248
253
  * @returns {{ dryRun: true, channelBlock: Object, artifact: Object }}
249
254
  */
250
255
  function finishDryRunInstall(params) {
251
- displayChannelInstallResult({
252
- channelTarget: params.channelTarget,
253
- name: params.name,
254
- baseName: params.baseName,
255
- statusLabel: 'Generated (dry-run)',
256
- credentialKey: params.target.credentialKey,
257
- capabilities: params.target.capabilities,
258
- artifactPath: params.artifact.outputPath,
259
- installGuidePath: params.artifact.installPath,
260
- zipPath: params.artifact.zipPath,
261
- installReady: params.artifact.installReady,
262
- blocker: params.artifact.blocker
263
- });
264
- return { dryRun: true, channelBlock: params.channelBlock, artifact: params.artifact };
256
+ if (params.options && params.options.quiet !== true) {
257
+ printLiveChannelCanonicalTty({
258
+ channelTarget: params.channelTarget,
259
+ ctx: {
260
+ dataplaneUrl: params.runtimeValues && params.runtimeValues.dataplaneBaseUrl
261
+ },
262
+ options: params.options || { dryRun: true },
263
+ runtimeValues: params.runtimeValues
264
+ });
265
+ }
266
+ return {
267
+ dryRun: true,
268
+ channelBlock: params.channelBlock,
269
+ artifact: params.artifact,
270
+ runtimeValues: params.runtimeValues
271
+ };
265
272
  }
266
273
 
267
- /**
268
- * @param {Object} params
269
- * @returns {Promise<{ artifact: Object, channelBlock: Object, status: string }>}
270
- */
271
274
  /**
272
275
  * @param {Object|null} packageContext
273
276
  * @param {Object} options
@@ -286,7 +289,9 @@ function brandingIconOrOption(packageContext, options, key) {
286
289
 
287
290
  async function resolvePackageContextForInstall(params) {
288
291
  const { channelTarget, options, name, description, ctx } = params;
289
- const packagingTargets = new Set(['chatgpt', 'microsoft-copilot', 'slack', 'teams-bot']);
292
+ const packagingTargets = new Set([
293
+ 'chatgpt', 'microsoft-copilot', 'slack', 'teams-bot', 'mcp-client', 'claude'
294
+ ]);
290
295
  if (!packagingTargets.has(channelTarget)) {
291
296
  return null;
292
297
  }
@@ -325,52 +330,66 @@ async function resolvePackageContextForInstall(params) {
325
330
  };
326
331
  }
327
332
 
328
- async function buildInstallArtifacts(params) {
329
- const { channelTarget, options, target, existing, name, baseName, description, ctx } = params;
330
- const packageContext = await resolvePackageContextForInstall(params);
331
- let runtimeToolNames = [];
332
- if (channelTarget === 'chatgpt' || channelTarget === 'microsoft-copilot') {
333
- runtimeToolNames =
334
- packageContext?.governedToolNames?.length > 0
335
- ? packageContext.governedToolNames
336
- : await fetchRuntimeLayerBToolNames(ctx.dataplaneUrl, ctx.authConfig, channelTarget);
337
- }
333
+ async function resolveInstallRuntimeValues(params, packageContext, runtimeToolNames) {
334
+ const { channelTarget, options, existing, name, baseName, description, ctx } = params;
338
335
  let entraProvider = null;
339
336
  let entraIdentityProvider = null;
340
337
  if (channelTarget === 'microsoft-copilot') {
341
338
  ({ entraProvider, entraIdentityProvider } = await loadMicrosoftCopilotEntraContext(ctx));
342
339
  }
343
- const runtimeValues = resolveChannelRuntimeValues({
344
- dataplaneBaseUrl: ctx.dataplaneUrl,
340
+ applySlackPackageVersion(channelTarget, options, existing);
341
+ const vendor = vendorFacingUrlsFromCtx(ctx);
342
+ return resolveChannelRuntimeValues({
343
+ dataplaneBaseUrl: vendor.dataplaneBaseUrl,
344
+ controllerUrl: vendor.controllerUrl,
345
345
  channelTarget,
346
+ instanceSystemKey: options.systemKey,
346
347
  appName: name,
347
348
  baseName,
348
349
  environment: ctx.environment,
349
350
  appDescription: description,
350
351
  icon: options.icon,
351
352
  commandPrefix: options.commandPrefix,
353
+ enableMcpServer: options.enableMcpServer,
352
354
  layerBToolNames: runtimeToolNames,
353
355
  packageContext,
354
356
  entraProvider,
355
357
  entraIdentityProvider,
356
358
  oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
359
+ packageVersion: options.packageVersion,
357
360
  scopes: options.scopes,
358
361
  iconColorPath: brandingIconOrOption(packageContext, options, 'iconColorPath'),
359
- iconOutlinePath: brandingIconOrOption(packageContext, options, 'iconOutlinePath')
362
+ iconOutlinePath: brandingIconOrOption(packageContext, options, 'iconOutlinePath'),
363
+ mcpClientProfile:
364
+ channelTarget === 'mcp-client' ? maybeAssertMcpClientProfile(channelTarget, options) : undefined
360
365
  });
361
- const projectRoot = options.projectRoot || process.cwd();
366
+ }
367
+
368
+ async function buildInstallArtifacts(params) {
369
+ const { channelTarget, options, target, existing, name, baseName, description } = params;
370
+ const packageContext = await resolvePackageContextForInstall(params);
371
+ const runtimeToolNames = await resolveInstallLayerBToolNames(channelTarget, packageContext, params.ctx);
372
+ const runtimeValues = await resolveInstallRuntimeValues(params, packageContext, runtimeToolNames);
362
373
  const artifact = generateArtifactWithAudit(channelTarget, {
363
- projectRoot,
374
+ projectRoot: options.projectRoot || process.cwd(),
364
375
  channelTarget,
365
376
  runtimeValues,
366
377
  dryRun: options.dryRun === true
367
378
  });
368
379
  const status = resolveInstallStatus(target, existing, options.dryRun === true);
369
380
  const channelBlock = buildChannelExtensionBlock(
370
- { name, baseName, description, artifactHash: artifact.artifactHash, status },
381
+ {
382
+ name,
383
+ baseName,
384
+ description,
385
+ status,
386
+ artifactHash: artifact.artifactHash,
387
+ commandPrefix: runtimeValues.commandPrefix,
388
+ packageVersion: runtimeValues.packageVersion
389
+ },
371
390
  target
372
391
  );
373
- return { artifact, channelBlock, status };
392
+ return { artifact, channelBlock, status, runtimeValues };
374
393
  }
375
394
 
376
395
  /**
@@ -379,34 +398,40 @@ async function buildInstallArtifacts(params) {
379
398
  * @returns {Object}
380
399
  */
381
400
  function assertChannelAddOptions(channelTarget, options) {
382
- const target = getChannelTarget(channelTarget);
383
- if (target.experimental) {
384
- throw new Error(
385
- `Channel target "${channelTarget}" is experimental. Confirm product requirement before use.`
386
- );
387
- }
401
+ const target = assertChannelTargetInstallable(channelTarget, options);
388
402
  if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
389
403
  throw new Error('--name is required for channel add');
390
404
  }
405
+ options.systemKey = deriveChannelInstanceKey(channelTarget, options.name, options.systemKey);
391
406
  return target;
392
407
  }
393
408
 
394
409
  /**
395
410
  * @param {string} channelTarget
396
411
  * @param {Object} options
397
- * @returns {Promise<Object>}
412
+ * @returns {Promise<void>}
398
413
  */
399
- async function runAddChannel(channelTarget, options = {}) {
400
- const target = assertChannelAddOptions(channelTarget, options);
414
+ async function prepareAddChannelGuards(channelTarget, options) {
415
+ maybeAssertMcpClientProfile(channelTarget, options);
401
416
  if (channelTarget === 'microsoft-copilot' && options.force === true) {
402
417
  await assertMicrosoftCopilotOauthReferenceBeforeForce(options);
403
418
  }
404
419
  await ensureChannelReadyForAdd(channelTarget, options);
420
+ }
421
+
422
+ /**
423
+ * @param {string} channelTarget
424
+ * @param {Object} options
425
+ * @returns {Promise<Object>}
426
+ */
427
+ async function runAddChannel(channelTarget, options = {}) {
428
+ const target = assertChannelAddOptions(channelTarget, options);
429
+ await prepareAddChannelGuards(channelTarget, options);
405
430
  const { name, baseName, description, ctx, existing } = await prepareChannelContext(
406
431
  channelTarget,
407
432
  options
408
433
  );
409
- const skipped = showExistingChannelStatus({
434
+ const skipped = await showExistingChannelStatus({
410
435
  existing,
411
436
  options,
412
437
  channelTarget,
@@ -414,11 +439,13 @@ async function runAddChannel(channelTarget, options = {}) {
414
439
  baseName,
415
440
  ctx
416
441
  });
417
- if (skipped) return skipped;
442
+ if (shouldReturnSkippedChannel(channelTarget, options, skipped)) {
443
+ return skipped;
444
+ }
418
445
  if (channelTarget === 'microsoft-copilot') {
419
446
  await assertMicrosoftCopilotOauthReference({ options, ctx, name, baseName, description });
420
447
  }
421
- const { artifact, channelBlock, status } = await buildInstallArtifacts({
448
+ const built = await buildInstallArtifacts({
422
449
  channelTarget,
423
450
  options,
424
451
  target,
@@ -429,21 +456,32 @@ async function runAddChannel(channelTarget, options = {}) {
429
456
  ctx
430
457
  });
431
458
  if (options.dryRun) {
432
- return finishDryRunInstall({ channelTarget, name, baseName, target, artifact, channelBlock });
459
+ return finishDryRunInstall({ channelTarget, name, baseName, target, options, ...built });
433
460
  }
434
- return completeLiveInstall({
461
+ return runLiveChannelInstall({
435
462
  ctx,
436
463
  channelTarget,
437
- channelBlock,
438
- status,
439
- artifact,
464
+ options,
440
465
  target,
441
466
  name,
442
467
  baseName,
443
- options
468
+ ...built
444
469
  });
445
470
  }
446
471
 
472
+ /**
473
+ * @param {Object} params
474
+ * @returns {Promise<Object>}
475
+ */
476
+ async function runLiveChannelInstall(params) {
477
+ await runChannelAddPreflights(params);
478
+ const slackProvision = await maybeProvisionSlackChannel(params);
479
+ const teamsBotProvision = await maybeProvisionTeamsBotChannel(params);
480
+ const result = await completeLiveInstall({ ...params, slackProvision, teamsBotProvision });
481
+ await runChannelAddContinuations(params);
482
+ return result;
483
+ }
484
+
447
485
  /**
448
486
  * @param {string} channelTarget
449
487
  * @param {Object} options
@@ -1,35 +1,31 @@
1
1
  /**
2
- * ChatGPT enterprise channel admin approval steps (plan 152).
2
+ * ChatGPT remaining workspace steps (customer-facing).
3
3
  *
4
- * @fileoverview OpenAI Platform / workspace connector guide
4
+ * @fileoverview Short ChatGPT Apps create/publish steps — no protocol dump
5
5
  * @author AI Fabrix Team
6
- * @version 1.0.0
6
+ * @version 1.3.0
7
7
  */
8
8
 
9
9
  'use strict';
10
10
 
11
- const { formatCredentialPortalStep } = require('./credential-portal');
11
+ const { CHATGPT_APPS_CREATE_URL } = require('../chatgpt-runtime-contract');
12
12
 
13
13
  /**
14
14
  * @param {Object} ctx
15
- * @returns {{ portalUrl: string, steps: string[] }}
15
+ * @returns {{ portalUrl: string, heading: string, credentialPortalUrl: null, steps: string[] }}
16
16
  */
17
17
  function buildChatGptApprovalGuide(ctx) {
18
+ const name = ctx.appName || ctx.name || '';
19
+ const serverUrl = ctx.mcpUrl || '';
18
20
  return {
19
- portalUrl: 'https://chatgpt.com/',
21
+ portalUrl: CHATGPT_APPS_CREATE_URL,
22
+ heading: 'Create the ChatGPT app',
23
+ credentialPortalUrl: null,
20
24
  steps: [
21
- 'Sign in to the ChatGPT web app as a workspace admin or owner.',
22
- 'Enable Developer mode for custom MCP apps (Business: Workspace settings → Apps, or Settings → Apps → Advanced settings; Enterprise/Edu: grant Developer mode under Permissions & roles → Connected data first).',
23
- 'Create a custom MCP app with the Remote MCP URL from INSTALL.md (channel-chatgpt.json is a deployment reference, not a plugin archive).',
24
- 'Select OAuth (authorization-code + PKCE S256). Do not configure a custom API key for a remote custom MCP app.',
25
- 'Scan tools, complete OAuth if prompted, review discovered governed tools, then save the app as a draft.',
26
- formatCredentialPortalStep(
27
- ctx,
28
- `${ctx.credentialKey || 'channel'} credential references (not secrets to paste into ChatGPT)`
29
- ),
30
- 'Test representative workflows, then publish the app and configure workspace access and action controls.',
31
- `After ChatGPT lists the app as active, re-run: ${ctx.resumeCommand}`,
32
- 'Optional: use --probe for AI Fabrix-side Runtime checks; ChatGPT Scan tools / OAuth / publication remain workspace-admin responsibilities.'
25
+ `Open ${CHATGPT_APPS_CREATE_URL}`,
26
+ `Create the app with Name: ${name}; Server URL: ${serverUrl}; Authentication: OAuth. Add the logo now — ChatGPT does not let you change it after create.`,
27
+ 'If ChatGPT shows a callback URL that is not already registered: aifabrix channel configure chatgpt --callback-url "<callback-url>"',
28
+ 'Publish and connect the app.'
33
29
  ]
34
30
  };
35
31
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Claude remaining workspace steps (customer-facing).
3
+ *
4
+ * @fileoverview Short Claude connector Name, Server URL, and OAuth steps — no protocol dump
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { CLAUDE_CONNECTORS_URL } = require('../claude-runtime-contract');
10
+
11
+ /**
12
+ * @param {Object} ctx
13
+ * @returns {{ portalUrl: string, heading: string, credentialPortalUrl: null, steps: string[] }}
14
+ */
15
+ function buildClaudeApprovalGuide(ctx) {
16
+ const name = ctx.appName || ctx.name || '';
17
+ const serverUrl = ctx.mcpUrl || '';
18
+ return {
19
+ portalUrl: CLAUDE_CONNECTORS_URL,
20
+ heading: 'Add the Claude custom connector',
21
+ credentialPortalUrl: null,
22
+ steps: [
23
+ `Open ${CLAUDE_CONNECTORS_URL}`,
24
+ `Add a custom connector with Name: ${name}; Server URL: ${serverUrl}; Authentication: OAuth.`
25
+ ]
26
+ };
27
+ }
28
+
29
+ module.exports = { buildClaudeApprovalGuide };