@webdevtoday/claude-agents
Version:
AI-powered development shop with 15 specialized agents for Claude Code. Features concurrent execution, shared memory, context-forge integration, and web dashboard for 80% faster development.
128 lines (99 loc) • 3.71 kB
JavaScript
import { readFileSync, writeFileSync, existsSync } from 'fs';
import { getConfigPath } from './paths.js';
export const DEFAULT_CONFIG = {
version: '1.0.0',
installedAgents: {},
enabledAgents: [],
disabledAgents: [],
settings: {
autoEnableOnInstall: true,
preferProjectScope: false,
autoUpdateCheck: true
}
};
export function loadConfig(isProject = false) {
const configPath = getConfigPath(isProject);
if (!existsSync(configPath)) {
return { ...DEFAULT_CONFIG };
}
try {
const content = readFileSync(configPath, 'utf-8');
return JSON.parse(content);
} catch (error) {
console.error('Error loading config:', error);
return { ...DEFAULT_CONFIG };
}
}
export function saveConfig(config, isProject = false) {
const configPath = getConfigPath(isProject);
try {
writeFileSync(configPath, JSON.stringify(config, null, 2));
return true;
} catch (error) {
console.error('Error saving config:', error);
return false;
}
}
export function addInstalledAgent(agentName, metadata, isProject = false) {
const config = loadConfig(isProject);
config.installedAgents[agentName] = {
version: metadata.version,
installedAt: new Date().toISOString(),
scope: isProject ? 'project' : 'user',
...metadata
};
// Auto-enable if setting is true
if (config.settings.autoEnableOnInstall && !config.disabledAgents.includes(agentName)) {
if (!config.enabledAgents.includes(agentName)) {
config.enabledAgents.push(agentName);
}
}
return saveConfig(config, isProject);
}
export function removeInstalledAgent(agentName, isProject = false) {
const config = loadConfig(isProject);
delete config.installedAgents[agentName];
config.enabledAgents = config.enabledAgents.filter(name => name !== agentName);
config.disabledAgents = config.disabledAgents.filter(name => name !== agentName);
return saveConfig(config, isProject);
}
export function enableAgent(agentName, isProject = false) {
const config = loadConfig(isProject);
// Remove from disabled list
config.disabledAgents = config.disabledAgents.filter(name => name !== agentName);
// Add to enabled list if not already there
if (!config.enabledAgents.includes(agentName)) {
config.enabledAgents.push(agentName);
}
return saveConfig(config, isProject);
}
export function disableAgent(agentName, isProject = false) {
const config = loadConfig(isProject);
// Remove from enabled list
config.enabledAgents = config.enabledAgents.filter(name => name !== agentName);
// Add to disabled list if not already there
if (!config.disabledAgents.includes(agentName)) {
config.disabledAgents.push(agentName);
}
return saveConfig(config, isProject);
}
export function isAgentEnabled(agentName, checkBothScopes = true) {
const userConfig = loadConfig(false);
const projectConfig = checkBothScopes ? loadConfig(true) : null;
// Check if explicitly disabled
if (userConfig.disabledAgents.includes(agentName)) return false;
if (projectConfig && projectConfig.disabledAgents.includes(agentName)) return false;
// Check if enabled
const enabledInUser = userConfig.enabledAgents.includes(agentName);
const enabledInProject = projectConfig && projectConfig.enabledAgents.includes(agentName);
return enabledInUser || enabledInProject;
}
export function getInstalledAgents(checkBothScopes = true) {
const userConfig = loadConfig(false);
const projectConfig = checkBothScopes ? loadConfig(true) : null;
const agents = { ...userConfig.installedAgents };
if (projectConfig) {
Object.assign(agents, projectConfig.installedAgents);
}
return agents;
}