refactor(prism-facet): become a pure registration framework
Strip all Hangman-Lab-specific content out of PrismFacet so it can be
reused by any project. Content (always router, pcexec-convention prompt,
fabric-chat-injector hook) moves to the new sibling plugin ClawPrompts.
Mechanism additions:
- `globalThis.__prismFacet` cross-plugin API installed at module-import
time (so consumers loaded before PrismFacet can still register):
.addRouter(name, resolveFn)
.addRule(router, key, { file })
- core/rule-store: tier rules into `persistent` (rules.json, mutated by
the prompt-rules admin tool) and `external` (in-memory, registered by
other plugins via the API). Persistent overrides external on conflict.
- core/router-loader: addExternalRouter() for programmatic registration
into the same map the file-based loader uses.
- index.ts: drops registerFabricChatInjector wiring, registerBeforePromptBuild
remains.
Removed (now shipped from ClawPrompts):
- plugin/routers/always.ts
- plugin/hooks/fabric-chat-injector.ts
- plugin/prompts/pcexec-convention.md
- plugin/rules.json: now `{}`; ClawPrompts registers its rule externally
What still lives in PrismFacet:
- before_prompt_build hook (the wiring between routers/rules and the
agent's system prompt)
- prompt-rules admin tool (lists + mutates persistent rules)
- file-based routersDir / rulesFile scanning (kept for operator ad-hoc
use; ClawPrompts uses the API instead)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -75,3 +75,21 @@ export function getRouters(): LoadedRouter[] {
|
||||
export function getRouterNames(): string[] {
|
||||
return Array.from(getRouterMap().keys());
|
||||
}
|
||||
|
||||
/**
|
||||
* Cross-plugin API: register a router programmatically. Other plugins
|
||||
* (e.g. ClawPrompts) call this via globalThis.__prismFacet.addRouter
|
||||
* to publish a router without dropping a .ts file in PrismFacet's
|
||||
* routersDir. Replaces any existing router of the same name.
|
||||
*/
|
||||
export function addExternalRouter(
|
||||
name: string,
|
||||
resolveFn: (ctx: RouterContext) => string | Promise<string>,
|
||||
): void {
|
||||
const map = getRouterMap();
|
||||
map.set(name, {
|
||||
name,
|
||||
filePath: `<external: registered via __prismFacet.addRouter>`,
|
||||
module: { resolve: resolveFn },
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user