@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
@@ -34,6 +34,12 @@ const {
34
34
  mergeCaseExecutionIntoLifecycleResult,
35
35
  lifecycleVerdictFromCaseExecution
36
36
  } = require('../role-assistant/test-runner');
37
+ const { assertRoleAssistantEvidencePreflight } = require('../role-assistant/test-cases-evidence');
38
+ const { assertLocalCasesBeforeAuth } = require('../role-assistant/test-case-validate');
39
+ const {
40
+ loadPublishedTestsIntoOptions,
41
+ patchCaseStatusAfterRun
42
+ } = require('../role-assistant/test-pack-sync');
37
43
  const { collectString } = require('./governance');
38
44
  const {
39
45
  sectionTitle,
@@ -49,11 +55,13 @@ const {
49
55
  bareRoleKey,
50
56
  roleAssistantSystemKey
51
57
  } = require('../utils/role-assistant-paths');
58
+ const { registerRoleAssistantCopyCommand } = require('./role-assistant-copy');
52
59
 
53
60
  function roleAssistantGroupHelpAfter() {
54
61
  return `
55
62
  Subcommands:
56
63
  test <roleKey> Run lifecycle checks, optional YAML cases/suites, and print a portal deep link
64
+ copy <roleKey> Capture one Work Hub execution as a local YAML test case
57
65
 
58
66
  Package workspace (top-level commands — same digital-worker package):
59
67
  download / validate / upload / deploy <roleKey> Manage role-assistant/ra-<roleKey>/
@@ -63,13 +71,16 @@ Examples:
63
71
  $ aifabrix role-assistant test customer-support-bot --suite 001
64
72
  $ aifabrix role-assistant test customer-support-bot --list-cases
65
73
  $ aifabrix role-assistant test customer-support-bot --env tst --json
74
+ $ aifabrix role-assistant copy customer-support-bot --suite 001 --reference a9f09fb8-d9eb-477f-8bb4-59e670fc82a4
66
75
  $ aifabrix upload customer-support-bot --env dev
67
76
  $ aifabrix test ra-customer-support-bot
68
77
 
69
78
  Notes:
70
79
  - Local packages live under role-assistant/ra-<roleKey>/ (bare <roleKey> in CLI args).
71
80
  - test uses the public/running worker by default; pass --publish (or upload) to refresh from local files.
81
+ - copy writes tests/<suite>/<caseId>.yaml from a Work Hub execution id; it does not publish.
72
82
  - See: aifabrix role-assistant test -h
83
+ - See: aifabrix role-assistant copy -h
73
84
  `;
74
85
  }
75
86
 
@@ -83,6 +94,7 @@ Examples:
83
94
  $ aifabrix role-assistant test customer-support-bot --suite 001
84
95
  $ aifabrix role-assistant test customer-support-bot --list-cases
85
96
  $ aifabrix role-assistant test customer-support-bot --suite 001 --fail-fast --json
97
+ $ aifabrix role-assistant test customer-support-bot --from-dataplane
86
98
  $ aifabrix test ra-customer-support-bot
87
99
 
88
100
  Notes:
@@ -91,8 +103,14 @@ Notes:
91
103
  - Use \`aifabrix upload <roleKey> --env …\` (or \`--publish\`) when you intentionally refresh the package.
92
104
  - Runs lifecycle checks, then prints a portal deep link for full step-by-step status.
93
105
  - Case files with input.message/input.content execute Work Hub plan→accept (or work.start when executionPath: intent).
106
+ - Cases with executionPath: search|skills (input.executionPath or case-root executionPath) run work.skills / work.search instead of Work Hub.
107
+ - After each case, current status is stored on the published test pack (passed, failed, or skipped).
108
+ - --from-dataplane loads published tests, then runs them (all suites unless --case / --suite is set).
109
+ - Role Assistant packages do not need application.yaml; test uses device login and the published dataplane worker.
110
+ - Cases with preflight.evidence.requiredKeys read live Evidence from the dataplane before start and hard-stop if those keys are missing or not active.
94
111
  - answers[] and approvals[] are matched to runtime wait payloads (questionKey/requestKey/waitReason).
95
112
  - --suite runs YAML under role-assistant/ra-<roleKey>/tests/<suite>/ (preferred), or tests/ra-<roleKey>/<roleKey>/<suite>/, or legacy tests/role-assistant/ra-<roleKey>/<suite>/ (override with --cases-root).
113
+ - --subject-email / --subject-user-id isolate Work Hub cases (repeatable). They do not generate Connected System governance packs and do not require application.yaml.
96
114
  - Use the portal URL for detailed human review while automation reads CLI/JSON output.
97
115
  `;
98
116
  }
@@ -133,6 +151,7 @@ function normalizeRoleAssistantTestOptions(options, cmd) {
133
151
  casesRoot: trimOptionalString(options.casesRoot),
134
152
  listCases: optionOrFlag(options, 'listCases', cmd, '--list-cases'),
135
153
  failFast: optionOrFlag(options, 'failFast', cmd, '--fail-fast'),
154
+ fromDataplane: optionOrFlag(options, 'fromDataplane', cmd, '--from-dataplane'),
136
155
  run: true
137
156
  };
138
157
  }
@@ -215,25 +234,38 @@ async function resolveSuiteCaseResults(systemKey, opts, result, verdict, portalU
215
234
  return outcomes;
216
235
  }
217
236
 
237
+ async function maybeLoadFromDataplane(systemKey, opts) {
238
+ if (!opts.fromDataplane) {
239
+ return opts;
240
+ }
241
+ const auth = await resolveLifecycleAuth(systemKey, { ...opts, run: false, noPublish: true });
242
+ return loadPublishedTestsIntoOptions(systemKey, opts, auth);
243
+ }
244
+
245
+ async function resolveSelectedCaseResults(systemKey, opts, result, verdict, portalUrl) {
246
+ const runDiscovered = Boolean(opts.suite || (opts.fromDataplane && !opts.case));
247
+ if (runDiscovered) {
248
+ return resolveSuiteCaseResults(systemKey, opts, result, verdict, portalUrl);
249
+ }
250
+ return resolveRoleAssistantCaseResult(systemKey, opts, result, verdict, portalUrl);
251
+ }
252
+
218
253
  async function runRoleAssistantTestAction(roleKey, options, cmd) {
219
- const opts = normalizeRoleAssistantTestOptions(options, cmd);
254
+ let opts = normalizeRoleAssistantTestOptions(options, cmd);
220
255
  const systemKey = roleAssistantSystemKey(roleKey);
221
256
  const displayKey = bareRoleKey(roleKey);
257
+ opts = await maybeLoadFromDataplane(systemKey, opts);
222
258
 
223
259
  if (opts.listCases) {
224
260
  return listRoleAssistantCases(systemKey, opts);
225
261
  }
226
262
 
263
+ assertLocalCasesBeforeAuth(systemKey, opts);
264
+
227
265
  const result = await runLifecycleForExternalSystem(systemKey, opts);
228
266
  const verdict = lifecycleVerdictFromReport(result.report || {});
229
267
  const portalUrl = buildExternalSystemUiUrl(result.dataplaneUiBaseUrl, systemKey);
230
-
231
- let caseResult = null;
232
- if (opts.suite) {
233
- caseResult = await resolveSuiteCaseResults(systemKey, opts, result, verdict, portalUrl);
234
- } else {
235
- caseResult = await resolveRoleAssistantCaseResult(systemKey, opts, result, verdict, portalUrl);
236
- }
268
+ const caseResult = await resolveSelectedCaseResults(systemKey, opts, result, verdict, portalUrl);
237
269
 
238
270
  if (opts.json) {
239
271
  logger.log(
@@ -254,38 +286,96 @@ async function runRoleAssistantTestAction(roleKey, options, cmd) {
254
286
  return exitCode;
255
287
  }
256
288
 
257
- async function resolveRoleAssistantCaseResult(roleKey, opts, result, verdict, portalUrl) {
258
- if (!opts.case) {
259
- return null;
289
+ async function patchPublishedCaseStatus(roleKey, opts, roleCase, evaluation, authContext) {
290
+ const caseId = roleCase && roleCase.caseId;
291
+ if (!caseId) {
292
+ return evaluation;
260
293
  }
261
- const roleCase = loadRoleAssistantTestCase(roleKey, opts.case, {
262
- testsDir: opts.testsDir || null
263
- });
264
- if (!isExecutableRoleAssistantCase(roleCase)) {
265
- return evaluateRoleAssistantTestCase(roleCase, result, verdict, portalUrl);
294
+ let auth = authContext;
295
+ if (!auth || !auth.dataplaneUrl || !auth.authConfig) {
296
+ auth = await resolveLifecycleAuth(roleKey, { ...opts, run: false, noPublish: true });
297
+ }
298
+ if (!auth || !auth.dataplaneUrl || !auth.authConfig) {
299
+ return evaluation;
266
300
  }
301
+ await patchCaseStatusAfterRun({
302
+ systemKey: roleAssistantSystemKey(roleKey),
303
+ caseId,
304
+ evaluation,
305
+ dataplaneUrl: auth.dataplaneUrl,
306
+ authConfig: auth.authConfig
307
+ });
308
+ return evaluation;
309
+ }
310
+
311
+ function attachCaseExecution(evaluation, executionResult, error) {
312
+ const errMsg = error && (error.message || String(error));
313
+ evaluation.execution = {
314
+ processExecutionId: executionResult?.processExecutionId || error?.planId || null,
315
+ finalStatus: executionResult?.finalStatus?.status || (error ? 'failed' : null),
316
+ waitReason: executionResult?.finalStatus?.wait?.waitReason || null,
317
+ interactions: executionResult?.interactions || [],
318
+ workResultError: executionResult?.workResultError || errMsg || null
319
+ };
320
+ return evaluation;
321
+ }
322
+
323
+ async function resolveExecutableCaseResult(roleKey, roleCase, opts, result, verdict, portalUrl) {
267
324
  const authContext = await resolveLifecycleAuth(roleKey, {
268
325
  ...opts,
269
326
  run: false,
270
327
  noPublish: true
271
328
  });
329
+ const evidencePreflight = await assertRoleAssistantEvidencePreflight(roleCase, authContext);
272
330
  const executionResult = await runRoleAssistantCaseLifecycle(roleKey, roleCase, authContext, opts);
273
331
  const executionVerdict = lifecycleVerdictFromCaseExecution(executionResult, verdict);
274
332
  const evaluationInput = mergeCaseExecutionIntoLifecycleResult(result, executionResult);
333
+ evaluationInput.evidencePreflight = evidencePreflight;
275
334
  const evaluation = evaluateRoleAssistantTestCase(
276
335
  roleCase,
277
336
  evaluationInput,
278
337
  executionVerdict,
279
338
  portalUrl
280
339
  );
281
- evaluation.execution = {
282
- processExecutionId: executionResult.processExecutionId || null,
283
- finalStatus: executionResult.finalStatus?.status || null,
284
- waitReason: executionResult.finalStatus?.wait?.waitReason || null,
285
- interactions: executionResult.interactions || [],
286
- workResultError: executionResult.workResultError || null
287
- };
288
- return evaluation;
340
+ return attachCaseExecution(evaluation, executionResult);
341
+ }
342
+
343
+ async function resolveRoleAssistantCaseResult(roleKey, opts, result, verdict, portalUrl) {
344
+ if (!opts.case) {
345
+ return null;
346
+ }
347
+ const roleCase = loadRoleAssistantTestCase(roleKey, opts.case, {
348
+ testsDir: opts.testsDir || null
349
+ });
350
+ let evaluation;
351
+ if (!isExecutableRoleAssistantCase(roleCase)) {
352
+ evaluation = evaluateRoleAssistantTestCase(roleCase, result, verdict, portalUrl);
353
+ } else {
354
+ try {
355
+ evaluation = await resolveExecutableCaseResult(
356
+ roleKey,
357
+ roleCase,
358
+ opts,
359
+ result,
360
+ verdict,
361
+ portalUrl
362
+ );
363
+ } catch (error) {
364
+ const failedInput = mergeCaseExecutionIntoLifecycleResult(result, {
365
+ finalStatus: { status: 'failed' },
366
+ workResult: null,
367
+ workResultError: error.message || String(error),
368
+ interactions: []
369
+ });
370
+ failedInput.workResultError = error.message || String(error);
371
+ evaluation = attachCaseExecution(
372
+ evaluateRoleAssistantTestCase(roleCase, failedInput, verdict, portalUrl),
373
+ null,
374
+ error
375
+ );
376
+ }
377
+ }
378
+ return patchPublishedCaseStatus(roleKey, opts, roleCase, evaluation);
289
379
  }
290
380
 
291
381
  async function roleAssistantTestHandler(roleKey, options, cmd) {
@@ -297,19 +387,8 @@ async function roleAssistantTestHandler(roleKey, options, cmd) {
297
387
  }
298
388
  }
299
389
 
300
- function setupRoleAssistantCommands(program) {
301
- const roleAssistant = program
302
- .command('role-assistant')
303
- .description(
304
- 'Role Assistant packages: lifecycle checks, YAML cases/suites, and portal deep links'
305
- )
306
- .addHelpText('after', roleAssistantGroupHelpAfter());
307
-
308
- roleAssistant
309
- .command('test <roleKey>')
310
- .description(
311
- 'Lifecycle checks + optional cases/suites; prints portal deep link (bare <roleKey>)'
312
- )
390
+ function addRoleAssistantTestRunOptions(cmd) {
391
+ return cmd
313
392
  .option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
314
393
  .option('--case <caseIdOrPath>', 'Run and evaluate one role-assistant test case')
315
394
  .option('--tests-dir <dir>', 'Override role-assistant test case directory')
@@ -323,8 +402,16 @@ function setupRoleAssistantCommands(program) {
323
402
  )
324
403
  .option('--list-cases', 'List discoverable case files and exit')
325
404
  .option('--fail-fast', 'Stop suite run after the first failing case')
405
+ .option(
406
+ '--from-dataplane',
407
+ 'Load published tests from the dataplane, then run them (all suites unless --case or --suite is set)'
408
+ )
326
409
  .option('-v, --verbose', 'Include full lifecycle report payload in --json output')
327
- .option('-d, --debug', 'Write debug logs under role-assistant/<roleKey>/logs/')
410
+ .option('-d, --debug', 'Write debug logs under role-assistant/<roleKey>/logs/');
411
+ }
412
+
413
+ function addRoleAssistantTestPublishOptions(cmd) {
414
+ return cmd
328
415
  .option(
329
416
  '--publish',
330
417
  'Publish local Role Assistant package before checks (default: use public/running worker)'
@@ -332,24 +419,44 @@ function setupRoleAssistantCommands(program) {
332
419
  .option('--force', 'Force upload when --publish is set')
333
420
  .option(
334
421
  '--subject-user-id <id>',
335
- 'Subject user id for governance generate (repeatable)',
422
+ 'Work Hub isolation user id (repeatable; not Connected System governance)',
336
423
  collectString,
337
424
  []
338
425
  )
339
426
  .option(
340
427
  '--subject-email <email>',
341
- 'Subject email for governance generate (repeatable)',
428
+ 'Work Hub isolation email (repeatable; not Connected System governance)',
342
429
  collectString,
343
430
  []
344
431
  )
345
432
  .option(
346
433
  '--certification-profile <profile>',
347
- 'Certification profile for governance generate (bronze, silver, gold, ...)',
434
+ 'Ignored for Role Assistant packages (Connected System governance generate does not run)',
348
435
  'bronze'
349
436
  )
350
- .option('--json', 'Machine-readable output envelope')
437
+ .option('--json', 'Machine-readable output envelope');
438
+ }
439
+
440
+ function registerRoleAssistantTestCommand(roleAssistant) {
441
+ const cmd = roleAssistant
442
+ .command('test <roleKey>')
443
+ .description(
444
+ 'Lifecycle checks + optional cases/suites; prints portal deep link (bare <roleKey>)'
445
+ );
446
+ addRoleAssistantTestPublishOptions(addRoleAssistantTestRunOptions(cmd))
351
447
  .addHelpText('after', roleAssistantHelpAfter())
352
- .action((roleKey, options, cmd) => roleAssistantTestHandler(roleKey, options, cmd));
448
+ .action((roleKey, options, invoked) => roleAssistantTestHandler(roleKey, options, invoked));
449
+ }
450
+
451
+ function setupRoleAssistantCommands(program) {
452
+ const roleAssistant = program
453
+ .command('role-assistant')
454
+ .description(
455
+ 'Role Assistant packages: lifecycle checks, YAML cases/suites, copy from Work Hub, and portal deep links'
456
+ )
457
+ .addHelpText('after', roleAssistantGroupHelpAfter());
458
+ registerRoleAssistantTestCommand(roleAssistant);
459
+ registerRoleAssistantCopyCommand(roleAssistant);
353
460
  }
354
461
 
355
462
  module.exports = {
@@ -0,0 +1,143 @@
1
+ /**
2
+ * aifabrix search — retrieve governed Role Assistant information.
3
+ *
4
+ * @fileoverview Commander registration for search and search skills
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const logger = require('../utils/logger');
12
+ const { runSearch, runSearchSkills } = require('../search/search-run');
13
+ const { exitCodeForSearchError } = require('../search/search-errors');
14
+ const { emitSearchError } = require('../search/search-display');
15
+
16
+ const SEARCH_HELP = `
17
+
18
+ Examples:
19
+ $ aifabrix search
20
+ $ aifabrix search --role ra-cfo --resource-type customer
21
+ $ aifabrix search --role ra-cfo --resource-type customer --operation list --json
22
+ $ aifabrix search --role ra-cfo --resource-type customer --output ./search.json
23
+ $ aifabrix search skills --role ra-cfo
24
+ `;
25
+
26
+ const SKILLS_HELP = `
27
+
28
+ Examples:
29
+ $ aifabrix search skills
30
+ $ aifabrix search skills --role ra-cfo
31
+ $ aifabrix search skills --role ra-cfo --json
32
+ $ aifabrix search skills --role ra-cfo --output ./skills.json
33
+ `;
34
+
35
+ /**
36
+ * @param {*} value
37
+ * @param {string[]} previous
38
+ * @returns {string[]}
39
+ */
40
+ function collectKnowledgeKey(value, previous) {
41
+ const next = Array.isArray(previous) ? previous : [];
42
+ next.push(value);
43
+ return next;
44
+ }
45
+
46
+ /**
47
+ * @param {import('commander').Command} cmd
48
+ */
49
+ function addSharedSearchOptions(cmd) {
50
+ cmd
51
+ .option('--role <roleRef>', 'Role Assistant key (for example ra-cfo)')
52
+ .option('--role-ref <roleRef>', 'Alias for --role')
53
+ .option('-o, --output <file>', 'Write the JSON payload to this file')
54
+ .option('--no-interactive', 'Never prompt; missing required flags fail')
55
+ .option('-e, --env <environment>', 'Environment key')
56
+ .option('--json', 'Print the JSON payload on stdout (no prompts)')
57
+ .option('-v, --verbose', 'Include extra TTY detail when available');
58
+ }
59
+
60
+ /**
61
+ * @param {import('commander').Command} cmd
62
+ */
63
+ function addSearchBodyOptions(cmd) {
64
+ cmd
65
+ .option('--resource-type <key>', 'Resource type published on that Role Assistant')
66
+ .option('--type <key>', 'Alias for --resource-type')
67
+ .option('--operation <key>', 'Named operation for that resource type')
68
+ .option('--filters <json>', 'JSON object of field filters')
69
+ .option('--filters-file <path>', 'JSON object of field filters from a file')
70
+ .option('--page <n>', 'Page number (integer ≥ 1)')
71
+ .option('--page-size <n>', 'Page size (integer 1–100)')
72
+ .option('--sort <spec>', 'Sort specification (pass-through)')
73
+ .option('--fields <csv>', 'Comma-separated field names')
74
+ .option('--graph', 'Include one-level related records')
75
+ .option('--query <text>', 'Semantic hop text when --graph is set')
76
+ .option('--knowledge-key <key>', 'Knowledge key (repeatable)', collectKnowledgeKey, [])
77
+ .option('--body <file>', 'JSON request body file (merged after flags)');
78
+ }
79
+
80
+ /**
81
+ * @param {Function} action
82
+ * @param {Object} options
83
+ * @returns {Promise<void>}
84
+ */
85
+ async function dispatchSearchLeaf(action, options) {
86
+ try {
87
+ const code = await action(options);
88
+ if (code && code !== 0) {
89
+ process.exit(code);
90
+ }
91
+ } catch (err) {
92
+ const message = err.message || String(err);
93
+ emitSearchError(options, message, logger);
94
+ process.exit(exitCodeForSearchError(err));
95
+ }
96
+ }
97
+
98
+ /**
99
+ * @param {Object} options
100
+ * @param {import('commander').Command} command
101
+ * @returns {Object}
102
+ */
103
+ function mergeCommandOptions(options, command) {
104
+ const parentOpts =
105
+ command && command.parent && typeof command.parent.opts === 'function'
106
+ ? command.parent.opts()
107
+ : {};
108
+ return { ...parentOpts, ...options };
109
+ }
110
+
111
+ /**
112
+ * @param {import('commander').Command} program
113
+ */
114
+ function setupSearchCommands(program) {
115
+ const search = program
116
+ .command('search')
117
+ .description('Search governed information for a Role Assistant assigned to you')
118
+ .addHelpText('after', SEARCH_HELP);
119
+ addSharedSearchOptions(search);
120
+ addSearchBodyOptions(search);
121
+
122
+ const searchRun = search
123
+ .command('run', { isDefault: true, hidden: true })
124
+ .description('Search governed information for a Role Assistant assigned to you')
125
+ .addHelpText('after', SEARCH_HELP);
126
+ searchRun.action(async(options, command) => {
127
+ await dispatchSearchLeaf(runSearch, mergeCommandOptions(options, command));
128
+ });
129
+
130
+ const skills = search
131
+ .command('skills')
132
+ .description('List searchable resource types and operations for a Role Assistant')
133
+ .addHelpText('after', SKILLS_HELP);
134
+ addSharedSearchOptions(skills);
135
+ skills.action(async(options, command) => {
136
+ await dispatchSearchLeaf(runSearchSkills, mergeCommandOptions(options, command));
137
+ });
138
+ }
139
+
140
+ module.exports = {
141
+ setupSearchCommands,
142
+ collectKnowledgeKey
143
+ };