@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,10 @@
|
|
|
1
|
+
import { type SddPaths, type SddRuntimeConfig, type SddStateSnapshot } from './state.js';
|
|
1
2
|
import { type StructuralDiagnosticReport } from './structural-health.js';
|
|
3
|
+
import type { BacklogItem } from './types.js';
|
|
4
|
+
export type Finding = StructuralDiagnosticReport['findings'][number];
|
|
5
|
+
export type FindingSeverity = Finding['severity'];
|
|
6
|
+
export type FindingCategory = Finding['category'];
|
|
7
|
+
export type SanitizerDisposition = Finding['sanitizer']['disposition'];
|
|
2
8
|
export interface SddDiagnoseOptions {
|
|
3
9
|
strict?: boolean;
|
|
4
10
|
}
|
|
@@ -14,6 +20,59 @@ export interface SddDiagnoseResult {
|
|
|
14
20
|
export declare class SddDiagnosticOptionsError extends Error {
|
|
15
21
|
constructor(message: string);
|
|
16
22
|
}
|
|
23
|
+
export declare function projectRelative(projectRoot: string, targetPath: string): string;
|
|
24
|
+
export declare function isInsidePath(rootPath: string, candidatePath: string): boolean;
|
|
25
|
+
export declare function pathExists(targetPath: string): Promise<boolean>;
|
|
26
|
+
export declare function safeRealpath(targetPath: string): Promise<string>;
|
|
27
|
+
export declare function addFinding(findings: Finding[], input: {
|
|
28
|
+
finding_id: string;
|
|
29
|
+
rule_id: string;
|
|
30
|
+
category: FindingCategory;
|
|
31
|
+
severity: FindingSeverity;
|
|
32
|
+
summary: string;
|
|
33
|
+
evidence?: Record<string, unknown>;
|
|
34
|
+
location?: string;
|
|
35
|
+
sanitizer: {
|
|
36
|
+
disposition: SanitizerDisposition;
|
|
37
|
+
reason: string;
|
|
38
|
+
actions?: string[];
|
|
39
|
+
};
|
|
40
|
+
}): void;
|
|
41
|
+
export declare function duplicateIdFindings<T extends {
|
|
42
|
+
id: string;
|
|
43
|
+
}>(findings: Finding[], items: T[], scope: string, filePath: string): void;
|
|
44
|
+
export declare function zodIssuePath(pathSegments: PropertyKey[]): string;
|
|
45
|
+
export declare function normalizeFindingToken(input: string): string;
|
|
46
|
+
export declare function listFeatureWorkspaceDirs(rootDir: string, lifecycleRoot: 'planned' | 'active' | 'archived'): Promise<Array<{
|
|
47
|
+
featureId: string;
|
|
48
|
+
lifecycleRoot: 'planned' | 'active' | 'archived';
|
|
49
|
+
dirPath: string;
|
|
50
|
+
}>>;
|
|
51
|
+
export declare function hasLegacyMarkdown(workspaceDir: string): Promise<boolean>;
|
|
52
|
+
export declare function collectWorkspaceSchemaFindings(findings: Finding[], paths: SddPaths): Promise<void>;
|
|
53
|
+
export declare function collectWorkspaceAllowlistFindings(findings: Finding[], paths: SddPaths): Promise<void>;
|
|
54
|
+
export declare function collectLifecycleViolationFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
|
|
55
|
+
export declare function qualityEvidenceReferencesCoverage(evidenceLog: Array<{
|
|
56
|
+
kind: string;
|
|
57
|
+
result: string;
|
|
58
|
+
artifact?: string;
|
|
59
|
+
}>, targets: {
|
|
60
|
+
unit: number;
|
|
61
|
+
integration: number;
|
|
62
|
+
}): boolean;
|
|
63
|
+
export declare function collectQualityEvidenceFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
|
|
64
|
+
export declare function collectTraceabilityFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
|
|
65
|
+
export declare function isPrivacyComplianceBacklogItem(item: BacklogItem): boolean;
|
|
66
|
+
export declare function collectPrivacyComplianceFindings(findings: Finding[], paths: SddPaths, snapshot: SddStateSnapshot): Promise<void>;
|
|
67
|
+
export declare function collectDuplicateIdFindings(findings: Finding[], snapshot: SddStateSnapshot, paths: SddPaths): void;
|
|
68
|
+
export declare function addBrokenReference(findings: Finding[], ref: string, owner: string, relation: string, location: string): void;
|
|
69
|
+
export declare function collectReferenceFindings(findings: Finding[], snapshot: SddStateSnapshot, paths: SddPaths): void;
|
|
70
|
+
export declare function collectDirectoryFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
|
|
71
|
+
export declare function collectStateFileFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
|
|
72
|
+
export declare function collectLifecyclePlacementFindings(findings: Finding[], paths: SddPaths, backlogItems: BacklogItem[]): Promise<void>;
|
|
73
|
+
export declare function newestMtime(filePaths: string[]): Promise<number>;
|
|
74
|
+
export declare function collectGeneratedViewFindings(findings: Finding[], config: SddRuntimeConfig, paths: SddPaths): Promise<void>;
|
|
75
|
+
export declare function collectBoundaryFindings(findings: Finding[], paths: SddPaths): Promise<void>;
|
|
17
76
|
export declare function getDiagnosticExitCode(report: StructuralDiagnosticReport): number;
|
|
18
77
|
export declare function getDiagnosticHealth(report: StructuralDiagnosticReport): SddDiagnoseResult['health'];
|
|
19
78
|
export declare function diagnoseSddRoot(projectRoot: string, options?: SddDiagnoseOptions): Promise<StructuralDiagnosticReport>;
|
|
@@ -22,15 +22,15 @@ export class SddDiagnosticOptionsError extends Error {
|
|
|
22
22
|
this.name = 'SddDiagnosticOptionsError';
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
function projectRelative(projectRoot, targetPath) {
|
|
25
|
+
export function projectRelative(projectRoot, targetPath) {
|
|
26
26
|
const relative = path.relative(projectRoot, targetPath);
|
|
27
27
|
return relative.length > 0 ? relative : '.';
|
|
28
28
|
}
|
|
29
|
-
function isInsidePath(rootPath, candidatePath) {
|
|
29
|
+
export function isInsidePath(rootPath, candidatePath) {
|
|
30
30
|
const relative = path.relative(rootPath, candidatePath);
|
|
31
31
|
return relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
32
32
|
}
|
|
33
|
-
async function pathExists(targetPath) {
|
|
33
|
+
export async function pathExists(targetPath) {
|
|
34
34
|
try {
|
|
35
35
|
await fs.access(targetPath);
|
|
36
36
|
return true;
|
|
@@ -39,7 +39,7 @@ async function pathExists(targetPath) {
|
|
|
39
39
|
return false;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
async function safeRealpath(targetPath) {
|
|
42
|
+
export async function safeRealpath(targetPath) {
|
|
43
43
|
try {
|
|
44
44
|
return await fs.realpath(targetPath);
|
|
45
45
|
}
|
|
@@ -47,7 +47,7 @@ async function safeRealpath(targetPath) {
|
|
|
47
47
|
return path.resolve(targetPath);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
function addFinding(findings, input) {
|
|
50
|
+
export function addFinding(findings, input) {
|
|
51
51
|
findings.push(StructuralFindingSchema.parse({
|
|
52
52
|
evidence: {},
|
|
53
53
|
...input,
|
|
@@ -57,7 +57,7 @@ function addFinding(findings, input) {
|
|
|
57
57
|
},
|
|
58
58
|
}));
|
|
59
59
|
}
|
|
60
|
-
function duplicateIdFindings(findings, items, scope, filePath) {
|
|
60
|
+
export function duplicateIdFindings(findings, items, scope, filePath) {
|
|
61
61
|
const seen = new Set();
|
|
62
62
|
const duplicates = new Set();
|
|
63
63
|
for (const item of items) {
|
|
@@ -82,13 +82,13 @@ function duplicateIdFindings(findings, items, scope, filePath) {
|
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
function zodIssuePath(pathSegments) {
|
|
85
|
+
export function zodIssuePath(pathSegments) {
|
|
86
86
|
return pathSegments.length > 0 ? pathSegments.join('.') : '<root>';
|
|
87
87
|
}
|
|
88
|
-
function normalizeFindingToken(input) {
|
|
88
|
+
export function normalizeFindingToken(input) {
|
|
89
89
|
return input.toUpperCase().replace(/[^A-Z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
90
90
|
}
|
|
91
|
-
async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
|
|
91
|
+
export async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
|
|
92
92
|
const entries = await fs.readdir(rootDir, { withFileTypes: true }).catch(() => []);
|
|
93
93
|
return entries
|
|
94
94
|
.filter((entry) => entry.isDirectory() && FEATURE_WORKSPACE_PATTERN.test(entry.name))
|
|
@@ -98,11 +98,11 @@ async function listFeatureWorkspaceDirs(rootDir, lifecycleRoot) {
|
|
|
98
98
|
dirPath: path.join(rootDir, entry.name),
|
|
99
99
|
}));
|
|
100
100
|
}
|
|
101
|
-
async function hasLegacyMarkdown(workspaceDir) {
|
|
101
|
+
export async function hasLegacyMarkdown(workspaceDir) {
|
|
102
102
|
const entries = await fs.readdir(workspaceDir, { withFileTypes: true }).catch(() => []);
|
|
103
103
|
return entries.some((entry) => entry.isFile() && entry.name.endsWith('.md'));
|
|
104
104
|
}
|
|
105
|
-
async function collectWorkspaceSchemaFindings(findings, paths) {
|
|
105
|
+
export async function collectWorkspaceSchemaFindings(findings, paths) {
|
|
106
106
|
const workspaces = [
|
|
107
107
|
...(await listFeatureWorkspaceDirs(paths.plannedDir, 'planned')),
|
|
108
108
|
...(await listFeatureWorkspaceDirs(paths.activeDir, 'active')),
|
|
@@ -143,7 +143,7 @@ async function collectWorkspaceSchemaFindings(findings, paths) {
|
|
|
143
143
|
? 'Legacy markdown exists and should be migrated into schema-valid workspace YAML.'
|
|
144
144
|
: 'Workspace YAML cannot be repaired automatically without losing feature-specific intent.',
|
|
145
145
|
actions: legacyMarkdown
|
|
146
|
-
? [`
|
|
146
|
+
? [`codesdd sdd migrate-workspace --feat ${workspace.featureId}`]
|
|
147
147
|
: [`edit ${relativePath} to match ${entry.name} schema`],
|
|
148
148
|
},
|
|
149
149
|
});
|
|
@@ -175,14 +175,14 @@ async function collectWorkspaceSchemaFindings(findings, paths) {
|
|
|
175
175
|
? 'Legacy markdown exists and should be migrated into schema-valid workspace YAML.'
|
|
176
176
|
: 'Workspace YAML requires schema-aware manual editing.',
|
|
177
177
|
actions: legacyMarkdown
|
|
178
|
-
? [`
|
|
179
|
-
: [`edit ${relativePath} and rerun
|
|
178
|
+
? [`codesdd sdd migrate-workspace --feat ${workspace.featureId}`]
|
|
179
|
+
: [`edit ${relativePath} and rerun codesdd sdd diagnose`],
|
|
180
180
|
},
|
|
181
181
|
});
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
async function collectWorkspaceAllowlistFindings(findings, paths) {
|
|
185
|
+
export async function collectWorkspaceAllowlistFindings(findings, paths) {
|
|
186
186
|
const workspaces = [
|
|
187
187
|
...(await listFeatureWorkspaceDirs(paths.plannedDir, 'planned')),
|
|
188
188
|
...(await listFeatureWorkspaceDirs(paths.activeDir, 'active')),
|
|
@@ -200,7 +200,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
|
|
|
200
200
|
rule_id: 'SH-RULE-WORKSPACE-FILE-NOT-ALLOWLISTED',
|
|
201
201
|
category: 'integrity',
|
|
202
202
|
severity: 'warning',
|
|
203
|
-
summary: `${workspace.featureId} contains a workspace file outside the
|
|
203
|
+
summary: `${workspace.featureId} contains a workspace file outside the CodeSDD allowlist: ${entry.name}.`,
|
|
204
204
|
location: relativePath,
|
|
205
205
|
evidence: {
|
|
206
206
|
id: workspace.featureId,
|
|
@@ -216,7 +216,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
|
|
|
216
216
|
: 'Non-allowlisted files may contain user data and require confirmation before relocation.',
|
|
217
217
|
actions: [
|
|
218
218
|
entry.name.endsWith('.md')
|
|
219
|
-
? `
|
|
219
|
+
? `codesdd sdd migrate-workspace --feat ${workspace.featureId}`
|
|
220
220
|
: 'move the file to .sdd/backup after review',
|
|
221
221
|
'remove the file only after confirming it is obsolete',
|
|
222
222
|
],
|
|
@@ -225,7 +225,7 @@ async function collectWorkspaceAllowlistFindings(findings, paths) {
|
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
|
-
async function collectLifecycleViolationFindings(findings, paths, backlogItems) {
|
|
228
|
+
export async function collectLifecycleViolationFindings(findings, paths, backlogItems) {
|
|
229
229
|
const byId = new Map(backlogItems.map((item) => [item.id, item]));
|
|
230
230
|
const checks = [
|
|
231
231
|
{ root: 'planned', dir: paths.plannedDir, expectedStatus: 'READY' },
|
|
@@ -261,7 +261,7 @@ async function collectLifecycleViolationFindings(findings, paths, backlogItems)
|
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
|
-
function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
|
|
264
|
+
export function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
|
|
265
265
|
if (evidenceLog.length === 0)
|
|
266
266
|
return false;
|
|
267
267
|
const evidenceText = evidenceLog
|
|
@@ -272,7 +272,7 @@ function qualityEvidenceReferencesCoverage(evidenceLog, targets) {
|
|
|
272
272
|
evidenceText.includes(`${targets.unit}`) ||
|
|
273
273
|
evidenceText.includes(`${targets.integration}`));
|
|
274
274
|
}
|
|
275
|
-
async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
|
|
275
|
+
export async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
|
|
276
276
|
const byId = new Map(backlogItems.map((item) => [item.id, item]));
|
|
277
277
|
const activeWorkspaces = await listFeatureWorkspaceDirs(paths.activeDir, 'active');
|
|
278
278
|
for (const workspace of activeWorkspaces) {
|
|
@@ -326,7 +326,7 @@ async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
|
|
|
326
326
|
sanitizer: {
|
|
327
327
|
disposition: 'manual',
|
|
328
328
|
reason: 'Fix the quality YAML so coverage evidence can be validated before finalize.',
|
|
329
|
-
actions: [`edit ${relativePath} and rerun
|
|
329
|
+
actions: [`edit ${relativePath} and rerun codesdd sdd diagnose`],
|
|
330
330
|
},
|
|
331
331
|
});
|
|
332
332
|
continue;
|
|
@@ -356,7 +356,7 @@ async function collectQualityEvidenceFindings(findings, paths, backlogItems) {
|
|
|
356
356
|
});
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
|
-
async function collectTraceabilityFindings(findings, paths, backlogItems) {
|
|
359
|
+
export async function collectTraceabilityFindings(findings, paths, backlogItems) {
|
|
360
360
|
const byId = new Map(backlogItems.map((item) => [item.id, item]));
|
|
361
361
|
const activeWorkspaces = await listFeatureWorkspaceDirs(paths.activeDir, 'active');
|
|
362
362
|
for (const workspace of activeWorkspaces) {
|
|
@@ -419,7 +419,7 @@ async function collectTraceabilityFindings(findings, paths, backlogItems) {
|
|
|
419
419
|
sanitizer: {
|
|
420
420
|
disposition: 'manual',
|
|
421
421
|
reason: 'Fix the workspace YAML before validating traceability closure.',
|
|
422
|
-
actions: [`edit ${relativePath} and rerun
|
|
422
|
+
actions: [`edit ${relativePath} and rerun codesdd sdd diagnose`],
|
|
423
423
|
},
|
|
424
424
|
});
|
|
425
425
|
continue;
|
|
@@ -447,13 +447,13 @@ async function collectTraceabilityFindings(findings, paths, backlogItems) {
|
|
|
447
447
|
});
|
|
448
448
|
}
|
|
449
449
|
}
|
|
450
|
-
function isPrivacyComplianceBacklogItem(item) {
|
|
450
|
+
export function isPrivacyComplianceBacklogItem(item) {
|
|
451
451
|
if (item.origin_ref === 'EPIC-0020' || item.origin_ref === 'EPIC-0021')
|
|
452
452
|
return true;
|
|
453
453
|
const refs = new Set(item.acceptance_refs || []);
|
|
454
454
|
return refs.has('EPIC-0020') || refs.has('EPIC-0021') || refs.has('DEB-0021') || refs.has('INS-0021');
|
|
455
455
|
}
|
|
456
|
-
async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
|
|
456
|
+
export async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
|
|
457
457
|
const privacyItems = snapshot.backlog.items.filter((item) => item.status !== 'DONE' && item.status !== 'ARCHIVED' && isPrivacyComplianceBacklogItem(item));
|
|
458
458
|
if (privacyItems.length === 0)
|
|
459
459
|
return;
|
|
@@ -542,7 +542,7 @@ async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
|
|
|
542
542
|
reason: 'Regulatory traceability requires explicit provenance and verification metadata.',
|
|
543
543
|
actions: [
|
|
544
544
|
`set authority/source_classification/last_verified_at/source_version/source_fingerprint for ${source.id}`,
|
|
545
|
-
'rerun
|
|
545
|
+
'rerun codesdd sdd check --render and codesdd sdd diagnose',
|
|
546
546
|
],
|
|
547
547
|
},
|
|
548
548
|
});
|
|
@@ -636,7 +636,7 @@ async function collectPrivacyComplianceFindings(findings, paths, snapshot) {
|
|
|
636
636
|
}
|
|
637
637
|
}
|
|
638
638
|
}
|
|
639
|
-
function collectDuplicateIdFindings(findings, snapshot, paths) {
|
|
639
|
+
export function collectDuplicateIdFindings(findings, snapshot, paths) {
|
|
640
640
|
duplicateIdFindings(findings, snapshot.discoveryIndex.records, 'discovery-index.records', projectRelative(paths.projectRoot, paths.stateFiles.discoveryIndex));
|
|
641
641
|
duplicateIdFindings(findings, snapshot.backlog.items, 'backlog.items', projectRelative(paths.projectRoot, paths.stateFiles.backlog));
|
|
642
642
|
duplicateIdFindings(findings, snapshot.techDebt.items, 'tech-debt.items', projectRelative(paths.projectRoot, paths.stateFiles.techDebt));
|
|
@@ -644,7 +644,7 @@ function collectDuplicateIdFindings(findings, snapshot, paths) {
|
|
|
644
644
|
duplicateIdFindings(findings, snapshot.frontendGaps.items, 'frontend-gaps.items', projectRelative(paths.projectRoot, paths.stateFiles.frontendGaps));
|
|
645
645
|
}
|
|
646
646
|
}
|
|
647
|
-
function addBrokenReference(findings, ref, owner, relation, location) {
|
|
647
|
+
export function addBrokenReference(findings, ref, owner, relation, location) {
|
|
648
648
|
addFinding(findings, {
|
|
649
649
|
finding_id: `SH-BROKEN-REF-${owner}-${relation}-${ref}`.replace(/[^A-Z0-9-]/g, '-'),
|
|
650
650
|
rule_id: 'SH-RULE-BROKEN-REFERENCE',
|
|
@@ -660,7 +660,7 @@ function addBrokenReference(findings, ref, owner, relation, location) {
|
|
|
660
660
|
},
|
|
661
661
|
});
|
|
662
662
|
}
|
|
663
|
-
function collectReferenceFindings(findings, snapshot, paths) {
|
|
663
|
+
export function collectReferenceFindings(findings, snapshot, paths) {
|
|
664
664
|
const discoveryIds = new Set(snapshot.discoveryIndex.records.map((record) => record.id));
|
|
665
665
|
const backlogIds = new Set(snapshot.backlog.items.map((item) => item.id));
|
|
666
666
|
const techDebtIds = new Set(snapshot.techDebt.items.map((item) => item.id));
|
|
@@ -702,7 +702,7 @@ function collectReferenceFindings(findings, snapshot, paths) {
|
|
|
702
702
|
}
|
|
703
703
|
}
|
|
704
704
|
}
|
|
705
|
-
async function collectDirectoryFindings(findings, config, paths) {
|
|
705
|
+
export async function collectDirectoryFindings(findings, config, paths) {
|
|
706
706
|
const requiredDirectories = [
|
|
707
707
|
{ semantic: 'memory', dir: paths.memoryRoot, severity: 'blocker' },
|
|
708
708
|
{ semantic: 'state', dir: paths.stateDir, severity: 'blocker' },
|
|
@@ -771,7 +771,7 @@ async function collectDirectoryFindings(findings, config, paths) {
|
|
|
771
771
|
}
|
|
772
772
|
}
|
|
773
773
|
}
|
|
774
|
-
async function collectStateFileFindings(findings, config, paths) {
|
|
774
|
+
export async function collectStateFileFindings(findings, config, paths) {
|
|
775
775
|
const requiredStateFiles = [
|
|
776
776
|
paths.stateFiles.discoveryIndex,
|
|
777
777
|
paths.stateFiles.backlog,
|
|
@@ -812,7 +812,7 @@ async function collectStateFileFindings(findings, config, paths) {
|
|
|
812
812
|
}
|
|
813
813
|
}
|
|
814
814
|
}
|
|
815
|
-
async function collectLifecyclePlacementFindings(findings, paths, backlogItems) {
|
|
815
|
+
export async function collectLifecyclePlacementFindings(findings, paths, backlogItems) {
|
|
816
816
|
const byId = new Map(backlogItems.map((item) => [item.id, item]));
|
|
817
817
|
const plannedEntries = await fs.readdir(paths.plannedDir).catch(() => []);
|
|
818
818
|
const activeEntries = await fs.readdir(paths.activeDir).catch(() => []);
|
|
@@ -985,7 +985,7 @@ async function collectLifecyclePlacementFindings(findings, paths, backlogItems)
|
|
|
985
985
|
}
|
|
986
986
|
}
|
|
987
987
|
}
|
|
988
|
-
async function newestMtime(filePaths) {
|
|
988
|
+
export async function newestMtime(filePaths) {
|
|
989
989
|
let newest = 0;
|
|
990
990
|
for (const filePath of filePaths) {
|
|
991
991
|
const stat = await fs.stat(filePath).catch(() => null);
|
|
@@ -994,7 +994,7 @@ async function newestMtime(filePaths) {
|
|
|
994
994
|
}
|
|
995
995
|
return newest;
|
|
996
996
|
}
|
|
997
|
-
async function collectGeneratedViewFindings(findings, config, paths) {
|
|
997
|
+
export async function collectGeneratedViewFindings(findings, config, paths) {
|
|
998
998
|
const generatedViews = [
|
|
999
999
|
path.join(paths.pendenciasDir, 'backlog-features.md'),
|
|
1000
1000
|
path.join(paths.pendenciasDir, 'backlog-graph.md'),
|
|
@@ -1029,7 +1029,7 @@ async function collectGeneratedViewFindings(findings, config, paths) {
|
|
|
1029
1029
|
sanitizer: {
|
|
1030
1030
|
disposition: 'safe',
|
|
1031
1031
|
reason: 'Generated views can be recreated from canonical state.',
|
|
1032
|
-
actions: ['run
|
|
1032
|
+
actions: ['run codesdd sdd check --render'],
|
|
1033
1033
|
},
|
|
1034
1034
|
});
|
|
1035
1035
|
continue;
|
|
@@ -1050,13 +1050,13 @@ async function collectGeneratedViewFindings(findings, config, paths) {
|
|
|
1050
1050
|
sanitizer: {
|
|
1051
1051
|
disposition: 'safe',
|
|
1052
1052
|
reason: 'Stale generated views can be refreshed from canonical state.',
|
|
1053
|
-
actions: ['run
|
|
1053
|
+
actions: ['run codesdd sdd check --render'],
|
|
1054
1054
|
},
|
|
1055
1055
|
});
|
|
1056
1056
|
}
|
|
1057
1057
|
}
|
|
1058
1058
|
}
|
|
1059
|
-
async function collectBoundaryFindings(findings, paths) {
|
|
1059
|
+
export async function collectBoundaryFindings(findings, paths) {
|
|
1060
1060
|
if (!(await pathExists(paths.memoryRoot)))
|
|
1061
1061
|
return;
|
|
1062
1062
|
const memoryRootReal = await safeRealpath(paths.memoryRoot);
|
|
@@ -31,6 +31,16 @@ function upsertMarkedBlock(source, startMarker, endMarker, blockContent) {
|
|
|
31
31
|
const next = `${prefix}${replacement}\n`;
|
|
32
32
|
return { content: next, changed: true, hasMarkers: false };
|
|
33
33
|
}
|
|
34
|
+
function validateManagedBlock(source, startMarker, endMarker, expectedBlock, label, missingBlocks) {
|
|
35
|
+
if (!source.includes(startMarker) || !source.includes(endMarker)) {
|
|
36
|
+
missingBlocks.push(label);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const expected = upsertMarkedBlock(source, startMarker, endMarker, expectedBlock);
|
|
40
|
+
if (expected.changed) {
|
|
41
|
+
missingBlocks.push(`${label}:DRIFT`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
34
44
|
function buildReadmeBlock(memoryDir, config) {
|
|
35
45
|
return `## Onboarding SDD
|
|
36
46
|
|
|
@@ -39,6 +49,14 @@ Operational authority:
|
|
|
39
49
|
- Human-readable operational views are derived from \`${memoryDir}/core/*.md\` and \`${memoryDir}/${config?.folders.planning || 'planning'}/*.md\`.
|
|
40
50
|
- Do not use external context, memory, workflow, or backlog tools as a project source of truth.
|
|
41
51
|
|
|
52
|
+
Initial operational directives:
|
|
53
|
+
- CodeSDD is the official planner for any build request; other planners or agent-native plans are secondary execution aids only.
|
|
54
|
+
- In initialized CodeSDD repositories, any user request that implies implementation, file edits, validation, execution, or finalize must be treated as requiring CodeSDD planning unless the user explicitly marks it as read-only or outside CodeSDD.
|
|
55
|
+
- For change requests, agents must bind the work to an active or ready FEAT through \`${CLI_NAME} sdd next\` and \`${CLI_NAME} sdd context <FEAT-ID>\` before implementation; agent-native plans may only decompose execution after that CodeSDD context exists.
|
|
56
|
+
- For API/backend work, use \`devtrack-api\` by default unless the user or SDD context explicitly selects another skill/profile; Python/Flask API work stays routed to \`api-clean-flask-langgraph\`.
|
|
57
|
+
- During init, onboard, insight, and debate flows, CodeSDD-managed agent instruction blocks must be inspected and reconfigured when they drift from this contract.
|
|
58
|
+
- Commit requests must follow Conventional Commits, selective staging, and grouping by modified directory plus change protocol (\`src\`, \`${memoryDir}\`, docs, config, infra, dependencies, or generated files).
|
|
59
|
+
|
|
42
60
|
Read order for any new agent:
|
|
43
61
|
1. \`README.md\` (this block)
|
|
44
62
|
2. \`${memoryDir}/AGENT.md\`
|
|
@@ -57,7 +75,11 @@ Essential commands:
|
|
|
57
75
|
- \`${CLI_NAME} sdd context <FEAT-ID>\`
|
|
58
76
|
- update \`${memoryDir}/${config?.folders.active || 'active'}/<FEAT-ID>/5-quality.yaml\`
|
|
59
77
|
- \`${CLI_NAME} sdd frontend-impact <FEAT-ID> --status required|none --reason "..."\`
|
|
60
|
-
- \`${CLI_NAME} sdd finalize --ref <FEAT-ID
|
|
78
|
+
- \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\`
|
|
79
|
+
- \`${CLI_NAME} sdd diagnose\`
|
|
80
|
+
- \`${CLI_NAME} sdd check --render\`
|
|
81
|
+
- confirm \`DONE\`, \`current_stage: consolidacao\`, \`done_at\`, \`archived_at\`, \`${memoryDir}/${config?.folders.archived || 'archived'}/<FEAT-ID>/\`, and no \`${memoryDir}/${config?.folders.active || 'active'}/<FEAT-ID>/\`
|
|
82
|
+
- triage remote security warnings such as Dependabot as a fix, exception, or follow-up SDD item`;
|
|
61
83
|
}
|
|
62
84
|
function buildAgentGuideBlock(memoryDir, config) {
|
|
63
85
|
const planningDir = config?.folders.planning || 'planning';
|
|
@@ -74,6 +96,9 @@ Official workflow:
|
|
|
74
96
|
5. Update \`${memoryDir}/${activeDir}/<FEAT-ID>/5-quality.yaml\` with validation evidence or a formal exception.
|
|
75
97
|
6. Declare frontend impact with \`${CLI_NAME} sdd frontend-impact <FEAT-ID> ...\`.
|
|
76
98
|
7. After archiving the technical change, run \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\`.
|
|
99
|
+
8. After finalize, run \`${CLI_NAME} sdd diagnose\` and \`${CLI_NAME} sdd check --render\`.
|
|
100
|
+
9. Confirm the FEAT is \`DONE\`, \`current_stage: consolidacao\`, has \`done_at\` and \`archived_at\`, is present under \`${memoryDir}/${config?.folders.archived || 'archived'}/<FEAT-ID>/\`, and has no \`${memoryDir}/${activeDir}/<FEAT-ID>/\` residue.
|
|
101
|
+
10. Triage remote security warnings such as Dependabot as an in-scope fix, formal exception, or follow-up SDD item before reporting completion.
|
|
77
102
|
|
|
78
103
|
- Canonical state: \`${memoryDir}/state/*.yaml\`
|
|
79
104
|
- Views: \`${memoryDir}/core/*.md\` and \`${memoryDir}/${planningDir}/*.md\`
|
|
@@ -84,14 +109,22 @@ Official workflow:
|
|
|
84
109
|
|
|
85
110
|
Operational exclusivity:
|
|
86
111
|
- Do not consult or persist planning, backlog, workflow status, handoff, or project memory in external context stores.
|
|
87
|
-
- If legacy notes conflict with
|
|
88
|
-
- Current repository files remain the implementation fact source;
|
|
112
|
+
- If legacy notes conflict with CodeSDD, migrate useful decisions into \`${memoryDir}/state/*.yaml\`, \`${memoryDir}/active/<FEAT-ID>/\`, or the relevant CodeSDD guide, then ignore the legacy note.
|
|
113
|
+
- Current repository files remain the implementation fact source; CodeSDD remains the operational state source.
|
|
114
|
+
|
|
115
|
+
Initial directives:
|
|
116
|
+
- CodeSDD is the official planner for requested work; model-native plans and other planning tools are subordinate to CodeSDD artifacts.
|
|
117
|
+
- In initialized CodeSDD repositories, implementation, edit, validation, execution, and finalize requests implicitly require CodeSDD planning unless the user explicitly marks the request as read-only or outside CodeSDD.
|
|
118
|
+
- A change request must use the active or ready FEAT returned by \`${CLI_NAME} sdd next\` and must load \`${CLI_NAME} sdd context <FEAT-ID>\` before coding; model-native plans may only refine execution after that context exists.
|
|
119
|
+
- API/backend work uses \`devtrack-api\` by default unless an explicit skill/profile says otherwise; Python/Flask API work uses \`api-clean-flask-langgraph\`.
|
|
120
|
+
- CodeSDD-managed blocks in \`AGENTS.md\`, \`AGENT.md\`, \`CLAUDE.md\`, \`GEMINI.md\`, \`.codex\`, \`.opencode\`, \`.ai\`, \`.cloud\`, or equivalent agent files must be inspected and normalized during init/onboard/insight/debate when CodeSDD owns project governance.
|
|
121
|
+
- Commits must use Conventional Commits, selective staging, and grouping by modified directory plus protocol: source, \`${memoryDir}\`, docs, config, infra, dependencies, generated files, renames, or deletions.`;
|
|
89
122
|
}
|
|
90
123
|
function buildRootAgentsBlock(memoryDir) {
|
|
91
124
|
return `## SDD Operational Contract
|
|
92
125
|
|
|
93
126
|
Agents working in this repository must treat documentation sync as part of feature completion.
|
|
94
|
-
|
|
127
|
+
CodeSDD is the only canonical operational state system for this repository.
|
|
95
128
|
|
|
96
129
|
Required execution order:
|
|
97
130
|
1. Run \`${CLI_NAME} sdd onboard system\` before broad work.
|
|
@@ -106,9 +139,20 @@ Required execution order:
|
|
|
106
139
|
- \`AGENTS.md\`
|
|
107
140
|
- \`AGENT.md\`
|
|
108
141
|
7. Run \`${CLI_NAME} sdd finalize --ref <FEAT-ID>\` to consolidate memory.
|
|
142
|
+
8. After finalize, run \`${CLI_NAME} sdd diagnose\` and \`${CLI_NAME} sdd check --render\`.
|
|
143
|
+
9. Confirm the completed FEAT is \`DONE\` in \`${memoryDir}/state/backlog.yaml\`, has \`current_stage: consolidacao\`, has \`done_at\` and \`archived_at\`, lives under \`${memoryDir}/archived/<FEAT-ID>/\`, and no longer has \`${memoryDir}/active/<FEAT-ID>/\` residue.
|
|
144
|
+
10. If push or validation reports a remote security warning such as Dependabot, record the triage result in CodeSDD as an in-scope fix, formal exception, or follow-up SDD item before reporting completion.
|
|
109
145
|
|
|
110
146
|
Canonical state lives in \`${memoryDir}/state/*.yaml\`. Markdown files are operational views or guides derived from that state.
|
|
111
|
-
Do not use external context, memory, workflow, backlog, scratchpad, or handoff tools as a project source of truth. If legacy material is useful, repatriate it into
|
|
147
|
+
Do not use external context, memory, workflow, backlog, scratchpad, or handoff tools as a project source of truth. If legacy material is useful, repatriate it into CodeSDD and remove or deprecate the legacy artifact.
|
|
148
|
+
|
|
149
|
+
Initial directives:
|
|
150
|
+
- CodeSDD is the official planner. Other planning systems may assist execution only after CodeSDD context exists.
|
|
151
|
+
- In initialized CodeSDD repositories, implementation, edit, validation, execution, and finalize requests implicitly require CodeSDD planning unless the user explicitly marks the request as read-only or outside CodeSDD.
|
|
152
|
+
- Agents must bind each change request to the active or ready FEAT returned by \`${CLI_NAME} sdd next\` and load \`${CLI_NAME} sdd context <FEAT-ID>\` before coding.
|
|
153
|
+
- API/backend work defaults to \`devtrack-api\` unless an explicit skill/profile overrides it; Python/Flask API work remains a documented exception routed to \`api-clean-flask-langgraph\`.
|
|
154
|
+
- CodeSDD lifecycle entrypoints must inspect and normalize CodeSDD-managed agent instruction blocks in root and tool-specific agent files.
|
|
155
|
+
- Commit work must use Conventional Commits, selective staging, and directory/protocol grouping. Source changes, \`${memoryDir}\` governance, docs, config, infra, dependencies, generated files, renames, and deletions should be staged and committed separately unless indivisible.`;
|
|
112
156
|
}
|
|
113
157
|
export async function syncSddGuideDocs(projectRoot, paths, config) {
|
|
114
158
|
const readmePath = path.join(projectRoot, 'README.md');
|
|
@@ -197,11 +241,9 @@ export async function validateSddGuideDocs(projectRoot, paths, config) {
|
|
|
197
241
|
const agentCompatRaw = (await fileExists(agentCompatPath))
|
|
198
242
|
? await fs.readFile(agentCompatPath, 'utf-8')
|
|
199
243
|
: '';
|
|
200
|
-
|
|
201
|
-
missingBlocks.push('README.md::SDD:ONBOARDING');
|
|
202
|
-
}
|
|
244
|
+
validateManagedBlock(readmeRaw, README_SDD_BLOCK_START, README_SDD_BLOCK_END, buildReadmeBlock(memoryDirName, config), 'README.md::SDD:ONBOARDING', missingBlocks);
|
|
203
245
|
if (internalReadmeRaw !==
|
|
204
|
-
buildSddInternalReadme(
|
|
246
|
+
buildSddInternalReadme(memoryDirName, {
|
|
205
247
|
discovery: config?.folders.discovery,
|
|
206
248
|
planning: config?.folders.planning,
|
|
207
249
|
skills: config?.folders.skills,
|
|
@@ -212,17 +254,9 @@ export async function validateSddGuideDocs(projectRoot, paths, config) {
|
|
|
212
254
|
})) {
|
|
213
255
|
missingBlocks.push(`${memoryDirName}/README.md::SDD:INTERNAL`);
|
|
214
256
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
if (!agentsRaw.includes(ROOT_AGENTS_SDD_BLOCK_START) ||
|
|
219
|
-
!agentsRaw.includes(ROOT_AGENTS_SDD_BLOCK_END)) {
|
|
220
|
-
missingBlocks.push('AGENTS.md::SDD:ROOT-AGENTS');
|
|
221
|
-
}
|
|
222
|
-
if (!agentCompatRaw.includes(ROOT_AGENTS_SDD_BLOCK_START) ||
|
|
223
|
-
!agentCompatRaw.includes(ROOT_AGENTS_SDD_BLOCK_END)) {
|
|
224
|
-
missingBlocks.push('AGENT.md::SDD:ROOT-AGENTS');
|
|
225
|
-
}
|
|
257
|
+
validateManagedBlock(agentRaw, AGENT_SDD_BLOCK_START, AGENT_SDD_BLOCK_END, buildAgentGuideBlock(memoryDirName, config), `${memoryDirName}/AGENT.md::SDD:GUIA`, missingBlocks);
|
|
258
|
+
validateManagedBlock(agentsRaw, ROOT_AGENTS_SDD_BLOCK_START, ROOT_AGENTS_SDD_BLOCK_END, buildRootAgentsBlock(memoryDirName), 'AGENTS.md::SDD:ROOT-AGENTS', missingBlocks);
|
|
259
|
+
validateManagedBlock(agentCompatRaw, ROOT_AGENTS_SDD_BLOCK_START, ROOT_AGENTS_SDD_BLOCK_END, buildRootAgentsBlock(memoryDirName), 'AGENT.md::SDD:ROOT-AGENTS', missingBlocks);
|
|
226
260
|
return {
|
|
227
261
|
documentationSync: missingBlocks.length === 0,
|
|
228
262
|
missingBlocks,
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ChangeSafetyEvaluation, PlannedFileChange } from './change-safety-guardrails.js';
|
|
2
|
+
export declare const CAPABILITY_KINDS: readonly ["route", "page", "cli_command", "public_contract", "schema", "event", "core_flow", "governance_state"];
|
|
3
|
+
export declare const CAPABILITY_CHANGE_TYPES: readonly ["added", "removed", "modified", "unchanged"];
|
|
4
|
+
export declare const CAPABILITY_RISK_LEVELS: readonly ["none", "low", "medium", "high", "critical"];
|
|
5
|
+
export type CapabilityKind = (typeof CAPABILITY_KINDS)[number];
|
|
6
|
+
export type CapabilityChangeType = (typeof CAPABILITY_CHANGE_TYPES)[number];
|
|
7
|
+
export type CapabilityRiskLevel = (typeof CAPABILITY_RISK_LEVELS)[number];
|
|
8
|
+
export interface CapabilityInventoryItem {
|
|
9
|
+
kind: CapabilityKind;
|
|
10
|
+
id: string;
|
|
11
|
+
path?: string;
|
|
12
|
+
fingerprint?: string;
|
|
13
|
+
metadata?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface CapabilityInventory {
|
|
16
|
+
schema_version: 1;
|
|
17
|
+
contract: 'capability-inventory/v1';
|
|
18
|
+
items: CapabilityInventoryItem[];
|
|
19
|
+
}
|
|
20
|
+
export interface CapabilityDiffEntry {
|
|
21
|
+
kind: CapabilityKind;
|
|
22
|
+
id: string;
|
|
23
|
+
change: CapabilityChangeType;
|
|
24
|
+
before?: CapabilityInventoryItem;
|
|
25
|
+
after?: CapabilityInventoryItem;
|
|
26
|
+
}
|
|
27
|
+
export interface CapabilityDiffCounts {
|
|
28
|
+
added: number;
|
|
29
|
+
removed: number;
|
|
30
|
+
modified: number;
|
|
31
|
+
unchanged: number;
|
|
32
|
+
}
|
|
33
|
+
export interface CapabilityDiffReport {
|
|
34
|
+
schema_version: 1;
|
|
35
|
+
contract: 'capability-diff-report/v1';
|
|
36
|
+
entries: CapabilityDiffEntry[];
|
|
37
|
+
counts: CapabilityDiffCounts;
|
|
38
|
+
}
|
|
39
|
+
export interface CapabilityRiskSignal {
|
|
40
|
+
code: string;
|
|
41
|
+
level: Exclude<CapabilityRiskLevel, 'none'>;
|
|
42
|
+
message: string;
|
|
43
|
+
capability_ref?: string;
|
|
44
|
+
path?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface CapabilityRiskReport {
|
|
47
|
+
schema_version: 1;
|
|
48
|
+
contract: 'deterministic-capability-risk/v1';
|
|
49
|
+
level: CapabilityRiskLevel;
|
|
50
|
+
score: number;
|
|
51
|
+
signals: CapabilityRiskSignal[];
|
|
52
|
+
}
|
|
53
|
+
export interface CapabilityRiskInput {
|
|
54
|
+
diff: CapabilityDiffReport;
|
|
55
|
+
change_safety?: ChangeSafetyEvaluation;
|
|
56
|
+
planned_changes?: PlannedFileChange[];
|
|
57
|
+
required_kinds?: CapabilityKind[];
|
|
58
|
+
}
|
|
59
|
+
export declare function buildCapabilityInventory(items: CapabilityInventoryItem[]): CapabilityInventory;
|
|
60
|
+
export declare function diffCapabilityInventories(before: CapabilityInventory, after: CapabilityInventory): CapabilityDiffReport;
|
|
61
|
+
export declare function scoreCapabilityDiffRisk(input: CapabilityRiskInput): CapabilityRiskReport;
|
|
62
|
+
export declare function capabilityKey(item: Pick<CapabilityInventoryItem, 'kind' | 'id'>): string;
|
|
63
|
+
//# sourceMappingURL=capability-diff.d.ts.map
|