eat: enhance flattener tool with improved CLI integration and custom directory support (#372)

* feat(cli): move flatten command to installer and update docs

Refactor the flatten command from tools/cli.js to tools/installer/bin/bmad.js for better integration. Add support for custom input directory and improve error handling. Update documentation in README.md and working-in-the-brownfield.md to reflect new command usage. Also clean up package-lock.json and add it to .gitignore.

* chore: update gitignore and add package-lock.json for installer tool

Remove package-lock.json from root gitignore since it's now needed for the installer tool
Add package-lock.json with dependencies for the bmad-method installer

---------

Co-authored-by: Devin Stagner <devin@blackstag.family>
This commit is contained in:
manjaroblack
2025-07-27 18:02:08 -05:00
committed by GitHub
parent a2ddf926e5
commit a80ea150f2
9 changed files with 1171 additions and 1564 deletions

View File

@@ -126,11 +126,18 @@ The BMad-Method includes a powerful codebase flattener tool designed to prepare
```bash
# Basic usage - creates flattened-codebase.xml in current directory
npm run flatten
npx bmad-method flatten
# Specify custom input directory
npx bmad-method flatten --input /path/to/source/directory
npx bmad-method flatten -i /path/to/source/directory
# Specify custom output file
npm run flatten -- --output my-project.xml
npm run flatten -- -o /path/to/output/codebase.xml
npx bmad-method flatten --output my-project.xml
npx bmad-method flatten -o /path/to/output/codebase.xml
# Combine input and output options
npx bmad-method flatten --input /path/to/source --output /path/to/output/codebase.xml
```
### Example Output

View File

@@ -5,7 +5,7 @@
> Gemini Web's 1M+ token context window or Gemini CLI (when it's working) can analyze your ENTIRE codebase, or critical sections of it, all at once (obviously within reason):
>
> - Upload via GitHub URL or use gemini cli in the project folder
> - If working in the web: use the flattener-tool to flatten your project into a single file, then upload that file to your web agent.
> - If working in the web: use `npx bmad-method flatten` to flatten your project into a single file, then upload that file to your web agent.
## What is Brownfield Development?
@@ -27,7 +27,7 @@ If you have just completed an MVP with BMad, and you want to continue with post-
## The Complete Brownfield Workflow
1. **Follow the [<ins>User Guide - Installation</ins>](user-guide.md#installation) steps to setup your agent in the web.**
2. **Generate a 'flattened' single file of your entire codebase** run: ```npm run flatten```
2. **Generate a 'flattened' single file of your entire codebase** run: ```npx bmad-method flatten```
### Choose Your Approach

2448
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,28 +14,26 @@ const isNpxExecution = __dirname.includes('_npx') || __dirname.includes('.npm');
// If running via npx, we need to handle things differently
if (isNpxExecution) {
// The actual bmad.js is in installer/bin/ (relative to tools directory)
const args = process.argv.slice(2);
// Use the installer for all commands
const bmadScriptPath = path.join(__dirname, 'installer', 'bin', 'bmad.js');
// Verify the file exists
if (!fs.existsSync(bmadScriptPath)) {
console.error('Error: Could not find bmad.js at', bmadScriptPath);
console.error('Current directory:', __dirname);
process.exit(1);
}
// Execute with proper working directory
try {
execSync(`node "${bmadScriptPath}" ${process.argv.slice(2).join(' ')}`, {
execSync(`node "${bmadScriptPath}" ${args.join(' ')}`, {
stdio: 'inherit',
cwd: path.dirname(__dirname)
});
} catch (error) {
// execSync will throw if the command exits with non-zero
// But the stdio is inherited, so the error is already displayed
process.exit(error.status || 1);
}
} else {
// Local execution - just require the installer directly
// Local execution - use installer for all commands
require('./installer/bin/bmad.js');
}

View File

@@ -149,13 +149,4 @@ program
});
});
program
.command('flatten')
.description('Flatten codebase to XML format')
.option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
.action(async (options) => {
const flattener = require('./flattener/main');
await flattener.parseAsync(['flatten', '--output', options.output], { from: 'user' });
});
program.parse();

View File

@@ -496,24 +496,35 @@ program
.name('bmad-flatten')
.description('BMad-Method codebase flattener tool')
.version('1.0.0')
.option('-i, --input <path>', 'Input directory to flatten', process.cwd())
.option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
.action(async (options) => {
console.log(`Flattening codebase to: ${options.output}`);
const inputDir = path.resolve(options.input);
const outputPath = path.resolve(options.output);
console.log(`Flattening codebase from: ${inputDir}`);
console.log(`Output file: ${outputPath}`);
try {
// Verify input directory exists
if (!await fs.pathExists(inputDir)) {
console.error(`❌ Error: Input directory does not exist: ${inputDir}`);
process.exit(1);
}
// Import ora dynamically
const { default: ora } = await import('ora');
// Start file discovery with spinner
const discoverySpinner = ora('🔍 Discovering files...').start();
const files = await discoverFiles(process.cwd());
const filteredFiles = await filterFiles(files, process.cwd());
const files = await discoverFiles(inputDir);
const filteredFiles = await filterFiles(files, inputDir);
discoverySpinner.succeed(`📁 Found ${filteredFiles.length} files to include`);
// Process files with progress tracking
console.log('Reading file contents');
const processingSpinner = ora('📄 Processing files...').start();
const aggregatedContent = await aggregateFileContents(filteredFiles, process.cwd(), processingSpinner);
const aggregatedContent = await aggregateFileContents(filteredFiles, inputDir, processingSpinner);
processingSpinner.succeed(`✅ Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`);
// Log processing results for test validation
@@ -528,17 +539,17 @@ program
// Generate XML output using streaming
const xmlSpinner = ora('🔧 Generating XML output...').start();
await generateXMLOutput(aggregatedContent, options.output);
await generateXMLOutput(aggregatedContent, outputPath);
xmlSpinner.succeed('📝 XML generation completed');
// Calculate and display statistics
const outputStats = await fs.stat(options.output);
const outputStats = await fs.stat(outputPath);
const stats = calculateStatistics(aggregatedContent, outputStats.size);
// Display completion summary
console.log('\n📊 Completion Summary:');
console.log(`✅ Successfully processed ${filteredFiles.length} files into ${options.output}`);
console.log(`📁 Output file: ${path.resolve(options.output)}`);
console.log(`✅ Successfully processed ${filteredFiles.length} files into ${path.basename(outputPath)}`);
console.log(`📁 Output file: ${outputPath}`);
console.log(`📏 Total source size: ${stats.totalSize}`);
console.log(`📄 Generated XML size: ${stats.xmlSize}`);
console.log(`📝 Total lines of code: ${stats.totalLines.toLocaleString()}`);

View File

@@ -110,6 +110,20 @@ program
}
});
program
.command('flatten')
.description('Flatten codebase to XML format')
.option('-i, --input <path>', 'Input directory to flatten', process.cwd())
.option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
.action(async (options) => {
try {
await installer.flatten(options);
} catch (error) {
console.error(chalk.red('Flatten failed:'), error.message);
process.exit(1);
}
});
async function promptInstallation() {
// Display ASCII logo

View File

@@ -497,7 +497,7 @@ class Installer {
case "reinstall":
// For reinstall, don't check for modifications - just overwrite
return await this.performReinstall(config, installDir, spinner);
case "expansions":
case "expansions": {
// Ask which expansion packs to install
const availableExpansionPacks = await resourceLocator.getExpansionPacks();
@@ -534,6 +534,7 @@ class Installer {
console.log(chalk.green(` - ${packId} → .${packId}/`));
}
return;
}
case "cancel":
console.log("Installation cancelled.");
return;
@@ -865,6 +866,8 @@ class Installer {
}).join(", ");
console.log(chalk.green(`✓ IDE rules and configurations set up for: ${ideNames}`));
}
// Information about web bundles
if (!config.includeWebBundles) {
@@ -1428,7 +1431,7 @@ class Installer {
return config.selectedWebBundleTeams ?
`teams: ${config.selectedWebBundleTeams.join(', ')}` :
'selected teams';
case 'custom':
case 'custom': {
const parts = [];
if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
@@ -1437,6 +1440,7 @@ class Installer {
parts.push('individual agents');
}
return parts.length > 0 ? parts.join(' + ') : 'custom selection';
}
default:
return 'selected bundles';
}
@@ -1741,6 +1745,28 @@ class Installer {
return null;
}
async flatten(options) {
const { spawn } = require('child_process');
const flattenerPath = path.join(__dirname, '..', '..', 'flattener', 'main.js');
const args = [];
if (options.input) {
args.push('--input', options.input);
}
if (options.output) {
args.push('--output', options.output);
}
const child = spawn('node', [flattenerPath, ...args], {
stdio: 'inherit',
cwd: process.cwd()
});
child.on('exit', (code) => {
process.exit(code);
});
}
}
module.exports = new Installer();

View File

@@ -1,12 +1,12 @@
{
"name": "bmad-method",
"version": "4.3.0",
"version": "4.32.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "bmad-method",
"version": "4.3.0",
"version": "4.32.0",
"license": "MIT",
"dependencies": {
"chalk": "^5.4.1",
@@ -25,14 +25,14 @@
}
},
"node_modules/@inquirer/checkbox": {
"version": "4.1.8",
"resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz",
"integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz",
"integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/figures": "^1.0.12",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
@@ -49,13 +49,13 @@
}
},
"node_modules/@inquirer/confirm": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.12.tgz",
"integrity": "sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==",
"version": "5.1.14",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz",
"integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7"
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
@@ -70,13 +70,13 @@
}
},
"node_modules/@inquirer/core": {
"version": "10.1.13",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz",
"integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==",
"version": "10.1.15",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz",
"integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==",
"license": "MIT",
"dependencies": {
"@inquirer/figures": "^1.0.12",
"@inquirer/type": "^3.0.7",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"cli-width": "^4.1.0",
"mute-stream": "^2.0.0",
@@ -97,13 +97,13 @@
}
},
"node_modules/@inquirer/editor": {
"version": "4.2.13",
"resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.13.tgz",
"integrity": "sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==",
"version": "4.2.15",
"resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.15.tgz",
"integrity": "sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8",
"external-editor": "^3.1.0"
},
"engines": {
@@ -119,13 +119,13 @@
}
},
"node_modules/@inquirer/expand": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz",
"integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==",
"version": "4.0.17",
"resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz",
"integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
@@ -141,22 +141,22 @@
}
},
"node_modules/@inquirer/figures": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz",
"integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==",
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz",
"integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@inquirer/input": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz",
"integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz",
"integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7"
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
@@ -171,13 +171,13 @@
}
},
"node_modules/@inquirer/number": {
"version": "3.0.15",
"resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz",
"integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==",
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz",
"integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7"
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
@@ -192,13 +192,13 @@
}
},
"node_modules/@inquirer/password": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz",
"integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==",
"version": "4.0.17",
"resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz",
"integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2"
},
"engines": {
@@ -214,21 +214,21 @@
}
},
"node_modules/@inquirer/prompts": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.3.tgz",
"integrity": "sha512-8YL0WiV7J86hVAxrh3fE5mDCzcTDe1670unmJRz6ArDgN+DBK1a0+rbnNWp4DUB5rPMwqD5ZP6YHl9KK1mbZRg==",
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.7.1.tgz",
"integrity": "sha512-XDxPrEWeWUBy8scAXzXuFY45r/q49R0g72bUzgQXZ1DY/xEFX+ESDMkTQolcb5jRBzaNJX2W8XQl6krMNDTjaA==",
"license": "MIT",
"dependencies": {
"@inquirer/checkbox": "^4.1.8",
"@inquirer/confirm": "^5.1.12",
"@inquirer/editor": "^4.2.13",
"@inquirer/expand": "^4.0.15",
"@inquirer/input": "^4.1.12",
"@inquirer/number": "^3.0.15",
"@inquirer/password": "^4.0.15",
"@inquirer/rawlist": "^4.1.3",
"@inquirer/search": "^3.0.15",
"@inquirer/select": "^4.2.3"
"@inquirer/checkbox": "^4.2.0",
"@inquirer/confirm": "^5.1.14",
"@inquirer/editor": "^4.2.15",
"@inquirer/expand": "^4.0.17",
"@inquirer/input": "^4.2.1",
"@inquirer/number": "^3.0.17",
"@inquirer/password": "^4.0.17",
"@inquirer/rawlist": "^4.1.5",
"@inquirer/search": "^3.0.17",
"@inquirer/select": "^4.3.1"
},
"engines": {
"node": ">=18"
@@ -243,13 +243,13 @@
}
},
"node_modules/@inquirer/rawlist": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz",
"integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==",
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz",
"integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
@@ -265,14 +265,14 @@
}
},
"node_modules/@inquirer/search": {
"version": "3.0.15",
"resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz",
"integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==",
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.17.tgz",
"integrity": "sha512-CuBU4BAGFqRYors4TNCYzy9X3DpKtgIW4Boi0WNkm4Ei1hvY9acxKdBdyqzqBCEe4YxSdaQQsasJlFlUJNgojw==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/figures": "^1.0.12",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
@@ -288,14 +288,14 @@
}
},
"node_modules/@inquirer/select": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz",
"integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==",
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz",
"integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/figures": "^1.0.12",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
@@ -312,9 +312,9 @@
}
},
"node_modules/@inquirer/type": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz",
"integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==",
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz",
"integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -522,17 +522,17 @@
}
},
"node_modules/inquirer": {
"version": "12.6.3",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.6.3.tgz",
"integrity": "sha512-eX9beYAjr1MqYsIjx1vAheXsRk1jbZRvHLcBu5nA9wX0rXR1IfCZLnVLp4Ym4mrhqmh7AuANwcdtgQ291fZDfQ==",
"version": "12.8.2",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.8.2.tgz",
"integrity": "sha512-oBDL9f4+cDambZVJdfJu2M5JQfvaug9lbo6fKDlFV40i8t3FGA1Db67ov5Hp5DInG4zmXhHWTSnlXBntnJ7GMA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.1.13",
"@inquirer/prompts": "^7.5.3",
"@inquirer/type": "^3.0.7",
"@inquirer/core": "^10.1.15",
"@inquirer/prompts": "^7.7.1",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"mute-stream": "^2.0.0",
"run-async": "^3.0.0",
"run-async": "^4.0.5",
"rxjs": "^7.8.2"
},
"engines": {
@@ -717,9 +717,9 @@
}
},
"node_modules/run-async": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
"integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.5.tgz",
"integrity": "sha512-oN9GTgxUNDBumHTTDmQ8dep6VIJbgj9S3dPP+9XylVLIK4xB9XTXtKWROd5pnhdXR9k0EgO1JRcNh0T+Ny2FsA==",
"license": "MIT",
"engines": {
"node": ">=0.12.0"