knowhub
Version:
Synchronize AI coding–agent knowledge files (rules, templates, guidelines) across your project.
59 lines • 2.41 kB
JavaScript
import { resolve } from "node:path";
import { cosmiconfig } from "cosmiconfig";
import { ConfigurationError, ValidationError } from "./errors.js";
import { pluginRegistry } from "./plugins/registry.js";
import { validateConfigStructure, validateResource } from "./validators.js";
export async function loadConfig(configPath, projectRoot) {
const explorer = cosmiconfig("knowhub");
let result;
if (configPath) {
result = await explorer.load(configPath);
}
else {
result = await explorer.search();
}
if (!result) {
throw new ConfigurationError('No knowhub configuration found. Run "npx knowhub init" to create a configuration file, or ensure you have a .knowhubrc.* file or "knowhub" field in package.json.', configPath);
}
const config = result.config;
try {
validateConfigStructure(config, result.filepath);
}
catch (error) {
if (error instanceof ValidationError) {
throw new ConfigurationError(error.message, result.filepath);
}
throw error;
}
if (config.plugins && Array.isArray(config.plugins)) {
const configProjectRoot = projectRoot || process.cwd();
try {
await pluginRegistry.loadPlugins(config.plugins, configProjectRoot);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
throw new ConfigurationError(`Failed to load plugins: ${errorMessage}`, result.filepath);
}
}
const validatedResources = [];
for (let i = 0; i < config.resources.length; i++) {
const resource = config.resources[i];
if (!resource) {
throw new ValidationError(`Invalid resource at resources[${i}]: resource is undefined`, `resources[${i}]`);
}
const resourcePath = `resources[${i}]`;
try {
const validated = await validateResource(resource, resourcePath);
validatedResources.push(validated);
}
catch (error) {
if (error instanceof ValidationError) {
throw error;
}
const errorMessage = error instanceof Error ? error.message : String(error);
throw new ValidationError(`Invalid resource at ${resourcePath}: ${errorMessage}`, resourcePath);
}
}
return validatedResources;
}
//# sourceMappingURL=config.js.map