@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
package/dist/core/sdd/lenses.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { parseGovernanceFile } from './governance-parser.js';
|
|
2
|
+
import { adrFrontmatterSchema, debateFrontmatterSchema, epicFrontmatterSchema, insightFrontmatterSchema, } from './governance-schemas.js';
|
|
1
3
|
export const LENSES = {
|
|
2
4
|
insight: {
|
|
3
5
|
artifact_type: 'INS',
|
|
4
6
|
name: 'Insight Lens',
|
|
5
7
|
required_sections: ['## Title', '## Description'],
|
|
8
|
+
frontmatter_optional_sections: ['## Title'],
|
|
6
9
|
section_rules: {
|
|
7
10
|
'## Description': { min_length: 100 },
|
|
8
11
|
},
|
|
@@ -23,12 +26,14 @@ export const LENSES = {
|
|
|
23
26
|
'## 8) Quality Contract (Required)',
|
|
24
27
|
'## 9) Output',
|
|
25
28
|
],
|
|
29
|
+
frontmatter_optional_sections: ['- Choice (A/B/C):'],
|
|
26
30
|
forbidden_phrases: ['(fill in', 'Describe the result'],
|
|
27
31
|
},
|
|
28
32
|
epic: {
|
|
29
33
|
artifact_type: 'EPIC',
|
|
30
34
|
name: 'Epic Lens',
|
|
31
35
|
required_sections: ['## Origin', '## Approved Summary', '## Status'],
|
|
36
|
+
frontmatter_optional_sections: ['## Origin', '## Status'],
|
|
32
37
|
forbidden_phrases: ['(fill in approved summary)'],
|
|
33
38
|
},
|
|
34
39
|
adr: {
|
|
@@ -61,8 +66,31 @@ function extractFromLines(lines, startIndex) {
|
|
|
61
66
|
return contentLines.join('\n').trim();
|
|
62
67
|
}
|
|
63
68
|
export function validateDocumentAgainstLens(content, lens) {
|
|
64
|
-
const
|
|
69
|
+
const hasFrontmatter = /^---\r?\n[\s\S]*?\r?\n---\r?\n/.test(content);
|
|
70
|
+
const effectiveSections = hasFrontmatter && lens.frontmatter_optional_sections
|
|
71
|
+
? lens.required_sections.filter((section) => !lens.frontmatter_optional_sections?.includes(section))
|
|
72
|
+
: lens.required_sections;
|
|
73
|
+
const missing = effectiveSections.filter((section) => !content.includes(section));
|
|
65
74
|
const violations = [...missing];
|
|
75
|
+
if (hasFrontmatter) {
|
|
76
|
+
try {
|
|
77
|
+
if (lens.artifact_type === 'INS') {
|
|
78
|
+
parseGovernanceFile('lens-inline-content', content, insightFrontmatterSchema);
|
|
79
|
+
}
|
|
80
|
+
else if (lens.artifact_type === 'DEB') {
|
|
81
|
+
parseGovernanceFile('lens-inline-content', content, debateFrontmatterSchema);
|
|
82
|
+
}
|
|
83
|
+
else if (lens.artifact_type === 'EPIC') {
|
|
84
|
+
parseGovernanceFile('lens-inline-content', content, epicFrontmatterSchema);
|
|
85
|
+
}
|
|
86
|
+
else if (lens.artifact_type === 'ADR') {
|
|
87
|
+
parseGovernanceFile('lens-inline-content', content, adrFrontmatterSchema);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
violations.push(error instanceof Error ? error.message : String(error));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
66
94
|
if (lens.forbidden_phrases) {
|
|
67
95
|
for (const phrase of lens.forbidden_phrases) {
|
|
68
96
|
if (content.includes(phrase)) {
|
|
@@ -2,6 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import { existsSync, promises as fs } from 'node:fs';
|
|
3
3
|
import { stringify as stringifyYaml } from 'yaml';
|
|
4
4
|
import { loadProjectSddConfig, resolveSddPaths } from './state.js';
|
|
5
|
+
import { normalizeFeatRef } from './entity-reference.js';
|
|
5
6
|
import { workspaceChangelogSchema, workspacePlanSchema, workspaceQualitySchema, workspaceSpecSchema, workspaceTasksSchema, } from './workspace-schemas.js';
|
|
6
7
|
const MIGRATION_MARKER = '# MIGRATION: field required but source had no content';
|
|
7
8
|
const CANONICAL_DOCS = [
|
|
@@ -18,9 +19,10 @@ const CANONICAL_DOCS = [
|
|
|
18
19
|
export async function findMarkdownWorkspaceFiles(projectRoot, feat) {
|
|
19
20
|
const config = await loadProjectSddConfig(projectRoot);
|
|
20
21
|
const paths = resolveSddPaths(projectRoot, config);
|
|
22
|
+
const featFilter = feat ? normalizeFeatRef(feat) ?? feat.trim() : undefined;
|
|
21
23
|
const files = [];
|
|
22
24
|
for (const root of [paths.plannedDir, paths.activeDir, paths.archivedDir]) {
|
|
23
|
-
for (const workspace of await listFeatureWorkspaces(root,
|
|
25
|
+
for (const workspace of await listFeatureWorkspaces(root, featFilter)) {
|
|
24
26
|
const entries = await fs.readdir(workspace.path, { withFileTypes: true }).catch(() => []);
|
|
25
27
|
for (const entry of entries) {
|
|
26
28
|
if (!entry.isFile() || path.extname(entry.name) !== '.md')
|
|
@@ -38,13 +40,14 @@ export class MigrateWorkspaceCommand {
|
|
|
38
40
|
const config = await loadProjectSddConfig(projectRoot);
|
|
39
41
|
const paths = resolveSddPaths(projectRoot, config);
|
|
40
42
|
const dryRun = Boolean(options?.dryRun);
|
|
43
|
+
const featFilter = options?.feat ? normalizeFeatRef(options.feat) ?? options.feat.trim() : undefined;
|
|
41
44
|
const features = [];
|
|
42
45
|
for (const [rootName, rootPath] of [
|
|
43
46
|
['planned', paths.plannedDir],
|
|
44
47
|
['active', paths.activeDir],
|
|
45
48
|
['archived', paths.archivedDir],
|
|
46
49
|
]) {
|
|
47
|
-
for (const workspace of await listFeatureWorkspaces(rootPath,
|
|
50
|
+
for (const workspace of await listFeatureWorkspaces(rootPath, featFilter)) {
|
|
48
51
|
const fileResults = [];
|
|
49
52
|
const entries = await fs.readdir(workspace.path, { withFileTypes: true }).catch(() => []);
|
|
50
53
|
for (const entry of entries) {
|
|
@@ -195,6 +198,35 @@ function migratePlan(featureId, parsed) {
|
|
|
195
198
|
const doc = {
|
|
196
199
|
schema_version: 1,
|
|
197
200
|
feature_id: featureId,
|
|
201
|
+
governance: {
|
|
202
|
+
state_boundary: 'codesdd-canonical-sdd-state',
|
|
203
|
+
planning_artifacts: [`.sdd/active/${featureId}/2-plan.yaml`],
|
|
204
|
+
decision_refs: [featureId],
|
|
205
|
+
planned_state_writes: [],
|
|
206
|
+
rollback_plan: 'Review the migrated workspace plan and revert only the scoped migration files if validation fails.',
|
|
207
|
+
validation_gates: [
|
|
208
|
+
{
|
|
209
|
+
name: 'Workspace schema validation',
|
|
210
|
+
command: `codesdd sdd migrate-workspace --feat ${featureId}`,
|
|
211
|
+
expected: 'Migrated plan document validates against the canonical workspace schema.',
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
execution_plan: {
|
|
216
|
+
mode: 'single-feature',
|
|
217
|
+
state_boundary_ref: 'codesdd-canonical-sdd-state',
|
|
218
|
+
command_sequence: [
|
|
219
|
+
{
|
|
220
|
+
name: 'Validate migrated workspace',
|
|
221
|
+
command: `codesdd sdd migrate-workspace --feat ${featureId}`,
|
|
222
|
+
writes_state: true,
|
|
223
|
+
expected_state_writes: [`.sdd/active/${featureId}/2-plan.yaml`],
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
allowed_state_writes: [`.sdd/active/${featureId}/`],
|
|
227
|
+
forbidden_state_writes: ['.codesdd/**', 'external-context/**'],
|
|
228
|
+
handoff_artifacts: [`.sdd/active/${featureId}/5-quality.yaml`],
|
|
229
|
+
},
|
|
198
230
|
architectural_impact: {
|
|
199
231
|
description: ensureText(featureId, 'architectural_impact.description', section(parsed, ['architectural impact', 'impacto arquitetural', 'plan', 'plano']), 1, missing),
|
|
200
232
|
affected_modules: affected,
|
|
@@ -272,6 +304,7 @@ function migrateQuality(featureId, parsed) {
|
|
|
272
304
|
})),
|
|
273
305
|
skill_evidence: {
|
|
274
306
|
required_skill_ids: [],
|
|
307
|
+
policy_requirements: [],
|
|
275
308
|
evidence: [],
|
|
276
309
|
verification_rule: 'No skill evidence required for migrated legacy workspaces.',
|
|
277
310
|
},
|
|
@@ -282,6 +315,15 @@ function migrateQuality(featureId, parsed) {
|
|
|
282
315
|
evidence: evidence.join('; ') || `${MIGRATION_MARKER}: quality evidence`,
|
|
283
316
|
},
|
|
284
317
|
],
|
|
318
|
+
requirement_validation_evidence_risk_matrix: [
|
|
319
|
+
{
|
|
320
|
+
requirement_ref: `${featureId}-MIG-R1`,
|
|
321
|
+
validation_refs: ['Migrated validation'],
|
|
322
|
+
evidence_refs: evidence.length > 0 ? evidence : [`${MIGRATION_MARKER}: quality evidence`],
|
|
323
|
+
residual_risk: 'Residual risk migrated from legacy workspace and requires follow-up review.',
|
|
324
|
+
risk_status: 'open',
|
|
325
|
+
},
|
|
326
|
+
],
|
|
285
327
|
exceptions: [],
|
|
286
328
|
remediation_policy: { on_coverage_miss: 'block', max_rounds: 3 },
|
|
287
329
|
traceability: {
|
|
@@ -291,6 +333,57 @@ function migrateQuality(featureId, parsed) {
|
|
|
291
333
|
},
|
|
292
334
|
requirements: [],
|
|
293
335
|
},
|
|
336
|
+
token_budget_gates: {
|
|
337
|
+
require_numeric_efficiency: true,
|
|
338
|
+
fail_below_percent: 95,
|
|
339
|
+
telemetry: [],
|
|
340
|
+
},
|
|
341
|
+
runtime_quality_gates: {
|
|
342
|
+
mode: 'observe',
|
|
343
|
+
performance: [],
|
|
344
|
+
flakiness: [],
|
|
345
|
+
},
|
|
346
|
+
q95_ledger: {
|
|
347
|
+
threshold: 95,
|
|
348
|
+
score: 0,
|
|
349
|
+
status: 'pending',
|
|
350
|
+
computed_at: '',
|
|
351
|
+
weights: {
|
|
352
|
+
coverage: 30,
|
|
353
|
+
traceability: 20,
|
|
354
|
+
integrity: 20,
|
|
355
|
+
naming: 10,
|
|
356
|
+
token: 20,
|
|
357
|
+
},
|
|
358
|
+
axes: {
|
|
359
|
+
coverage: {
|
|
360
|
+
raw_score: 0,
|
|
361
|
+
weighted_score: 0,
|
|
362
|
+
rationale: 'Computed during finalize.',
|
|
363
|
+
},
|
|
364
|
+
traceability: {
|
|
365
|
+
raw_score: 0,
|
|
366
|
+
weighted_score: 0,
|
|
367
|
+
rationale: 'Computed during finalize.',
|
|
368
|
+
},
|
|
369
|
+
integrity: {
|
|
370
|
+
raw_score: 0,
|
|
371
|
+
weighted_score: 0,
|
|
372
|
+
rationale: 'Computed during finalize.',
|
|
373
|
+
},
|
|
374
|
+
naming: {
|
|
375
|
+
raw_score: 0,
|
|
376
|
+
weighted_score: 0,
|
|
377
|
+
rationale: 'Computed during finalize.',
|
|
378
|
+
},
|
|
379
|
+
token: {
|
|
380
|
+
raw_score: 0,
|
|
381
|
+
weighted_score: 0,
|
|
382
|
+
rationale: 'Computed during finalize.',
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
next_best_action: 'Record missing evidence to raise the lowest weighted axis.',
|
|
386
|
+
},
|
|
294
387
|
};
|
|
295
388
|
return withValidation('5-quality.yaml', doc, missing, workspaceQualitySchema);
|
|
296
389
|
}
|
package/dist/core/sdd/migrate.js
CHANGED
|
@@ -2,10 +2,11 @@ import path from 'node:path';
|
|
|
2
2
|
import { promises as fs } from 'node:fs';
|
|
3
3
|
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
4
4
|
import { CLI_NAME, } from '../branding.js';
|
|
5
|
+
import { CURRENT_SDD_STATE_VERSION, buildSddContractConfig, sddContractMismatchReasons, } from './contract.js';
|
|
5
6
|
import { findMarkdownWorkspaceFiles, MigrateWorkspaceCommand } from './migrate-workspace.js';
|
|
6
7
|
import { loadProjectSddConfig, loadStateSnapshot, resolveSddPaths, saveBacklogState, saveDiscoveryIndexState, saveFinalizeQueueState, saveFrontendDecisionsState, saveFrontendGapsState, saveFrontendMapState, saveIntegrationContractsState, saveRepoMapState, saveServiceCatalogState, saveSourceIndexState, saveTechDebtState, saveTechStackState, saveUnblockEventsState, } from './state.js';
|
|
7
8
|
import { runLifecycleHooks } from './domain/lifecycle-hooks.js';
|
|
8
|
-
export
|
|
9
|
+
export { CURRENT_SDD_STATE_VERSION } from './contract.js';
|
|
9
10
|
const ID_PREFIXES = new Set(['INS', 'DEB', 'RAD', 'EPIC', 'FEAT', 'FGAP', 'TD', 'SRC']);
|
|
10
11
|
const REFERENCE_LIKE_VALUE = /\b(?:INS|DEB|RAD|EPIC|FEAT|FGAP|TD|SRC)-\d+\b/;
|
|
11
12
|
const MIGRATABLE_FILE_EXTENSIONS = new Set(['.md', '.yaml', '.yml', '.txt']);
|
|
@@ -83,6 +84,21 @@ async function readStateConfigVersion(configPath) {
|
|
|
83
84
|
return 1;
|
|
84
85
|
}
|
|
85
86
|
}
|
|
87
|
+
async function readStateConfig(configPath) {
|
|
88
|
+
try {
|
|
89
|
+
const parsed = parseYaml(await fs.readFile(configPath, 'utf-8'));
|
|
90
|
+
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const LEGACY_GENERATED_BY_PREFIXES = [`${'open'}sdd`, `${'open'}spec`];
|
|
97
|
+
function isLegacyGeneratedBy(value) {
|
|
98
|
+
if (typeof value !== 'string')
|
|
99
|
+
return false;
|
|
100
|
+
return LEGACY_GENERATED_BY_PREFIXES.some((prefix) => new RegExp(`^${prefix}\\s`, 'i').test(value));
|
|
101
|
+
}
|
|
86
102
|
async function writeStateConfigVersion(configPath) {
|
|
87
103
|
let payload = {};
|
|
88
104
|
try {
|
|
@@ -95,8 +111,12 @@ async function writeStateConfigVersion(configPath) {
|
|
|
95
111
|
payload = {};
|
|
96
112
|
}
|
|
97
113
|
payload.version = 1;
|
|
98
|
-
payload.generatedBy =
|
|
114
|
+
payload.generatedBy =
|
|
115
|
+
typeof payload.generatedBy === 'string' && !isLegacyGeneratedBy(payload.generatedBy)
|
|
116
|
+
? payload.generatedBy
|
|
117
|
+
: `${CLI_NAME} sdd migrate`;
|
|
99
118
|
payload.state_version = CURRENT_SDD_STATE_VERSION;
|
|
119
|
+
payload.sdd_contract = buildSddContractConfig();
|
|
100
120
|
payload.last_migrated_at = new Date().toISOString();
|
|
101
121
|
await fs.writeFile(configPath, stringifyYaml(payload), 'utf-8');
|
|
102
122
|
}
|
|
@@ -199,6 +219,7 @@ export async function assessSddMigration(projectRoot) {
|
|
|
199
219
|
const paths = resolveSddPaths(projectRoot, config);
|
|
200
220
|
const snapshot = await loadStateSnapshot(paths, config);
|
|
201
221
|
const currentVersion = await readStateConfigVersion(paths.configFile);
|
|
222
|
+
const rawConfig = await readStateConfig(paths.configFile);
|
|
202
223
|
const conversions = new Map();
|
|
203
224
|
collectReferenceConversions(snapshot.discoveryIndex, conversions);
|
|
204
225
|
collectReferenceConversions(snapshot.backlog, conversions);
|
|
@@ -223,6 +244,16 @@ export async function assessSddMigration(projectRoot) {
|
|
|
223
244
|
if (currentVersion < CURRENT_SDD_STATE_VERSION) {
|
|
224
245
|
reasons.push(`state_version=${currentVersion} esta abaixo da versao requerida ${CURRENT_SDD_STATE_VERSION}`);
|
|
225
246
|
}
|
|
247
|
+
if (currentVersion > CURRENT_SDD_STATE_VERSION) {
|
|
248
|
+
reasons.push(`state_version=${currentVersion} esta acima da versao suportada ${CURRENT_SDD_STATE_VERSION}`);
|
|
249
|
+
}
|
|
250
|
+
const contractReasons = sddContractMismatchReasons(rawConfig.sdd_contract);
|
|
251
|
+
if (contractReasons.length > 0) {
|
|
252
|
+
reasons.push(`sdd_contract desalinhado: ${contractReasons.join(', ')}`);
|
|
253
|
+
}
|
|
254
|
+
if (isLegacyGeneratedBy(rawConfig.generatedBy)) {
|
|
255
|
+
reasons.push('generatedBy ainda usa identidade legacy pre-CodeSDD');
|
|
256
|
+
}
|
|
226
257
|
if (legacyRecords.length > 0) {
|
|
227
258
|
reasons.push(`registros legacy detectados: ${legacyRecords.join(', ')}`);
|
|
228
259
|
}
|
|
@@ -260,6 +291,9 @@ export class SddMigrateCommand {
|
|
|
260
291
|
messages.push(`Estado SDD ja esta na versao ${assessment.targetVersion}. Nenhuma migracao necessaria.`);
|
|
261
292
|
return { converted: 0, messages, assessment };
|
|
262
293
|
}
|
|
294
|
+
if (assessment.currentVersion > assessment.targetVersion) {
|
|
295
|
+
throw new Error(`Estado SDD state_version=${assessment.currentVersion} esta acima da versao suportada ${assessment.targetVersion}. Atualize o CodeSDD antes de executar migracao ou comandos SDD.`);
|
|
296
|
+
}
|
|
263
297
|
if (options?.radToEpic === false) {
|
|
264
298
|
throw new Error('Migracao SDD mandatória nao pode ser desabilitada.');
|
|
265
299
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface PackageSecurityIssue {
|
|
2
|
+
code: string;
|
|
3
|
+
path: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PackageSecurityGateReport {
|
|
7
|
+
status: 'pass' | 'fail';
|
|
8
|
+
package_allowlist: {
|
|
9
|
+
status: 'pass' | 'fail';
|
|
10
|
+
allowed_files: string[];
|
|
11
|
+
issues: PackageSecurityIssue[];
|
|
12
|
+
};
|
|
13
|
+
secret_scan: {
|
|
14
|
+
status: 'pass' | 'fail';
|
|
15
|
+
scanned_files: number;
|
|
16
|
+
issues: PackageSecurityIssue[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function evaluatePackageSecurityGates(projectRoot: string): Promise<PackageSecurityGateReport>;
|
|
20
|
+
export declare function evaluatePackageFileAllowlist(files: string[]): PackageSecurityIssue[];
|
|
21
|
+
//# sourceMappingURL=package-security-gates.d.ts.map
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import fg from 'fast-glob';
|
|
5
|
+
const FORBIDDEN_PACKAGE_FILE_PATTERNS = [
|
|
6
|
+
/^\.env/u,
|
|
7
|
+
/^\.npmrc$/u,
|
|
8
|
+
/^\.sdd\/state\//u,
|
|
9
|
+
/^\.git/u,
|
|
10
|
+
/^node_modules\//u,
|
|
11
|
+
/^coverage\//u,
|
|
12
|
+
/^\.turbo\//u,
|
|
13
|
+
/^\.cache\//u,
|
|
14
|
+
/(?:^|\/)[^/]+\.log$/u,
|
|
15
|
+
/(?:^|\/)(?:secret|secrets|credential|credentials)(?:\/|$)/u,
|
|
16
|
+
];
|
|
17
|
+
const SECRET_SIGNATURES = [
|
|
18
|
+
{ code: 'PRIVATE_KEY', pattern: /-----BEGIN (?:RSA |DSA |EC |OPENSSH |)PRIVATE KEY-----/u },
|
|
19
|
+
{ code: 'NPM_TOKEN', pattern: /\/\/registry\.npmjs\.org\/:_authToken=(?!\$\{NODE_AUTH_TOKEN\})\S+/u },
|
|
20
|
+
{ code: 'OPENAI_KEY', pattern: /\bsk-[A-Za-z0-9_-]{24,}\b/u },
|
|
21
|
+
{ code: 'GITHUB_TOKEN', pattern: /\bgh[pousr]_[A-Za-z0-9_]{24,}\b/u },
|
|
22
|
+
{ code: 'AWS_ACCESS_KEY', pattern: /\bAKIA[0-9A-Z]{16}\b/u },
|
|
23
|
+
];
|
|
24
|
+
const SECRET_SCAN_IGNORE = [
|
|
25
|
+
'node_modules/**',
|
|
26
|
+
'dist/**',
|
|
27
|
+
'coverage/**',
|
|
28
|
+
'.git/**',
|
|
29
|
+
'.sdd/state/**',
|
|
30
|
+
'.sdd/archived/**',
|
|
31
|
+
'.sdd/active/**',
|
|
32
|
+
'.sdd/planned/**',
|
|
33
|
+
'pnpm-lock.yaml',
|
|
34
|
+
];
|
|
35
|
+
export async function evaluatePackageSecurityGates(projectRoot) {
|
|
36
|
+
const packageJson = await readPackageJson(projectRoot);
|
|
37
|
+
const allowedFiles = normalizePackageFiles(packageJson.files ?? []);
|
|
38
|
+
const packageIssues = evaluatePackageFileAllowlist(allowedFiles);
|
|
39
|
+
const secretScan = await scanForHighConfidenceSecrets(projectRoot);
|
|
40
|
+
return {
|
|
41
|
+
status: packageIssues.length === 0 && secretScan.issues.length === 0 ? 'pass' : 'fail',
|
|
42
|
+
package_allowlist: {
|
|
43
|
+
status: packageIssues.length === 0 ? 'pass' : 'fail',
|
|
44
|
+
allowed_files: allowedFiles,
|
|
45
|
+
issues: packageIssues,
|
|
46
|
+
},
|
|
47
|
+
secret_scan: {
|
|
48
|
+
status: secretScan.issues.length === 0 ? 'pass' : 'fail',
|
|
49
|
+
scanned_files: secretScan.scannedFiles,
|
|
50
|
+
issues: secretScan.issues,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function evaluatePackageFileAllowlist(files) {
|
|
55
|
+
const issues = [];
|
|
56
|
+
for (const file of files) {
|
|
57
|
+
const normalized = normalizePath(file);
|
|
58
|
+
if (FORBIDDEN_PACKAGE_FILE_PATTERNS.some((pattern) => pattern.test(normalized))) {
|
|
59
|
+
issues.push({
|
|
60
|
+
code: 'PACKAGE_FILE_FORBIDDEN',
|
|
61
|
+
path: normalized,
|
|
62
|
+
message: 'Package publish allowlist includes a forbidden path or pattern.',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return issues;
|
|
67
|
+
}
|
|
68
|
+
async function scanForHighConfidenceSecrets(projectRoot) {
|
|
69
|
+
const files = await fg(['**/*'], {
|
|
70
|
+
cwd: projectRoot,
|
|
71
|
+
onlyFiles: true,
|
|
72
|
+
dot: true,
|
|
73
|
+
ignore: SECRET_SCAN_IGNORE,
|
|
74
|
+
});
|
|
75
|
+
const issues = [];
|
|
76
|
+
let scannedFiles = 0;
|
|
77
|
+
for (const relativeFile of files) {
|
|
78
|
+
const normalized = normalizePath(relativeFile);
|
|
79
|
+
if (isBinaryLike(normalized))
|
|
80
|
+
continue;
|
|
81
|
+
if (normalized === '.npmrc' && existsSync(path.join(projectRoot, normalized))) {
|
|
82
|
+
issues.push({
|
|
83
|
+
code: 'LOCAL_NPMRC',
|
|
84
|
+
path: normalized,
|
|
85
|
+
message: 'Project-local .npmrc is not allowed in release readiness.',
|
|
86
|
+
});
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const content = await fs.readFile(path.join(projectRoot, normalized), 'utf-8').catch(() => '');
|
|
90
|
+
scannedFiles += 1;
|
|
91
|
+
for (const signature of SECRET_SIGNATURES) {
|
|
92
|
+
if (signature.pattern.test(content)) {
|
|
93
|
+
issues.push({
|
|
94
|
+
code: signature.code,
|
|
95
|
+
path: normalized,
|
|
96
|
+
message: 'High-confidence secret signature detected.',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { scannedFiles, issues };
|
|
102
|
+
}
|
|
103
|
+
function normalizePackageFiles(files) {
|
|
104
|
+
return files
|
|
105
|
+
.filter((file) => typeof file === 'string')
|
|
106
|
+
.map(normalizePath)
|
|
107
|
+
.filter(Boolean);
|
|
108
|
+
}
|
|
109
|
+
function normalizePath(value) {
|
|
110
|
+
return value.replace(/\\/gu, '/').replace(/^\.\/+/u, '').trim();
|
|
111
|
+
}
|
|
112
|
+
function isBinaryLike(fileName) {
|
|
113
|
+
return /\.(?:png|jpg|jpeg|gif|webp|pdf|tgz|zip|gz|br|woff2?)$/iu.test(fileName);
|
|
114
|
+
}
|
|
115
|
+
async function readPackageJson(projectRoot) {
|
|
116
|
+
const content = await fs.readFile(path.join(projectRoot, 'package.json'), 'utf-8');
|
|
117
|
+
return JSON.parse(content);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=package-security-gates.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const DerivationProfileSchema: z.ZodEnum<{
|
|
3
|
+
prototype: "prototype";
|
|
4
|
+
"foundation-compatible": "foundation-compatible";
|
|
5
|
+
"enterprise-strict": "enterprise-strict";
|
|
6
|
+
}>;
|
|
7
|
+
export declare const PreviewGateStatusSchema: z.ZodEnum<{
|
|
8
|
+
pending: "pending";
|
|
9
|
+
approved: "approved";
|
|
10
|
+
corrected: "corrected";
|
|
11
|
+
rejected: "rejected";
|
|
12
|
+
}>;
|
|
13
|
+
export declare const PackageStructureNodeKindSchema: z.ZodEnum<{
|
|
14
|
+
file: "file";
|
|
15
|
+
dir: "dir";
|
|
16
|
+
}>;
|
|
17
|
+
export declare const PackageStructureNodeSchema: z.ZodSchema<PackageStructureNode>;
|
|
18
|
+
export declare const PackageStructurePreviewSchema: z.ZodObject<{
|
|
19
|
+
schema_version: z.ZodLiteral<1>;
|
|
20
|
+
generated_at: z.ZodString;
|
|
21
|
+
project_name: z.ZodString;
|
|
22
|
+
profile: z.ZodEnum<{
|
|
23
|
+
prototype: "prototype";
|
|
24
|
+
"foundation-compatible": "foundation-compatible";
|
|
25
|
+
"enterprise-strict": "enterprise-strict";
|
|
26
|
+
}>;
|
|
27
|
+
contexts: z.ZodArray<z.ZodString>;
|
|
28
|
+
subsystems: z.ZodArray<z.ZodString>;
|
|
29
|
+
transports: z.ZodArray<z.ZodString>;
|
|
30
|
+
tree: z.ZodType<PackageStructureNode, unknown, z.core.$ZodTypeInternals<PackageStructureNode, unknown>>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
export declare const HumanValidationGateSchema: z.ZodObject<{
|
|
33
|
+
gate_id: z.ZodString;
|
|
34
|
+
rule_ref: z.ZodLiteral<"DTAPI-P0-PREVIEW-001">;
|
|
35
|
+
status: z.ZodEnum<{
|
|
36
|
+
pending: "pending";
|
|
37
|
+
approved: "approved";
|
|
38
|
+
corrected: "corrected";
|
|
39
|
+
rejected: "rejected";
|
|
40
|
+
}>;
|
|
41
|
+
preview_ref: z.ZodString;
|
|
42
|
+
approved_at: z.ZodOptional<z.ZodString>;
|
|
43
|
+
approved_by: z.ZodOptional<z.ZodString>;
|
|
44
|
+
correction_notes: z.ZodOptional<z.ZodString>;
|
|
45
|
+
exception_refs: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
export interface HumanValidationGateData {
|
|
48
|
+
selected_profile: z.infer<typeof DerivationProfileSchema>;
|
|
49
|
+
package_preview: z.infer<typeof PackageStructurePreviewSchema>;
|
|
50
|
+
human_validation_gate: z.infer<typeof HumanValidationGateSchema>;
|
|
51
|
+
exception_list: Array<{
|
|
52
|
+
adr_ref: string;
|
|
53
|
+
reason: string;
|
|
54
|
+
severity: string;
|
|
55
|
+
}>;
|
|
56
|
+
policy_pool_seed: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface DebGateInput {
|
|
59
|
+
project_name: string;
|
|
60
|
+
profile?: z.infer<typeof DerivationProfileSchema>;
|
|
61
|
+
contexts?: string[];
|
|
62
|
+
subsystems?: string[];
|
|
63
|
+
transports?: string[];
|
|
64
|
+
generated_at?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function generatePackageStructurePreview(input: DebGateInput): z.infer<typeof PackageStructurePreviewSchema>;
|
|
67
|
+
export declare function formatPreviewAsTree(node: z.infer<typeof PackageStructureNodeSchema>, prefix?: string): string;
|
|
68
|
+
export declare function buildHumanValidationGate(preview: z.infer<typeof PackageStructurePreviewSchema>): z.infer<typeof HumanValidationGateSchema>;
|
|
69
|
+
export declare function generateDevtrackApiDebGate(input: DebGateInput): HumanValidationGateData;
|
|
70
|
+
export declare function isGatePending(gate: z.infer<typeof HumanValidationGateSchema>): boolean;
|
|
71
|
+
export declare function isGateApproved(gate: z.infer<typeof HumanValidationGateSchema>): boolean;
|
|
72
|
+
export type DerivationProfile = z.infer<typeof DerivationProfileSchema>;
|
|
73
|
+
export type PreviewGateStatus = z.infer<typeof PreviewGateStatusSchema>;
|
|
74
|
+
export type PackageStructureNodeKind = z.infer<typeof PackageStructureNodeKindSchema>;
|
|
75
|
+
export type PackageStructureNode = {
|
|
76
|
+
name: string;
|
|
77
|
+
kind: PackageStructureNodeKind;
|
|
78
|
+
description?: string;
|
|
79
|
+
children?: PackageStructureNode[];
|
|
80
|
+
};
|
|
81
|
+
export type PackageStructurePreview = z.infer<typeof PackageStructurePreviewSchema>;
|
|
82
|
+
export type HumanValidationGate = z.infer<typeof HumanValidationGateSchema>;
|
|
83
|
+
//# sourceMappingURL=package-structure-gate.d.ts.map
|