🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

devflow-kit

Package Overview
Dependencies
Maintainers
1
Versions
32
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

devflow-kit - npm Package Compare versions

Comparing version
1.6.0
to
1.6.1
+14
-0
CHANGELOG.md

@@ -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

+6
-2

@@ -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 @@ ];

{
"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",

@@ -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