devflow-kit 1.8.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +191 -6
- package/LICENSE +1 -1
- package/README.md +139 -219
- package/dist/cli/agents-view/index.js +9 -0
- package/dist/cli/agents-view/render.js +310 -0
- package/dist/cli/agents-view/state.js +423 -0
- package/dist/cli/agents-view/terminal.js +179 -0
- package/dist/cli/commands/agents.js +585 -0
- package/dist/cli/commands/ambient.js +231 -0
- package/dist/cli/commands/capture.js +133 -0
- package/dist/cli/commands/compliance-prompts.js +174 -0
- package/dist/cli/commands/compliance.js +337 -0
- package/dist/cli/commands/context.js +66 -0
- package/dist/cli/commands/debug.js +122 -0
- package/dist/cli/commands/flags.js +119 -0
- package/dist/cli/commands/hud.js +229 -0
- package/dist/cli/commands/init-seed.js +226 -0
- package/dist/cli/commands/init.js +1786 -0
- package/dist/cli/commands/knowledge/index.js +25 -0
- package/dist/cli/commands/knowledge/list.js +115 -0
- package/dist/cli/commands/knowledge/toggle.js +84 -0
- package/dist/cli/commands/learning.js +311 -0
- package/dist/cli/commands/legacy-hooks.js +40 -0
- package/dist/cli/commands/memory.js +349 -0
- package/dist/cli/commands/proxy.js +1435 -0
- package/dist/cli/commands/rules.js +334 -0
- package/dist/cli/commands/safe-delete.js +140 -0
- package/dist/cli/commands/security.js +179 -0
- package/dist/cli/commands/skills.js +140 -0
- package/dist/cli/commands/uninstall.js +1214 -0
- package/dist/cli.js +35 -10
- package/dist/commands/bug-analysis.md +400 -0
- package/dist/commands/code-review.md +403 -0
- package/dist/commands/debug.md +282 -0
- package/dist/commands/dynamic-build.md +972 -0
- package/dist/commands/dynamic-plan.md +383 -0
- package/dist/commands/dynamic-profile.md +206 -0
- package/dist/commands/dynamic-tickets.md +583 -0
- package/dist/commands/explore.md +208 -0
- package/dist/commands/implement.md +590 -0
- package/dist/commands/plan.md +570 -0
- package/dist/commands/release.md +206 -0
- package/dist/commands/research.md +212 -0
- package/dist/commands/resolve.md +731 -0
- package/dist/commands/self-review.md +251 -0
- package/dist/core/agent-frontmatter.js +209 -0
- package/dist/core/agent-models.js +556 -0
- package/dist/core/agent-state.js +44 -0
- package/dist/core/assets.js +39 -0
- package/dist/core/cache.js +205 -0
- package/dist/core/codex-auth-inspect.js +128 -0
- package/dist/core/compliance-compose.js +458 -0
- package/dist/core/compliance.js +165 -0
- package/dist/core/external-models.js +76 -0
- package/dist/core/feature-config.js +125 -0
- package/dist/core/flags.js +309 -0
- package/dist/core/fs-atomic.js +74 -0
- package/dist/core/git.js +61 -0
- package/dist/core/learning-queue-cleanup.js +92 -0
- package/dist/core/learning-tuning-config.js +78 -0
- package/dist/core/manifest.js +171 -0
- package/dist/core/migrations.js +330 -0
- package/dist/core/model-discovery.js +655 -0
- package/dist/core/observation-io.js +50 -0
- package/dist/core/observations.js +109 -0
- package/dist/core/orphan-sweep.js +92 -0
- package/dist/core/paths.js +48 -0
- package/dist/core/plugins.js +525 -0
- package/dist/core/project-paths.js +159 -0
- package/dist/core/proxy-log.js +165 -0
- package/dist/core/proxy-state.js +305 -0
- package/dist/core/safe-delete-install.js +191 -0
- package/dist/core/teammate-mode-cleanup.js +33 -0
- package/dist/hud/colors.js +13 -2
- package/dist/hud/components/config-counts.js +2 -2
- package/dist/hud/components/context-usage.js +2 -2
- package/dist/hud/components/learning-counts.js +92 -0
- package/dist/hud/components/session-cost.js +10 -2
- package/dist/hud/components/usage-quota.js +43 -8
- package/dist/hud/components/version-badge.js +17 -7
- package/dist/hud/config.js +4 -2
- package/dist/hud/cost-history.js +281 -0
- package/dist/hud/git.js +112 -71
- package/dist/hud/index.js +47 -4
- package/dist/hud/render.js +8 -20
- package/dist/hud/transcript.js +5 -6
- package/dist/targets/claude-code/claude-paths.js +106 -0
- package/dist/targets/claude-code/compliance-install.js +305 -0
- package/dist/targets/claude-code/hooks.js +9 -0
- package/dist/targets/claude-code/installer.js +458 -0
- package/dist/targets/claude-code/legacy.js +239 -0
- package/dist/targets/claude-code/post-install.js +971 -0
- package/package.json +23 -17
- package/src/assets/agents/code.md +244 -0
- package/src/assets/agents/design.md +113 -0
- package/src/assets/agents/diagnose.md +210 -0
- package/src/assets/agents/evaluate.md +117 -0
- package/src/assets/agents/git.md +938 -0
- package/src/assets/agents/knowledge.md +89 -0
- package/src/assets/agents/learning.md +203 -0
- package/src/assets/agents/research.md +134 -0
- package/src/assets/agents/review.md +220 -0
- package/src/assets/agents/scrutinize.md +95 -0
- package/src/assets/agents/simplify.md +108 -0
- package/src/assets/agents/skim.md +136 -0
- package/src/assets/agents/synthesize.md +402 -0
- package/src/assets/agents/test.md +155 -0
- package/src/assets/agents/triage.md +141 -0
- package/src/assets/agents/validate.md +103 -0
- package/src/assets/commands/_partials/_compliance.mds +5 -0
- package/src/assets/commands/_partials/_decisions.mds +20 -0
- package/src/assets/commands/_partials/_engine.mds +244 -0
- package/src/assets/commands/_partials/_factory.mds +216 -0
- package/src/assets/commands/_partials/_knowledge.mds +95 -0
- package/src/assets/commands/_partials/_plan_contract.mds +51 -0
- package/src/assets/commands/_partials/_preamble.mds +82 -0
- package/src/assets/commands/_partials/_publication.mds +7 -0
- package/src/assets/commands/_partials/_roster.mds +31 -0
- package/src/assets/commands/_partials/_ticket_template.mds +59 -0
- package/src/assets/commands/_partials/_wave.mds +123 -0
- package/src/assets/commands/bug-analysis.mds +353 -0
- package/src/assets/commands/code-review.mds +355 -0
- package/src/assets/commands/debug.mds +224 -0
- package/src/assets/commands/dynamic-build.mds +534 -0
- package/src/assets/commands/dynamic-plan.mds +244 -0
- package/src/assets/commands/dynamic-profile.mds +132 -0
- package/src/assets/commands/dynamic-tickets.mds +226 -0
- package/src/assets/commands/explore.mds +150 -0
- package/src/assets/commands/implement.mds +496 -0
- package/src/assets/commands/plan.mds +523 -0
- package/src/assets/commands/release.md +206 -0
- package/src/assets/commands/research.mds +164 -0
- package/src/assets/commands/resolve.mds +636 -0
- package/src/assets/commands/self-review.mds +156 -0
- package/src/assets/rules/accessibility.md +11 -0
- package/src/assets/rules/compliance.md +15 -0
- package/src/assets/rules/engineering.md +13 -0
- package/src/assets/rules/go.md +12 -0
- package/src/assets/rules/java.md +12 -0
- package/src/assets/rules/python.md +12 -0
- package/src/assets/rules/quality.md +14 -0
- package/src/assets/rules/react.md +11 -0
- package/src/assets/rules/reliability.md +12 -0
- package/src/assets/rules/rust.md +12 -0
- package/src/assets/rules/security.md +12 -0
- package/src/assets/rules/typescript.md +12 -0
- package/src/assets/rules/ui-design.md +11 -0
- package/src/assets/scripts/hooks/assets/orchestrator-charter.md +21 -0
- package/src/assets/scripts/hooks/background-memory-update +460 -0
- package/src/assets/scripts/hooks/capture-prompt +87 -0
- package/src/assets/scripts/hooks/capture-question +153 -0
- package/src/assets/scripts/hooks/capture-turn +105 -0
- package/src/assets/scripts/hooks/debug-trace +75 -0
- package/src/assets/scripts/hooks/decisions-usage-scan.cjs +131 -0
- package/src/assets/scripts/hooks/ensure-devflow-init +39 -0
- package/src/assets/scripts/hooks/ensure-proxy +294 -0
- package/src/assets/scripts/hooks/ensure-root-gitignore +116 -0
- package/src/assets/scripts/hooks/get-mtime +23 -0
- package/src/assets/scripts/hooks/git-marker +16 -0
- package/src/assets/scripts/hooks/hook-bootstrap +25 -0
- package/src/assets/scripts/hooks/hook-log-init +41 -0
- package/src/assets/scripts/hooks/json-helper.cjs +725 -0
- package/src/assets/scripts/hooks/json-parse +243 -0
- package/src/assets/scripts/hooks/learning-lock +44 -0
- package/src/assets/scripts/hooks/lib/decisions-format.cjs +301 -0
- package/src/assets/scripts/hooks/lib/mkdir-lock.cjs +106 -0
- package/src/assets/scripts/hooks/lib/project-paths.cjs +230 -0
- package/src/assets/scripts/hooks/lib/render-decisions.cjs +398 -0
- package/src/assets/scripts/hooks/lib/safe-path.cjs +29 -0
- package/src/assets/scripts/hooks/log-paths +24 -0
- package/src/assets/scripts/hooks/memory-worker +101 -0
- package/src/assets/scripts/hooks/pre-compact-memory +126 -0
- package/src/assets/scripts/hooks/preamble +77 -0
- package/src/assets/scripts/hooks/queue-append +120 -0
- package/src/assets/scripts/hooks/resolve-project-root +37 -0
- package/src/assets/scripts/hooks/run-hook +31 -0
- package/src/assets/scripts/hooks/session-start-context +180 -0
- package/src/assets/scripts/hooks/session-start-memory +318 -0
- package/src/assets/scripts/hooks/session-start-orchestrator +54 -0
- package/src/assets/scripts/hud.sh +5 -0
- package/src/assets/scripts/redact-secrets.cjs +410 -0
- package/src/assets/skills/accessibility/SKILL.md +145 -0
- package/src/assets/skills/accessibility/references/patterns.md +398 -0
- package/src/assets/skills/accessibility/references/sources.md +26 -0
- package/src/assets/skills/accessibility/references/violations.md +358 -0
- package/src/assets/skills/apply-decisions/SKILL.md +100 -0
- package/src/assets/skills/apply-feature-knowledge/SKILL.md +69 -0
- package/src/assets/skills/architecture/SKILL.md +138 -0
- package/src/assets/skills/architecture/references/patterns.md +378 -0
- package/src/assets/skills/architecture/references/sources.md +41 -0
- package/src/assets/skills/architecture/references/violations.md +314 -0
- package/src/assets/skills/boundary-validation/SKILL.md +119 -0
- package/src/assets/skills/boundary-validation/references/detection.md +283 -0
- package/src/assets/skills/boundary-validation/references/patterns.md +283 -0
- package/src/assets/skills/boundary-validation/references/sources.md +41 -0
- package/src/assets/skills/boundary-validation/references/violations.md +211 -0
- package/src/assets/skills/complexity/SKILL.md +150 -0
- package/src/assets/skills/compliance/SKILL.md +121 -0
- package/src/assets/skills/compliance/frameworks/gdpr/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/gdpr/reference.md +50 -0
- package/src/assets/skills/compliance/frameworks/hipaa/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/hipaa/reference.md +44 -0
- package/src/assets/skills/compliance/frameworks/iso-27001/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/iso-27001/reference.md +45 -0
- package/src/assets/skills/compliance/frameworks/pci-dss/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/pci-dss/reference.md +55 -0
- package/src/assets/skills/compliance/frameworks/soc2/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/soc2/reference.md +53 -0
- package/src/assets/skills/compliance/frameworks/sox/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/sox/reference.md +67 -0
- package/src/assets/skills/compliance/references/detection.md +108 -0
- package/src/assets/skills/compliance/references/sources.md +28 -0
- package/src/assets/skills/consistency/SKILL.md +140 -0
- package/src/assets/skills/database/SKILL.md +134 -0
- package/src/assets/skills/dependencies/SKILL.md +141 -0
- package/src/assets/skills/dependency-research/SKILL.md +133 -0
- package/src/assets/skills/dependency-research/references/evaluation-criteria.md +101 -0
- package/src/assets/skills/design-review/SKILL.md +155 -0
- package/src/assets/skills/design-review/references/anti-patterns.md +207 -0
- package/src/assets/skills/docs-framework/SKILL.md +190 -0
- package/src/assets/skills/docs-framework/references/patterns.md +381 -0
- package/src/assets/skills/docs-framework/references/violations.md +221 -0
- package/src/assets/skills/documentation/SKILL.md +126 -0
- package/src/assets/skills/feature-knowledge/SKILL.md +341 -0
- package/src/assets/skills/gap-analysis/SKILL.md +151 -0
- package/src/assets/skills/gap-analysis/references/check-layers.md +125 -0
- package/src/assets/skills/git/SKILL.md +287 -0
- package/src/assets/skills/git/references/github-api.md +666 -0
- package/src/assets/skills/git/references/patterns.md +324 -0
- package/src/assets/skills/git/references/sources.md +16 -0
- package/src/assets/skills/git/references/violations.md +128 -0
- package/src/assets/skills/go/SKILL.md +147 -0
- package/src/assets/skills/go/references/concurrency.md +335 -0
- package/src/assets/skills/go/references/patterns.md +278 -0
- package/src/assets/skills/go/references/sources.md +41 -0
- package/src/assets/skills/go/references/violations.md +262 -0
- package/src/assets/skills/java/SKILL.md +148 -0
- package/src/assets/skills/java/references/modern-java.md +335 -0
- package/src/assets/skills/java/references/patterns.md +311 -0
- package/src/assets/skills/java/references/sources.md +44 -0
- package/src/assets/skills/java/references/violations.md +257 -0
- package/src/assets/skills/patterns/SKILL.md +162 -0
- package/src/assets/skills/performance/SKILL.md +135 -0
- package/src/assets/skills/performance/references/patterns.md +516 -0
- package/src/assets/skills/performance/references/sources.md +41 -0
- package/src/assets/skills/performance/references/violations.md +417 -0
- package/src/assets/skills/python/SKILL.md +156 -0
- package/src/assets/skills/python/references/async.md +255 -0
- package/src/assets/skills/python/references/patterns.md +280 -0
- package/src/assets/skills/python/references/sources.md +41 -0
- package/src/assets/skills/python/references/violations.md +272 -0
- package/src/assets/skills/qa/SKILL.md +136 -0
- package/src/assets/skills/qa/references/browser-testing.md +97 -0
- package/src/assets/skills/qa/references/patterns.md +118 -0
- package/src/assets/skills/qa/references/scenario-templates.md +102 -0
- package/src/assets/skills/qa/references/sources.md +30 -0
- package/src/assets/skills/qa/references/violations.md +98 -0
- package/src/assets/skills/quality-gates/SKILL.md +152 -0
- package/src/assets/skills/quality-gates/references/stub-detection.md +135 -0
- package/src/assets/skills/react/SKILL.md +143 -0
- package/src/assets/skills/react/references/error-handling.md +179 -0
- package/src/assets/skills/react/references/forms.md +214 -0
- package/src/assets/skills/react/references/hooks.md +193 -0
- package/src/assets/skills/react/references/patterns.md +1336 -0
- package/src/assets/skills/react/references/sources.md +35 -0
- package/src/assets/skills/react/references/violations.md +570 -0
- package/src/assets/skills/regression/SKILL.md +146 -0
- package/src/assets/skills/reliability/SKILL.md +153 -0
- package/src/assets/skills/reliability/references/detection.md +66 -0
- package/src/assets/skills/reliability/references/patterns.md +151 -0
- package/src/assets/skills/reliability/references/sources.md +27 -0
- package/src/assets/skills/reliability/references/violations.md +125 -0
- package/src/assets/skills/research-codebase/SKILL.md +135 -0
- package/src/assets/skills/research-competitor/SKILL.md +145 -0
- package/src/assets/skills/research-external/SKILL.md +141 -0
- package/src/assets/skills/research-market/SKILL.md +145 -0
- package/src/assets/skills/research-technology/SKILL.md +180 -0
- package/src/assets/skills/review-methodology/SKILL.md +121 -0
- package/src/assets/skills/review-methodology/references/patterns.md +186 -0
- package/src/assets/skills/review-methodology/references/report-template.md +142 -0
- package/src/assets/skills/review-methodology/references/violations.md +125 -0
- package/src/assets/skills/rust/SKILL.md +148 -0
- package/src/assets/skills/rust/references/ownership.md +278 -0
- package/src/assets/skills/rust/references/patterns.md +247 -0
- package/src/assets/skills/rust/references/sources.md +46 -0
- package/src/assets/skills/rust/references/violations.md +252 -0
- package/src/assets/skills/security/SKILL.md +121 -0
- package/src/assets/skills/security/references/patterns.md +271 -0
- package/src/assets/skills/security/references/sources.md +41 -0
- package/src/assets/skills/security/references/violations.md +241 -0
- package/src/assets/skills/software-design/SKILL.md +143 -0
- package/src/assets/skills/software-design/references/checklist.md +259 -0
- package/src/assets/skills/software-design/references/code-smell-violations.md +189 -0
- package/src/assets/skills/software-design/references/patterns.md +359 -0
- package/src/assets/skills/software-design/references/sources.md +41 -0
- package/src/assets/skills/software-design/references/violations.md +341 -0
- package/src/assets/skills/test-driven-development/SKILL.md +197 -0
- package/src/assets/skills/testing/SKILL.md +139 -0
- package/src/assets/skills/testing/references/patterns.md +346 -0
- package/src/assets/skills/testing/references/sources.md +53 -0
- package/src/assets/skills/testing/references/violations.md +322 -0
- package/src/assets/skills/typescript/SKILL.md +150 -0
- package/src/assets/skills/typescript/references/async.md +333 -0
- package/src/assets/skills/typescript/references/patterns.md +440 -0
- package/src/assets/skills/typescript/references/sources.md +41 -0
- package/src/assets/skills/typescript/references/type-guards.md +333 -0
- package/src/assets/skills/typescript/references/utility-types.md +255 -0
- package/src/assets/skills/typescript/references/violations.md +285 -0
- package/src/assets/skills/ui-design/SKILL.md +144 -0
- package/src/assets/skills/ui-design/references/patterns.md +341 -0
- package/src/assets/skills/ui-design/references/sources.md +41 -0
- package/src/assets/skills/ui-design/references/violations.md +312 -0
- package/src/assets/skills/worktree-support/SKILL.md +92 -0
- package/src/targets/claude-code/templates/claudeignore.template +188 -0
- package/src/targets/claude-code/templates/settings.json +86 -0
- package/dist/cli.d.ts +0 -3
- package/dist/commands/ambient.d.ts +0 -18
- package/dist/commands/ambient.js +0 -137
- package/dist/commands/hud.d.ts +0 -22
- package/dist/commands/hud.js +0 -180
- package/dist/commands/init.d.ts +0 -16
- package/dist/commands/init.js +0 -738
- package/dist/commands/list.d.ts +0 -24
- package/dist/commands/list.js +0 -89
- package/dist/commands/memory.d.ts +0 -22
- package/dist/commands/memory.js +0 -175
- package/dist/commands/skills.d.ts +0 -11
- package/dist/commands/skills.js +0 -116
- package/dist/commands/uninstall.d.ts +0 -22
- package/dist/commands/uninstall.js +0 -558
- package/dist/hud/cache.d.ts +0 -14
- package/dist/hud/cache.js +0 -54
- package/dist/hud/colors.d.ts +0 -23
- package/dist/hud/components/config-counts.d.ts +0 -8
- package/dist/hud/components/context-usage.d.ts +0 -8
- package/dist/hud/components/diff-stats.d.ts +0 -3
- package/dist/hud/components/directory.d.ts +0 -3
- package/dist/hud/components/git-ahead-behind.d.ts +0 -3
- package/dist/hud/components/git-branch.d.ts +0 -3
- package/dist/hud/components/model.d.ts +0 -3
- package/dist/hud/components/release-info.d.ts +0 -3
- package/dist/hud/components/session-cost.d.ts +0 -3
- package/dist/hud/components/session-duration.d.ts +0 -3
- package/dist/hud/components/todo-progress.d.ts +0 -3
- package/dist/hud/components/usage-quota.d.ts +0 -3
- package/dist/hud/components/version-badge.d.ts +0 -3
- package/dist/hud/components/worktree-count.d.ts +0 -3
- package/dist/hud/config.d.ts +0 -10
- package/dist/hud/credentials.d.ts +0 -17
- package/dist/hud/credentials.js +0 -99
- package/dist/hud/git.d.ts +0 -7
- package/dist/hud/index.d.ts +0 -2
- package/dist/hud/render.d.ts +0 -7
- package/dist/hud/stdin.d.ts +0 -6
- package/dist/hud/transcript.d.ts +0 -7
- package/dist/hud/types.d.ts +0 -116
- package/dist/hud/usage-api.d.ts +0 -7
- package/dist/hud/usage-api.js +0 -84
- package/dist/plugins.d.ts +0 -46
- package/dist/plugins.js +0 -233
- package/dist/utils/cli.d.ts +0 -5
- package/dist/utils/cli.js +0 -14
- package/dist/utils/git.d.ts +0 -11
- package/dist/utils/git.js +0 -36
- package/dist/utils/installer.d.ts +0 -41
- package/dist/utils/installer.js +0 -195
- package/dist/utils/manifest.d.ts +0 -46
- package/dist/utils/manifest.js +0 -100
- package/dist/utils/paths.d.ts +0 -42
- package/dist/utils/paths.js +0 -106
- package/dist/utils/post-install.d.ts +0 -87
- package/dist/utils/post-install.js +0 -546
- package/dist/utils/safe-delete-install.d.ts +0 -29
- package/dist/utils/safe-delete-install.js +0 -191
- package/dist/utils/safe-delete.d.ts +0 -12
- package/plugins/devflow-accessibility/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-accessibility/skills/accessibility/SKILL.md +0 -229
- package/plugins/devflow-accessibility/skills/accessibility/references/patterns.md +0 -670
- package/plugins/devflow-accessibility/skills/accessibility/references/violations.md +0 -419
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +0 -33
- package/plugins/devflow-ambient/README.md +0 -68
- package/plugins/devflow-ambient/agents/coder.md +0 -135
- package/plugins/devflow-ambient/agents/reviewer.md +0 -165
- package/plugins/devflow-ambient/agents/scrutinizer.md +0 -82
- package/plugins/devflow-ambient/agents/shepherd.md +0 -108
- package/plugins/devflow-ambient/agents/simplifier.md +0 -102
- package/plugins/devflow-ambient/agents/skimmer.md +0 -143
- package/plugins/devflow-ambient/agents/validator.md +0 -86
- package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +0 -145
- package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +0 -74
- package/plugins/devflow-ambient/skills/debug-orchestration/SKILL.md +0 -69
- package/plugins/devflow-ambient/skills/implementation-orchestration/SKILL.md +0 -92
- package/plugins/devflow-ambient/skills/plan-orchestration/SKILL.md +0 -71
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +0 -19
- package/plugins/devflow-audit-claude/README.md +0 -46
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +0 -134
- package/plugins/devflow-audit-claude/commands/audit-claude.md +0 -89
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +0 -38
- package/plugins/devflow-code-review/README.md +0 -73
- package/plugins/devflow-code-review/agents/git.md +0 -277
- package/plugins/devflow-code-review/agents/reviewer.md +0 -165
- package/plugins/devflow-code-review/agents/synthesizer.md +0 -211
- package/plugins/devflow-code-review/commands/code-review-teams.md +0 -285
- package/plugins/devflow-code-review/commands/code-review.md +0 -163
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +0 -153
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +0 -873
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +0 -575
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +0 -143
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +0 -140
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +0 -134
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +0 -141
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +0 -125
- package/plugins/devflow-code-review/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-code-review/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +0 -154
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +0 -503
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +0 -354
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +0 -146
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +0 -119
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +0 -186
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +0 -142
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +0 -125
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +0 -156
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +0 -507
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +0 -237
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +0 -183
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +0 -220
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +0 -221
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +0 -31
- package/plugins/devflow-core-skills/README.md +0 -50
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +0 -162
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +0 -276
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +0 -576
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +0 -369
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +0 -143
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +0 -346
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +0 -221
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +0 -122
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +0 -289
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +0 -18
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +0 -158
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +0 -115
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +0 -77
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +0 -127
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +0 -96
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +0 -153
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +0 -572
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +0 -298
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +0 -148
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +0 -283
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +0 -361
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +0 -224
- package/plugins/devflow-core-skills/skills/search-first/SKILL.md +0 -133
- package/plugins/devflow-core-skills/skills/search-first/references/evaluation-criteria.md +0 -101
- package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +0 -137
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +0 -183
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +0 -149
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +0 -220
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +0 -108
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +0 -221
- package/plugins/devflow-debug/.claude-plugin/plugin.json +0 -26
- package/plugins/devflow-debug/README.md +0 -65
- package/plugins/devflow-debug/agents/git.md +0 -277
- package/plugins/devflow-debug/agents/synthesizer.md +0 -211
- package/plugins/devflow-debug/commands/debug-teams.md +0 -245
- package/plugins/devflow-debug/commands/debug.md +0 -174
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +0 -122
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +0 -290
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +0 -289
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +0 -18
- package/plugins/devflow-debug/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-debug/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-frontend-design/skills/frontend-design/SKILL.md +0 -254
- package/plugins/devflow-frontend-design/skills/frontend-design/references/patterns.md +0 -511
- package/plugins/devflow-frontend-design/skills/frontend-design/references/violations.md +0 -453
- package/plugins/devflow-go/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-go/skills/go/SKILL.md +0 -187
- package/plugins/devflow-go/skills/go/references/concurrency.md +0 -312
- package/plugins/devflow-go/skills/go/references/patterns.md +0 -232
- package/plugins/devflow-go/skills/go/references/violations.md +0 -205
- package/plugins/devflow-implement/.claude-plugin/plugin.json +0 -35
- package/plugins/devflow-implement/README.md +0 -71
- package/plugins/devflow-implement/agents/coder.md +0 -135
- package/plugins/devflow-implement/agents/git.md +0 -277
- package/plugins/devflow-implement/agents/scrutinizer.md +0 -82
- package/plugins/devflow-implement/agents/shepherd.md +0 -108
- package/plugins/devflow-implement/agents/simplifier.md +0 -102
- package/plugins/devflow-implement/agents/skimmer.md +0 -143
- package/plugins/devflow-implement/agents/synthesizer.md +0 -211
- package/plugins/devflow-implement/agents/validator.md +0 -86
- package/plugins/devflow-implement/commands/implement-teams.md +0 -620
- package/plugins/devflow-implement/commands/implement.md +0 -430
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +0 -162
- package/plugins/devflow-implement/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-implement/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-implement/skills/self-review/SKILL.md +0 -149
- package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +0 -135
- package/plugins/devflow-java/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-java/skills/java/SKILL.md +0 -183
- package/plugins/devflow-java/skills/java/references/modern-java.md +0 -270
- package/plugins/devflow-java/skills/java/references/patterns.md +0 -235
- package/plugins/devflow-java/skills/java/references/violations.md +0 -213
- package/plugins/devflow-python/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-python/skills/python/SKILL.md +0 -188
- package/plugins/devflow-python/skills/python/references/async.md +0 -220
- package/plugins/devflow-python/skills/python/references/patterns.md +0 -226
- package/plugins/devflow-python/skills/python/references/violations.md +0 -204
- package/plugins/devflow-react/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-react/skills/react/SKILL.md +0 -276
- package/plugins/devflow-react/skills/react/references/patterns.md +0 -1331
- package/plugins/devflow-react/skills/react/references/violations.md +0 -565
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +0 -29
- package/plugins/devflow-resolve/README.md +0 -65
- package/plugins/devflow-resolve/agents/git.md +0 -277
- package/plugins/devflow-resolve/agents/resolver.md +0 -131
- package/plugins/devflow-resolve/agents/simplifier.md +0 -102
- package/plugins/devflow-resolve/commands/resolve-teams.md +0 -307
- package/plugins/devflow-resolve/commands/resolve.md +0 -246
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +0 -162
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +0 -1063
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +0 -483
- package/plugins/devflow-resolve/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-resolve/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +0 -156
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +0 -287
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +0 -507
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +0 -237
- package/plugins/devflow-rust/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-rust/skills/rust/SKILL.md +0 -193
- package/plugins/devflow-rust/skills/rust/references/ownership.md +0 -242
- package/plugins/devflow-rust/skills/rust/references/patterns.md +0 -210
- package/plugins/devflow-rust/skills/rust/references/violations.md +0 -191
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +0 -26
- package/plugins/devflow-self-review/README.md +0 -38
- package/plugins/devflow-self-review/agents/scrutinizer.md +0 -82
- package/plugins/devflow-self-review/agents/simplifier.md +0 -102
- package/plugins/devflow-self-review/agents/validator.md +0 -86
- package/plugins/devflow-self-review/commands/self-review.md +0 -132
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +0 -162
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +0 -276
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +0 -303
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +0 -576
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +0 -369
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +0 -149
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +0 -405
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +0 -253
- package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +0 -135
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +0 -308
- package/plugins/devflow-specify/.claude-plugin/plugin.json +0 -25
- package/plugins/devflow-specify/README.md +0 -46
- package/plugins/devflow-specify/agents/skimmer.md +0 -143
- package/plugins/devflow-specify/agents/synthesizer.md +0 -211
- package/plugins/devflow-specify/commands/specify-teams.md +0 -321
- package/plugins/devflow-specify/commands/specify.md +0 -186
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-typescript/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-typescript/skills/typescript/SKILL.md +0 -176
- package/plugins/devflow-typescript/skills/typescript/references/patterns.md +0 -1105
- package/plugins/devflow-typescript/skills/typescript/references/violations.md +0 -433
- package/scripts/hooks/ambient-prompt +0 -50
- package/scripts/hooks/background-memory-update +0 -257
- package/scripts/hooks/ensure-memory-gitignore +0 -17
- package/scripts/hooks/pre-compact-memory +0 -87
- package/scripts/hooks/run-hook +0 -23
- package/scripts/hooks/session-start-memory +0 -165
- package/scripts/hooks/stop-update-memory +0 -85
- package/scripts/hud/cache.d.ts +0 -14
- package/scripts/hud/cache.d.ts.map +0 -1
- package/scripts/hud/cache.js +0 -54
- package/scripts/hud/cache.js.map +0 -1
- package/scripts/hud/colors.d.ts +0 -23
- package/scripts/hud/colors.d.ts.map +0 -1
- package/scripts/hud/colors.js +0 -62
- package/scripts/hud/colors.js.map +0 -1
- package/scripts/hud/components/config-counts.d.ts +0 -8
- package/scripts/hud/components/config-counts.d.ts.map +0 -1
- package/scripts/hud/components/config-counts.js +0 -91
- package/scripts/hud/components/config-counts.js.map +0 -1
- package/scripts/hud/components/context-usage.d.ts +0 -8
- package/scripts/hud/components/context-usage.d.ts.map +0 -1
- package/scripts/hud/components/context-usage.js +0 -49
- package/scripts/hud/components/context-usage.js.map +0 -1
- package/scripts/hud/components/diff-stats.d.ts +0 -3
- package/scripts/hud/components/diff-stats.d.ts.map +0 -1
- package/scripts/hud/components/diff-stats.js +0 -36
- package/scripts/hud/components/diff-stats.js.map +0 -1
- package/scripts/hud/components/directory.d.ts +0 -3
- package/scripts/hud/components/directory.d.ts.map +0 -1
- package/scripts/hud/components/directory.js +0 -10
- package/scripts/hud/components/directory.js.map +0 -1
- package/scripts/hud/components/git-ahead-behind.d.ts +0 -3
- package/scripts/hud/components/git-ahead-behind.d.ts.map +0 -1
- package/scripts/hud/components/git-ahead-behind.js +0 -16
- package/scripts/hud/components/git-ahead-behind.js.map +0 -1
- package/scripts/hud/components/git-branch.d.ts +0 -3
- package/scripts/hud/components/git-branch.d.ts.map +0 -1
- package/scripts/hud/components/git-branch.js +0 -14
- package/scripts/hud/components/git-branch.js.map +0 -1
- package/scripts/hud/components/model.d.ts +0 -3
- package/scripts/hud/components/model.d.ts.map +0 -1
- package/scripts/hud/components/model.js +0 -21
- package/scripts/hud/components/model.js.map +0 -1
- package/scripts/hud/components/release-info.d.ts +0 -3
- package/scripts/hud/components/release-info.d.ts.map +0 -1
- package/scripts/hud/components/release-info.js +0 -9
- package/scripts/hud/components/release-info.js.map +0 -1
- package/scripts/hud/components/session-cost.d.ts +0 -3
- package/scripts/hud/components/session-cost.d.ts.map +0 -1
- package/scripts/hud/components/session-cost.js +0 -9
- package/scripts/hud/components/session-cost.js.map +0 -1
- package/scripts/hud/components/session-duration.d.ts +0 -3
- package/scripts/hud/components/session-duration.d.ts.map +0 -1
- package/scripts/hud/components/session-duration.js +0 -18
- package/scripts/hud/components/session-duration.js.map +0 -1
- package/scripts/hud/components/todo-progress.d.ts +0 -3
- package/scripts/hud/components/todo-progress.d.ts.map +0 -1
- package/scripts/hud/components/todo-progress.js +0 -11
- package/scripts/hud/components/todo-progress.js.map +0 -1
- package/scripts/hud/components/usage-quota.d.ts +0 -3
- package/scripts/hud/components/usage-quota.d.ts.map +0 -1
- package/scripts/hud/components/usage-quota.js +0 -45
- package/scripts/hud/components/usage-quota.js.map +0 -1
- package/scripts/hud/components/version-badge.d.ts +0 -3
- package/scripts/hud/components/version-badge.d.ts.map +0 -1
- package/scripts/hud/components/version-badge.js +0 -80
- package/scripts/hud/components/version-badge.js.map +0 -1
- package/scripts/hud/components/worktree-count.d.ts +0 -3
- package/scripts/hud/components/worktree-count.d.ts.map +0 -1
- package/scripts/hud/components/worktree-count.js +0 -8
- package/scripts/hud/components/worktree-count.js.map +0 -1
- package/scripts/hud/config.d.ts +0 -10
- package/scripts/hud/config.d.ts.map +0 -1
- package/scripts/hud/config.js +0 -55
- package/scripts/hud/config.js.map +0 -1
- package/scripts/hud/credentials.d.ts +0 -17
- package/scripts/hud/credentials.d.ts.map +0 -1
- package/scripts/hud/credentials.js +0 -99
- package/scripts/hud/credentials.js.map +0 -1
- package/scripts/hud/git.d.ts +0 -7
- package/scripts/hud/git.d.ts.map +0 -1
- package/scripts/hud/git.js +0 -153
- package/scripts/hud/git.js.map +0 -1
- package/scripts/hud/index.d.ts +0 -2
- package/scripts/hud/index.d.ts.map +0 -1
- package/scripts/hud/index.js +0 -81
- package/scripts/hud/index.js.map +0 -1
- package/scripts/hud/render.d.ts +0 -7
- package/scripts/hud/render.d.ts.map +0 -1
- package/scripts/hud/render.js +0 -111
- package/scripts/hud/render.js.map +0 -1
- package/scripts/hud/stdin.d.ts +0 -6
- package/scripts/hud/stdin.d.ts.map +0 -1
- package/scripts/hud/stdin.js +0 -25
- package/scripts/hud/stdin.js.map +0 -1
- package/scripts/hud/transcript.d.ts +0 -7
- package/scripts/hud/transcript.d.ts.map +0 -1
- package/scripts/hud/transcript.js +0 -130
- package/scripts/hud/transcript.js.map +0 -1
- package/scripts/hud/types.d.ts +0 -116
- package/scripts/hud/types.d.ts.map +0 -1
- package/scripts/hud/types.js +0 -2
- package/scripts/hud/types.js.map +0 -1
- package/scripts/hud/usage-api.d.ts +0 -7
- package/scripts/hud/usage-api.d.ts.map +0 -1
- package/scripts/hud/usage-api.js +0 -84
- package/scripts/hud/usage-api.js.map +0 -1
- package/scripts/hud.sh +0 -5
- package/shared/agents/coder.md +0 -135
- package/shared/agents/git.md +0 -277
- package/shared/agents/resolver.md +0 -131
- package/shared/agents/reviewer.md +0 -165
- package/shared/agents/scrutinizer.md +0 -82
- package/shared/agents/shepherd.md +0 -108
- package/shared/agents/simplifier.md +0 -102
- package/shared/agents/skimmer.md +0 -143
- package/shared/agents/synthesizer.md +0 -211
- package/shared/agents/validator.md +0 -86
- package/shared/skills/accessibility/SKILL.md +0 -229
- package/shared/skills/accessibility/references/detection.md +0 -171
- package/shared/skills/accessibility/references/patterns.md +0 -670
- package/shared/skills/accessibility/references/violations.md +0 -419
- package/shared/skills/agent-teams/SKILL.md +0 -124
- package/shared/skills/agent-teams/references/cleanup.md +0 -104
- package/shared/skills/agent-teams/references/communication.md +0 -122
- package/shared/skills/agent-teams/references/team-patterns.md +0 -217
- package/shared/skills/ambient-router/SKILL.md +0 -145
- package/shared/skills/ambient-router/references/skill-catalog.md +0 -74
- package/shared/skills/architecture-patterns/SKILL.md +0 -153
- package/shared/skills/architecture-patterns/references/detection.md +0 -337
- package/shared/skills/architecture-patterns/references/patterns.md +0 -873
- package/shared/skills/architecture-patterns/references/violations.md +0 -575
- package/shared/skills/complexity-patterns/SKILL.md +0 -143
- package/shared/skills/complexity-patterns/references/detection.md +0 -264
- package/shared/skills/complexity-patterns/references/patterns.md +0 -487
- package/shared/skills/complexity-patterns/references/violations.md +0 -361
- package/shared/skills/consistency-patterns/SKILL.md +0 -140
- package/shared/skills/consistency-patterns/references/detection.md +0 -207
- package/shared/skills/consistency-patterns/references/patterns.md +0 -202
- package/shared/skills/consistency-patterns/references/violations.md +0 -213
- package/shared/skills/core-patterns/SKILL.md +0 -162
- package/shared/skills/core-patterns/references/checklist.md +0 -276
- package/shared/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/shared/skills/core-patterns/references/detection.md +0 -303
- package/shared/skills/core-patterns/references/patterns.md +0 -576
- package/shared/skills/core-patterns/references/violations.md +0 -369
- package/shared/skills/database-patterns/SKILL.md +0 -134
- package/shared/skills/database-patterns/references/detection.md +0 -208
- package/shared/skills/database-patterns/references/patterns.md +0 -394
- package/shared/skills/database-patterns/references/violations.md +0 -332
- package/shared/skills/debug-orchestration/SKILL.md +0 -69
- package/shared/skills/dependencies-patterns/SKILL.md +0 -141
- package/shared/skills/dependencies-patterns/references/detection.md +0 -181
- package/shared/skills/dependencies-patterns/references/patterns.md +0 -225
- package/shared/skills/dependencies-patterns/references/violations.md +0 -247
- package/shared/skills/docs-framework/SKILL.md +0 -143
- package/shared/skills/docs-framework/references/patterns.md +0 -346
- package/shared/skills/docs-framework/references/violations.md +0 -221
- package/shared/skills/documentation-patterns/SKILL.md +0 -125
- package/shared/skills/documentation-patterns/references/detection.md +0 -190
- package/shared/skills/documentation-patterns/references/patterns.md +0 -189
- package/shared/skills/documentation-patterns/references/violations.md +0 -163
- package/shared/skills/frontend-design/SKILL.md +0 -254
- package/shared/skills/frontend-design/references/detection.md +0 -184
- package/shared/skills/frontend-design/references/patterns.md +0 -511
- package/shared/skills/frontend-design/references/violations.md +0 -453
- package/shared/skills/git-safety/SKILL.md +0 -122
- package/shared/skills/git-safety/references/detection.md +0 -290
- package/shared/skills/git-safety/references/patterns.md +0 -289
- package/shared/skills/git-safety/references/violations.md +0 -18
- package/shared/skills/git-workflow/SKILL.md +0 -158
- package/shared/skills/git-workflow/references/commit-patterns.md +0 -115
- package/shared/skills/git-workflow/references/commit-violations.md +0 -77
- package/shared/skills/git-workflow/references/pr-patterns.md +0 -127
- package/shared/skills/git-workflow/references/pr-violations.md +0 -96
- package/shared/skills/github-patterns/SKILL.md +0 -153
- package/shared/skills/github-patterns/references/patterns.md +0 -572
- package/shared/skills/github-patterns/references/violations.md +0 -298
- package/shared/skills/go/SKILL.md +0 -187
- package/shared/skills/go/references/concurrency.md +0 -312
- package/shared/skills/go/references/detection.md +0 -129
- package/shared/skills/go/references/patterns.md +0 -232
- package/shared/skills/go/references/violations.md +0 -205
- package/shared/skills/implementation-orchestration/SKILL.md +0 -92
- package/shared/skills/implementation-patterns/SKILL.md +0 -162
- package/shared/skills/implementation-patterns/references/patterns.md +0 -1063
- package/shared/skills/implementation-patterns/references/violations.md +0 -483
- package/shared/skills/input-validation/SKILL.md +0 -148
- package/shared/skills/input-validation/references/detection.md +0 -283
- package/shared/skills/input-validation/references/patterns.md +0 -361
- package/shared/skills/input-validation/references/violations.md +0 -224
- package/shared/skills/java/SKILL.md +0 -183
- package/shared/skills/java/references/detection.md +0 -120
- package/shared/skills/java/references/modern-java.md +0 -270
- package/shared/skills/java/references/patterns.md +0 -235
- package/shared/skills/java/references/violations.md +0 -213
- package/shared/skills/knowledge-persistence/SKILL.md +0 -128
- package/shared/skills/knowledge-persistence/references/examples.md +0 -44
- package/shared/skills/performance-patterns/SKILL.md +0 -154
- package/shared/skills/performance-patterns/references/detection.md +0 -351
- package/shared/skills/performance-patterns/references/patterns.md +0 -503
- package/shared/skills/performance-patterns/references/violations.md +0 -354
- package/shared/skills/plan-orchestration/SKILL.md +0 -71
- package/shared/skills/python/SKILL.md +0 -188
- package/shared/skills/python/references/async.md +0 -220
- package/shared/skills/python/references/detection.md +0 -128
- package/shared/skills/python/references/patterns.md +0 -226
- package/shared/skills/python/references/violations.md +0 -204
- package/shared/skills/react/SKILL.md +0 -276
- package/shared/skills/react/references/patterns.md +0 -1331
- package/shared/skills/react/references/violations.md +0 -565
- package/shared/skills/regression-patterns/SKILL.md +0 -146
- package/shared/skills/regression-patterns/references/detection.md +0 -237
- package/shared/skills/regression-patterns/references/patterns.md +0 -226
- package/shared/skills/regression-patterns/references/violations.md +0 -225
- package/shared/skills/review-methodology/SKILL.md +0 -119
- package/shared/skills/review-methodology/references/patterns.md +0 -186
- package/shared/skills/review-methodology/references/report-template.md +0 -142
- package/shared/skills/review-methodology/references/violations.md +0 -125
- package/shared/skills/rust/SKILL.md +0 -193
- package/shared/skills/rust/references/detection.md +0 -131
- package/shared/skills/rust/references/ownership.md +0 -242
- package/shared/skills/rust/references/patterns.md +0 -210
- package/shared/skills/rust/references/violations.md +0 -191
- package/shared/skills/search-first/SKILL.md +0 -133
- package/shared/skills/search-first/references/evaluation-criteria.md +0 -101
- package/shared/skills/security-patterns/SKILL.md +0 -156
- package/shared/skills/security-patterns/references/detection.md +0 -287
- package/shared/skills/security-patterns/references/patterns.md +0 -507
- package/shared/skills/security-patterns/references/violations.md +0 -237
- package/shared/skills/self-review/SKILL.md +0 -149
- package/shared/skills/self-review/references/patterns.md +0 -405
- package/shared/skills/self-review/references/report-template.md +0 -253
- package/shared/skills/self-review/references/stub-detection.md +0 -135
- package/shared/skills/self-review/references/violations.md +0 -308
- package/shared/skills/test-driven-development/SKILL.md +0 -137
- package/shared/skills/test-driven-development/references/rationalization-prevention.md +0 -111
- package/shared/skills/test-patterns/SKILL.md +0 -183
- package/shared/skills/test-patterns/references/detection.md +0 -149
- package/shared/skills/test-patterns/references/patterns.md +0 -220
- package/shared/skills/test-patterns/references/report-template.md +0 -108
- package/shared/skills/test-patterns/references/violations.md +0 -221
- package/shared/skills/typescript/SKILL.md +0 -176
- package/shared/skills/typescript/references/patterns.md +0 -1105
- package/shared/skills/typescript/references/violations.md +0 -433
- package/src/templates/claudeignore.template +0 -188
- package/src/templates/settings.json +0 -59
- /package/dist/{utils → core}/safe-delete.js +0 -0
- /package/{plugins/devflow-accessibility → src/assets}/skills/accessibility/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/architecture-patterns → src/assets/skills/architecture}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/violations.md +0 -0
- /package/{plugins/devflow-core-skills/skills/git-safety → src/assets/skills/git}/references/detection.md +0 -0
- /package/{plugins/devflow-go → src/assets}/skills/go/references/detection.md +0 -0
- /package/{plugins/devflow-java → src/assets}/skills/java/references/detection.md +0 -0
- /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/patterns.md +0 -0
- /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/performance-patterns → src/assets/skills/performance}/references/detection.md +0 -0
- /package/{plugins/devflow-python → src/assets}/skills/python/references/detection.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/patterns.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/report-template.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/violations.md +0 -0
- /package/{plugins/devflow-rust → src/assets}/skills/rust/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/security-patterns → src/assets/skills/security}/references/detection.md +0 -0
- /package/{plugins/devflow-core-skills/skills/core-patterns → src/assets/skills/software-design}/references/detection.md +0 -0
- /package/{plugins/devflow-core-skills → src/assets}/skills/test-driven-development/references/rationalization-prevention.md +0 -0
- /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/report-template.md +0 -0
- /package/{plugins/devflow-frontend-design/skills/frontend-design → src/assets/skills/ui-design}/references/detection.md +0 -0
- /package/src/{templates → targets/claude-code/templates}/managed-settings.json +0 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure composition module for the compliance skill and rule.
|
|
3
|
+
*
|
|
4
|
+
* Composes the installed SKILL.md and rule file from a template + per-framework
|
|
5
|
+
* fragment files, so installed artifacts differ by selection rather than being
|
|
6
|
+
* static all-six blobs.
|
|
7
|
+
*
|
|
8
|
+
* Applies ADR-013: pure helpers in src/core/, no I/O.
|
|
9
|
+
* Applies PF-009: warn-not-throw for per-item failures.
|
|
10
|
+
*/
|
|
11
|
+
import { COMPLIANCE_FRAMEWORKS, stampComplianceRule } from './compliance.js';
|
|
12
|
+
// ── Constants ──────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* The 6 framework mapping control columns — single source of truth for the
|
|
15
|
+
* transposed Framework Mapping table header and fragment cell-count validation.
|
|
16
|
+
*/
|
|
17
|
+
export const COMPLIANCE_CONTROL_COLUMNS = [
|
|
18
|
+
'Data Classification',
|
|
19
|
+
'Sensitive Data in Logs',
|
|
20
|
+
'Encryption',
|
|
21
|
+
'Audit Trails',
|
|
22
|
+
'Retention & Erasure',
|
|
23
|
+
'IaC / Env Controls',
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* The 5 substitution tokens in the SKILL.md template.
|
|
27
|
+
* Bidirectional parity: every token here must exist in the template; every
|
|
28
|
+
* template token must be listed here. Enforced against the SHIPPED SKILL.md by
|
|
29
|
+
* "shipped templates ↔ token registry" in tests/compliance-compose.test.ts —
|
|
30
|
+
* a typo'd token is otherwise stripped silently by C3 and never noticed.
|
|
31
|
+
*/
|
|
32
|
+
export const COMPLIANCE_SKILL_TOKENS = [
|
|
33
|
+
'${DEVFLOW_COMPLIANCE_SCOPE}',
|
|
34
|
+
'${DEVFLOW_COMPLIANCE_ACTIVE}',
|
|
35
|
+
'${DEVFLOW_COMPLIANCE_MAPPING}',
|
|
36
|
+
'${DEVFLOW_COMPLIANCE_CHECKLIST}',
|
|
37
|
+
'${DEVFLOW_COMPLIANCE_REFERENCES}',
|
|
38
|
+
];
|
|
39
|
+
/**
|
|
40
|
+
* The 1 rule substitution token beyond the existing COMPLIANCE_RULE_PLACEHOLDER.
|
|
41
|
+
* Bidirectional parity: every token here must exist in the rule template; every
|
|
42
|
+
* template token (beyond the existing placeholder) must be listed here. Enforced
|
|
43
|
+
* against the SHIPPED rule in tests/compliance-compose.test.ts.
|
|
44
|
+
*/
|
|
45
|
+
export const COMPLIANCE_RULE_TOKENS = [
|
|
46
|
+
'${DEVFLOW_COMPLIANCE_RULE_BULLETS}',
|
|
47
|
+
];
|
|
48
|
+
// ── Internal helpers ───────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Matches any `${DEVFLOW_COMPLIANCE_*}` token left after the known substitutions.
|
|
51
|
+
*
|
|
52
|
+
* Deliberately as permissive as the C1 admission guard (`includes('${DEVFLOW_COMPLIANCE_')`):
|
|
53
|
+
* anything that gets a template past C1 must be strippable here, or C3 ("no token
|
|
54
|
+
* residue") would be false for that shape.
|
|
55
|
+
*/
|
|
56
|
+
const UNKNOWN_TOKEN_PATTERN = /\$\{DEVFLOW_COMPLIANCE_[A-Z0-9_]*\}/g;
|
|
57
|
+
/** Label lookup from the COMPLIANCE_FRAMEWORKS registry. */
|
|
58
|
+
const LABEL_BY_ID = new Map(COMPLIANCE_FRAMEWORKS.map(fw => [fw.id, fw.label]));
|
|
59
|
+
/**
|
|
60
|
+
* Resolve IDs to {id, label} pairs, DROPPING anything absent from the registry.
|
|
61
|
+
*
|
|
62
|
+
* Fail-safe restatement of the C2 filter that the compose entry points already apply:
|
|
63
|
+
* every section builder resolves through here independently, so an ID that is not in
|
|
64
|
+
* LABEL_BY_ID contributes nothing at all — no label, no `references/{id}.md` path, no
|
|
65
|
+
* table row. If the C2 filter above is ever moved, weakened, or dropped, the failure
|
|
66
|
+
* mode is a missing row rather than an unvalidated ID echoed into an installed
|
|
67
|
+
* artifact that Claude Code loads into every prompt (AC-35, AC-36).
|
|
68
|
+
*
|
|
69
|
+
* Never `?? id`: falling back to the raw ID is exactly the echo C2 exists to prevent.
|
|
70
|
+
*/
|
|
71
|
+
function resolveRegistryFrameworks(ids) {
|
|
72
|
+
const resolved = [];
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
for (const id of ids) {
|
|
75
|
+
if (seen.has(id))
|
|
76
|
+
continue; // first-wins dedup — mirrors normalizeFrameworks upstream
|
|
77
|
+
const label = LABEL_BY_ID.get(id);
|
|
78
|
+
if (label === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
seen.add(id);
|
|
81
|
+
resolved.push({ id, label });
|
|
82
|
+
}
|
|
83
|
+
return resolved;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Extract `## Heading` sections from markdown content.
|
|
87
|
+
* Returns a map of heading → section body (text after the heading, before the next
|
|
88
|
+
* `##` heading). Whitespace on both sides of each body is NOT trimmed here.
|
|
89
|
+
*/
|
|
90
|
+
function extractSections(content) {
|
|
91
|
+
const sections = new Map();
|
|
92
|
+
const lines = content.split('\n');
|
|
93
|
+
let currentHeading = null;
|
|
94
|
+
let currentLines = [];
|
|
95
|
+
for (const line of lines) {
|
|
96
|
+
const match = /^##\s+(.+)$/.exec(line);
|
|
97
|
+
if (match) {
|
|
98
|
+
if (currentHeading !== null) {
|
|
99
|
+
sections.set(currentHeading, currentLines.join('\n'));
|
|
100
|
+
}
|
|
101
|
+
currentHeading = match[1].trim();
|
|
102
|
+
currentLines = [];
|
|
103
|
+
}
|
|
104
|
+
else if (currentHeading !== null) {
|
|
105
|
+
currentLines.push(line);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (currentHeading !== null) {
|
|
109
|
+
sections.set(currentHeading, currentLines.join('\n'));
|
|
110
|
+
}
|
|
111
|
+
return sections;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Parse a markdown table row `| cell1 | cell2 | ... |` into an array of cell strings.
|
|
115
|
+
* Trims each cell. Returns [] for lines that don't look like table rows.
|
|
116
|
+
*/
|
|
117
|
+
function parseTableRow(row) {
|
|
118
|
+
if (!row.includes('|'))
|
|
119
|
+
return [];
|
|
120
|
+
const parts = row.split('|');
|
|
121
|
+
// Slice off the leading and trailing empty parts from the outer pipes
|
|
122
|
+
return parts.slice(1, parts.length - 1).map(c => c.trim());
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Collapse 3+ consecutive blank lines to exactly 2 consecutive blank lines.
|
|
126
|
+
* Applies C4: blank-line hygiene when a token is substituted.
|
|
127
|
+
*/
|
|
128
|
+
function applyBlankLineHygiene(content) {
|
|
129
|
+
return content.replace(/\n{3,}/g, '\n\n');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Replace all occurrences of a literal token string in content with a replacement.
|
|
133
|
+
* Avoids regex for robustness with special characters in token names.
|
|
134
|
+
*/
|
|
135
|
+
function replaceToken(content, token, replacement) {
|
|
136
|
+
return content.split(token).join(replacement);
|
|
137
|
+
}
|
|
138
|
+
// ── Composition helpers ────────────────────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Build the ${DEVFLOW_COMPLIANCE_SCOPE} substitution.
|
|
141
|
+
* Active frameworks: "under GDPR, SOC 2"
|
|
142
|
+
* Zero frameworks: "under active compliance frameworks"
|
|
143
|
+
*
|
|
144
|
+
* Frameworks the registry cannot label degrade to the zero-framework wording rather
|
|
145
|
+
* than being named (see resolveRegistryFrameworks).
|
|
146
|
+
*/
|
|
147
|
+
function buildScope(activeFrameworks) {
|
|
148
|
+
const resolved = resolveRegistryFrameworks(activeFrameworks);
|
|
149
|
+
if (resolved.length === 0) {
|
|
150
|
+
return 'under active compliance frameworks';
|
|
151
|
+
}
|
|
152
|
+
return `under ${resolved.map(fw => fw.label).join(', ')}`;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Collect C5 warnings for active frameworks that have no fragment.
|
|
156
|
+
*
|
|
157
|
+
* Emitted once, up front, by the compose entry points — never as a side effect of a
|
|
158
|
+
* section builder. Each builder skips fragment-less frameworks independently, so the
|
|
159
|
+
* warning must not depend on which builders run or in what order.
|
|
160
|
+
*/
|
|
161
|
+
function collectMissingFragmentWarnings(fnName, activeFrameworks, fragments, omitted) {
|
|
162
|
+
const warnings = [];
|
|
163
|
+
for (const id of activeFrameworks) {
|
|
164
|
+
if (!fragments.has(id)) {
|
|
165
|
+
warnings.push(`${fnName}: no fragment for "${id}" — ${omitted}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return warnings;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the ${DEVFLOW_COMPLIANCE_ACTIVE} substitution — the body of the
|
|
172
|
+
* Active Frameworks section.
|
|
173
|
+
*
|
|
174
|
+
* Active: lists frameworks + instructs loading reference files.
|
|
175
|
+
* Zero: informs that generic controls only apply.
|
|
176
|
+
*
|
|
177
|
+
* File presence corroborates: note preserved so the agent keeps checking files.
|
|
178
|
+
*
|
|
179
|
+
* C5: a framework with no fragment still appears here — only its mapping row,
|
|
180
|
+
* checklist item and reference row are omitted.
|
|
181
|
+
*
|
|
182
|
+
* Frameworks the registry cannot label are dropped entirely: neither the label nor the
|
|
183
|
+
* `references/{id}.md` path is emitted (see resolveRegistryFrameworks).
|
|
184
|
+
*/
|
|
185
|
+
function buildActiveSection(activeFrameworks) {
|
|
186
|
+
const resolved = resolveRegistryFrameworks(activeFrameworks);
|
|
187
|
+
if (resolved.length === 0) {
|
|
188
|
+
return [
|
|
189
|
+
'No framework-specific reference files are active. Apply generic controls only.',
|
|
190
|
+
'',
|
|
191
|
+
'NEVER fabricate framework-specific guidance for absent `references/{id}.md` files.',
|
|
192
|
+
'If no reference file is present for a framework, apply generic controls only.',
|
|
193
|
+
].join('\n');
|
|
194
|
+
}
|
|
195
|
+
const labels = resolved.map(fw => fw.label);
|
|
196
|
+
const refList = resolved.map(fw => `\`references/${fw.id}.md\``).join(' and ');
|
|
197
|
+
return [
|
|
198
|
+
`**Active: ${labels.join(', ')}.**`,
|
|
199
|
+
'',
|
|
200
|
+
`Load ${refList} for framework-specific controls. Apply generic controls always.`,
|
|
201
|
+
'',
|
|
202
|
+
'File presence in the installed skill directory is the authoritative signal: if a',
|
|
203
|
+
'`references/{id}.md` file is absent, treat that framework as inactive regardless of',
|
|
204
|
+
'this list.',
|
|
205
|
+
'',
|
|
206
|
+
'NEVER fabricate framework-specific guidance for absent `references/{id}.md` files.',
|
|
207
|
+
].join('\n');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Build the ${DEVFLOW_COMPLIANCE_MAPPING} substitution — the ENTIRE Framework
|
|
211
|
+
* Mapping section (heading + table), or empty string when zero frameworks.
|
|
212
|
+
*
|
|
213
|
+
* The section is omitted entirely at zero frameworks (plan: "section omitted
|
|
214
|
+
* entirely at zero frameworks"). C4 blank-line hygiene handles the gap.
|
|
215
|
+
*
|
|
216
|
+
* Row labels come only from the registry — an unlabelable framework yields no row
|
|
217
|
+
* rather than a row headed by its raw ID (see resolveRegistryFrameworks).
|
|
218
|
+
*/
|
|
219
|
+
function buildMappingSection(activeFrameworks, fragments) {
|
|
220
|
+
const header = ['Framework', ...COMPLIANCE_CONTROL_COLUMNS];
|
|
221
|
+
const separator = header.map(() => '---');
|
|
222
|
+
const rows = [];
|
|
223
|
+
for (const { id, label } of resolveRegistryFrameworks(activeFrameworks)) {
|
|
224
|
+
const fragment = fragments.get(id);
|
|
225
|
+
if (!fragment) {
|
|
226
|
+
// C5: framework appears in scope/active but contributes no row.
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const cells = [label, ...fragment.mappingCells];
|
|
230
|
+
rows.push(`| ${cells.join(' | ')} |`);
|
|
231
|
+
}
|
|
232
|
+
// No rows — zero frameworks, or every one of them unlabelable or fragment-less.
|
|
233
|
+
// Omit the section entirely; C4 blank-line hygiene closes the gap.
|
|
234
|
+
if (rows.length === 0) {
|
|
235
|
+
return '';
|
|
236
|
+
}
|
|
237
|
+
const tableLines = [
|
|
238
|
+
`| ${header.join(' | ')} |`,
|
|
239
|
+
`| ${separator.join(' | ')} |`,
|
|
240
|
+
...rows,
|
|
241
|
+
];
|
|
242
|
+
return ['## Framework Mapping', '', ...tableLines].join('\n');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Build the ${DEVFLOW_COMPLIANCE_CHECKLIST} substitution — per-framework
|
|
246
|
+
* checklist items concatenated in caller order.
|
|
247
|
+
*/
|
|
248
|
+
function buildChecklist(activeFrameworks, fragments) {
|
|
249
|
+
const items = [];
|
|
250
|
+
for (const { id } of resolveRegistryFrameworks(activeFrameworks)) {
|
|
251
|
+
const fragment = fragments.get(id);
|
|
252
|
+
// C5: fragment-less frameworks contribute no checklist item.
|
|
253
|
+
if (!fragment)
|
|
254
|
+
continue;
|
|
255
|
+
items.push(...fragment.checklistItems);
|
|
256
|
+
}
|
|
257
|
+
return items.join('\n');
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Build the ${DEVFLOW_COMPLIANCE_REFERENCES} substitution — per-framework
|
|
261
|
+
* reference table rows concatenated in caller order.
|
|
262
|
+
*/
|
|
263
|
+
function buildReferences(activeFrameworks, fragments) {
|
|
264
|
+
const rows = [];
|
|
265
|
+
for (const { id } of resolveRegistryFrameworks(activeFrameworks)) {
|
|
266
|
+
const fragment = fragments.get(id);
|
|
267
|
+
// C5: fragment-less frameworks contribute no reference row.
|
|
268
|
+
if (!fragment)
|
|
269
|
+
continue;
|
|
270
|
+
rows.push(`| \`references/${id}.md\` | ${fragment.referenceBlurb} |`);
|
|
271
|
+
}
|
|
272
|
+
return rows.join('\n');
|
|
273
|
+
}
|
|
274
|
+
// ── Public API ─────────────────────────────────────────────────────────────────
|
|
275
|
+
/**
|
|
276
|
+
* Parse a fragment.md file into a ComplianceFragment.
|
|
277
|
+
*
|
|
278
|
+
* Strict boundary parser: validates all required sections (## Mapping / ##
|
|
279
|
+
* Reference / ## Checklist / ## Rule) and their structural constraints.
|
|
280
|
+
* CRLF-tolerant: Windows line endings are normalised before parsing.
|
|
281
|
+
* Never throws (PF-009): all errors return { ok: false, error }.
|
|
282
|
+
*/
|
|
283
|
+
export function parseComplianceFragment(id, raw) {
|
|
284
|
+
// CRLF tolerance
|
|
285
|
+
const content = raw.replace(/\r\n/g, '\n');
|
|
286
|
+
const sections = extractSections(content);
|
|
287
|
+
const REQUIRED = ['Mapping', 'Reference', 'Checklist', 'Rule'];
|
|
288
|
+
for (const sec of REQUIRED) {
|
|
289
|
+
if (!sections.has(sec)) {
|
|
290
|
+
return { ok: false, error: `fragment "${id}": missing required section "## ${sec}"` };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// ── Parse Mapping ───────────────────────────────────────────────────────────
|
|
294
|
+
const mappingBody = (sections.get('Mapping') ?? '').trim();
|
|
295
|
+
const mappingLines = mappingBody.split('\n').map(l => l.trim()).filter(Boolean);
|
|
296
|
+
const tableRows = mappingLines.filter(l => l.startsWith('|'));
|
|
297
|
+
if (tableRows.length !== 1) {
|
|
298
|
+
return {
|
|
299
|
+
ok: false,
|
|
300
|
+
error: `fragment "${id}": Mapping section must have exactly 1 table row, got ${tableRows.length}`,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const mappingCells = parseTableRow(tableRows[0]);
|
|
304
|
+
if (mappingCells.length !== COMPLIANCE_CONTROL_COLUMNS.length) {
|
|
305
|
+
return {
|
|
306
|
+
ok: false,
|
|
307
|
+
error: `fragment "${id}": Mapping row must have ${COMPLIANCE_CONTROL_COLUMNS.length} cells (one per control column), got ${mappingCells.length}`,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// ── Parse Reference ─────────────────────────────────────────────────────────
|
|
311
|
+
const referenceBlurb = (sections.get('Reference') ?? '').trim();
|
|
312
|
+
if (!referenceBlurb) {
|
|
313
|
+
return { ok: false, error: `fragment "${id}": Reference section is empty` };
|
|
314
|
+
}
|
|
315
|
+
// ── Parse Checklist ─────────────────────────────────────────────────────────
|
|
316
|
+
const checklistBody = (sections.get('Checklist') ?? '').trim();
|
|
317
|
+
const checklistItems = checklistBody
|
|
318
|
+
? checklistBody
|
|
319
|
+
.split('\n')
|
|
320
|
+
.map(l => l.trim())
|
|
321
|
+
.filter(l => l.startsWith('- '))
|
|
322
|
+
: [];
|
|
323
|
+
if (checklistItems.length > 2) {
|
|
324
|
+
return {
|
|
325
|
+
ok: false,
|
|
326
|
+
error: `fragment "${id}": Checklist section must have 0–2 items, got ${checklistItems.length}`,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// ── Parse Rule ──────────────────────────────────────────────────────────────
|
|
330
|
+
const ruleBody = (sections.get('Rule') ?? '').trim();
|
|
331
|
+
const ruleBullets = ruleBody
|
|
332
|
+
.split('\n')
|
|
333
|
+
.map(l => l.trim())
|
|
334
|
+
.filter(l => l.startsWith('- '));
|
|
335
|
+
if (ruleBullets.length !== 1) {
|
|
336
|
+
return {
|
|
337
|
+
ok: false,
|
|
338
|
+
error: `fragment "${id}": Rule section must have exactly 1 bullet, got ${ruleBullets.length}`,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
const ruleBullet = ruleBullets[0];
|
|
342
|
+
if (ruleBullet.length > 200) {
|
|
343
|
+
return {
|
|
344
|
+
ok: false,
|
|
345
|
+
error: `fragment "${id}": Rule bullet exceeds 200 characters (${ruleBullet.length} chars)`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
ok: true,
|
|
350
|
+
value: { id, mappingCells, referenceBlurb, checklistItems, ruleBullet },
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Compose the compliance skill content from a template and per-framework fragments.
|
|
355
|
+
*
|
|
356
|
+
* Contracts:
|
|
357
|
+
* C1 — no ${DEVFLOW_COMPLIANCE_ token → byte-identical passthrough
|
|
358
|
+
* C2 — all framework labels from LABEL_BY_ID; unknown IDs dropped + warned
|
|
359
|
+
* C3 — unknown tokens stripped with warning
|
|
360
|
+
* C4 — blank-line hygiene when a token is substituted
|
|
361
|
+
* C5 — missing fragment → framework appears in scope/active/stamp; no row/item/bullet
|
|
362
|
+
* C6 — frameworks rendered in caller (manifest) order
|
|
363
|
+
* C7 — loops bounded by frameworks
|
|
364
|
+
*/
|
|
365
|
+
export function composeComplianceSkill(template, frameworks, fragments) {
|
|
366
|
+
// C1: identity passthrough — no I/O overhead for token-less content (e.g. shadows)
|
|
367
|
+
if (!template.includes('${DEVFLOW_COMPLIANCE_')) {
|
|
368
|
+
return { content: template, warnings: [] };
|
|
369
|
+
}
|
|
370
|
+
const warnings = [];
|
|
371
|
+
// C2: filter to registry IDs only — unknown IDs never emitted
|
|
372
|
+
const activeFrameworks = frameworks.filter(id => {
|
|
373
|
+
if (!LABEL_BY_ID.has(id)) {
|
|
374
|
+
warnings.push(`composeComplianceSkill: unknown framework ID "${id}" dropped`);
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
return true;
|
|
378
|
+
});
|
|
379
|
+
// C5: warn once per fragment-less framework, before any section is built — the
|
|
380
|
+
// builders below each skip such frameworks independently and emit nothing.
|
|
381
|
+
warnings.push(...collectMissingFragmentWarnings('composeComplianceSkill', activeFrameworks, fragments, 'mapping row, checklist item and reference row omitted'));
|
|
382
|
+
// Build substitution values (C6: activeFrameworks is in caller order after filter)
|
|
383
|
+
const scope = buildScope(activeFrameworks);
|
|
384
|
+
const active = buildActiveSection(activeFrameworks);
|
|
385
|
+
const mapping = buildMappingSection(activeFrameworks, fragments);
|
|
386
|
+
const checklist = buildChecklist(activeFrameworks, fragments);
|
|
387
|
+
const references = buildReferences(activeFrameworks, fragments);
|
|
388
|
+
let content = template;
|
|
389
|
+
content = replaceToken(content, '${DEVFLOW_COMPLIANCE_SCOPE}', scope);
|
|
390
|
+
content = replaceToken(content, '${DEVFLOW_COMPLIANCE_ACTIVE}', active);
|
|
391
|
+
content = replaceToken(content, '${DEVFLOW_COMPLIANCE_MAPPING}', mapping);
|
|
392
|
+
content = replaceToken(content, '${DEVFLOW_COMPLIANCE_CHECKLIST}', checklist);
|
|
393
|
+
content = replaceToken(content, '${DEVFLOW_COMPLIANCE_REFERENCES}', references);
|
|
394
|
+
// C3: strip remaining unknown tokens with warning. The character class must cover
|
|
395
|
+
// every shape the C1 guard admits (it keys on the `${DEVFLOW_COMPLIANCE_` prefix
|
|
396
|
+
// alone) — digits included — or a token like ${DEVFLOW_COMPLIANCE_SOC2} in a user
|
|
397
|
+
// shadow would survive into the installed skill as literal residue.
|
|
398
|
+
content = content.replace(UNKNOWN_TOKEN_PATTERN, match => {
|
|
399
|
+
// Known tokens have already been replaced above
|
|
400
|
+
warnings.push(`composeComplianceSkill: unknown token "${match}" stripped`);
|
|
401
|
+
return '';
|
|
402
|
+
});
|
|
403
|
+
// C4: blank-line hygiene — collapse 3+ blank lines to 2
|
|
404
|
+
content = applyBlankLineHygiene(content);
|
|
405
|
+
return { content, warnings };
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Compose the compliance rule content from a template and per-framework fragments.
|
|
409
|
+
*
|
|
410
|
+
* Handles ${DEVFLOW_COMPLIANCE_RULE_BULLETS} (per-framework bullets) and
|
|
411
|
+
* delegates ${DEVFLOW_COMPLIANCE_FRAMEWORKS} to the untouched stampComplianceRule.
|
|
412
|
+
*
|
|
413
|
+
* Contracts: same C1–C7 as composeComplianceSkill.
|
|
414
|
+
*/
|
|
415
|
+
export function composeComplianceRule(template, frameworks, fragments) {
|
|
416
|
+
// C1: identity passthrough
|
|
417
|
+
if (!template.includes('${DEVFLOW_COMPLIANCE_')) {
|
|
418
|
+
return { content: template, warnings: [] };
|
|
419
|
+
}
|
|
420
|
+
const warnings = [];
|
|
421
|
+
// C2: filter to registry IDs only
|
|
422
|
+
const activeFrameworks = frameworks.filter(id => {
|
|
423
|
+
if (!LABEL_BY_ID.has(id)) {
|
|
424
|
+
warnings.push(`composeComplianceRule: unknown framework ID "${id}" dropped`);
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
return true;
|
|
428
|
+
});
|
|
429
|
+
// C5: warn once per fragment-less framework — the framework still reaches the
|
|
430
|
+
// ${DEVFLOW_COMPLIANCE_FRAMEWORKS} stamp below, only its bullet is omitted.
|
|
431
|
+
warnings.push(...collectMissingFragmentWarnings('composeComplianceRule', activeFrameworks, fragments, 'rule bullet omitted'));
|
|
432
|
+
// Build per-framework rule bullets (C6: caller order; C7: bounded by frameworks).
|
|
433
|
+
// Resolved through the registry so an unlabelable ID contributes no bullet.
|
|
434
|
+
const bullets = [];
|
|
435
|
+
for (const { id } of resolveRegistryFrameworks(activeFrameworks)) {
|
|
436
|
+
const fragment = fragments.get(id);
|
|
437
|
+
if (!fragment)
|
|
438
|
+
continue;
|
|
439
|
+
bullets.push(fragment.ruleBullet);
|
|
440
|
+
}
|
|
441
|
+
let content = replaceToken(template, '${DEVFLOW_COMPLIANCE_RULE_BULLETS}', bullets.join('\n'));
|
|
442
|
+
// C3: strip remaining unknown tokens EXCEPT ${DEVFLOW_COMPLIANCE_FRAMEWORKS}
|
|
443
|
+
// (preserved for stampComplianceRule below)
|
|
444
|
+
content = content.replace(UNKNOWN_TOKEN_PATTERN, match => {
|
|
445
|
+
if (match === '${DEVFLOW_COMPLIANCE_FRAMEWORKS}')
|
|
446
|
+
return match; // handled next
|
|
447
|
+
warnings.push(`composeComplianceRule: unknown token "${match}" stripped`);
|
|
448
|
+
return '';
|
|
449
|
+
});
|
|
450
|
+
// C4: blank-line hygiene before stamping (stampComplianceRule does not touch whitespace)
|
|
451
|
+
content = applyBlankLineHygiene(content);
|
|
452
|
+
// Delegate ${DEVFLOW_COMPLIANCE_FRAMEWORKS} stamp to the untouched function
|
|
453
|
+
// (passes `frameworks` — not just activeFrameworks — to preserve stampComplianceRule's
|
|
454
|
+
// own registry-ID filter behaviour, which drops unknowns silently)
|
|
455
|
+
content = stampComplianceRule(content, frameworks);
|
|
456
|
+
return { content, warnings };
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=compliance-compose.js.map
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core compliance framework registry and utilities.
|
|
3
|
+
*
|
|
4
|
+
* Pure module — no I/O, no side effects.
|
|
5
|
+
* Applies ADR-013: pure helpers in src/core/, I/O orchestration in src/targets/.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Canonical compliance framework registry.
|
|
9
|
+
* IDs match framework source directories: src/assets/skills/compliance/frameworks/{id}/
|
|
10
|
+
* Labels are stamped verbatim into installed artifacts — no user input is ever written.
|
|
11
|
+
* (AC-35, AC-36: no unvalidated ID reaches an fs path; no user-supplied string in artifacts)
|
|
12
|
+
*/
|
|
13
|
+
export const COMPLIANCE_FRAMEWORKS = [
|
|
14
|
+
{ id: 'gdpr', label: 'GDPR', hint: 'EU data protection and privacy regulation' },
|
|
15
|
+
{ id: 'hipaa', label: 'HIPAA', hint: 'US health data privacy and security' },
|
|
16
|
+
{ id: 'pci-dss', label: 'PCI DSS', hint: 'Payment card data security standard' },
|
|
17
|
+
{ id: 'soc2', label: 'SOC 2', hint: 'Service organization security and availability' },
|
|
18
|
+
{ id: 'iso-27001', label: 'ISO 27001', hint: 'International information security management' },
|
|
19
|
+
{ id: 'sox', label: 'SOX', hint: 'US financial reporting controls' },
|
|
20
|
+
];
|
|
21
|
+
/** Placeholder inserted in the compliance rule file and replaced at install time. */
|
|
22
|
+
export const COMPLIANCE_RULE_PLACEHOLDER = '${DEVFLOW_COMPLIANCE_FRAMEWORKS}';
|
|
23
|
+
/**
|
|
24
|
+
* Reference files always installed in the compliance skill directory,
|
|
25
|
+
* regardless of framework selection.
|
|
26
|
+
* detection.md — generic detection heuristics
|
|
27
|
+
* sources.md — authoritative source index
|
|
28
|
+
*
|
|
29
|
+
* Exported (ADR-013: pure constant in src/core/) so both compliance-install.ts
|
|
30
|
+
* (install) and compliance.ts CLI (status/drift detection) share a single
|
|
31
|
+
* definition. Adding a third always-present ref requires only one change here.
|
|
32
|
+
*/
|
|
33
|
+
export const ALWAYS_PRESENT_REFS = ['detection.md', 'sources.md'];
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Internal helpers
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
const REGISTRY_SET = new Set(COMPLIANCE_FRAMEWORKS.map(fw => fw.id));
|
|
38
|
+
const LABEL_BY_ID = new Map(COMPLIANCE_FRAMEWORKS.map(fw => [fw.id, fw.label]));
|
|
39
|
+
const VALID_IDS_LIST = COMPLIANCE_FRAMEWORKS.map(fw => fw.id).join(', ');
|
|
40
|
+
/**
|
|
41
|
+
* Normalize a single framework string:
|
|
42
|
+
* 1. trim whitespace
|
|
43
|
+
* 2. lowercase
|
|
44
|
+
* 3. collapse spaces to dashes
|
|
45
|
+
* 4. apply known alias: iso27001 → iso-27001
|
|
46
|
+
*/
|
|
47
|
+
function normalizeId(s) {
|
|
48
|
+
const normalized = s.trim().toLowerCase().replace(/\s+/g, '-');
|
|
49
|
+
if (normalized === 'iso27001')
|
|
50
|
+
return 'iso-27001';
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Exported functions
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
/**
|
|
57
|
+
* Tolerant parser: normalize an array of framework strings and DROP anything
|
|
58
|
+
* that is not a registry ID.
|
|
59
|
+
*
|
|
60
|
+
* This is the trust boundary for framework IDs that did not come through
|
|
61
|
+
* `parseFrameworkList` — most importantly `manifest.features.compliance.frameworks`,
|
|
62
|
+
* which `normalizeComplianceFeature` only type-checks (it cannot reject unknown IDs
|
|
63
|
+
* without violating the ADR-014 self-heal contract). Every framework ID that is about
|
|
64
|
+
* to become an fs path segment or be written into an installed artifact must pass
|
|
65
|
+
* through here first (AC-35, AC-36).
|
|
66
|
+
*
|
|
67
|
+
* Unlike `parseFrameworkList` this never errors — unknown IDs are dropped silently,
|
|
68
|
+
* so a manifest written by a newer devflow (or hand-edited) degrades to the subset
|
|
69
|
+
* this build understands instead of failing the install.
|
|
70
|
+
*
|
|
71
|
+
* Deduplication: first occurrence wins, subsequent occurrences of the same ID are
|
|
72
|
+
* dropped. This preserves the user's intended ordering while ensuring each framework
|
|
73
|
+
* appears exactly once in installed artifacts.
|
|
74
|
+
*/
|
|
75
|
+
export function normalizeFrameworks(frameworks) {
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
return frameworks.map(normalizeId).filter(id => {
|
|
78
|
+
if (!REGISTRY_SET.has(id))
|
|
79
|
+
return false;
|
|
80
|
+
if (seen.has(id))
|
|
81
|
+
return false;
|
|
82
|
+
seen.add(id);
|
|
83
|
+
return true;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse and validate a framework list (comma-separated string).
|
|
88
|
+
*
|
|
89
|
+
* Normalization: lowercase, trim, space→dash, iso27001 alias.
|
|
90
|
+
* Hard-rejects unknowns: error names every valid ID and every unknown ID.
|
|
91
|
+
* All-invalid input still produces an error — never a silent empty list.
|
|
92
|
+
* (AC-3, AC-4)
|
|
93
|
+
*/
|
|
94
|
+
export function parseFrameworkList(input) {
|
|
95
|
+
const raw = input.split(',').filter(s => s.trim() !== '');
|
|
96
|
+
if (raw.length === 0) {
|
|
97
|
+
return { ok: true, value: [] };
|
|
98
|
+
}
|
|
99
|
+
const normalized = raw.map(normalizeId);
|
|
100
|
+
const unknowns = normalized.filter(id => !REGISTRY_SET.has(id));
|
|
101
|
+
if (unknowns.length > 0) {
|
|
102
|
+
return {
|
|
103
|
+
ok: false,
|
|
104
|
+
error: `Unknown framework ID(s): ${unknowns.join(', ')}. Valid IDs: ${VALID_IDS_LIST}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { ok: true, value: normalized };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Normalize and self-heal a raw compliance feature value from JSON.
|
|
111
|
+
*
|
|
112
|
+
* Absent, null, malformed, or partially-valid → {enabled:false, frameworks:[]}.
|
|
113
|
+
* Preserves valid {enabled: boolean, frameworks: string[]}.
|
|
114
|
+
* (Applies ADR-014 self-heal idiom)
|
|
115
|
+
*/
|
|
116
|
+
export function normalizeComplianceFeature(raw) {
|
|
117
|
+
const DEFAULT = { enabled: false, frameworks: [] };
|
|
118
|
+
if (raw === null || raw === undefined || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
119
|
+
return DEFAULT;
|
|
120
|
+
}
|
|
121
|
+
const obj = raw;
|
|
122
|
+
if (typeof obj.enabled !== 'boolean')
|
|
123
|
+
return DEFAULT;
|
|
124
|
+
if (!Array.isArray(obj.frameworks))
|
|
125
|
+
return DEFAULT;
|
|
126
|
+
if (!obj.frameworks.every(f => typeof f === 'string'))
|
|
127
|
+
return DEFAULT;
|
|
128
|
+
return { enabled: obj.enabled, frameworks: obj.frameworks };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stamp the compliance rule file content with the selected frameworks.
|
|
132
|
+
*
|
|
133
|
+
* Replaces ${DEVFLOW_COMPLIANCE_FRAMEWORKS} with a full self-contained clause:
|
|
134
|
+
* - "Active frameworks: GDPR, SOC 2 — their controls are binding." (non-empty list)
|
|
135
|
+
* - "Active frameworks: none declared — generic controls only." (empty list)
|
|
136
|
+
*
|
|
137
|
+
* The trailing clause lives here, not in the rule template, so the template line
|
|
138
|
+
* stays slim (`- ${DEVFLOW_COMPLIANCE_FRAMEWORKS}`) and the stamp is always a
|
|
139
|
+
* coherent sentence regardless of how the rule file is structured.
|
|
140
|
+
*
|
|
141
|
+
* The stamp replaces only the placeholder; surrounding prose is template/shadow-owned.
|
|
142
|
+
*
|
|
143
|
+
* If the placeholder is absent (e.g. a user shadow without it), content is returned
|
|
144
|
+
* unchanged — no-op stamp.
|
|
145
|
+
*
|
|
146
|
+
* Stamps static registry labels only — no user-supplied string is ever written
|
|
147
|
+
* to installed artifacts. (AC-35, AC-36)
|
|
148
|
+
*/
|
|
149
|
+
export function stampComplianceRule(content, frameworks) {
|
|
150
|
+
if (!content.includes(COMPLIANCE_RULE_PLACEHOLDER)) {
|
|
151
|
+
return content;
|
|
152
|
+
}
|
|
153
|
+
// Look up static labels in order of the input frameworks array. Unknown IDs are
|
|
154
|
+
// DROPPED, never echoed — this function is the last writer before the rule lands
|
|
155
|
+
// in ~/.claude/rules/devflow/, which Claude Code loads into every prompt, so an
|
|
156
|
+
// unvalidated ID must not be able to inject text there (AC-35, AC-36).
|
|
157
|
+
const labels = frameworks
|
|
158
|
+
.map(id => LABEL_BY_ID.get(id))
|
|
159
|
+
.filter((label) => label !== undefined);
|
|
160
|
+
const stamp = labels.length === 0
|
|
161
|
+
? 'Active frameworks: none declared — generic controls only.'
|
|
162
|
+
: `Active frameworks: ${labels.join(', ')} — their controls are binding.`;
|
|
163
|
+
return content.replace(/\$\{DEVFLOW_COMPLIANCE_FRAMEWORKS\}/g, stamp);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=compliance.js.map
|