@devtrack-solution/codesdd 1.2.2 → 1.2.4-rc3
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/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
- package/.sdd/skills/curated/devtrack-api/SKILL.md +170 -31
- package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +8 -0
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -2
- package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +10 -0
- package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +2 -2
- package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
- package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
- package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +372 -0
- package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +13 -13
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +294 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +5 -5
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +41 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +7 -9
- package/LICENSE +1 -1
- package/README.md +399 -53
- package/bin/codesdd.js +3 -2
- package/dist/applications/sdd/index.d.ts +16 -0
- package/dist/applications/sdd/index.js +16 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +11 -558
- package/dist/cli/program.d.ts +14 -0
- package/dist/cli/program.js +645 -0
- package/dist/commands/change.js +5 -5
- package/dist/commands/completion.d.ts +1 -1
- package/dist/commands/completion.js +9 -2
- package/dist/commands/config.js +320 -20
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/schema.d.ts +63 -0
- package/dist/commands/schema.js +12 -12
- package/dist/commands/sdd/backlog.d.ts +3 -0
- package/dist/commands/sdd/backlog.js +54 -0
- package/dist/commands/sdd/execution.js +489 -28
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +158 -0
- package/dist/commands/sdd/shared.d.ts +1 -0
- package/dist/commands/sdd/shared.js +11 -22
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +107 -15
- package/dist/commands/spec.js +9 -9
- package/dist/commands/validate.js +6 -6
- package/dist/commands/workflow/instructions.js +6 -6
- package/dist/commands/workflow/new-change.js +3 -3
- package/dist/commands/workflow/shared.d.ts +1 -1
- package/dist/commands/workflow/shared.js +4 -4
- package/dist/core/archive.js +15 -5
- package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +3 -3
- package/dist/core/artifact-graph/resolver.d.ts +4 -4
- package/dist/core/artifact-graph/resolver.js +6 -6
- package/dist/core/branding.js +3 -3
- package/dist/core/cli/command-matrix.js +19 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +180 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
- package/dist/core/command-generation/adapters/costrict.js +2 -2
- package/dist/core/command-generation/types.d.ts +1 -1
- package/dist/core/completions/command-registry.d.ts +1 -1
- package/dist/core/completions/command-registry.js +200 -12
- package/dist/core/completions/completion-provider.d.ts +14 -1
- package/dist/core/completions/completion-provider.js +29 -1
- package/dist/core/completions/generators/bash-generator.d.ts +1 -1
- package/dist/core/completions/generators/bash-generator.js +20 -12
- package/dist/core/completions/generators/fish-generator.d.ts +9 -1
- package/dist/core/completions/generators/fish-generator.js +39 -25
- package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
- package/dist/core/completions/generators/powershell-generator.js +21 -11
- package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
- package/dist/core/completions/generators/zsh-generator.js +21 -42
- package/dist/core/completions/installers/bash-installer.js +6 -6
- package/dist/core/completions/installers/fish-installer.js +1 -1
- package/dist/core/completions/installers/powershell-installer.js +14 -14
- package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
- package/dist/core/completions/installers/zsh-installer.js +36 -8
- package/dist/core/completions/templates/bash-templates.d.ts +1 -1
- package/dist/core/completions/templates/bash-templates.js +12 -6
- package/dist/core/completions/templates/fish-templates.d.ts +2 -2
- package/dist/core/completions/templates/fish-templates.js +20 -9
- package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
- package/dist/core/completions/templates/powershell-templates.js +13 -4
- package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
- package/dist/core/completions/templates/zsh-templates.js +18 -9
- package/dist/core/config-schema.d.ts +20 -1
- package/dist/core/config-schema.js +70 -2
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +57 -12
- package/dist/core/global-config.js +344 -27
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/init.d.ts +6 -1
- package/dist/core/init.js +99 -77
- package/dist/core/legacy-cleanup.d.ts +17 -17
- package/dist/core/legacy-cleanup.js +96 -79
- package/dist/core/list.js +18 -4
- package/dist/core/migration.d.ts +3 -1
- package/dist/core/migration.js +7 -8
- package/dist/core/parsers/change-parser.js +1 -1
- package/dist/core/parsers/markdown-parser.js +2 -2
- package/dist/core/profile-sync-drift.d.ts +1 -1
- package/dist/core/profile-sync-drift.js +13 -13
- package/dist/core/project-config.d.ts +4 -4
- package/dist/core/project-config.js +11 -11
- package/dist/core/schemas/change.schema.d.ts +1 -1
- package/dist/core/schemas/change.schema.js +1 -1
- package/dist/core/schemas/spec.schema.d.ts +1 -1
- package/dist/core/schemas/spec.schema.js +1 -1
- package/dist/core/sdd/adr.js +23 -1
- package/dist/core/sdd/agent-binding.d.ts +346 -0
- package/dist/core/sdd/agent-binding.js +343 -0
- package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
- package/dist/core/sdd/agent-runtime-contract.js +200 -0
- package/dist/core/sdd/backlog-cli.d.ts +16 -0
- package/dist/core/sdd/backlog-cli.js +146 -0
- package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
- package/dist/core/sdd/backlog-conflict-policy.js +230 -0
- package/dist/core/sdd/backlog-projection.d.ts +8 -0
- package/dist/core/sdd/backlog-projection.js +89 -0
- package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
- package/dist/core/sdd/backlog-provider-contract.js +158 -0
- package/dist/core/sdd/bootstrap.js +2 -2
- package/dist/core/sdd/check.d.ts +44 -0
- package/dist/core/sdd/check.js +62 -24
- package/dist/core/sdd/contract.d.ts +13 -0
- package/dist/core/sdd/contract.js +36 -0
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +53 -8
- package/dist/core/sdd/coordination/coordination-adapters.js +182 -16
- package/dist/core/sdd/coordination/index.d.ts +1 -0
- package/dist/core/sdd/coordination/index.js +1 -0
- package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
- package/dist/core/sdd/coordination/redis-runtime.js +698 -0
- package/dist/core/sdd/deepagent-contracts.d.ts +370 -0
- package/dist/core/sdd/deepagent-contracts.js +235 -0
- package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
- package/dist/core/sdd/deepagents/adr-governor.js +30 -0
- package/dist/core/sdd/deepagents/backend.d.ts +63 -0
- package/dist/core/sdd/deepagents/backend.js +174 -0
- package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
- package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
- package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
- package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
- package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
- package/dist/core/sdd/deepagents/model-provider.js +379 -0
- package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
- package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
- package/dist/core/sdd/deepagents/policy.d.ts +75 -0
- package/dist/core/sdd/deepagents/policy.js +358 -0
- package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
- package/dist/core/sdd/deepagents/quality-witness.js +77 -0
- package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
- package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
- package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
- package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
- package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
- package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
- package/dist/core/sdd/default-bootstrap-files.d.ts +3 -3
- package/dist/core/sdd/default-bootstrap-files.js +50 -10
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +288 -8
- package/dist/core/sdd/devtrack-api-appliance.d.ts +91 -0
- package/dist/core/sdd/devtrack-api-appliance.js +280 -0
- package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
- package/dist/core/sdd/devtrack-api-architecture.js +608 -0
- package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
- package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
- package/dist/core/sdd/diagnose.d.ts +59 -0
- package/dist/core/sdd/diagnose.js +37 -37
- package/dist/core/sdd/docs-sync.js +54 -20
- package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
- package/dist/core/sdd/domain/capability-diff.js +200 -0
- package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
- package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
- package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
- package/dist/core/sdd/domain/post-active-validation.js +61 -0
- package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
- package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
- package/dist/core/sdd/domain/transition-engine.js +1 -0
- package/dist/core/sdd/entity-reference.d.ts +5 -0
- package/dist/core/sdd/entity-reference.js +22 -0
- package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
- package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
- package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
- package/dist/core/sdd/foundation-layer-manifest.js +117 -0
- package/dist/core/sdd/governance-backfill.d.ts +31 -0
- package/dist/core/sdd/governance-backfill.js +359 -0
- package/dist/core/sdd/governance-parser.d.ts +21 -0
- package/dist/core/sdd/governance-parser.js +91 -0
- package/dist/core/sdd/governance-schemas.d.ts +245 -0
- package/dist/core/sdd/governance-schemas.js +143 -0
- package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
- package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
- package/dist/core/sdd/init.d.ts +3 -0
- package/dist/core/sdd/init.js +6 -3
- package/dist/core/sdd/intent-guard.d.ts +22 -0
- package/dist/core/sdd/intent-guard.js +67 -0
- package/dist/core/sdd/json-schema.js +108 -6
- package/dist/core/sdd/knowledge-graph.d.ts +45 -0
- package/dist/core/sdd/knowledge-graph.js +288 -0
- package/dist/core/sdd/legacy-operations.js +507 -44
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +95 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-security-gates.d.ts +21 -0
- package/dist/core/sdd/package-security-gates.js +119 -0
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +357 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +330 -0
- package/dist/core/sdd/parallel-feat-automation.js +424 -0
- package/dist/core/sdd/plugin-broker.d.ts +777 -0
- package/dist/core/sdd/plugin-broker.js +492 -0
- package/dist/core/sdd/plugin-certification.d.ts +79 -0
- package/dist/core/sdd/plugin-certification.js +453 -0
- package/dist/core/sdd/plugin-cli.d.ts +139 -0
- package/dist/core/sdd/plugin-cli.js +265 -0
- package/dist/core/sdd/plugin-evidence.d.ts +348 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +232 -0
- package/dist/core/sdd/plugin-manifest.js +225 -0
- package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
- package/dist/core/sdd/plugin-policy-pack.js +236 -0
- package/dist/core/sdd/plugin-policy.d.ts +68 -0
- package/dist/core/sdd/plugin-policy.js +212 -0
- package/dist/core/sdd/plugin-registry.d.ts +447 -0
- package/dist/core/sdd/plugin-registry.js +138 -0
- package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
- package/dist/core/sdd/plugin-sdk-contract.js +268 -0
- package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
- package/dist/core/sdd/plugin-skill-binding.js +339 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
- package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
- package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
- package/dist/core/sdd/quality-evidence-renderer.js +218 -0
- package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
- package/dist/core/sdd/quality-scenario-runner.js +613 -0
- package/dist/core/sdd/quality-validation.d.ts +620 -0
- package/dist/core/sdd/quality-validation.js +239 -0
- package/dist/core/sdd/release-readiness.d.ts +19 -0
- package/dist/core/sdd/release-readiness.js +472 -0
- package/dist/core/sdd/resolve-project-root.d.ts +2 -2
- package/dist/core/sdd/resolve-project-root.js +11 -5
- package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
- package/dist/core/sdd/runtime-boundary-contract.js +90 -0
- package/dist/core/sdd/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
- package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
- package/dist/core/sdd/services/agent-run.service.d.ts +97 -0
- package/dist/core/sdd/services/agent-run.service.js +261 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
- package/dist/core/sdd/services/capability-diff.service.js +26 -0
- package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
- package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
- package/dist/core/sdd/services/context.service.d.ts +43 -340
- package/dist/core/sdd/services/context.service.js +341 -25
- package/dist/core/sdd/services/debate.service.js +15 -2
- package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
- package/dist/core/sdd/services/feature-lint.service.js +105 -5
- package/dist/core/sdd/services/finalize.service.d.ts +105 -0
- package/dist/core/sdd/services/finalize.service.js +499 -38
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
- package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
- package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
- package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
- package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
- package/dist/core/sdd/services/legacy-capability.service.js +38 -21
- package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
- package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
- package/dist/core/sdd/services/onboard.service.js +2 -1
- package/dist/core/sdd/services/rebuild.service.js +6 -1
- package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
- package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
- package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
- package/dist/core/sdd/services/skills-sync.service.js +55 -2
- package/dist/core/sdd/services/start.service.js +6 -4
- package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
- package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
- package/dist/core/sdd/skill-evidence.d.ts +19 -0
- package/dist/core/sdd/skill-evidence.js +38 -0
- package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
- package/dist/core/sdd/skill-policy-pool.js +185 -0
- package/dist/core/sdd/state.d.ts +23 -0
- package/dist/core/sdd/state.js +313 -66
- package/dist/core/sdd/store/sdd-stores.js +2 -2
- package/dist/core/sdd/structural-health.d.ts +55 -55
- package/dist/core/sdd/types.d.ts +60 -19
- package/dist/core/sdd/types.js +21 -0
- package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
- package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
- package/dist/core/sdd/views.js +17 -0
- package/dist/core/sdd/workspace-schemas.d.ts +670 -19
- package/dist/core/sdd/workspace-schemas.js +285 -5
- package/dist/core/sdd/write-manifest.js +22 -4
- package/dist/core/shared/skill-generation.d.ts +1 -1
- package/dist/core/shared/skill-generation.js +15 -15
- package/dist/core/shared/tool-detection.d.ts +3 -3
- package/dist/core/shared/tool-detection.js +14 -14
- package/dist/core/specs-apply.js +6 -6
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.js +1 -1
- package/dist/core/templates/workflows/apply-change.js +14 -14
- package/dist/core/templates/workflows/archive-change.js +32 -32
- package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
- package/dist/core/templates/workflows/continue-change.js +12 -12
- package/dist/core/templates/workflows/explore.js +29 -29
- package/dist/core/templates/workflows/feedback.js +6 -6
- package/dist/core/templates/workflows/ff-change.js +24 -24
- package/dist/core/templates/workflows/new-change.js +20 -20
- package/dist/core/templates/workflows/onboard.js +33 -33
- package/dist/core/templates/workflows/propose.js +23 -23
- package/dist/core/templates/workflows/sdd.js +8 -8
- package/dist/core/templates/workflows/sync-specs.js +19 -19
- package/dist/core/templates/workflows/verify-change.js +17 -17
- package/dist/core/update.d.ts +2 -2
- package/dist/core/update.js +16 -15
- package/dist/core/validation/constants.d.ts +1 -1
- package/dist/core/validation/constants.js +1 -1
- package/dist/core/view.js +11 -11
- package/dist/domains/sdd/index.d.ts +6 -0
- package/dist/domains/sdd/index.js +6 -0
- package/dist/infrastructures/sdd/index.d.ts +7 -0
- package/dist/infrastructures/sdd/index.js +6 -0
- package/dist/presentations/cli/sdd/index.d.ts +3 -0
- package/dist/presentations/cli/sdd/index.js +3 -0
- package/dist/shared/sdd/index.d.ts +3 -0
- package/dist/shared/sdd/index.js +2 -0
- package/dist/telemetry/config.d.ts +2 -1
- package/dist/telemetry/config.js +17 -8
- package/dist/telemetry/index.d.ts +10 -2
- package/dist/telemetry/index.js +40 -7
- package/dist/ui/ascii-patterns.d.ts +2 -2
- package/dist/ui/ascii-patterns.js +2 -2
- package/dist/ui/welcome-screen.js +2 -2
- package/dist/utils/change-metadata.d.ts +4 -4
- package/dist/utils/change-metadata.js +6 -6
- package/dist/utils/change-utils.d.ts +3 -3
- package/dist/utils/change-utils.js +5 -5
- package/dist/utils/file-system.js +1 -1
- package/dist/utils/interactive.js +1 -1
- package/dist/utils/item-discovery.js +4 -4
- package/dist/utils/legacy-spec-compat.d.ts +2 -0
- package/dist/utils/legacy-spec-compat.js +2 -0
- package/dist/utils/shell-detection.d.ts +1 -0
- package/dist/utils/shell-detection.js +16 -0
- package/package.json +34 -21
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +280 -3
- package/schemas/sdd/3-tasks.schema.json +73 -1
- package/schemas/sdd/4-changelog.schema.json +1 -1
- package/schemas/sdd/5-quality.schema.json +701 -5
- package/schemas/sdd/adr.schema.json +148 -0
- package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
- package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
- package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
- package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
- package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
- package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
- package/schemas/sdd/codesdd-plugin.schema.json +645 -0
- package/schemas/sdd/debate.schema.json +244 -0
- package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
- package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
- package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
- package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
- package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
- package/schemas/sdd/deepagent-run-request.schema.json +637 -0
- package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
- package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
- package/schemas/sdd/discarded.schema.json +127 -0
- package/schemas/sdd/epic.schema.json +147 -0
- package/schemas/sdd/insight.schema.json +136 -0
- package/schemas/sdd/parallel-feat-automation-plan.schema.json +304 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
- package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +259 -0
- package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
- package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
- package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
- package/schemas/sdd/plugin-evidence-manifest.schema.json +678 -0
- package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
- package/schemas/sdd/plugin-package-governance.schema.json +74 -0
- package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
- package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
- package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
- package/schemas/sdd/plugin-registry.schema.json +729 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +954 -0
- package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
- package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
- package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
- package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
- package/schemas/sdd/quality-evidence-bundle.schema.json +1337 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
- package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
- package/schemas/sdd/workspace-catalog.schema.json +13232 -35
- package/schemas/spec-driven/schema.yaml +4 -4
- package/schemas/spec-driven/templates/proposal.md +1 -1
- package/dist/utils/openspec-compat.d.ts +0 -2
- package/dist/utils/openspec-compat.js +0 -2
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { type StructuralDiagnosticReport, type StructuralSanitizerReport, type StructuralSanitizerTransactionManifest } from './structural-health.js';
|
|
1
|
+
import { type StructuralDiagnosticReport, type StructuralSanitizerReport, type StructuralSanitizerTransactionManifest, type StructuralSanitizerTransactionOperation } from './structural-health.js';
|
|
2
|
+
export type Finding = StructuralDiagnosticReport['findings'][number];
|
|
3
|
+
export type SanitizerAction = StructuralSanitizerReport['actions'][number];
|
|
2
4
|
export interface SddSanitizeCommandOptions {
|
|
3
5
|
dryRun?: boolean;
|
|
4
6
|
apply?: boolean;
|
|
@@ -27,6 +29,33 @@ export declare class SddSanitizeOptionsError extends Error {
|
|
|
27
29
|
export declare class SddSanitizeApplyError extends Error {
|
|
28
30
|
constructor(message: string);
|
|
29
31
|
}
|
|
32
|
+
export declare function actionToken(input: string): string;
|
|
33
|
+
export declare function createSourceReportId(report: StructuralDiagnosticReport): string;
|
|
34
|
+
export declare function isInsidePath(rootPath: string, candidatePath: string): boolean;
|
|
35
|
+
export declare function toAuditTimestampToken(value?: Date): string;
|
|
36
|
+
export declare function createTransactionId(sourceReportId: string, value?: Date): string;
|
|
37
|
+
export declare function pathExists(targetPath: string): Promise<boolean>;
|
|
38
|
+
export declare function hashPath(targetPath: string): Promise<string | undefined>;
|
|
39
|
+
export declare function resolveInSddRoot(projectRoot: string, memoryRoot: string, candidatePath: string, label: string): Promise<string>;
|
|
40
|
+
export declare function transactionDirs(projectRoot: string, transactionId: string): {
|
|
41
|
+
sanitizeRoot: string;
|
|
42
|
+
backupRoot: string;
|
|
43
|
+
manifestPath: string;
|
|
44
|
+
auditLogPath: string;
|
|
45
|
+
};
|
|
46
|
+
export declare function backupPath(targetPath: string, backupRoot: string): Promise<string | undefined>;
|
|
47
|
+
export declare function removePathSafely(targetPath: string): Promise<void>;
|
|
48
|
+
export declare function toLifecycleTargetPath(finding: Finding): string | undefined;
|
|
49
|
+
export declare function toQuarantinePath(location?: string): string | undefined;
|
|
50
|
+
export declare function toWorkspaceBackupPath(location?: string): string | undefined;
|
|
51
|
+
export declare function inferOperation(finding: Finding): SanitizerAction['operation'];
|
|
52
|
+
export declare function makeActionFromFinding(finding: Finding, index: number): SanitizerAction;
|
|
53
|
+
export declare function buildSanitizerDryRunReport(report: StructuralDiagnosticReport): StructuralSanitizerReport;
|
|
54
|
+
export declare function manifestSummary(operations: StructuralSanitizerTransactionOperation[]): StructuralSanitizerTransactionManifest['summary'];
|
|
55
|
+
export declare function writeAuditLog(auditLogPath: string, lines: Array<Record<string, unknown>>): Promise<void>;
|
|
56
|
+
export declare function rollbackOperation(projectRoot: string, memoryRoot: string, rollback: StructuralSanitizerTransactionOperation['rollback']): Promise<void>;
|
|
57
|
+
export declare function applySanitizerPlan(projectRoot: string, source: 'diagnose' | 'report', diagnosticReport: StructuralDiagnosticReport, dryRunReport: StructuralSanitizerReport): Promise<SddSanitizeResult>;
|
|
58
|
+
export declare function loadDiagnosticReportFromFile(projectRoot: string, reportPath: string): Promise<StructuralDiagnosticReport>;
|
|
30
59
|
export declare function formatSanitizerText(report: StructuralSanitizerReport): string;
|
|
31
60
|
export declare class SddSanitizeCommand {
|
|
32
61
|
execute(projectRoot: string, options?: SddSanitizeCommandOptions): Promise<SddSanitizeResult>;
|
|
@@ -19,11 +19,11 @@ export class SddSanitizeApplyError extends Error {
|
|
|
19
19
|
this.name = 'SddSanitizeApplyError';
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
function actionToken(input) {
|
|
22
|
+
export function actionToken(input) {
|
|
23
23
|
const normalized = input.toUpperCase().replace(/[^A-Z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
24
24
|
return normalized.length > 0 ? normalized : 'GENERIC';
|
|
25
25
|
}
|
|
26
|
-
function createSourceReportId(report) {
|
|
26
|
+
export function createSourceReportId(report) {
|
|
27
27
|
const digest = createHash('sha1')
|
|
28
28
|
.update(JSON.stringify({
|
|
29
29
|
root_path: report.root_path,
|
|
@@ -43,19 +43,19 @@ function createSourceReportId(report) {
|
|
|
43
43
|
.toUpperCase();
|
|
44
44
|
return `SH-REPORT-${digest}`;
|
|
45
45
|
}
|
|
46
|
-
function isInsidePath(rootPath, candidatePath) {
|
|
46
|
+
export function isInsidePath(rootPath, candidatePath) {
|
|
47
47
|
const relative = path.relative(rootPath, candidatePath);
|
|
48
48
|
return relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
49
49
|
}
|
|
50
|
-
function toAuditTimestampToken(value = new Date()) {
|
|
50
|
+
export function toAuditTimestampToken(value = new Date()) {
|
|
51
51
|
return value.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z');
|
|
52
52
|
}
|
|
53
|
-
function createTransactionId(sourceReportId, value = new Date()) {
|
|
53
|
+
export function createTransactionId(sourceReportId, value = new Date()) {
|
|
54
54
|
const timestamp = toAuditTimestampToken(value);
|
|
55
55
|
const suffix = createHash('sha1').update(`${sourceReportId}:${value.toISOString()}`).digest('hex').slice(0, 8).toUpperCase();
|
|
56
56
|
return `SAN-${timestamp}-${suffix}`;
|
|
57
57
|
}
|
|
58
|
-
async function pathExists(targetPath) {
|
|
58
|
+
export async function pathExists(targetPath) {
|
|
59
59
|
try {
|
|
60
60
|
await lstat(targetPath);
|
|
61
61
|
return true;
|
|
@@ -64,7 +64,7 @@ async function pathExists(targetPath) {
|
|
|
64
64
|
return false;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
async function hashPath(targetPath) {
|
|
67
|
+
export async function hashPath(targetPath) {
|
|
68
68
|
let stat;
|
|
69
69
|
try {
|
|
70
70
|
stat = await lstat(targetPath);
|
|
@@ -88,7 +88,7 @@ async function hashPath(targetPath) {
|
|
|
88
88
|
}
|
|
89
89
|
return `other:${stat.mode}`;
|
|
90
90
|
}
|
|
91
|
-
async function resolveInSddRoot(projectRoot, memoryRoot, candidatePath, label) {
|
|
91
|
+
export async function resolveInSddRoot(projectRoot, memoryRoot, candidatePath, label) {
|
|
92
92
|
try {
|
|
93
93
|
return await RootResolver.verifyRealpathContainment(projectRoot, memoryRoot, candidatePath, label);
|
|
94
94
|
}
|
|
@@ -99,7 +99,7 @@ async function resolveInSddRoot(projectRoot, memoryRoot, candidatePath, label) {
|
|
|
99
99
|
throw error;
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
function transactionDirs(projectRoot, transactionId) {
|
|
102
|
+
export function transactionDirs(projectRoot, transactionId) {
|
|
103
103
|
const sanitizeRoot = path.resolve(projectRoot, '.sdd', 'reports', 'sanitize');
|
|
104
104
|
const backupRoot = path.join(sanitizeRoot, transactionId, 'backups');
|
|
105
105
|
return {
|
|
@@ -109,7 +109,7 @@ function transactionDirs(projectRoot, transactionId) {
|
|
|
109
109
|
auditLogPath: path.join(sanitizeRoot, `${transactionId}-audit.jsonl`),
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
|
-
async function backupPath(targetPath, backupRoot) {
|
|
112
|
+
export async function backupPath(targetPath, backupRoot) {
|
|
113
113
|
if (!(await pathExists(targetPath)))
|
|
114
114
|
return undefined;
|
|
115
115
|
const suffix = createHash('sha1').update(targetPath).digest('hex').slice(0, 10);
|
|
@@ -118,7 +118,7 @@ async function backupPath(targetPath, backupRoot) {
|
|
|
118
118
|
await cp(targetPath, backupPathResolved, { recursive: true });
|
|
119
119
|
return backupPathResolved;
|
|
120
120
|
}
|
|
121
|
-
async function removePathSafely(targetPath) {
|
|
121
|
+
export async function removePathSafely(targetPath) {
|
|
122
122
|
const stat = await lstat(targetPath).catch(() => null);
|
|
123
123
|
if (!stat)
|
|
124
124
|
return;
|
|
@@ -128,7 +128,7 @@ async function removePathSafely(targetPath) {
|
|
|
128
128
|
}
|
|
129
129
|
await unlink(targetPath);
|
|
130
130
|
}
|
|
131
|
-
function toLifecycleTargetPath(finding) {
|
|
131
|
+
export function toLifecycleTargetPath(finding) {
|
|
132
132
|
const evidence = finding.evidence;
|
|
133
133
|
const expectedRoot = typeof evidence.expected_root === 'string' ? evidence.expected_root : undefined;
|
|
134
134
|
const itemId = typeof evidence.id === 'string' ? evidence.id : undefined;
|
|
@@ -143,19 +143,19 @@ function toLifecycleTargetPath(finding) {
|
|
|
143
143
|
}
|
|
144
144
|
return undefined;
|
|
145
145
|
}
|
|
146
|
-
function toQuarantinePath(location) {
|
|
146
|
+
export function toQuarantinePath(location) {
|
|
147
147
|
if (!location)
|
|
148
148
|
return undefined;
|
|
149
149
|
const baseName = path.posix.basename(location);
|
|
150
150
|
return path.posix.join('.sdd', 'quarantine', baseName);
|
|
151
151
|
}
|
|
152
|
-
function toWorkspaceBackupPath(location) {
|
|
152
|
+
export function toWorkspaceBackupPath(location) {
|
|
153
153
|
if (!location)
|
|
154
154
|
return undefined;
|
|
155
155
|
const normalized = location.replace(/\\/g, '/').replace(/^\.sdd\//, '');
|
|
156
156
|
return path.posix.join('.sdd', 'backup', normalized);
|
|
157
157
|
}
|
|
158
|
-
function inferOperation(finding) {
|
|
158
|
+
export function inferOperation(finding) {
|
|
159
159
|
switch (finding.rule_id) {
|
|
160
160
|
case 'SH-RULE-MISSING-DIRECTORY':
|
|
161
161
|
return 'mkdir';
|
|
@@ -179,7 +179,7 @@ function inferOperation(finding) {
|
|
|
179
179
|
return 'manual_review';
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
|
-
function makeActionFromFinding(finding, index) {
|
|
182
|
+
export function makeActionFromFinding(finding, index) {
|
|
183
183
|
const operation = inferOperation(finding);
|
|
184
184
|
const actionId = `SH-ACTION-${actionToken(finding.finding_id)}-${actionToken(operation)}-${index + 1}`;
|
|
185
185
|
const candidate = {
|
|
@@ -216,7 +216,7 @@ function makeActionFromFinding(finding, index) {
|
|
|
216
216
|
const id = typeof evidence.id === 'string' ? evidence.id : undefined;
|
|
217
217
|
const hasLegacyMarkdown = evidence.has_legacy_markdown === true;
|
|
218
218
|
candidate.notes = hasLegacyMarkdown && id
|
|
219
|
-
? `${candidate.notes} Suggested migration:
|
|
219
|
+
? `${candidate.notes} Suggested migration: codesdd sdd migrate-workspace --feat ${id}.`
|
|
220
220
|
: `${candidate.notes} Suggested repair: manually edit the YAML to satisfy the workspace schema.`;
|
|
221
221
|
}
|
|
222
222
|
if (finding.rule_id === 'SH-RULE-LIFECYCLE-VIOLATION') {
|
|
@@ -233,7 +233,7 @@ function makeActionFromFinding(finding, index) {
|
|
|
233
233
|
}
|
|
234
234
|
return StructuralSanitizerActionSchema.parse(candidate);
|
|
235
235
|
}
|
|
236
|
-
function buildSanitizerDryRunReport(report) {
|
|
236
|
+
export function buildSanitizerDryRunReport(report) {
|
|
237
237
|
const actions = [];
|
|
238
238
|
const blockedActions = [];
|
|
239
239
|
report.findings.forEach((finding, index) => {
|
|
@@ -253,7 +253,7 @@ function buildSanitizerDryRunReport(report) {
|
|
|
253
253
|
blocked_actions: blockedActions,
|
|
254
254
|
});
|
|
255
255
|
}
|
|
256
|
-
function manifestSummary(operations) {
|
|
256
|
+
export function manifestSummary(operations) {
|
|
257
257
|
return {
|
|
258
258
|
applied: operations.filter((item) => item.status === 'applied').length,
|
|
259
259
|
skipped: operations.filter((item) => item.status === 'skipped').length,
|
|
@@ -261,7 +261,7 @@ function manifestSummary(operations) {
|
|
|
261
261
|
rolled_back: operations.filter((item) => item.status === 'rolled_back').length,
|
|
262
262
|
};
|
|
263
263
|
}
|
|
264
|
-
async function writeAuditLog(auditLogPath, lines) {
|
|
264
|
+
export async function writeAuditLog(auditLogPath, lines) {
|
|
265
265
|
await mkdir(path.dirname(auditLogPath), { recursive: true });
|
|
266
266
|
if (lines.length === 0) {
|
|
267
267
|
await writeFile(auditLogPath, '', 'utf-8');
|
|
@@ -270,7 +270,7 @@ async function writeAuditLog(auditLogPath, lines) {
|
|
|
270
270
|
const payload = `${lines.map((line) => JSON.stringify(line)).join('\n')}\n`;
|
|
271
271
|
await writeFile(auditLogPath, payload, 'utf-8');
|
|
272
272
|
}
|
|
273
|
-
async function rollbackOperation(projectRoot, memoryRoot, rollback) {
|
|
273
|
+
export async function rollbackOperation(projectRoot, memoryRoot, rollback) {
|
|
274
274
|
const operation = StructuralSanitizerRollbackOperationSchema.parse(rollback);
|
|
275
275
|
if (operation.operation === 'noop')
|
|
276
276
|
return;
|
|
@@ -302,7 +302,7 @@ async function rollbackOperation(projectRoot, memoryRoot, rollback) {
|
|
|
302
302
|
await cp(backup, target, { recursive: true });
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
|
-
async function applySanitizerPlan(projectRoot, source, diagnosticReport, dryRunReport) {
|
|
305
|
+
export async function applySanitizerPlan(projectRoot, source, diagnosticReport, dryRunReport) {
|
|
306
306
|
const config = await loadProjectSddConfig(projectRoot);
|
|
307
307
|
const paths = resolveSddPaths(path.resolve(projectRoot), config);
|
|
308
308
|
const transactionId = createTransactionId(dryRunReport.source_report_id);
|
|
@@ -581,7 +581,7 @@ async function applySanitizerPlan(projectRoot, source, diagnosticReport, dryRunR
|
|
|
581
581
|
transaction: manifest,
|
|
582
582
|
};
|
|
583
583
|
}
|
|
584
|
-
async function loadDiagnosticReportFromFile(projectRoot, reportPath) {
|
|
584
|
+
export async function loadDiagnosticReportFromFile(projectRoot, reportPath) {
|
|
585
585
|
const absolutePath = path.resolve(projectRoot, reportPath);
|
|
586
586
|
let raw;
|
|
587
587
|
try {
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const sdkAgentPluginCoverageScopeSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
label: z.ZodString;
|
|
5
|
+
metrics: z.ZodObject<{
|
|
6
|
+
statements: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
branches: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
functions: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
lines: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
target: z.ZodOptional<z.ZodObject<{
|
|
12
|
+
statements: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
branches: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
functions: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
lines: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export declare const sdkAgentPluginQualityGateInputSchema: z.ZodObject<{
|
|
19
|
+
schema_version: z.ZodDefault<z.ZodLiteral<1>>;
|
|
20
|
+
generated_at: z.ZodString;
|
|
21
|
+
feature_ref: z.ZodOptional<z.ZodString>;
|
|
22
|
+
package_governance: z.ZodOptional<z.ZodUnknown>;
|
|
23
|
+
language_runtime: z.ZodOptional<z.ZodUnknown>;
|
|
24
|
+
artifact_map: z.ZodOptional<z.ZodUnknown>;
|
|
25
|
+
agent_runtime_plans: z.ZodDefault<z.ZodArray<z.ZodUnknown>>;
|
|
26
|
+
plugin_compliance_indexes: z.ZodDefault<z.ZodArray<z.ZodUnknown>>;
|
|
27
|
+
coverage_scopes: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
28
|
+
id: z.ZodString;
|
|
29
|
+
label: z.ZodString;
|
|
30
|
+
metrics: z.ZodObject<{
|
|
31
|
+
statements: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
branches: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
functions: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
lines: z.ZodOptional<z.ZodNumber>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
target: z.ZodOptional<z.ZodObject<{
|
|
37
|
+
statements: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
branches: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
functions: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
lines: z.ZodOptional<z.ZodNumber>;
|
|
41
|
+
}, z.core.$strip>>;
|
|
42
|
+
}, z.core.$strip>>>;
|
|
43
|
+
required_agent_providers: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
44
|
+
codex: "codex";
|
|
45
|
+
opencode: "opencode";
|
|
46
|
+
deepagents: "deepagents";
|
|
47
|
+
}>>>;
|
|
48
|
+
coverage_target: z.ZodDefault<z.ZodObject<{
|
|
49
|
+
statements: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
branches: z.ZodOptional<z.ZodNumber>;
|
|
51
|
+
functions: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
lines: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
}, z.core.$strip>>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
export declare const sdkAgentPluginQualityGateIssueSchema: z.ZodObject<{
|
|
56
|
+
code: z.ZodString;
|
|
57
|
+
severity: z.ZodEnum<{
|
|
58
|
+
fail: "fail";
|
|
59
|
+
warn: "warn";
|
|
60
|
+
}>;
|
|
61
|
+
message: z.ZodString;
|
|
62
|
+
remediation: z.ZodString;
|
|
63
|
+
path: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export declare const sdkAgentPluginQualityGateSchema: z.ZodObject<{
|
|
66
|
+
id: z.ZodString;
|
|
67
|
+
domain: z.ZodEnum<{
|
|
68
|
+
coverage: "coverage";
|
|
69
|
+
"agent-runtime": "agent-runtime";
|
|
70
|
+
"plugin-sdk": "plugin-sdk";
|
|
71
|
+
"plugin-compliance": "plugin-compliance";
|
|
72
|
+
"foundation-architecture": "foundation-architecture";
|
|
73
|
+
}>;
|
|
74
|
+
status: z.ZodEnum<{
|
|
75
|
+
pass: "pass";
|
|
76
|
+
fail: "fail";
|
|
77
|
+
warn: "warn";
|
|
78
|
+
}>;
|
|
79
|
+
severity: z.ZodEnum<{
|
|
80
|
+
info: "info";
|
|
81
|
+
fail: "fail";
|
|
82
|
+
warn: "warn";
|
|
83
|
+
}>;
|
|
84
|
+
evidence: z.ZodString;
|
|
85
|
+
issues: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
86
|
+
code: z.ZodString;
|
|
87
|
+
severity: z.ZodEnum<{
|
|
88
|
+
fail: "fail";
|
|
89
|
+
warn: "warn";
|
|
90
|
+
}>;
|
|
91
|
+
message: z.ZodString;
|
|
92
|
+
remediation: z.ZodString;
|
|
93
|
+
path: z.ZodOptional<z.ZodString>;
|
|
94
|
+
}, z.core.$strip>>>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
export declare const sdkAgentPluginQualityGateReportSchema: z.ZodObject<{
|
|
97
|
+
schema_version: z.ZodLiteral<1>;
|
|
98
|
+
generated_at: z.ZodString;
|
|
99
|
+
feature_ref: z.ZodOptional<z.ZodString>;
|
|
100
|
+
decision: z.ZodEnum<{
|
|
101
|
+
warning: "warning";
|
|
102
|
+
failed: "failed";
|
|
103
|
+
passed: "passed";
|
|
104
|
+
}>;
|
|
105
|
+
summary: z.ZodObject<{
|
|
106
|
+
total: z.ZodNumber;
|
|
107
|
+
passed: z.ZodNumber;
|
|
108
|
+
warned: z.ZodNumber;
|
|
109
|
+
failed: z.ZodNumber;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
gates: z.ZodArray<z.ZodObject<{
|
|
112
|
+
id: z.ZodString;
|
|
113
|
+
domain: z.ZodEnum<{
|
|
114
|
+
coverage: "coverage";
|
|
115
|
+
"agent-runtime": "agent-runtime";
|
|
116
|
+
"plugin-sdk": "plugin-sdk";
|
|
117
|
+
"plugin-compliance": "plugin-compliance";
|
|
118
|
+
"foundation-architecture": "foundation-architecture";
|
|
119
|
+
}>;
|
|
120
|
+
status: z.ZodEnum<{
|
|
121
|
+
pass: "pass";
|
|
122
|
+
fail: "fail";
|
|
123
|
+
warn: "warn";
|
|
124
|
+
}>;
|
|
125
|
+
severity: z.ZodEnum<{
|
|
126
|
+
info: "info";
|
|
127
|
+
fail: "fail";
|
|
128
|
+
warn: "warn";
|
|
129
|
+
}>;
|
|
130
|
+
evidence: z.ZodString;
|
|
131
|
+
issues: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
132
|
+
code: z.ZodString;
|
|
133
|
+
severity: z.ZodEnum<{
|
|
134
|
+
fail: "fail";
|
|
135
|
+
warn: "warn";
|
|
136
|
+
}>;
|
|
137
|
+
message: z.ZodString;
|
|
138
|
+
remediation: z.ZodString;
|
|
139
|
+
path: z.ZodOptional<z.ZodString>;
|
|
140
|
+
}, z.core.$strip>>>;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
}, z.core.$strip>;
|
|
143
|
+
export type SdkAgentPluginCoverageScope = z.infer<typeof sdkAgentPluginCoverageScopeSchema>;
|
|
144
|
+
export type SdkAgentPluginQualityGateInput = z.input<typeof sdkAgentPluginQualityGateInputSchema>;
|
|
145
|
+
export type SdkAgentPluginQualityGateIssue = z.infer<typeof sdkAgentPluginQualityGateIssueSchema>;
|
|
146
|
+
export type SdkAgentPluginQualityGate = z.infer<typeof sdkAgentPluginQualityGateSchema>;
|
|
147
|
+
export type SdkAgentPluginQualityGateReport = z.infer<typeof sdkAgentPluginQualityGateReportSchema>;
|
|
148
|
+
export declare function buildSdkAgentPluginQualityGateReport(value: SdkAgentPluginQualityGateInput): SdkAgentPluginQualityGateReport;
|
|
149
|
+
export declare function buildSdkAgentPluginQualityGateJsonSchemas(): Record<string, unknown>;
|
|
150
|
+
//# sourceMappingURL=sdk-agent-plugin-quality-gates.d.ts.map
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { toJSONSchema, z } from 'zod';
|
|
2
|
+
import { agentRuntimeCommandPlanSchema, agentRuntimeProviderSchema, } from './agent-runtime-contract.js';
|
|
3
|
+
import { validateFoundationArtifactMapArchitecture } from './foundation-artifact-map-validator.js';
|
|
4
|
+
import { pluginComplianceIndexSchema } from './plugin-evidence.js';
|
|
5
|
+
import { pluginArtifactMapSchema, pluginLanguageRuntimeSchema, pluginPackageGovernanceSchema, } from './plugin-sdk-contract.js';
|
|
6
|
+
const JSON_SCHEMA_DRAFT = 'https://json-schema.org/draft/2020-12/schema';
|
|
7
|
+
const FEATURE_REF_PATTERN = /^FEAT-\d{4}$/;
|
|
8
|
+
const ISSUE_CODE_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
9
|
+
const coverageMetricsSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
statements: z.number().min(0).max(100).optional(),
|
|
12
|
+
branches: z.number().min(0).max(100).optional(),
|
|
13
|
+
functions: z.number().min(0).max(100).optional(),
|
|
14
|
+
lines: z.number().min(0).max(100).optional(),
|
|
15
|
+
})
|
|
16
|
+
.refine((metrics) => Object.keys(metrics).length > 0, {
|
|
17
|
+
message: 'At least one coverage metric is required.',
|
|
18
|
+
});
|
|
19
|
+
export const sdkAgentPluginCoverageScopeSchema = z.object({
|
|
20
|
+
id: z.string().min(1),
|
|
21
|
+
label: z.string().min(1),
|
|
22
|
+
metrics: coverageMetricsSchema,
|
|
23
|
+
target: coverageMetricsSchema.optional(),
|
|
24
|
+
});
|
|
25
|
+
export const sdkAgentPluginQualityGateInputSchema = z.object({
|
|
26
|
+
schema_version: z.literal(1).default(1),
|
|
27
|
+
generated_at: z.string().datetime(),
|
|
28
|
+
feature_ref: z.string().regex(FEATURE_REF_PATTERN).optional(),
|
|
29
|
+
package_governance: z.unknown().optional(),
|
|
30
|
+
language_runtime: z.unknown().optional(),
|
|
31
|
+
artifact_map: z.unknown().optional(),
|
|
32
|
+
agent_runtime_plans: z.array(z.unknown()).default([]),
|
|
33
|
+
plugin_compliance_indexes: z.array(z.unknown()).default([]),
|
|
34
|
+
coverage_scopes: z.array(sdkAgentPluginCoverageScopeSchema).default([]),
|
|
35
|
+
required_agent_providers: z.array(agentRuntimeProviderSchema).default(['deepagents', 'codex', 'opencode']),
|
|
36
|
+
coverage_target: coverageMetricsSchema.default({
|
|
37
|
+
statements: 95,
|
|
38
|
+
branches: 85,
|
|
39
|
+
functions: 95,
|
|
40
|
+
lines: 95,
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
export const sdkAgentPluginQualityGateIssueSchema = z.object({
|
|
44
|
+
code: z.string().regex(ISSUE_CODE_PATTERN),
|
|
45
|
+
severity: z.enum(['warn', 'fail']),
|
|
46
|
+
message: z.string().min(1),
|
|
47
|
+
remediation: z.string().min(1),
|
|
48
|
+
path: z.string().min(1).optional(),
|
|
49
|
+
});
|
|
50
|
+
export const sdkAgentPluginQualityGateSchema = z.object({
|
|
51
|
+
id: z.string().min(1),
|
|
52
|
+
domain: z.enum([
|
|
53
|
+
'plugin-sdk',
|
|
54
|
+
'agent-runtime',
|
|
55
|
+
'plugin-compliance',
|
|
56
|
+
'foundation-architecture',
|
|
57
|
+
'coverage',
|
|
58
|
+
]),
|
|
59
|
+
status: z.enum(['pass', 'warn', 'fail']),
|
|
60
|
+
severity: z.enum(['info', 'warn', 'fail']),
|
|
61
|
+
evidence: z.string().min(1),
|
|
62
|
+
issues: z.array(sdkAgentPluginQualityGateIssueSchema).default([]),
|
|
63
|
+
});
|
|
64
|
+
export const sdkAgentPluginQualityGateReportSchema = z.object({
|
|
65
|
+
schema_version: z.literal(1),
|
|
66
|
+
generated_at: z.string().datetime(),
|
|
67
|
+
feature_ref: z.string().regex(FEATURE_REF_PATTERN).optional(),
|
|
68
|
+
decision: z.enum(['passed', 'warning', 'failed']),
|
|
69
|
+
summary: z.object({
|
|
70
|
+
total: z.number().int().nonnegative(),
|
|
71
|
+
passed: z.number().int().nonnegative(),
|
|
72
|
+
warned: z.number().int().nonnegative(),
|
|
73
|
+
failed: z.number().int().nonnegative(),
|
|
74
|
+
}),
|
|
75
|
+
gates: z.array(sdkAgentPluginQualityGateSchema).min(1),
|
|
76
|
+
});
|
|
77
|
+
const COVERAGE_METRICS = ['statements', 'branches', 'functions', 'lines'];
|
|
78
|
+
export function buildSdkAgentPluginQualityGateReport(value) {
|
|
79
|
+
const input = sdkAgentPluginQualityGateInputSchema.parse(value);
|
|
80
|
+
const gates = [
|
|
81
|
+
packageGovernanceGate(input.package_governance),
|
|
82
|
+
languageRuntimeGate(input.language_runtime),
|
|
83
|
+
artifactMapGate(input.artifact_map),
|
|
84
|
+
agentRuntimeGate(input.agent_runtime_plans, input.required_agent_providers),
|
|
85
|
+
pluginComplianceGate(input.plugin_compliance_indexes),
|
|
86
|
+
coverageGate(input.coverage_scopes, input.coverage_target),
|
|
87
|
+
];
|
|
88
|
+
const summary = {
|
|
89
|
+
total: gates.length,
|
|
90
|
+
passed: gates.filter((gate) => gate.status === 'pass').length,
|
|
91
|
+
warned: gates.filter((gate) => gate.status === 'warn').length,
|
|
92
|
+
failed: gates.filter((gate) => gate.status === 'fail').length,
|
|
93
|
+
};
|
|
94
|
+
return sdkAgentPluginQualityGateReportSchema.parse({
|
|
95
|
+
schema_version: 1,
|
|
96
|
+
generated_at: input.generated_at,
|
|
97
|
+
feature_ref: input.feature_ref,
|
|
98
|
+
decision: summary.failed > 0 ? 'failed' : summary.warned > 0 ? 'warning' : 'passed',
|
|
99
|
+
summary,
|
|
100
|
+
gates,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function buildSdkAgentPluginQualityGateJsonSchemas() {
|
|
104
|
+
return {
|
|
105
|
+
'sdk-agent-plugin-quality-gate-input.yaml': normalizeJsonSchema(sdkAgentPluginQualityGateInputSchema, 'CodeSDD SDK Agent Plugin Quality Gate Input', 'Input contract for validating plugin SDK, agent runtime, plugin compliance, Foundation artifact map, and coverage evidence together.'),
|
|
106
|
+
'sdk-agent-plugin-quality-gate-report.yaml': normalizeJsonSchema(sdkAgentPluginQualityGateReportSchema, 'CodeSDD SDK Agent Plugin Quality Gate Report', 'Machine-readable quality gate report for SDK contracts, agent runtimes, plugin compliance indexes, Foundation artifact maps, and coverage scopes.'),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function packageGovernanceGate(value) {
|
|
110
|
+
if (value === undefined) {
|
|
111
|
+
return gate('plugin-sdk.package-governance', 'plugin-sdk', [
|
|
112
|
+
issue('SDK_PACKAGE_GOVERNANCE_MISSING', 'fail', 'Plugin package governance evidence is missing.', 'Attach package_governance from @devtrack-solution/codesdd-plugin-sdk before accepting the plugin package.'),
|
|
113
|
+
], 'No package governance evidence was provided.');
|
|
114
|
+
}
|
|
115
|
+
const parsed = pluginPackageGovernanceSchema.safeParse(value);
|
|
116
|
+
if (!parsed.success) {
|
|
117
|
+
return gate('plugin-sdk.package-governance', 'plugin-sdk', [
|
|
118
|
+
issue('SDK_PACKAGE_GOVERNANCE_INVALID', 'fail', `Package governance failed validation: ${formatIssues(parsed.error.issues)}`, 'Use the @devtrack-solution/codesdd-plugin-* package prefix, SemVer, package kind, and required discovery keywords.'),
|
|
119
|
+
], 'Package governance evidence failed SDK validation.');
|
|
120
|
+
}
|
|
121
|
+
return gate('plugin-sdk.package-governance', 'plugin-sdk', [], `Package governance passed for ${parsed.data.package_name}.`);
|
|
122
|
+
}
|
|
123
|
+
function languageRuntimeGate(value) {
|
|
124
|
+
if (value === undefined) {
|
|
125
|
+
return gate('plugin-sdk.language-runtime', 'plugin-sdk', [
|
|
126
|
+
issue('SDK_LANGUAGE_RUNTIME_MISSING', 'fail', 'Plugin language runtime evidence is missing.', 'Declare language_runtime with bridge and transport metadata before planning standalone plugin execution.'),
|
|
127
|
+
], 'No language runtime evidence was provided.');
|
|
128
|
+
}
|
|
129
|
+
const parsed = pluginLanguageRuntimeSchema.safeParse(value);
|
|
130
|
+
if (!parsed.success) {
|
|
131
|
+
return gate('plugin-sdk.language-runtime', 'plugin-sdk', [
|
|
132
|
+
issue('SDK_LANGUAGE_RUNTIME_INVALID', 'fail', `Language runtime failed validation: ${formatIssues(parsed.error.issues)}`, 'Use a valid bridge for the plugin language and declare commands for process-backed runtimes.'),
|
|
133
|
+
], 'Language runtime evidence failed SDK validation.');
|
|
134
|
+
}
|
|
135
|
+
return gate('plugin-sdk.language-runtime', 'plugin-sdk', [], `Language runtime passed for ${parsed.data.language} through ${parsed.data.bridge}.`);
|
|
136
|
+
}
|
|
137
|
+
function artifactMapGate(value) {
|
|
138
|
+
if (value === undefined) {
|
|
139
|
+
return gate('foundation.artifact-map', 'foundation-architecture', [
|
|
140
|
+
issue('SDK_ARTIFACT_MAP_MISSING', 'fail', 'Plugin artifact map evidence is missing.', 'Attach a typed artifact map before accepting generated or modified project files.'),
|
|
141
|
+
], 'No artifact map evidence was provided.');
|
|
142
|
+
}
|
|
143
|
+
const sdkParsed = pluginArtifactMapSchema.safeParse(value);
|
|
144
|
+
if (!sdkParsed.success) {
|
|
145
|
+
return gate('foundation.artifact-map', 'foundation-architecture', [
|
|
146
|
+
issue('SDK_ARTIFACT_MAP_INVALID', 'fail', `Artifact map failed SDK validation: ${formatIssues(sdkParsed.error.issues)}`, 'Validate artifact maps with the CodeSDD plugin SDK before Foundation architecture checks run.'),
|
|
147
|
+
], 'Artifact map failed SDK schema validation.');
|
|
148
|
+
}
|
|
149
|
+
const foundation = validateFoundationArtifactMapArchitecture(sdkParsed.data);
|
|
150
|
+
const issues = foundation.findings.map((finding) => issue(finding.code, 'warn', finding.message, finding.remediation, finding.path));
|
|
151
|
+
return gate('foundation.artifact-map', 'foundation-architecture', issues, `Artifact map contains ${sdkParsed.data.artifacts.length} artifacts; Foundation architecture status is ${foundation.status}.`);
|
|
152
|
+
}
|
|
153
|
+
function agentRuntimeGate(values, requiredProviders) {
|
|
154
|
+
const plansByProvider = new Map();
|
|
155
|
+
const issues = [];
|
|
156
|
+
values.forEach((value, index) => {
|
|
157
|
+
const parsed = agentRuntimeCommandPlanSchema.safeParse(value);
|
|
158
|
+
if (!parsed.success) {
|
|
159
|
+
issues.push(issue('AGENT_RUNTIME_PLAN_INVALID', 'fail', `Agent runtime plan at index ${index} failed validation: ${formatIssues(parsed.error.issues)}`, 'Build agent execution through the Agent Runtime v2 command-plan contract.', `agent_runtime_plans.${index}`));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const plan = parsed.data;
|
|
163
|
+
plansByProvider.set(plan.provider, (plansByProvider.get(plan.provider) ?? 0) + 1);
|
|
164
|
+
if (plan.status === 'blocked') {
|
|
165
|
+
issues.push(issue('AGENT_RUNTIME_PLAN_BLOCKED', 'fail', `${plan.provider} plan is blocked: ${plan.reasons.join('; ') || 'no reason provided'}`, 'Resolve runtime policy findings or keep the agent outside executable apply flows.', `agent_runtime_plans.${index}`));
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
for (const provider of requiredProviders) {
|
|
169
|
+
if (!plansByProvider.has(provider)) {
|
|
170
|
+
issues.push(issue('AGENT_RUNTIME_PROVIDER_MISSING', 'fail', `Required agent runtime provider ${provider} has no command plan.`, 'Attach command plans for DeepAgents, Codex exec, and OpenCode run before closing agent-runtime coverage.', provider));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return gate('agent-runtime.v2-command-plans', 'agent-runtime', issues, `Validated ${values.length} agent runtime plans across ${plansByProvider.size} providers.`);
|
|
174
|
+
}
|
|
175
|
+
function pluginComplianceGate(values) {
|
|
176
|
+
const issues = [];
|
|
177
|
+
if (values.length === 0) {
|
|
178
|
+
issues.push(issue('PLUGIN_COMPLIANCE_INDEX_MISSING', 'fail', 'No plugin compliance index was attached.', 'Attach at least one compliance index generated from plugin evidence before accepting plugin quality gates.'));
|
|
179
|
+
}
|
|
180
|
+
values.forEach((value, index) => {
|
|
181
|
+
const parsed = pluginComplianceIndexSchema.safeParse(value);
|
|
182
|
+
if (!parsed.success) {
|
|
183
|
+
issues.push(issue('PLUGIN_COMPLIANCE_INDEX_INVALID', 'fail', `Plugin compliance index at index ${index} failed validation: ${formatIssues(parsed.error.issues)}`, 'Build compliance indexes through the plugin evidence contract.', `plugin_compliance_indexes.${index}`));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (parsed.data.decision === 'non-compliant') {
|
|
187
|
+
issues.push(issue('PLUGIN_COMPLIANCE_NON_COMPLIANT', 'fail', `${parsed.data.plugin_ref.id}@${parsed.data.plugin_ref.version} is non-compliant with score ${parsed.data.score}.`, 'Resolve failing compliance criteria before enabling plugin execution.', `plugin_compliance_indexes.${index}`));
|
|
188
|
+
}
|
|
189
|
+
else if (parsed.data.decision === 'warning') {
|
|
190
|
+
issues.push(issue('PLUGIN_COMPLIANCE_WARNING', 'warn', `${parsed.data.plugin_ref.id}@${parsed.data.plugin_ref.version} has warning compliance with score ${parsed.data.score}.`, 'Record the accepted residual risk or improve plugin evidence before apply modes.', `plugin_compliance_indexes.${index}`));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
return gate('plugin-compliance.indexes', 'plugin-compliance', issues, `Validated ${values.length} plugin compliance indexes.`);
|
|
194
|
+
}
|
|
195
|
+
function coverageGate(scopes, defaultTarget) {
|
|
196
|
+
const issues = [];
|
|
197
|
+
if (scopes.length === 0) {
|
|
198
|
+
issues.push(issue('COVERAGE_SCOPE_MISSING', 'fail', 'No coverage scope evidence was attached.', 'Attach coverage metrics for touched SDK, agent runtime, and plugin modules.'));
|
|
199
|
+
}
|
|
200
|
+
for (const scope of scopes) {
|
|
201
|
+
const target = { ...defaultTarget, ...scope.target };
|
|
202
|
+
for (const metric of COVERAGE_METRICS) {
|
|
203
|
+
const targetValue = target[metric];
|
|
204
|
+
if (targetValue === undefined)
|
|
205
|
+
continue;
|
|
206
|
+
const actual = scope.metrics[metric];
|
|
207
|
+
if (actual === undefined) {
|
|
208
|
+
issues.push(issue('COVERAGE_METRIC_MISSING', 'fail', `Coverage scope ${scope.id} is missing ${metric} coverage.`, `Record ${metric} coverage or remove ${metric} from the scope target.`, scope.id));
|
|
209
|
+
}
|
|
210
|
+
else if (actual < targetValue) {
|
|
211
|
+
issues.push(issue('COVERAGE_TARGET_MISSED', 'fail', `Coverage scope ${scope.id} has ${metric} ${formatPercent(actual)}, below target ${formatPercent(targetValue)}.`, 'Add tests for the touched contract or record a formal CodeSDD exception with compensating controls.', scope.id));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return gate('coverage.touched-contracts', 'coverage', issues, `Validated ${scopes.length} coverage scopes against touched-contract targets.`);
|
|
216
|
+
}
|
|
217
|
+
function gate(id, domain, issues, evidence) {
|
|
218
|
+
const status = issues.some((item) => item.severity === 'fail')
|
|
219
|
+
? 'fail'
|
|
220
|
+
: issues.length > 0
|
|
221
|
+
? 'warn'
|
|
222
|
+
: 'pass';
|
|
223
|
+
return sdkAgentPluginQualityGateSchema.parse({
|
|
224
|
+
id,
|
|
225
|
+
domain,
|
|
226
|
+
status,
|
|
227
|
+
severity: status === 'pass' ? 'info' : status,
|
|
228
|
+
evidence,
|
|
229
|
+
issues,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
function issue(code, severity, message, remediation, path) {
|
|
233
|
+
return sdkAgentPluginQualityGateIssueSchema.parse({
|
|
234
|
+
code,
|
|
235
|
+
severity,
|
|
236
|
+
message,
|
|
237
|
+
remediation,
|
|
238
|
+
path,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function normalizeJsonSchema(schema, title, description) {
|
|
242
|
+
return {
|
|
243
|
+
...toJSONSchema(schema),
|
|
244
|
+
$schema: JSON_SCHEMA_DRAFT,
|
|
245
|
+
title,
|
|
246
|
+
description,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function formatIssues(issues) {
|
|
250
|
+
return issues.map((item) => {
|
|
251
|
+
const issuePath = item.path.length > 0 ? item.path.join('.') : '<root>';
|
|
252
|
+
return `${issuePath}: ${item.message}`;
|
|
253
|
+
}).join('; ');
|
|
254
|
+
}
|
|
255
|
+
function formatPercent(value) {
|
|
256
|
+
return `${value.toFixed(2)} percent`;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=sdk-agent-plugin-quality-gates.js.map
|