@aifabrix/builder 2.49.2 → 2.50.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/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +7 -2
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +1 -59
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +244 -118
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
const chalk = require('chalk');
|
|
8
8
|
const logger = require('../utils/logger');
|
|
9
9
|
const { handleCommandError } = require('../utils/cli-utils');
|
|
10
|
-
const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
|
|
11
10
|
const {
|
|
12
11
|
TEST_HELP_AFTER,
|
|
13
12
|
TEST_E2E_HELP_AFTER
|
|
@@ -18,7 +17,7 @@ function setupTestCommand(program) {
|
|
|
18
17
|
.description('Tests: builder appKey in container; external systemKey = local validation')
|
|
19
18
|
.option('-e, --env <env>', 'For builder app: dev (running container) or tst (ephemeral)', 'dev')
|
|
20
19
|
.option('-v, --verbose', 'Verbose output')
|
|
21
|
-
.option('-d, --debug', '
|
|
20
|
+
.option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/ (external only)')
|
|
22
21
|
.option(
|
|
23
22
|
'--sync',
|
|
24
23
|
'Not supported for this command (local validation only). Use aifabrix upload <systemKey> or dataplane test commands with --sync.'
|
|
@@ -58,45 +57,22 @@ function setupTestCommand(program) {
|
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
/**
|
|
61
|
-
*
|
|
62
|
-
* @param {Array<{ key?: string, datasourceTestRun?: { certificateIssuance?: { status?: string, reasonCode?: string, message?: string } } }>} results
|
|
63
|
-
* @returns {string|null}
|
|
64
|
-
*/
|
|
65
|
-
function firstIssuanceFailureHintFromE2eResults(results) {
|
|
66
|
-
const failed = [];
|
|
67
|
-
for (const row of results || []) {
|
|
68
|
-
const ci = row.datasourceTestRun && row.datasourceTestRun.certificateIssuance;
|
|
69
|
-
if (ci && ci.status === 'failed') {
|
|
70
|
-
failed.push({ key: row.key, ci });
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (failed.length === 0) return null;
|
|
74
|
-
const firstRc = failed[0].ci.reasonCode;
|
|
75
|
-
const sameAll = failed.every(f => f.ci.reasonCode === firstRc);
|
|
76
|
-
if (sameAll && failed.length > 1) {
|
|
77
|
-
const parts = [firstRc, failed[0].ci.message].filter(Boolean);
|
|
78
|
-
return `${parts.join(': ')} (${failed.length} datasource scopes; first: ${failed[0].key})`;
|
|
79
|
-
}
|
|
80
|
-
const parts = [failed[0].ci.reasonCode, failed[0].ci.message].filter(Boolean);
|
|
81
|
-
return `[${failed[0].key}] ${parts.join(': ')}`.trim();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* External integration E2E: run, display, exit on aggregate, optional cert sync.
|
|
60
|
+
* External integration E2E: run, display, exit on aggregate.
|
|
86
61
|
* @param {string} appName
|
|
87
62
|
* @param {Object} options
|
|
88
63
|
* @returns {Promise<void>}
|
|
89
64
|
*/
|
|
90
|
-
async function
|
|
91
|
-
const {
|
|
65
|
+
async function runExternalIntegrationE2EAndExit(appName, options, cmd) {
|
|
66
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
92
67
|
const { runTestE2EForExternalSystem } = require('../commands/test-e2e-external');
|
|
93
|
-
const
|
|
68
|
+
const noPublish = cliOptsSkipPublish(options, cmd);
|
|
94
69
|
const { success, results } = await runTestE2EForExternalSystem(appName, {
|
|
95
70
|
env: options.env,
|
|
96
71
|
debug: options.debug,
|
|
97
72
|
verbose: options.verbose,
|
|
98
73
|
async: options.async !== false,
|
|
99
|
-
|
|
74
|
+
noPublish,
|
|
75
|
+
syncMode: options.syncMode
|
|
100
76
|
});
|
|
101
77
|
const { displayIntegrationTestResults } = require('../utils/external-system-display');
|
|
102
78
|
const datasourceResults = results.map(r => ({
|
|
@@ -117,25 +93,21 @@ async function runExternalIntegrationE2EAndCertSync(appName, options, cmd) {
|
|
|
117
93
|
requireCert: options.requireCert === true
|
|
118
94
|
});
|
|
119
95
|
if (exitCode !== 0) process.exit(exitCode);
|
|
120
|
-
if (cliOptsSkipCertSync(options)) return;
|
|
121
|
-
const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
|
|
122
|
-
const issuanceFailureHint = firstIssuanceFailureHintFromE2eResults(results);
|
|
123
|
-
await trySyncCertificationFromDataplaneForExternalApp(appName, 'test-e2e', { issuanceFailureHint });
|
|
124
96
|
}
|
|
125
97
|
|
|
126
98
|
async function runTestE2ECommand(appName, options, cmd) {
|
|
127
|
-
const {
|
|
128
|
-
const
|
|
99
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
100
|
+
const noPublish = cliOptsSkipPublish(options, cmd);
|
|
129
101
|
const pathsUtil = require('../utils/paths');
|
|
130
102
|
const appType = await pathsUtil.detectAppType(appName).catch(() => null);
|
|
131
|
-
if (
|
|
103
|
+
if (noPublish && appType && appType.baseDir === 'builder') {
|
|
132
104
|
throw new Error(
|
|
133
|
-
'Option --no-
|
|
134
|
-
'Remove --no-
|
|
105
|
+
'Option --no-publish applies only to external integration E2E (integration/<systemKey>/). ' +
|
|
106
|
+
'Remove --no-publish for builder app E2E.'
|
|
135
107
|
);
|
|
136
108
|
}
|
|
137
109
|
if (appType && appType.baseDir === 'integration') {
|
|
138
|
-
await
|
|
110
|
+
await runExternalIntegrationE2EAndExit(appName, options, cmd);
|
|
139
111
|
return;
|
|
140
112
|
}
|
|
141
113
|
const { runAppTestE2e } = require('../commands/app-test');
|
|
@@ -170,21 +142,24 @@ function setupTestE2eCommand(program) {
|
|
|
170
142
|
.description('E2E: builder appKey in container; external systemKey = all datasources via dataplane')
|
|
171
143
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
|
|
172
144
|
.option('-v, --verbose', 'Show detailed step output and poll progress')
|
|
173
|
-
.option('-d, --debug', '
|
|
174
|
-
.option(
|
|
175
|
-
'--no-sync',
|
|
176
|
-
'Skip publishing local integration files; E2E uses the system config already on the dataplane (external integration only)'
|
|
177
|
-
)
|
|
145
|
+
.option('-d, --debug', 'Certification debug + log to integration/<systemKey>/logs/')
|
|
146
|
+
.option('--no-publish', 'Skip publishing local integration files before E2E')
|
|
178
147
|
.option(
|
|
179
148
|
'--force',
|
|
180
149
|
'With default sync, pass force to upload (bypass active-datasource schema replacement guards; same as aifabrix upload --force)'
|
|
181
150
|
)
|
|
182
|
-
.option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
|
|
183
|
-
.option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
|
|
184
151
|
.option(
|
|
185
|
-
'--
|
|
186
|
-
'
|
|
152
|
+
'--version <target>',
|
|
153
|
+
'Manifest version for E2E (latest, running, or explicit version id)',
|
|
154
|
+
'latest'
|
|
187
155
|
)
|
|
156
|
+
.option(
|
|
157
|
+
'--sync-mode <mode>',
|
|
158
|
+
'Sync policy during E2E: auto (default), never, or force. Distinct from default pre-run publish.',
|
|
159
|
+
'auto'
|
|
160
|
+
)
|
|
161
|
+
.option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
|
|
162
|
+
.option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
|
|
188
163
|
.addHelpText('after', TEST_E2E_HELP_AFTER)
|
|
189
164
|
.action(async(appName, options, cmd) => {
|
|
190
165
|
try {
|
|
@@ -232,7 +207,6 @@ function setupInstallTestE2eLintCommands(program) {
|
|
|
232
207
|
}
|
|
233
208
|
|
|
234
209
|
module.exports = {
|
|
235
|
-
setupInstallTestE2eLintCommands
|
|
236
|
-
firstIssuanceFailureHintFromE2eResults
|
|
210
|
+
setupInstallTestE2eLintCommands
|
|
237
211
|
};
|
|
238
212
|
|
|
@@ -20,7 +20,7 @@ function setupVerifyOperationsCommand(program) {
|
|
|
20
20
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
|
|
21
21
|
.option('-v, --verbose', 'Readiness breakdown and verification step checklist')
|
|
22
22
|
.option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/')
|
|
23
|
-
.option('--no-
|
|
23
|
+
.option('--no-publish', 'Skip publishing local integration files before dataplane steps')
|
|
24
24
|
.option(
|
|
25
25
|
'--force',
|
|
26
26
|
'With default sync, pass force to upload (same as aifabrix upload --force)'
|
|
@@ -39,7 +39,7 @@ function setupVerifyTrustCommand(program) {
|
|
|
39
39
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
|
|
40
40
|
.option('-v, --verbose', 'Per-datasource breakdown')
|
|
41
41
|
.option('-d, --debug', 'Write debug log under integration/<systemKey>/logs/')
|
|
42
|
-
.option('--no-
|
|
42
|
+
.option('--no-publish', 'Skip publishing local integration files before validate')
|
|
43
43
|
.option(
|
|
44
44
|
'--force',
|
|
45
45
|
'With default sync, pass force to upload (same as aifabrix upload --force)'
|
|
@@ -61,7 +61,7 @@ function setupVerifyGovernanceCommand(program) {
|
|
|
61
61
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro', 'dev')
|
|
62
62
|
.option('-v, --verbose', 'Per-datasource breakdown and pipeline detail')
|
|
63
63
|
.option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/')
|
|
64
|
-
.option('--no-
|
|
64
|
+
.option('--no-publish', 'Skip publishing local integration files before dataplane steps')
|
|
65
65
|
.option(
|
|
66
66
|
'--force',
|
|
67
67
|
'With default sync, pass force to upload (same as aifabrix upload --force)'
|
|
@@ -108,7 +108,7 @@ function setupLifecycleCommand(program) {
|
|
|
108
108
|
.option('-v, --verbose', 'Per-datasource breakdown in the report')
|
|
109
109
|
.option('-d, --debug', 'Write debug logs under integration/<systemKey>/logs/ when --run')
|
|
110
110
|
.option('--run', 'Run missing verify steps, then print certification report')
|
|
111
|
-
.option('--no-
|
|
111
|
+
.option('--no-publish', 'With --run, skip publishing local integration files before verify')
|
|
112
112
|
.option(
|
|
113
113
|
'--force',
|
|
114
114
|
'With default sync on --run, pass force to upload (same as aifabrix upload --force)'
|
|
@@ -8,7 +8,7 @@ const VERIFY_OPERATIONS_HELP_AFTER = `
|
|
|
8
8
|
Examples:
|
|
9
9
|
$ aifabrix verify-operations hubspot
|
|
10
10
|
$ aifabrix verify-operations hubspot -v
|
|
11
|
-
$ aifabrix verify-operations hubspot --no-
|
|
11
|
+
$ aifabrix verify-operations hubspot --no-publish
|
|
12
12
|
|
|
13
13
|
Notes:
|
|
14
14
|
- Orchestrates validate → test → test-integration → test-e2e for the system.
|
|
@@ -23,12 +23,12 @@ const VERIFY_TRUST_HELP_AFTER = `
|
|
|
23
23
|
Examples:
|
|
24
24
|
$ aifabrix verify-trust hubspot
|
|
25
25
|
$ aifabrix verify-trust hubspot -v --revalidate
|
|
26
|
-
$ aifabrix verify-trust hubspot --no-
|
|
26
|
+
$ aifabrix verify-trust hubspot --no-publish --json
|
|
27
27
|
|
|
28
28
|
Notes:
|
|
29
29
|
- For one datasource: aifabrix datasource verify-trust <datasourceKey>
|
|
30
30
|
- Does not call external vendor APIs (use verify-operations / test-e2e for connectivity).
|
|
31
|
-
- Local integration files are published before run unless --no-
|
|
31
|
+
- Local integration files are published before run unless --no-publish.
|
|
32
32
|
`;
|
|
33
33
|
|
|
34
34
|
const VERIFY_GOVERNANCE_HELP_AFTER = `
|
|
@@ -38,7 +38,7 @@ Examples:
|
|
|
38
38
|
$ aifabrix verify-governance hubspot-e2e --certification-profile gold --json
|
|
39
39
|
|
|
40
40
|
Notes:
|
|
41
|
-
- All-in-one: publishes local integration (unless --no-
|
|
41
|
+
- All-in-one: publishes local integration (unless --no-publish), generates packs on the dataplane,
|
|
42
42
|
then runs governance verification (dataplane-first; no local YAML upload).
|
|
43
43
|
- Requires at least one --subject-user-id or --subject-email (repeatable or comma-separated).
|
|
44
44
|
- Prefer this over separate generate + verify when certifying an integration.
|
|
@@ -50,12 +50,12 @@ const GOVERNANCE_GENERATE_HELP_AFTER = `
|
|
|
50
50
|
Examples:
|
|
51
51
|
$ aifabrix governance generate hubspot-e2e --subject-email us.sales@example.com
|
|
52
52
|
$ aifabrix governance generate hubspot-e2e --subject-user-id user-a --subject-user-id user-b -v
|
|
53
|
-
$ aifabrix governance generate hubspot-e2e --certification-profile gold --no-
|
|
53
|
+
$ aifabrix governance generate hubspot-e2e --certification-profile gold --no-publish
|
|
54
54
|
|
|
55
55
|
Notes:
|
|
56
56
|
- Dataplane generates keys, coverage, and generationState; the CLI never authors partitions locally.
|
|
57
57
|
- Requires at least one --subject-user-id or --subject-email per datasource fan-out.
|
|
58
|
-
- Publishes local integration files before generate unless --no-
|
|
58
|
+
- Publishes local integration files before generate unless --no-publish.
|
|
59
59
|
`;
|
|
60
60
|
|
|
61
61
|
const GOVERNANCE_VERIFY_HELP_AFTER = `
|
|
@@ -74,7 +74,7 @@ Notes:
|
|
|
74
74
|
const GOVERNANCE_UPLOAD_HELP_AFTER = `
|
|
75
75
|
Examples:
|
|
76
76
|
$ aifabrix governance upload hubspot-e2e
|
|
77
|
-
$ aifabrix governance upload hubspot-e2e --no-
|
|
77
|
+
$ aifabrix governance upload hubspot-e2e --no-publish
|
|
78
78
|
|
|
79
79
|
Notes:
|
|
80
80
|
- Expert path: pushes integration/<systemKey>/scenarios/*.yaml to the dataplane.
|
|
@@ -98,13 +98,13 @@ Examples:
|
|
|
98
98
|
$ aifabrix lifecycle hubspot
|
|
99
99
|
$ aifabrix lifecycle hubspot -v
|
|
100
100
|
$ aifabrix lifecycle hubspot --run
|
|
101
|
-
$ aifabrix lifecycle hubspot --run --no-
|
|
101
|
+
$ aifabrix lifecycle hubspot --run --no-publish
|
|
102
102
|
$ aifabrix lifecycle hubspot-e2e --run --subject-email us.sales@example.com
|
|
103
103
|
$ aifabrix lifecycle hubspot-e2e --run --subject-email a@x.com,b@y.com -v
|
|
104
104
|
|
|
105
105
|
Notes:
|
|
106
106
|
- Default: certification report only (GET persisted pillar results from dataplane).
|
|
107
|
-
- --run executes missing verify steps, then prints the report (publishes local files first unless --no-
|
|
107
|
+
- --run executes missing verify steps, then prints the report (publishes local files first unless --no-publish).
|
|
108
108
|
- With --run, --subject-email / --subject-user-id generate and verify governance packs (same as verify-governance).
|
|
109
109
|
- Repeat the flag or use comma-separated values: --subject-email a@x.com,b@y.com
|
|
110
110
|
- One-shot cert path: lifecycle <systemKey> --run --subject-email <email>
|
package/lib/cli/setup-dev.js
CHANGED
|
@@ -84,8 +84,8 @@ Examples:
|
|
|
84
84
|
$ aifabrix dev pin 02 --hosts-ip 192.168.1.25
|
|
85
85
|
$ aifabrix dev pin (uses developer-id from config)
|
|
86
86
|
|
|
87
|
-
Prints
|
|
88
|
-
|
|
87
|
+
Prints a shareable block for the developer: Node.js + Builder CLI install (Windows / Linux & macOS),
|
|
88
|
+
then copy-paste dev init commands (standard, hosts-file variant, and dev init --pin when config exists).
|
|
89
89
|
`;
|
|
90
90
|
|
|
91
91
|
/** Appended to `dev delete --help`. */
|
|
@@ -311,6 +311,8 @@ function setupDevListAddCommands(dev) {
|
|
|
311
311
|
.option('--skip-cert', 'Skip certificate step in provision job')
|
|
312
312
|
.option('--skip-platform', 'Skip platform install in provision job')
|
|
313
313
|
.option('--skip-cli', 'Skip Builder CLI install in provision job')
|
|
314
|
+
.option('--wait', 'Poll until provision job completes', true)
|
|
315
|
+
.option('--no-wait', 'Return after provision job is queued')
|
|
314
316
|
.addHelpText('after', DEV_ADD_HELP_AFTER)
|
|
315
317
|
.action(async(options) => {
|
|
316
318
|
try {
|
|
@@ -384,6 +386,9 @@ function setupDevUpdatePinDeleteCommands(dev) {
|
|
|
384
386
|
.description('Remove developer from host and server (admin)')
|
|
385
387
|
.option('--db-only', 'Remove from server database only (legacy behaviour)')
|
|
386
388
|
.option('-y, --yes', 'Skip confirmation prompt')
|
|
389
|
+
.option('--wait', 'Poll until removal completes on the host', true)
|
|
390
|
+
.option('--no-wait', 'Return after removal job is queued')
|
|
391
|
+
.option('--json', 'JSON output (includes job result when --wait)')
|
|
387
392
|
.addHelpText('after', DEV_DELETE_HELP_AFTER)
|
|
388
393
|
.action(async(developerId, options) => {
|
|
389
394
|
try {
|
|
@@ -8,24 +8,22 @@ const UPLOAD_HELP_AFTER = `
|
|
|
8
8
|
Examples:
|
|
9
9
|
# Publish integration/<systemKey>/ to the dataplane (typical lab flow after validate + resolve)
|
|
10
10
|
$ aifabrix upload hubspot-demo
|
|
11
|
-
$ aifabrix upload hubspot-demo
|
|
11
|
+
$ aifabrix upload hubspot-demo -v
|
|
12
12
|
$ aifabrix upload hubspot-demo --probe
|
|
13
13
|
|
|
14
14
|
# Build and validate payload only (no API calls)
|
|
15
15
|
$ aifabrix upload hubspot-demo --dry-run
|
|
16
16
|
|
|
17
|
-
# Short summary after publish
|
|
18
|
-
$ aifabrix upload hubspot-demo --minimal
|
|
19
|
-
|
|
20
17
|
# Protection manifests (integration/.protection/ at repo root)
|
|
21
18
|
$ aifabrix upload .protection
|
|
22
|
-
$ aifabrix upload .protection --warnings-as-errors
|
|
19
|
+
$ aifabrix upload .protection --warnings-as-errors
|
|
23
20
|
|
|
24
21
|
Notes:
|
|
25
22
|
- Requires login (aifabrix auth status).
|
|
26
23
|
- Reads files under integration/<systemKey>/ (system JSON, datasources, credentials).
|
|
24
|
+
- Default output is a compact readiness summary; use -v for expanded detail and server-side validate warnings.
|
|
27
25
|
- --probe runs dataplane runtime checks after publish (slower; common in Session 1).
|
|
28
|
-
- test-e2e and test-integration publish local files first by default; use --no-
|
|
26
|
+
- test-e2e and test-integration publish local files first by default; use --no-publish on those commands to skip.
|
|
29
27
|
- After dimension/FK edits on active datasources, use --force (or test-e2e / test-integration / datasource test-* with --sync --force).
|
|
30
28
|
- For one datasource only: aifabrix datasource upload <datasourceKey>
|
|
31
29
|
`;
|
|
@@ -15,8 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
const { handleCommandError } = require('../utils/cli-utils');
|
|
18
|
-
const {
|
|
19
|
-
const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
|
|
18
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
20
19
|
const { TEST_INTEGRATION_HELP_AFTER } = require('./setup-app.help');
|
|
21
20
|
const {
|
|
22
21
|
UPLOAD_HELP_AFTER,
|
|
@@ -24,6 +23,39 @@ const {
|
|
|
24
23
|
DELETE_HELP_AFTER
|
|
25
24
|
} = require('./setup-external-system-help');
|
|
26
25
|
|
|
26
|
+
async function handleUploadCommandAction(systemKey, options) {
|
|
27
|
+
const { isProtectionScope } = require('../protection/scope');
|
|
28
|
+
if (isProtectionScope(systemKey)) {
|
|
29
|
+
const { uploadProtectionBatchCommand } = require('../protection/upload-batch');
|
|
30
|
+
const logger = require('../utils/logger');
|
|
31
|
+
const code = await uploadProtectionBatchCommand(
|
|
32
|
+
{
|
|
33
|
+
env: options.env,
|
|
34
|
+
dryRun: options.dryRun === true,
|
|
35
|
+
sync: options.sync === true,
|
|
36
|
+
json: options.json === true,
|
|
37
|
+
verbose: options.verbose === true,
|
|
38
|
+
warningsAsErrors: options.warningsAsErrors === true
|
|
39
|
+
},
|
|
40
|
+
logger
|
|
41
|
+
);
|
|
42
|
+
if (code !== 0) {
|
|
43
|
+
process.exit(code);
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const upload = require('../commands/upload');
|
|
48
|
+
const probeTimeout =
|
|
49
|
+
options.probeTimeout === undefined || options.probeTimeout === null
|
|
50
|
+
? 120000
|
|
51
|
+
: Number(options.probeTimeout);
|
|
52
|
+
await upload.uploadExternalSystem(systemKey, {
|
|
53
|
+
...options,
|
|
54
|
+
probeTimeout: Number.isFinite(probeTimeout) ? probeTimeout : 120000,
|
|
55
|
+
pathOptions: {}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
27
59
|
function setupDownloadCommand(program) {
|
|
28
60
|
program.command('download <systemKey>')
|
|
29
61
|
.description('Pull external system from dataplane into integration/<key>/')
|
|
@@ -31,6 +63,11 @@ function setupDownloadCommand(program) {
|
|
|
31
63
|
.option('--format <format>', 'Output format: json | yaml (default: yaml or config format)')
|
|
32
64
|
.option('--dry-run', 'Show what would be downloaded without actually downloading')
|
|
33
65
|
.option('--force', 'Overwrite existing README.md without prompting')
|
|
66
|
+
.option(
|
|
67
|
+
'--version <target>',
|
|
68
|
+
'Manifest version to download (running default; latest or explicit id when supported)',
|
|
69
|
+
'running'
|
|
70
|
+
)
|
|
34
71
|
.action(async(systemKey, options) => {
|
|
35
72
|
try {
|
|
36
73
|
const config = require('../core/config');
|
|
@@ -52,53 +89,22 @@ function setupUploadCommand(program) {
|
|
|
52
89
|
.description('Validate, publish to dataplane, and register with controller (draft application); or upload .protection batch')
|
|
53
90
|
.addHelpText('after', UPLOAD_HELP_AFTER)
|
|
54
91
|
.option('--dry-run', 'Validate and build payload only; no API calls')
|
|
55
|
-
.option(
|
|
92
|
+
.option(
|
|
93
|
+
'--sync',
|
|
94
|
+
'After publish, run full datasource data sync for every datasource on the system (default: bootstrap-if-empty only)'
|
|
95
|
+
)
|
|
56
96
|
.option('--json', 'For .protection: JSON output')
|
|
57
97
|
.option('--warnings-as-errors', 'For .protection: pass strict=true to dataplane validate')
|
|
58
|
-
.option('-v, --verbose', '
|
|
98
|
+
.option('-v, --verbose', 'Expanded upload summary and server-side pipeline validate warnings before publish')
|
|
59
99
|
.option('--probe', 'After publish, run dataplane runtime checks (validation/run); slower')
|
|
60
|
-
.option('--minimal', 'Print only a short readiness summary after upload')
|
|
61
100
|
.option('--probe-timeout <ms>', 'Timeout for --probe (default: 120000)', '120000')
|
|
62
|
-
.option(
|
|
63
|
-
'--no-cert-sync',
|
|
64
|
-
'Skip updating the system file certification block from the dataplane active certificate after publish'
|
|
65
|
-
)
|
|
66
101
|
.option(
|
|
67
102
|
'--force',
|
|
68
103
|
'Bypass schema guards on active datasources during publish (dangerous; shows a warning)'
|
|
69
104
|
)
|
|
70
105
|
.action(async(systemKey, options) => {
|
|
71
106
|
try {
|
|
72
|
-
|
|
73
|
-
if (isProtectionScope(systemKey)) {
|
|
74
|
-
const { uploadProtectionBatchCommand } = require('../protection/upload-batch');
|
|
75
|
-
const logger = require('../utils/logger');
|
|
76
|
-
const code = await uploadProtectionBatchCommand(
|
|
77
|
-
{
|
|
78
|
-
env: options.env,
|
|
79
|
-
dryRun: options.dryRun === true,
|
|
80
|
-
noSync: options.noSync === true,
|
|
81
|
-
json: options.json === true,
|
|
82
|
-
verbose: options.verbose === true,
|
|
83
|
-
warningsAsErrors: options.warningsAsErrors === true
|
|
84
|
-
},
|
|
85
|
-
logger
|
|
86
|
-
);
|
|
87
|
-
if (code !== 0) {
|
|
88
|
-
process.exit(code);
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const upload = require('../commands/upload');
|
|
93
|
-
const probeTimeout =
|
|
94
|
-
options.probeTimeout === undefined || options.probeTimeout === null
|
|
95
|
-
? 120000
|
|
96
|
-
: Number(options.probeTimeout);
|
|
97
|
-
await upload.uploadExternalSystem(systemKey, {
|
|
98
|
-
...options,
|
|
99
|
-
noCertSync: cliOptsSkipCertSync(options),
|
|
100
|
-
probeTimeout: Number.isFinite(probeTimeout) ? probeTimeout : 120000
|
|
101
|
-
});
|
|
107
|
+
await handleUploadCommandAction(systemKey, options);
|
|
102
108
|
} catch (error) {
|
|
103
109
|
handleCommandError(error, 'upload');
|
|
104
110
|
process.exit(1);
|
|
@@ -181,7 +187,7 @@ async function runExternalSystemTestIntegration(appName, options) {
|
|
|
181
187
|
environment: options.env || options.environment,
|
|
182
188
|
debug: options.debug,
|
|
183
189
|
perDatasource: options.perDatasource,
|
|
184
|
-
|
|
190
|
+
noPublish: cliOptsSkipPublish(options)
|
|
185
191
|
};
|
|
186
192
|
const results = await test.testExternalSystemIntegration(appName, opts);
|
|
187
193
|
test.displayIntegrationTestResults(results, options.verbose, { debug: options.debug, runType: 'integration' });
|
|
@@ -192,9 +198,6 @@ async function runExternalSystemTestIntegration(appName, options) {
|
|
|
192
198
|
requireCert: options.requireCert === true
|
|
193
199
|
});
|
|
194
200
|
if (exitCode !== 0) process.exit(exitCode);
|
|
195
|
-
if (cliOptsSkipCertSync(options)) return;
|
|
196
|
-
const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
|
|
197
|
-
await trySyncCertificationFromDataplaneForExternalApp(appName, 'test-integration');
|
|
198
201
|
}
|
|
199
202
|
|
|
200
203
|
/**
|
|
@@ -238,10 +241,7 @@ function setupExternalSystemTestCommands(program) {
|
|
|
238
241
|
.option('-e, --env <env>', 'Environment: dev, tst, or pro (builder: dev/tst for container)', 'dev')
|
|
239
242
|
.option('-v, --verbose', 'Show detailed test output')
|
|
240
243
|
.option('-d, --debug', 'Include debug output and write log to integration/<systemKey>/logs/')
|
|
241
|
-
.option(
|
|
242
|
-
'--no-sync',
|
|
243
|
-
'Skip publishing local integration files; use system config already on the dataplane'
|
|
244
|
-
)
|
|
244
|
+
.option('--no-publish', 'Skip publishing local integration files before tests')
|
|
245
245
|
.option(
|
|
246
246
|
'--sync',
|
|
247
247
|
'Publish local system and datasource files before tests (default for external integration; same as upload)'
|
|
@@ -250,12 +250,18 @@ function setupExternalSystemTestCommands(program) {
|
|
|
250
250
|
'--force',
|
|
251
251
|
'With --sync, pass force to upload (bypass active-datasource schema replacement guards; same as aifabrix upload --force)'
|
|
252
252
|
)
|
|
253
|
-
.option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
|
|
254
|
-
.option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
|
|
255
253
|
.option(
|
|
256
|
-
'--
|
|
257
|
-
'
|
|
254
|
+
'--version <target>',
|
|
255
|
+
'Manifest version for test (latest, running, or explicit version id)',
|
|
256
|
+
'latest'
|
|
258
257
|
)
|
|
258
|
+
.option(
|
|
259
|
+
'--sync-mode <mode>',
|
|
260
|
+
'Sync policy during test: auto (default), never, or force. Distinct from --sync (publish local files).',
|
|
261
|
+
'auto'
|
|
262
|
+
)
|
|
263
|
+
.option('--warnings-as-errors', 'Treat aggregate warn as failure (exit 1)')
|
|
264
|
+
.option('--require-cert', 'Require certification passed on every datasource (exit 2 if not)')
|
|
259
265
|
.addHelpText('after', TEST_INTEGRATION_HELP_AFTER)
|
|
260
266
|
.action(async(appName, options, cmd) => {
|
|
261
267
|
try {
|
|
@@ -264,7 +270,7 @@ function setupExternalSystemTestCommands(program) {
|
|
|
264
270
|
const opts = {
|
|
265
271
|
...options,
|
|
266
272
|
env: envExplicit ? options.env : undefined,
|
|
267
|
-
|
|
273
|
+
noPublish: cliOptsSkipPublish(options, cmd)
|
|
268
274
|
};
|
|
269
275
|
await runTestIntegrationCommand(appName, opts);
|
|
270
276
|
} catch (error) {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aifabrix up-builder-api` action body.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview up-builder-api CLI action
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { handleCommandError } = require('../utils/cli-utils');
|
|
12
|
+
const { handleUpBuilderApi } = require('../commands/up-builder-api');
|
|
13
|
+
const { cleanBuilderAppDirs, BUILDER_API_APP_KEYS } = require('../commands/up-common');
|
|
14
|
+
const { recordInfraInstallationCommand } = require('./installation-log-command');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @returns {Promise<string[]>}
|
|
19
|
+
*/
|
|
20
|
+
async function runUpBuilderApiWork(options) {
|
|
21
|
+
let cleanedAppKeys = [];
|
|
22
|
+
if (options.force) {
|
|
23
|
+
const cleaned = await cleanBuilderAppDirs([...BUILDER_API_APP_KEYS]);
|
|
24
|
+
cleanedAppKeys = Array.isArray(cleaned) ? cleaned : [];
|
|
25
|
+
}
|
|
26
|
+
await handleUpBuilderApi(options);
|
|
27
|
+
return cleanedAppKeys;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {Object} options
|
|
32
|
+
* @returns {Promise<void>}
|
|
33
|
+
*/
|
|
34
|
+
async function handleUpBuilderApiCliAction(options) {
|
|
35
|
+
const startedAt = new Date();
|
|
36
|
+
let cleanedAppKeys = [];
|
|
37
|
+
try {
|
|
38
|
+
cleanedAppKeys = await runUpBuilderApiWork(options);
|
|
39
|
+
await recordInfraInstallationCommand({
|
|
40
|
+
command: 'up-builder-api',
|
|
41
|
+
options,
|
|
42
|
+
startedAt,
|
|
43
|
+
outcome: 'success',
|
|
44
|
+
platformAppList: ['builder-api'],
|
|
45
|
+
cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
|
|
46
|
+
});
|
|
47
|
+
} catch (error) {
|
|
48
|
+
await recordInfraInstallationCommand({
|
|
49
|
+
command: 'up-builder-api',
|
|
50
|
+
options,
|
|
51
|
+
startedAt,
|
|
52
|
+
outcome: 'failure',
|
|
53
|
+
error,
|
|
54
|
+
platformAppList: ['builder-api'],
|
|
55
|
+
cleanup: cleanedAppKeys.length > 0 ? { cleanedAppKeys } : undefined
|
|
56
|
+
});
|
|
57
|
+
handleCommandError(error, 'up-builder-api');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
handleUpBuilderApiCliAction
|
|
64
|
+
};
|
|
@@ -16,6 +16,7 @@ const { resolveControllerUrl } = require('../utils/controller-url');
|
|
|
16
16
|
const { handleLogin } = require('../commands/login');
|
|
17
17
|
const { handleUpMiso } = require('../commands/up-miso');
|
|
18
18
|
const { handleUpDataplane } = require('../commands/up-dataplane');
|
|
19
|
+
const { handleUpBuilderApi } = require('../commands/up-builder-api');
|
|
19
20
|
const {
|
|
20
21
|
applyUpPlatformForceConfig,
|
|
21
22
|
cleanBuilderAppDirs,
|
|
@@ -25,7 +26,7 @@ const {
|
|
|
25
26
|
const { runGuidedUpPlatform } = require('./infra-guided');
|
|
26
27
|
const { recordInfraInstallationCommand } = require('./installation-log-command');
|
|
27
28
|
|
|
28
|
-
const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane'];
|
|
29
|
+
const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane', 'builder-api'];
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
32
|
* @param {Object} options
|
|
@@ -57,6 +58,7 @@ async function runUpPlatformWork(options) {
|
|
|
57
58
|
await prepareUrlsLocalRegistryForUpPlatform();
|
|
58
59
|
await handleUpMiso(options);
|
|
59
60
|
await handleUpDataplane(options);
|
|
61
|
+
await handleUpBuilderApi({ ...options, platformInstall: true });
|
|
60
62
|
}
|
|
61
63
|
return cleanedAppKeys;
|
|
62
64
|
}
|
package/lib/cli/setup-infra.js
CHANGED
|
@@ -285,6 +285,20 @@ function setupUpDataplaneCommand(program) {
|
|
|
285
285
|
});
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
+
function setupUpBuilderApiCommand(program) {
|
|
289
|
+
program.command('up-builder-api')
|
|
290
|
+
.description('Materialize and run builder-api locally (dev env; needs up-infra; dataplane recommended)')
|
|
291
|
+
.option('-r, --registry <url>', 'Override registry for builder-api image')
|
|
292
|
+
.option('--registry-mode <mode>', 'Override registry mode (acr|external)')
|
|
293
|
+
.option('-i, --image <ref>', 'Override builder-api image reference')
|
|
294
|
+
.option('-f, --force', 'Clean builder/builder-api and re-fetch from templates')
|
|
295
|
+
.option('--verbose', 'Show full orchestration output')
|
|
296
|
+
.action((options) => {
|
|
297
|
+
const { handleUpBuilderApiCliAction } = require('./setup-infra-up-builder-api-action');
|
|
298
|
+
return handleUpBuilderApiCliAction(options);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
288
302
|
function setupDownInfraCommand(program) {
|
|
289
303
|
program.command('down-infra [service|app]')
|
|
290
304
|
.description('Stop all infra, or stop one app; use -v to remove volumes')
|
|
@@ -418,6 +432,7 @@ function setupInfraCommands(program) {
|
|
|
418
432
|
setupUpPlatformCommand(program);
|
|
419
433
|
setupUpMisoCommand(program);
|
|
420
434
|
setupUpDataplaneCommand(program);
|
|
435
|
+
setupUpBuilderApiCommand(program);
|
|
421
436
|
setupDownInfraCommand(program);
|
|
422
437
|
setupDoctorCommand(program);
|
|
423
438
|
setupStatusCommand(program);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level connected-system list command.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview aifabrix list — dataplane external systems
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const logger = require('../utils/logger');
|
|
11
|
+
const { listExternalSystemsOnDataplane } = require('../app/list-external-systems');
|
|
12
|
+
|
|
13
|
+
const LIST_HELP_AFTER = `
|
|
14
|
+
Lists connected systems published on the dataplane (not controller pipeline applications).
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
aifabrix list
|
|
18
|
+
aifabrix list --json
|
|
19
|
+
|
|
20
|
+
Controller applications only: aifabrix app list
|
|
21
|
+
Show one system: aifabrix show <systemKey> --online
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {import('commander').Command} program
|
|
26
|
+
*/
|
|
27
|
+
function setupListCommand(program) {
|
|
28
|
+
program
|
|
29
|
+
.command('list')
|
|
30
|
+
.description('List connected systems on the dataplane')
|
|
31
|
+
.option('--json', 'Output as JSON')
|
|
32
|
+
.addHelpText('after', LIST_HELP_AFTER)
|
|
33
|
+
.action(async(options) => {
|
|
34
|
+
try {
|
|
35
|
+
await listExternalSystemsOnDataplane({ json: options.json === true });
|
|
36
|
+
} catch (error) {
|
|
37
|
+
logger.error(chalk.red(`Error: ${error.message}`));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = { setupListCommand };
|