devflow-kit 0.9.0 → 1.1.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 +197 -29
- package/LICENSE +1 -1
- package/README.md +185 -309
- package/dist/cli.js +7 -1
- package/dist/commands/ambient.d.ts +18 -0
- package/dist/commands/ambient.js +136 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.js +393 -571
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/memory.d.ts +22 -0
- package/dist/commands/memory.js +175 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +418 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +169 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +80 -0
- package/dist/utils/post-install.js +508 -0
- package/dist/utils/safe-delete-install.d.ts +29 -0
- package/dist/utils/safe-delete-install.js +191 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-ambient/README.md +49 -0
- package/plugins/devflow-ambient/commands/ambient.md +110 -0
- package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +89 -0
- package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +64 -0
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +28 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +138 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +139 -0
- package/plugins/devflow-core-skills/skills/test-driven-development/references/rationalization-prevention.md +111 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/ambient-prompt.sh +48 -0
- package/scripts/hooks/background-memory-update.sh +208 -0
- package/scripts/hooks/ensure-memory-gitignore.sh +17 -0
- package/scripts/hooks/pre-compact-memory.sh +87 -0
- package/scripts/hooks/session-start-memory.sh +126 -0
- package/scripts/hooks/stop-update-memory.sh +85 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/ambient-router/SKILL.md +89 -0
- package/shared/skills/ambient-router/references/skill-catalog.md +64 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +138 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-driven-development/SKILL.md +139 -0
- package/shared/skills/test-driven-development/references/rationalization-prevention.md +111 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +160 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/get-issue.md +0 -286
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -493
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/get-issue.md +0 -16
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -20
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -1,8 +1,63 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { promises as fs } from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import {
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import * as p from '@clack/prompts';
|
|
7
|
+
import color from 'picocolors';
|
|
8
|
+
import { getInstallationPaths, getClaudeDirectory, getManagedSettingsPath } from '../utils/paths.js';
|
|
5
9
|
import { getGitRoot } from '../utils/git.js';
|
|
10
|
+
import { isClaudeCliAvailable } from '../utils/cli.js';
|
|
11
|
+
import { DEVFLOW_PLUGINS, getAllSkillNames, LEGACY_SKILL_NAMES } from '../plugins.js';
|
|
12
|
+
import { removeAmbientHook } from './ambient.js';
|
|
13
|
+
import { removeMemoryHooks } from './memory.js';
|
|
14
|
+
import { detectShell, getProfilePath } from '../utils/safe-delete.js';
|
|
15
|
+
import { isAlreadyInstalled, removeFromProfile } from '../utils/safe-delete-install.js';
|
|
16
|
+
import { removeManagedSettings } from '../utils/post-install.js';
|
|
17
|
+
/**
|
|
18
|
+
* Compute which assets should be removed during selective plugin uninstall.
|
|
19
|
+
* Skills and agents shared by remaining plugins are retained.
|
|
20
|
+
*/
|
|
21
|
+
export function computeAssetsToRemove(selectedPlugins, allPlugins) {
|
|
22
|
+
const selectedNames = new Set(selectedPlugins.map(p => p.name));
|
|
23
|
+
const remainingPlugins = allPlugins.filter(p => !selectedNames.has(p.name));
|
|
24
|
+
const retainedSkills = new Set();
|
|
25
|
+
const retainedAgents = new Set();
|
|
26
|
+
for (const rp of remainingPlugins) {
|
|
27
|
+
for (const s of rp.skills)
|
|
28
|
+
retainedSkills.add(s);
|
|
29
|
+
for (const a of rp.agents)
|
|
30
|
+
retainedAgents.add(a);
|
|
31
|
+
}
|
|
32
|
+
const skills = [];
|
|
33
|
+
const agents = [];
|
|
34
|
+
const commands = [];
|
|
35
|
+
for (const plugin of selectedPlugins) {
|
|
36
|
+
for (const skill of plugin.skills) {
|
|
37
|
+
if (!retainedSkills.has(skill))
|
|
38
|
+
skills.push(skill);
|
|
39
|
+
}
|
|
40
|
+
for (const agent of plugin.agents) {
|
|
41
|
+
if (!retainedAgents.has(agent))
|
|
42
|
+
agents.push(agent);
|
|
43
|
+
}
|
|
44
|
+
commands.push(...plugin.commands);
|
|
45
|
+
}
|
|
46
|
+
return { skills, agents, commands };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Uninstall plugin using Claude CLI
|
|
50
|
+
*/
|
|
51
|
+
function uninstallPluginViaCli(scope) {
|
|
52
|
+
try {
|
|
53
|
+
const cliScope = scope === 'local' ? 'project' : 'user';
|
|
54
|
+
execSync(`claude plugin uninstall devflow --scope ${cliScope}`, { stdio: 'inherit' });
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
6
61
|
/**
|
|
7
62
|
* Check if DevFlow is installed at the given paths
|
|
8
63
|
*/
|
|
@@ -19,15 +74,36 @@ export const uninstallCommand = new Command('uninstall')
|
|
|
19
74
|
.description('Uninstall DevFlow from Claude Code')
|
|
20
75
|
.option('--keep-docs', 'Keep .docs/ directory and documentation')
|
|
21
76
|
.option('--scope <type>', 'Uninstall from specific scope only (default: auto-detect all)', /^(user|local)$/i)
|
|
77
|
+
.option('--plugin <names>', 'Uninstall specific plugin(s), comma-separated (e.g., implement,review)')
|
|
78
|
+
.option('--verbose', 'Show detailed uninstall output')
|
|
22
79
|
.action(async (options) => {
|
|
23
|
-
|
|
80
|
+
p.intro(color.bgRed(color.white(' Uninstalling DevFlow ')));
|
|
81
|
+
const verbose = options.verbose ?? false;
|
|
82
|
+
// Parse plugin selection
|
|
83
|
+
let selectedPluginNames = [];
|
|
84
|
+
if (options.plugin) {
|
|
85
|
+
selectedPluginNames = options.plugin.split(',').map((s) => {
|
|
86
|
+
const trimmed = s.trim();
|
|
87
|
+
return trimmed.startsWith('devflow-') ? trimmed : `devflow-${trimmed}`;
|
|
88
|
+
});
|
|
89
|
+
const validNames = DEVFLOW_PLUGINS.map(p => p.name);
|
|
90
|
+
const invalidPlugins = selectedPluginNames.filter(n => !validNames.includes(n));
|
|
91
|
+
if (invalidPlugins.length > 0) {
|
|
92
|
+
p.log.error(`Unknown plugin(s): ${invalidPlugins.join(', ')}`);
|
|
93
|
+
p.log.info(`Valid plugins: ${validNames.join(', ')}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const isSelectiveUninstall = selectedPluginNames.length > 0;
|
|
98
|
+
const selectedPlugins = isSelectiveUninstall
|
|
99
|
+
? DEVFLOW_PLUGINS.filter(p => selectedPluginNames.includes(p.name))
|
|
100
|
+
: [];
|
|
24
101
|
// Determine which scopes to uninstall
|
|
25
102
|
let scopesToUninstall = [];
|
|
26
103
|
if (options.scope) {
|
|
27
104
|
scopesToUninstall = [options.scope.toLowerCase()];
|
|
28
105
|
}
|
|
29
106
|
else {
|
|
30
|
-
// Auto-detect installed scopes
|
|
31
107
|
const userClaudeDir = getClaudeDirectory();
|
|
32
108
|
const gitRoot = await getGitRoot();
|
|
33
109
|
if (await isDevFlowInstalled(userClaudeDir)) {
|
|
@@ -40,21 +116,36 @@ export const uninstallCommand = new Command('uninstall')
|
|
|
40
116
|
}
|
|
41
117
|
}
|
|
42
118
|
if (scopesToUninstall.length === 0) {
|
|
43
|
-
|
|
44
|
-
|
|
119
|
+
p.log.error('No DevFlow installation found');
|
|
120
|
+
p.log.info('Checked user scope (~/.claude/) and local scope (git-root/.claude/)');
|
|
45
121
|
process.exit(1);
|
|
46
122
|
}
|
|
47
123
|
if (scopesToUninstall.length > 1) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
124
|
+
if (process.stdin.isTTY) {
|
|
125
|
+
const scopeChoice = await p.select({
|
|
126
|
+
message: 'Found DevFlow in multiple scopes. Uninstall from:',
|
|
127
|
+
options: [
|
|
128
|
+
{ value: 'both', label: 'Both', hint: 'user + local' },
|
|
129
|
+
{ value: 'user', label: 'User scope', hint: '~/.claude/' },
|
|
130
|
+
{ value: 'local', label: 'Local scope', hint: 'git-root/.claude/' },
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
if (p.isCancel(scopeChoice)) {
|
|
134
|
+
p.cancel('Uninstall cancelled.');
|
|
135
|
+
process.exit(0);
|
|
136
|
+
}
|
|
137
|
+
if (scopeChoice !== 'both') {
|
|
138
|
+
scopesToUninstall = [scopeChoice];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
p.log.info('Multiple scopes detected, uninstalling from both...');
|
|
143
|
+
}
|
|
52
144
|
}
|
|
53
145
|
}
|
|
54
|
-
|
|
146
|
+
const cliAvailable = isClaudeCliAvailable();
|
|
55
147
|
// Uninstall from each scope
|
|
56
148
|
for (const scope of scopesToUninstall) {
|
|
57
|
-
// Get installation paths for this scope
|
|
58
149
|
let claudeDir;
|
|
59
150
|
let devflowScriptsDir;
|
|
60
151
|
try {
|
|
@@ -62,98 +153,347 @@ export const uninstallCommand = new Command('uninstall')
|
|
|
62
153
|
claudeDir = paths.claudeDir;
|
|
63
154
|
devflowScriptsDir = paths.devflowDir;
|
|
64
155
|
if (scope === 'user') {
|
|
65
|
-
|
|
156
|
+
p.log.step('Uninstalling user scope (~/.claude/)');
|
|
66
157
|
}
|
|
67
158
|
else {
|
|
68
|
-
|
|
159
|
+
p.log.step('Uninstalling local scope (git-root/.claude/)');
|
|
69
160
|
}
|
|
70
161
|
}
|
|
71
162
|
catch (error) {
|
|
72
|
-
|
|
163
|
+
p.log.warn(`Cannot uninstall ${scope} scope: ${error instanceof Error ? error.message : error}`);
|
|
73
164
|
continue;
|
|
74
165
|
}
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
await fs.rm(dir.path, { recursive: true, force: true });
|
|
85
|
-
console.log(` ✅ Removed DevFlow ${dir.name}`);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
console.error(` ⚠️ Could not remove ${dir.name}:`, error);
|
|
89
|
-
hasErrors = true;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Remove individual DevFlow skills (flat structure)
|
|
93
|
-
const skillsDir = path.join(claudeDir, 'skills');
|
|
94
|
-
const devflowSkills = [
|
|
95
|
-
'pattern-check',
|
|
96
|
-
'test-design',
|
|
97
|
-
'code-smell',
|
|
98
|
-
'research',
|
|
99
|
-
'debug',
|
|
100
|
-
'input-validation',
|
|
101
|
-
'error-handling'
|
|
102
|
-
];
|
|
103
|
-
let skillsRemoved = 0;
|
|
104
|
-
for (const skillName of devflowSkills) {
|
|
105
|
-
try {
|
|
106
|
-
const skillPath = path.join(skillsDir, skillName);
|
|
107
|
-
await fs.rm(skillPath, { recursive: true, force: true });
|
|
108
|
-
skillsRemoved++;
|
|
166
|
+
// Try to uninstall plugin via Claude CLI first (only for full uninstall)
|
|
167
|
+
let usedCli = false;
|
|
168
|
+
if (cliAvailable && !isSelectiveUninstall) {
|
|
169
|
+
if (verbose) {
|
|
170
|
+
p.log.info('Uninstalling plugin via Claude CLI...');
|
|
171
|
+
}
|
|
172
|
+
usedCli = uninstallPluginViaCli(scope);
|
|
173
|
+
if (!usedCli && verbose) {
|
|
174
|
+
p.log.warn('Claude CLI uninstall failed, falling back to manual removal');
|
|
109
175
|
}
|
|
110
|
-
|
|
111
|
-
|
|
176
|
+
}
|
|
177
|
+
// If CLI uninstall failed or unavailable, do manual removal
|
|
178
|
+
if (!usedCli) {
|
|
179
|
+
if (isSelectiveUninstall) {
|
|
180
|
+
await removeSelectedPlugins(claudeDir, selectedPlugins, verbose);
|
|
181
|
+
// Clean up ambient hook if ambient plugin is being removed
|
|
182
|
+
if (selectedPlugins.some(sp => sp.name === 'devflow-ambient')) {
|
|
183
|
+
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
184
|
+
try {
|
|
185
|
+
const settings = await fs.readFile(settingsPath, 'utf-8');
|
|
186
|
+
const updated = removeAmbientHook(settings);
|
|
187
|
+
if (updated !== settings) {
|
|
188
|
+
await fs.writeFile(settingsPath, updated, 'utf-8');
|
|
189
|
+
if (verbose) {
|
|
190
|
+
p.log.success('Ambient mode hook removed from settings.json');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch { /* settings.json may not exist */ }
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
await removeAllDevFlow(claudeDir, devflowScriptsDir, verbose);
|
|
112
199
|
}
|
|
113
200
|
}
|
|
114
|
-
|
|
115
|
-
|
|
201
|
+
const pluginLabel = isSelectiveUninstall
|
|
202
|
+
? ` (${selectedPluginNames.join(', ')})`
|
|
203
|
+
: '';
|
|
204
|
+
p.log.success(`Plugin removed${usedCli ? ' (via Claude CLI)' : ''}${pluginLabel}`);
|
|
205
|
+
}
|
|
206
|
+
// === CLEANUP EXTRAS (only for full uninstall) ===
|
|
207
|
+
if (!isSelectiveUninstall) {
|
|
208
|
+
const gitRoot = await getGitRoot();
|
|
209
|
+
// 1. .docs/ directory
|
|
210
|
+
const docsDir = path.join(process.cwd(), '.docs');
|
|
211
|
+
let docsExist = false;
|
|
212
|
+
try {
|
|
213
|
+
await fs.access(docsDir);
|
|
214
|
+
docsExist = true;
|
|
116
215
|
}
|
|
117
|
-
|
|
216
|
+
catch { /* .docs doesn't exist */ }
|
|
217
|
+
if (docsExist) {
|
|
218
|
+
let shouldRemoveDocs = false;
|
|
219
|
+
if (options.keepDocs) {
|
|
220
|
+
shouldRemoveDocs = false;
|
|
221
|
+
}
|
|
222
|
+
else if (process.stdin.isTTY) {
|
|
223
|
+
const removeDocs = await p.confirm({
|
|
224
|
+
message: '.docs/ directory found. Remove project documentation?',
|
|
225
|
+
initialValue: false,
|
|
226
|
+
});
|
|
227
|
+
if (p.isCancel(removeDocs)) {
|
|
228
|
+
p.cancel('Uninstall cancelled.');
|
|
229
|
+
process.exit(0);
|
|
230
|
+
}
|
|
231
|
+
shouldRemoveDocs = removeDocs;
|
|
232
|
+
}
|
|
233
|
+
if (shouldRemoveDocs) {
|
|
234
|
+
await fs.rm(docsDir, { recursive: true, force: true });
|
|
235
|
+
p.log.success('.docs/ removed');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
p.log.info('.docs/ preserved');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// 2. .memory/ directory
|
|
242
|
+
const memoryDir = path.join(process.cwd(), '.memory');
|
|
243
|
+
let memoryExist = false;
|
|
244
|
+
try {
|
|
245
|
+
await fs.access(memoryDir);
|
|
246
|
+
memoryExist = true;
|
|
247
|
+
}
|
|
248
|
+
catch { /* .memory doesn't exist */ }
|
|
249
|
+
if (memoryExist) {
|
|
250
|
+
let shouldRemoveMemory = false;
|
|
251
|
+
if (options.keepDocs) {
|
|
252
|
+
shouldRemoveMemory = false;
|
|
253
|
+
}
|
|
254
|
+
else if (process.stdin.isTTY) {
|
|
255
|
+
const removeMemory = await p.confirm({
|
|
256
|
+
message: '.memory/ directory found. Remove working memory files?',
|
|
257
|
+
initialValue: false,
|
|
258
|
+
});
|
|
259
|
+
if (p.isCancel(removeMemory)) {
|
|
260
|
+
p.cancel('Uninstall cancelled.');
|
|
261
|
+
process.exit(0);
|
|
262
|
+
}
|
|
263
|
+
shouldRemoveMemory = removeMemory;
|
|
264
|
+
}
|
|
265
|
+
if (shouldRemoveMemory) {
|
|
266
|
+
await fs.rm(memoryDir, { recursive: true, force: true });
|
|
267
|
+
p.log.success('.memory/ removed');
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
p.log.info('.memory/ preserved');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 4. .claudeignore
|
|
274
|
+
const claudeignorePath = gitRoot
|
|
275
|
+
? path.join(gitRoot, '.claudeignore')
|
|
276
|
+
: path.join(process.cwd(), '.claudeignore');
|
|
277
|
+
let claudeignoreExists = false;
|
|
118
278
|
try {
|
|
119
|
-
await fs.
|
|
279
|
+
await fs.access(claudeignorePath);
|
|
280
|
+
claudeignoreExists = true;
|
|
281
|
+
}
|
|
282
|
+
catch { /* doesn't exist */ }
|
|
283
|
+
if (claudeignoreExists) {
|
|
284
|
+
if (process.stdin.isTTY) {
|
|
285
|
+
const removeClaudeignore = await p.confirm({
|
|
286
|
+
message: '.claudeignore found. Remove it? (may contain custom rules)',
|
|
287
|
+
initialValue: false,
|
|
288
|
+
});
|
|
289
|
+
if (!p.isCancel(removeClaudeignore) && removeClaudeignore) {
|
|
290
|
+
await fs.rm(claudeignorePath, { force: true });
|
|
291
|
+
p.log.success('.claudeignore removed');
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
p.log.info('.claudeignore preserved');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
p.log.info('.claudeignore preserved (non-interactive mode)');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// 5. settings.json (DevFlow hooks)
|
|
302
|
+
for (const scope of scopesToUninstall) {
|
|
303
|
+
try {
|
|
304
|
+
const paths = await getInstallationPaths(scope);
|
|
305
|
+
const settingsPath = path.join(paths.claudeDir, 'settings.json');
|
|
306
|
+
let settingsContent = await fs.readFile(settingsPath, 'utf-8');
|
|
307
|
+
// Always remove ambient hook on full uninstall (idempotent)
|
|
308
|
+
const withoutAmbient = removeAmbientHook(settingsContent);
|
|
309
|
+
if (withoutAmbient !== settingsContent) {
|
|
310
|
+
await fs.writeFile(settingsPath, withoutAmbient, 'utf-8');
|
|
311
|
+
settingsContent = withoutAmbient;
|
|
312
|
+
if (verbose) {
|
|
313
|
+
p.log.success(`Ambient mode hook removed from settings.json (${scope})`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Always remove memory hooks on full uninstall (idempotent)
|
|
317
|
+
const withoutMemory = removeMemoryHooks(settingsContent);
|
|
318
|
+
if (withoutMemory !== settingsContent) {
|
|
319
|
+
await fs.writeFile(settingsPath, withoutMemory, 'utf-8');
|
|
320
|
+
settingsContent = withoutMemory;
|
|
321
|
+
if (verbose) {
|
|
322
|
+
p.log.success(`Memory hooks removed from settings.json (${scope})`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const settings = JSON.parse(settingsContent);
|
|
326
|
+
if (settings.hooks) {
|
|
327
|
+
if (process.stdin.isTTY) {
|
|
328
|
+
const removeHooks = await p.confirm({
|
|
329
|
+
message: `Remove DevFlow hooks from settings.json (${scope} scope)? Other settings preserved.`,
|
|
330
|
+
initialValue: false,
|
|
331
|
+
});
|
|
332
|
+
if (!p.isCancel(removeHooks) && removeHooks) {
|
|
333
|
+
delete settings.hooks;
|
|
334
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
335
|
+
p.log.success(`DevFlow hooks removed from settings.json (${scope})`);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
p.log.info(`settings.json hooks preserved (${scope})`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
p.log.info(`settings.json hooks preserved (${scope}, non-interactive mode)`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// settings.json doesn't exist or can't be parsed — skip
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// 6. Managed settings (security deny list)
|
|
351
|
+
let managedSettingsExist = false;
|
|
352
|
+
try {
|
|
353
|
+
const managedPath = getManagedSettingsPath();
|
|
354
|
+
await fs.access(managedPath);
|
|
355
|
+
managedSettingsExist = true;
|
|
120
356
|
}
|
|
121
357
|
catch {
|
|
122
|
-
//
|
|
358
|
+
// Managed settings don't exist or platform unsupported
|
|
359
|
+
}
|
|
360
|
+
if (managedSettingsExist) {
|
|
361
|
+
if (process.stdin.isTTY) {
|
|
362
|
+
const removeManagedConfirm = await p.confirm({
|
|
363
|
+
message: 'Remove DevFlow security deny list from managed settings?',
|
|
364
|
+
initialValue: false,
|
|
365
|
+
});
|
|
366
|
+
if (!p.isCancel(removeManagedConfirm) && removeManagedConfirm) {
|
|
367
|
+
// Resolve rootDir for the template path — use the dist directory
|
|
368
|
+
const uninstallRootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
|
|
369
|
+
await removeManagedSettings(uninstallRootDir, verbose);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
p.log.info('Managed settings preserved');
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
p.log.info('Managed settings preserved (non-interactive mode)');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// 7. Safe-delete shell function
|
|
380
|
+
const shell = detectShell();
|
|
381
|
+
const profilePath = getProfilePath(shell);
|
|
382
|
+
if (profilePath && await isAlreadyInstalled(profilePath)) {
|
|
383
|
+
if (process.stdin.isTTY) {
|
|
384
|
+
const removeSafeDelete = await p.confirm({
|
|
385
|
+
message: `Remove safe-delete function from ${profilePath}?`,
|
|
386
|
+
initialValue: false,
|
|
387
|
+
});
|
|
388
|
+
if (!p.isCancel(removeSafeDelete) && removeSafeDelete) {
|
|
389
|
+
const removed = await removeFromProfile(profilePath);
|
|
390
|
+
if (removed) {
|
|
391
|
+
p.log.success(`Safe-delete removed from ${profilePath}`);
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
p.log.warn(`Could not remove safe-delete from ${profilePath}`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
p.log.info('Safe-delete preserved in shell profile');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
p.log.info(`Safe-delete function preserved in ${profilePath} (non-interactive mode)`);
|
|
403
|
+
}
|
|
123
404
|
}
|
|
124
|
-
console.log();
|
|
125
405
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
406
|
+
const status = color.green('DevFlow uninstalled successfully');
|
|
407
|
+
p.outro(`${status}${color.dim(' Reinstall: npx devflow-kit init')}`);
|
|
408
|
+
});
|
|
409
|
+
/**
|
|
410
|
+
* Remove all DevFlow assets (full uninstall).
|
|
411
|
+
*/
|
|
412
|
+
async function removeAllDevFlow(claudeDir, devflowScriptsDir, verbose) {
|
|
413
|
+
const devflowDirectories = [
|
|
414
|
+
{ path: path.join(claudeDir, 'commands', 'devflow'), name: 'commands' },
|
|
415
|
+
{ path: path.join(claudeDir, 'agents', 'devflow'), name: 'agents' },
|
|
416
|
+
{ path: devflowScriptsDir, name: 'scripts' }
|
|
417
|
+
];
|
|
418
|
+
for (const dir of devflowDirectories) {
|
|
129
419
|
try {
|
|
130
|
-
await fs.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
420
|
+
await fs.rm(dir.path, { recursive: true, force: true });
|
|
421
|
+
if (verbose) {
|
|
422
|
+
p.log.success(`Removed DevFlow ${dir.name}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
p.log.warn(`Could not remove ${dir.name}: ${error}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Remove all DevFlow skills (current + legacy)
|
|
430
|
+
const allSkillNames = [...getAllSkillNames(), ...LEGACY_SKILL_NAMES];
|
|
431
|
+
const skillsDir = path.join(claudeDir, 'skills');
|
|
432
|
+
let skillsRemoved = 0;
|
|
433
|
+
for (const skillName of allSkillNames) {
|
|
434
|
+
try {
|
|
435
|
+
const skillPath = path.join(skillsDir, skillName);
|
|
436
|
+
await fs.rm(skillPath, { recursive: true, force: true });
|
|
437
|
+
skillsRemoved++;
|
|
134
438
|
}
|
|
135
439
|
catch {
|
|
136
|
-
//
|
|
440
|
+
// Skill might not exist
|
|
137
441
|
}
|
|
138
442
|
}
|
|
139
|
-
|
|
140
|
-
|
|
443
|
+
if (skillsRemoved > 0 && verbose) {
|
|
444
|
+
p.log.success(`Removed ${skillsRemoved} DevFlow skills`);
|
|
445
|
+
}
|
|
446
|
+
// Also remove old nested skills structure if it exists
|
|
141
447
|
try {
|
|
142
|
-
await fs.
|
|
143
|
-
console.log('\nℹ️ Found .claudeignore file');
|
|
144
|
-
console.log(' Keeping it as it may contain custom rules.');
|
|
145
|
-
console.log(' Remove manually if it was only for DevFlow.');
|
|
448
|
+
await fs.rm(path.join(claudeDir, 'skills', 'devflow'), { recursive: true, force: true });
|
|
146
449
|
}
|
|
147
450
|
catch {
|
|
148
|
-
//
|
|
451
|
+
// Old structure doesn't exist
|
|
149
452
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Remove only specific plugin assets (selective uninstall).
|
|
456
|
+
* For commands and agents: remove files belonging to selected plugins.
|
|
457
|
+
* For skills: only remove skills that are NOT used by any remaining plugin.
|
|
458
|
+
*/
|
|
459
|
+
async function removeSelectedPlugins(claudeDir, plugins, verbose) {
|
|
460
|
+
const { skills, agents, commands } = computeAssetsToRemove(plugins, DEVFLOW_PLUGINS);
|
|
461
|
+
const commandsDir = path.join(claudeDir, 'commands', 'devflow');
|
|
462
|
+
for (const cmd of commands) {
|
|
463
|
+
const cmdFileName = cmd.replace(/^\//, '') + '.md';
|
|
464
|
+
try {
|
|
465
|
+
await fs.rm(path.join(commandsDir, cmdFileName), { force: true });
|
|
466
|
+
if (verbose) {
|
|
467
|
+
p.log.success(`Removed command ${cmd}`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
// Command file might not exist
|
|
472
|
+
}
|
|
153
473
|
}
|
|
154
|
-
|
|
155
|
-
|
|
474
|
+
const agentsDir = path.join(claudeDir, 'agents', 'devflow');
|
|
475
|
+
for (const agent of agents) {
|
|
476
|
+
try {
|
|
477
|
+
await fs.rm(path.join(agentsDir, `${agent}.md`), { force: true });
|
|
478
|
+
if (verbose) {
|
|
479
|
+
p.log.success(`Removed agent ${agent}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
catch {
|
|
483
|
+
// Agent file might not exist
|
|
484
|
+
}
|
|
156
485
|
}
|
|
157
|
-
|
|
158
|
-
|
|
486
|
+
const skillsDir = path.join(claudeDir, 'skills');
|
|
487
|
+
for (const skill of skills) {
|
|
488
|
+
try {
|
|
489
|
+
await fs.rm(path.join(skillsDir, skill), { recursive: true, force: true });
|
|
490
|
+
if (verbose) {
|
|
491
|
+
p.log.success(`Removed skill ${skill}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch {
|
|
495
|
+
// Skill might not exist
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
159
499
|
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared plugin registry — single source of truth for all CLI commands.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Plugin definition with metadata
|
|
6
|
+
*/
|
|
7
|
+
export interface PluginDefinition {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
commands: string[];
|
|
11
|
+
agents: string[];
|
|
12
|
+
skills: string[];
|
|
13
|
+
/** Optional plugins are not installed by default — require explicit --plugin flag */
|
|
14
|
+
optional?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Available DevFlow plugins
|
|
18
|
+
*/
|
|
19
|
+
export declare const DEVFLOW_PLUGINS: PluginDefinition[];
|
|
20
|
+
/**
|
|
21
|
+
* Deprecated command names from old installations.
|
|
22
|
+
* Used during init to clean up stale command files on upgrade.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LEGACY_COMMAND_NAMES: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Deprecated skill names from old installations (prefixed with devflow-).
|
|
27
|
+
* Used during uninstall to clean up legacy installs.
|
|
28
|
+
*/
|
|
29
|
+
export declare const LEGACY_SKILL_NAMES: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Derive unique skill names from all plugins.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAllSkillNames(): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Derive unique agent names from all plugins.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getAllAgentNames(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Build maps of unique assets to their source plugin (first plugin that declares them).
|
|
40
|
+
* This ensures each skill/agent is copied only once during installation.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildAssetMaps(plugins: PluginDefinition[]): {
|
|
43
|
+
skillsMap: Map<string, string>;
|
|
44
|
+
agentsMap: Map<string, string>;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=plugins.d.ts.map
|