From 52af9263a578e66a1bad8388adf37e5f00f6058c Mon Sep 17 00:00:00 2001 From: Obie Fernandez Date: Tue, 17 Feb 2026 17:50:34 -0600 Subject: [PATCH] feat: Make plugin output directory name configurable via pluginName Add pluginName config field (defaults to "praxis") so projects like Canon can output compiled agents to plugins/canon/agents/ instead of the previously hardcoded plugins/praxis/agents/ path. --- src/compiler/plugin-registry.ts | 3 ++- src/compiler/plugins/claude-code.ts | 9 +++++---- src/compiler/plugins/types.ts | 1 + src/compiler/role-compiler.ts | 1 + src/core/config.ts | 8 ++++++++ 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/compiler/plugin-registry.ts b/src/compiler/plugin-registry.ts index dcf0765..7bc4d63 100644 --- a/src/compiler/plugin-registry.ts +++ b/src/compiler/plugin-registry.ts @@ -23,6 +23,7 @@ export function resolvePlugins( root: string, logger: Logger, pluginsOutputDir?: string, + pluginName?: string, ): CompilerPlugin[] { return names.map((name) => { const Constructor = PLUGINS[name]; @@ -30,6 +31,6 @@ export function resolvePlugins( const available = Object.keys(PLUGINS).join(", "); throw new Error(`Unknown plugin: "${name}". Available plugins: ${available}`); } - return new Constructor({ root, logger, pluginsOutputDir }); + return new Constructor({ root, logger, pluginsOutputDir, pluginName }); }); } diff --git a/src/compiler/plugins/claude-code.ts b/src/compiler/plugins/claude-code.ts index 597038d..d8e7d26 100644 --- a/src/compiler/plugins/claude-code.ts +++ b/src/compiler/plugins/claude-code.ts @@ -8,17 +8,18 @@ import type { CompilerPlugin, PluginOptions } from "./types.js"; * Claude Code compiler plugin. * * Takes a pure agent profile and wraps it with Claude Code YAML - * frontmatter, then writes it to `plugins/praxis/agents/`. + * frontmatter, then writes it to `plugins/{pluginName}/agents/`. */ export class ClaudeCodePlugin implements CompilerPlugin { readonly name = "claude-code"; private readonly outputDir: string; - constructor({ root, pluginsOutputDir }: PluginOptions) { + constructor({ root, pluginsOutputDir, pluginName }: PluginOptions) { + const name = pluginName ?? "praxis"; this.outputDir = pluginsOutputDir - ? join(pluginsOutputDir, "praxis", "agents") - : join(root, "plugins", "praxis", "agents"); + ? join(pluginsOutputDir, name, "agents") + : join(root, "plugins", name, "agents"); } /** diff --git a/src/compiler/plugins/types.ts b/src/compiler/plugins/types.ts index c22f38f..5c65574 100644 --- a/src/compiler/plugins/types.ts +++ b/src/compiler/plugins/types.ts @@ -27,4 +27,5 @@ export interface PluginOptions { root: string; logger: Logger; pluginsOutputDir?: string; + pluginName?: string; } diff --git a/src/compiler/role-compiler.ts b/src/compiler/role-compiler.ts index d4c2c0c..0584d97 100644 --- a/src/compiler/role-compiler.ts +++ b/src/compiler/role-compiler.ts @@ -150,6 +150,7 @@ export class RoleCompiler { this.root, this.logger, this.config.pluginsOutputDir, + this.config.pluginName, ); for (const plugin of plugins) { plugin.compile(profile, metadata, roleAlias); diff --git a/src/core/config.ts b/src/core/config.ts index c941483..3378750 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -10,6 +10,7 @@ interface RawConfig { rolesDir?: string; responsibilitiesDir?: string; pluginsOutputDir?: string; + pluginName?: string; } const DEFAULT_CONFIG: Required = { @@ -19,6 +20,7 @@ const DEFAULT_CONFIG: Required = { rolesDir: "roles", responsibilitiesDir: "responsibilities", pluginsOutputDir: "./plugins", + pluginName: "praxis", }; /** @@ -80,6 +82,11 @@ export class PraxisConfig { return resolve(this.root, this.data.pluginsOutputDir); } + /** Name used for the plugin subdirectory (e.g. "praxis" or "canon"). */ + get pluginName(): string { + return this.data.pluginName; + } + private load(): Required { const configPath = join(this.root, CONFIG_FILE); @@ -96,6 +103,7 @@ export class PraxisConfig { rolesDir: raw.rolesDir ?? DEFAULT_CONFIG.rolesDir, responsibilitiesDir: raw.responsibilitiesDir ?? DEFAULT_CONFIG.responsibilitiesDir, pluginsOutputDir: raw.pluginsOutputDir ?? DEFAULT_CONFIG.pluginsOutputDir, + pluginName: raw.pluginName ?? DEFAULT_CONFIG.pluginName, }; } }