aiwg
Version:
Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platfo
74 lines • 3.05 kB
JavaScript
/**
* hook-bridge — cross-provider hook translation per ADR-3.
*
* Public API: bridgeAll(sources, providers, opts) translates every source
* for every provider, returning a flat list of TranslateResult. Per ADR-3
* §7 autoInstall policy, the orchestrator passes the explicitly-enabled
* providers (operator opts in via --enable-cross-provider-hooks plus per-
* provider flags); this module doesn't make that policy decision itself.
*
* @module smiths/hook-bridge
*/
import { translateForCodex } from './codex-translator.js';
import { translateForCopilot } from './copilot-translator.js';
import { translateForFactory } from './factory-translator.js';
import { translateForHermes } from './hermes-translator.js';
export { AIWG_ENV_VARS, NATIVE_ENV_VAR_MAP } from './types.js';
export { substituteEnvVars, generateShimBash, EXIT_CODE_MAP } from './shim.js';
export { translateForCodex, renderCodexHookToml, injectHookBlock as injectCodexHookBlock } from './codex-translator.js';
export { translateForCopilot } from './copilot-translator.js';
export { translateForFactory } from './factory-translator.js';
export { translateForHermes } from './hermes-translator.js';
export { loadHookSources } from './loader.js';
/**
* Provider id → translator function. Adding a new provider requires:
* 1. New file `<provider>-translator.ts` exporting a ProviderTranslator
* 2. Entry below
* 3. Native env var entry in types.ts NATIVE_ENV_VAR_MAP
* 4. Native exit code entry in shim.ts EXIT_CODE_MAP
* 5. Native event mapping in the per-provider file
*/
export const TRANSLATORS = {
codex: translateForCodex,
copilot: translateForCopilot,
factory: translateForFactory,
hermes: translateForHermes,
};
/**
* Translate one source across an explicit list of providers. Per-provider
* failures are captured as TranslateResult entries (skipped=true with
* reason); they do not throw to the caller.
*/
export async function bridgeAll(sources, providers, options) {
const results = [];
for (const source of sources) {
for (const providerId of providers) {
const translator = TRANSLATORS[providerId];
if (!translator) {
results.push({
provider: providerId,
emittedPaths: [],
warnings: [],
skipped: true,
skipReason: 'no translator registered',
});
continue;
}
try {
const r = await translator(source, options);
results.push(r);
}
catch (err) {
results.push({
provider: providerId,
emittedPaths: [],
warnings: [`translator threw: ${err instanceof Error ? err.message : String(err)}`],
skipped: true,
skipReason: 'translator error',
});
}
}
}
return results;
}
//# sourceMappingURL=index.js.map