@aifabrix/builder 2.45.0 → 2.46.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/docs-rules.mdc +3 -1
- package/.cursor/rules/project-rules.mdc +1 -0
- package/README.md +43 -17
- package/integration/hubspot-test/wizard-hubspot-e2e.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 +130 -0
- package/jest.projects.js +69 -121
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +88 -5
- package/lib/api/lifecycle.api.js +77 -0
- package/lib/api/pipeline.api.js +7 -5
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +43 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +5 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/deploy.js +34 -19
- package/lib/app/down.js +20 -1
- 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/build/index.js +5 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/cli/index.js +8 -2
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +91 -69
- package/lib/cli/setup-app.help.js +19 -2
- package/lib/cli/setup-app.js +58 -23
- package/lib/cli/setup-app.test-commands.js +28 -21
- package/lib/cli/setup-auth.js +55 -3
- 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 +62 -6
- 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 +65 -0
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +42 -6
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +41 -258
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +269 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +111 -53
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +118 -0
- package/lib/commands/datasource-unified-test-cli.js +31 -20
- package/lib/commands/datasource-unified-test-cli.options.js +22 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- 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 +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +56 -17
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair-auth-apply.js +127 -0
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +1 -51
- package/lib/commands/repair-env-template.js +64 -13
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +23 -0
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +145 -0
- package/lib/commands/repair.js +29 -286
- 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 +67 -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 +61 -14
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-external.js +67 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-external.js +126 -0
- package/lib/commands/up-common.js +25 -13
- package/lib/commands/up-dataplane.js +50 -13
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +108 -105
- 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 +70 -0
- package/lib/commands/verify-trust-external.js +67 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +5 -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-device-dataplane.js +185 -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 +55 -0
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +95 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +115 -0
- package/lib/datasource/audit-evidence-extract.js +180 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +100 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +95 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +29 -2
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +47 -18
- package/lib/datasource/validate.js +37 -20
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download.js +21 -20
- package/lib/external-system/generator.js +5 -1
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +9 -7
- package/lib/generator/external-controller-manifest.js +15 -0
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +309 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -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/internal/fs-real-sync.js +29 -1
- 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.js +471 -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 +51 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +1 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/external-datasource.schema.json +2636 -2588
- package/lib/schema/external-system.schema.json +1089 -761
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +642 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- 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/cli-exit-codes.js +30 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/cli-utils.js +16 -4
- package/lib/utils/compose-generate-docker-compose.js +4 -0
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/credential-secrets-env.js +137 -9
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/dataplane-resolver.js +129 -2
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/declarative-url-ports.js +3 -3
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- 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 +1 -0
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +35 -26
- 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 +24 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +156 -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/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/semver-compare.js +127 -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 +98 -0
- 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 +22 -7
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +2 -1
- package/templates/applications/dataplane/env.template +36 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/env.template +16 -0
- package/templates/external-system/README.md.hbs +116 -11
- package/templates/python/docker-compose.hbs +19 -18
- package/templates/typescript/docker-compose.hbs +18 -17
|
@@ -164,36 +164,73 @@ function validateWizardConfigSchema(config) {
|
|
|
164
164
|
};
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Candidate bases for relative openapi-file paths (first existing wins).
|
|
169
|
+
* @param {string} configPath - Path to wizard.yaml
|
|
170
|
+
* @returns {string[]}
|
|
171
|
+
*/
|
|
172
|
+
function wizardOpenApiFilePathCandidates(filePath, configPath) {
|
|
173
|
+
const raw = String(filePath || '').trim();
|
|
174
|
+
if (!raw) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
if (path.isAbsolute(raw)) {
|
|
178
|
+
return [path.resolve(raw)];
|
|
179
|
+
}
|
|
180
|
+
const configDir = path.dirname(path.resolve(configPath));
|
|
181
|
+
return [...new Set([
|
|
182
|
+
path.resolve(process.cwd(), raw),
|
|
183
|
+
path.resolve(configDir, raw)
|
|
184
|
+
])];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Resolve openapi-file path for wizard config (absolute path).
|
|
189
|
+
* Relative paths: process.cwd() first, then wizard.yaml directory.
|
|
190
|
+
* @param {string} filePath
|
|
191
|
+
* @param {string} configPath
|
|
192
|
+
* @returns {Promise<string>}
|
|
193
|
+
*/
|
|
194
|
+
async function resolveWizardOpenApiFilePath(filePath, configPath) {
|
|
195
|
+
const candidates = wizardOpenApiFilePathCandidates(filePath, configPath);
|
|
196
|
+
if (candidates.length === 0) {
|
|
197
|
+
return '';
|
|
198
|
+
}
|
|
199
|
+
for (const candidate of candidates) {
|
|
200
|
+
try {
|
|
201
|
+
await fs.access(candidate);
|
|
202
|
+
return candidate;
|
|
203
|
+
} catch (error) {
|
|
204
|
+
if (error.code !== 'ENOENT') {
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return candidates[0];
|
|
210
|
+
}
|
|
211
|
+
|
|
167
212
|
/**
|
|
168
213
|
* Validate file path exists (for openapi-file source type)
|
|
169
214
|
* @function validateFilePath
|
|
170
215
|
* @param {string} filePath - Path to validate
|
|
171
|
-
* @param {string}
|
|
172
|
-
* @returns {Promise<Object>} Validation result with valid flag and
|
|
216
|
+
* @param {string} configPath - Path to wizard.yaml (relative paths resolve from cwd, then config dir)
|
|
217
|
+
* @returns {Promise<Object>} Validation result with valid flag, errors, and resolvedPath
|
|
173
218
|
*/
|
|
174
|
-
async function validateFilePath(filePath,
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
: path.resolve(baseDir, filePath);
|
|
179
|
-
if (!path.isAbsolute(filePath)) {
|
|
180
|
-
const baseWithSep = baseDir.endsWith(path.sep) ? baseDir : `${baseDir}${path.sep}`;
|
|
181
|
-
if (!resolvedPath.startsWith(baseWithSep)) {
|
|
182
|
-
return {
|
|
183
|
-
valid: false,
|
|
184
|
-
errors: [`OpenAPI file path must be within: ${baseDir}`]
|
|
185
|
-
};
|
|
186
|
-
}
|
|
219
|
+
async function validateFilePath(filePath, configPath) {
|
|
220
|
+
const resolvedPath = await resolveWizardOpenApiFilePath(filePath, configPath);
|
|
221
|
+
if (!resolvedPath) {
|
|
222
|
+
return { valid: false, errors: ['OpenAPI file path is required'], resolvedPath: '' };
|
|
187
223
|
}
|
|
188
224
|
try {
|
|
189
225
|
await fs.access(resolvedPath);
|
|
190
226
|
} catch (error) {
|
|
191
227
|
return {
|
|
192
228
|
valid: false,
|
|
193
|
-
errors: [`OpenAPI file not found: ${resolvedPath}`]
|
|
229
|
+
errors: [`OpenAPI file not found: ${resolvedPath}`],
|
|
230
|
+
resolvedPath
|
|
194
231
|
};
|
|
195
232
|
}
|
|
196
|
-
return { valid: true, errors: [] };
|
|
233
|
+
return { valid: true, errors: [], resolvedPath };
|
|
197
234
|
}
|
|
198
235
|
|
|
199
236
|
/**
|
|
@@ -229,10 +266,11 @@ function validateSchemaAndResolveEnvVars(config, shouldResolveEnvVars) {
|
|
|
229
266
|
async function performSemanticValidations(config, configPath, validateFilePaths) {
|
|
230
267
|
const errors = [];
|
|
231
268
|
if (validateFilePaths && config.source?.type === 'openapi-file' && config.source?.filePath) {
|
|
232
|
-
const
|
|
233
|
-
const fileResult = await validateFilePath(config.source.filePath, basePath);
|
|
269
|
+
const fileResult = await validateFilePath(config.source.filePath, configPath);
|
|
234
270
|
if (!fileResult.valid) {
|
|
235
271
|
errors.push(...fileResult.errors);
|
|
272
|
+
} else if (fileResult.resolvedPath) {
|
|
273
|
+
config.source.filePath = fileResult.resolvedPath;
|
|
236
274
|
}
|
|
237
275
|
}
|
|
238
276
|
if (config.mode === 'add-datasource' && !config.systemIdOrKey) {
|
|
@@ -296,6 +334,7 @@ module.exports = {
|
|
|
296
334
|
wizardConfigExists,
|
|
297
335
|
validateWizardConfig,
|
|
298
336
|
validateWizardConfigSchema,
|
|
337
|
+
resolveWizardOpenApiFilePath,
|
|
299
338
|
resolveEnvVar,
|
|
300
339
|
resolveEnvVarsInObject,
|
|
301
340
|
formatValidationErrors,
|
package/package.json
CHANGED
|
@@ -64,7 +64,8 @@ build:
|
|
|
64
64
|
dockerfile: builder/dataplane/Dockerfile # Dockerfile path (relative to project root)
|
|
65
65
|
envOutputPath: ../../.env # Copy to repo root for local dev
|
|
66
66
|
language: python # Runtime language for template selection (typescript or python)
|
|
67
|
-
|
|
67
|
+
# Dev reload: polling + watch /app/app only (avoids EMFILE on full repo bind-mount). See run_local.py, make af-reload.
|
|
68
|
+
reloadStart: WATCHFILES_FORCE_POLLING=1 uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload --reload-dir /app/app
|
|
68
69
|
# Pulled-image local compose (no bind-mount): drives `command` in generated docker-compose. Override for non-standard images (e.g. stub ACR tags).
|
|
69
70
|
imageRun: exec python -m uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001}
|
|
70
71
|
|
|
@@ -21,7 +21,7 @@ LOG_FORMAT=json
|
|
|
21
21
|
# Production with persistent logs: use /mnt/data/logs/app.log and mount a volume at /mnt/data.
|
|
22
22
|
LOG_FILE_PATH=/mnt/data/logs/app.log
|
|
23
23
|
# If true, run without Redis/Celery (single process)
|
|
24
|
-
LOCAL_MODE=
|
|
24
|
+
LOCAL_MODE=true
|
|
25
25
|
|
|
26
26
|
# When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
|
|
27
27
|
# Same kv:// as miso-controller API_KEY so pipeline Bearer bypass uses one secrets.local entry
|
|
@@ -30,9 +30,14 @@ API_KEY=kv://miso-controller-secrets-apiKeyVault
|
|
|
30
30
|
# API Configuration
|
|
31
31
|
API_V1_STR=/api/v1
|
|
32
32
|
VERSION=1.9.5
|
|
33
|
+
# Minimum supported aifabrix-builder CLI semver (advertised on /health and /api/v1/health; empty = no gate)
|
|
34
|
+
# MIN_BUILDER_CLI_VERSION=2.45.0
|
|
35
|
+
MIN_BUILDER_CLI_VERSION=2.45.5
|
|
33
36
|
# Base URL for the dataplane web server (used for default OAuth2 callback URL when redirectUri is omitted)
|
|
34
37
|
# url:// resolves after kv://; includes front-door path from application.yaml (e.g. /data)
|
|
35
38
|
DATAPLANE_WEB_SERVER_URL=url://public
|
|
39
|
+
# Relative URL path where dataplane is served by reverse proxy (for prefixed deployments, e.g. /data).
|
|
40
|
+
DATAPLANE_RELATIVE_PATH=url://vdir-public
|
|
36
41
|
DATAPLANE_INTERNAL_URL=url://internal
|
|
37
42
|
|
|
38
43
|
# CORS Configuration
|
|
@@ -165,6 +170,23 @@ RBAC_EXPLAIN_MODE_ENABLED=false
|
|
|
165
170
|
# validates only (no second DB write). Default false.
|
|
166
171
|
AUDIT_ASYNC_SHADOW_ENQUEUE=false
|
|
167
172
|
|
|
173
|
+
# Policy Library management HTTP API gate. When false (default), management
|
|
174
|
+
# routes are not registered (404): /api/v1/policies/*, /api/v1/external/{key}/policies,
|
|
175
|
+
# /api/v1/users/{id}/policies, /api/v1/groups/{id}/policies, IDE /validate/policy and
|
|
176
|
+
# /simulate/policy-impact/{datasourceKey}. ABAC runtime evaluation is unaffected.
|
|
177
|
+
# Set to true for local dev when iterating on policy CRUD APIs.
|
|
178
|
+
# Policy Library management HTTP APIs (default false → routes not registered, 404).
|
|
179
|
+
# Set true for local dev policy CRUD; pair with VITE_POLICY_MANAGEMENT_ENABLED=true in app-ui.
|
|
180
|
+
POLICY_MANAGEMENT_API_ENABLED=false
|
|
181
|
+
|
|
182
|
+
# First-party HTTP internal SpecFile (398.2 / plan 397). When true, lifespan upserts
|
|
183
|
+
# internal:dataplane-first-party-http from the live COM-merged OpenAPI schema.
|
|
184
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_SYNC_ON_STARTUP=false
|
|
185
|
+
# Upsert internal:dataplane-first-party-http after pipeline external-system publish.
|
|
186
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_SYNC_ON_PUBLISH=false
|
|
187
|
+
# Optional external_systems.id for spec_files FK; empty uses first row when startup sync is on.
|
|
188
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_EXTERNAL_SYSTEM_ID=
|
|
189
|
+
|
|
168
190
|
# =============================================================================
|
|
169
191
|
# OBSERVABILITY CONFIGURATION
|
|
170
192
|
# =============================================================================
|
|
@@ -186,6 +208,19 @@ CERTIFICATE_PUBLIC_KEY=
|
|
|
186
208
|
# Optional public key identifier for issued certificates; default if unset: dataplane-signing-key
|
|
187
209
|
CERTIFICATE_PUBLIC_KEY_ID=
|
|
188
210
|
|
|
211
|
+
# =============================================================================
|
|
212
|
+
# VALIDATION ENGINE — YAML CONTRACTS
|
|
213
|
+
# =============================================================================
|
|
214
|
+
# Load rules from repo contracts/ and schedule hybrid YAML tasks (see docs/adr/0001-validation-engine-yaml-contracts.md).
|
|
215
|
+
# Code defaults when unset: VALIDATION_CONTRACTS_ENABLED=false, VALIDATION_RULESET=legacy.
|
|
216
|
+
# hybrid = legacy Python categories + YAML rules; yaml = YAML/hybrid only (requires contracts enabled).
|
|
217
|
+
# Optional override for contract bundle root (default: <dataplane-repo>/contracts):
|
|
218
|
+
# VALIDATION_CONTRACTS_ROOT=
|
|
219
|
+
VALIDATION_CONTRACTS_ENABLED=true
|
|
220
|
+
VALIDATION_RULESET=hybrid
|
|
221
|
+
# Attach advisory yamlSuggestedLevel + contract metadata on certification details (does not change ICC/PDS level selection).
|
|
222
|
+
VALIDATION_CERTIFICATION_YAML_ENABLED=true
|
|
223
|
+
|
|
189
224
|
# After a successful POST /api/v1/validation/run (validation engine with certification passed, or E2E success),
|
|
190
225
|
# persist an active integration certificate without a separate issue call. Set false to require explicit issue only.
|
|
191
226
|
VALIDATION_AUTO_ISSUE_INTEGRATION_CERTIFICATE=true
|
|
@@ -280,6 +280,10 @@ permissions:
|
|
|
280
280
|
- name: "record:search"
|
|
281
281
|
roles: ["aifabrix-platform-admin", "aifabrix-security-admin", "aifabrix-deployment-admin", "aifabrix-compliance-admin", "aifabrix-developer", "aifabrix-observer"]
|
|
282
282
|
description: "Search records"
|
|
283
|
+
|
|
284
|
+
- name: "governance:evaluate"
|
|
285
|
+
roles: ["aifabrix-platform-admin", "aifabrix-security-admin", "aifabrix-developer"]
|
|
286
|
+
description: "Run governance scenario acceptance (subject impersonation for ABAC proof)"
|
|
283
287
|
|
|
284
288
|
# IDE simulation operations
|
|
285
289
|
- name: "dataplane:abac-simulate"
|
|
@@ -167,6 +167,22 @@ MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
|
|
|
167
167
|
# Unset = use DB only.
|
|
168
168
|
CONTROLLER_EVALUATION=
|
|
169
169
|
|
|
170
|
+
# =============================================================================
|
|
171
|
+
# ENTRA ID ONBOARDING (vendor multi-tenant app — admin consent)
|
|
172
|
+
# =============================================================================
|
|
173
|
+
# AI Fabrix vendor app for TA-1 admin consent and Entra ID configure flows.
|
|
174
|
+
# Customer SSO after configure uses a separate enterprise app (AI Fabrix Miso);
|
|
175
|
+
# Keycloak broker redirect is on that customer app, not ENTRA_ID_CLIENT_ID.
|
|
176
|
+
#
|
|
177
|
+
# ENTRA_ID_CENTRAL_CALLBACK_URI — Web redirect on the vendor app; must point at
|
|
178
|
+
# Mori (e.g. …/entra-id-concent/callback), not the SPA or controller.
|
|
179
|
+
# ENTRA_CALLBACK_STATE_SECRET — Shared HMAC secret (min 16 chars) for OAuth state
|
|
180
|
+
# between controller and Mori callback service; same value on Mori and controller.
|
|
181
|
+
ENTRA_CALLBACK_STATE_SECRET=kv://entra-callback-state-secret
|
|
182
|
+
ENTRA_ID_CENTRAL_CALLBACK_URI=kv://entra-callback-uri
|
|
183
|
+
ENTRA_ID_CLIENT_ID=kv://entra-client-idKeyVault
|
|
184
|
+
ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
|
|
185
|
+
|
|
170
186
|
# =============================================================================
|
|
171
187
|
# TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG
|
|
172
188
|
# =============================================================================
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
| `{{systemKey}}-deploy.json` | Deploy manifest (`aifabrix json {{appName}}`) |
|
|
24
24
|
| `deploy.js` | Deploy helper |
|
|
25
25
|
| `wizard.yaml` | Wizard input |
|
|
26
|
+
| `scenarios/*.yaml` | Governance scenario packs (optional; dataplane-first via `verify-governance` / `governance generate`; expert YAML via `governance download` / `upload`) |
|
|
26
27
|
| `{{rbacOptionalFile}}` | Roles and permissions |
|
|
27
28
|
|
|
28
29
|
## Typical workflow
|
|
@@ -32,10 +33,48 @@
|
|
|
32
33
|
3. **Adjust operations** — use `aifabrix datasource capability …` to copy, add, or remove **capabilities** (see below).
|
|
33
34
|
4. **Check locally** — `aifabrix validate {{appName}}` and `aifabrix datasource validate` on files you touched.
|
|
34
35
|
5. **Align manifest** — `aifabrix repair {{appName}}` after bigger edits.
|
|
35
|
-
6. **Publish** — `
|
|
36
|
+
6. **Publish** — see [Publish and credentials](#publish-and-credentials) (`upload`, `deploy`, or `credential push`).
|
|
37
|
+
7. **Certify** — run [Enterprise AI Certification](#enterprise-ai-certification) (`verify-operations` → `verify-trust` → `verify-governance` → `lifecycle`).
|
|
38
|
+
8. **Protection** (optional) — dimension grants in `integration/.protection/` — see [Protection manifests](#protection-manifests).
|
|
36
39
|
|
|
37
40
|
Rollback an experiment: `datasource capability remove …` → validate → upload/deploy again.
|
|
38
41
|
|
|
42
|
+
## Publish and credentials
|
|
43
|
+
|
|
44
|
+
| Command | What it does |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| `aifabrix upload {{appName}}` | Publishes local integration files to the dataplane (refreshes `{{systemKey}}-deploy.json` from sources) and pushes credential secrets from `integration/{{appName}}/.env` (when present). |
|
|
47
|
+
| `aifabrix upload {{appName}} --force` | Same publish path when the interface or datasource schema changed in ways **deploy cannot accept yet**; bypasses active-schema replacement guards. Read the CLI warning before use. |
|
|
48
|
+
| `aifabrix deploy {{appName}}` | Deploys via the controller pipeline. Does **not** replace a full upload for credential secrets — run `upload` or `credential push` when `.env` changed. |
|
|
49
|
+
| `aifabrix credential push {{appName}}` | Pushes `KV_*` values from `.env` only (no manifest publish). |
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
aifabrix upload {{appName}}
|
|
53
|
+
# or secrets only:
|
|
54
|
+
aifabrix credential push {{appName}}
|
|
55
|
+
|
|
56
|
+
# Breaking schema / interface change — deploy blocked; publish for dev iteration
|
|
57
|
+
aifabrix validate {{appName}}
|
|
58
|
+
aifabrix upload {{appName}} --force
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Protection manifests
|
|
62
|
+
|
|
63
|
+
Protection rules live in **`integration/.protection/`** at the **repository root** (sibling to `integration/{{appName}}/`, not inside this app folder). One manifest per **datasource key** (`spec.datasourceKey`). Use YAML or JSON; store expressions only — no secrets in Git.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# From repo root (where integration/ lives)
|
|
67
|
+
aifabrix protection create {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}<datasource-key>{{/if}} --type country-sales
|
|
68
|
+
aifabrix protection validate {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}<datasource-key>{{/if}}
|
|
69
|
+
aifabrix protection upload {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}<datasource-key>{{/if}}
|
|
70
|
+
|
|
71
|
+
# Batch (entire folder)
|
|
72
|
+
aifabrix validate .protection
|
|
73
|
+
aifabrix upload .protection
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
See `aifabrix protection --help` for flags (`--no-sync` on upload skips datasource sync after upload only).
|
|
77
|
+
|
|
39
78
|
## Capabilities (per datasource)
|
|
40
79
|
|
|
41
80
|
Each `*-datasource-*` file lists **capabilities**: named slices that tie together HTTP/API definitions and execution steps. Use the CLI to clone or drop them safely instead of editing huge JSON by hand.
|
|
@@ -71,9 +110,9 @@ af ds cap remove {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}
|
|
|
71
110
|
|
|
72
111
|
For flags, run `af ds cap <command> --help`.
|
|
73
112
|
|
|
74
|
-
##
|
|
113
|
+
## Per-datasource debug ladder
|
|
75
114
|
|
|
76
|
-
Start with one datasource and iterate until it’s stable.
|
|
115
|
+
Start with one datasource and iterate until it’s stable (architect / CI — use [Enterprise AI Certification](#enterprise-ai-certification) for the product path).
|
|
77
116
|
|
|
78
117
|
```bash
|
|
79
118
|
af ds validate {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}<datasource-key>{{/if}}
|
|
@@ -105,14 +144,75 @@ aifabrix repair {{appName}}
|
|
|
105
144
|
|
|
106
145
|
Useful flags: `--dry-run`, `--auth <method>`, `--rbac`, `--expose`, `--sync`, `--test`.
|
|
107
146
|
|
|
108
|
-
##
|
|
147
|
+
## Enterprise AI Certification
|
|
148
|
+
|
|
149
|
+
Product-facing commands that prove operational readiness, AI trust, governance enforcement, and an **Enterprise AI Certification** report. Run after [publish](#publish-and-credentials).
|
|
109
150
|
|
|
110
|
-
| Command |
|
|
151
|
+
| Command | What it proves |
|
|
111
152
|
| --- | --- |
|
|
112
|
-
| `aifabrix
|
|
113
|
-
| `aifabrix
|
|
114
|
-
| `aifabrix
|
|
115
|
-
| `aifabrix
|
|
153
|
+
| `aifabrix verify-operations {{appName}}` | Operational readiness — orchestrates validate, unit test, integration, and E2E for the whole system |
|
|
154
|
+
| `aifabrix verify-trust {{appName}}` | AI business context confidence (semantic agent metadata; not live vendor API calls) |
|
|
155
|
+
| `aifabrix verify-governance {{appName}}` | **Recommended** — publish (unless `--no-sync`), generate scenario packs on the dataplane, then verify ABAC visibility per subject |
|
|
156
|
+
| `aifabrix governance generate {{appName}}` | Granular: generate packs only (after protection + sync) |
|
|
157
|
+
| `aifabrix governance verify {{appName}}` | Granular: verify only (active packs on dataplane, or `--pack` for local YAML override) |
|
|
158
|
+
| `aifabrix lifecycle {{appName}}` | Certification report from persisted pillar results on the dataplane |
|
|
159
|
+
|
|
160
|
+
**Recommended order:** `upload` → `verify-operations` → `verify-trust` → `verify-governance` → `lifecycle`
|
|
161
|
+
|
|
162
|
+
Integration validation packs live under `integration/{{appName}}/scenarios/` (YAML per datasource). Prefer **`verify-governance`** (dataplane-first) after identity sync, protection upload, and `datasource load`. Granular: `governance generate` then `governance verify`. Expert YAML: `governance download` / `governance upload` (424.0 schema; pre-424 files fail with a hint to regenerate). **`governance download`** is read-only and does not publish this folder.
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
aifabrix upload {{appName}}
|
|
166
|
+
|
|
167
|
+
aifabrix verify-operations {{appName}}
|
|
168
|
+
aifabrix verify-operations {{appName}} -v
|
|
169
|
+
|
|
170
|
+
aifabrix verify-trust {{appName}} -v
|
|
171
|
+
aifabrix verify-trust {{appName}} --no-sync --revalidate
|
|
172
|
+
|
|
173
|
+
# Governance pillar (replace <email> with a subject from your scenario pack)
|
|
174
|
+
aifabrix verify-governance {{appName}} --subject-email <email> -v
|
|
175
|
+
aifabrix verify-governance {{appName}} --subject-email <email> --no-sync
|
|
176
|
+
|
|
177
|
+
# Granular governance (debugging)
|
|
178
|
+
aifabrix governance generate {{appName}} --subject-email <email>
|
|
179
|
+
aifabrix governance verify {{appName}} -v
|
|
180
|
+
|
|
181
|
+
# Report only (GET persisted results)
|
|
182
|
+
aifabrix lifecycle {{appName}}
|
|
183
|
+
aifabrix lifecycle {{appName}} -v
|
|
184
|
+
|
|
185
|
+
# Run missing verify steps, publish local files, then print report
|
|
186
|
+
aifabrix lifecycle {{appName}} --run
|
|
187
|
+
aifabrix lifecycle {{appName}} --run --no-sync
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Prerequisites:** `aifabrix login`, dataplane reachable, config published (`upload`). Governance also needs identity sync, protection upload, `datasource load` for fixture records, at least one `--subject-email` or `--subject-user-id`, and `governance:evaluate` on your token. Run `aifabrix verify-governance --help` for flags.
|
|
191
|
+
|
|
192
|
+
**Single-datasource trust** (same semantic check as system `verify-trust`, one key):
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
aifabrix datasource verify-trust {{#if hasDatasources}}{{datasources.[0].datasourceKey}}{{else}}<datasource-key>{{/if}} --app {{appName}} -v
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Common flags: `-v` / `--verbose`, `-d` / `--debug` (trust), `--no-sync` (skip pre-run upload), `--json` (machine-readable envelope).
|
|
199
|
+
|
|
200
|
+
## Debug and low-level tests
|
|
201
|
+
|
|
202
|
+
Advanced commands for architects and CI. Prefer [Enterprise AI Certification](#enterprise-ai-certification) for integrator proof unless you need step-by-step debugging.
|
|
203
|
+
|
|
204
|
+
| Command | Network | Notes |
|
|
205
|
+
| --- | --- | --- |
|
|
206
|
+
| `aifabrix validate {{appName}}` | Off | Schemas and files only |
|
|
207
|
+
| `aifabrix test {{appName}}` | Off | Local checks |
|
|
208
|
+
| `aifabrix test-integration {{appName}}` | On | Needs login + dataplane |
|
|
209
|
+
| `aifabrix test-e2e {{appName}}` | On | E2E for every datasource; uploads local files first unless `--no-sync` |
|
|
210
|
+
|
|
211
|
+
System-level tests publish local integration files before the run (same path as `upload`). Use **`--no-sync`** to validate against config already on the dataplane.
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
aifabrix test-e2e {{appName}} --no-sync -d
|
|
215
|
+
```
|
|
116
216
|
|
|
117
217
|
Single datasource E2E:
|
|
118
218
|
|
|
@@ -130,7 +230,9 @@ aifabrix datasource test-e2e <datasource-key> --app {{appName}}
|
|
|
130
230
|
```
|
|
131
231
|
{{/if}}
|
|
132
232
|
|
|
133
|
-
Common
|
|
233
|
+
Common flags: `-v` / `--verbose`, `-d` / `--debug`, `--no-async` (datasource E2E only), `--no-sync` (skip pre-run upload on system `test-e2e`).
|
|
234
|
+
|
|
235
|
+
Debug logs (when using `--debug` on datasource commands) are written under `integration/{{appName}}/logs/` — use `aifabrix datasource log-test`, `log-integration`, `log-e2e`, or `log-trust` to inspect the latest file for each type.
|
|
134
236
|
|
|
135
237
|
## Deploy
|
|
136
238
|
|
|
@@ -147,5 +249,8 @@ aifabrix delete {{appName}}
|
|
|
147
249
|
## When something fails
|
|
148
250
|
|
|
149
251
|
- **Validation errors** — Fix JSON/schema issues; run `aifabrix validate {{appName}}` and `aifabrix datasource validate` on the file you changed.
|
|
150
|
-
- **
|
|
252
|
+
- **Deploy blocked by schema changes** — When the interface changed and deploy rejects the update, validate locally then `aifabrix upload {{appName}} --force` to publish for dev iteration (see [Publish and credentials](#publish-and-credentials)).
|
|
253
|
+
- **Auth** — `aifabrix auth config` + `aifabrix login` before upload, deploy, remote tests, or certification.
|
|
254
|
+
- **Certification gaps** — Run pillars in order (`verify-operations` → `verify-trust` → `verify-governance`), then `aifabrix lifecycle {{appName}} -v` for per-datasource breakdown; use `lifecycle --run` to execute missing steps and refresh the report.
|
|
255
|
+
- **Governance upload rejected** — Local `scenarios/*.yaml` must meet the 424.0 pack schema; use `verify-governance` or `governance generate` instead of hand-editing old YAML.
|
|
151
256
|
- **Wrong folder** — Run CLI from the project root (where `integration/{{appName}}/` lives).
|
|
@@ -51,7 +51,7 @@ services:
|
|
|
51
51
|
env_file:
|
|
52
52
|
- {{envFile}}
|
|
53
53
|
{{#if reloadStartCommand}}
|
|
54
|
-
command: ["sh", "-c", "cd /app && {{reloadStartCommand}}"]
|
|
54
|
+
command: ["sh", "-c", "cd /app && {{{reloadStartCommand}}}"]
|
|
55
55
|
{{/if}}
|
|
56
56
|
ports:
|
|
57
57
|
- "{{hostPort}}:{{containerPort}}"
|
|
@@ -134,27 +134,28 @@ services:
|
|
|
134
134
|
done &&
|
|
135
135
|
{{#if databases}}
|
|
136
136
|
{{#each databases}}
|
|
137
|
-
echo
|
|
138
|
-
if psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '{{
|
|
139
|
-
echo
|
|
140
|
-
psql -d postgres -c "ALTER USER \"{{
|
|
141
|
-
echo
|
|
137
|
+
echo "Creating $${DB_{{@index}}_NAME} database and user..." &&
|
|
138
|
+
if psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '$${DB_{{@index}}_NAME}'" 2>/dev/null | grep -q '^1$$'; then
|
|
139
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" already exists, syncing user password..." &&
|
|
140
|
+
psql -d postgres -c "ALTER USER \"$${DB_{{@index}}_USER}\" WITH PASSWORD '"$${DB_{{@index}}_PASSWORD}"';" &&
|
|
141
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" ok."
|
|
142
142
|
else
|
|
143
|
-
echo
|
|
144
|
-
psql -d postgres -c "CREATE DATABASE \"{{
|
|
145
|
-
echo
|
|
143
|
+
echo "Creating database \"$${DB_{{@index}}_NAME}\"..." &&
|
|
144
|
+
psql -d postgres -c "CREATE DATABASE \"$${DB_{{@index}}_NAME}\";" &&
|
|
145
|
+
echo "Dropping old user if exists..." &&
|
|
146
146
|
psql -d postgres -c "DROP USER IF EXISTS \"{{pgUserOld name}}\";" || true &&
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
psql -d
|
|
152
|
-
psql -d {{
|
|
153
|
-
|
|
147
|
+
psql -d postgres -c "DROP USER IF EXISTS \"$${DB_{{@index}}_USER}\";" || true &&
|
|
148
|
+
echo "Creating user \"$${DB_{{@index}}_USER}\"..." &&
|
|
149
|
+
psql -d postgres -c "CREATE USER \"$${DB_{{@index}}_USER}\" WITH PASSWORD '"$${DB_{{@index}}_PASSWORD}"';" &&
|
|
150
|
+
echo "Granting privileges..." &&
|
|
151
|
+
psql -d postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$${DB_{{@index}}_NAME}\" TO \"$${DB_{{@index}}_USER}\";" &&
|
|
152
|
+
psql -d "$${DB_{{@index}}_NAME}" -c "ALTER SCHEMA public OWNER TO \"$${DB_{{@index}}_USER}\";" &&
|
|
153
|
+
psql -d "$${DB_{{@index}}_NAME}" -c "GRANT ALL ON SCHEMA public TO \"$${DB_{{@index}}_USER}\";" &&
|
|
154
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" created successfully!"
|
|
154
155
|
fi &&
|
|
155
156
|
{{#each (extensionsForDb this)}}
|
|
156
|
-
(psql -d {{
|
|
157
|
-
echo
|
|
157
|
+
(psql -d "$${DB_{{@../index}}_NAME}" -c 'CREATE EXTENSION IF NOT EXISTS {{pgQuote this}};' || echo "Warning: could not create extension {{this}}") &&
|
|
158
|
+
echo "Extension \"{{this}}\" enabled on \"$${DB_{{@../index}}_NAME}\"." &&
|
|
158
159
|
{{/each}}
|
|
159
160
|
{{/each}}
|
|
160
161
|
{{else}}
|
|
@@ -134,27 +134,28 @@ services:
|
|
|
134
134
|
done &&
|
|
135
135
|
{{#if databases}}
|
|
136
136
|
{{#each databases}}
|
|
137
|
-
echo
|
|
138
|
-
if psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '{{
|
|
139
|
-
echo
|
|
140
|
-
psql -d postgres -c "ALTER USER \"{{
|
|
141
|
-
echo
|
|
137
|
+
echo "Creating $${DB_{{@index}}_NAME} database and user..." &&
|
|
138
|
+
if psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '$${DB_{{@index}}_NAME}'" 2>/dev/null | grep -q '^1$$'; then
|
|
139
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" already exists, syncing user password..." &&
|
|
140
|
+
psql -d postgres -c "ALTER USER \"$${DB_{{@index}}_USER}\" WITH PASSWORD '"$${DB_{{@index}}_PASSWORD}"';" &&
|
|
141
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" ok."
|
|
142
142
|
else
|
|
143
|
-
echo
|
|
144
|
-
psql -d postgres -c "CREATE DATABASE \"{{
|
|
145
|
-
echo
|
|
143
|
+
echo "Creating database \"$${DB_{{@index}}_NAME}\"..." &&
|
|
144
|
+
psql -d postgres -c "CREATE DATABASE \"$${DB_{{@index}}_NAME}\";" &&
|
|
145
|
+
echo "Dropping old user if exists..." &&
|
|
146
146
|
psql -d postgres -c "DROP USER IF EXISTS \"{{pgUserOld name}}\";" || true &&
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
psql -d
|
|
152
|
-
psql -d {{
|
|
153
|
-
|
|
147
|
+
psql -d postgres -c "DROP USER IF EXISTS \"$${DB_{{@index}}_USER}\";" || true &&
|
|
148
|
+
echo "Creating user \"$${DB_{{@index}}_USER}\"..." &&
|
|
149
|
+
psql -d postgres -c "CREATE USER \"$${DB_{{@index}}_USER}\" WITH PASSWORD '"$${DB_{{@index}}_PASSWORD}"';" &&
|
|
150
|
+
echo "Granting privileges..." &&
|
|
151
|
+
psql -d postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$${DB_{{@index}}_NAME}\" TO \"$${DB_{{@index}}_USER}\";" &&
|
|
152
|
+
psql -d "$${DB_{{@index}}_NAME}" -c "ALTER SCHEMA public OWNER TO \"$${DB_{{@index}}_USER}\";" &&
|
|
153
|
+
psql -d "$${DB_{{@index}}_NAME}" -c "GRANT ALL ON SCHEMA public TO \"$${DB_{{@index}}_USER}\";" &&
|
|
154
|
+
echo "Database \"$${DB_{{@index}}_NAME}\" created successfully!"
|
|
154
155
|
fi &&
|
|
155
156
|
{{#each (extensionsForDb this)}}
|
|
156
|
-
(psql -d {{
|
|
157
|
-
echo
|
|
157
|
+
(psql -d "$${DB_{{@../index}}_NAME}" -c 'CREATE EXTENSION IF NOT EXISTS {{pgQuote this}};' || echo "Warning: could not create extension {{this}}") &&
|
|
158
|
+
echo "Extension \"{{this}}\" enabled on \"$${DB_{{@../index}}_NAME}\"." &&
|
|
158
159
|
{{/each}}
|
|
159
160
|
{{/each}}
|
|
160
161
|
{{else}}
|