@devtrack-solution/codesdd 1.2.2 → 1.2.3
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 +160 -28
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
- 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 +317 -0
- package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
- package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
- package/LICENSE +1 -1
- package/README.md +243 -51
- package/bin/codesdd.js +3 -2
- 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 +159 -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 +147 -16
- package/dist/commands/sdd/plugin.d.ts +3 -0
- package/dist/commands/sdd/plugin.js +153 -0
- package/dist/commands/sdd/shared.js +2 -23
- package/dist/commands/sdd/skills.js +7 -0
- package/dist/commands/sdd.js +69 -12
- 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 +10 -1
- package/dist/core/cli-command-quality.d.ts +27 -0
- package/dist/core/cli-command-quality.js +171 -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 +155 -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 +3 -1
- package/dist/core/config-schema.js +26 -1
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +4 -4
- package/dist/core/global-config.d.ts +41 -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/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 +42 -0
- package/dist/core/sdd/check.js +22 -22
- 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 +38 -0
- package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
- package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
- package/dist/core/sdd/deepagent-contracts.js +173 -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 +2 -2
- package/dist/core/sdd/default-bootstrap-files.js +36 -2
- package/dist/core/sdd/default-skills.d.ts +30 -0
- package/dist/core/sdd/default-skills.js +181 -5
- package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
- package/dist/core/sdd/devtrack-api-appliance.js +257 -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 +33 -5
- 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/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/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/json-schema.js +100 -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 +431 -43
- package/dist/core/sdd/lenses.d.ts +1 -0
- package/dist/core/sdd/lenses.js +29 -1
- package/dist/core/sdd/migrate-workspace.js +56 -2
- package/dist/core/sdd/migrate.d.ts +1 -1
- package/dist/core/sdd/migrate.js +36 -2
- package/dist/core/sdd/package-structure-gate.d.ts +83 -0
- package/dist/core/sdd/package-structure-gate.js +362 -0
- package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
- package/dist/core/sdd/parallel-feat-automation.js +212 -0
- package/dist/core/sdd/plugin-broker.d.ts +558 -0
- package/dist/core/sdd/plugin-broker.js +482 -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 +109 -0
- package/dist/core/sdd/plugin-cli.js +198 -0
- package/dist/core/sdd/plugin-evidence.d.ts +275 -0
- package/dist/core/sdd/plugin-evidence.js +307 -0
- package/dist/core/sdd/plugin-manifest.d.ts +164 -0
- package/dist/core/sdd/plugin-manifest.js +215 -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 +311 -0
- package/dist/core/sdd/plugin-registry.js +138 -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 +547 -0
- package/dist/core/sdd/quality-validation.js +239 -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/sanitize.d.ts +30 -1
- package/dist/core/sdd/sanitize.js +23 -23
- package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
- package/dist/core/sdd/services/agent-run.service.js +189 -0
- package/dist/core/sdd/services/breakdown.service.js +2 -1
- package/dist/core/sdd/services/context.service.js +18 -16
- 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 +80 -0
- package/dist/core/sdd/services/finalize.service.js +323 -24
- package/dist/core/sdd/services/frontend-gap.service.js +22 -7
- 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/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 +22 -0
- package/dist/core/sdd/state.js +66 -41
- package/dist/core/sdd/structural-health.d.ts +42 -42
- package/dist/core/sdd/types.d.ts +33 -7
- package/dist/core/sdd/types.js +17 -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/workspace-schemas.d.ts +285 -14
- package/dist/core/sdd/workspace-schemas.js +148 -0
- 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/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 +27 -17
- package/schemas/sdd/1-spec.schema.json +1 -1
- package/schemas/sdd/2-plan.schema.json +73 -1
- 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 +442 -2
- 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/backlog-projection-plan.schema.json +180 -0
- package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
- package/schemas/sdd/codesdd-plugin.schema.json +474 -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 +321 -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 +215 -0
- package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
- package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -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 +569 -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 +558 -0
- package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
- package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -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 +1228 -0
- package/schemas/sdd/quality-run.schema.json +197 -0
- package/schemas/sdd/quality-scenario.schema.json +252 -0
- package/schemas/sdd/workspace-catalog.schema.json +9841 -22
- 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
|
@@ -2,6 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { CLI_NAME } from "../../branding.js";
|
|
3
3
|
import { loadStateSnapshot } from "../state.js";
|
|
4
4
|
import { bundlesForSkills, getRuntime, relProjectPath, coreDocRef, planningDocRef, resolveActiveDocRefs } from "../legacy-operations.js";
|
|
5
|
+
import { normalizeSddEntityRef } from "../entity-reference.js";
|
|
5
6
|
import { ContextService } from "./context.service.js";
|
|
6
7
|
import { NextService } from "./next.service.js";
|
|
7
8
|
export class OnboardService {
|
|
@@ -12,7 +13,7 @@ export class OnboardService {
|
|
|
12
13
|
async execute(projectRoot, target = 'system', options) {
|
|
13
14
|
const { config, paths } = await getRuntime(projectRoot);
|
|
14
15
|
const snapshot = await loadStateSnapshot(paths, config);
|
|
15
|
-
const normalized = (target || 'system')
|
|
16
|
+
const normalized = normalizeSddEntityRef(target || 'system');
|
|
16
17
|
const contextCmd = new ContextService(this.stores);
|
|
17
18
|
const baseReadOrder = [
|
|
18
19
|
'README.md',
|
|
@@ -6,6 +6,7 @@ import { BacklogStateSchema, DiscoveryIndexStateSchema, } from '../types.js';
|
|
|
6
6
|
import { activeDocNamesForLayout, buildBacklogItem, computeCanonicalTitle, ensureFeatureQualityContract, ensureMemoryInitialized, relProjectPath, } from '../legacy-operations.js';
|
|
7
7
|
import { renderViews } from '../views.js';
|
|
8
8
|
import { parseWorkspaceYamlDocument, } from '../workspace-schemas.js';
|
|
9
|
+
import { parseGovernanceFile } from '../governance-parser.js';
|
|
9
10
|
const DISCOVERY_STATUSES = new Set([
|
|
10
11
|
'NEW',
|
|
11
12
|
'DEBATED',
|
|
@@ -78,6 +79,10 @@ function discoveryStatusFromMarkdown(content, type, discarded) {
|
|
|
78
79
|
return 'READY';
|
|
79
80
|
}
|
|
80
81
|
function titleFromMarkdown(content, id, fileName) {
|
|
82
|
+
const parsed = parseGovernanceFile(fileName, content);
|
|
83
|
+
const frontmatterTitle = parsed.frontmatter && typeof parsed.frontmatter === 'object' && typeof parsed.frontmatter.title === 'string'
|
|
84
|
+
? parsed.frontmatter.title
|
|
85
|
+
: '';
|
|
81
86
|
const titleBlock = /^## Title\s*\n+(.+)$/im.exec(content);
|
|
82
87
|
const baseTitle = /^\s*-\s*Base title:\s*(.+)$/im.exec(content);
|
|
83
88
|
const heading = /^#\s+(.+)$/m.exec(content);
|
|
@@ -86,7 +91,7 @@ function titleFromMarkdown(content, id, fileName) {
|
|
|
86
91
|
.replace(new RegExp(`^${id}-?`, 'i'), '')
|
|
87
92
|
.replace(/-/g, ' ')
|
|
88
93
|
.trim();
|
|
89
|
-
const candidate = (titleBlock?.[1] || baseTitle?.[1] || heading?.[1] || slugTitle || id).trim();
|
|
94
|
+
const candidate = (frontmatterTitle || titleBlock?.[1] || baseTitle?.[1] || heading?.[1] || slugTitle || id).trim();
|
|
90
95
|
const cleaned = candidate
|
|
91
96
|
.replace(new RegExp(`^(Insight|Debate|Epic)\\s+${id}\\s*:?\\s*`, 'i'), '')
|
|
92
97
|
.trim();
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import { SddStores } from "../store/sdd-stores.js";
|
|
2
|
+
type SkillManifestDriftLayer = 'canonical' | 'user-extension';
|
|
3
|
+
type SkillManifestDriftStatus = 'missing' | 'modified';
|
|
4
|
+
export interface SkillManifestDriftAlert {
|
|
5
|
+
skill_id: string;
|
|
6
|
+
layer: SkillManifestDriftLayer;
|
|
7
|
+
status: SkillManifestDriftStatus;
|
|
8
|
+
expected_sha256?: string;
|
|
9
|
+
observed_sha256: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SkillsSyncResult {
|
|
12
|
+
synced: number;
|
|
13
|
+
local_synced: number;
|
|
14
|
+
tools: string[];
|
|
15
|
+
alerts: SkillManifestDriftAlert[];
|
|
16
|
+
}
|
|
2
17
|
export declare class SkillsSyncService {
|
|
3
18
|
private readonly stores;
|
|
4
19
|
constructor(stores: SddStores);
|
|
@@ -6,10 +21,7 @@ export declare class SkillsSyncService {
|
|
|
6
21
|
bundles?: string[];
|
|
7
22
|
all?: boolean;
|
|
8
23
|
tools?: string[];
|
|
9
|
-
}): Promise<
|
|
10
|
-
synced: number;
|
|
11
|
-
local_synced: number;
|
|
12
|
-
tools: string[];
|
|
13
|
-
}>;
|
|
24
|
+
}): Promise<SkillsSyncResult>;
|
|
14
25
|
}
|
|
26
|
+
export {};
|
|
15
27
|
//# sourceMappingURL=skills-sync.service.d.ts.map
|
|
@@ -3,9 +3,31 @@ import { promises as fs } from "node:fs";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { AI_TOOLS } from "../../config.js";
|
|
5
5
|
import { loadSkillCatalogState } from "../state.js";
|
|
6
|
+
import { DEFAULT_CURATED_SKILL_CATALOG, computeSkillManifestSha256 } from "../default-skills.js";
|
|
6
7
|
import { getRuntime, buildCuratedSkillContent } from "../legacy-operations.js";
|
|
7
8
|
import { SddWriteTransaction } from "../write-manifest.js";
|
|
8
9
|
const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../');
|
|
10
|
+
const ZERO_HASH = '0000000000000000000000000000000000000000000000000000000000000000';
|
|
11
|
+
const CANONICAL_SKILL_IDS = new Set(DEFAULT_CURATED_SKILL_CATALOG.skills.map((entry) => entry.id));
|
|
12
|
+
function normalizeIntegrityHash(hash) {
|
|
13
|
+
if (!hash) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const normalized = hash.trim().toLowerCase();
|
|
17
|
+
if (!/^[a-f0-9]{64}$/.test(normalized)) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
if (normalized === ZERO_HASH) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return normalized;
|
|
24
|
+
}
|
|
25
|
+
function isCanonicalCriticalSkill(entry) {
|
|
26
|
+
if (entry.deterministic_pair) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return entry.bundle_ids.includes('architecture-backend');
|
|
30
|
+
}
|
|
9
31
|
function isInside(parent, child) {
|
|
10
32
|
const relative = path.relative(parent, child);
|
|
11
33
|
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
|
|
@@ -78,9 +100,35 @@ export class SkillsSyncService {
|
|
|
78
100
|
});
|
|
79
101
|
await fs.mkdir(paths.skillsCuratedDir, { recursive: true });
|
|
80
102
|
const contentBySkillId = new Map();
|
|
103
|
+
const driftAlerts = [];
|
|
104
|
+
const criticalCanonicalDrift = [];
|
|
81
105
|
for (const entry of selected) {
|
|
82
106
|
const content = await resolveCuratedSkillContent(paths, entry);
|
|
107
|
+
const observedHash = computeSkillManifestSha256(content);
|
|
108
|
+
const expectedHash = normalizeIntegrityHash(entry.integrity_hash);
|
|
109
|
+
if (!expectedHash || expectedHash !== observedHash) {
|
|
110
|
+
const alert = {
|
|
111
|
+
skill_id: entry.id,
|
|
112
|
+
layer: CANONICAL_SKILL_IDS.has(entry.id) ? 'canonical' : 'user-extension',
|
|
113
|
+
status: expectedHash ? 'modified' : 'missing',
|
|
114
|
+
expected_sha256: expectedHash,
|
|
115
|
+
observed_sha256: observedHash,
|
|
116
|
+
};
|
|
117
|
+
driftAlerts.push(alert);
|
|
118
|
+
if (alert.layer === 'canonical' && isCanonicalCriticalSkill(entry)) {
|
|
119
|
+
criticalCanonicalDrift.push(alert);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
83
122
|
contentBySkillId.set(entry.id, content);
|
|
123
|
+
}
|
|
124
|
+
if (criticalCanonicalDrift.length > 0) {
|
|
125
|
+
const details = criticalCanonicalDrift
|
|
126
|
+
.map((alert) => `- ${alert.skill_id}: ${alert.status} (expected=${alert.expected_sha256 || '<missing>'}, observed=${alert.observed_sha256})`)
|
|
127
|
+
.join('\n');
|
|
128
|
+
throw new Error(`Skill manifest drift detected in canonical layer. Sync blocked until canonical hashes are restored.\n${details}`);
|
|
129
|
+
}
|
|
130
|
+
for (const entry of selected) {
|
|
131
|
+
const content = contentBySkillId.get(entry.id) || await resolveCuratedSkillContent(paths, entry);
|
|
84
132
|
await materializeLocalSourceSkill(paths, entry, content);
|
|
85
133
|
const tx = new SddWriteTransaction();
|
|
86
134
|
const localDir = path.join(paths.skillsCuratedDir, entry.id);
|
|
@@ -88,7 +136,7 @@ export class SkillsSyncService {
|
|
|
88
136
|
await tx.commit(paths.projectRoot, paths.memoryRoot, 'skills-sync.service (local dir)');
|
|
89
137
|
}
|
|
90
138
|
if (selected.length === 0) {
|
|
91
|
-
return { synced: 0, local_synced: 0, tools: [] };
|
|
139
|
+
return { synced: 0, local_synced: 0, tools: [], alerts: [] };
|
|
92
140
|
}
|
|
93
141
|
const targetTools = (options?.tools && options.tools.length > 0
|
|
94
142
|
? AI_TOOLS.filter((tool) => options.tools?.includes(tool.value))
|
|
@@ -111,7 +159,12 @@ export class SkillsSyncService {
|
|
|
111
159
|
}
|
|
112
160
|
syncedTools.push(tool.value);
|
|
113
161
|
}
|
|
114
|
-
return {
|
|
162
|
+
return {
|
|
163
|
+
synced: selected.length,
|
|
164
|
+
local_synced: selected.length,
|
|
165
|
+
tools: syncedTools,
|
|
166
|
+
alerts: driftAlerts.filter((alert) => alert.layer === 'user-extension' || !criticalCanonicalDrift.some((critical) => critical.skill_id === alert.skill_id)),
|
|
167
|
+
};
|
|
115
168
|
}
|
|
116
169
|
}
|
|
117
170
|
//# sourceMappingURL=skills-sync.service.js.map
|
|
@@ -9,6 +9,7 @@ import { slugify, findDiscoveryRecord, ensureFeatureQualityContract, bundlesForS
|
|
|
9
9
|
import { SddWriteTransaction } from "../write-manifest.js";
|
|
10
10
|
import { withStateLock } from "../state-lock.js";
|
|
11
11
|
import { featureDeclaresMandatoryAdrImpact } from "../adr-policy.js";
|
|
12
|
+
import { normalizeFeatRef } from "../entity-reference.js";
|
|
12
13
|
export class StartService {
|
|
13
14
|
stores;
|
|
14
15
|
constructor(stores) {
|
|
@@ -25,8 +26,9 @@ export class StartService {
|
|
|
25
26
|
const catalog = await loadSkillCatalogState(paths);
|
|
26
27
|
const now = nowIso();
|
|
27
28
|
let feature;
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
const normalizedFeatureRef = normalizeFeatRef(value);
|
|
30
|
+
if (normalizedFeatureRef || /^FEAT-\d{3,}$/.test(value)) {
|
|
31
|
+
feature = resolveFeat(snapshot.backlog.items, normalizedFeatureRef || value);
|
|
30
32
|
}
|
|
31
33
|
else if (/^(?:RAD|EPIC)-\d{3,}$/.test(value)) {
|
|
32
34
|
const existing = snapshot.backlog.items.find((item) => (item.origin_type === 'radar' || item.origin_type === 'epic') && item.origin_ref === value);
|
|
@@ -90,8 +92,8 @@ export class StartService {
|
|
|
90
92
|
if (!feature.change_name) {
|
|
91
93
|
const base = slugify(`${feature.id}-${feature.title}`).slice(0, 50).replace(/-+$/g, '') ||
|
|
92
94
|
feature.id.toLowerCase();
|
|
93
|
-
//
|
|
94
|
-
// It must not materialize legacy
|
|
95
|
+
// CodeSDD-native execution keeps this as a compatibility identifier only.
|
|
96
|
+
// It must not materialize legacy CodeSDD change directories.
|
|
95
97
|
feature.change_name = base;
|
|
96
98
|
}
|
|
97
99
|
await runLifecycleHooks('before-start', {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Schema for the curated skill-bundles document emitted as a Markdown view
|
|
4
|
+
* (`curation-en-us.md` / `curadoria-pt-br.md`) AND as canonical YAML
|
|
5
|
+
* (`curation-en-us.yaml` / `curadoria-pt-br.yaml`).
|
|
6
|
+
*
|
|
7
|
+
* EPIC-0072 wave 1 (FEAT-0284) introduces this YAML form as the precursor
|
|
8
|
+
* that validates the toolchain choice (`yaml` + `zod` without `gray-matter`)
|
|
9
|
+
* before the rest of the governance plane migrates to frontmatter + body.
|
|
10
|
+
*
|
|
11
|
+
* The Markdown form remains generated for human readability and is treated
|
|
12
|
+
* as a derived view; the YAML form is the structured contract.
|
|
13
|
+
*/
|
|
14
|
+
export declare const skillBundleEntrySchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
title: z.ZodString;
|
|
17
|
+
skill_ids: z.ZodArray<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export declare const highlightedSkillSchema: z.ZodObject<{
|
|
20
|
+
skill_id: z.ZodString;
|
|
21
|
+
bundle_id: z.ZodString;
|
|
22
|
+
canonical_path: z.ZodString;
|
|
23
|
+
notes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export declare const skillBundlesCurationSchema: z.ZodObject<{
|
|
26
|
+
schema_version: z.ZodLiteral<1>;
|
|
27
|
+
layout: z.ZodEnum<{
|
|
28
|
+
"pt-BR": "pt-BR";
|
|
29
|
+
"en-US": "en-US";
|
|
30
|
+
}>;
|
|
31
|
+
generated_from: z.ZodLiteral<"CURATED_BUNDLES">;
|
|
32
|
+
objective: z.ZodArray<z.ZodString>;
|
|
33
|
+
bundles: z.ZodArray<z.ZodObject<{
|
|
34
|
+
id: z.ZodString;
|
|
35
|
+
title: z.ZodString;
|
|
36
|
+
skill_ids: z.ZodArray<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
highlighted: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
39
|
+
skill_id: z.ZodString;
|
|
40
|
+
bundle_id: z.ZodString;
|
|
41
|
+
canonical_path: z.ZodString;
|
|
42
|
+
notes: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
43
|
+
}, z.core.$strip>>>;
|
|
44
|
+
canonical_source: z.ZodString;
|
|
45
|
+
operational_rule: z.ZodArray<z.ZodString>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
export type SkillBundlesCuration = z.infer<typeof skillBundlesCurationSchema>;
|
|
48
|
+
export type SkillBundleEntry = z.infer<typeof skillBundleEntrySchema>;
|
|
49
|
+
export type HighlightedSkill = z.infer<typeof highlightedSkillSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Parses an arbitrary value (typically loaded from YAML) into a typed
|
|
52
|
+
* curation document. Throws a Zod error on schema violation; callers should
|
|
53
|
+
* surface the error with path-aware context.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseSkillBundlesCuration(value: unknown): SkillBundlesCuration;
|
|
56
|
+
/**
|
|
57
|
+
* Non-throwing variant for callers that prefer to handle errors explicitly.
|
|
58
|
+
*/
|
|
59
|
+
export declare function safeParseSkillBundlesCuration(value: unknown): {
|
|
60
|
+
ok: true;
|
|
61
|
+
data: SkillBundlesCuration;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
error: z.ZodError<SkillBundlesCuration>;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=skill-bundles-curation-schema.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Schema for the curated skill-bundles document emitted as a Markdown view
|
|
4
|
+
* (`curation-en-us.md` / `curadoria-pt-br.md`) AND as canonical YAML
|
|
5
|
+
* (`curation-en-us.yaml` / `curadoria-pt-br.yaml`).
|
|
6
|
+
*
|
|
7
|
+
* EPIC-0072 wave 1 (FEAT-0284) introduces this YAML form as the precursor
|
|
8
|
+
* that validates the toolchain choice (`yaml` + `zod` without `gray-matter`)
|
|
9
|
+
* before the rest of the governance plane migrates to frontmatter + body.
|
|
10
|
+
*
|
|
11
|
+
* The Markdown form remains generated for human readability and is treated
|
|
12
|
+
* as a derived view; the YAML form is the structured contract.
|
|
13
|
+
*/
|
|
14
|
+
export const skillBundleEntrySchema = z.object({
|
|
15
|
+
id: z.string().min(1),
|
|
16
|
+
title: z.string().min(1),
|
|
17
|
+
skill_ids: z.array(z.string().min(1)).min(1),
|
|
18
|
+
});
|
|
19
|
+
export const highlightedSkillSchema = z.object({
|
|
20
|
+
skill_id: z.string().min(1),
|
|
21
|
+
bundle_id: z.string().min(1),
|
|
22
|
+
canonical_path: z.string().min(1),
|
|
23
|
+
notes: z.array(z.string().min(1)).default([]),
|
|
24
|
+
});
|
|
25
|
+
export const skillBundlesCurationSchema = z.object({
|
|
26
|
+
schema_version: z.literal(1),
|
|
27
|
+
layout: z.enum(['en-US', 'pt-BR']),
|
|
28
|
+
generated_from: z.literal('CURATED_BUNDLES'),
|
|
29
|
+
objective: z.array(z.string().min(1)).min(1),
|
|
30
|
+
bundles: z.array(skillBundleEntrySchema).min(1),
|
|
31
|
+
highlighted: z.array(highlightedSkillSchema).default([]),
|
|
32
|
+
canonical_source: z.string().min(1),
|
|
33
|
+
operational_rule: z.array(z.string().min(1)).min(1),
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Parses an arbitrary value (typically loaded from YAML) into a typed
|
|
37
|
+
* curation document. Throws a Zod error on schema violation; callers should
|
|
38
|
+
* surface the error with path-aware context.
|
|
39
|
+
*/
|
|
40
|
+
export function parseSkillBundlesCuration(value) {
|
|
41
|
+
return skillBundlesCurationSchema.parse(value);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Non-throwing variant for callers that prefer to handle errors explicitly.
|
|
45
|
+
*/
|
|
46
|
+
export function safeParseSkillBundlesCuration(value) {
|
|
47
|
+
const result = skillBundlesCurationSchema.safeParse(value);
|
|
48
|
+
if (result.success)
|
|
49
|
+
return { ok: true, data: result.data };
|
|
50
|
+
return { ok: false, error: result.error };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=skill-bundles-curation-schema.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SkillCatalogEntry } from './types.js';
|
|
2
|
+
import type { WorkspacePolicyRequirement } from './skill-policy-pool.js';
|
|
3
|
+
export interface SkillEvidenceEntry {
|
|
4
|
+
skill_id: string;
|
|
5
|
+
note: string;
|
|
6
|
+
source: 'manual' | 'tooling' | 'quality_artifact';
|
|
7
|
+
}
|
|
8
|
+
export interface SkillProvenanceInfo {
|
|
9
|
+
skill_id: string;
|
|
10
|
+
source_repo: string | null;
|
|
11
|
+
source_path: string | null;
|
|
12
|
+
integrity_hash: string;
|
|
13
|
+
synced_at: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildSkillProvenanceRecord(skillId: string, catalog: SkillCatalogEntry[], syncedAt?: string): SkillProvenanceInfo | null;
|
|
16
|
+
export declare function buildSkillEvidenceEntry(skillId: string, note: string, source?: 'manual' | 'tooling' | 'quality_artifact'): SkillEvidenceEntry;
|
|
17
|
+
export declare function buildProvenanceEvidenceFromCatalog(skillIds: string[], catalog: SkillCatalogEntry[]): SkillEvidenceEntry[];
|
|
18
|
+
export declare function buildAppliedPolicyEvidence(policyRequirements: WorkspacePolicyRequirement[], policiesApplied?: Record<string, string>): SkillEvidenceEntry[];
|
|
19
|
+
//# sourceMappingURL=skill-evidence.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function buildSkillProvenanceRecord(skillId, catalog, syncedAt) {
|
|
2
|
+
const entry = catalog.find((s) => s.id === skillId);
|
|
3
|
+
if (!entry)
|
|
4
|
+
return null;
|
|
5
|
+
return {
|
|
6
|
+
skill_id: entry.id,
|
|
7
|
+
source_repo: entry.source_repo ?? null,
|
|
8
|
+
source_path: entry.source_path ?? null,
|
|
9
|
+
integrity_hash: entry.integrity_hash,
|
|
10
|
+
synced_at: syncedAt ?? new Date().toISOString(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function buildSkillEvidenceEntry(skillId, note, source) {
|
|
14
|
+
const noteText = note.length >= 10 ? note : `${note} - Evidence recorded during FEAT execution.`;
|
|
15
|
+
return {
|
|
16
|
+
skill_id: skillId,
|
|
17
|
+
note: noteText,
|
|
18
|
+
source: source ?? 'tooling',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function buildProvenanceEvidenceFromCatalog(skillIds, catalog) {
|
|
22
|
+
const uniqueIds = Array.from(new Set(skillIds.map((id) => id.trim()).filter(Boolean)));
|
|
23
|
+
return uniqueIds
|
|
24
|
+
.map((skillId) => {
|
|
25
|
+
const record = buildSkillProvenanceRecord(skillId, catalog);
|
|
26
|
+
if (!record) {
|
|
27
|
+
return buildSkillEvidenceEntry(skillId, `Skill "${skillId}" not found in catalog. Provenance could not be recorded.`, 'manual');
|
|
28
|
+
}
|
|
29
|
+
return buildSkillEvidenceEntry(skillId, `Skill provenance: source=${record.source_repo ?? 'unknown'}, path=${record.source_path ?? 'unknown'}, hash=${record.integrity_hash}, synced_at=${record.synced_at}`, 'tooling');
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function buildAppliedPolicyEvidence(policyRequirements, policiesApplied) {
|
|
33
|
+
return policyRequirements.map((req) => {
|
|
34
|
+
const appliedNote = policiesApplied?.[req.skill_id] ?? 'All required policy rules applied and validated.';
|
|
35
|
+
return buildSkillEvidenceEntry(req.skill_id, `Applied policy: pool=${req.policy_pool_ref}, contract=${req.source_contract_ref}, enforcement=${req.enforcement}. ${appliedNote}`, 'tooling');
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=skill-evidence.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type PluginPolicyPack } from './plugin-policy-pack.js';
|
|
2
|
+
export interface SkillPolicyEntry {
|
|
3
|
+
ruleId: string;
|
|
4
|
+
skillId: string;
|
|
5
|
+
severity: 'P0' | 'P1' | 'P2';
|
|
6
|
+
title: string;
|
|
7
|
+
appliesTo: string[];
|
|
8
|
+
policyPackId: string;
|
|
9
|
+
detect: string[];
|
|
10
|
+
requiredResponse: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface SkillPolicyPool {
|
|
13
|
+
version: number;
|
|
14
|
+
pools: PluginPolicyPack[];
|
|
15
|
+
entries: SkillPolicyEntry[];
|
|
16
|
+
metadata: {
|
|
17
|
+
derivedFrom: string[];
|
|
18
|
+
generatedAt: string;
|
|
19
|
+
sourceSkillIds: string[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface WorkspacePolicyRequirement {
|
|
23
|
+
skill_id: string;
|
|
24
|
+
policy_pool_ref: string;
|
|
25
|
+
source_contract_ref: string;
|
|
26
|
+
enforcement: 'blocking' | 'advisory';
|
|
27
|
+
required_rule_refs: string[];
|
|
28
|
+
required_evidence: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface WorkspacePolicyInjection {
|
|
31
|
+
version: 1;
|
|
32
|
+
generated_from: 'recommended_skills';
|
|
33
|
+
required_policies: WorkspacePolicyRequirement[];
|
|
34
|
+
}
|
|
35
|
+
export declare function buildWorkspacePolicyInjection(skillIds: string[]): WorkspacePolicyInjection;
|
|
36
|
+
export declare function aiFillDefaultPolicyPack(skillId: string): PluginPolicyPack;
|
|
37
|
+
export declare function aiFillDefaultPolicyEntry(skillId: string, packId: string): SkillPolicyEntry;
|
|
38
|
+
export declare function derivePolicyPackFromContractPack(contractPackPath: string, skillId: string): Promise<{
|
|
39
|
+
packs: PluginPolicyPack[];
|
|
40
|
+
entries: SkillPolicyEntry[];
|
|
41
|
+
}>;
|
|
42
|
+
export declare function derivePolicyPoolFromSkill(skillId: string, options?: {
|
|
43
|
+
projectRoot?: string;
|
|
44
|
+
contractPackRelativePath?: string;
|
|
45
|
+
}): Promise<SkillPolicyPool>;
|
|
46
|
+
//# sourceMappingURL=skill-policy-pool.d.ts.map
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { pluginPolicyPackSchema } from './plugin-policy-pack.js';
|
|
5
|
+
const DEVTRACK_API_BLOCKING_RULES = [
|
|
6
|
+
'DTAPI-P0-PROFILE-001',
|
|
7
|
+
'DTAPI-P0-PREVIEW-001',
|
|
8
|
+
'DTAPI-P0-PATH-001',
|
|
9
|
+
'DTAPI-P0-TYPEORM-001',
|
|
10
|
+
'DTAPI-P0-COMPOSITION-001',
|
|
11
|
+
'DTAPI-P0-MODULES-001',
|
|
12
|
+
'DTAPI-P0-PORTS-001',
|
|
13
|
+
];
|
|
14
|
+
export function buildWorkspacePolicyInjection(skillIds) {
|
|
15
|
+
const uniqueSkillIds = Array.from(new Set(skillIds.map((skillId) => skillId.trim()).filter(Boolean)));
|
|
16
|
+
return {
|
|
17
|
+
version: 1,
|
|
18
|
+
generated_from: 'recommended_skills',
|
|
19
|
+
required_policies: uniqueSkillIds.map((skillId) => buildWorkspacePolicyRequirement(skillId)),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function buildWorkspacePolicyRequirement(skillId) {
|
|
23
|
+
if (skillId === 'devtrack-api') {
|
|
24
|
+
return {
|
|
25
|
+
skill_id: skillId,
|
|
26
|
+
policy_pool_ref: 'skill-policy-pool:devtrack-api',
|
|
27
|
+
source_contract_ref: '.sdd/skills/curated/devtrack-api/references/contract-pack.yaml',
|
|
28
|
+
enforcement: 'blocking',
|
|
29
|
+
required_rule_refs: DEVTRACK_API_BLOCKING_RULES,
|
|
30
|
+
required_evidence: [
|
|
31
|
+
'selected derivation profile recorded in plan',
|
|
32
|
+
'package-structure preview approved or exception documented',
|
|
33
|
+
'devtrack-api architecture validation evidence recorded in quality',
|
|
34
|
+
'skill_evidence entry recorded for devtrack-api before finalize',
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
skill_id: skillId,
|
|
40
|
+
policy_pool_ref: `skill-policy-pool:${skillId}`,
|
|
41
|
+
source_contract_ref: `.sdd/skills/curated/${skillId}/references/contract-pack.yaml`,
|
|
42
|
+
enforcement: 'advisory',
|
|
43
|
+
required_rule_refs: [`${skillId}-DEFAULT-001`],
|
|
44
|
+
required_evidence: [
|
|
45
|
+
`skill_evidence entry recorded for ${skillId} before finalize`,
|
|
46
|
+
`policy conformance checked for ${skillId} before execution relies on the skill`,
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function aiFillDefaultPolicyPack(skillId) {
|
|
51
|
+
return pluginPolicyPackSchema.parse({
|
|
52
|
+
id: `${skillId}-default`,
|
|
53
|
+
version: '1.0.0',
|
|
54
|
+
description: `AI-filled default policy pack derived from skill "${skillId}". No contract pack was provided, so safe defaults are applied.`,
|
|
55
|
+
applies_to: {
|
|
56
|
+
trust_tiers: ['local-dev', 'experimental', 'enterprise-approved'],
|
|
57
|
+
},
|
|
58
|
+
requirements: {
|
|
59
|
+
max_risk_tier: 'medium',
|
|
60
|
+
supply_chain: {
|
|
61
|
+
checksum: true,
|
|
62
|
+
signature_or_provenance: false,
|
|
63
|
+
sbom: false,
|
|
64
|
+
sbom_formats: [],
|
|
65
|
+
},
|
|
66
|
+
validation: {
|
|
67
|
+
min_coverage: 80,
|
|
68
|
+
security_checks: ['dependency-audit'],
|
|
69
|
+
dependency_checks: [],
|
|
70
|
+
},
|
|
71
|
+
execution: {
|
|
72
|
+
network: 'restricted',
|
|
73
|
+
process_spawn: 'forbidden',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export function aiFillDefaultPolicyEntry(skillId, packId) {
|
|
79
|
+
return {
|
|
80
|
+
ruleId: `${skillId}-DEFAULT-001`,
|
|
81
|
+
skillId,
|
|
82
|
+
severity: 'P2',
|
|
83
|
+
title: `Default policy for ${skillId}: verify skill content and intent before use.`,
|
|
84
|
+
appliesTo: ['FEAT', 'source', 'quality'],
|
|
85
|
+
policyPackId: packId,
|
|
86
|
+
detect: ['skill is referenced but not validated against project-local policy pool'],
|
|
87
|
+
requiredResponse: [
|
|
88
|
+
`record skill-policy-pool evidence for ${skillId}`,
|
|
89
|
+
'verify skill conformance before reliant execution',
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export async function derivePolicyPackFromContractPack(contractPackPath, skillId) {
|
|
94
|
+
const raw = await fs.readFile(contractPackPath, 'utf-8');
|
|
95
|
+
const contractPack = parse(raw);
|
|
96
|
+
const packs = [];
|
|
97
|
+
const entries = [];
|
|
98
|
+
const contractId = contractPack.contract_id ?? `${skillId}-contract-pack`;
|
|
99
|
+
const profiles = contractPack.derivation_profiles ?? {};
|
|
100
|
+
const rules = contractPack.rules ?? [];
|
|
101
|
+
for (const [profileName, profile] of Object.entries(profiles)) {
|
|
102
|
+
const packId = `${skillId}-${profileName}`;
|
|
103
|
+
const isDefault = profile.default !== false;
|
|
104
|
+
const packSeverityMap = {
|
|
105
|
+
block_on_p0: 'high',
|
|
106
|
+
block_on_p0_p1: 'high',
|
|
107
|
+
warn: 'medium',
|
|
108
|
+
};
|
|
109
|
+
const enforcementLevel = profile.enforcement?.path_conformance ?? 'warn';
|
|
110
|
+
const maxRiskTier = packSeverityMap[enforcementLevel] ?? 'medium';
|
|
111
|
+
const isBlocking = profile.enforcement?.finalize_blocking ?? false;
|
|
112
|
+
const pack = pluginPolicyPackSchema.parse({
|
|
113
|
+
id: packId,
|
|
114
|
+
version: '1.0.0',
|
|
115
|
+
description: `Derived policy pack for "${profileName}" profile from contract pack "${contractId}" (skill: ${skillId}). ${profile.purpose ?? ''}`,
|
|
116
|
+
applies_to: {
|
|
117
|
+
trust_tiers: isBlocking ? ['enterprise-approved'] : ['local-dev', 'experimental', 'enterprise-approved'],
|
|
118
|
+
},
|
|
119
|
+
requirements: {
|
|
120
|
+
max_risk_tier: maxRiskTier,
|
|
121
|
+
supply_chain: {
|
|
122
|
+
checksum: isBlocking,
|
|
123
|
+
signature_or_provenance: isBlocking,
|
|
124
|
+
sbom: isDefault,
|
|
125
|
+
sbom_formats: isBlocking ? ['cyclonedx'] : [],
|
|
126
|
+
},
|
|
127
|
+
validation: {
|
|
128
|
+
min_coverage: isBlocking ? 95 : 80,
|
|
129
|
+
security_checks: isBlocking
|
|
130
|
+
? ['dependency-audit', 'no-secret-fixtures']
|
|
131
|
+
: ['dependency-audit'],
|
|
132
|
+
dependency_checks: isBlocking ? ['lockfile-review'] : [],
|
|
133
|
+
},
|
|
134
|
+
execution: {
|
|
135
|
+
network: isBlocking ? 'disabled' : 'restricted',
|
|
136
|
+
process_spawn: isBlocking ? 'forbidden' : 'declared',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
packs.push(pack);
|
|
141
|
+
for (const rule of rules) {
|
|
142
|
+
const sev = rule.severity === 'P0' ? 'P0' : rule.severity === 'P1' ? 'P1' : 'P2';
|
|
143
|
+
entries.push({
|
|
144
|
+
ruleId: rule.id,
|
|
145
|
+
skillId,
|
|
146
|
+
severity: sev,
|
|
147
|
+
title: rule.title,
|
|
148
|
+
appliesTo: rule.applies_to ?? [],
|
|
149
|
+
policyPackId: packId,
|
|
150
|
+
detect: rule.detect ?? [],
|
|
151
|
+
requiredResponse: rule.required_response ?? [],
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { packs, entries };
|
|
156
|
+
}
|
|
157
|
+
export async function derivePolicyPoolFromSkill(skillId, options = {}) {
|
|
158
|
+
const contractPackPath = options.contractPackRelativePath ??
|
|
159
|
+
`.sdd/skills/curated/${skillId}/references/contract-pack.yaml`;
|
|
160
|
+
const resolvedPath = options.projectRoot
|
|
161
|
+
? path.resolve(options.projectRoot, contractPackPath)
|
|
162
|
+
: contractPackPath;
|
|
163
|
+
let packs;
|
|
164
|
+
let entries;
|
|
165
|
+
try {
|
|
166
|
+
const result = await derivePolicyPackFromContractPack(resolvedPath, skillId);
|
|
167
|
+
packs = result.packs;
|
|
168
|
+
entries = result.entries;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
packs = [aiFillDefaultPolicyPack(skillId)];
|
|
172
|
+
entries = [aiFillDefaultPolicyEntry(skillId, packs[0].id)];
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
version: 1,
|
|
176
|
+
pools: packs,
|
|
177
|
+
entries,
|
|
178
|
+
metadata: {
|
|
179
|
+
derivedFrom: [contractPackPath],
|
|
180
|
+
generatedAt: new Date().toISOString(),
|
|
181
|
+
sourceSkillIds: [skillId],
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=skill-policy-pool.js.map
|
package/dist/core/sdd/state.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type NamingContractState, type ArchitectureState, type BacklogState, type DiscoveryIndexState, type FinalizeQueueState, type FrontendDecisionsState, type FrontendGapsState, type FrontendMapState, type IntegrationContractsState, type RepoMapState, type SourceIndexState, type SkillCatalogState, type SkillRoutingState, type ServiceCatalogState, type TechStackState, type TechDebtState, type UnblockEventsState, type TransitionLogState, type AuditHistoryState } from './types.js';
|
|
2
|
+
import { type BuiltInSkillDefinition, type BuiltInSkillSourceTree } from './default-skills.js';
|
|
2
3
|
export type SddLanguage = 'pt-BR' | 'en-US';
|
|
3
4
|
export type SddLayout = 'legacy' | 'pt-BR' | 'en-US';
|
|
4
5
|
export interface SddRuntimeConfig {
|
|
@@ -89,6 +90,21 @@ export interface SddStateSnapshot {
|
|
|
89
90
|
sourceIndex: SourceIndexState;
|
|
90
91
|
skillRouting: SkillRoutingState;
|
|
91
92
|
}
|
|
93
|
+
export declare function skillSubfoldersForLayout(layout: SddLayout): {
|
|
94
|
+
curated: string;
|
|
95
|
+
bundles: string;
|
|
96
|
+
};
|
|
97
|
+
export declare function defaultFoldersForLayout(layout: SddLayout): SddRuntimeConfig['folders'];
|
|
98
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
99
|
+
export declare function mergeRuntimeConfig(raw: unknown): SddRuntimeConfig;
|
|
100
|
+
export declare function validateRuntimeConfig(config: SddRuntimeConfig): void;
|
|
101
|
+
export declare function defaultRuntimeConfig(): SddRuntimeConfig;
|
|
102
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
103
|
+
export declare function firstExistingFile(paths: string[]): Promise<string | null>;
|
|
104
|
+
export declare function readYamlObject(filePath: string): Promise<Record<string, unknown>>;
|
|
105
|
+
export declare function isLegacyGeneratedBy(value: unknown): boolean;
|
|
106
|
+
export declare function buildSddConfigDocument(existing: Record<string, unknown>, config: SddRuntimeConfig): Record<string, unknown>;
|
|
107
|
+
export declare function removeSddRuntimeConfigFromLegacySpecConfig(projectRoot: string): Promise<void>;
|
|
92
108
|
export declare function loadProjectSddConfig(projectRoot: string): Promise<SddRuntimeConfig>;
|
|
93
109
|
export declare function upsertProjectSddConfig(projectRoot: string, overrides?: {
|
|
94
110
|
frontendEnabled?: boolean;
|
|
@@ -97,6 +113,12 @@ export declare function upsertProjectSddConfig(projectRoot: string, overrides?:
|
|
|
97
113
|
}): Promise<SddRuntimeConfig>;
|
|
98
114
|
export declare function resolveSddPaths(projectRoot: string, config: SddRuntimeConfig): SddPaths;
|
|
99
115
|
export declare function ensureBaseStructure(paths: SddPaths): Promise<void>;
|
|
116
|
+
export declare function isBuiltInSkillSourceTree(definition: BuiltInSkillDefinition): definition is BuiltInSkillSourceTree;
|
|
117
|
+
export declare function adaptSkillContentForLayout(content: string, paths: SddPaths, config: SddRuntimeConfig): string;
|
|
118
|
+
export declare function listTreeFiles(rootDir: string): Promise<string[]>;
|
|
119
|
+
export declare function resolveBuiltInSourceRoot(paths: SddPaths, sourceRoot: string): Promise<string | null>;
|
|
120
|
+
export declare function materializeBuiltInSkill(paths: SddPaths, config: SddRuntimeConfig, skillId: string, definition: BuiltInSkillDefinition): Promise<void>;
|
|
121
|
+
export declare function ensureCuratedSkillCatalog(filePath: string): Promise<void>;
|
|
100
122
|
export declare function ensureBaseFiles(paths: SddPaths, config: SddRuntimeConfig): Promise<void>;
|
|
101
123
|
export declare function loadStateSnapshot(paths: SddPaths, config: SddRuntimeConfig): Promise<SddStateSnapshot>;
|
|
102
124
|
export declare function loadSkillCatalogState(paths: SddPaths): Promise<SkillCatalogState>;
|