@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
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Evidence Fabrix v2 CLI leaf command registration.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
11
|
+
const {
|
|
12
|
+
exitCodeForEvidenceError,
|
|
13
|
+
runEvidenceList,
|
|
14
|
+
runEvidenceGet,
|
|
15
|
+
runEvidenceInsert,
|
|
16
|
+
runEvidenceUpdate,
|
|
17
|
+
runEvidenceDelete,
|
|
18
|
+
runEvidenceLoad,
|
|
19
|
+
runEvidenceExport,
|
|
20
|
+
DEFAULT_BULK_FILE
|
|
21
|
+
} = require('../evidence/evidence-service');
|
|
22
|
+
|
|
23
|
+
const SHARED_OPTS = [
|
|
24
|
+
['-e, --env <environment>', 'Environment key'],
|
|
25
|
+
['--json', 'Machine-readable JSON output']
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const LIST_HELP = `
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
$ aifabrix evidence list
|
|
32
|
+
$ aifabrix evidence list --resource-type deal --generic
|
|
33
|
+
$ aifabrix evidence list --role-key sales-executive --status active --json
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
const GET_HELP = `
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
$ aifabrix evidence get ev2_abc123
|
|
40
|
+
$ aifabrix evidence get ev2_abc123 --json
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const INSERT_HELP = `
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
$ aifabrix evidence insert --resource-type deal --title "High-value review" --when "Amount over threshold" --expected-behavior "Procurement review first"
|
|
47
|
+
$ aifabrix evidence insert --file ./row.json
|
|
48
|
+
`;
|
|
49
|
+
|
|
50
|
+
const UPDATE_HELP = `
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
$ aifabrix evidence update ev2_abc123 --title "Updated title"
|
|
54
|
+
$ aifabrix evidence update ev2_abc123 --file ./patch.json
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const DELETE_HELP = `
|
|
58
|
+
|
|
59
|
+
Examples:
|
|
60
|
+
$ aifabrix evidence delete ev2_abc123 --yes
|
|
61
|
+
$ aifabrix evidence delete ev2_abc123
|
|
62
|
+
|
|
63
|
+
Delete succeeds only when the row is not referenced by runtime execution.
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
const LOAD_HELP = `
|
|
67
|
+
|
|
68
|
+
Examples:
|
|
69
|
+
$ aifabrix evidence load --file ${DEFAULT_BULK_FILE}
|
|
70
|
+
$ aifabrix evidence load --dry-run
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
const EXPORT_HELP = `
|
|
74
|
+
|
|
75
|
+
Examples:
|
|
76
|
+
$ aifabrix evidence export --file ${DEFAULT_BULK_FILE}
|
|
77
|
+
$ aifabrix evidence export --resource-type deal --json
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param {import('commander').Command} cmd
|
|
82
|
+
* @param {string} name
|
|
83
|
+
* @param {string} description
|
|
84
|
+
* @param {Function} action
|
|
85
|
+
* @param {Array<[string, string]>} extraOpts
|
|
86
|
+
* @param {string} helpAfter
|
|
87
|
+
*/
|
|
88
|
+
function addEvidenceLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
|
|
89
|
+
const leaf = cmd.command(name).description(description);
|
|
90
|
+
for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
|
|
91
|
+
leaf.option(flags, desc);
|
|
92
|
+
}
|
|
93
|
+
if (helpAfter) {
|
|
94
|
+
leaf.addHelpText('after', helpAfter);
|
|
95
|
+
}
|
|
96
|
+
leaf.action(async(...args) => {
|
|
97
|
+
try {
|
|
98
|
+
const code = await action(...args);
|
|
99
|
+
if (code && code !== 0) {
|
|
100
|
+
process.exit(code);
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
logger.error(formatBlockingError(err.message || String(err)));
|
|
104
|
+
process.exit(exitCodeForEvidenceError(err));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {import('commander').Command} evidence
|
|
111
|
+
*/
|
|
112
|
+
function registerEvidenceList(evidence) {
|
|
113
|
+
addEvidenceLeaf(
|
|
114
|
+
evidence,
|
|
115
|
+
'list',
|
|
116
|
+
'List Evidence Fabrix v2 rows from the dataplane',
|
|
117
|
+
async(options) => runEvidenceList(options, logger),
|
|
118
|
+
[
|
|
119
|
+
['--resource-type <resourceType>', 'Filter by resource type'],
|
|
120
|
+
['--role-key <roleKey>', 'Filter by role-specific scope'],
|
|
121
|
+
['--generic', 'Generic rows only (no roleKey)'],
|
|
122
|
+
['--status <status>', 'Filter by active or disabled']
|
|
123
|
+
],
|
|
124
|
+
LIST_HELP
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @param {import('commander').Command} evidence
|
|
130
|
+
*/
|
|
131
|
+
function registerEvidenceGet(evidence) {
|
|
132
|
+
addEvidenceLeaf(
|
|
133
|
+
evidence,
|
|
134
|
+
'get <evidenceId>',
|
|
135
|
+
'Get one evidence row by id',
|
|
136
|
+
async(evidenceId, options) => runEvidenceGet(evidenceId, options, logger),
|
|
137
|
+
[],
|
|
138
|
+
GET_HELP
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @param {import('commander').Command} evidence
|
|
144
|
+
*/
|
|
145
|
+
function registerEvidenceInsert(evidence) {
|
|
146
|
+
addEvidenceLeaf(
|
|
147
|
+
evidence,
|
|
148
|
+
'insert',
|
|
149
|
+
'Insert a new evidence row',
|
|
150
|
+
async(options) => runEvidenceInsert(options, logger),
|
|
151
|
+
[
|
|
152
|
+
['--file <path>', 'Single evidence JSON object'],
|
|
153
|
+
['--resource-type <resourceType>', 'Resource type key'],
|
|
154
|
+
['--role-key <roleKey>', 'Optional role-specific scope'],
|
|
155
|
+
['--generic', 'Create generic evidence (no roleKey)'],
|
|
156
|
+
['--title <title>', 'Title'],
|
|
157
|
+
['--description <description>', 'Description'],
|
|
158
|
+
['--when <when>', 'Natural-language when condition'],
|
|
159
|
+
['--expected-behavior <text>', 'Expected business behavior'],
|
|
160
|
+
['--order <n>', 'Sort order within scope bucket', parseInt],
|
|
161
|
+
['--status <status>', 'active or disabled']
|
|
162
|
+
],
|
|
163
|
+
INSERT_HELP
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @param {import('commander').Command} evidence
|
|
169
|
+
*/
|
|
170
|
+
function registerEvidenceUpdate(evidence) {
|
|
171
|
+
addEvidenceLeaf(
|
|
172
|
+
evidence,
|
|
173
|
+
'update <evidenceId>',
|
|
174
|
+
'Update an evidence row',
|
|
175
|
+
async(evidenceId, options) => runEvidenceUpdate(evidenceId, options, logger),
|
|
176
|
+
[
|
|
177
|
+
['--file <path>', 'Partial update JSON object'],
|
|
178
|
+
['--role-key <roleKey>', 'Role-specific scope'],
|
|
179
|
+
['--generic', 'Clear roleKey to generic scope'],
|
|
180
|
+
['--title <title>', 'Title'],
|
|
181
|
+
['--description <description>', 'Description'],
|
|
182
|
+
['--when <when>', 'When condition'],
|
|
183
|
+
['--expected-behavior <text>', 'Expected behavior'],
|
|
184
|
+
['--order <n>', 'Sort order', parseInt],
|
|
185
|
+
['--status <status>', 'active or disabled']
|
|
186
|
+
],
|
|
187
|
+
UPDATE_HELP
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @param {import('commander').Command} evidence
|
|
193
|
+
*/
|
|
194
|
+
function registerEvidenceDelete(evidence) {
|
|
195
|
+
addEvidenceLeaf(
|
|
196
|
+
evidence,
|
|
197
|
+
'delete <evidenceId>',
|
|
198
|
+
'Delete evidence when it is not referenced by runtime execution',
|
|
199
|
+
async(evidenceId, options) => runEvidenceDelete(evidenceId, options, logger),
|
|
200
|
+
[['--yes', 'Skip confirmation prompt']],
|
|
201
|
+
DELETE_HELP
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @param {import('commander').Command} evidence
|
|
207
|
+
*/
|
|
208
|
+
function registerEvidenceLoad(evidence) {
|
|
209
|
+
addEvidenceLeaf(
|
|
210
|
+
evidence,
|
|
211
|
+
'load',
|
|
212
|
+
'Bulk insert or update evidence rows from a JSON array file',
|
|
213
|
+
async(options) => runEvidenceLoad(options, logger),
|
|
214
|
+
[
|
|
215
|
+
['--file <path>', `JSON array file (default: ${DEFAULT_BULK_FILE})`],
|
|
216
|
+
['--dry-run', 'Validate file without mutating dataplane']
|
|
217
|
+
],
|
|
218
|
+
LOAD_HELP
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @param {import('commander').Command} evidence
|
|
224
|
+
*/
|
|
225
|
+
function registerEvidenceExport(evidence) {
|
|
226
|
+
addEvidenceLeaf(
|
|
227
|
+
evidence,
|
|
228
|
+
'export',
|
|
229
|
+
'Export filtered evidence rows to a JSON array file',
|
|
230
|
+
async(options) => runEvidenceExport(options, logger),
|
|
231
|
+
[
|
|
232
|
+
['--file <path>', `Output file (default: ${DEFAULT_BULK_FILE})`],
|
|
233
|
+
['--resource-type <resourceType>', 'Filter by resource type'],
|
|
234
|
+
['--role-key <roleKey>', 'Filter by role-specific scope'],
|
|
235
|
+
['--generic', 'Generic rows only'],
|
|
236
|
+
['--status <status>', 'Filter by active or disabled']
|
|
237
|
+
],
|
|
238
|
+
EXPORT_HELP
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
module.exports = {
|
|
243
|
+
registerEvidenceList,
|
|
244
|
+
registerEvidenceGet,
|
|
245
|
+
registerEvidenceInsert,
|
|
246
|
+
registerEvidenceUpdate,
|
|
247
|
+
registerEvidenceDelete,
|
|
248
|
+
registerEvidenceLoad,
|
|
249
|
+
registerEvidenceExport
|
|
250
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Evidence Fabrix v2 CLI commands.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
registerEvidenceList,
|
|
11
|
+
registerEvidenceGet,
|
|
12
|
+
registerEvidenceInsert,
|
|
13
|
+
registerEvidenceUpdate,
|
|
14
|
+
registerEvidenceDelete,
|
|
15
|
+
registerEvidenceLoad,
|
|
16
|
+
registerEvidenceExport
|
|
17
|
+
} = require('./evidence-cli-leaves');
|
|
18
|
+
|
|
19
|
+
const EVIDENCE_HELP_AFTER = `
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
$ aifabrix evidence list --resource-type deal
|
|
23
|
+
$ aifabrix evidence insert --resource-type deal --title "Review threshold" --when "..." --expected-behavior "..."
|
|
24
|
+
$ aifabrix evidence export --file .evidence/evidence.json
|
|
25
|
+
$ aifabrix evidence load --file .evidence/evidence.json --dry-run
|
|
26
|
+
$ aifabrix evidence delete ev2_abc123 --yes
|
|
27
|
+
|
|
28
|
+
Per-command help: aifabrix evidence <command> --help
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {import('commander').Command} program
|
|
33
|
+
*/
|
|
34
|
+
function setupEvidenceCommands(program) {
|
|
35
|
+
const evidence = program
|
|
36
|
+
.command('evidence')
|
|
37
|
+
.description('Manage Evidence Fabrix v2 rows on the dataplane')
|
|
38
|
+
.addHelpText('after', EVIDENCE_HELP_AFTER);
|
|
39
|
+
|
|
40
|
+
registerEvidenceList(evidence);
|
|
41
|
+
registerEvidenceGet(evidence);
|
|
42
|
+
registerEvidenceInsert(evidence);
|
|
43
|
+
registerEvidenceUpdate(evidence);
|
|
44
|
+
registerEvidenceDelete(evidence);
|
|
45
|
+
registerEvidenceLoad(evidence);
|
|
46
|
+
registerEvidenceExport(evidence);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = {
|
|
50
|
+
setupEvidenceCommands
|
|
51
|
+
};
|
|
@@ -9,7 +9,7 @@ const {
|
|
|
9
9
|
syncLocalIfRequested
|
|
10
10
|
} = require('./test-e2e-external');
|
|
11
11
|
const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
|
|
12
|
-
const {
|
|
12
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
13
13
|
const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
|
|
14
14
|
const { formatNetworkError } = require('../utils/api-error-handler');
|
|
15
15
|
|
|
@@ -74,7 +74,7 @@ async function resolveGovernanceIntegrationContext(systemKey, options) {
|
|
|
74
74
|
dataplaneUrl: options.dataplaneUrl
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
if (!
|
|
77
|
+
if (!cliOptsSkipPublish(options)) {
|
|
78
78
|
const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
|
|
79
79
|
if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
|
|
80
80
|
options.authConfig = uploadCtx.authConfig;
|
|
@@ -35,7 +35,7 @@ function normalizeGovernanceOptions(options, cmd) {
|
|
|
35
35
|
return {
|
|
36
36
|
env: options.env || parent.env || 'dev',
|
|
37
37
|
verbose: options.verbose === true || parent.verbose === true,
|
|
38
|
-
|
|
38
|
+
noPublish: options.noPublish === true || parent.noPublish === true,
|
|
39
39
|
force: options.force === true || parent.force === true,
|
|
40
40
|
json: options.json === true || parent.json === true,
|
|
41
41
|
pack: options.pack,
|
|
@@ -109,7 +109,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
|
|
|
109
109
|
async function governanceDownloadHandler(systemKey, options, cmd) {
|
|
110
110
|
try {
|
|
111
111
|
const opts = normalizeGovernanceOptions(options, cmd);
|
|
112
|
-
opts.
|
|
112
|
+
opts.noPublish = true;
|
|
113
113
|
const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
|
|
114
114
|
if (opts.json) {
|
|
115
115
|
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resolve governance subject emails from integration fixture CSV.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { nodeFs } = require('../internal/node-fs');
|
|
11
|
+
const { getIntegrationPath } = require('../utils/paths');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {string} line
|
|
15
|
+
* @returns {string[]}
|
|
16
|
+
*/
|
|
17
|
+
function parseCsvLine(line) {
|
|
18
|
+
const cells = [];
|
|
19
|
+
let current = '';
|
|
20
|
+
let inQuotes = false;
|
|
21
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
22
|
+
const char = line[index];
|
|
23
|
+
if (char === '"') {
|
|
24
|
+
inQuotes = !inQuotes;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (char === ',' && !inQuotes) {
|
|
28
|
+
cells.push(current.trim());
|
|
29
|
+
current = '';
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
current += char;
|
|
33
|
+
}
|
|
34
|
+
cells.push(current.trim());
|
|
35
|
+
return cells;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {string[]} lines
|
|
40
|
+
* @param {number} emailIndex
|
|
41
|
+
* @returns {string[]}
|
|
42
|
+
*/
|
|
43
|
+
function collectUniqueEmailsFromRows(lines, emailIndex) {
|
|
44
|
+
const emails = [];
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
for (let rowIndex = 1; rowIndex < lines.length; rowIndex += 1) {
|
|
47
|
+
const row = parseCsvLine(lines[rowIndex]);
|
|
48
|
+
const email = String(row[emailIndex] || '').trim().toLowerCase();
|
|
49
|
+
if (!email || seen.has(email)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
seen.add(email);
|
|
53
|
+
emails.push(email);
|
|
54
|
+
}
|
|
55
|
+
return emails;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {string} systemKey
|
|
60
|
+
* @returns {string[]}
|
|
61
|
+
*/
|
|
62
|
+
function resolveGovernanceFixtureSubjectEmails(systemKey) {
|
|
63
|
+
const integrationPath = getIntegrationPath(systemKey);
|
|
64
|
+
const csvPath = path.join(integrationPath, 'fixtures', 'session-users.csv');
|
|
65
|
+
const disk = nodeFs();
|
|
66
|
+
if (!disk.existsSync(csvPath)) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
const raw = disk.readFileSync(csvPath, 'utf8');
|
|
70
|
+
const lines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
71
|
+
if (lines.length < 2) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const headers = parseCsvLine(lines[0]).map((header) => header.toLowerCase());
|
|
75
|
+
const emailIndex = headers.indexOf('email');
|
|
76
|
+
if (emailIndex < 0) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
return collectUniqueEmailsFromRows(lines, emailIndex);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports = {
|
|
83
|
+
parseCsvLine,
|
|
84
|
+
resolveGovernanceFixtureSubjectEmails
|
|
85
|
+
};
|
|
@@ -21,7 +21,7 @@ const {
|
|
|
21
21
|
|
|
22
22
|
const SHARED_OPTS = [
|
|
23
23
|
['-e, --env <env>', 'Environment: dev, tst, or pro', 'dev'],
|
|
24
|
-
['--no-
|
|
24
|
+
['--no-publish', 'Skip publishing local integration files before dataplane calls'],
|
|
25
25
|
[
|
|
26
26
|
'--force',
|
|
27
27
|
'With default sync, pass force to upload (same as aifabrix upload --force)'
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
const logger = require('../utils/logger');
|
|
10
10
|
const { handleCommandError } = require('../utils/cli-utils');
|
|
11
|
-
const {
|
|
11
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
12
12
|
const { runLifecycleForExternalSystem } = require('./lifecycle-external');
|
|
13
13
|
const { displayLifecycleReportTTY } = require('../lifecycle/report-display');
|
|
14
14
|
const { VERDICT } = require('../lifecycle/product-model');
|
|
@@ -29,7 +29,7 @@ function normalizeLifecycleCliOptions(options, cmd) {
|
|
|
29
29
|
debug: options.debug === true || has('-d') || has('--debug'),
|
|
30
30
|
json: options.json === true || has('--json'),
|
|
31
31
|
run: options.run === true || has('--run'),
|
|
32
|
-
|
|
32
|
+
noPublish: cliOptsSkipPublish(options, cmd),
|
|
33
33
|
force: options.force === true || has('--force'),
|
|
34
34
|
subjectUserId: options.subjectUserId || [],
|
|
35
35
|
subjectEmail: options.subjectEmail || [],
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
const { getSystemLifecycleReport, runSystemLifecycle } = require('../api/lifecycle.api');
|
|
10
10
|
const { setupIntegrationTestAuth } = require('../external-system/test-auth');
|
|
11
11
|
const { getConfig } = require('../core/config');
|
|
12
|
-
const {
|
|
12
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
13
13
|
const { syncLocalIfRequested } = require('./test-e2e-external');
|
|
14
14
|
const { runVerifyOperationsForExternalSystem } = require('./verify-operations-external');
|
|
15
15
|
const { runVerifyTrustForExternalSystem } = require('./verify-trust-external');
|
|
@@ -45,7 +45,7 @@ async function resolveLifecycleDataplaneUiBaseUrl(dataplaneUrl) {
|
|
|
45
45
|
* @returns {Promise<{ authConfig: Object, dataplaneUrl: string }>}
|
|
46
46
|
*/
|
|
47
47
|
async function resolveLifecycleAuth(systemKey, options) {
|
|
48
|
-
if (!
|
|
48
|
+
if (!cliOptsSkipPublish(options) && options.run === true) {
|
|
49
49
|
options.lifecycleProgress?.setLabel?.('Checking config on dataplane');
|
|
50
50
|
const uploadCtx = await syncLocalIfRequested(systemKey, {
|
|
51
51
|
...options,
|
|
@@ -97,7 +97,7 @@ async function runLifecycleGovernanceCombinedIfNeeded(
|
|
|
97
97
|
* @param {Object} options
|
|
98
98
|
*/
|
|
99
99
|
async function runMissingVerifyStepsLocally(systemKey, report, options) {
|
|
100
|
-
const runOpts = { ...options,
|
|
100
|
+
const runOpts = { ...options, noPublish: true };
|
|
101
101
|
if (report.operations?.verdict !== VERDICT.VERIFIED) {
|
|
102
102
|
await runVerifyOperationsForExternalSystem(systemKey, runOpts);
|
|
103
103
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve bearer context for manifest CLI commands.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Uses aifabrix auth token + developer workspace root
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
const { getValidatedAuthContext } = require('./auth-status');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @returns {Promise<{ userId: string, bearerToken: string, workspaceRoot: string }>}
|
|
17
|
+
*/
|
|
18
|
+
async function resolveActorBearerContext() {
|
|
19
|
+
const ctx = await getValidatedAuthContext();
|
|
20
|
+
const userId = ctx.authConfig?.userId || 'cli-user';
|
|
21
|
+
const workspaceRoot = process.env.WORKSPACE_ROOT || path.join(os.homedir(), '.aifabrix', 'builder-workspaces');
|
|
22
|
+
return {
|
|
23
|
+
userId: String(userId),
|
|
24
|
+
bearerToken: ctx.authConfig.token,
|
|
25
|
+
workspaceRoot
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { resolveActorBearerContext };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register manifest CLI subcommands (plan 154.4).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Keeps setupManifestCommands under max-lines-per-function
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const chalk = require('chalk');
|
|
13
|
+
const { getManifestSection, listManifestSections } = require('../programmatic/manifest-get-section');
|
|
14
|
+
const { patchManifestSection } = require('../programmatic/manifest-patch-section');
|
|
15
|
+
const { runManifestRepair } = require('../programmatic/manifest-repair');
|
|
16
|
+
const { resolveActorBearerContext } = require('./manifest-cli-auth');
|
|
17
|
+
const { resolveManifestCliIntegrationPath } = require('./manifest-cli-integration-path');
|
|
18
|
+
const { createWorkspaceContext, runWithWorkspaceContext } = require('../programmatic/workspace-context');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {import('commander').Command} manifest
|
|
22
|
+
*/
|
|
23
|
+
function registerManifestSubcommands(manifest) {
|
|
24
|
+
registerManifestReadCommands(manifest);
|
|
25
|
+
registerManifestWriteCommands(manifest);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {import('commander').Command} manifest
|
|
30
|
+
*/
|
|
31
|
+
function registerManifestReadCommands(manifest) {
|
|
32
|
+
manifest
|
|
33
|
+
.command('get-section <systemKey> <sectionKey>')
|
|
34
|
+
.description('Read one governed manifest section with quality and read token')
|
|
35
|
+
.option('--datasource <key>', 'Datasource key for datasource sections')
|
|
36
|
+
.option('--json', 'Print JSON result')
|
|
37
|
+
.action(async(systemKey, sectionKey, options) => {
|
|
38
|
+
await runManifestCliAction(options, async(ctx) => {
|
|
39
|
+
printManifestResult(
|
|
40
|
+
await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource }),
|
|
41
|
+
options
|
|
42
|
+
);
|
|
43
|
+
}, systemKey);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
manifest
|
|
47
|
+
.command('list-sections <systemKey>')
|
|
48
|
+
.description('List governed section keys for a workspace system')
|
|
49
|
+
.option('--json', 'Print JSON result')
|
|
50
|
+
.action(async(systemKey, options) => {
|
|
51
|
+
await runManifestCliAction(options, async(ctx) => {
|
|
52
|
+
printManifestResult(await listManifestSections(ctx), options);
|
|
53
|
+
}, systemKey);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param {import('commander').Command} manifest
|
|
59
|
+
*/
|
|
60
|
+
function registerManifestWriteCommands(manifest) {
|
|
61
|
+
manifest
|
|
62
|
+
.command('patch-section <systemKey> <sectionKey>')
|
|
63
|
+
.description('Patch one governed manifest section (requires prior get-section token)')
|
|
64
|
+
.requiredOption('--intent <text>', 'Why this patch is made (audit)')
|
|
65
|
+
.option('--datasource <key>', 'Datasource key for datasource sections')
|
|
66
|
+
.option('--file <path>', 'JSON file with patch payload object')
|
|
67
|
+
.option('--mode <mode>', 'merge or replace', 'merge')
|
|
68
|
+
.option('--token <token>', 'sectionReadToken from get-section')
|
|
69
|
+
.option('--dry-run', 'Validate without writing')
|
|
70
|
+
.option('--json', 'Print JSON result')
|
|
71
|
+
.action(async(systemKey, sectionKey, options) => {
|
|
72
|
+
await runManifestCliAction(options, async(ctx) => {
|
|
73
|
+
printManifestResult(await patchFromCli(ctx, sectionKey, options), options);
|
|
74
|
+
}, systemKey);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
manifest
|
|
78
|
+
.command('repair <systemKey>')
|
|
79
|
+
.description('Run explicit manifest repair hooks after section patches')
|
|
80
|
+
.requiredOption('--hooks <list>', 'Comma-separated hooks (fieldMappings,expose,rbac,...)')
|
|
81
|
+
.option('--section-key <key>', 'Section key for graph-derived ordering metadata')
|
|
82
|
+
.option('--datasource <key>', 'Datasource key for post-repair quality snapshot')
|
|
83
|
+
.option('--dry-run', 'Preview repair')
|
|
84
|
+
.option('--json', 'Print JSON result')
|
|
85
|
+
.action(async(systemKey, options) => {
|
|
86
|
+
await runManifestCliAction(options, async(ctx) => {
|
|
87
|
+
const hooks = String(options.hooks)
|
|
88
|
+
.split(',')
|
|
89
|
+
.map((h) => h.trim())
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
printManifestResult(
|
|
92
|
+
await runManifestRepair(ctx, {
|
|
93
|
+
hooks,
|
|
94
|
+
sectionKey: options.sectionKey,
|
|
95
|
+
datasourceKey: options.datasource,
|
|
96
|
+
dryRun: options.dryRun === true
|
|
97
|
+
}),
|
|
98
|
+
options
|
|
99
|
+
);
|
|
100
|
+
}, systemKey);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {import('./workspace-context').WorkspaceContext} ctx
|
|
106
|
+
* @param {string} sectionKey
|
|
107
|
+
* @param {Object} options
|
|
108
|
+
*/
|
|
109
|
+
async function patchFromCli(ctx, sectionKey, options) {
|
|
110
|
+
const patch = options.file ? JSON.parse(fs.readFileSync(options.file, 'utf8')) : {};
|
|
111
|
+
let token = options.token;
|
|
112
|
+
if (!token) {
|
|
113
|
+
const view = await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource });
|
|
114
|
+
token = view.sectionReadToken;
|
|
115
|
+
}
|
|
116
|
+
return patchManifestSection(ctx, {
|
|
117
|
+
sectionKey,
|
|
118
|
+
datasourceKey: options.datasource,
|
|
119
|
+
intent: options.intent,
|
|
120
|
+
patch,
|
|
121
|
+
mode: options.mode,
|
|
122
|
+
sectionReadToken: token,
|
|
123
|
+
dryRun: options.dryRun === true
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param {Object} result
|
|
129
|
+
* @param {Object} options
|
|
130
|
+
*/
|
|
131
|
+
function printManifestResult(result, options) {
|
|
132
|
+
if (options.json) {
|
|
133
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
process.stdout.write(`${chalk.green('✓ Manifest operation completed')}\n`);
|
|
137
|
+
if (result.sectionKey) {
|
|
138
|
+
process.stdout.write(`${chalk.cyan(` section: ${result.sectionKey}`)}\n`);
|
|
139
|
+
}
|
|
140
|
+
if (result.quality) {
|
|
141
|
+
process.stdout.write(`${chalk.cyan(` quality.score: ${result.quality.score}`)}\n`);
|
|
142
|
+
}
|
|
143
|
+
if (result.nextActions) {
|
|
144
|
+
process.stdout.write(`${chalk.cyan(` nextActions: ${result.nextActions.join(' → ')}`)}\n`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @param {Object} options
|
|
150
|
+
* @param {Function} fn
|
|
151
|
+
* @param {string} systemKey
|
|
152
|
+
*/
|
|
153
|
+
async function runManifestCliAction(options, fn, systemKey) {
|
|
154
|
+
const auth = await resolveActorBearerContext();
|
|
155
|
+
const { integrationPath } = resolveManifestCliIntegrationPath(systemKey);
|
|
156
|
+
const ctx = createWorkspaceContext({
|
|
157
|
+
userId: auth.userId,
|
|
158
|
+
systemKey,
|
|
159
|
+
bearerToken: auth.bearerToken,
|
|
160
|
+
workspaceRoot: auth.workspaceRoot,
|
|
161
|
+
integrationPath
|
|
162
|
+
});
|
|
163
|
+
await runWithWorkspaceContext(ctx, () => fn(ctx));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
module.exports = {
|
|
167
|
+
registerManifestSubcommands,
|
|
168
|
+
printManifestResult,
|
|
169
|
+
runManifestCliAction
|
|
170
|
+
};
|