@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.
- package/README.md +8 -0
- package/bin/aifabrix.js +2 -2
- package/lib/agent-kit/apply-ops.js +82 -0
- package/lib/agent-kit/checksums.js +28 -0
- package/lib/agent-kit/classify.js +113 -0
- package/lib/agent-kit/claude-shim.js +61 -0
- package/lib/agent-kit/constants.js +55 -0
- package/lib/agent-kit/file-list.js +103 -0
- package/lib/agent-kit/host-approve.js +130 -0
- package/lib/agent-kit/hosting/github.js +63 -0
- package/lib/agent-kit/hosts.js +71 -0
- package/lib/agent-kit/init.js +319 -0
- package/lib/agent-kit/kit-root.js +17 -0
- package/lib/agent-kit/managed-section.js +79 -0
- package/lib/agent-kit/package-load.js +45 -0
- package/lib/agent-kit/plan-ops.js +69 -0
- package/lib/agent-kit/remote-prompts.js +239 -0
- package/lib/agent-kit/render-host-markdown.js +40 -0
- package/lib/agent-kit/repo-guard.js +47 -0
- package/lib/agent-kit/report.js +107 -0
- package/lib/agent-kit/run.js +82 -0
- package/lib/agent-kit/scm/git.js +122 -0
- package/lib/agent-kit/state-file.js +83 -0
- package/lib/agent-kit/status.js +50 -0
- package/lib/agent-kit/v1-detect.js +81 -0
- package/lib/agent-kit/validate-kit.js +87 -0
- package/lib/agent-kit/workspace-name.js +40 -0
- package/lib/agent-kit/workspace-skeleton.js +103 -0
- package/lib/api/assistants.api.js +8 -5
- package/lib/api/channel-identity.api.js +41 -0
- package/lib/api/evidence-authoring.api.js +5 -1
- package/lib/api/evidence.api.js +2 -0
- package/lib/api/role-assistant-test-pack.api.js +86 -0
- package/lib/api/types/evidence.types.js +2 -0
- package/lib/api/work-search.api.js +163 -0
- package/lib/api/work.api.js +19 -12
- package/lib/app/list-external-systems.js +2 -1
- package/lib/app/show-display.js +33 -6
- package/lib/app/show.js +25 -2
- package/lib/channels/add-channel.js +164 -126
- package/lib/channels/approval-guides/chatgpt.js +14 -18
- package/lib/channels/approval-guides/claude.js +29 -0
- package/lib/channels/approval-guides/index.js +88 -22
- package/lib/channels/approval-guides/mcp-client.js +27 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +52 -3
- package/lib/channels/approval-guides/slack.js +10 -10
- package/lib/channels/approval-guides/teams-bot.js +8 -12
- package/lib/channels/channel-add-continuations.js +91 -0
- package/lib/channels/channel-add-ensure.js +124 -27
- package/lib/channels/channel-add-existing.js +160 -28
- package/lib/channels/channel-add-failure.js +61 -0
- package/lib/channels/channel-add-remaining.js +492 -0
- package/lib/channels/channel-add-tty.js +190 -0
- package/lib/channels/channel-add-wizard-config.js +138 -0
- package/lib/channels/channel-add-wizard.js +250 -0
- package/lib/channels/channel-artifact-generator.js +27 -13
- package/lib/channels/channel-cardinality.js +83 -0
- package/lib/channels/channel-catalog-icon.js +45 -0
- package/lib/channels/channel-cli-instructions.js +75 -0
- package/lib/channels/channel-configuration-map.js +213 -0
- package/lib/channels/channel-credential.js +11 -14
- package/lib/channels/channel-definition-project.js +101 -0
- package/lib/channels/channel-definition-registry.js +154 -0
- package/lib/channels/channel-definition-status.js +115 -0
- package/lib/channels/channel-description.js +60 -2
- package/lib/channels/channel-discovery.js +16 -2
- package/lib/channels/channel-external-system.js +86 -9
- package/lib/channels/channel-install-envelope-actions.js +88 -0
- package/lib/channels/channel-install-envelope-microsoft.js +155 -0
- package/lib/channels/channel-install-envelope.js +358 -0
- package/lib/channels/channel-install-help-md.js +172 -0
- package/lib/channels/channel-install-http-payload.js +62 -0
- package/lib/channels/channel-install-inventory.js +115 -0
- package/lib/channels/channel-install-profiles.js +90 -0
- package/lib/channels/channel-instance-collision.js +118 -0
- package/lib/channels/channel-instance-key.js +100 -0
- package/lib/channels/channel-instance-materialize.js +240 -0
- package/lib/channels/channel-integration-generator.js +18 -9
- package/lib/channels/channel-integration-template.js +101 -22
- package/lib/channels/channel-inventory-fetch.js +79 -0
- package/lib/channels/channel-oauth-preflight.js +104 -0
- package/lib/channels/channel-package-version.js +76 -0
- package/lib/channels/channel-predefined-client.js +154 -0
- package/lib/channels/channel-probe.js +7 -2
- package/lib/channels/channel-runtime-resolver.js +194 -72
- package/lib/channels/channel-status-display.js +86 -16
- package/lib/channels/channel-targets.js +132 -92
- package/lib/channels/chatgpt-callback.js +318 -0
- package/lib/channels/chatgpt-channel-add.js +229 -0
- package/lib/channels/chatgpt-preflight.js +396 -0
- package/lib/channels/chatgpt-runtime-contract.js +17 -0
- package/lib/channels/chatgpt-setup-values.js +124 -0
- package/lib/channels/claude-callback.js +67 -0
- package/lib/channels/claude-channel-add.js +254 -0
- package/lib/channels/claude-runtime-contract.js +40 -0
- package/lib/channels/claude-runtime.js +58 -0
- package/lib/channels/claude-setup-values.js +92 -0
- package/lib/channels/mcp-client/config-merge.js +148 -0
- package/lib/channels/mcp-client/ensure-client.js +231 -0
- package/lib/channels/mcp-client/paths.js +53 -0
- package/lib/channels/mcp-client/profiles.js +122 -0
- package/lib/channels/mcp-client/redirect-uris.js +99 -0
- package/lib/channels/mcp-client/runtime.js +59 -0
- package/lib/channels/mcp-client-channel-add.js +186 -0
- package/lib/channels/microsoft-copilot-channel-add.js +117 -7
- package/lib/channels/microsoft-copilot-entra-identifier-uris.js +187 -0
- package/lib/channels/microsoft-copilot-entra-sso-form.js +106 -18
- package/lib/channels/microsoft-copilot-entra-sso.js +31 -2
- package/lib/channels/microsoft-copilot-package-prior.js +107 -0
- package/lib/channels/microsoft-copilot-package.js +29 -28
- package/lib/channels/microsoft-provisioning/a365.js +80 -0
- package/lib/channels/microsoft-provisioning/auth-config.js +240 -0
- package/lib/channels/microsoft-provisioning/auth.js +179 -0
- package/lib/channels/microsoft-provisioning/cli.js +71 -0
- package/lib/channels/microsoft-provisioning/constants.js +75 -0
- package/lib/channels/microsoft-provisioning/errors.js +117 -0
- package/lib/channels/microsoft-provisioning/index.js +55 -0
- package/lib/channels/microsoft-provisioning/install-atk.js +158 -0
- package/lib/channels/microsoft-provisioning/install-teams.js +115 -0
- package/lib/channels/microsoft-provisioning/login-portal-device.js +236 -0
- package/lib/channels/microsoft-provisioning/login-portal-parse.js +71 -0
- package/lib/channels/microsoft-provisioning/login-portal-teams.js +193 -0
- package/lib/channels/microsoft-provisioning/login-portal.js +230 -0
- package/lib/channels/microsoft-provisioning/persist.js +110 -0
- package/lib/channels/microsoft-provisioning/teams-bot-args.js +119 -0
- package/lib/channels/microsoft-provisioning/teams-bot-controller.js +123 -0
- package/lib/channels/microsoft-provisioning/teams-bot-parse.js +134 -0
- package/lib/channels/microsoft-provisioning/teams-bot-persist.js +113 -0
- package/lib/channels/microsoft-provisioning/teams-bot-provision.js +234 -0
- package/lib/channels/microsoft-provisioning/teams-bot-secrets.js +45 -0
- package/lib/channels/microsoft-provisioning/teams-cli.js +82 -0
- package/lib/channels/runtime-tool-catalog.js +5 -2
- package/lib/channels/slack-channel-add-portal.js +130 -0
- package/lib/channels/slack-channel-add-tty-auth.js +95 -0
- package/lib/channels/slack-channel-add.js +311 -0
- package/lib/channels/slack-mcp-callback.js +51 -0
- package/lib/channels/slack-mcp-runtime.js +156 -0
- package/lib/channels/slack-provisioning/apps.js +181 -0
- package/lib/channels/slack-provisioning/auth-store.js +110 -0
- package/lib/channels/slack-provisioning/auth-ticket.js +185 -0
- package/lib/channels/slack-provisioning/auth.js +115 -0
- package/lib/channels/slack-provisioning/callbacks.js +41 -0
- package/lib/channels/slack-provisioning/cli.js +226 -0
- package/lib/channels/slack-provisioning/constants.js +37 -0
- package/lib/channels/slack-provisioning/credentials.js +169 -0
- package/lib/channels/slack-provisioning/curl-shim.js +132 -0
- package/lib/channels/slack-provisioning/developer-install.js +118 -0
- package/lib/channels/slack-provisioning/env-file.js +120 -0
- package/lib/channels/slack-provisioning/errors.js +47 -0
- package/lib/channels/slack-provisioning/go-ca-bundle.js +137 -0
- package/lib/channels/slack-provisioning/index.js +250 -0
- package/lib/channels/slack-provisioning/install-cli.js +335 -0
- package/lib/channels/slack-provisioning/manifest.js +89 -0
- package/lib/channels/slack-provisioning/oauth-lock.js +33 -0
- package/lib/channels/slack-provisioning/offer-cli.js +113 -0
- package/lib/channels/slack-provisioning/onboard-members.js +122 -0
- package/lib/channels/slack-provisioning/onboard.js +89 -0
- package/lib/channels/slack-provisioning/persist.js +95 -0
- package/lib/channels/slack-provisioning/remaining-urls.js +158 -0
- package/lib/channels/slack-provisioning/with-curl-on-path.js +53 -0
- package/lib/channels/teams-bot-channel-add.js +94 -0
- package/lib/channels/vendor-dataplane-url.js +249 -0
- package/lib/cli/index.js +4 -0
- package/lib/cli/setup-certification-commands.js +2 -2
- package/lib/cli/setup-certification.help.js +5 -1
- package/lib/cli/setup-external-system-help.js +2 -0
- package/lib/cli/setup-external-system.js +1 -1
- package/lib/commands/agent-kit-help.js +79 -0
- package/lib/commands/agent-kit.js +346 -0
- package/lib/commands/channel-add-help.js +366 -0
- package/lib/commands/channel-add-setup.js +162 -80
- package/lib/commands/channel-configure.js +118 -0
- package/lib/commands/channel.js +10 -1
- package/lib/commands/datasource-capability-relate-cli.js +5 -4
- package/lib/commands/governance-upload-external.js +6 -3
- package/lib/commands/lifecycle-command-action.js +2 -5
- package/lib/commands/lifecycle-external.js +93 -21
- package/lib/commands/repair-auth-apply.js +1 -1
- package/lib/commands/repair-datasource-key-skip.js +39 -0
- package/lib/commands/repair-datasource-keys.js +24 -12
- package/lib/commands/repair-datasource-test-payload.js +4 -2
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +23 -2
- package/lib/commands/repair-datasource.js +3 -0
- package/lib/commands/repair-external-run.js +59 -25
- package/lib/commands/repair-openapi-rest-runtime.js +127 -0
- package/lib/commands/repair-orchestration-tag-merge.js +339 -0
- package/lib/commands/repair-rbac-catalog-defaults.js +96 -0
- package/lib/commands/repair-rbac-platform-preset.js +26 -15
- package/lib/commands/repair-rbac-reader-roles.js +8 -21
- package/lib/commands/repair-rbac.js +26 -44
- package/lib/commands/repair-system-permissions.js +24 -22
- package/lib/commands/role-assistant-copy-output.js +61 -0
- package/lib/commands/role-assistant-copy.js +155 -0
- package/lib/commands/role-assistant-test-output.js +22 -9
- package/lib/commands/role-assistant-test-result-rows.js +42 -0
- package/lib/commands/role-assistant.js +150 -43
- package/lib/commands/search.js +143 -0
- package/lib/commands/test-e2e-external.js +148 -21
- package/lib/commands/test-trust-external.js +7 -5
- package/lib/commands/upload-credential-push-log.js +2 -1
- package/lib/commands/upload-publish-context.js +1 -1
- package/lib/commands/upload-role-assistant-shell.js +124 -0
- package/lib/commands/upload-sidecar-followups.js +10 -4
- package/lib/commands/upload.js +18 -3
- package/lib/commands/verify-operations-skip-e2e.js +131 -0
- package/lib/commands/verify-operations-step-plan.js +6 -33
- package/lib/commands/verify-operations-steps.js +3 -1
- package/lib/core/secrets-docker-env.js +4 -1
- package/lib/core/secrets-env-content.js +17 -3
- package/lib/datasource/capability/capability-manifest.js +0 -3
- package/lib/datasource/capability/copy-test-payload.js +3 -0
- package/lib/datasource/capability/relate-operations.js +28 -10
- package/lib/datasource/capability/run-capability-relate.js +48 -25
- package/lib/datasource/datasource-identifier.js +13 -5
- package/lib/deployment/deployer-poll-run.js +117 -35
- package/lib/external-system/deploy-dataplane-published.js +70 -0
- package/lib/external-system/deploy-helpers.js +26 -1
- package/lib/external-system/deploy.js +22 -8
- package/lib/external-system/download-helpers.js +29 -2
- package/lib/external-system/download-role-assistant.js +109 -4
- package/lib/external-system/download.js +46 -30
- package/lib/external-system/sync-deploy-manifest.js +3 -2
- package/lib/external-system/upload-identity.js +42 -0
- package/lib/generator/index.js +19 -15
- package/lib/generator/split.js +13 -2
- package/lib/generator/wizard-datasource-key.js +54 -0
- package/lib/generator/wizard.js +55 -54
- package/lib/integration-definition/apply-datasource-keys.js +75 -0
- package/lib/integration-definition/apply-relationships.js +195 -0
- package/lib/integration-definition/apply-static-enterprise.js +229 -0
- package/lib/integration-definition/apply-system-file.js +71 -0
- package/lib/integration-definition/apply-test-endpoint.js +89 -0
- package/lib/integration-definition/apply-viewpoint-defaults.js +157 -0
- package/lib/integration-definition/apply.js +78 -59
- package/lib/integration-definition/enrich-openapi-operations.js +36 -10
- package/lib/integration-definition/enrich-openapi-pick.js +87 -0
- package/lib/lifecycle/role-assistant-governance.js +181 -0
- package/lib/lifecycle/scenario-upload.js +181 -30
- package/lib/programmatic/builder-api-cors.js +143 -0
- package/lib/programmatic/builder-api-request.js +6 -0
- package/lib/programmatic/builder-api-route-dispatch.js +56 -42
- package/lib/programmatic/builder-api-server.js +8 -1
- package/lib/programmatic/capability-registry.js +55 -0
- package/lib/programmatic/channel-install-help-resolve.js +359 -0
- package/lib/programmatic/channel-install-session.js +218 -0
- package/lib/programmatic/help-content/channel-onboarding.md +2 -0
- package/lib/programmatic/help-content/cip-overview.md +3 -1
- package/lib/programmatic/http-raw-response.js +62 -0
- package/lib/programmatic/index.js +2 -0
- package/lib/programmatic/openapi-apply-result-schemas.js +8 -0
- package/lib/programmatic/openapi-channel-install-bindings.js +179 -0
- package/lib/programmatic/openapi-channel-install-schemas.js +289 -0
- package/lib/programmatic/openapi-component-schemas.js +19 -1
- package/lib/programmatic/openapi-description-enricher.js +3 -1
- package/lib/programmatic/openapi-descriptions.js +80 -3
- package/lib/programmatic/openapi-envelope-examples.js +124 -0
- package/lib/programmatic/openapi-operation-bindings.js +9 -1
- package/lib/programmatic/openapi-request-schemas.js +5 -0
- package/lib/programmatic/openapi-schema-descriptions-channel.js +319 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
- package/lib/programmatic/openapi-spec.js +13 -8
- package/lib/programmatic/platform-rbac-catalog.js +36 -18
- package/lib/programmatic/request-timeout.js +3 -0
- package/lib/programmatic/route-handler-map.js +58 -1
- package/lib/programmatic/route-handlers-context.js +2 -1
- package/lib/programmatic/run-auth-permissions.js +54 -0
- package/lib/programmatic/run-channel-catalog.js +238 -0
- package/lib/programmatic/run-channel-install-artifacts.js +137 -0
- package/lib/programmatic/run-channel-install-copilot.js +353 -0
- package/lib/programmatic/run-channel-install-options.js +236 -0
- package/lib/programmatic/run-channel-install-teams-bot.js +204 -0
- package/lib/programmatic/run-channel-install.js +346 -0
- package/lib/programmatic/run-channel-package.js +87 -7
- package/lib/programmatic/run-download.js +41 -0
- package/lib/programmatic/workspace-context.js +2 -0
- package/lib/protection/auth-context.js +3 -1
- package/lib/protection/protection-display.js +3 -2
- package/lib/protection/report-exit.js +50 -0
- package/lib/protection/run-commands.js +2 -0
- package/lib/role-assistant/evidence-sync.js +4 -2
- package/lib/role-assistant/evidence-validation-issues.js +51 -0
- package/lib/role-assistant/knowledge-sync.js +10 -4
- package/lib/role-assistant/package-validate.js +175 -0
- package/lib/role-assistant/settings.js +49 -2
- package/lib/role-assistant/test-case-assertion-row.js +36 -0
- package/lib/role-assistant/test-case-copy-bind.js +77 -0
- package/lib/role-assistant/test-case-copy-expected.js +127 -0
- package/lib/role-assistant/test-case-copy-from-work.js +90 -0
- package/lib/role-assistant/test-case-copy-interactions.js +67 -0
- package/lib/role-assistant/test-case-copy.js +119 -0
- package/lib/role-assistant/test-case-expected-catalog.js +135 -0
- package/lib/role-assistant/test-case-validate.js +88 -0
- package/lib/role-assistant/test-cases-bid.js +117 -4
- package/lib/role-assistant/test-cases-evaluate.js +159 -24
- package/lib/role-assistant/test-cases-evidence.js +175 -0
- package/lib/role-assistant/test-cases-honesty.js +155 -6
- package/lib/role-assistant/test-cases-lifecycle.js +291 -0
- package/lib/role-assistant/test-cases-search-graph.js +122 -0
- package/lib/role-assistant/test-cases-search.js +247 -0
- package/lib/role-assistant/test-cases.js +71 -172
- package/lib/role-assistant/test-pack-map.js +180 -0
- package/lib/role-assistant/test-pack-sync.js +187 -0
- package/lib/role-assistant/test-runner-debug.js +54 -0
- package/lib/role-assistant/test-runner-respond-body.js +36 -0
- package/lib/role-assistant/test-runner-search.js +164 -0
- package/lib/role-assistant/test-runner-start-payload.js +63 -10
- package/lib/role-assistant/test-runner-workhub-answers.js +45 -16
- package/lib/role-assistant/test-runner-workhub-helpers.js +40 -2
- package/lib/role-assistant/test-runner-workhub-soft.js +9 -3
- package/lib/role-assistant/test-runner-workhub.js +74 -32
- package/lib/role-assistant/test-runner.js +66 -11
- package/lib/schema/external-datasource.schema.json +146 -21
- package/lib/schema/external-system.schema.json +177 -2
- package/lib/schema/mcp-client-profile.schema.json +103 -0
- package/lib/schema/role-assistant-test-case.schema.json +408 -0
- package/lib/search/dataplane-context.js +23 -0
- package/lib/search/search-args.js +211 -0
- package/lib/search/search-display.js +238 -0
- package/lib/search/search-errors.js +50 -0
- package/lib/search/search-prompts.js +119 -0
- package/lib/search/search-roles.js +85 -0
- package/lib/search/search-run.js +241 -0
- package/lib/search/search-skills.js +198 -0
- package/lib/utils/app-path-resolve.js +4 -0
- package/lib/utils/authentication-env-template.js +44 -6
- package/lib/utils/authentication-slot-show.js +153 -0
- package/lib/utils/credential-display.js +43 -1
- package/lib/utils/credential-secrets-env.js +6 -1
- package/lib/utils/env-copy.js +19 -7
- package/lib/utils/external-env-template.js +20 -2
- package/lib/utils/external-system-readiness-compact-blocks.js +5 -1
- package/lib/utils/external-system-readiness-compact-display.js +30 -1
- package/lib/utils/external-system-validators.js +2 -1
- package/lib/utils/help-builder.js +3 -1
- package/lib/utils/paths.js +18 -1
- package/lib/utils/platform-shell-package.js +69 -0
- package/lib/utils/port-resolver.js +50 -1
- package/lib/utils/rewrite-name-flag.js +20 -0
- package/lib/utils/role-assistant-paths.js +13 -10
- package/lib/utils/schema-loader.js +37 -0
- package/lib/utils/schema-resolver.js +11 -1
- package/lib/utils/secrets-helpers.js +12 -21
- package/lib/utils/token-manager.js +10 -5
- package/lib/validation/validate-external-file.js +5 -1
- package/lib/validation/validate.js +41 -0
- package/package.json +1 -1
- package/templates/README.md +1 -1
- package/templates/agent-kit/adapters/claude/nested.CLAUDE.md +1 -0
- package/templates/agent-kit/adapters/claude/root.CLAUDE.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-0-plan.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-1-validate.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-2-build.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-3-push.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-biz-1-validate.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-biz-2-build.md +5 -0
- package/templates/agent-kit/adapters/cursor/commands/cust-biz-3-prove.md +5 -0
- package/templates/agent-kit/agent-kit.yaml +45 -0
- package/templates/agent-kit/instructions/AGENTKIT.md +83 -0
- package/templates/agent-kit/instructions/integration.AGENTS.md +25 -0
- package/templates/agent-kit/instructions/role-assistant.AGENTS.md +22 -0
- package/templates/agent-kit/instructions/root.AGENTS.md +37 -0
- package/templates/agent-kit/parity-inventory.yaml +188 -0
- package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +58 -0
- package/templates/agent-kit/skills/aifabrix-connected-system/references/contract-checklist.md +40 -0
- package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +54 -0
- package/templates/agent-kit/skills/aifabrix-connected-system/references/production-safety.md +35 -0
- package/templates/agent-kit/skills/aifabrix-connected-system/scripts/reserved-system-key.js +19 -0
- package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +51 -0
- package/templates/agent-kit/skills/aifabrix-plan/references/challenge-checklist.md +108 -0
- package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +34 -0
- package/templates/agent-kit/skills/aifabrix-plan/references/plan-template.md +182 -0
- package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +50 -0
- package/templates/agent-kit/skills/aifabrix-prove/references/demo-template.md +65 -0
- package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +68 -0
- package/templates/agent-kit/skills/aifabrix-prove/references/learning-template.md +66 -0
- package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +42 -0
- package/templates/agent-kit/skills/aifabrix-role-assistant/references/package-boundary.md +21 -0
- package/templates/agent-kit/skills/shared/hosts.md +78 -0
- package/templates/agent-kit/workspace/.cursor/plans/README.md +22 -0
- package/templates/agent-kit/workspace/LICENSE.mit +21 -0
- package/templates/agent-kit/workspace/README.md +89 -0
- package/templates/applications/builder-api/Dockerfile +3 -1
- package/templates/applications/builder-api/env.template +7 -0
- package/templates/applications/dataplane/application.yaml +6 -5
- package/templates/applications/dataplane/env.template +2 -2
- package/templates/applications/dataplane/rbac.yaml +35 -2
- package/templates/applications/keycloak/Dockerfile +30 -4
- package/templates/applications/keycloak/application.yaml +2 -2
- package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +896 -0
- package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +19 -0
- package/templates/applications/keycloak/env.template +3 -0
- package/templates/applications/miso-controller/application.yaml +1 -2
- package/templates/applications/miso-controller/env.template +10 -9
- package/templates/channels/README.md +5 -5
- package/templates/channels/chatgpt/TROUBLESHOOTING.md +51 -0
- package/templates/channels/chatgpt/channel.json +59 -0
- package/templates/channels/chatgpt/icon.svg +1 -0
- package/templates/channels/chatgpt/install.template.md.hbs +20 -95
- package/templates/channels/chatgpt/integration/README.md +1 -1
- package/templates/channels/chatgpt/integration/application.json +2 -2
- package/templates/channels/chatgpt/integration/chatgpt-system.json +49 -4
- package/templates/channels/chatgpt/integration/env.template +2 -4
- package/templates/channels/chatgpt/integration/rbac.json +13 -0
- package/templates/channels/claude/TROUBLESHOOTING.md +44 -0
- package/templates/channels/claude/channel.json +59 -0
- package/templates/channels/claude/icon.svg +1 -0
- package/templates/channels/claude/install.template.md.hbs +22 -0
- package/templates/channels/claude/integration/README.md +14 -0
- package/templates/channels/claude/integration/application.json +15 -0
- package/templates/channels/claude/integration/claude-system.json +59 -0
- package/templates/channels/claude/integration/env.template +2 -0
- package/templates/channels/claude/integration/rbac.json +13 -0
- package/templates/channels/claude/manifest.template.json.hbs +40 -0
- package/templates/channels/mcp-client/channel.json +72 -0
- package/templates/channels/mcp-client/icon.svg +1 -0
- package/templates/channels/mcp-client/install.template.md.hbs +24 -0
- package/templates/channels/mcp-client/integration/README.md +13 -0
- package/templates/channels/mcp-client/integration/application.json +15 -0
- package/templates/channels/mcp-client/integration/env.template +2 -0
- package/templates/channels/mcp-client/integration/mcp-client-system.json +72 -0
- package/templates/channels/mcp-client/integration/rbac.json +13 -0
- package/templates/channels/mcp-client/manifest.template.json.hbs +41 -0
- package/templates/channels/mcp-client/profiles/cursor.json +26 -0
- package/templates/channels/mcp-client/profiles/github-copilot.json +29 -0
- package/templates/channels/mcp-client/profiles/vscode.json +29 -0
- package/templates/channels/microsoft-copilot/channel.json +73 -0
- package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +8 -4
- package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +65 -5
- package/templates/channels/microsoft-copilot/icon.svg +1 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +9 -9
- package/templates/channels/microsoft-copilot/integration/README.md +1 -1
- package/templates/channels/microsoft-copilot/integration/application.json +2 -2
- package/templates/channels/microsoft-copilot/integration/env.template +3 -6
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +63 -4
- package/templates/channels/microsoft-copilot/integration/rbac.json +13 -0
- package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +5 -5
- package/templates/channels/slack/channel.json +234 -0
- package/templates/channels/slack/icon.svg +1 -0
- package/templates/channels/slack/install.template.md.hbs +45 -28
- package/templates/channels/slack/integration/README.md +245 -22
- package/templates/channels/slack/integration/application.json +44 -7
- package/templates/channels/slack/integration/env.template +15 -6
- package/templates/channels/slack/integration/openapi/openapi.json +126 -0
- package/templates/channels/slack/integration/rbac.json +84 -0
- package/templates/channels/slack/integration/slack-datasource-commands.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +28 -3
- package/templates/channels/slack/integration/slack-datasource-events.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-interactive.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +40 -2
- package/templates/channels/slack/integration/slack-system.json +161 -72
- package/templates/channels/slack/manifest.template.json.hbs +10 -4
- package/templates/channels/teams-bot/channel.json +162 -0
- package/templates/channels/teams-bot/icon.svg +1 -0
- package/templates/channels/teams-bot/install.template.md.hbs +12 -13
- package/templates/channels/teams-bot/integration/README.md +5 -4
- package/templates/channels/teams-bot/integration/application.json +6 -4
- package/templates/channels/teams-bot/integration/env.template +5 -4
- package/templates/channels/teams-bot/integration/openapi/openapi.json +68 -0
- package/templates/channels/teams-bot/integration/rbac.json +21 -0
- package/templates/channels/teams-bot/integration/teams-bot-datasource-activities.json +154 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +128 -23
- package/templates/channels/web-embed/channel.json +60 -0
- package/templates/channels/web-embed/install.template.md.hbs +1 -1
- package/templates/channels/web-embed/integration/README.md +2 -2
- package/templates/channels/web-embed/integration/application.json +2 -2
- package/templates/channels/web-embed/integration/env.template +1 -1
- package/templates/channels/web-embed/integration/rbac.json +13 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +50 -4
- package/templates/python/docker-compose.hbs +14 -0
- package/templates/typescript/docker-compose.hbs +14 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target-scoped help for `aifabrix channel add`.
|
|
3
|
+
*
|
|
4
|
+
* `channel add -h` is the full catalog. `channel add chatgpt -h` lists ChatGPT
|
|
5
|
+
* flags and examples only (no Slack, Copilot, or MCP-client leftovers).
|
|
6
|
+
*
|
|
7
|
+
* @fileoverview Channel add help — catalog vs named-target options
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const { Help } = require('commander');
|
|
13
|
+
const {
|
|
14
|
+
formatSupportedChannelTargetsHelp,
|
|
15
|
+
isChannelTargetKey
|
|
16
|
+
} = require('../channels/channel-targets');
|
|
17
|
+
|
|
18
|
+
const SHARED_OPTION_LONG = new Set([
|
|
19
|
+
'--name',
|
|
20
|
+
'--description',
|
|
21
|
+
'--icon',
|
|
22
|
+
'--template',
|
|
23
|
+
'--dry-run',
|
|
24
|
+
'--force',
|
|
25
|
+
'--system-key',
|
|
26
|
+
'--probe',
|
|
27
|
+
'--verbose',
|
|
28
|
+
'--json',
|
|
29
|
+
'--help'
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
const TARGET_OPTION_LONG = {
|
|
33
|
+
slack: new Set(['--command-prefix', '--onboard-users', '--no-onboard-users']),
|
|
34
|
+
'microsoft-copilot': new Set(['--oauth-plugin-vault-reference-id', '--package-version']),
|
|
35
|
+
chatgpt: new Set(['--callback-url']),
|
|
36
|
+
claude: new Set(['--callback-url']),
|
|
37
|
+
'mcp-client': new Set(['--target', '--profile']),
|
|
38
|
+
'teams-bot': new Set(),
|
|
39
|
+
'web-embed': new Set(['--allow-experimental'])
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const VALUE_FLAGS = new Set([
|
|
43
|
+
'-n',
|
|
44
|
+
'--name',
|
|
45
|
+
'-d',
|
|
46
|
+
'--description',
|
|
47
|
+
'--icon',
|
|
48
|
+
'--template',
|
|
49
|
+
'--command-prefix',
|
|
50
|
+
'--oauth-plugin-vault-reference-id',
|
|
51
|
+
'--package-version',
|
|
52
|
+
'--callback-url',
|
|
53
|
+
'--target',
|
|
54
|
+
'--profile'
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const CHANNEL_ADD_HELP_AFTER = `
|
|
58
|
+
${formatSupportedChannelTargetsHelp()}
|
|
59
|
+
|
|
60
|
+
One command covers scaffold → upload → install:
|
|
61
|
+
$ aifabrix channel add slack --name "Elsa" --probe
|
|
62
|
+
|
|
63
|
+
Examples:
|
|
64
|
+
$ aifabrix channel add
|
|
65
|
+
$ aifabrix channel add slack --name "Elsa"
|
|
66
|
+
$ aifabrix channel add teams-bot --name "Elsa" --description "Enterprise AI assistant for employees"
|
|
67
|
+
$ aifabrix channel add chatgpt --name "Your Assistant"
|
|
68
|
+
$ aifabrix channel add chatgpt --name "Your Assistant" \\
|
|
69
|
+
--callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
70
|
+
$ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
71
|
+
$ aifabrix channel add claude --name "Onni"
|
|
72
|
+
$ aifabrix channel configure claude --callback-url "https://claude.ai/api/mcp/auth_callback"
|
|
73
|
+
$ aifabrix channel add mcp-client --target cursor --name "Onni"
|
|
74
|
+
$ aifabrix channel add mcp-client --target vscode --name "Onni"
|
|
75
|
+
$ aifabrix channel add mcp-client --target github-copilot --name "Onni"
|
|
76
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" \\
|
|
77
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
78
|
+
|
|
79
|
+
# Slack slash-command prefix (registers /{prefix}-help in manifest)
|
|
80
|
+
$ aifabrix channel add slack --name "Elsa" --command-prefix af
|
|
81
|
+
|
|
82
|
+
# Generate artifacts only; no dataplane patch / upload
|
|
83
|
+
$ aifabrix channel add slack --name "Elsa" --dry-run
|
|
84
|
+
|
|
85
|
+
# Refresh local integration from the channel template, re-upload, regenerate config
|
|
86
|
+
$ aifabrix channel add slack --name "Elsa" --force
|
|
87
|
+
|
|
88
|
+
# Copilot: after MCP URL / Entra change — regenerate ZIP (bumps Teams version 1.0.0 → 1.1.0)
|
|
89
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" --force \\
|
|
90
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
91
|
+
|
|
92
|
+
# Optional: pin Teams manifest version instead of auto minor bump
|
|
93
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" --force --package-version 1.2.0 \\
|
|
94
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
95
|
+
|
|
96
|
+
# Validate callbacks and assistant catalog after install
|
|
97
|
+
$ aifabrix channel add slack --name "Elsa" --probe
|
|
98
|
+
|
|
99
|
+
# Slack onboard (email match) without a TTY prompt
|
|
100
|
+
$ aifabrix channel add slack --name "Elsa" --onboard-users
|
|
101
|
+
$ aifabrix channel add slack --name "Elsa" --no-onboard-users
|
|
102
|
+
|
|
103
|
+
Behavior:
|
|
104
|
+
- Omit the target in a terminal to choose name and channel interactively
|
|
105
|
+
- --name is required when the target is specified (scripts and CI)
|
|
106
|
+
- -name is the same as --name; quoted names may contain spaces
|
|
107
|
+
- Scaffolds integration/<target>/ when missing, empty, or incomplete
|
|
108
|
+
- With --force, refreshes integration/<target>/ from the channel template, then uploads every time
|
|
109
|
+
- Uploads when the system is not on the dataplane
|
|
110
|
+
- Then configures the channel install (artifacts, credentials, admin guide)
|
|
111
|
+
- slack may ask **Onboard users?** and match Slack profile email to platform user email.
|
|
112
|
+
Non-interactive: --onboard-users or --no-onboard-users. Default is skip when not asked.
|
|
113
|
+
- chatgpt registers the ChatGPT callback URL when provided (--callback-url or TTY prompt).
|
|
114
|
+
It does not rotate the client secret. Remaining ChatGPT steps: Create with logo (cannot change later), Publish, Connect.
|
|
115
|
+
- claude registers the Claude callback URL (https://claude.ai/api/mcp/auth_callback) and prints
|
|
116
|
+
Name, Server URL, and Authentication: OAuth. Open https://claude.ai/new#settings/customize-connectors
|
|
117
|
+
and add a custom connector with those three values (Runtime MCP requires sign-in). Use channel
|
|
118
|
+
configure claude --callback-url only if Claude shows a callback that is not already registered.
|
|
119
|
+
- mcp-client writes the Runtime MCP URL into the editor MCP config. Pass --target (or --profile)
|
|
120
|
+
with cursor, vscode, or github-copilot. It creates or reuses the Integration Client and never
|
|
121
|
+
rotates the client secret. Remaining step: Reload the editor.
|
|
122
|
+
- microsoft-copilot uses Entra SSO (trustedIssuer). Agents Toolkit (atk) creates or reuses
|
|
123
|
+
the Teams Entra SSO auth-config when you are signed in to the matching tenant. Pass
|
|
124
|
+
--oauth-plugin-vault-reference-id only when you already have the id or toolkit cannot
|
|
125
|
+
create it. Does not create Fabrix oauth2 channel credentials. Re-run with --force after
|
|
126
|
+
Runtime MCP URL or SSO changes; Teams manifest version auto-bumps minor (1.0.0 → 1.1.0)
|
|
127
|
+
unless --package-version is set. --force reuses the existing auth-config id.
|
|
128
|
+
- teams-bot uses Teams Developer CLI (teams app create --azure) around the existing
|
|
129
|
+
AI Fabrix messages URL. Azure subscription, resource group, and Entra tenant come
|
|
130
|
+
from the controller environment (same as Copilot Entra SSO). Remaining Microsoft
|
|
131
|
+
steps are tenant policy only. --force reuses the Azure-managed bot for this
|
|
132
|
+
environment and tenant.
|
|
133
|
+
|
|
134
|
+
Requires: aifabrix login
|
|
135
|
+
`;
|
|
136
|
+
|
|
137
|
+
const SHARED_TARGET_BEHAVIOR = `Behavior:
|
|
138
|
+
- --name is required when the target is specified (scripts and CI)
|
|
139
|
+
- Quoted names may contain spaces
|
|
140
|
+
- Scaffolds integration/<target>/ when missing, empty, or incomplete
|
|
141
|
+
- With --force, refreshes integration/<target>/ from the channel template, then uploads every time
|
|
142
|
+
- Uploads when the system is not on the dataplane
|
|
143
|
+
- Then configures the channel install (artifacts, credentials, admin guide)`;
|
|
144
|
+
|
|
145
|
+
const TARGET_HELP_AFTER = {
|
|
146
|
+
chatgpt: `
|
|
147
|
+
Examples:
|
|
148
|
+
$ aifabrix channel add chatgpt --name "Your Assistant"
|
|
149
|
+
$ aifabrix channel add chatgpt --name "Your Assistant" \\
|
|
150
|
+
--callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
151
|
+
$ aifabrix channel add chatgpt --name "Your Assistant" --force
|
|
152
|
+
$ aifabrix channel add chatgpt --name "Your Assistant" --probe
|
|
153
|
+
$ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
154
|
+
|
|
155
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
156
|
+
- chatgpt registers the ChatGPT callback URL when provided (--callback-url or TTY prompt).
|
|
157
|
+
It does not rotate the client secret. Remaining ChatGPT steps: Create with logo (cannot change later), Publish, Connect.
|
|
158
|
+
|
|
159
|
+
Requires: aifabrix login
|
|
160
|
+
|
|
161
|
+
See all channels:
|
|
162
|
+
$ aifabrix channel add -h
|
|
163
|
+
`,
|
|
164
|
+
claude: `
|
|
165
|
+
Examples:
|
|
166
|
+
$ aifabrix channel add claude --name "Onni"
|
|
167
|
+
$ aifabrix channel add claude --name "Onni" --force
|
|
168
|
+
$ aifabrix channel configure claude --callback-url "https://claude.ai/api/mcp/auth_callback"
|
|
169
|
+
|
|
170
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
171
|
+
- claude registers the Claude callback URL (https://claude.ai/api/mcp/auth_callback) and prints
|
|
172
|
+
Name, Server URL, and Authentication: OAuth. Open https://claude.ai/new#settings/customize-connectors
|
|
173
|
+
and add a custom connector with those three values (Runtime MCP requires sign-in).
|
|
174
|
+
|
|
175
|
+
Requires: aifabrix login
|
|
176
|
+
|
|
177
|
+
See all channels:
|
|
178
|
+
$ aifabrix channel add -h
|
|
179
|
+
`,
|
|
180
|
+
slack: `
|
|
181
|
+
Examples:
|
|
182
|
+
$ aifabrix channel add slack --name "Elsa"
|
|
183
|
+
$ aifabrix channel add slack --name "Elsa" --command-prefix af
|
|
184
|
+
$ aifabrix channel add slack --name "Elsa" --force --probe
|
|
185
|
+
$ aifabrix channel add slack --name "Elsa" --onboard-users
|
|
186
|
+
$ aifabrix channel add slack --name "Elsa" --no-onboard-users
|
|
187
|
+
|
|
188
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
189
|
+
- slack may ask **Onboard users?** and match Slack profile email to platform user email.
|
|
190
|
+
Non-interactive: --onboard-users or --no-onboard-users. Default is skip when not asked.
|
|
191
|
+
|
|
192
|
+
Requires: aifabrix login
|
|
193
|
+
|
|
194
|
+
See all channels:
|
|
195
|
+
$ aifabrix channel add -h
|
|
196
|
+
`,
|
|
197
|
+
'microsoft-copilot': `
|
|
198
|
+
Examples:
|
|
199
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" \\
|
|
200
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
201
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" --force \\
|
|
202
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
203
|
+
$ aifabrix channel add microsoft-copilot --name "Your Assistant" --force --package-version 1.2.0 \\
|
|
204
|
+
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
205
|
+
|
|
206
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
207
|
+
- microsoft-copilot uses Entra SSO (trustedIssuer). Pass --oauth-plugin-vault-reference-id
|
|
208
|
+
only when you already have the Teams Entra SSO auth-config id or toolkit cannot create it.
|
|
209
|
+
--force reuses the existing auth-config id. Teams manifest version auto-bumps minor
|
|
210
|
+
unless --package-version is set.
|
|
211
|
+
|
|
212
|
+
Requires: aifabrix login
|
|
213
|
+
|
|
214
|
+
See all channels:
|
|
215
|
+
$ aifabrix channel add -h
|
|
216
|
+
`,
|
|
217
|
+
'mcp-client': `
|
|
218
|
+
Examples:
|
|
219
|
+
$ aifabrix channel add mcp-client --target cursor --name "Onni"
|
|
220
|
+
$ aifabrix channel add mcp-client --target vscode --name "Onni"
|
|
221
|
+
$ aifabrix channel add mcp-client --target github-copilot --name "Onni"
|
|
222
|
+
|
|
223
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
224
|
+
- mcp-client writes the Runtime MCP URL into the editor MCP config. Pass --target (or --profile)
|
|
225
|
+
with cursor, vscode, or github-copilot. Remaining step: Reload the editor.
|
|
226
|
+
|
|
227
|
+
Requires: aifabrix login
|
|
228
|
+
|
|
229
|
+
See all channels:
|
|
230
|
+
$ aifabrix channel add -h
|
|
231
|
+
`,
|
|
232
|
+
'teams-bot': `
|
|
233
|
+
Examples:
|
|
234
|
+
$ aifabrix channel add teams-bot --name "Elsa" --description "Enterprise AI assistant for employees"
|
|
235
|
+
$ aifabrix channel add teams-bot --name "Elsa" --force
|
|
236
|
+
|
|
237
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
238
|
+
- teams-bot uses Teams Developer CLI (teams app create --azure) around the existing
|
|
239
|
+
AI Fabrix messages URL. Azure subscription, resource group, and Entra tenant come
|
|
240
|
+
from the controller environment. Remaining Microsoft steps are tenant policy only.
|
|
241
|
+
|
|
242
|
+
Requires: aifabrix login
|
|
243
|
+
|
|
244
|
+
See all channels:
|
|
245
|
+
$ aifabrix channel add -h
|
|
246
|
+
`,
|
|
247
|
+
'web-embed': `
|
|
248
|
+
Examples:
|
|
249
|
+
$ aifabrix channel add web-embed --name "Onni" --allow-experimental
|
|
250
|
+
|
|
251
|
+
${SHARED_TARGET_BEHAVIOR}
|
|
252
|
+
- web-embed is experimental. Pass --allow-experimental to install.
|
|
253
|
+
|
|
254
|
+
Requires: aifabrix login
|
|
255
|
+
|
|
256
|
+
See all channels:
|
|
257
|
+
$ aifabrix channel add -h
|
|
258
|
+
`
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Read the named channel target from `channel add` argv (help runs before parse).
|
|
263
|
+
* @param {string[]} [argv]
|
|
264
|
+
* @returns {string|null}
|
|
265
|
+
*/
|
|
266
|
+
function resolveChannelAddHelpTarget(argv = process.argv) {
|
|
267
|
+
const start = channelAddArgStart(argv);
|
|
268
|
+
for (let i = start; i < argv.length; i += 1) {
|
|
269
|
+
const arg = argv[i];
|
|
270
|
+
if (arg === '--') {
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
if (arg.startsWith('-')) {
|
|
274
|
+
i += skipOptionValue(arg, argv[i + 1]);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (isChannelTargetKey(arg)) {
|
|
278
|
+
return arg;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* @param {string[]} argv
|
|
286
|
+
* @returns {number}
|
|
287
|
+
*/
|
|
288
|
+
function channelAddArgStart(argv) {
|
|
289
|
+
for (let i = 1; i < argv.length; i += 1) {
|
|
290
|
+
if (argv[i] === 'add' && argv[i - 1] === 'channel') {
|
|
291
|
+
return i + 1;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return argv.length;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @param {string} arg
|
|
299
|
+
* @param {string|undefined} next
|
|
300
|
+
* @returns {number} extra indexes consumed
|
|
301
|
+
*/
|
|
302
|
+
function skipOptionValue(arg, next) {
|
|
303
|
+
const eq = arg.indexOf('=');
|
|
304
|
+
if (eq !== -1) {
|
|
305
|
+
return 0;
|
|
306
|
+
}
|
|
307
|
+
const flag = arg;
|
|
308
|
+
if (VALUE_FLAGS.has(flag) && next && !next.startsWith('-')) {
|
|
309
|
+
return 1;
|
|
310
|
+
}
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* @param {import('commander').Option} option
|
|
316
|
+
* @param {string|null} target
|
|
317
|
+
* @returns {boolean}
|
|
318
|
+
*/
|
|
319
|
+
function isChannelAddOptionVisible(option, target) {
|
|
320
|
+
if (!target) {
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
const long = option.long;
|
|
324
|
+
if (!long || SHARED_OPTION_LONG.has(long)) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
const extra = TARGET_OPTION_LONG[target];
|
|
328
|
+
return Boolean(extra && extra.has(long));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* @param {string|null} [target]
|
|
333
|
+
* @returns {string}
|
|
334
|
+
*/
|
|
335
|
+
function channelAddHelpAfter(target) {
|
|
336
|
+
if (target && TARGET_HELP_AFTER[target]) {
|
|
337
|
+
return TARGET_HELP_AFTER[target];
|
|
338
|
+
}
|
|
339
|
+
return CHANNEL_ADD_HELP_AFTER;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @param {import('commander').Command} cmd
|
|
344
|
+
* @returns {import('commander').Command}
|
|
345
|
+
*/
|
|
346
|
+
function configureChannelAddHelp(cmd) {
|
|
347
|
+
if (typeof cmd.configureHelp !== 'function') {
|
|
348
|
+
return cmd;
|
|
349
|
+
}
|
|
350
|
+
cmd.configureHelp({
|
|
351
|
+
visibleOptions(command) {
|
|
352
|
+
const listed = Help.prototype.visibleOptions.call(this, command);
|
|
353
|
+
const target = resolveChannelAddHelpTarget();
|
|
354
|
+
return listed.filter((option) => isChannelAddOptionVisible(option, target));
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
return cmd;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
module.exports = {
|
|
361
|
+
CHANNEL_ADD_HELP_AFTER,
|
|
362
|
+
channelAddHelpAfter,
|
|
363
|
+
configureChannelAddHelp,
|
|
364
|
+
isChannelAddOptionVisible,
|
|
365
|
+
resolveChannelAddHelpTarget
|
|
366
|
+
};
|
|
@@ -1,108 +1,153 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Register `channel add` (and optional deprecated aliases).
|
|
3
3
|
*
|
|
4
|
-
* @fileoverview Shared Commander wiring for assistant channel install
|
|
4
|
+
* @fileoverview Shared Commander wiring for assistant channel install
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
const chalk = require('chalk');
|
|
10
10
|
const logger = require('../utils/logger');
|
|
11
|
-
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
12
11
|
const {
|
|
13
|
-
|
|
12
|
+
formatUnknownChannelTargetError,
|
|
14
13
|
isChannelTargetKey
|
|
15
14
|
} = require('../channels/channel-targets');
|
|
16
|
-
const { addChannelCommand } = require('../channels/add-channel');
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
30
|
-
|
|
31
|
-
# Slack slash-command prefix (registers /{prefix}-help in manifest)
|
|
32
|
-
$ aifabrix channel add slack --name "Elsa" --command-prefix af
|
|
33
|
-
|
|
34
|
-
# Generate artifacts only; no dataplane patch / upload
|
|
35
|
-
$ aifabrix channel add slack --name "Elsa" --dry-run
|
|
36
|
-
|
|
37
|
-
# Re-upload communication system + regenerate channel config (does not rotate secrets)
|
|
38
|
-
$ aifabrix channel add slack --name "Elsa" --force
|
|
39
|
-
|
|
40
|
-
# Validate callbacks and assistant catalog after install
|
|
41
|
-
$ aifabrix channel add slack --name "Elsa" --probe
|
|
15
|
+
const { addChannelCommand, runAddChannel } = require('../channels/add-channel');
|
|
16
|
+
const { toChannelInstallEnvelope } = require('../channels/channel-install-envelope');
|
|
17
|
+
const {
|
|
18
|
+
isChannelAddCancelled,
|
|
19
|
+
promptChannelAddWizard
|
|
20
|
+
} = require('../channels/channel-add-wizard');
|
|
21
|
+
const { formatChannelAddFailure } = require('../channels/channel-add-failure');
|
|
22
|
+
const {
|
|
23
|
+
CHANNEL_ADD_HELP_AFTER,
|
|
24
|
+
channelAddHelpAfter,
|
|
25
|
+
configureChannelAddHelp,
|
|
26
|
+
resolveChannelAddHelpTarget
|
|
27
|
+
} = require('./channel-add-help');
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object} options
|
|
31
|
+
* @returns {Object}
|
|
32
|
+
*/
|
|
33
|
+
function toAddChannelCommandOptions(options) {
|
|
34
|
+
return {
|
|
35
|
+
name: options.name,
|
|
36
|
+
description: options.description,
|
|
37
|
+
icon: options.icon,
|
|
38
|
+
template: options.template,
|
|
39
|
+
commandPrefix: options.commandPrefix,
|
|
40
|
+
systemKey: options.systemKey,
|
|
41
|
+
oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
|
|
42
|
+
packageVersion: options.packageVersion,
|
|
43
|
+
callbackUrl: options.callbackUrl,
|
|
44
|
+
allowExperimental: options.allowExperimental === true,
|
|
45
|
+
dryRun: options.dryRun === true,
|
|
46
|
+
force: options.force === true,
|
|
47
|
+
probe: options.probe === true,
|
|
48
|
+
verbose: options.verbose === true,
|
|
49
|
+
onboardUsers:
|
|
50
|
+
options.noOnboardUsers === true ? false : options.onboardUsers === true ? true : undefined,
|
|
51
|
+
target: options.target,
|
|
52
|
+
profile: options.profile,
|
|
53
|
+
mcpClientProfile: options.mcpClientProfile
|
|
54
|
+
};
|
|
55
|
+
}
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Resolve wizard vs explicit target. Explicit path still requires --name.
|
|
59
|
+
* @param {string|undefined} channelTarget
|
|
60
|
+
* @param {Object} options
|
|
61
|
+
* @returns {Promise<{ channelTarget: string, name: string }>}
|
|
62
|
+
*/
|
|
63
|
+
async function resolveChannelAddSelection(channelTarget, options) {
|
|
64
|
+
if (!channelTarget) {
|
|
65
|
+
return promptChannelAddWizard(options);
|
|
66
|
+
}
|
|
67
|
+
if (!isChannelTargetKey(channelTarget)) {
|
|
68
|
+
throw new Error(formatUnknownChannelTargetError(channelTarget));
|
|
69
|
+
}
|
|
70
|
+
if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
|
|
71
|
+
throw new Error('--name is required for channel add');
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
channelTarget,
|
|
75
|
+
name: options.name,
|
|
76
|
+
mcpClientProfile: options.target || options.profile
|
|
77
|
+
};
|
|
78
|
+
}
|
|
52
79
|
|
|
53
80
|
/**
|
|
54
81
|
* @param {string} channelTarget
|
|
55
82
|
* @param {Object} options
|
|
56
83
|
* @param {{ deprecatedVia?: string }} [meta]
|
|
84
|
+
* @returns {Promise<void>}
|
|
57
85
|
*/
|
|
58
86
|
async function runChannelAddAction(channelTarget, options, meta = {}) {
|
|
59
87
|
if (meta.deprecatedVia) {
|
|
60
88
|
logger.warn(
|
|
61
89
|
chalk.yellow(
|
|
62
|
-
`Deprecated: use "aifabrix channel add ${channelTarget} ..." instead of "${meta.deprecatedVia}".`
|
|
90
|
+
`Deprecated: use "aifabrix channel add ${channelTarget || ''} ..." instead of "${meta.deprecatedVia}".`
|
|
63
91
|
)
|
|
64
92
|
);
|
|
65
93
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
name: options.name,
|
|
73
|
-
description: options.description,
|
|
74
|
-
icon: options.icon,
|
|
75
|
-
template: options.template,
|
|
76
|
-
commandPrefix: options.commandPrefix,
|
|
77
|
-
oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
|
|
78
|
-
dryRun: options.dryRun === true,
|
|
79
|
-
force: options.force === true,
|
|
80
|
-
probe: options.probe === true
|
|
94
|
+
const selection = await resolveChannelAddSelection(channelTarget, options);
|
|
95
|
+
const addOptions = toAddChannelCommandOptions({
|
|
96
|
+
...options,
|
|
97
|
+
...selection,
|
|
98
|
+
name: selection.name,
|
|
99
|
+
mcpClientProfile: selection.mcpClientProfile || options.target || options.profile
|
|
81
100
|
});
|
|
101
|
+
if (options.json === true) {
|
|
102
|
+
addOptions.quiet = true;
|
|
103
|
+
const result = await runAddChannel(selection.channelTarget, addOptions);
|
|
104
|
+
const envelope = toChannelInstallEnvelope({
|
|
105
|
+
channelTarget: selection.channelTarget,
|
|
106
|
+
displayName: addOptions.name,
|
|
107
|
+
runtimeValues: (result && result.runtimeValues) || { appName: addOptions.name },
|
|
108
|
+
ctx: { projectRoot: process.cwd() }
|
|
109
|
+
});
|
|
110
|
+
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
await addChannelCommand(selection.channelTarget, addOptions);
|
|
82
114
|
}
|
|
83
115
|
|
|
84
116
|
/**
|
|
85
|
-
* @param {
|
|
86
|
-
* @
|
|
117
|
+
* @param {Error} error
|
|
118
|
+
* @returns {void}
|
|
119
|
+
*/
|
|
120
|
+
function handleChannelAddError(error) {
|
|
121
|
+
if (isChannelAddCancelled(error)) {
|
|
122
|
+
process.exit(0);
|
|
123
|
+
}
|
|
124
|
+
if (!error.message?.includes('Authentication required')) {
|
|
125
|
+
logger.error(formatChannelAddFailure(error));
|
|
126
|
+
}
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @param {import('commander').Command} cmd
|
|
87
132
|
* @returns {import('commander').Command}
|
|
88
133
|
*/
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
: parent.command(commandName);
|
|
96
|
-
cmd
|
|
97
|
-
.description(meta.deprecatedVia ? `(deprecated) ${description}` : description)
|
|
98
|
-
.requiredOption('-n, --name <name>', 'Customer-visible channel name (e.g. "Elsa")')
|
|
134
|
+
function attachChannelAddOptions(cmd) {
|
|
135
|
+
return cmd
|
|
136
|
+
.option(
|
|
137
|
+
'-n, --name <name>',
|
|
138
|
+
'Customer-visible channel name (e.g. "Elsa"); required when the target is specified. Quoted names may contain spaces'
|
|
139
|
+
)
|
|
99
140
|
.option('-d, --description <text>', 'Channel description (default generated)')
|
|
100
141
|
.option('--icon <path>', 'Path to channel icon asset')
|
|
101
142
|
.option('--template <name>', 'Template override (default from channel target)')
|
|
102
143
|
.option('--dry-run', 'Generate artifacts only; do not upload, patch, or set credentials')
|
|
103
144
|
.option(
|
|
104
145
|
'--force',
|
|
105
|
-
'
|
|
146
|
+
'Refresh integration files from the channel template, re-upload, and regenerate channel config (does not rotate secrets)'
|
|
147
|
+
)
|
|
148
|
+
.option(
|
|
149
|
+
'--system-key <key>',
|
|
150
|
+
'Connected System instance key (default: derived from the channel and --name)'
|
|
106
151
|
)
|
|
107
152
|
.option(
|
|
108
153
|
'--command-prefix <key>',
|
|
@@ -110,26 +155,63 @@ function registerChannelAddCommand(parent, meta = {}) {
|
|
|
110
155
|
)
|
|
111
156
|
.option(
|
|
112
157
|
'--oauth-plugin-vault-reference-id <id>',
|
|
113
|
-
'Teams
|
|
158
|
+
'Teams Entra SSO auth-config id (microsoft-copilot); optional when Agents Toolkit can create it'
|
|
159
|
+
)
|
|
160
|
+
.option(
|
|
161
|
+
'--package-version <semver>',
|
|
162
|
+
'Teams manifest version (microsoft-copilot); default auto-bumps minor on regenerate'
|
|
114
163
|
)
|
|
115
164
|
.option('--probe', 'After install, validate callbacks and assistant catalog')
|
|
116
|
-
.
|
|
117
|
-
.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
165
|
+
.option('--onboard-users', 'Onboard Slack users by matching email after install')
|
|
166
|
+
.option('--no-onboard-users', 'Skip Slack user onboard')
|
|
167
|
+
.option('-v, --verbose', 'Print scaffold file list and upload internals')
|
|
168
|
+
.option('--callback-url <url>', 'ChatGPT or Claude OAuth callback URL to register on the matching profile')
|
|
169
|
+
.option(
|
|
170
|
+
'--target <profile>',
|
|
171
|
+
'MCP client installation profile when the channel is mcp-client (cursor, vscode, github-copilot)'
|
|
172
|
+
)
|
|
173
|
+
.option('--profile <profile>', 'Alias for --target (MCP client installation profile)')
|
|
174
|
+
.option('--allow-experimental', 'Allow experimental targets such as web-embed')
|
|
175
|
+
.option('--json', 'Machine-readable install envelope (no TTY glyphs)');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @param {{ deprecatedVia?: string }} meta
|
|
180
|
+
* @returns {Function}
|
|
181
|
+
*/
|
|
182
|
+
function handleChannelAddAction(meta) {
|
|
183
|
+
return async(channelTarget, options) => {
|
|
184
|
+
try {
|
|
185
|
+
await runChannelAddAction(channelTarget, options, meta);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
handleChannelAddError(error);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @param {import('commander').Command} parent
|
|
194
|
+
* @param {{ deprecatedVia?: string, commandName?: string, hidden?: boolean }} [meta]
|
|
195
|
+
* @returns {import('commander').Command}
|
|
196
|
+
*/
|
|
197
|
+
function registerChannelAddCommand(parent, meta = {}) {
|
|
198
|
+
const description =
|
|
199
|
+
'Scaffold (if needed), upload (if needed/--force), then configure channel install';
|
|
200
|
+
const commandName = meta.commandName || 'add [channelTarget]';
|
|
201
|
+
const cmd = meta.hidden
|
|
202
|
+
? parent.command(commandName, { hidden: true })
|
|
203
|
+
: parent.command(commandName);
|
|
204
|
+
cmd.description(meta.deprecatedVia ? `(deprecated) ${description}` : description);
|
|
205
|
+
attachChannelAddOptions(cmd);
|
|
206
|
+
configureChannelAddHelp(cmd);
|
|
207
|
+
cmd.addHelpText('after', () => channelAddHelpAfter(resolveChannelAddHelpTarget()));
|
|
208
|
+
cmd.action(handleChannelAddAction(meta));
|
|
128
209
|
return cmd;
|
|
129
210
|
}
|
|
130
211
|
|
|
131
212
|
module.exports = {
|
|
132
213
|
CHANNEL_ADD_HELP_AFTER,
|
|
133
214
|
registerChannelAddCommand,
|
|
134
|
-
runChannelAddAction
|
|
215
|
+
runChannelAddAction,
|
|
216
|
+
resolveChannelAddSelection
|
|
135
217
|
};
|