devflow-kit 1.8.3 → 2.0.1
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 +182 -7
- 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 +14 -4
- 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,334 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { promises as fs } from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as p from '@clack/prompts';
|
|
5
|
+
import color from 'picocolors';
|
|
6
|
+
import { getClaudeDirectory, getDevFlowDirectory } from '../../targets/claude-code/claude-paths.js';
|
|
7
|
+
import { DEVFLOW_PLUGINS, buildRulesMap, getAllRuleNames, FEATURE_OWNED_RULES } from '../../core/plugins.js';
|
|
8
|
+
import { readManifest, writeManifest } from '../../core/manifest.js';
|
|
9
|
+
import { rulesDir } from '../../core/assets.js';
|
|
10
|
+
import { installAllRules, validateRuleShadow } from '../../targets/claude-code/installer.js';
|
|
11
|
+
import { convergeFromManifest } from '../../targets/claude-code/compliance-install.js';
|
|
12
|
+
/**
|
|
13
|
+
* Check whether a rule has a user shadow file at ~/.devflow/rules/{name}.md.
|
|
14
|
+
*/
|
|
15
|
+
export async function hasRuleShadow(ruleName, devflowDir) {
|
|
16
|
+
const dir = devflowDir ?? getDevFlowDirectory();
|
|
17
|
+
try {
|
|
18
|
+
await fs.access(path.join(dir, 'rules', `${ruleName}.md`));
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List all rule shadow names (bare basenames without .md) from ~/.devflow/rules/.
|
|
27
|
+
* Returns [] when the directory does not exist.
|
|
28
|
+
*/
|
|
29
|
+
export async function listShadowedRules(devflowDir) {
|
|
30
|
+
const dir = devflowDir ?? getDevFlowDirectory();
|
|
31
|
+
const shadowsRoot = path.join(dir, 'rules');
|
|
32
|
+
try {
|
|
33
|
+
const entries = await fs.readdir(shadowsRoot);
|
|
34
|
+
return entries
|
|
35
|
+
.filter(e => e.endsWith('.md'))
|
|
36
|
+
.map(e => path.basename(e, '.md'));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Render the shadow-state tag for a rule — shared by formatRuleRow and printRulesList. Exhaustive switch catches new states at compile time. */
|
|
43
|
+
function buildRuleShadowTag(shadowState) {
|
|
44
|
+
switch (shadowState) {
|
|
45
|
+
case 'valid':
|
|
46
|
+
return ' ' + color.green('shadowed');
|
|
47
|
+
case 'empty-shadow-file':
|
|
48
|
+
return ' ' + color.yellow('shadowed — invalid: empty file');
|
|
49
|
+
case 'not-a-file':
|
|
50
|
+
return ' ' + color.yellow('shadowed — invalid: not a file');
|
|
51
|
+
case 'none':
|
|
52
|
+
return '';
|
|
53
|
+
default: {
|
|
54
|
+
const _exhaustive = shadowState;
|
|
55
|
+
void _exhaustive;
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the short owner label for a rule.
|
|
62
|
+
* Plugin-owned rules strip the 'devflow-' prefix; feature-owned rules (e.g. compliance)
|
|
63
|
+
* have no plugin entry — they return 'feature'; unrecognised rules return 'unknown'.
|
|
64
|
+
*/
|
|
65
|
+
function resolveRuleOwner(name, ownerMap) {
|
|
66
|
+
return ownerMap.get(name)?.replace('devflow-', '') ??
|
|
67
|
+
(FEATURE_OWNED_RULES.includes(name) ? 'feature' : 'unknown');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format a single rule row for display.
|
|
71
|
+
* Shared by --status (no installed tag) and printRulesList (with installed tag).
|
|
72
|
+
*/
|
|
73
|
+
function formatRuleRow(name, shortOwner, shadowState, installedTag = '') {
|
|
74
|
+
return ` ${color.cyan(name.padEnd(16))} ${color.dim(shortOwner)}${installedTag}${buildRuleShadowTag(shadowState)}`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build and print the enriched rules list (used by both `rules list` and `rules --list`).
|
|
78
|
+
*/
|
|
79
|
+
async function printRulesList(claudeDir, devflowDir) {
|
|
80
|
+
const rulesTarget = path.join(claudeDir, 'rules', 'devflow');
|
|
81
|
+
// Union FEATURE_OWNED_RULES (compliance) so list covers feature-managed rules
|
|
82
|
+
// that left the plugin registry but still live in src/assets/rules/ (step 1.5).
|
|
83
|
+
const allRules = [...getAllRuleNames(), ...FEATURE_OWNED_RULES];
|
|
84
|
+
let installedNames = [];
|
|
85
|
+
try {
|
|
86
|
+
const entries = await fs.readdir(rulesTarget);
|
|
87
|
+
installedNames = entries.filter(f => f.endsWith('.md')).map(f => path.basename(f, '.md'));
|
|
88
|
+
}
|
|
89
|
+
catch { /* dir doesn't exist */ }
|
|
90
|
+
const installedSet = new Set(installedNames);
|
|
91
|
+
const knownRuleSet = new Set(allRules);
|
|
92
|
+
const ownerMap = buildRulesMap(DEVFLOW_PLUGINS);
|
|
93
|
+
// Known rules rows — collect shadow state for the header count
|
|
94
|
+
const knownResults = await Promise.all(allRules.map(async (name) => {
|
|
95
|
+
const installedTag = installedSet.has(name) ? color.green(' ✓') : color.dim(' ✗');
|
|
96
|
+
const shadowFile = path.join(devflowDir, 'rules', `${name}.md`);
|
|
97
|
+
const shadowState = await validateRuleShadow(shadowFile);
|
|
98
|
+
const owner = resolveRuleOwner(name, ownerMap);
|
|
99
|
+
return { row: formatRuleRow(name, owner, shadowState, installedTag), shadowState };
|
|
100
|
+
}));
|
|
101
|
+
const rows = knownResults.map(r => r.row);
|
|
102
|
+
const shadowedCount = knownResults.filter(r => r.shadowState !== 'none').length;
|
|
103
|
+
// Orphan shadows: in ~/.devflow/rules/ but not a known rule — mirroring skills list behavior
|
|
104
|
+
const allShadowedNames = await listShadowedRules(devflowDir);
|
|
105
|
+
for (const name of allShadowedNames) {
|
|
106
|
+
if (!knownRuleSet.has(name)) {
|
|
107
|
+
rows.push(` ${color.yellow(name.padEnd(16))} ${color.yellow('unknown rule')}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
p.note(rows.join('\n'), `Rules (${allRules.length} known, ${shadowedCount} shadowed)`);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Seed a rule shadow file from the installed rule or the built plugin source.
|
|
114
|
+
* Returns which tier seeded: 'installed' | 'source' | 'none'.
|
|
115
|
+
* Creates the shadow directory before copying.
|
|
116
|
+
*
|
|
117
|
+
* D35 — seedRuleShadow tiers (applies ADR-010):
|
|
118
|
+
* Tier 1 — installed rule at rulesTarget/{name}.md (fastest path when rules are enabled).
|
|
119
|
+
* SKIPPED for FEATURE_OWNED_RULES: the installed file is already stamped
|
|
120
|
+
* (${DEVFLOW_COMPLIANCE_FRAMEWORKS} replaced with label text), so seeding from
|
|
121
|
+
* it destroys the placeholder and silently disables framework stamping forever.
|
|
122
|
+
* Tier 2 — flat source at src/assets/rules/{name}.md (always used for FEATURE_OWNED_RULES;
|
|
123
|
+
* fallback for plugin-owned rules when Tier 1 is absent).
|
|
124
|
+
* Tier 3 — 'none': caller emits a manual-create instruction.
|
|
125
|
+
*/
|
|
126
|
+
export async function seedRuleShadow(name, shadowFile, rulesTarget, devflowDir) {
|
|
127
|
+
await fs.mkdir(path.join(devflowDir, 'rules'), { recursive: true });
|
|
128
|
+
// Tier 1: seed from installed rule — skipped for FEATURE_OWNED_RULES because the installed
|
|
129
|
+
// file is already stamped (placeholder replaced), which would permanently disable framework
|
|
130
|
+
// stamping when the shadow is subsequently applied via convergeComplianceArtifacts.
|
|
131
|
+
if (!FEATURE_OWNED_RULES.includes(name)) {
|
|
132
|
+
try {
|
|
133
|
+
await fs.copyFile(path.join(rulesTarget, `${name}.md`), shadowFile);
|
|
134
|
+
return 'installed';
|
|
135
|
+
}
|
|
136
|
+
catch { /* not present — try flat source */ }
|
|
137
|
+
}
|
|
138
|
+
// Tier 2: seed from flat rules source (canonical, with placeholder for templated rules)
|
|
139
|
+
try {
|
|
140
|
+
await fs.copyFile(path.join(rulesDir(), `${name}.md`), shadowFile);
|
|
141
|
+
return 'source';
|
|
142
|
+
}
|
|
143
|
+
catch { /* source not found */ }
|
|
144
|
+
return 'none';
|
|
145
|
+
}
|
|
146
|
+
async function handleRuleShadow(name, allRules, devflowDir, rulesTarget) {
|
|
147
|
+
if (!name) {
|
|
148
|
+
p.log.error('Rule name required. Usage: devflow rules shadow <name>');
|
|
149
|
+
p.log.info(`Available rules: ${allRules.join(', ')}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (!allRules.includes(name)) {
|
|
153
|
+
p.log.error(`Unknown rule: ${name}`);
|
|
154
|
+
p.log.info(`Available rules: ${allRules.join(', ')}`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
const shadowFile = path.join(devflowDir, 'rules', `${name}.md`);
|
|
158
|
+
if (await hasRuleShadow(name, devflowDir)) {
|
|
159
|
+
p.log.info(`${name} is already shadowed at ${color.dim(shadowFile)}`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const tier = await seedRuleShadow(name, shadowFile, rulesTarget, devflowDir);
|
|
163
|
+
if (tier !== 'none') {
|
|
164
|
+
p.log.success(`Shadowed ${color.cyan(name)}`);
|
|
165
|
+
p.log.info(`Edit ${color.dim(shadowFile)} then run devflow rules --enable or devflow init to apply.`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
p.log.warn(`Could not seed shadow for ${name} (no installed or source file found)`);
|
|
169
|
+
p.log.info(`Create ${color.dim(shadowFile)} manually then run devflow rules --enable to apply.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function handleRuleUnshadow(name, allRules, devflowDir) {
|
|
173
|
+
if (!name) {
|
|
174
|
+
p.log.error('Rule name required. Usage: devflow rules unshadow <name>');
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
// Mirror the shadow guard: reject unknown names before building the shadow path
|
|
178
|
+
if (!allRules.includes(name)) {
|
|
179
|
+
p.log.error(`Unknown rule: ${name}`);
|
|
180
|
+
p.log.info(`Available rules: ${allRules.join(', ')}`);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
const shadowFile = path.join(devflowDir, 'rules', `${name}.md`);
|
|
184
|
+
if (!await hasRuleShadow(name, devflowDir)) {
|
|
185
|
+
p.log.info(`${name} is not shadowed`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
await fs.rm(shadowFile, { force: true });
|
|
189
|
+
p.log.success(`Unshadowed ${color.cyan(name)}`);
|
|
190
|
+
p.log.info('Run devflow rules --enable or devflow init to restore Devflow\'s version.');
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Install rules from the manifest plugins and converge compliance artifacts.
|
|
194
|
+
*
|
|
195
|
+
* Single production caller: the rules --enable handler (options.enable in the command action).
|
|
196
|
+
* Extracted as a named export for independent unit testing.
|
|
197
|
+
*
|
|
198
|
+
* Compliance convergence runs unconditionally — convergeComplianceArtifacts handles the
|
|
199
|
+
* disabled case by removing stale artifacts, so no enabled-gate is needed here. Running
|
|
200
|
+
* converge regardless of the rules-install outcome ensures that a rules-install failure
|
|
201
|
+
* cannot leave compliance artifacts in a half-converged state (avoids PF-015 violation).
|
|
202
|
+
*
|
|
203
|
+
* Applies PF-009: warn-not-throw on per-item compliance convergence failure.
|
|
204
|
+
*/
|
|
205
|
+
export async function runRulesEnable(claudeDir, devflowDir) {
|
|
206
|
+
const rulesTarget = path.join(claudeDir, 'rules', 'devflow');
|
|
207
|
+
const manifest = await readManifest(devflowDir);
|
|
208
|
+
if (!manifest) {
|
|
209
|
+
p.log.error('No manifest found. Run devflow init first.');
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
const installedPlugins = DEVFLOW_PLUGINS.filter(pl => manifest.plugins.includes(pl.name));
|
|
213
|
+
const rulesMap = buildRulesMap(installedPlugins);
|
|
214
|
+
// Wipe stale rules from previously uninstalled plugins before re-installing.
|
|
215
|
+
await fs.rm(rulesTarget, { recursive: true, force: true });
|
|
216
|
+
await fs.mkdir(rulesTarget, { recursive: true });
|
|
217
|
+
let outcomes = [];
|
|
218
|
+
let installFailed = false;
|
|
219
|
+
try {
|
|
220
|
+
outcomes = await installAllRules(rulesMap, devflowDir, rulesTarget);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
p.log.error(`Rules installation failed — rules directory has been cleared: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
+
installFailed = true;
|
|
225
|
+
}
|
|
226
|
+
if (!installFailed) {
|
|
227
|
+
const shadowedCount = outcomes.filter(o => o.outcome === 'shadow').length;
|
|
228
|
+
const shadowSuffix = shadowedCount > 0 ? ` (${shadowedCount} shadowed)` : '';
|
|
229
|
+
for (const { ruleName, outcome } of outcomes) {
|
|
230
|
+
if (outcome === 'source-invalid-shadow:empty-shadow-file' ||
|
|
231
|
+
outcome === 'source-invalid-shadow:not-a-file') {
|
|
232
|
+
p.log.warn(`Shadow for rule:${ruleName} is invalid — Devflow's version was installed`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
manifest.features.rules = true;
|
|
236
|
+
manifest.updatedAt = new Date().toISOString();
|
|
237
|
+
await writeManifest(devflowDir, manifest);
|
|
238
|
+
p.log.success(`Installed ${rulesMap.size} rule(s) to ${color.dim(rulesTarget)}${shadowSuffix}`);
|
|
239
|
+
}
|
|
240
|
+
// Converge compliance artifacts unconditionally — convergeFromManifest handles the
|
|
241
|
+
// disabled case itself (removes stale artifacts). Running this regardless of installFailed
|
|
242
|
+
// prevents a rules-install failure from leaving the compliance rule in a stale state.
|
|
243
|
+
// rulesEnabledOverride reflects the actual settled state: false when install failed so the
|
|
244
|
+
// compliance rule is not installed into a wiped, rules-disabled directory (avoids PF-015).
|
|
245
|
+
try {
|
|
246
|
+
await convergeFromManifest({
|
|
247
|
+
claudeDir,
|
|
248
|
+
devflowDir,
|
|
249
|
+
manifest,
|
|
250
|
+
warn: (msg) => p.log.warn(msg),
|
|
251
|
+
rulesEnabledOverride: !installFailed,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
// PF-009: warn-not-abort — compliance convergence failure does not undo rules install
|
|
256
|
+
p.log.warn(`Compliance rule convergence failed — rules installed but compliance rule may be stale: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export const rulesCommand = new Command('rules')
|
|
260
|
+
.description('Manage Devflow rules')
|
|
261
|
+
.argument('[action]', 'Action: shadow, unshadow, or list')
|
|
262
|
+
.argument('[name]', 'Rule name (required for shadow/unshadow)')
|
|
263
|
+
.option('--enable', 'Enable rules (install from manifest plugins)')
|
|
264
|
+
.option('--disable', 'Disable rules (remove rules directory)')
|
|
265
|
+
.option('--status', 'Show installed rules with source and shadow status')
|
|
266
|
+
.option('--list', 'List all available rules with install status and shadow state')
|
|
267
|
+
.action(async (action, name, options) => {
|
|
268
|
+
const claudeDir = getClaudeDirectory();
|
|
269
|
+
const devflowDir = getDevFlowDirectory();
|
|
270
|
+
const rulesTarget = path.join(claudeDir, 'rules', 'devflow');
|
|
271
|
+
// Positional actions dispatch first — flags are not checked when action is given
|
|
272
|
+
if (action) {
|
|
273
|
+
// Union FEATURE_OWNED_RULES (compliance) so shadow/unshadow/list cover feature-managed
|
|
274
|
+
// rules that left the plugin registry but still live in src/assets/rules/ (step 1.5).
|
|
275
|
+
const allRules = [...getAllRuleNames(), ...FEATURE_OWNED_RULES];
|
|
276
|
+
if (action === 'shadow') {
|
|
277
|
+
await handleRuleShadow(name, allRules, devflowDir, rulesTarget);
|
|
278
|
+
}
|
|
279
|
+
else if (action === 'unshadow') {
|
|
280
|
+
await handleRuleUnshadow(name, allRules, devflowDir);
|
|
281
|
+
}
|
|
282
|
+
else if (action === 'list') {
|
|
283
|
+
await printRulesList(claudeDir, devflowDir);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
p.log.error(`Unknown action: ${action}`);
|
|
287
|
+
p.log.info('Usage: devflow rules <shadow|unshadow|list> [name]');
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// No positional action — fall through to flag-based handling
|
|
293
|
+
if (options.enable) {
|
|
294
|
+
await runRulesEnable(claudeDir, devflowDir);
|
|
295
|
+
}
|
|
296
|
+
else if (options.disable) {
|
|
297
|
+
await fs.rm(rulesTarget, { recursive: true, force: true });
|
|
298
|
+
const manifest = await readManifest(devflowDir);
|
|
299
|
+
if (manifest) {
|
|
300
|
+
manifest.features.rules = false;
|
|
301
|
+
manifest.updatedAt = new Date().toISOString();
|
|
302
|
+
await writeManifest(devflowDir, manifest);
|
|
303
|
+
}
|
|
304
|
+
p.log.success('Rules disabled — removed rules directory');
|
|
305
|
+
}
|
|
306
|
+
else if (options.status) {
|
|
307
|
+
let installedFiles = [];
|
|
308
|
+
try {
|
|
309
|
+
const entries = await fs.readdir(rulesTarget);
|
|
310
|
+
installedFiles = entries.filter(f => f.endsWith('.md'));
|
|
311
|
+
}
|
|
312
|
+
catch { /* dir doesn't exist */ }
|
|
313
|
+
if (installedFiles.length === 0) {
|
|
314
|
+
p.log.info('No rules installed. Run devflow rules --enable to install.');
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const ownerMap = buildRulesMap(DEVFLOW_PLUGINS);
|
|
318
|
+
const lines = await Promise.all(installedFiles.map(async (file) => {
|
|
319
|
+
const n = path.basename(file, '.md');
|
|
320
|
+
const shortOwner = resolveRuleOwner(n, ownerMap);
|
|
321
|
+
const shadowFile = path.join(devflowDir, 'rules', `${n}.md`);
|
|
322
|
+
const shadowState = await validateRuleShadow(shadowFile);
|
|
323
|
+
return formatRuleRow(n, shortOwner, shadowState);
|
|
324
|
+
}));
|
|
325
|
+
p.note(lines.join('\n'), `Installed rules (${installedFiles.length})`);
|
|
326
|
+
}
|
|
327
|
+
else if (options.list) {
|
|
328
|
+
await printRulesList(claudeDir, devflowDir);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
p.log.info('Usage: devflow rules <shadow|unshadow|list> | --enable | --disable | --status | --list');
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
import color from 'picocolors';
|
|
4
|
+
import { detectPlatform, detectShell, getProfilePath, getSafeDeleteInfo, hasSafeDelete, } from '../../core/safe-delete.js';
|
|
5
|
+
import { generateSafeDeleteBlock, installToProfile, removeFromProfile, getInstalledVersion, SAFE_DELETE_BLOCK_VERSION, } from '../../core/safe-delete-install.js';
|
|
6
|
+
/**
|
|
7
|
+
* Determine the current safe-delete install status and resolved profile path.
|
|
8
|
+
* Returns { status, profilePath } — profilePath may be null on unsupported platforms.
|
|
9
|
+
*
|
|
10
|
+
* Wrapped in try/catch so callers never crash regardless of environment.
|
|
11
|
+
*/
|
|
12
|
+
export async function getSafeDeleteStatus() {
|
|
13
|
+
try {
|
|
14
|
+
const shell = detectShell();
|
|
15
|
+
const profilePath = getProfilePath(shell);
|
|
16
|
+
if (shell === 'unknown' || profilePath === null) {
|
|
17
|
+
return { status: 'unknown', profilePath: null };
|
|
18
|
+
}
|
|
19
|
+
const version = await getInstalledVersion(profilePath);
|
|
20
|
+
if (version === 0) {
|
|
21
|
+
return { status: 'absent', profilePath };
|
|
22
|
+
}
|
|
23
|
+
if (version < SAFE_DELETE_BLOCK_VERSION) {
|
|
24
|
+
return { status: 'outdated', profilePath };
|
|
25
|
+
}
|
|
26
|
+
return { status: 'installed', profilePath };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { status: 'unknown', profilePath: null };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const safeDeleteCommand = new Command('safe-delete')
|
|
33
|
+
.description('Enable or disable the safe-delete shell function (routes rm → trash)')
|
|
34
|
+
.option('--enable', 'Install safe-delete shell function')
|
|
35
|
+
.option('--disable', 'Remove safe-delete shell function')
|
|
36
|
+
.option('--status', 'Show current safe-delete state')
|
|
37
|
+
.action(async (options) => {
|
|
38
|
+
const hasFlag = options.enable || options.disable || options.status;
|
|
39
|
+
if (!hasFlag) {
|
|
40
|
+
// No flag → show usage (matches ambient/memory/hud/decisions pattern)
|
|
41
|
+
p.note(`${color.cyan('devflow safe-delete --enable')} Install safe-delete shell function\n` +
|
|
42
|
+
`${color.cyan('devflow safe-delete --disable')} Remove safe-delete shell function\n` +
|
|
43
|
+
`${color.cyan('devflow safe-delete --status')} Show current safe-delete state`, 'Usage');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (options.status) {
|
|
47
|
+
// --status → tri-state report
|
|
48
|
+
const { status, profilePath } = await getSafeDeleteStatus();
|
|
49
|
+
let statusLabel;
|
|
50
|
+
switch (status) {
|
|
51
|
+
case 'installed':
|
|
52
|
+
statusLabel = color.green('installed');
|
|
53
|
+
break;
|
|
54
|
+
case 'outdated':
|
|
55
|
+
statusLabel = color.yellow('outdated (upgrade available)');
|
|
56
|
+
break;
|
|
57
|
+
case 'absent':
|
|
58
|
+
statusLabel = color.dim('absent');
|
|
59
|
+
break;
|
|
60
|
+
case 'unknown':
|
|
61
|
+
statusLabel = color.dim('unknown');
|
|
62
|
+
break;
|
|
63
|
+
default: {
|
|
64
|
+
const _exhaustive = status;
|
|
65
|
+
statusLabel = color.dim(_exhaustive);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
p.log.info(`Safe-delete: ${statusLabel}`);
|
|
69
|
+
if (profilePath) {
|
|
70
|
+
p.log.info(`Profile: ${color.dim(profilePath)}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
p.log.info(`Profile: ${color.dim('unknown (unsupported platform or $SHELL not set)')}`);
|
|
74
|
+
}
|
|
75
|
+
if (status === 'outdated') {
|
|
76
|
+
p.log.info(color.dim('Run devflow safe-delete --enable to upgrade to the current version'));
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (options.enable) {
|
|
81
|
+
const platform = detectPlatform();
|
|
82
|
+
const shell = detectShell();
|
|
83
|
+
const profilePath = getProfilePath(shell);
|
|
84
|
+
if (shell === 'unknown' || profilePath === null) {
|
|
85
|
+
p.log.warn('Cannot determine shell profile path — $SHELL not set or platform not supported');
|
|
86
|
+
p.log.info(color.dim('Set $SHELL and retry, or add the safe-delete function manually'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Check trash CLI availability (Windows always has Recycle Bin)
|
|
90
|
+
if (platform !== 'windows' && !hasSafeDelete(platform)) {
|
|
91
|
+
const info = getSafeDeleteInfo(platform);
|
|
92
|
+
p.log.warn(`safe-delete requires a trash CLI — not found`);
|
|
93
|
+
p.log.info(color.dim(`Install with: ${info.installHint ?? 'see your package manager'}`));
|
|
94
|
+
p.log.info(color.dim('Then retry: devflow safe-delete --enable'));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const info = getSafeDeleteInfo(platform);
|
|
98
|
+
const block = generateSafeDeleteBlock(shell, process.platform, info.command);
|
|
99
|
+
if (!block) {
|
|
100
|
+
p.log.warn(`Shell '${shell}' is not supported for safe-delete`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Upgrade-in-place if an outdated block exists; idempotent if already current
|
|
104
|
+
const installedVersion = await getInstalledVersion(profilePath);
|
|
105
|
+
if (installedVersion === SAFE_DELETE_BLOCK_VERSION) {
|
|
106
|
+
p.log.info('Safe-delete already installed at the current version — no change');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (installedVersion > 0) {
|
|
110
|
+
// Outdated block — remove then reinstall (upgrade in place, no duplicate)
|
|
111
|
+
await removeFromProfile(profilePath);
|
|
112
|
+
await installToProfile(profilePath, block);
|
|
113
|
+
p.log.success(`Safe-delete upgraded to v${SAFE_DELETE_BLOCK_VERSION} in ${color.dim(profilePath)}`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Not installed — append
|
|
117
|
+
await installToProfile(profilePath, block);
|
|
118
|
+
p.log.success(`Safe-delete installed in ${color.dim(profilePath)}`);
|
|
119
|
+
}
|
|
120
|
+
p.log.info(color.dim('Restart your shell or run: source ' + profilePath));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (options.disable) {
|
|
124
|
+
const shell = detectShell();
|
|
125
|
+
const profilePath = getProfilePath(shell);
|
|
126
|
+
if (shell === 'unknown' || profilePath === null) {
|
|
127
|
+
p.log.warn('Cannot determine shell profile path — $SHELL not set or platform not supported');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const removed = await removeFromProfile(profilePath);
|
|
131
|
+
if (removed) {
|
|
132
|
+
p.log.success(`Safe-delete removed from ${color.dim(profilePath)}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
p.log.info('Safe-delete is not installed — nothing to remove');
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=safe-delete.js.map
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import color from 'picocolors';
|
|
5
|
+
import { getClaudeDirectory, getDevFlowDirectory, getManagedSettingsPath } from '../../targets/claude-code/claude-paths.js';
|
|
6
|
+
import { readManifest, syncManifestFeature } from '../../core/manifest.js';
|
|
7
|
+
import { mergeDenyList, stripUserDenyList, detectDenyState, DEVFLOW_HISTORICAL_DENY, removeManagedSettings, installManagedSettings, loadTemplateDenyEntries, stripUserSecurityDenyList, } from '../../targets/claude-code/post-install.js';
|
|
8
|
+
import { writeFileAtomicExclusive } from '../../core/fs-atomic.js';
|
|
9
|
+
import { promises as fs } from 'fs';
|
|
10
|
+
import { getPackageRoot } from '../../core/paths.js';
|
|
11
|
+
// ─── Pure helpers ─────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Count deny entries in a parsed settings JSON string.
|
|
14
|
+
* Returns 0 on parse error or when no deny array is present.
|
|
15
|
+
*/
|
|
16
|
+
export function countDenyEntries(settingsJson) {
|
|
17
|
+
try {
|
|
18
|
+
const obj = JSON.parse(settingsJson);
|
|
19
|
+
const rawDeny = obj.permissions?.deny;
|
|
20
|
+
return Array.isArray(rawDeny) ? rawDeny.length : 0;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// ─── Command ──────────────────────────────────────────────────────────────────
|
|
27
|
+
export const securityCommand = new Command('security')
|
|
28
|
+
.description('Manage the security deny list (permissions.deny in Claude Code settings)')
|
|
29
|
+
.option('--status', 'Show current deny list state and entry counts')
|
|
30
|
+
.option('--enable', 'Install the deny list (use --managed or --user to select location)')
|
|
31
|
+
.option('--managed', 'Target system-level managed settings (requires sudo on some platforms)')
|
|
32
|
+
.option('--user', 'Target ~/.claude/settings.json (default)')
|
|
33
|
+
.option('--disable', 'Remove the deny list from all locations')
|
|
34
|
+
.addHelpText('after', '\nExamples:\n $ devflow security --status\n $ devflow security --enable\n $ devflow security --enable --managed\n $ devflow security --disable')
|
|
35
|
+
.action(async (options) => {
|
|
36
|
+
const claudeDir = getClaudeDirectory();
|
|
37
|
+
const devflowDir = getDevFlowDirectory();
|
|
38
|
+
const userSettingsPath = path.join(claudeDir, 'settings.json');
|
|
39
|
+
const rootDir = getPackageRoot();
|
|
40
|
+
// ── Load current state ──────────────────────────────────────────────────
|
|
41
|
+
let userSettingsJson = null;
|
|
42
|
+
try {
|
|
43
|
+
userSettingsJson = await fs.readFile(userSettingsPath, 'utf-8');
|
|
44
|
+
}
|
|
45
|
+
catch { /* absent */ }
|
|
46
|
+
let managedPath = null;
|
|
47
|
+
let managedExists = false;
|
|
48
|
+
let managedContentJson = null;
|
|
49
|
+
try {
|
|
50
|
+
managedPath = getManagedSettingsPath();
|
|
51
|
+
managedContentJson = await fs.readFile(managedPath, 'utf-8');
|
|
52
|
+
managedExists = true;
|
|
53
|
+
}
|
|
54
|
+
catch { /* absent or unsupported platform */ }
|
|
55
|
+
const detected = detectDenyState(userSettingsJson, managedExists, managedContentJson);
|
|
56
|
+
// Default (no flag) → show Usage note (mirrors memory.ts:242-253 incumbent pattern)
|
|
57
|
+
if (!options.enable && !options.disable && !options.status) {
|
|
58
|
+
p.note(`${color.cyan('devflow security --status')} Show current deny list state\n` +
|
|
59
|
+
`${color.cyan('devflow security --enable')} Install deny list (user settings)\n` +
|
|
60
|
+
`${color.cyan('devflow security --enable --managed')} Install deny list (managed settings)\n` +
|
|
61
|
+
`${color.cyan('devflow security --disable')} Remove the deny list from all locations`, 'Usage');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// ── --status ────────────────────────────────────────────────────────────
|
|
65
|
+
if (options.status) {
|
|
66
|
+
const both = detected.user && detected.managed;
|
|
67
|
+
if (!detected.user && !detected.managed) {
|
|
68
|
+
p.log.info('Security deny list: ' + color.dim('none (not installed)'));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (detected.user) {
|
|
72
|
+
const count = userSettingsJson ? countDenyEntries(userSettingsJson) : 0;
|
|
73
|
+
p.log.info(`Security deny list: ${color.green('installed')} in user settings (${count} entries)`);
|
|
74
|
+
p.log.info(` Location: ${color.dim(userSettingsPath)}`);
|
|
75
|
+
}
|
|
76
|
+
if (detected.managed && managedPath) {
|
|
77
|
+
const count = managedContentJson ? countDenyEntries(managedContentJson) : 0;
|
|
78
|
+
p.log.info(`Security deny list: ${color.green('installed')} in managed settings (${count} entries)`);
|
|
79
|
+
p.log.info(` Location: ${color.dim(managedPath)}`);
|
|
80
|
+
}
|
|
81
|
+
if (both) {
|
|
82
|
+
p.log.warn('Deny list found in BOTH locations. Run --disable and --enable to consolidate.');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (detected.unknown) {
|
|
86
|
+
p.log.warn('User settings.json is present but unparseable — cannot determine entry count');
|
|
87
|
+
}
|
|
88
|
+
// Show manifest mode if available
|
|
89
|
+
const manifest = await readManifest(devflowDir);
|
|
90
|
+
if (manifest?.features.security) {
|
|
91
|
+
p.log.info(`Manifest mode: ${color.dim(manifest.features.security)}`);
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// ── --enable ────────────────────────────────────────────────────────────
|
|
96
|
+
if (options.enable) {
|
|
97
|
+
const useManaged = options.managed === true;
|
|
98
|
+
const targetMode = useManaged ? 'managed' : 'user';
|
|
99
|
+
const templateDeny = await loadTemplateDenyEntries(rootDir);
|
|
100
|
+
if (templateDeny.length === 0) {
|
|
101
|
+
p.log.error('Could not load deny list template — no entries to install');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (targetMode === 'managed') {
|
|
105
|
+
// Add to managed first, verify, then strip from user
|
|
106
|
+
const managed = await installManagedSettings(rootDir, true);
|
|
107
|
+
if (!managed) {
|
|
108
|
+
p.log.error('Managed settings write failed — re-run without --managed to use user settings');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
p.log.success('Security deny list written to managed settings');
|
|
112
|
+
// Strip from user settings (self-heal) — adopts canonical stripUserSecurityDenyList (SF9)
|
|
113
|
+
const stripResult = await stripUserSecurityDenyList(userSettingsPath);
|
|
114
|
+
if (stripResult && stripResult.removed.length > 0) {
|
|
115
|
+
p.log.info(`Removed ${stripResult.removed.length} entries from user settings (now in managed)`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// User mode: merge into ~/.claude/settings.json
|
|
120
|
+
let existing;
|
|
121
|
+
try {
|
|
122
|
+
existing = await fs.readFile(userSettingsPath, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
existing = '{}';
|
|
126
|
+
}
|
|
127
|
+
const merged = mergeDenyList(existing, templateDeny);
|
|
128
|
+
await writeFileAtomicExclusive(userSettingsPath, merged);
|
|
129
|
+
const count = countDenyEntries(merged);
|
|
130
|
+
p.log.success(`Security deny list applied to user settings (${count} entries)`);
|
|
131
|
+
p.log.info(` Location: ${color.dim(userSettingsPath)}`);
|
|
132
|
+
}
|
|
133
|
+
await syncManifestFeature(devflowDir, 'security', targetMode);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// ── --disable ───────────────────────────────────────────────────────────
|
|
137
|
+
if (options.disable) {
|
|
138
|
+
// User settings: must be parseable to strip — hard fail if not
|
|
139
|
+
if (userSettingsJson !== null) {
|
|
140
|
+
try {
|
|
141
|
+
JSON.parse(userSettingsJson);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
p.log.error('settings.json is unparseable — cannot safely remove the deny list. ' +
|
|
145
|
+
'Fix the JSON syntax manually and re-run.');
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
const { json: stripped, removed } = stripUserDenyList(userSettingsJson, DEVFLOW_HISTORICAL_DENY);
|
|
149
|
+
if (removed.length > 0) {
|
|
150
|
+
await writeFileAtomicExclusive(userSettingsPath, stripped);
|
|
151
|
+
p.log.success(`Removed ${removed.length} entries from user settings:`);
|
|
152
|
+
for (const entry of removed) {
|
|
153
|
+
p.log.info(` ${color.dim(entry)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
p.log.info('No Devflow deny entries found in user settings');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Managed settings: gate on detected.managed (parse-safe signal from detectDenyState),
|
|
161
|
+
// not raw managedExists — avoids raw JSON.parse crash inside removeManagedSettings
|
|
162
|
+
// when the managed file exists but is corrupt JSON. (SF5 — applies engineering.md
|
|
163
|
+
// "never throw in business logic"; avoids PF partial-failure: user settings already
|
|
164
|
+
// stripped but manifest sync would be skipped on uncaught throw.)
|
|
165
|
+
if (detected.managed) {
|
|
166
|
+
await removeManagedSettings(rootDir, true);
|
|
167
|
+
}
|
|
168
|
+
else if (managedExists && !detected.managed) {
|
|
169
|
+
// File exists but is unparseable or contains no Devflow entries — warn and skip.
|
|
170
|
+
p.log.warn('Managed settings file exists but contains no Devflow deny entries — skipping');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
p.log.info('No managed settings to remove');
|
|
174
|
+
}
|
|
175
|
+
await syncManifestFeature(devflowDir, 'security', 'none');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=security.js.map
|