@aifabrix/builder 2.45.5 → 2.47.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/cli-layout.mdc +2 -0
- package/.cursor/rules/cli-product-neutral.mdc +43 -0
- package/.cursor/rules/project-rules.mdc +1 -0
- package/.npmrc.token +1 -0
- package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
- package/.temp/validation/summary.txt +5 -0
- package/README.md +43 -17
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
- package/jest.config.default.js +2 -1
- package/jest.config.isolated.js +2 -1
- package/jest.global-live-fabrix-hooks.js +36 -0
- package/jest.isolated-projects.js +146 -0
- package/jest.projects.js +65 -136
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/dataplane-health.api.js +19 -7
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/index.js +43 -3
- package/lib/api/lifecycle.api.js +98 -0
- package/lib/api/pipeline.api.js +3 -1
- package/lib/api/records-bulk.api.js +14 -1
- package/lib/api/resource-types.api.js +107 -0
- package/lib/api/runtime-configuration.api.js +72 -0
- package/lib/api/types/resource-types.types.js +45 -0
- package/lib/api/user-groups.api.js +9 -9
- package/lib/api/users.api.js +8 -8
- package/lib/api/validation-runner.js +3 -1
- package/lib/api/wizard.api.js +10 -2
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/down.js +78 -27
- package/lib/app/index.js +2 -2
- package/lib/app/push.js +4 -5
- package/lib/app/register.js +7 -4
- package/lib/app/run-env-compose.js +84 -30
- package/lib/app/run-resolve-image.js +2 -1
- package/lib/app/run-stop-containers.js +113 -0
- package/lib/app/run.js +1 -31
- package/lib/app/show-display.js +35 -0
- package/lib/app/show.js +32 -1
- package/lib/build/index.js +22 -5
- package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/channels/add-channel.js +348 -0
- package/lib/channels/channel-artifact-generator.js +141 -0
- package/lib/channels/channel-audit.js +101 -0
- package/lib/channels/channel-auth-context.js +37 -0
- package/lib/channels/channel-credential.js +200 -0
- package/lib/channels/channel-display-name.js +64 -0
- package/lib/channels/channel-external-system.js +106 -0
- package/lib/channels/channel-integration-generator.js +274 -0
- package/lib/channels/channel-probe.js +89 -0
- package/lib/channels/channel-runtime-resolver.js +152 -0
- package/lib/channels/channel-status-display.js +141 -0
- package/lib/channels/channel-targets.js +115 -0
- package/lib/cli/index.js +20 -4
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +84 -81
- package/lib/cli/setup-app.help.js +0 -31
- package/lib/cli/setup-app.js +82 -5
- package/lib/cli/setup-app.test-commands.js +5 -57
- package/lib/cli/setup-auth.js +25 -0
- package/lib/cli/setup-certification-commands.js +147 -0
- package/lib/cli/setup-certification.help.js +141 -0
- package/lib/cli/setup-environment.js +19 -2
- package/lib/cli/setup-external-system-help.js +62 -0
- package/lib/cli/setup-external-system.js +25 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
- package/lib/cli/setup-infra-up-platform-action.js +2 -1
- package/lib/cli/setup-infra.js +9 -1
- package/lib/cli/setup-platform.js +6 -1
- package/lib/cli/setup-secrets.js +33 -1
- package/lib/cli/setup-utility-help-after.js +25 -2
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +44 -5
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +4 -239
- package/lib/commands/app-logs.js +54 -26
- package/lib/commands/app.js +41 -0
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +142 -68
- package/lib/commands/auth-status.js +43 -54
- package/lib/commands/channel.js +58 -0
- package/lib/commands/datasource-test-trust-cli.js +27 -23
- package/lib/commands/datasource-unified-test-cli.js +6 -3
- package/lib/commands/datasource-unified-test-cli.options.js +5 -1
- package/lib/commands/datasource.js +8 -8
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/governance-cli-shared.js +94 -0
- package/lib/commands/governance-command-action.js +132 -0
- package/lib/commands/governance-download-external.js +34 -0
- package/lib/commands/governance-generate-external.js +71 -0
- package/lib/commands/governance-upload-external.js +36 -0
- package/lib/commands/governance-verify-external.js +64 -0
- package/lib/commands/governance.js +144 -0
- package/lib/commands/identity-apply-sync.js +49 -8
- package/lib/commands/identity-group-cli.js +66 -26
- package/lib/commands/identity-membership-role-cache.js +58 -37
- package/lib/commands/identity-shared.js +22 -1
- package/lib/commands/identity-user-cli.js +80 -34
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +11 -2
- package/lib/commands/repair-auth-apply.js +153 -0
- package/lib/commands/repair-auth-config.js +8 -13
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-com-v2.js +15 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-service-contract.js +206 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +49 -64
- package/lib/commands/repair-env-template.js +76 -25
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +49 -4
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +160 -0
- package/lib/commands/repair-system-alignment.js +7 -4
- package/lib/commands/repair.js +29 -296
- package/lib/commands/resource-type.js +371 -0
- package/lib/commands/secrets-get.js +184 -0
- package/lib/commands/secrets-remove-all.js +3 -1
- package/lib/commands/setup-image-refresh.js +146 -0
- package/lib/commands/setup-modes.js +158 -162
- package/lib/commands/setup-platform-auth.js +76 -0
- package/lib/commands/setup-prompts-admin.js +244 -0
- package/lib/commands/setup-prompts-platform-mode.js +70 -0
- package/lib/commands/setup-prompts-validators.js +36 -0
- package/lib/commands/setup-prompts.js +24 -76
- package/lib/commands/setup-run-context.js +45 -0
- package/lib/commands/setup-spinners.js +39 -0
- package/lib/commands/setup.js +27 -5
- package/lib/commands/teardown.js +39 -0
- package/lib/commands/test-e2e-external.js +24 -8
- package/lib/commands/test-governance-external.js +3 -24
- package/lib/commands/test-trust-external.js +48 -100
- package/lib/commands/up-common.js +57 -13
- package/lib/commands/up-dataplane.js +56 -15
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +113 -110
- package/lib/commands/verify-governance-combined-external.js +61 -0
- package/lib/commands/verify-governance-command-action.js +64 -0
- package/lib/commands/verify-governance-db.js +102 -0
- package/lib/commands/verify-governance-external.js +77 -0
- package/lib/commands/verify-governance-result-builders.js +71 -0
- package/lib/commands/verify-operations-command-action.js +68 -0
- package/lib/commands/verify-operations-external.js +268 -0
- package/lib/commands/verify-operations-persist.js +75 -0
- package/lib/commands/verify-operations-step-plan.js +68 -0
- package/lib/commands/verify-operations-steps.js +111 -0
- package/lib/commands/verify-trust-command-action.js +73 -0
- package/lib/commands/verify-trust-external.js +59 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +2 -0
- package/lib/core/admin-password-generator.js +38 -0
- package/lib/core/admin-secrets-bundle.js +111 -0
- package/lib/core/admin-secrets-env-overlay.js +62 -0
- package/lib/core/admin-secrets.js +32 -4
- package/lib/core/config-attach-extensions.js +3 -0
- package/lib/core/config-platform-controller.js +44 -0
- package/lib/core/config-setup-installation-profile.js +42 -0
- package/lib/core/config-setup-platform-mode.js +46 -0
- package/lib/core/config.js +46 -36
- package/lib/core/secrets-admin-env.js +6 -2
- package/lib/core/secrets-ensure.js +4 -0
- package/lib/core/secrets-env-content.js +54 -48
- package/lib/core/secrets-env-write.js +10 -1
- package/lib/core/secrets-infra-placeholder-sync.js +2 -0
- package/lib/core/setup-installation-profile.js +43 -0
- package/lib/core/setup-platform-mode.js +90 -0
- package/lib/datasource/agent-trust-debug-log.js +1 -1
- package/lib/datasource/agent-trust-run.js +5 -3
- package/lib/datasource/audit-evidence-extract-debug.js +30 -18
- package/lib/datasource/audit-evidence-extract.js +7 -4
- package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
- package/lib/datasource/bulk-loader-run-batches.js +15 -3
- package/lib/datasource/capability/capability-diff-slice.js +2 -2
- package/lib/datasource/capability/capability-manifest.js +254 -0
- package/lib/datasource/capability/capability-resolve.js +3 -4
- package/lib/datasource/capability/copy-operations.js +5 -3
- package/lib/datasource/capability/remove-operations.js +2 -1
- package/lib/datasource/capability/run-capability-copy.js +32 -4
- package/lib/datasource/capability/run-capability-diff.js +3 -3
- package/lib/datasource/capability/run-capability-dimension.js +2 -4
- package/lib/datasource/capability/run-capability-edit.js +4 -7
- package/lib/datasource/capability/run-capability-relate.js +2 -4
- package/lib/datasource/capability/run-capability-remove.js +2 -4
- package/lib/datasource/capability/validate-capability-slice.js +2 -1
- package/lib/datasource/datasource-identifier.js +2 -1
- package/lib/datasource/datasource-load-export-context.js +3 -0
- package/lib/datasource/datasource-validate-display.js +1 -1
- package/lib/datasource/field-reference-validator.js +24 -3
- package/lib/datasource/log-cleaner.js +2 -2
- package/lib/datasource/log-viewer.js +8 -8
- package/lib/datasource/orphan-profiles-validator.js +98 -0
- package/lib/datasource/test-e2e.js +4 -1
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run.js +5 -2
- package/lib/datasource/validate.js +41 -23
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download-helpers.js +87 -0
- package/lib/external-system/download.js +78 -138
- package/lib/external-system/generator.js +1 -55
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test.js +16 -21
- package/lib/generator/builders.js +11 -1
- package/lib/generator/external-controller-manifest.js +18 -0
- package/lib/generator/split.js +3 -1
- package/lib/generator/wizard.js +1 -28
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-run-display.js +215 -25
- package/lib/identity/fk-reference.js +65 -0
- package/lib/identity/identity-apply-core.js +13 -58
- package/lib/identity/identity-apply-phases.js +5 -1
- package/lib/identity/identity-display.js +243 -0
- package/lib/identity/identity-response-helpers.js +52 -0
- package/lib/identity/identity-sync-errors.js +62 -0
- package/lib/identity/resolve-user-id.js +129 -0
- package/lib/identity/username-default.js +31 -0
- package/lib/infrastructure/admin-secrets-apply.js +84 -0
- package/lib/infrastructure/admin-secrets-ensure.js +130 -0
- package/lib/infrastructure/admin-secrets-resolve.js +95 -0
- package/lib/infrastructure/admin-secrets-sync.js +91 -0
- package/lib/infrastructure/helpers.js +23 -129
- package/lib/infrastructure/index.js +5 -6
- package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
- package/lib/lifecycle/certification-progress.js +231 -0
- package/lib/lifecycle/dataplane-ui-url.js +145 -0
- package/lib/lifecycle/exit-codes.js +24 -0
- package/lib/lifecycle/json-envelope.js +25 -0
- package/lib/lifecycle/lifecycle-governance-options.js +51 -0
- package/lib/lifecycle/logger-quiet.js +29 -0
- package/lib/lifecycle/open-api-published.js +59 -0
- package/lib/lifecycle/operations-readiness-metrics.js +101 -0
- package/lib/lifecycle/product-model.js +196 -0
- package/lib/lifecycle/report-display-trust.js +70 -0
- package/lib/lifecycle/report-display.js +472 -0
- package/lib/lifecycle/scenario-upload.js +191 -0
- package/lib/lifecycle/verify-step-progress.js +87 -0
- package/lib/parameters/infra-kv-discovery.js +27 -2
- package/lib/protection/auth-context.js +10 -4
- package/lib/resolvers/datasource-resolver.js +2 -3
- package/lib/resolvers/resource-type-file.js +159 -0
- package/lib/schema/application-schema.json +17 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/deployment-rules.yaml +2 -1
- package/lib/schema/external-datasource.schema.json +2947 -2619
- package/lib/schema/external-system.schema.json +1418 -761
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/type/credential-field-registry.json +103 -97
- package/lib/schema/type/document-storage.json +9 -5
- package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
- package/lib/utils/api.js +55 -31
- package/lib/utils/app-relative-path-env.js +112 -0
- package/lib/utils/app-run-containers.js +25 -2
- package/lib/utils/authentication-shape.js +224 -0
- package/lib/utils/build-copy.js +36 -5
- package/lib/utils/build-resolve-image.js +66 -12
- package/lib/utils/celery-companion-apps.js +53 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-utils.js +20 -4
- package/lib/utils/compose-celery-worker.js +23 -0
- package/lib/utils/compose-generate-docker-compose.js +13 -1
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/configuration-env-resolver.js +36 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-secrets-env-kv.js +216 -0
- package/lib/utils/credential-secrets-env.js +175 -257
- package/lib/utils/dataplane-resolver.js +18 -2
- package/lib/utils/declarative-url-ports.js +27 -4
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- package/lib/utils/docker-build.js +1 -4
- package/lib/utils/env-copy.js +14 -9
- package/lib/utils/env-kv-orphan-lines.js +43 -0
- package/lib/utils/error-formatters/network-errors.js +13 -4
- package/lib/utils/external-env-template.js +11 -3
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/external-system-validators.js +8 -2
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +13 -8
- package/lib/utils/keycloak-realm-ready.js +101 -0
- package/lib/utils/load-cip-capacity-display-config.js +61 -15
- package/lib/utils/manifest-source-emit.js +2 -0
- package/lib/utils/paths.js +25 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +157 -0
- package/lib/utils/platform-kv-ref.js +57 -0
- package/lib/utils/postgres-platform-bootstrap.js +199 -0
- package/lib/utils/postgres-wipe.js +9 -2
- package/lib/utils/resolve-env-mode.js +47 -0
- package/lib/utils/runtime-configuration-download.js +189 -0
- package/lib/utils/runtime-configuration-values.js +119 -0
- package/lib/utils/schema-loader.js +19 -4
- package/lib/utils/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/service-url-label.js +81 -0
- package/lib/utils/setup-quiet-output.js +25 -0
- package/lib/utils/template-helpers.js +15 -0
- package/lib/utils/token-manager-client-credentials.js +201 -0
- package/lib/utils/token-manager-messages.js +8 -0
- package/lib/utils/token-manager-refresh.js +12 -2
- package/lib/utils/token-manager.js +86 -105
- package/lib/utils/upload-pipeline-ui.js +12 -5
- package/lib/utils/upload-sync-options.js +42 -0
- package/lib/utils/url-declarative-public-base.js +21 -3
- package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
- package/lib/utils/validation-poll-ui.js +8 -0
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/utils/worker-sidecars.js +142 -0
- package/lib/validation/external-manifest-validator.js +2 -0
- package/lib/validation/runtime-configuration-rules.js +98 -0
- package/lib/validation/validate-display-dimensions.js +154 -0
- package/lib/validation/validate-display-sections.js +276 -0
- package/lib/validation/validate-display-steps.js +67 -0
- package/lib/validation/validate-display.js +24 -402
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +7 -1
- package/templates/applications/dataplane/env.template +50 -14
- package/templates/applications/dataplane/rbac.yaml +108 -1
- package/templates/applications/miso-controller/application.yaml +2 -2
- package/templates/applications/miso-controller/env.template +53 -122
- package/templates/applications/miso-controller/rbac.yaml +28 -13
- package/templates/channels/chatgpt/install.template.md.hbs +49 -0
- package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
- package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
- package/templates/channels/slack/install.template.md.hbs +49 -0
- package/templates/channels/slack/manifest.template.json.hbs +66 -0
- package/templates/channels/teams-bot/install.template.md.hbs +49 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
- package/templates/channels/web-embed/install.template.md.hbs +49 -0
- package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
- package/templates/external-system/README.md.hbs +74 -17
- package/templates/python/docker-compose.hbs +75 -18
- package/templates/typescript/docker-compose.hbs +70 -17
- package/lib/commands/test-governance-command-action.js +0 -55
- package/lib/commands/test-trust-command-action.js +0 -118
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Active progress (ora spinner or single ⏳ line) for verify-* orchestration steps.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Verify step progress UI
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const logger = require('../utils/logger');
|
|
13
|
+
const { formatProgress } = require('../utils/cli-test-layout-chalk');
|
|
14
|
+
const { withQuietLogs } = require('./logger-quiet');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} [options]
|
|
18
|
+
* @returns {boolean}
|
|
19
|
+
*/
|
|
20
|
+
function shouldShowVerifyStepProgress(options = {}) {
|
|
21
|
+
return options.json !== true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {Object} [options]
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
function shouldUseVerifyStepSpinner(options = {}) {
|
|
29
|
+
if (!shouldShowVerifyStepProgress(options)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return Boolean(process && process.stdout && process.stdout.isTTY);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} label
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
39
|
+
function formatVerifyStepLabel(label) {
|
|
40
|
+
const text = label && String(label).trim() ? String(label).trim() : 'Processing';
|
|
41
|
+
return text.endsWith('…') ? text : `${text}…`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Run a verify step with one active progress indicator (spinner on TTY).
|
|
46
|
+
*
|
|
47
|
+
* @template T
|
|
48
|
+
* @async
|
|
49
|
+
* @param {string} label - Plain label without trailing ellipsis
|
|
50
|
+
* @param {(progress: { setLabel: (next: string) => void }) => Promise<T>} work
|
|
51
|
+
* @param {Object} [options]
|
|
52
|
+
* @param {boolean} [options.json]
|
|
53
|
+
* @returns {Promise<T>}
|
|
54
|
+
*/
|
|
55
|
+
async function runWithVerifyStepProgress(label, work, options = {}) {
|
|
56
|
+
if (!shouldShowVerifyStepProgress(options)) {
|
|
57
|
+
return withQuietLogs(() => work({ setLabel: () => {} }));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!shouldUseVerifyStepSpinner(options)) {
|
|
61
|
+
logger.log(formatProgress(formatVerifyStepLabel(label)));
|
|
62
|
+
return withQuietLogs(() => work({ setLabel: () => {} }));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const ora = require('ora');
|
|
66
|
+
const spinner = ora({
|
|
67
|
+
text: chalk.white(formatVerifyStepLabel(label)),
|
|
68
|
+
spinner: 'dots'
|
|
69
|
+
}).start();
|
|
70
|
+
|
|
71
|
+
const setLabel = (next) => {
|
|
72
|
+
spinner.text = chalk.white(formatVerifyStepLabel(next));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
return await withQuietLogs(() => work({ setLabel }));
|
|
77
|
+
} finally {
|
|
78
|
+
spinner.stop();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports = {
|
|
83
|
+
shouldShowVerifyStepProgress,
|
|
84
|
+
shouldUseVerifyStepSpinner,
|
|
85
|
+
formatVerifyStepLabel,
|
|
86
|
+
runWithVerifyStepProgress
|
|
87
|
+
};
|
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
const fsRealSync = require('../internal/fs-real-sync');
|
|
8
8
|
const path = require('path');
|
|
9
|
-
const { loadRequiresDatabasesArray } = require('./database-secret-values');
|
|
9
|
+
const { loadRequiresDatabasesArray, loadShippedRequiresDatabases } = require('./database-secret-values');
|
|
10
|
+
|
|
11
|
+
/** Platform apps from shipped templates (setup/up-infra before builder/ is copied). */
|
|
12
|
+
const SHIPPED_PLATFORM_APP_KEYS = ['keycloak', 'miso-controller', 'dataplane'];
|
|
10
13
|
|
|
11
14
|
/**
|
|
12
15
|
* Extract kv:// secret key names from env template content (active lines only).
|
|
@@ -90,6 +93,25 @@ function deriveDatabaseKvKeysFromWorkspace(pathsUtil) {
|
|
|
90
93
|
return [...keys];
|
|
91
94
|
}
|
|
92
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Database kv keys from shipped platform templates when builder/ apps are not copied yet
|
|
98
|
+
* (e.g. `aifabrix setup` fresh install before `up-platform`).
|
|
99
|
+
*
|
|
100
|
+
* @returns {string[]}
|
|
101
|
+
*/
|
|
102
|
+
function deriveDatabaseKvKeysFromShippedPlatformTemplates() {
|
|
103
|
+
const keys = new Set();
|
|
104
|
+
for (const appKey of SHIPPED_PLATFORM_APP_KEYS) {
|
|
105
|
+
const dbs = loadShippedRequiresDatabases(appKey);
|
|
106
|
+
if (!Array.isArray(dbs) || dbs.length === 0) continue;
|
|
107
|
+
for (let i = 0; i < dbs.length; i++) {
|
|
108
|
+
keys.add(`databases-${appKey}-${i}-urlKeyVault`);
|
|
109
|
+
keys.add(`databases-${appKey}-${i}-passwordKeyVault`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [...keys];
|
|
113
|
+
}
|
|
114
|
+
|
|
93
115
|
/**
|
|
94
116
|
* Keys from env.template files whose catalog entry includes the given hook (e.g. upInfra).
|
|
95
117
|
* @param {object} pathsUtil - paths module
|
|
@@ -132,6 +154,7 @@ function getAllInfraEnsureKeys(catalog, pathsUtil) {
|
|
|
132
154
|
const set = new Set();
|
|
133
155
|
for (const k of catalog.getStandardUpInfraBootstrapKeys()) set.add(k);
|
|
134
156
|
for (const k of deriveDatabaseKvKeysFromWorkspace(pathsUtil)) set.add(k);
|
|
157
|
+
for (const k of deriveDatabaseKvKeysFromShippedPlatformTemplates()) set.add(k);
|
|
135
158
|
for (const k of discoverKvKeysFromEnvTemplatesForHook(pathsUtil, 'upInfra', catalog)) set.add(k);
|
|
136
159
|
return [...set].sort();
|
|
137
160
|
}
|
|
@@ -139,8 +162,10 @@ function getAllInfraEnsureKeys(catalog, pathsUtil) {
|
|
|
139
162
|
module.exports = {
|
|
140
163
|
extractKvKeysFromEnvContent,
|
|
141
164
|
deriveDatabaseKvKeysFromWorkspace,
|
|
165
|
+
deriveDatabaseKvKeysFromShippedPlatformTemplates,
|
|
142
166
|
discoverKvKeysFromEnvTemplatesForHook,
|
|
143
167
|
getAllInfraEnsureKeys,
|
|
144
168
|
listAppDirsForDiscovery,
|
|
145
|
-
listBuilderAppDirsForDiscovery
|
|
169
|
+
listBuilderAppDirsForDiscovery,
|
|
170
|
+
SHIPPED_PLATFORM_APP_KEYS
|
|
146
171
|
};
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
10
10
|
const { resolveEnvironment } = require('../core/config');
|
|
11
11
|
const { getDeviceOnlyAuth, getDeploymentAuth } = require('../utils/token-manager');
|
|
12
|
+
const { getDeploymentAuthMode } = require('../utils/deployment-auth-mode');
|
|
12
13
|
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -23,11 +24,16 @@ async function resolveProtectionDataplaneContext(options = {}) {
|
|
|
23
24
|
throw new Error('Controller URL is required. Run "aifabrix login" first.');
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
const authMode = getDeploymentAuthMode(options);
|
|
26
28
|
let authConfig;
|
|
27
|
-
|
|
28
|
-
authConfig = await
|
|
29
|
-
}
|
|
30
|
-
|
|
29
|
+
if (authMode === 'client-credentials') {
|
|
30
|
+
authConfig = await getDeploymentAuth(controllerUrl, environment, 'dataplane', options);
|
|
31
|
+
} else {
|
|
32
|
+
try {
|
|
33
|
+
authConfig = await getDeviceOnlyAuth(controllerUrl);
|
|
34
|
+
} catch {
|
|
35
|
+
authConfig = await getDeploymentAuth(controllerUrl, environment, 'dataplane', options);
|
|
36
|
+
}
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
if (!authConfig?.token) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
const
|
|
13
|
+
const { loadConfigFile } = require('../utils/config-format');
|
|
14
14
|
const { resolveValidateInputPath, resolvePathFromIntegrationDatasourceKey } = require('../datasource/validate');
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -41,8 +41,7 @@ function tryResolveDatasourceKeyToLocalPath(datasourceKey) {
|
|
|
41
41
|
* @returns {any}
|
|
42
42
|
*/
|
|
43
43
|
function readJsonFile(jsonPath) {
|
|
44
|
-
|
|
45
|
-
return JSON.parse(raw);
|
|
44
|
+
return loadConfigFile(jsonPath);
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
module.exports = {
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource type file helpers for `aifabrix resource-type create --file`.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Resource type file parsing
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const { existsSync, readFileSync } = require('../internal/fs-real-sync');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {Object} ResourceTypeCreateInput
|
|
16
|
+
* @property {string} key
|
|
17
|
+
* @property {string} displayName
|
|
18
|
+
* @property {string} [description]
|
|
19
|
+
* @property {string} [category]
|
|
20
|
+
* @property {string} [defaultRiskLevel]
|
|
21
|
+
* @property {string} [status]
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const CATEGORIES = new Set([
|
|
25
|
+
'business',
|
|
26
|
+
'collaboration',
|
|
27
|
+
'governance',
|
|
28
|
+
'content',
|
|
29
|
+
'communication',
|
|
30
|
+
'people'
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
const RISK_LEVELS = new Set(['low', 'medium', 'high', 'critical']);
|
|
34
|
+
const STATUSES = new Set(['draft', 'active', 'deprecated', 'retired']);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @param {string} filePath
|
|
38
|
+
* @returns {object}
|
|
39
|
+
*/
|
|
40
|
+
function loadResourceTypeJsonObject(filePath) {
|
|
41
|
+
const p = path.resolve(String(filePath || '').trim());
|
|
42
|
+
if (!p) {
|
|
43
|
+
throw new Error('--file is required');
|
|
44
|
+
}
|
|
45
|
+
if (!existsSync(p)) {
|
|
46
|
+
throw new Error(`File not found: ${p}`);
|
|
47
|
+
}
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(readFileSync(p, 'utf8'));
|
|
51
|
+
} catch (e) {
|
|
52
|
+
throw new Error(`Invalid JSON in ${p}: ${e.message}`);
|
|
53
|
+
}
|
|
54
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
55
|
+
throw new Error(`Resource type file must be a JSON object: ${p}`);
|
|
56
|
+
}
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @param {object} parsed
|
|
62
|
+
* @param {string} field
|
|
63
|
+
* @param {Set<string>} allowedValues
|
|
64
|
+
* @param {string} label
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
function applyOptionalEnumField(parsed, field, allowedValues, label) {
|
|
68
|
+
if (parsed[field] === undefined) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const value = String(parsed[field]).trim();
|
|
72
|
+
if (!allowedValues.has(value)) {
|
|
73
|
+
throw new Error(`${label} must be one of: ${[...allowedValues].join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
parsed[field] = value;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @param {object} parsed
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
function rejectBaselineCatalogShape(parsed) {
|
|
83
|
+
if (parsed && typeof parsed === 'object' && Array.isArray(parsed.resourceTypes) && !parsed.key) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
'File is a baseline catalog (resourceTypes[]). ' +
|
|
86
|
+
'Use `aifabrix resource-type import --file <path>` to seed all entries, ' +
|
|
87
|
+
'or pass a single resource type object with key and displayName.'
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @param {object} row
|
|
94
|
+
* @param {number} index
|
|
95
|
+
* @returns {ResourceTypeCreateInput}
|
|
96
|
+
*/
|
|
97
|
+
function normalizeResourceTypeCreateRow(row, index) {
|
|
98
|
+
if (!row || typeof row !== 'object') {
|
|
99
|
+
throw new Error(`resourceTypes[${index}] must be a JSON object`);
|
|
100
|
+
}
|
|
101
|
+
const entry = { ...row };
|
|
102
|
+
applyOptionalEnumField(entry, 'category', CATEGORIES, 'category');
|
|
103
|
+
applyOptionalEnumField(entry, 'defaultRiskLevel', RISK_LEVELS, 'defaultRiskLevel');
|
|
104
|
+
applyOptionalEnumField(entry, 'status', STATUSES, 'status');
|
|
105
|
+
const key = String(entry.key || '').trim();
|
|
106
|
+
if (!key) {
|
|
107
|
+
throw new Error(`resourceTypes[${index}].key is required`);
|
|
108
|
+
}
|
|
109
|
+
const displayName = String(entry.displayName || '').trim();
|
|
110
|
+
if (!displayName) {
|
|
111
|
+
throw new Error(`resourceTypes[${index}].displayName is required`);
|
|
112
|
+
}
|
|
113
|
+
entry.key = key;
|
|
114
|
+
entry.displayName = displayName;
|
|
115
|
+
return entry;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @param {string} filePath
|
|
120
|
+
* @returns {ResourceTypeCreateInput}
|
|
121
|
+
*/
|
|
122
|
+
function readResourceTypeCreateFile(filePath) {
|
|
123
|
+
const parsed = loadResourceTypeJsonObject(filePath);
|
|
124
|
+
rejectBaselineCatalogShape(parsed);
|
|
125
|
+
return normalizeResourceTypeCreateRow(parsed, 0);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Read baseline catalog or array file for `resource-type import`.
|
|
130
|
+
* Accepts `baseline-resourcetypes.json` shape or a top-level JSON array.
|
|
131
|
+
*
|
|
132
|
+
* @param {string} filePath
|
|
133
|
+
* @returns {ResourceTypeCreateInput[]}
|
|
134
|
+
*/
|
|
135
|
+
function readResourceTypeCatalogFile(filePath) {
|
|
136
|
+
const parsed = loadResourceTypeJsonObject(filePath);
|
|
137
|
+
let rows;
|
|
138
|
+
if (Array.isArray(parsed)) {
|
|
139
|
+
rows = parsed;
|
|
140
|
+
} else if (Array.isArray(parsed.resourceTypes)) {
|
|
141
|
+
rows = parsed.resourceTypes;
|
|
142
|
+
} else {
|
|
143
|
+
throw new Error(
|
|
144
|
+
'Import file must be a baseline catalog with resourceTypes[] or a JSON array of resource types.'
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (rows.length === 0) {
|
|
148
|
+
throw new Error('Import file contains no resource types');
|
|
149
|
+
}
|
|
150
|
+
return rows.map((row, index) => normalizeResourceTypeCreateRow(row, index));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
module.exports = {
|
|
154
|
+
readResourceTypeCreateFile,
|
|
155
|
+
readResourceTypeCatalogFile,
|
|
156
|
+
CATEGORIES,
|
|
157
|
+
RISK_LEVELS,
|
|
158
|
+
STATUSES
|
|
159
|
+
};
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"version": "1.4.0",
|
|
35
35
|
"date": "2026-04-06T00:00:00Z",
|
|
36
36
|
"changes": [
|
|
37
|
-
"Removed build.localPort: local workstation PORT and localhost URL rewriting use the root-level manifest port only, with
|
|
37
|
+
"Removed build.localPort: local workstation PORT and localhost URL rewriting use the root-level manifest port only, with host port = port + developerId*100 (developer id 0 → port). Same formula for Docker publish and aifabrix run.",
|
|
38
38
|
"Migration: delete build.localPort from application.yaml; set or keep port as the single listen/container port. Use url://public, url://internal, or url://<app>-public|internal in env.template for declarative URLs (resolved after kv://)."
|
|
39
39
|
],
|
|
40
40
|
"breaking": true
|
|
@@ -801,6 +801,22 @@
|
|
|
801
801
|
"type": "string",
|
|
802
802
|
"description": "When running with --reload, override the container command with this command (run from the mounted app root /app). Examples: TypeScript pnpm run reloadStart, Python make reloadStart."
|
|
803
803
|
},
|
|
804
|
+
"imageRun": {
|
|
805
|
+
"type": "string",
|
|
806
|
+
"description": "Compose command when using a pulled image without bind-mount (prepended with cd /app && exec in generated compose)."
|
|
807
|
+
},
|
|
808
|
+
"worker": {
|
|
809
|
+
"type": "boolean",
|
|
810
|
+
"description": "When true, local compose and Azure companion manifests may start additional containers from the same image. Non-empty build.imageRunWorker starts <appKey>-worker; non-empty build.imageRunBeat starts <appKey>-beat. Empty imageRunWorker or imageRunBeat skips that role."
|
|
811
|
+
},
|
|
812
|
+
"imageRunWorker": {
|
|
813
|
+
"type": "string",
|
|
814
|
+
"description": "Compose/Azure startup command for the worker sidecar (<appKey>-worker) when build.worker is true. Omit or set to empty string to skip the worker role."
|
|
815
|
+
},
|
|
816
|
+
"imageRunBeat": {
|
|
817
|
+
"type": "string",
|
|
818
|
+
"description": "Compose/Azure startup command for the beat sidecar (<appKey>-beat) when build.worker is true. Omit or set to empty string to skip the beat role."
|
|
819
|
+
},
|
|
804
820
|
"scripts": {
|
|
805
821
|
"type": "object",
|
|
806
822
|
"description": "Override CLI script commands (aifabrix test, install, lint, test-e2e, test-integration). When a key is missing, language default is used (TypeScript: pnpm test/install/lint/test:e2e/test:integration, Python: make test/install/lint/test:e2e/test-integration).",
|
|
@@ -2,20 +2,25 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "aifabrix://schema/datasource-test-run.schema.json",
|
|
4
4
|
"title": "DatasourceTestRun",
|
|
5
|
-
"description": "Canonical datasource-root test report (plans 362/365). Public success shape for POST /api/v1/validation/run (and async poll GET /validation/run/{testRunId}). runType=test|integration|e2e;
|
|
5
|
+
"description": "Canonical datasource-root test report (plans 362/365, 370.06, 370.07 stage). Public success shape for POST /api/v1/validation/run (and async poll GET /validation/run/{testRunId}). runType=test|integration|e2e; stage=readiness|simulation|integration|e2e. reportVersion 1.5.0 adds required stage (minor bump). Older clients must tolerate absent stage when reportVersion < 1.5.0.",
|
|
6
6
|
"type": "object",
|
|
7
|
-
"required": ["reportVersion", "datasourceKey", "systemKey", "runType", "status"],
|
|
7
|
+
"required": ["reportVersion", "datasourceKey", "systemKey", "runType", "stage", "status"],
|
|
8
8
|
"properties": {
|
|
9
9
|
"reportVersion": {
|
|
10
10
|
"type": "string",
|
|
11
11
|
"description": "Semver-style contract version for this envelope. Policy: additive fields => minor bump within same major; removed/renamed fields => major bump. Route migrations must cite target reportVersion.",
|
|
12
|
-
"example": "1.
|
|
12
|
+
"example": "1.5.0"
|
|
13
13
|
},
|
|
14
14
|
"runType": {
|
|
15
15
|
"type": "string",
|
|
16
|
-
"description": "
|
|
16
|
+
"description": "Legacy kind of run. Maps to CLI: test, test-integration, test-e2e. Prefer stage for new clients.",
|
|
17
17
|
"enum": ["test", "integration", "e2e"]
|
|
18
18
|
},
|
|
19
|
+
"stage": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Contract validation stage aligned with contracts/rules stage and concept appliesTo.",
|
|
22
|
+
"enum": ["readiness", "simulation", "integration", "e2e"]
|
|
23
|
+
},
|
|
19
24
|
"status": {
|
|
20
25
|
"type": "string",
|
|
21
26
|
"description": "Root rollup across validation, integration, certificate, and capabilities for this datasource run: ok | warn | fail | skipped.",
|
|
@@ -252,7 +257,7 @@
|
|
|
252
257
|
"level": {
|
|
253
258
|
"type": "string",
|
|
254
259
|
"description": "Achieved certification tier when applicable.",
|
|
255
|
-
"enum": ["bronze", "silver", "gold"]
|
|
260
|
+
"enum": ["bronze", "silver", "gold", "platinum"]
|
|
256
261
|
},
|
|
257
262
|
"summary": {
|
|
258
263
|
"type": "string",
|
|
@@ -388,6 +393,61 @@
|
|
|
388
393
|
}
|
|
389
394
|
}
|
|
390
395
|
},
|
|
396
|
+
"FixInstruction": {
|
|
397
|
+
"type": "object",
|
|
398
|
+
"additionalProperties": false,
|
|
399
|
+
"required": ["step"],
|
|
400
|
+
"description": "One deterministic repair step (370.03 fixInstruction vocabulary).",
|
|
401
|
+
"properties": {
|
|
402
|
+
"step": {
|
|
403
|
+
"type": "string",
|
|
404
|
+
"enum": [
|
|
405
|
+
"locate_file",
|
|
406
|
+
"update_path",
|
|
407
|
+
"add_mapping",
|
|
408
|
+
"set_value",
|
|
409
|
+
"remove_value",
|
|
410
|
+
"add_item",
|
|
411
|
+
"remove_item",
|
|
412
|
+
"explain"
|
|
413
|
+
]
|
|
414
|
+
},
|
|
415
|
+
"value": {
|
|
416
|
+
"type": "string",
|
|
417
|
+
"description": "Brace tokens only in authored YAML: {datasource}, {systemKey}, {field}, {raw.*}."
|
|
418
|
+
},
|
|
419
|
+
"path": { "type": "string" },
|
|
420
|
+
"template": { "type": "string" },
|
|
421
|
+
"note": { "type": "string" }
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"IssueFix": {
|
|
425
|
+
"type": "object",
|
|
426
|
+
"additionalProperties": false,
|
|
427
|
+
"required": ["type", "instructions"],
|
|
428
|
+
"description": "Structured remediation on Issue (370.06; aligned with rule YAML fix).",
|
|
429
|
+
"properties": {
|
|
430
|
+
"type": {
|
|
431
|
+
"type": "string",
|
|
432
|
+
"enum": [
|
|
433
|
+
"add_mapping",
|
|
434
|
+
"edit_schema",
|
|
435
|
+
"edit_exposure",
|
|
436
|
+
"edit_governance",
|
|
437
|
+
"edit_execution",
|
|
438
|
+
"generic"
|
|
439
|
+
]
|
|
440
|
+
},
|
|
441
|
+
"instructions": {
|
|
442
|
+
"type": "array",
|
|
443
|
+
"minItems": 1,
|
|
444
|
+
"items": { "$ref": "#/$defs/FixInstruction" }
|
|
445
|
+
},
|
|
446
|
+
"example": {
|
|
447
|
+
"description": "Optional structured or scalar example for authors/tooling."
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
},
|
|
391
451
|
"Issue": {
|
|
392
452
|
"type": "object",
|
|
393
453
|
"required": ["message"],
|
|
@@ -395,7 +455,7 @@
|
|
|
395
455
|
"properties": {
|
|
396
456
|
"code": {
|
|
397
457
|
"type": "string",
|
|
398
|
-
"description": "Stable code: DP-VAL-* (structural/config), DP-CIP-* (execution/CIP), DP-SEC-* (auth/RBAC/exposure), DP-CONN-* (REST/MCP/connectivity), DP-E2E-* (end-to-end live); warnings DP-*-Wnn.
|
|
458
|
+
"description": "Stable code: DP-VAL-* (structural/config), DP-CIP-* (execution/CIP), DP-SEC-* (auth/RBAC/exposure), DP-CONN-* (REST/MCP/connectivity), DP-E2E-* (end-to-end live); warnings DP-*-Wnn. Prefer stableCode when present; otherwise mapped from engine errorCode.",
|
|
399
459
|
"example": "DP-CIP-010"
|
|
400
460
|
},
|
|
401
461
|
"message": {
|
|
@@ -410,6 +470,29 @@
|
|
|
410
470
|
"hint": {
|
|
411
471
|
"type": "string",
|
|
412
472
|
"description": "Remediation or next-step hint."
|
|
473
|
+
},
|
|
474
|
+
"conceptId": {
|
|
475
|
+
"type": "string",
|
|
476
|
+
"description": "Concept catalog id (370.02) for concept-first organization."
|
|
477
|
+
},
|
|
478
|
+
"ruleId": {
|
|
479
|
+
"type": "string",
|
|
480
|
+
"description": "YAML rule id when the finding came from the contract rule set.",
|
|
481
|
+
"example": "VAL-PIL-001"
|
|
482
|
+
},
|
|
483
|
+
"stableCode": {
|
|
484
|
+
"type": "string",
|
|
485
|
+
"description": "Frozen DP-* stable code from rule YAML.",
|
|
486
|
+
"example": "DP-VAL-097"
|
|
487
|
+
},
|
|
488
|
+
"ruleRefs": {
|
|
489
|
+
"type": "array",
|
|
490
|
+
"items": { "type": "string" },
|
|
491
|
+
"description": "Legacy or supplemental rule references; prefer ruleId + stableCode for YAML rules."
|
|
492
|
+
},
|
|
493
|
+
"fix": {
|
|
494
|
+
"$ref": "#/$defs/IssueFix",
|
|
495
|
+
"description": "Structured fix instructions when the emitting rule supplies them."
|
|
413
496
|
}
|
|
414
497
|
}
|
|
415
498
|
},
|