@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
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Slack channel provisioning adapter (CLI + Manifest API).
3
+ *
4
+ * @fileoverview Create/reuse Slack app from generated manifest; store secrets via dataplane
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { assertSlackCallbackUrls } = require('./callbacks');
10
+ const { parseGeneratedManifest, assertLocalManifest } = require('./manifest');
11
+ const {
12
+ validateManifestRemote,
13
+ createManifestApp,
14
+ updateManifestApp,
15
+ installManifestApp,
16
+ exportManifestApp,
17
+ exportManifestLookup,
18
+ resolveSlackClientId
19
+ } = require('./apps');
20
+ const { preserveSlackOAuthLocks } = require('./oauth-lock');
21
+ const {
22
+ pickSlackSecrets,
23
+ storeSlackChannelSecrets,
24
+ localSlackSigningPresent
25
+ } = require('./credentials');
26
+ const {
27
+ readProvisioningState,
28
+ writeProvisioningState,
29
+ hasProvenAppIdentity
30
+ } = require('./persist');
31
+ const { listSlackAuths, pickSlackWorkspace, workspaceFromSessionToken } = require('./auth');
32
+ const { slackProvisioningError } = require('./errors');
33
+ const { pickSlackClientId, slackConsentRemaining, slackConsentUrls } = require('./remaining-urls');
34
+ const { botScopesFromManifest } = require('./developer-install');
35
+
36
+ /**
37
+ * @param {Object} params
38
+ * @returns {Object}
39
+ */
40
+ function loadProvenState(params) {
41
+ const state = readProvisioningState(params.projectRoot);
42
+ if (state && !hasProvenAppIdentity(state)) {
43
+ throw slackProvisioningError(
44
+ 'Slack provisioning state exists but app id is missing. Fix or delete dist/channels/slack/provisioning-state.json.',
45
+ 'UNPROVEN_IDENTITY'
46
+ );
47
+ }
48
+ return state;
49
+ }
50
+
51
+ /**
52
+ * @param {Object} params
53
+ * @param {Object} [deps]
54
+ * @returns {Promise<void>}
55
+ */
56
+ async function resolveWorkspace(params, deps) {
57
+ const fromToken = await workspaceFromSessionToken(deps);
58
+ const auths = fromToken ? [fromToken] : await listSlackAuths(deps);
59
+ const workspace = pickSlackWorkspace(auths, params.expectedTeamId);
60
+ if (!workspace) {
61
+ throw slackProvisioningError(
62
+ 'No Slack workspace is signed in.',
63
+ 'UNPROVEN_IDENTITY'
64
+ );
65
+ }
66
+ return workspace;
67
+ }
68
+
69
+ /**
70
+ * @param {Object} params
71
+ * @param {Object} payload
72
+ * @returns {void}
73
+ */
74
+ function persistIds(params, payload) {
75
+ writeProvisioningState(params.projectRoot, {
76
+ environment: params.environment,
77
+ appId: payload.appId,
78
+ clientId: payload.clientId || null,
79
+ teamId: payload.teamId || null,
80
+ botId: payload.botId || null,
81
+ secretsStored: payload.secretsStored === true
82
+ });
83
+ }
84
+
85
+ /**
86
+ * @param {Object} params
87
+ * @param {Object} captured
88
+ * @param {Object} [deps]
89
+ * @returns {Promise<{ connected: boolean, remaining: string[], appId: string }>}
90
+ */
91
+ async function storeAndFinish(params, captured, deps) {
92
+ const secrets = pickSlackSecrets(captured);
93
+ const stored = await storeSlackChannelSecrets(params.ctx, secrets, {
94
+ ...deps,
95
+ projectRoot: params.projectRoot,
96
+ instanceSystemKey: params.ctx && params.ctx.instanceSystemKey
97
+ });
98
+ const signingReady = stored.storedSigningSecret || params.priorSecretsStored === true;
99
+ const botReady = stored.storedBotToken || params.priorSecretsStored === true;
100
+ const secretsStored = signingReady && botReady;
101
+ let clientId = pickSlackClientId(captured);
102
+ if (!clientId && !secretsStored) {
103
+ clientId = await resolveSlackClientId(captured, deps);
104
+ }
105
+ persistIds(params, {
106
+ appId: captured.appId,
107
+ clientId,
108
+ teamId: captured.teamId || params.workspaceTeamId,
109
+ botId: captured.botId,
110
+ secretsStored
111
+ });
112
+ const urls = slackConsentUrls({
113
+ ...captured,
114
+ clientId,
115
+ teamId: captured.teamId || params.workspaceTeamId
116
+ });
117
+ return {
118
+ connected: secretsStored,
119
+ remaining: slackConsentRemaining(
120
+ secretsStored ? { storedSigningSecret: true } : stored
121
+ ),
122
+ appId: captured.appId,
123
+ signingSecretFallback: stored.storedSigningSecret !== true,
124
+ storedSigningSecret: stored.storedSigningSecret === true,
125
+ storedBotToken: stored.storedBotToken === true,
126
+ ...urls
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Install deps: HTTP developerInstall always; native CLI `app install` only when not quiet.
132
+ * @param {Object} params
133
+ * @param {Object} manifest
134
+ * @param {Object} [deps]
135
+ * @returns {Object}
136
+ */
137
+ function slackInstallDeps(params, manifest, deps) {
138
+ return {
139
+ ...deps,
140
+ quiet: params && params.quiet === true,
141
+ botScopes: botScopesFromManifest(manifest)
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Capture bot token from Slack. Portal skips native CLI hang (CIP 120s).
147
+ * @param {string} appId
148
+ * @param {Object} [deps]
149
+ * @returns {Promise<Object>}
150
+ */
151
+ async function maybeInstallSlackApp(appId, deps) {
152
+ try {
153
+ return (await installManifestApp(appId, deps)) || {};
154
+ } catch {
155
+ return {};
156
+ }
157
+ }
158
+
159
+ /**
160
+ * @param {Object} params
161
+ * @param {Object} manifest
162
+ * @param {Object} [deps]
163
+ * @returns {Promise<Object>}
164
+ */
165
+ async function createNewSlackApp(params, manifest, deps) {
166
+ await validateManifestRemote(manifest, deps);
167
+ const created = await createManifestApp(manifest, deps);
168
+ persistIds(params, {
169
+ appId: created.app_id,
170
+ clientId: pickSlackClientId(created),
171
+ teamId: params.workspaceTeamId,
172
+ secretsStored: false
173
+ });
174
+ const installed = await maybeInstallSlackApp(
175
+ created.app_id,
176
+ slackInstallDeps(params, manifest, deps)
177
+ );
178
+ return storeAndFinish(params, {
179
+ appId: created.app_id,
180
+ clientId: pickSlackClientId(created),
181
+ teamId: installed.teamId || params.workspaceTeamId,
182
+ botId: installed.botId,
183
+ credentials: created.credentials,
184
+ oauth_authorize_url: created.oauth_authorize_url,
185
+ botToken: installed.botToken
186
+ }, deps);
187
+ }
188
+
189
+ /**
190
+ * @param {Object} params
191
+ * @param {Object} manifest
192
+ * @param {Object} state
193
+ * @param {Object} [deps]
194
+ * @returns {Promise<Object>}
195
+ */
196
+ async function reuseSlackApp(params, manifest, state, deps, remote) {
197
+ const exported = remote === undefined ? await exportManifestApp(state.appId, deps) : remote;
198
+ const merged = preserveSlackOAuthLocks(manifest, exported);
199
+ await validateManifestRemote(merged, { ...deps, appId: state.appId });
200
+ await updateManifestApp(state.appId, merged, deps);
201
+ const installed = await maybeInstallSlackApp(
202
+ state.appId,
203
+ slackInstallDeps(params, manifest, deps)
204
+ );
205
+ return storeAndFinish(
206
+ { ...params, priorSecretsStored: state.secretsStored === true },
207
+ {
208
+ appId: state.appId,
209
+ clientId: state.clientId,
210
+ teamId: installed.teamId || state.teamId || params.workspaceTeamId,
211
+ botId: installed.botId || state.botId,
212
+ botToken: installed.botToken
213
+ },
214
+ deps
215
+ );
216
+ }
217
+
218
+ /**
219
+ * @param {Object} params
220
+ * @param {Object} [deps]
221
+ * @returns {Promise<{ connected: boolean, remaining: string[], appId?: string }>}
222
+ */
223
+ async function provisionSlackChannel(params, deps = {}) {
224
+ assertSlackCallbackUrls(params.runtimeValues);
225
+ const manifest = parseGeneratedManifest(params.artifact && params.artifact.content);
226
+ assertLocalManifest(manifest);
227
+ const workspace = await resolveWorkspace(params, deps);
228
+ const workspaceTeamId = workspace.team_id || workspace.teamId;
229
+ const apiDeps = {
230
+ ...deps,
231
+ teamId: workspaceTeamId
232
+ };
233
+ const state = loadProvenState(params);
234
+ const withTeam = { ...params, workspaceTeamId };
235
+ const reuseKnownApp =
236
+ hasProvenAppIdentity(state) && (await localSlackSigningPresent(apiDeps));
237
+ if (reuseKnownApp) {
238
+ const lookup = await exportManifestLookup(state.appId, apiDeps);
239
+ if (!lookup.missing) {
240
+ return reuseSlackApp(withTeam, manifest, state, apiDeps, lookup.manifest);
241
+ }
242
+ }
243
+ return createNewSlackApp(withTeam, manifest, apiDeps);
244
+ }
245
+
246
+ module.exports = {
247
+ provisionSlackChannel,
248
+ loadProvenState,
249
+ persistIds
250
+ };
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Official Slack CLI installer (Mac/Linux install.sh only).
3
+ *
4
+ * @fileoverview Do not apt/snap install the Slack desktop app
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const fs = require('fs');
10
+ const https = require('https');
11
+ const os = require('os');
12
+ const path = require('path');
13
+ const { promisify } = require('util');
14
+ const { spawn } = require('child_process');
15
+ const execFileDefault = promisify(require('child_process').execFile);
16
+ const chalk = require('chalk');
17
+ const ora = require('ora');
18
+ const logger = require('../../utils/logger');
19
+ const { formatSuccessLine } = require('../../utils/cli-layout-chalk');
20
+ const { SLACK_CLI_INSTALL_SCRIPT_URL } = require('./constants');
21
+ const { slackProvisioningError } = require('./errors');
22
+ const { withGoTrustedCa } = require('./go-ca-bundle');
23
+ const { withCurlOnPath } = require('./with-curl-on-path');
24
+
25
+ const MAX_SCRIPT_BYTES = 512 * 1024;
26
+ const MAX_REDIRECTS = 5;
27
+ const SLACK_CLI_FALLBACK_HOME = 'aifabrix-slack-home';
28
+
29
+ /**
30
+ * @param {string} dir
31
+ * @returns {boolean}
32
+ */
33
+ function isRootHomeDir(dir) {
34
+ const resolved = path.resolve(dir);
35
+ return resolved === path.parse(resolved).root;
36
+ }
37
+
38
+ /**
39
+ * @param {unknown} value
40
+ * @returns {string}
41
+ */
42
+ function usableHomeDir(value) {
43
+ const trimmed = typeof value === 'string' ? value.trim() : '';
44
+ if (!trimmed || isRootHomeDir(trimmed)) {
45
+ return '';
46
+ }
47
+ return path.resolve(trimmed);
48
+ }
49
+
50
+ /**
51
+ * HOME=/ in builder-api cannot mkdir ~/.slack. Use a writable temp home instead.
52
+ * @param {NodeJS.ProcessEnv} [env]
53
+ * @returns {string}
54
+ */
55
+ function slackCliHomeDir(env = process.env) {
56
+ const ownHome = Boolean(env && Object.prototype.hasOwnProperty.call(env, 'HOME'));
57
+ const home = ownHome
58
+ ? usableHomeDir(env.HOME)
59
+ : usableHomeDir(env && env.HOME) || usableHomeDir(process.env.HOME);
60
+ if (home) {
61
+ return home;
62
+ }
63
+ const fallback = path.join(os.tmpdir(), SLACK_CLI_FALLBACK_HOME);
64
+ fs.mkdirSync(fallback, { recursive: true });
65
+ return fallback;
66
+ }
67
+
68
+ /**
69
+ * @returns {boolean}
70
+ */
71
+ function isSlackCliInstallerSupported() {
72
+ return process.platform === 'linux' || process.platform === 'darwin';
73
+ }
74
+
75
+ /**
76
+ * @param {NodeJS.ProcessEnv} [env]
77
+ * @returns {string}
78
+ */
79
+ function slackCliLocalBinDir(env = process.env) {
80
+ return path.join(slackCliHomeDir(env), '.local', 'bin');
81
+ }
82
+
83
+ /**
84
+ * @param {NodeJS.ProcessEnv} [env]
85
+ * @returns {NodeJS.ProcessEnv}
86
+ */
87
+ function withSlackCliPath(env = process.env) {
88
+ const home = slackCliHomeDir(env);
89
+ const dir = slackCliLocalBinDir({ ...env, HOME: home });
90
+ const current = env.PATH || '';
91
+ const parts = current.split(path.delimiter).filter(Boolean);
92
+ const nextPath = parts.includes(dir) ? current : `${dir}${path.delimiter}${current}`;
93
+ return withGoTrustedCa({ ...env, HOME: home, PATH: nextPath }, home);
94
+ }
95
+
96
+ /**
97
+ * @param {Object} [deps]
98
+ * @returns {void}
99
+ */
100
+ function applySlackCliPath(deps = {}) {
101
+ const next = withSlackCliPath(deps.env || process.env);
102
+ deps.env = next;
103
+ process.env.PATH = next.PATH;
104
+ if (next.SSL_CERT_FILE) {
105
+ process.env.SSL_CERT_FILE = next.SSL_CERT_FILE;
106
+ }
107
+ if (!usableHomeDir(process.env.HOME)) {
108
+ process.env.HOME = next.HOME;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * @param {string} url
114
+ * @param {import('http').IncomingMessage} res
115
+ * @param {number} redirects
116
+ * @param {(value: string) => void} resolve
117
+ * @param {(reason: Error) => void} reject
118
+ * @returns {boolean}
119
+ */
120
+ function followHttpsRedirect(url, res, redirects, resolve, reject) {
121
+ const status = res.statusCode || 0;
122
+ if (!(status >= 300 && status < 400 && res.headers.location)) {
123
+ return false;
124
+ }
125
+ res.resume();
126
+ if (redirects >= MAX_REDIRECTS) {
127
+ reject(new Error('Too many redirects downloading Slack CLI installer.'));
128
+ return true;
129
+ }
130
+ const nextUrl = new URL(res.headers.location, url).toString();
131
+ if (!nextUrl.startsWith('https://')) {
132
+ reject(new Error('Slack CLI installer redirect was not HTTPS.'));
133
+ return true;
134
+ }
135
+ fetchHttpsText(nextUrl, redirects + 1).then(resolve, reject);
136
+ return true;
137
+ }
138
+
139
+ /**
140
+ * @param {import('http').IncomingMessage} res
141
+ * @param {(value: string) => void} resolve
142
+ * @param {(reason: Error) => void} reject
143
+ * @returns {void}
144
+ */
145
+ function readInstallScriptBody(res, resolve, reject) {
146
+ const chunks = [];
147
+ let size = 0;
148
+ res.on('data', (chunk) => {
149
+ size += chunk.length;
150
+ if (size > MAX_SCRIPT_BYTES) {
151
+ res.destroy(new Error('Slack CLI installer script is larger than expected.'));
152
+ return;
153
+ }
154
+ chunks.push(chunk);
155
+ });
156
+ res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
157
+ res.on('error', reject);
158
+ }
159
+
160
+ /**
161
+ * @param {string} url
162
+ * @param {number} [redirects]
163
+ * @returns {Promise<string>}
164
+ */
165
+ function fetchHttpsText(url, redirects = 0) {
166
+ return new Promise((resolve, reject) => {
167
+ const req = https.get(url, { timeout: 30000 }, (res) => {
168
+ if (followHttpsRedirect(url, res, redirects, resolve, reject)) {
169
+ return;
170
+ }
171
+ if ((res.statusCode || 0) !== 200) {
172
+ res.resume();
173
+ reject(new Error(`Slack CLI installer download failed (${res.statusCode || 0}).`));
174
+ return;
175
+ }
176
+ readInstallScriptBody(res, resolve, reject);
177
+ });
178
+ req.on('error', reject);
179
+ });
180
+ }
181
+
182
+ /**
183
+ * Drop Node's version footer; prefer an Error: line when present.
184
+ * @param {string} text
185
+ * @returns {string}
186
+ */
187
+ function lastUsefulInstallLine(text) {
188
+ const lines = text.split('\n').map((line) => line.trim()).filter(Boolean);
189
+ const withoutNode = lines.filter((line) => !/^Node\.js v\d/i.test(line));
190
+ const pool = withoutNode.length ? withoutNode : lines;
191
+ const errorLine = [...pool].reverse().find((line) => /^Error:/i.test(line));
192
+ return errorLine || pool[pool.length - 1] || '';
193
+ }
194
+
195
+ /**
196
+ * Prefer child stderr over Node's "Command failed: bash /tmp/…" wrapper.
197
+ * @param {unknown} error
198
+ * @returns {string}
199
+ */
200
+ function slackCliInstallFailureMessage(error) {
201
+ const stderr = error && error.stderr ? String(error.stderr).trim() : '';
202
+ const stdout = error && error.stdout ? String(error.stdout).trim() : '';
203
+ const raw = error && error.message ? String(error.message) : '';
204
+ const fromChild = stderr || stdout;
205
+ if (fromChild) {
206
+ return lastUsefulInstallLine(fromChild) || fromChild;
207
+ }
208
+ const stripped = raw.replace(/^Command failed: bash \S+\s*/i, '').trim();
209
+ return stripped || 'Slack CLI install failed.';
210
+ }
211
+
212
+ function assertInstallScript(script) {
213
+ const text = String(script || '').trim();
214
+ if (!text.startsWith('#!')) {
215
+ throw slackProvisioningError('Slack CLI installer script is not a shell script.', 'SLACK_CLI');
216
+ }
217
+ }
218
+
219
+ /**
220
+ * @param {Object} [deps]
221
+ * @returns {Promise<void>}
222
+ */
223
+ async function runInstallScript(deps = {}) {
224
+ const fetchFn = deps.fetchInstallScript || fetchHttpsText;
225
+ const script = await fetchFn(SLACK_CLI_INSTALL_SCRIPT_URL);
226
+ assertInstallScript(script);
227
+ const scriptPath = path.join(os.tmpdir(), `aifabrix-slack-cli-install-${process.pid}.sh`);
228
+ fs.writeFileSync(scriptPath, script, { mode: 0o700 });
229
+ const execFileImpl = deps.execFile || execFileDefault;
230
+ const env = await withCurlOnPath(withSlackCliPath(deps.env || process.env));
231
+ try {
232
+ await execFileImpl('bash', [scriptPath], {
233
+ env,
234
+ timeout: deps.timeout || 180000,
235
+ maxBuffer: 2 * 1024 * 1024
236
+ });
237
+ } catch (error) {
238
+ throw slackProvisioningError(slackCliInstallFailureMessage(error), 'SLACK_CLI');
239
+ } finally {
240
+ try {
241
+ fs.unlinkSync(scriptPath);
242
+ } catch {
243
+ // ignore
244
+ }
245
+ }
246
+ }
247
+
248
+ /**
249
+ * @param {string} text
250
+ * @returns {import('ora').Ora|null}
251
+ */
252
+ function startInstallSpinner(text) {
253
+ if (!process.stdout || !process.stdout.isTTY) {
254
+ logger.log(chalk.white(text));
255
+ return null;
256
+ }
257
+ return ora({ text: chalk.white(text), spinner: 'dots' }).start();
258
+ }
259
+
260
+ /**
261
+ * Official Slack install.sh. Never apt/snap `slack` (desktop app).
262
+ * @param {Object} [deps]
263
+ * @returns {Promise<void>}
264
+ */
265
+ async function installOfficialSlackCli(deps = {}) {
266
+ if (typeof deps.installCli === 'function') {
267
+ await deps.installCli();
268
+ applySlackCliPath(deps);
269
+ return;
270
+ }
271
+ if (!isSlackCliInstallerSupported()) {
272
+ throw slackProvisioningError(
273
+ 'Automatic Slack CLI install is available on Linux and macOS only.',
274
+ 'SLACK_CLI_MISSING'
275
+ );
276
+ }
277
+ const spinner = startInstallSpinner('Installing Slack CLI…');
278
+ try {
279
+ await runInstallScript(deps);
280
+ applySlackCliPath(deps);
281
+ if (spinner) {
282
+ spinner.stop();
283
+ }
284
+ logger.log(formatSuccessLine('Slack CLI installed'));
285
+ } catch (error) {
286
+ if (spinner) {
287
+ spinner.stop();
288
+ }
289
+ throw slackProvisioningError(
290
+ error && error.message ? error.message : 'Slack CLI install failed.',
291
+ 'SLACK_CLI'
292
+ );
293
+ }
294
+ }
295
+
296
+ /**
297
+ * @param {Object} [deps]
298
+ * @returns {Promise<void>}
299
+ */
300
+ async function runSlackLogin(deps = {}) {
301
+ if (typeof deps.slackLogin === 'function') {
302
+ await deps.slackLogin();
303
+ return;
304
+ }
305
+ const bin = typeof deps.slackBinary === 'string' && deps.slackBinary.trim()
306
+ ? deps.slackBinary.trim()
307
+ : 'slack';
308
+ await new Promise((resolve, reject) => {
309
+ const child = spawn(bin, ['login'], {
310
+ stdio: 'inherit',
311
+ env: withSlackCliPath(deps.env || process.env)
312
+ });
313
+ child.on('error', reject);
314
+ child.on('exit', (code) => {
315
+ if (code === 0) {
316
+ resolve();
317
+ return;
318
+ }
319
+ reject(slackProvisioningError(`slack login exited ${code}.`, 'SLACK_CLI'));
320
+ });
321
+ });
322
+ }
323
+
324
+ module.exports = {
325
+ isSlackCliInstallerSupported,
326
+ slackCliHomeDir,
327
+ slackCliLocalBinDir,
328
+ withSlackCliPath,
329
+ applySlackCliPath,
330
+ fetchHttpsText,
331
+ assertInstallScript,
332
+ slackCliInstallFailureMessage,
333
+ installOfficialSlackCli,
334
+ runSlackLogin
335
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Local Slack manifest checks — generated artifact is SSOT.
3
+ *
4
+ * @fileoverview Do not rebuild Slack fields; validate the generated JSON
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { slackProvisioningError } = require('./errors');
10
+ const { SLACK_APP_LONG_DESCRIPTION_MIN_LENGTH } = require('../channel-description');
11
+
12
+ /**
13
+ * @param {string} content
14
+ * @returns {Object}
15
+ */
16
+ function parseGeneratedManifest(content) {
17
+ if (typeof content !== 'string' || !content.trim()) {
18
+ throw slackProvisioningError('Generated Slack manifest is empty.', 'MANIFEST');
19
+ }
20
+ try {
21
+ const parsed = JSON.parse(content);
22
+ if (!parsed || typeof parsed !== 'object') {
23
+ throw new Error('not an object');
24
+ }
25
+ return parsed;
26
+ } catch {
27
+ throw slackProvisioningError('Generated Slack manifest is not valid JSON.', 'MANIFEST');
28
+ }
29
+ }
30
+
31
+ /**
32
+ * @param {Object} [display]
33
+ * @returns {boolean}
34
+ */
35
+ function hasDisplayParts(display) {
36
+ const name = display && display.name;
37
+ const longDescription = String((display && display.long_description) || '').trim();
38
+ return Boolean(name && longDescription.length >= SLACK_APP_LONG_DESCRIPTION_MIN_LENGTH);
39
+ }
40
+
41
+ /**
42
+ * @param {Object} [features]
43
+ * @returns {boolean}
44
+ */
45
+ function hasFeatureParts(features) {
46
+ const commands = features && features.slash_commands;
47
+ return Boolean(features && features.bot_user && Array.isArray(commands) && commands.length > 0);
48
+ }
49
+
50
+ /**
51
+ * @param {Object} [settings]
52
+ * @returns {boolean}
53
+ */
54
+ function hasSettingsParts(settings) {
55
+ return Boolean(settings && settings.event_subscriptions && settings.interactivity);
56
+ }
57
+
58
+ /**
59
+ * @param {Object} manifest
60
+ * @returns {boolean}
61
+ */
62
+ function hasRequiredManifestParts(manifest) {
63
+ return Boolean(
64
+ hasDisplayParts(manifest && manifest.display_information) &&
65
+ hasFeatureParts(manifest && manifest.features) &&
66
+ hasSettingsParts(manifest && manifest.settings)
67
+ );
68
+ }
69
+
70
+ /**
71
+ * @param {Object} manifest
72
+ * @returns {void}
73
+ */
74
+ function assertLocalManifest(manifest) {
75
+ if (!hasRequiredManifestParts(manifest)) {
76
+ throw slackProvisioningError(
77
+ 'Generated Slack manifest is missing required display, long_description (min 175 characters), bot, events, interactivity, or slash commands.',
78
+ 'MANIFEST'
79
+ );
80
+ }
81
+ if (manifest.settings && manifest.settings.socket_mode_enabled === true) {
82
+ throw slackProvisioningError('Slack Socket Mode must stay disabled for this channel.', 'MANIFEST');
83
+ }
84
+ }
85
+
86
+ module.exports = {
87
+ parseGeneratedManifest,
88
+ assertLocalManifest
89
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Keep Slack OAuth fields Slack will not let us turn off.
3
+ *
4
+ * @fileoverview Token rotation cannot be disabled after it was enabled.
5
+ * Never copy remote OAuth redirect URLs — Slack HMAC does not use a callback.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ /**
11
+ * @param {Object} manifest
12
+ * @param {Object|null} remote
13
+ * @returns {Object}
14
+ */
15
+ function preserveSlackOAuthLocks(manifest, remote) {
16
+ if (!manifest || typeof manifest !== 'object') {
17
+ return manifest;
18
+ }
19
+ const next = {
20
+ ...manifest,
21
+ settings: { ...(manifest.settings || {}) },
22
+ oauth_config: { ...(manifest.oauth_config || {}) }
23
+ };
24
+ if (remote && remote.settings && remote.settings.token_rotation_enabled === true) {
25
+ next.settings.token_rotation_enabled = true;
26
+ }
27
+ next.oauth_config.redirect_urls = [];
28
+ return next;
29
+ }
30
+
31
+ module.exports = {
32
+ preserveSlackOAuthLocks
33
+ };