devflow-kit
Advanced tools
+14
-0
@@ -8,2 +8,15 @@ # Changelog | ||
| ## [1.6.1] - 2026-03-20 | ||
| ### Added | ||
| - **`--dry-run` flag** for `devflow uninstall` — preview removal plan without deleting anything | ||
| ### Fixed | ||
| - **Ambient skill loading** — removed `allowed-tools` restriction from ambient-router so skills actually load via the Skill tool | ||
| - **Ambient hook preamble** — explicit Skill tool instruction ensures models invoke skills rather than responding directly | ||
| - **Init wizard** — hide `devflow-ambient` from plugin multiselect (auto-included via ambient prompt) | ||
| - **Working memory** — replaced broken `--resume` with transcript-based background updater | ||
| --- | ||
| ## [1.6.0] - 2026-03-19 | ||
@@ -906,2 +919,3 @@ | ||
| [Unreleased]: https://github.com/dean0x/devflow/compare/v1.4.0...HEAD | ||
| [1.6.1]: https://github.com/dean0x/devflow/compare/v1.6.0...v1.6.1 | ||
| [1.6.0]: https://github.com/dean0x/devflow/compare/v1.5.0...v1.6.0 | ||
@@ -908,0 +922,0 @@ [1.5.0]: https://github.com/dean0x/devflow/compare/v1.4.0...v1.5.0 |
@@ -124,3 +124,3 @@ import { Command } from 'commander'; | ||
| const choices = DEVFLOW_PLUGINS | ||
| .filter(pl => pl.name !== 'devflow-core-skills') | ||
| .filter(pl => pl.name !== 'devflow-core-skills' && pl.name !== 'devflow-ambient') | ||
| .map(pl => ({ | ||
@@ -132,3 +132,3 @@ value: pl.name, | ||
| const preSelected = DEVFLOW_PLUGINS | ||
| .filter(pl => !pl.optional && pl.name !== 'devflow-core-skills') | ||
| .filter(pl => !pl.optional && pl.name !== 'devflow-core-skills' && pl.name !== 'devflow-ambient') | ||
| .map(pl => pl.name); | ||
@@ -289,2 +289,6 @@ const pluginSelection = await p.multiselect({ | ||
| } | ||
| const ambientPlugin = DEVFLOW_PLUGINS.find(p => p.name === 'devflow-ambient'); | ||
| if (ambientEnabled && ambientPlugin && !pluginsToInstall.includes(ambientPlugin)) { | ||
| pluginsToInstall.push(ambientPlugin); | ||
| } | ||
| const { skillsMap, agentsMap } = buildAssetMaps(pluginsToInstall); | ||
@@ -291,0 +295,0 @@ // Install: try native CLI first, fall back to file copy |
@@ -12,3 +12,12 @@ import { Command } from 'commander'; | ||
| }; | ||
| /** | ||
| * Format a dry-run plan showing what would be removed. | ||
| * Pure function — no I/O, fully testable. | ||
| */ | ||
| export declare function formatDryRunPlan(assets: { | ||
| skills: string[]; | ||
| agents: string[]; | ||
| commands: string[]; | ||
| }, extras?: string[]): string; | ||
| export declare const uninstallCommand: Command; | ||
| //# sourceMappingURL=uninstall.d.ts.map |
@@ -5,3 +5,3 @@ import { Command } from 'commander'; | ||
| import { fileURLToPath } from 'url'; | ||
| import { execSync } from 'child_process'; | ||
| import { execFileSync } from 'child_process'; | ||
| import * as p from '@clack/prompts'; | ||
@@ -51,2 +51,26 @@ import color from 'picocolors'; | ||
| /** | ||
| * Format a dry-run plan showing what would be removed. | ||
| * Pure function — no I/O, fully testable. | ||
| */ | ||
| export function formatDryRunPlan(assets, extras) { | ||
| const skills = [...new Set(assets.skills)]; | ||
| const agents = [...new Set(assets.agents)]; | ||
| const commands = [...new Set(assets.commands)]; | ||
| const hasAssets = skills.length > 0 || agents.length > 0 || commands.length > 0; | ||
| const hasExtras = extras && extras.length > 0; | ||
| if (!hasAssets && !hasExtras) { | ||
| return 'Nothing to remove.'; | ||
| } | ||
| const lines = []; | ||
| if (skills.length > 0) | ||
| lines.push(`Skills (${skills.length}): ${skills.join(', ')}`); | ||
| if (agents.length > 0) | ||
| lines.push(`Agents (${agents.length}): ${agents.join(', ')}`); | ||
| if (commands.length > 0) | ||
| lines.push(`Commands (${commands.length}): ${commands.join(', ')}`); | ||
| if (hasExtras) | ||
| lines.push(`Extras: ${extras.join(', ')}`); | ||
| return lines.join('\n'); | ||
| } | ||
| /** | ||
| * Uninstall plugin using Claude CLI | ||
@@ -57,3 +81,3 @@ */ | ||
| const cliScope = scope === 'local' ? 'project' : 'user'; | ||
| execSync(`claude plugin uninstall devflow --scope ${cliScope}`, { stdio: 'inherit' }); | ||
| execFileSync('claude', ['plugin', 'uninstall', 'devflow', '--scope', cliScope], { stdio: 'inherit' }); | ||
| return true; | ||
@@ -83,4 +107,6 @@ } | ||
| .option('--verbose', 'Show detailed uninstall output') | ||
| .option('--dry-run', 'Show what would be removed without actually removing anything') | ||
| .action(async (options) => { | ||
| p.intro(color.bgRed(color.white(' Uninstalling DevFlow '))); | ||
| const dryRun = options.dryRun ?? false; | ||
| p.intro(color.bgRed(color.white(dryRun ? ' DevFlow Uninstall (dry run) ' : ' Uninstalling DevFlow '))); | ||
| const verbose = options.verbose ?? false; | ||
@@ -128,3 +154,3 @@ // Parse plugin selection | ||
| } | ||
| if (scopesToUninstall.length > 1) { | ||
| if (scopesToUninstall.length > 1 && !dryRun) { | ||
| if (process.stdin.isTTY) { | ||
@@ -152,2 +178,32 @@ const scopeChoice = await p.select({ | ||
| } | ||
| // === DRY RUN: show plan and exit === | ||
| if (dryRun) { | ||
| p.log.info(`Scope(s): ${scopesToUninstall.join(', ')} (dry-run shows all detected scopes)`); | ||
| const assets = isSelectiveUninstall | ||
| ? computeAssetsToRemove(selectedPlugins, DEVFLOW_PLUGINS) | ||
| : computeAssetsToRemove(DEVFLOW_PLUGINS, DEVFLOW_PLUGINS); | ||
| // Detect extras that would be cleaned up (full uninstall only) | ||
| const extras = []; | ||
| if (!isSelectiveUninstall) { | ||
| const docsDir = path.join(process.cwd(), '.docs'); | ||
| const memoryDir = path.join(process.cwd(), '.memory'); | ||
| try { | ||
| await fs.access(docsDir); | ||
| extras.push('.docs/'); | ||
| } | ||
| catch { /* noop */ } | ||
| try { | ||
| await fs.access(memoryDir); | ||
| extras.push('.memory/'); | ||
| } | ||
| catch { /* noop */ } | ||
| extras.push('hooks in settings.json', 'scripts in ~/.devflow/'); | ||
| } | ||
| const plan = formatDryRunPlan(assets, extras.length > 0 ? extras : undefined); | ||
| for (const line of plan.split('\n')) { | ||
| p.log.info(line); | ||
| } | ||
| p.outro(color.dim('No changes made (dry run)')); | ||
| return; | ||
| } | ||
| const cliAvailable = isClaudeCliAvailable(); | ||
@@ -154,0 +210,0 @@ // Uninstall from each scope |
@@ -451,3 +451,2 @@ import { promises as fs, writeFileSync, unlinkSync } from 'fs'; | ||
| { src: path.join(docsDir, 'WORKING-MEMORY.md'), dest: path.join(memoryDir, 'WORKING-MEMORY.md') }, | ||
| { src: path.join(docsDir, 'patterns.md'), dest: path.join(memoryDir, 'PROJECT-PATTERNS.md') }, | ||
| { src: path.join(docsDir, 'working-memory-backup.json'), dest: path.join(memoryDir, 'backup.json') }, | ||
@@ -454,0 +453,0 @@ ]; |
+1
-1
| { | ||
| "name": "devflow-kit", | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "description": "Agentic Development Toolkit for Claude Code - Enhance AI-assisted development with intelligent commands and workflows", | ||
@@ -5,0 +5,0 @@ "type": "module", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -5,3 +5,3 @@ --- | ||
| user-invocable: false | ||
| allowed-tools: Read, Grep, Glob | ||
| # No allowed-tools: orchestrator requires unrestricted access (Skill, Agent, Edit, Write, Bash) | ||
| --- | ||
@@ -93,2 +93,5 @@ | ||
| For IMPLEMENT intent, enforce TDD: write the failing test before ANY production code. | ||
| NOTE: Skills loaded in the main session via ambient mode are reference patterns only — | ||
| their allowed-tools metadata does NOT restrict your tool access. You retain full access | ||
| to all tools (Edit, Write, Bash, Agent, etc.) for implementation work. | ||
| </IMPORTANT> | ||
@@ -95,0 +98,0 @@ |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -41,3 +41,2 @@ --- | ||
| ├── WORKING-MEMORY.md # Auto-maintained by Stop hook (overwritten) | ||
| ├── PROJECT-PATTERNS.md # Accumulated patterns (merged across sessions) | ||
| ├── backup.json # Pre-compact git state snapshot | ||
@@ -44,0 +43,0 @@ └── knowledge/ |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "1.6.0", | ||
| "version": "1.6.1", | ||
| "homepage": "https://github.com/dean0x/devflow", | ||
@@ -10,0 +10,0 @@ "repository": "https://github.com/dean0x/devflow", |
+3
-1
@@ -200,3 +200,2 @@ # DevFlow | ||
| ├── WORKING-MEMORY.md # Auto-maintained by Stop hook | ||
| ├── PROJECT-PATTERNS.md # Accumulated patterns across sessions | ||
| ├── backup.json # Pre-compact git state snapshot | ||
@@ -259,3 +258,6 @@ └── knowledge/ | ||
| | `--scope <user\|local>` | Uninstall scope (default: user) | | ||
| | `--plugin <names>` | Comma-separated plugin names to uninstall selectively | | ||
| | `--keep-docs` | Preserve .docs/ directory | | ||
| | `--dry-run` | Show what would be removed without deleting anything | | ||
| | `--verbose` | Show detailed uninstall output | | ||
@@ -262,0 +264,0 @@ ## Building from Source |
@@ -5,3 +5,3 @@ --- | ||
| user-invocable: false | ||
| allowed-tools: Read, Grep, Glob | ||
| # No allowed-tools: orchestrator requires unrestricted access (Skill, Agent, Edit, Write, Bash) | ||
| --- | ||
@@ -93,2 +93,5 @@ | ||
| For IMPLEMENT intent, enforce TDD: write the failing test before ANY production code. | ||
| NOTE: Skills loaded in the main session via ambient mode are reference patterns only — | ||
| their allowed-tools metadata does NOT restrict your tool access. You retain full access | ||
| to all tools (Edit, Write, Bash, Agent, etc.) for implementation work. | ||
| </IMPORTANT> | ||
@@ -95,0 +98,0 @@ |
@@ -41,3 +41,2 @@ --- | ||
| ├── WORKING-MEMORY.md # Auto-maintained by Stop hook (overwritten) | ||
| ├── PROJECT-PATTERNS.md # Accumulated patterns (merged across sessions) | ||
| ├── backup.json # Pre-compact git state snapshot | ||
@@ -44,0 +43,0 @@ └── knowledge/ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
2477102
0.12%4197
1.65%275
0.73%