@aifabrix/builder 2.49.2 → 2.51.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/plans/157.1-security-quality-violations-by-type.csv +374 -0
- package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
- 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/integration/hubspot-test/create-hubspot.js +1 -16
- 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-kinds.api.js +128 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/pipeline.api.js +5 -1
- package/lib/api/resource-types.api.js +5 -4
- package/lib/api/roles.api.js +121 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence-kinds.types.js +42 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/api/types/roles.types.js +36 -0
- package/lib/app/certification-verify-rows.js +1 -1
- 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 +39 -90
- 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/merge-certification-from-artifact.js +1 -1
- 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 +18 -5
- 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 +31 -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 +60 -130
- 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 +30 -9
- 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-help-after.js +12 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility-validate.js +41 -2
- 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 +184 -0
- package/lib/commands/deploy-gate-orchestrator.js +368 -0
- package/lib/commands/dev-cli-handlers.js +7 -62
- 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 +6 -106
- package/lib/commands/dev-refresh.js +197 -0
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence-kind.js +428 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +5 -3
- 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 +33 -8
- 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 +166 -44
- package/lib/commands/role.js +452 -0
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/setup.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/validate-json.js +230 -0
- 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 +79 -41
- 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/audit-logger.js +1 -1
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/core/secrets-load.js +1 -3
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/capability/relate-operations.js +1 -1
- 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/helpers.js +13 -5
- package/lib/generator/index.js +17 -2
- package/lib/generator/split-variables.js +9 -3
- package/lib/generator/wizard.js +3 -36
- package/lib/infrastructure/helpers-docker-check.js +6 -0
- package/lib/infrastructure/helpers.js +1 -1
- 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 +45 -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 +114 -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 +222 -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 +493 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +162 -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 +108 -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 +62 -0
- package/lib/programmatic/run-template-workspace.js +74 -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/evidence-kind-file.js +230 -0
- package/lib/resolvers/resource-type-file.js +58 -1
- package/lib/resolvers/role-file.js +227 -0
- package/lib/schema/application-schema.json +22 -2
- package/lib/schema/external-datasource.schema.json +245 -2
- package/lib/schema/external-system.schema.json +259 -119
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/infra.parameter.yaml +25 -1
- package/lib/schema/type/credential-field-registry.json +21 -5
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/api.js +8 -2
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/app-register-config.js +4 -3
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +62 -10
- package/lib/utils/cli-utils.js +15 -3
- 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-ca-install.js +5 -6
- package/lib/utils/dev-config.js +2 -2
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-list-sort.js +145 -0
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-platform-tls.js +0 -63
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/docker-build.js +46 -27
- package/lib/utils/docker-daemon-tls-ca.js +1 -1
- package/lib/utils/docker-exec.js +91 -6
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +3 -4
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/error-formatters/error-parser.js +0 -3
- package/lib/utils/external-env-template.js +5 -2
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +248 -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/health-check-request.js +2 -3
- package/lib/utils/help-builder.js +9 -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/image-name.js +22 -4
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/logger.js +37 -4
- package/lib/utils/manifest-source-emit.js +1 -1
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +183 -30
- package/lib/utils/pipeline-upload-auth-retry.js +4 -0
- package/lib/utils/postgres-platform-bootstrap.js +24 -17
- package/lib/utils/postgres-wipe.js +5 -2
- package/lib/utils/remote-dev-auth.js +39 -4
- package/lib/utils/resolve-docker-image-ref.js +36 -6
- 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/token-manager.js +16 -0
- package/lib/utils/upload-sync-options.js +20 -2
- 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 +430 -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/lib/validation/validator.js +6 -5
- package/package.json +76 -37
- 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 +337 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +119 -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 +27 -5
- package/templates/applications/dataplane/env.template +38 -15
- package/templates/applications/dataplane/rbac.yaml +85 -3
- package/templates/applications/miso-controller/application.yaml +10 -1
- package/templates/applications/miso-controller/env.template +11 -10
- package/templates/applications/miso-controller/rbac.yaml +72 -0
- 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 +144 -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 +2 -2
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence kind catalog commands (Controller).
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* - aifabrix evidence-kind create|import|export|get|list
|
|
6
|
+
*
|
|
7
|
+
* Distinct from `aifabrix evidence` (Evidence Fabrix v2 rows).
|
|
8
|
+
*
|
|
9
|
+
* @fileoverview Evidence kind catalog CLI commands
|
|
10
|
+
* @author AI Fabrix Team
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const chalk = require('chalk');
|
|
17
|
+
const logger = require('../utils/logger');
|
|
18
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
19
|
+
const { normalizeControllerUrl, resolveEnvironment } = require('../core/config');
|
|
20
|
+
const { getOrRefreshDeviceToken } = require('../utils/token-manager');
|
|
21
|
+
const {
|
|
22
|
+
readEvidenceKindCreateFile,
|
|
23
|
+
readEvidenceKindCatalogFile,
|
|
24
|
+
writeEvidenceKindCatalogFile,
|
|
25
|
+
mapEvidenceKindFileToApiPayload,
|
|
26
|
+
mapEvidenceKindApiToFileRow
|
|
27
|
+
} = require('../resolvers/evidence-kind-file');
|
|
28
|
+
const {
|
|
29
|
+
formatBlockingError,
|
|
30
|
+
formatSuccessLine,
|
|
31
|
+
infoLine,
|
|
32
|
+
headerKeyValue
|
|
33
|
+
} = require('../utils/cli-layout-chalk');
|
|
34
|
+
const {
|
|
35
|
+
listEvidenceKinds,
|
|
36
|
+
getEvidenceKind,
|
|
37
|
+
createEvidenceKindIdempotent
|
|
38
|
+
} = require('../api/evidence-kinds.api');
|
|
39
|
+
|
|
40
|
+
const EVIDENCE_KIND_KEY_PATTERN = /^[a-z][a-z0-9_]*$/;
|
|
41
|
+
|
|
42
|
+
const EVIDENCE_KIND_HELP_AFTER = `
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
$ aifabrix evidence-kind create --key obligation --display-name "Obligation" --domain governance --purpose "Track commitments"
|
|
46
|
+
$ aifabrix evidence-kind get obligation
|
|
47
|
+
$ aifabrix evidence-kind list --search risk
|
|
48
|
+
|
|
49
|
+
Per-command help: aifabrix evidence-kind <command> --help
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
const EVIDENCE_KIND_IMPORT_HELP_AFTER = `
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
$ aifabrix evidence-kind import --file ./baseline-evidence-kinds.json
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
const EVIDENCE_KIND_EXPORT_HELP_AFTER = `
|
|
59
|
+
|
|
60
|
+
Examples:
|
|
61
|
+
$ aifabrix evidence-kind export --file ./evidence-kinds-export.json
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
const EVIDENCE_KIND_CREATE_HELP_AFTER = `
|
|
65
|
+
|
|
66
|
+
Examples:
|
|
67
|
+
$ aifabrix evidence-kind create --key obligation --display-name "Obligation" --domain governance --purpose "Track commitments"
|
|
68
|
+
$ aifabrix evidence-kind create --key risk --display-name "Risk" --domain governance --purpose "..." --default-severity high
|
|
69
|
+
$ aifabrix evidence-kind create --file ./obligation.json
|
|
70
|
+
`;
|
|
71
|
+
|
|
72
|
+
const EVIDENCE_KIND_GET_HELP_AFTER = `
|
|
73
|
+
|
|
74
|
+
Examples:
|
|
75
|
+
$ aifabrix evidence-kind get obligation
|
|
76
|
+
$ aifabrix evidence-kind get clx1234567890abcdef
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
const EVIDENCE_KIND_LIST_HELP_AFTER = `
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
$ aifabrix evidence-kind list
|
|
83
|
+
$ aifabrix evidence-kind list --page 1 --page-size 50
|
|
84
|
+
$ aifabrix evidence-kind list --search risk
|
|
85
|
+
`;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {string} raw
|
|
89
|
+
* @returns {string}
|
|
90
|
+
*/
|
|
91
|
+
function requireEvidenceKindKey(raw) {
|
|
92
|
+
const key = String(raw || '').trim();
|
|
93
|
+
if (!key) {
|
|
94
|
+
throw new Error('Evidence kind key is required (--key <key> or --file <path>).');
|
|
95
|
+
}
|
|
96
|
+
if (!EVIDENCE_KIND_KEY_PATTERN.test(key)) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
'Evidence kind key must start with a lowercase letter and contain only lowercase letters, numbers, and underscores.'
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
return key;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {Object} _options
|
|
106
|
+
* @returns {Promise<{ controllerUrl: string, authConfig: Object }>}
|
|
107
|
+
*/
|
|
108
|
+
async function resolveControllerAndAuth(_options) {
|
|
109
|
+
const controllerUrl = await resolveControllerUrl();
|
|
110
|
+
if (!controllerUrl) {
|
|
111
|
+
throw new Error('Controller URL is required. Run "aifabrix login" first.');
|
|
112
|
+
}
|
|
113
|
+
const normalized = normalizeControllerUrl(controllerUrl);
|
|
114
|
+
const deviceToken = await getOrRefreshDeviceToken(normalized);
|
|
115
|
+
if (!deviceToken || !deviceToken.token) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`Not authenticated for controller: ${controllerUrl}. ` +
|
|
118
|
+
'Run "aifabrix login" and try again.'
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
controllerUrl: deviceToken.controller || normalized,
|
|
123
|
+
authConfig: { type: 'bearer', token: deviceToken.token }
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function resolveHeaderContext() {
|
|
128
|
+
const env = await resolveEnvironment();
|
|
129
|
+
const controllerUrl = await resolveControllerUrl();
|
|
130
|
+
const normalized = normalizeControllerUrl(controllerUrl);
|
|
131
|
+
return { environment: env || 'dev', controllerUrl: normalized };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @param {Object} response
|
|
136
|
+
* @returns {any}
|
|
137
|
+
*/
|
|
138
|
+
function unwrapControllerData(response) {
|
|
139
|
+
return response?.data?.data ?? response?.data ?? response;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Build create payload from flags and optional --file (maps domain → domainKey).
|
|
144
|
+
* @param {Object} options
|
|
145
|
+
* @returns {Object}
|
|
146
|
+
*/
|
|
147
|
+
function buildCreatePayload(options) {
|
|
148
|
+
let base = {};
|
|
149
|
+
if (options.file) {
|
|
150
|
+
base = readEvidenceKindCreateFile(options.file);
|
|
151
|
+
}
|
|
152
|
+
const merged = { ...base };
|
|
153
|
+
if (options.key) merged.key = options.key;
|
|
154
|
+
if (options.displayName) merged.displayName = options.displayName;
|
|
155
|
+
if (options.description !== undefined) merged.description = options.description;
|
|
156
|
+
if (options.purpose !== undefined) merged.purpose = options.purpose;
|
|
157
|
+
if (options.expectedUse !== undefined) merged.expectedUse = options.expectedUse;
|
|
158
|
+
if (options.defaultSeverity) merged.defaultSeverity = options.defaultSeverity;
|
|
159
|
+
if (options.domain) {
|
|
160
|
+
merged.domain = options.domain;
|
|
161
|
+
delete merged.domainKey;
|
|
162
|
+
}
|
|
163
|
+
if (options.file && !options.domain && base.domainKey) {
|
|
164
|
+
return { ...base, key: requireEvidenceKindKey(merged.key || base.key) };
|
|
165
|
+
}
|
|
166
|
+
const payload = mapEvidenceKindFileToApiPayload(
|
|
167
|
+
{
|
|
168
|
+
...merged,
|
|
169
|
+
domain: merged.domain || merged.domainKey
|
|
170
|
+
},
|
|
171
|
+
0
|
|
172
|
+
);
|
|
173
|
+
payload.key = requireEvidenceKindKey(payload.key);
|
|
174
|
+
return payload;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @param {Object[]} rows
|
|
179
|
+
* @param {string} controllerUrl
|
|
180
|
+
* @param {Object} authConfig
|
|
181
|
+
* @returns {Promise<{ created: number, existed: number, total: number }>}
|
|
182
|
+
*/
|
|
183
|
+
async function importEvidenceKindRows(rows, controllerUrl, authConfig) {
|
|
184
|
+
let created = 0;
|
|
185
|
+
let existed = 0;
|
|
186
|
+
for (const payload of rows) {
|
|
187
|
+
payload.key = requireEvidenceKindKey(payload.key);
|
|
188
|
+
const out = await createEvidenceKindIdempotent(controllerUrl, authConfig, payload);
|
|
189
|
+
if (out.created) {
|
|
190
|
+
created += 1;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
existed += 1;
|
|
194
|
+
}
|
|
195
|
+
return { created, existed, total: rows.length };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @param {string} controllerUrl
|
|
200
|
+
* @param {Object} authConfig
|
|
201
|
+
* @returns {Promise<Object[]>}
|
|
202
|
+
*/
|
|
203
|
+
async function fetchAllEvidenceKinds(controllerUrl, authConfig) {
|
|
204
|
+
const all = [];
|
|
205
|
+
let page = 1;
|
|
206
|
+
const pageSize = 100;
|
|
207
|
+
for (;;) {
|
|
208
|
+
const res = await listEvidenceKinds(controllerUrl, authConfig, { page, pageSize });
|
|
209
|
+
const payload = unwrapControllerData(res);
|
|
210
|
+
const items = payload?.data ?? payload ?? [];
|
|
211
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
all.push(...items);
|
|
215
|
+
if (items.length < pageSize) {
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
page += 1;
|
|
219
|
+
}
|
|
220
|
+
return all;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function setupEvidenceKindImportCommand(cmd) {
|
|
224
|
+
cmd
|
|
225
|
+
.command('import')
|
|
226
|
+
.description('Import evidence kinds from baseline JSON (idempotent)')
|
|
227
|
+
.addHelpText('after', EVIDENCE_KIND_IMPORT_HELP_AFTER)
|
|
228
|
+
.requiredOption('--file <path>', 'Baseline catalog (evidenceKinds[]) or JSON array')
|
|
229
|
+
.action(async(options) => {
|
|
230
|
+
try {
|
|
231
|
+
const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
|
|
232
|
+
const rows = readEvidenceKindCatalogFile(options.file);
|
|
233
|
+
const summary = await importEvidenceKindRows(rows, controllerUrl, authConfig);
|
|
234
|
+
logger.log(
|
|
235
|
+
formatSuccessLine(
|
|
236
|
+
`Evidence kinds imported: ${summary.total} total ` +
|
|
237
|
+
`(${summary.created} created, ${summary.existed} already existed)`
|
|
238
|
+
)
|
|
239
|
+
);
|
|
240
|
+
} catch (e) {
|
|
241
|
+
logger.error(formatBlockingError(e.message));
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function setupEvidenceKindExportCommand(cmd) {
|
|
248
|
+
cmd
|
|
249
|
+
.command('export')
|
|
250
|
+
.description('Export evidence kinds to baseline-shaped JSON')
|
|
251
|
+
.addHelpText('after', EVIDENCE_KIND_EXPORT_HELP_AFTER)
|
|
252
|
+
.requiredOption('--file <path>', 'Output path for baseline catalog JSON')
|
|
253
|
+
.action(async(options) => {
|
|
254
|
+
try {
|
|
255
|
+
const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
|
|
256
|
+
const records = await fetchAllEvidenceKinds(controllerUrl, authConfig);
|
|
257
|
+
const rows = records.map(mapEvidenceKindApiToFileRow);
|
|
258
|
+
writeEvidenceKindCatalogFile(options.file, rows);
|
|
259
|
+
logger.log(
|
|
260
|
+
formatSuccessLine(`Evidence kinds exported: ${rows.length} written to ${options.file}`)
|
|
261
|
+
);
|
|
262
|
+
} catch (e) {
|
|
263
|
+
logger.error(formatBlockingError(e.message));
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function setupEvidenceKindCreateCommand(cmd) {
|
|
270
|
+
cmd
|
|
271
|
+
.command('create')
|
|
272
|
+
.description('Create evidence kind (idempotent; success if it already exists)')
|
|
273
|
+
.addHelpText('after', EVIDENCE_KIND_CREATE_HELP_AFTER)
|
|
274
|
+
.option('--file <path>', 'Read evidence kind create payload from JSON file')
|
|
275
|
+
.option('--key <key>', 'Catalog key (lowercase letters, digits, underscores)')
|
|
276
|
+
.option('--display-name <name>', 'Display name')
|
|
277
|
+
.option('--domain <domain>', 'Enterprise domain key (e.g. governance, sales)')
|
|
278
|
+
.option('--purpose <text>', 'Evidence kind purpose (required)')
|
|
279
|
+
.option('--expected-use <text>', 'Expected use guidance')
|
|
280
|
+
.option('--default-severity <level>', 'low | medium | high | critical')
|
|
281
|
+
.option('--description <text>', 'Description')
|
|
282
|
+
.action(async(options) => {
|
|
283
|
+
try {
|
|
284
|
+
const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
|
|
285
|
+
const payload = buildCreatePayload(options);
|
|
286
|
+
const out = await createEvidenceKindIdempotent(controllerUrl, authConfig, payload);
|
|
287
|
+
const row = unwrapControllerData(out.response);
|
|
288
|
+
const domain = row.domainKey || payload.domainKey || '—';
|
|
289
|
+
if (out.created) {
|
|
290
|
+
logger.log(formatSuccessLine(`Evidence kind created: ${row.key} (domain: ${domain})`));
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
logger.log(formatSuccessLine(`Evidence kind exists: ${row.key} (domain: ${domain})`));
|
|
294
|
+
logger.log(infoLine('No changes were needed.'));
|
|
295
|
+
} catch (e) {
|
|
296
|
+
logger.error(formatBlockingError(e.message));
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function setupEvidenceKindGetCommand(cmd) {
|
|
303
|
+
cmd
|
|
304
|
+
.command('get <evidenceKindIdOrKey>')
|
|
305
|
+
.description('Get evidence kind by id or key')
|
|
306
|
+
.addHelpText('after', EVIDENCE_KIND_GET_HELP_AFTER)
|
|
307
|
+
.action(async(evidenceKindIdOrKey, options) => {
|
|
308
|
+
try {
|
|
309
|
+
const { environment, controllerUrl: headerControllerUrl } = await resolveHeaderContext();
|
|
310
|
+
const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
|
|
311
|
+
const res = await getEvidenceKind(controllerUrl, authConfig, String(evidenceKindIdOrKey).trim());
|
|
312
|
+
const row = unwrapControllerData(res);
|
|
313
|
+
logger.log(
|
|
314
|
+
chalk.bold(
|
|
315
|
+
`\n📎 Evidence kind in ${environment} environment (${headerControllerUrl}):\n`
|
|
316
|
+
)
|
|
317
|
+
);
|
|
318
|
+
logger.log(headerKeyValue('Key:', row.key || '—'));
|
|
319
|
+
logger.log(headerKeyValue('Display:', row.displayName || '—'));
|
|
320
|
+
logger.log(headerKeyValue('Domain:', row.domainKey || '—'));
|
|
321
|
+
logger.log(headerKeyValue('Purpose:', row.purpose || '—'));
|
|
322
|
+
logger.log(headerKeyValue('Severity:', row.defaultSeverity || '—'));
|
|
323
|
+
logger.log(headerKeyValue('Active:', row.isActive === false ? 'false' : 'true'));
|
|
324
|
+
if (row.expectedUse) logger.log(headerKeyValue('Expected use:', row.expectedUse));
|
|
325
|
+
if (row.description) logger.log(headerKeyValue('Description:', row.description));
|
|
326
|
+
logger.log('');
|
|
327
|
+
} catch (e) {
|
|
328
|
+
logger.error(formatBlockingError(e.message));
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const EVIDENCE_KIND_LIST_COLUMNS = { key: 24, display: 24, domain: 14, severity: 10, active: 8 };
|
|
335
|
+
|
|
336
|
+
function logEvidenceKindListHeader(columns) {
|
|
337
|
+
const keyCol = 'Key'.padEnd(columns.key);
|
|
338
|
+
const displayCol = 'Display'.padEnd(columns.display);
|
|
339
|
+
const domainCol = 'Domain'.padEnd(columns.domain);
|
|
340
|
+
const severityCol = 'Severity'.padEnd(columns.severity);
|
|
341
|
+
const activeCol = 'Active'.padEnd(columns.active);
|
|
342
|
+
logger.log(chalk.gray(`${keyCol}${displayCol}${domainCol}${severityCol}${activeCol}`));
|
|
343
|
+
logger.log(
|
|
344
|
+
chalk.gray(
|
|
345
|
+
'-'.repeat(
|
|
346
|
+
columns.key + columns.display + columns.domain + columns.severity + columns.active
|
|
347
|
+
)
|
|
348
|
+
)
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function logEvidenceKindListRows(items, columns) {
|
|
353
|
+
items.forEach((d) => {
|
|
354
|
+
const key = (d?.key ?? '—').toString().padEnd(columns.key);
|
|
355
|
+
const displayName = (d?.displayName ?? '—').toString().padEnd(columns.display);
|
|
356
|
+
const domain = (d?.domainKey ?? '—').toString().padEnd(columns.domain);
|
|
357
|
+
const severity = (d?.defaultSeverity ?? '—').toString().padEnd(columns.severity);
|
|
358
|
+
const active = (d?.isActive === false ? 'false' : 'true').padEnd(columns.active);
|
|
359
|
+
logger.log(`${key}${displayName}${domain}${severity}${active}`);
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function displayEvidenceKindList(items, environment, controllerUrl) {
|
|
364
|
+
logger.log(
|
|
365
|
+
chalk.bold(`\n📎 Evidence kinds in ${environment} environment (${controllerUrl}):\n`)
|
|
366
|
+
);
|
|
367
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
368
|
+
logger.log(chalk.gray(' No evidence kinds found.\n'));
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
logEvidenceKindListHeader(EVIDENCE_KIND_LIST_COLUMNS);
|
|
372
|
+
logEvidenceKindListRows(items, EVIDENCE_KIND_LIST_COLUMNS);
|
|
373
|
+
logger.log('');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function setupEvidenceKindListCommand(cmd) {
|
|
377
|
+
cmd
|
|
378
|
+
.command('list')
|
|
379
|
+
.description('List evidence kinds')
|
|
380
|
+
.addHelpText('after', EVIDENCE_KIND_LIST_HELP_AFTER)
|
|
381
|
+
.option('--page <n>', 'Page', (v) => parseInt(v, 10))
|
|
382
|
+
.option('--page-size <n>', 'Page size', (v) => parseInt(v, 10))
|
|
383
|
+
.option('--search <text>', 'Search by key/displayName/description')
|
|
384
|
+
.option('--domain-key <domain>', 'Filter by domain key')
|
|
385
|
+
.action(async(options) => {
|
|
386
|
+
try {
|
|
387
|
+
const { environment, controllerUrl: headerControllerUrl } = await resolveHeaderContext();
|
|
388
|
+
const { controllerUrl, authConfig } = await resolveControllerAndAuth(options);
|
|
389
|
+
const res = await listEvidenceKinds(controllerUrl, authConfig, {
|
|
390
|
+
page: options.page,
|
|
391
|
+
pageSize: options.pageSize,
|
|
392
|
+
search: options.search,
|
|
393
|
+
domainKey: options.domainKey
|
|
394
|
+
});
|
|
395
|
+
const payload = unwrapControllerData(res);
|
|
396
|
+
const items = payload?.data ?? payload ?? [];
|
|
397
|
+
displayEvidenceKindList(items, environment, headerControllerUrl);
|
|
398
|
+
} catch (e) {
|
|
399
|
+
logger.error(formatBlockingError(e.message));
|
|
400
|
+
process.exit(1);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* @param {import('commander').Command} program
|
|
407
|
+
*/
|
|
408
|
+
function setupEvidenceKindCommands(program) {
|
|
409
|
+
const cmd = program
|
|
410
|
+
.command('evidence-kind')
|
|
411
|
+
.description('Manage the Controller Evidence Kind Catalog')
|
|
412
|
+
.addHelpText('after', EVIDENCE_KIND_HELP_AFTER);
|
|
413
|
+
setupEvidenceKindCreateCommand(cmd);
|
|
414
|
+
setupEvidenceKindImportCommand(cmd);
|
|
415
|
+
setupEvidenceKindExportCommand(cmd);
|
|
416
|
+
setupEvidenceKindGetCommand(cmd);
|
|
417
|
+
setupEvidenceKindListCommand(cmd);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
module.exports = {
|
|
421
|
+
setupEvidenceKindCommands,
|
|
422
|
+
requireEvidenceKindKey,
|
|
423
|
+
buildCreatePayload,
|
|
424
|
+
unwrapControllerData,
|
|
425
|
+
importEvidenceKindRows,
|
|
426
|
+
mapEvidenceKindFileToApiPayload,
|
|
427
|
+
mapEvidenceKindApiToFileRow
|
|
428
|
+
};
|
|
@@ -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;
|
|
@@ -14,6 +14,7 @@ const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
|
|
|
14
14
|
const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
|
|
15
15
|
const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
|
|
16
16
|
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
17
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Commander repeatable-option collector. Splits comma-separated values so both
|
|
@@ -31,11 +32,12 @@ function collectString(value, previous) {
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
function normalizeGovernanceOptions(options, cmd) {
|
|
34
|
-
const
|
|
35
|
+
const parentCmd = cmd && cmd.parent ? cmd.parent : null;
|
|
36
|
+
const parent = parentCmd ? parentCmd.opts() : {};
|
|
35
37
|
return {
|
|
36
38
|
env: options.env || parent.env || 'dev',
|
|
37
39
|
verbose: options.verbose === true || parent.verbose === true,
|
|
38
|
-
|
|
40
|
+
noPublish: cliOptsSkipPublish(options, cmd) || cliOptsSkipPublish(parent, parentCmd),
|
|
39
41
|
force: options.force === true || parent.force === true,
|
|
40
42
|
json: options.json === true || parent.json === true,
|
|
41
43
|
pack: options.pack,
|
|
@@ -109,7 +111,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
|
|
|
109
111
|
async function governanceDownloadHandler(systemKey, options, cmd) {
|
|
110
112
|
try {
|
|
111
113
|
const opts = normalizeGovernanceOptions(options, cmd);
|
|
112
|
-
opts.
|
|
114
|
+
opts.noPublish = true;
|
|
113
115
|
const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
|
|
114
116
|
if (opts.json) {
|
|
115
117
|
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
|
}
|