Files
routie/frontend/node_modules/@intellectronica/ruler/dist/revert.js
T

187 lines
8.5 KiB
JavaScript

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.allAgents = void 0;
exports.revertAllAgentConfigs = revertAllAgentConfigs;
const path = __importStar(require("path"));
const fs_1 = require("fs");
const FileSystemUtils = __importStar(require("./core/FileSystemUtils"));
const ConfigLoader_1 = require("./core/ConfigLoader");
const agents_1 = require("./agents");
Object.defineProperty(exports, "allAgents", { enumerable: true, get: function () { return agents_1.allAgents; } });
const constants_1 = require("./constants");
const revert_engine_1 = require("./core/revert-engine");
const agent_selection_1 = require("./core/agent-selection");
const config_utils_1 = require("./core/config-utils");
const agents = agents_1.allAgents;
/**
* Reverts ruler configurations for selected AI agents.
*/
async function revertAllAgentConfigs(projectRoot, includedAgents, configPath, keepBackups = false, verbose = false, dryRun = false, localOnly = false) {
(0, constants_1.logVerbose)(`Loading configuration for revert from project root: ${projectRoot}`, verbose);
const config = await (0, ConfigLoader_1.loadConfig)({
projectRoot,
cliAgents: includedAgents,
configPath,
});
const rulerDir = await FileSystemUtils.findRulerDir(projectRoot, !localOnly);
if (!rulerDir) {
throw (0, constants_1.createRulerError)(`.ruler directory not found`, `Searched from: ${projectRoot}`);
}
(0, constants_1.logVerbose)(`Found .ruler directory at: ${rulerDir}`, verbose);
// Normalize per-agent config keys to agent identifiers
config.agentConfigs = (0, config_utils_1.mapRawAgentConfigs)(config.agentConfigs, agents);
// Select agents to revert (same logic as apply, but with backward compatibility for invalid agents)
let selected;
try {
selected = (0, agent_selection_1.resolveSelectedAgents)(config, agents);
}
catch (error) {
// For backward compatibility, revert continues with available agents if some are invalid
// This preserves the original behavior where invalid agents were silently ignored
if (error instanceof Error &&
error.message.includes('Invalid agent specified')) {
(0, constants_1.logVerbose)(`Warning: ${error.message} - continuing with valid agents only`, verbose);
// Fall back to the old logic without validation
if (config.cliAgents && config.cliAgents.length > 0) {
const filters = config.cliAgents.map((n) => n.toLowerCase());
selected = agents.filter((agent) => filters.some((f) => agent.getIdentifier() === f ||
agent.getName().toLowerCase().includes(f)));
}
else if (config.defaultAgents && config.defaultAgents.length > 0) {
const defaults = config.defaultAgents.map((n) => n.toLowerCase());
selected = agents.filter((agent) => {
const identifier = agent.getIdentifier();
const override = config.agentConfigs[identifier]?.enabled;
if (override !== undefined) {
return override;
}
return defaults.some((d) => identifier === d || agent.getName().toLowerCase().includes(d));
});
}
else {
selected = agents.filter((agent) => config.agentConfigs[agent.getIdentifier()]?.enabled !== false);
}
}
else {
throw error;
}
}
(0, constants_1.logVerbose)(`Selected agents: ${selected.map((a) => a.getName()).join(', ')}`, verbose);
// Revert configurations for each agent
let totalFilesProcessed = 0;
let totalFilesRestored = 0;
let totalFilesRemoved = 0;
let totalBackupsRemoved = 0;
for (const agent of selected) {
const prefix = (0, constants_1.actionPrefix)(dryRun);
console.log(`${prefix} Reverting ${agent.getName()}...`);
const agentConfig = config.agentConfigs[agent.getIdentifier()];
const result = await (0, revert_engine_1.revertAgentConfiguration)(agent, projectRoot, agentConfig, keepBackups, verbose, dryRun);
totalFilesProcessed += result.restored + result.removed;
totalFilesRestored += result.restored;
totalFilesRemoved += result.removed;
totalBackupsRemoved += result.backupsRemoved;
}
// Clean up auxiliary files and directories
const cleanupResult = await (0, revert_engine_1.cleanUpAuxiliaryFiles)(projectRoot, verbose, dryRun);
totalFilesRemoved += cleanupResult.additionalFilesRemoved;
// Clean .gitignore if reverting all agents
const gitignoreCleaned = !config.cliAgents || config.cliAgents.length === 0
? await cleanGitignore(projectRoot, verbose, dryRun)
: false;
// Display summary
const prefix = (0, constants_1.actionPrefix)(dryRun);
if (dryRun) {
console.log(`${prefix} Revert summary (dry run):`);
}
else {
console.log(`${prefix} Revert completed successfully.`);
}
console.log(` Files processed: ${totalFilesProcessed}`);
console.log(` Files restored from backup: ${totalFilesRestored}`);
console.log(` Generated files removed: ${totalFilesRemoved}`);
if (!keepBackups) {
console.log(` Backup files removed: ${totalBackupsRemoved}`);
}
if (cleanupResult.directoriesRemoved > 0) {
console.log(` Empty directories removed: ${cleanupResult.directoriesRemoved}`);
}
if (gitignoreCleaned) {
console.log(` .gitignore cleaned: yes`);
}
}
/**
* Removes the ruler-managed block from .gitignore file.
*/
async function cleanGitignore(projectRoot, verbose, dryRun) {
const gitignorePath = path.join(projectRoot, '.gitignore');
try {
await fs_1.promises.access(gitignorePath);
}
catch {
(0, constants_1.logVerbose)('No .gitignore file found', verbose);
return false;
}
const content = await fs_1.promises.readFile(gitignorePath, 'utf8');
const startMarker = '# START Ruler Generated Files';
const endMarker = '# END Ruler Generated Files';
const startIndex = content.indexOf(startMarker);
const endIndex = content.indexOf(endMarker);
if (startIndex === -1 || endIndex === -1) {
(0, constants_1.logVerbose)('No ruler-managed block found in .gitignore', verbose);
return false;
}
const prefix = (0, constants_1.actionPrefix)(dryRun);
if (dryRun) {
(0, constants_1.logVerbose)(`${prefix} Would remove ruler block from .gitignore`, verbose);
}
else {
const beforeBlock = content.substring(0, startIndex);
const afterBlock = content.substring(endIndex + endMarker.length);
let newContent = beforeBlock + afterBlock;
newContent = newContent.replace(/\n{3,}/g, '\n\n'); // Replace 3+ newlines with 2
if (newContent.trim() === '') {
await fs_1.promises.unlink(gitignorePath);
(0, constants_1.logVerbose)(`${prefix} Removed empty .gitignore file`, verbose);
}
else {
await fs_1.promises.writeFile(gitignorePath, newContent);
(0, constants_1.logVerbose)(`${prefix} Removed ruler block from .gitignore`, verbose);
}
}
return true;
}