@zizzfizzix/aef 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -127,6 +127,33 @@ function wireNewSkills(root, out, config, skills) {
127
127
  }
128
128
  }
129
129
  }
130
+ function detectIndent(json) {
131
+ const m = json.match(/^\s*[{[]\r?\n([ \t]+)/);
132
+ return m ? m[1] : 2;
133
+ }
134
+ function pinAefInPackageJson(out, version2) {
135
+ const pkgPath = join2(out, "package.json");
136
+ if (!existsSync(pkgPath)) {
137
+ return `no package.json found \u2014 run: pnpm add -D @zizzfizzix/aef@^${version2}`;
138
+ }
139
+ const raw = readFileSync(pkgPath, "utf8");
140
+ let pkg;
141
+ try {
142
+ pkg = JSON.parse(raw);
143
+ } catch (e) {
144
+ throw new Error(`Failed to parse ${pkgPath}: ${e instanceof Error ? e.message : String(e)}`);
145
+ }
146
+ const indent = detectIndent(raw);
147
+ const scripts = pkg["scripts"] ?? {};
148
+ const devDeps = pkg["devDependencies"] ?? {};
149
+ const wasPresent = "@zizzfizzix/aef" in devDeps;
150
+ scripts["aef"] = "aef";
151
+ devDeps["@zizzfizzix/aef"] = `^${version2}`;
152
+ pkg["scripts"] = scripts;
153
+ pkg["devDependencies"] = devDeps;
154
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, indent) + "\n");
155
+ return wasPresent ? `updated @zizzfizzix/aef to ^${version2} in devDependencies` : `added @zizzfizzix/aef@^${version2} to devDependencies \u2014 run \`pnpm install\` then \`pnpm aef --help\``;
156
+ }
130
157
  function wireHarnesses(root, out, config, skills, useCopy) {
131
158
  const aiSkills = join2(out, ".ai", "skills");
132
159
  const wired = [];
@@ -226,7 +253,7 @@ Run 'aef init --help' for all options.`
226
253
  }
227
254
  const raw = opts.interactive ? await runWizard(root) : JSON.parse(readFileSync2(opts.config, "utf8"));
228
255
  const config = FrameworkConfigSchema.parse(raw);
229
- const out = opts.out ?? join4(root, "examples/consumer");
256
+ const out = opts.out ?? process.cwd();
230
257
  const useCopy = Boolean(opts.copy);
231
258
  const { skills, skipped } = selectSkills(root, config);
232
259
  const manifestSkills = {};
@@ -240,11 +267,14 @@ Run 'aef init --help' for all options.`
240
267
  writeFileSync2(join4(out, "framework.config.json"), JSON.stringify(raw, null, 2) + "\n");
241
268
  const conventions = writeConventions(root, out, config);
242
269
  const wired = wireHarnesses(root, out, config, skills, useCopy);
270
+ const { version: version2 } = JSON.parse(readFileSync2(join4(FRAMEWORK_ROOT, "package.json"), "utf8"));
271
+ const pkgNote = pinAefInPackageJson(out, version2);
243
272
  console.log(`Initialised agentic framework into ${relative(process.cwd(), out) || "."}`);
244
273
  console.log(` skills installed: ${skills.join(", ") || "(none)"}`);
245
274
  console.log(` conventions: ${conventions.join(", ")}`);
246
275
  if (skipped.length) console.log(` skipped (axis not configured): ${skipped.join(", ")}`);
247
276
  console.log(` harnesses wired: ${wired.join(" | ") || "(none)"}`);
277
+ console.log(` package.json: ${pkgNote}`);
248
278
  }
249
279
 
250
280
  // src/cli/commands/sync.ts
@@ -296,7 +326,7 @@ var REPORT = {
296
326
  };
297
327
  function runSync(opts) {
298
328
  const root = FRAMEWORK_ROOT;
299
- const out = opts.out ?? join6(root, "examples/consumer");
329
+ const out = opts.out ?? process.cwd();
300
330
  const config = FrameworkConfigSchema.parse(
301
331
  JSON.parse(readFileSync4(join6(out, "framework.config.json"), "utf8"))
302
332
  );
@@ -339,6 +369,8 @@ function runSync(opts) {
339
369
  }
340
370
  }
341
371
  report.forEach((l) => console.log(l));
372
+ const { version: version2 } = JSON.parse(readFileSync4(join6(FRAMEWORK_ROOT, "package.json"), "utf8"));
373
+ console.log(` package.json: ${pinAefInPackageJson(out, version2)}`);
342
374
  if (conflicts) {
343
375
  console.log(
344
376
  `
@@ -511,6 +543,8 @@ function mutate(name, op, opts) {
511
543
  console.log(
512
544
  `${op === "add" ? "Added" : "Removed"} ${name} (${kind}) in ${relative5(process.cwd(), out) || "."}`
513
545
  );
546
+ const { version: version2 } = JSON.parse(readFileSync7(join9(FRAMEWORK_ROOT, "package.json"), "utf8"));
547
+ console.log(` package.json: ${pinAefInPackageJson(out, version2)}`);
514
548
  if (conflicts) {
515
549
  console.log(
516
550
  `
@@ -577,13 +611,13 @@ function suggestKey(unknown, valid) {
577
611
  best = k;
578
612
  }
579
613
  }
580
- return bestDist / Math.max(unknown.length, best.length) <= 0.4 ? best : null;
614
+ return best !== null && bestDist / Math.max(unknown.length, best.length) <= 0.4 ? best : null;
581
615
  }
582
616
  var program = new Command();
583
617
  program.name("aef").description("Render slot-based engineering skills into a consumer repo and keep them in sync.").version(version);
584
- program.command("init").description("Render the configured skill set into a consumer repo and wire harnesses.").option("--config <path>", "path to framework.config.json (required unless --interactive)").option("--out <dir>", "consumer directory to write into").option("--copy", "copy rendered skills into harness dirs instead of symlinking").option("-i, --interactive", "build the config interactively via prompts").action((opts) => runInit(opts));
618
+ program.command("init").description("Render the configured skill set into a consumer repo and wire harnesses.").option("--config <path>", "path to framework.config.json (required unless --interactive)").option("--out <dir>", "consumer directory to write into (default: current directory)").option("--copy", "copy rendered skills into harness dirs instead of symlinking").option("-i, --interactive", "build the config interactively via prompts").action((opts) => runInit(opts));
585
619
  program.command("render").description("Render a single skill to stdout (or --out <dir>) for inspection.").requiredOption("--skill <name>", "skill id to render").option("--config <path>", "path to framework.config.json (required)").option("--out <dir>", "write SKILL.md + provenance.json under <dir>/<skill>/ instead of stdout").action((opts) => runRender(opts));
586
- program.command("sync").description("Re-render from framework source and reconcile with local edits (3-way merge).").option("--out <dir>", "consumer directory to sync").action((opts) => runSync(opts));
620
+ program.command("sync").description("Re-render from framework source and reconcile with local edits (3-way merge).").option("--out <dir>", "consumer directory to sync (default: current directory)").action((opts) => runSync(opts));
587
621
  program.command("add").argument("<adapter>", "adapter name to select (axis inferred from its adapter.json)").description("Select an adapter and reconcile the installed skill set (merges local edits).").option("--out <dir>", "consumer directory to update").option("--copy", "copy rendered skills into harness dirs instead of symlinking").action((adapter, opts) => runAdd(adapter, opts));
588
622
  program.command("remove").argument("<adapter>", "adapter name to deselect (axis inferred from its adapter.json)").description("Deselect an adapter; uninstalls skills that required its axis.").option("--out <dir>", "consumer directory to update").option("--copy", "copy rendered skills into harness dirs instead of symlinking").action((adapter, opts) => runRemove(adapter, opts));
589
623
  program.command("dev").description("Meta-install: wire this repo\u2019s harness dirs to dev/ skills for framework development.").action(() => runDev());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/root.ts","../../src/cli/consumer-io.ts","../../src/cli/wizard.ts","../../src/cli/commands/sync.ts","../../src/cli/reconcile.ts","../../src/cli/commands/dev.ts","../../src/cli/commands/render.ts","../../src/cli/commands/adapter.ts"],"sourcesContent":["#!/usr/bin/env node\n// aef — CLI for the Agentic Engineering Framework.\n//\n// aef init [--config <cfg>] [--out <dir>] [--copy] [--interactive]\n// aef sync [--out <dir>]\n// aef add <adapter> [--out <dir>] [--copy]\n// aef remove <adapter> [--out <dir>] [--copy]\n// aef dev\nimport { readFileSync } from 'node:fs'\nimport { Command } from 'commander'\nimport { ZodError, ZodIssueCode } from 'zod'\nimport { runInit } from './commands/init.js'\nimport { runSync } from './commands/sync.js'\nimport { runDev } from './commands/dev.js'\nimport { runRender } from './commands/render.js'\nimport { runAdd, runRemove } from './commands/adapter.js'\nimport { FrameworkConfigSchema } from '../core/contracts.js'\n\n// Single source of truth for the version: read the package's own package.json at\n// runtime so it never drifts from release-please's bump (dev: src/cli/, built:\n// dist/cli/ — both resolve to the package root).\nconst { version } = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')) as {\n version: string\n}\n\nfunction levenshtein(a: string, b: string): number {\n const dp = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n let prev = dp[0]!\n dp[0] = i\n for (let j = 1; j <= b.length; j++) {\n const temp = dp[j]!\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, temp, dp[j - 1]!)\n prev = temp\n }\n }\n return dp[b.length]!\n}\n\nfunction suggestKey(unknown: string, valid: string[]): string | null {\n let best: string | null = null\n let bestDist = Infinity\n for (const k of valid) {\n const d = levenshtein(unknown, k)\n if (d < bestDist) {\n bestDist = d\n best = k\n }\n }\n return bestDist / Math.max(unknown.length, best!.length) <= 0.4 ? best : null\n}\n\nconst program = new Command()\n\nprogram\n .name('aef')\n .description('Render slot-based engineering skills into a consumer repo and keep them in sync.')\n .version(version)\n\nprogram\n .command('init')\n .description('Render the configured skill set into a consumer repo and wire harnesses.')\n .option('--config <path>', 'path to framework.config.json (required unless --interactive)')\n .option('--out <dir>', 'consumer directory to write into')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .option('-i, --interactive', 'build the config interactively via prompts')\n .action((opts) => runInit(opts))\n\nprogram\n .command('render')\n .description('Render a single skill to stdout (or --out <dir>) for inspection.')\n .requiredOption('--skill <name>', 'skill id to render')\n .option('--config <path>', 'path to framework.config.json (required)')\n .option('--out <dir>', 'write SKILL.md + provenance.json under <dir>/<skill>/ instead of stdout')\n .action((opts) => runRender(opts))\n\nprogram\n .command('sync')\n .description('Re-render from framework source and reconcile with local edits (3-way merge).')\n .option('--out <dir>', 'consumer directory to sync')\n .action((opts) => runSync(opts))\n\nprogram\n .command('add')\n .argument('<adapter>', 'adapter name to select (axis inferred from its adapter.json)')\n .description('Select an adapter and reconcile the installed skill set (merges local edits).')\n .option('--out <dir>', 'consumer directory to update')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .action((adapter, opts) => runAdd(adapter, opts))\n\nprogram\n .command('remove')\n .argument('<adapter>', 'adapter name to deselect (axis inferred from its adapter.json)')\n .description('Deselect an adapter; uninstalls skills that required its axis.')\n .option('--out <dir>', 'consumer directory to update')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .action((adapter, opts) => runRemove(adapter, opts))\n\nprogram\n .command('dev')\n .description('Meta-install: wire this repo’s harness dirs to dev/ skills for framework development.')\n .action(() => runDev())\n\nconst validRootKeys = Object.keys(FrameworkConfigSchema.shape)\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (err instanceof ZodError) {\n console.error('Invalid configuration:')\n for (const issue of err.issues) {\n if (issue.code === ZodIssueCode.unrecognized_keys && issue.path.length === 0) {\n for (const key of issue.keys) {\n const suggestion = suggestKey(key, validRootKeys)\n const hint = suggestion != null ? ` Did you mean '${suggestion}'?` : ''\n console.error(` - Unknown key '${key}'.${hint}`)\n }\n console.error(` Valid keys: ${validRootKeys.join(', ')}`)\n } else {\n console.error(` - ${issue.path.join('.') || '(root)'}: ${issue.message}`)\n }\n }\n } else {\n console.error(err instanceof Error ? err.message : String(err))\n }\n process.exit(1)\n})\n","// `aef init` — render the configured skill set into <out>/.ai/skills/, snapshot a\n// BASE under <out>/.ai/.base/, write the render manifest (sync's base), persist the\n// resolved config, and wire each harness.\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport {\n writeSkill,\n writeBase,\n writeManifest,\n wireHarnesses,\n writeConventions,\n type ManifestSkills,\n} from '../consumer-io.js'\nimport { runWizard } from '../wizard.js'\n\nexport interface InitOptions {\n config?: string\n out?: string\n copy?: boolean\n interactive?: boolean\n}\n\nexport async function runInit(opts: InitOptions): Promise<void> {\n const root = FRAMEWORK_ROOT\n\n if (opts.config && opts.interactive) {\n throw new Error(\n `--config and --interactive are mutually exclusive. Pass --config to use a file or --interactive to build one via prompts.`,\n )\n }\n if (!opts.config && !opts.interactive) {\n throw new Error(\n `--config is required.\\n\\nUsage: aef init --config framework.config.json --out . --copy\\n\\nTo get started, create a framework.config.json. Minimum required:\\n {\\n \"harnesses\": [\"claude-code\"]\\n }\\n\\nRun 'aef init --help' for all options.`,\n )\n }\n\n // `raw` is what we persist to framework.config.json (byte-stable); `config` is the\n // zod-validated view the renderer consumes.\n const raw: unknown = opts.interactive\n ? await runWizard(root)\n : JSON.parse(readFileSync(opts.config!, 'utf8'))\n const config = FrameworkConfigSchema.parse(raw)\n\n const out = opts.out ?? join(root, 'examples/consumer')\n const useCopy = Boolean(opts.copy)\n\n const { skills, skipped } = selectSkills(root, config)\n\n const manifestSkills: ManifestSkills = {}\n for (const skill of skills) {\n const { rendered, manifest, digest } = renderSkill(root, config, skill)\n writeSkill(out, skill, rendered, manifest)\n writeBase(out, skill, rendered)\n manifestSkills[skill] = { digest, inputs: manifest.inputs }\n }\n writeManifest(out, config, manifestSkills)\n writeFileSync(join(out, 'framework.config.json'), JSON.stringify(raw, null, 2) + '\\n')\n\n const conventions = writeConventions(root, out, config)\n const wired = wireHarnesses(root, out, config, skills, useCopy)\n\n console.log(`Initialised agentic framework into ${relative(process.cwd(), out) || '.'}`)\n console.log(` skills installed: ${skills.join(', ') || '(none)'}`)\n console.log(` conventions: ${conventions.join(', ')}`)\n if (skipped.length) console.log(` skipped (axis not configured): ${skipped.join(', ')}`)\n console.log(` harnesses wired: ${wired.join(' | ') || '(none)'}`)\n}\n","import { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\n\n// The framework SOURCE root (where core/, adapters/, schemas/ live). Resolves the\n// same whether running from src/cli/ via tsx or from dist/cli/ after a build —\n// both are two levels below the package root.\nexport const FRAMEWORK_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..')\n","// Filesystem side of init/sync: writing a consumer's .ai/ tree and wiring harnesses.\n// Kept separate from the command wiring so the behaviour is unit-testable.\nimport {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n lstatSync,\n rmSync,\n cpSync,\n symlinkSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { AdapterSchema, type FrameworkConfig } from '../core/contracts.js'\nimport type { InputRef, RenderManifest } from '../core/render.js'\n\nexport const isLink = (p: string): boolean => {\n try {\n return lstatSync(p).isSymbolicLink()\n } catch {\n return false\n }\n}\n\nexport function pick<T extends Record<string, unknown>>(o: T, keys: string[]): Record<string, unknown> {\n const r: Record<string, unknown> = {}\n for (const k of keys) if (k in o) r[k] = o[k]\n return r\n}\n\n/**\n * Install the generic `core/ai` conventions into a consumer: the specs/qa/runs scaffolding,\n * a starter lessons.md, a CLAUDE.md, and AGENTS.md rendered from the template with\n * {{PROJECT_NAME}} substituted. Idempotent — safe to re-run. Returns the paths written.\n */\nexport function writeConventions(root: string, out: string, config: FrameworkConfig): string[] {\n const projectName = config.projectName ?? 'your project'\n const sub = (s: string): string => s.split('{{PROJECT_NAME}}').join(projectName)\n const ai = join(out, '.ai')\n mkdirSync(ai, { recursive: true })\n const written: string[] = []\n\n for (const dir of ['specs', 'qa', 'runs']) {\n const src = join(root, 'core', 'ai', dir)\n if (existsSync(src)) {\n cpSync(src, join(ai, dir), { recursive: true })\n written.push(`.ai/${dir}/`)\n }\n }\n // Substitute {{PROJECT_NAME}} in the one convention file that carries it.\n const specsReadme = join(ai, 'specs', 'README.md')\n if (existsSync(specsReadme)) writeFileSync(specsReadme, sub(readFileSync(specsReadme, 'utf8')))\n\n const lessonsSrc = join(root, 'core', 'ai', 'lessons.md')\n if (existsSync(lessonsSrc)) {\n writeFileSync(join(ai, 'lessons.md'), sub(readFileSync(lessonsSrc, 'utf8')))\n written.push('.ai/lessons.md')\n }\n // Synced-read-only generic lessons.\n const fwLessons = join(root, 'core', 'ai', 'lessons.framework.md')\n if (existsSync(fwLessons)) {\n writeFileSync(join(ai, 'lessons.framework.md'), readFileSync(fwLessons, 'utf8'))\n written.push('.ai/lessons.framework.md')\n }\n // Framework-feedback outbox: only for consumers who have opted in to the framework tier.\n const outbox = join(root, 'core', 'ai', 'framework-feedback')\n if (existsSync(outbox) && config.tiers?.includes('framework')) {\n cpSync(outbox, join(ai, 'framework-feedback'), { recursive: true })\n written.push('.ai/framework-feedback/')\n }\n\n const tpl = join(root, 'core', 'AGENTS.md.template')\n if (existsSync(tpl)) {\n writeFileSync(join(out, 'AGENTS.md'), sub(readFileSync(tpl, 'utf8')))\n written.push('AGENTS.md')\n }\n writeFileSync(join(out, 'CLAUDE.md'), '@AGENTS.md\\n')\n written.push('CLAUDE.md')\n return written\n}\n\nexport function writeSkill(out: string, skill: string, rendered: string, manifest: RenderManifest): void {\n const dest = join(out, '.ai', 'skills', skill)\n mkdirSync(dest, { recursive: true })\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n writeFileSync(join(dest, 'provenance.json'), JSON.stringify(manifest, null, 2) + '\\n')\n}\n\nexport function writeBase(out: string, skill: string, rendered: string): void {\n const d = join(out, '.ai', '.base', skill)\n mkdirSync(d, { recursive: true })\n writeFileSync(join(d, 'SKILL.md'), rendered)\n}\n\nexport type ManifestSkills = Record<string, { digest: string; inputs: InputRef[] }>\n\nexport function writeManifest(out: string, config: FrameworkConfig, skills: ManifestSkills): void {\n mkdirSync(join(out, '.ai'), { recursive: true })\n writeFileSync(\n join(out, '.ai', '.render-manifest.json'),\n JSON.stringify(\n { selection: pick(config, ['orm', 'ui', 'stack', 'harnesses', 'tiers']), skills },\n null,\n 2,\n ) + '\\n',\n )\n}\n\nexport function harnessSkillsDir(root: string, harness: string): string | null {\n const p = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(p)) return null\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(p, 'utf8')))\n return ad.skillsDir ?? null\n}\n\nexport function wireNewSkills(root: string, out: string, config: FrameworkConfig, skills: string[]): void {\n for (const harness of config.harnesses) {\n const adPath = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(adPath)) continue\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(adPath, 'utf8')))\n if (!ad.skillsDir || !ad.linkBase) continue\n const hdir = join(out, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n for (const skill of skills) {\n const link = join(hdir, skill)\n if (!existsSync(link) && !isLink(link)) symlinkSync(`${ad.linkBase}/${skill}`, link)\n }\n }\n}\n\nexport function wireHarnesses(\n root: string,\n out: string,\n config: FrameworkConfig,\n skills: string[],\n useCopy: boolean,\n): string[] {\n const aiSkills = join(out, '.ai', 'skills')\n const wired: string[] = []\n for (const harness of config.harnesses) {\n const adPath = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(adPath)) {\n console.warn(`! no harness adapter '${harness}', skipping`)\n continue\n }\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(adPath, 'utf8')))\n if (!ad.skillsDir || !ad.linkBase) {\n console.warn(`! harness adapter '${harness}' is missing skillsDir/linkBase, skipping`)\n continue\n }\n const hdir = join(out, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n for (const skill of skills) {\n const link = join(hdir, skill)\n if (existsSync(link) || isLink(link)) rmSync(link, { recursive: true, force: true })\n if (useCopy) cpSync(join(aiSkills, skill), link, { recursive: true })\n else symlinkSync(`${ad.linkBase}/${skill}`, link)\n }\n wired.push(`${harness} -> ${ad.skillsDir} (${useCopy ? 'copy' : 'symlink'})`)\n }\n return wired\n}\n","// Interactive `init` wizard (opt-in via --interactive). Discovers the available\n// adapters on disk and builds a framework.config object via @clack/prompts.\nimport { readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\n\nfunction listAdapters(root: string, axis: string): string[] {\n const dir = join(root, 'adapters', axis)\n if (!existsSync(dir)) return []\n return readdirSync(dir).filter((n) => existsSync(join(dir, n, 'adapter.json')))\n}\n\nfunction bail<T>(value: T | symbol): T {\n if (p.isCancel(value)) {\n p.cancel('Cancelled — nothing written.')\n process.exit(1)\n }\n return value as T\n}\n\nconst axisOptions = (root: string, axis: string): { value: string | null; label: string }[] => [\n { value: null, label: 'none' },\n ...listAdapters(root, axis).map((v) => ({ value: v, label: v })),\n]\n\nexport async function runWizard(root: string): Promise<Record<string, unknown>> {\n p.intro('aef init')\n\n const projectName = bail(\n await p.text({ message: 'Project name', placeholder: 'my-app', defaultValue: 'my-app' }),\n )\n const harnesses = bail(\n await p.multiselect({\n message: 'Which AI harnesses should be wired?',\n options: listAdapters(root, 'harness').map((v) => ({ value: v, label: v })),\n required: true,\n }),\n )\n const orm = bail(\n await p.select({ message: 'ORM adapter', options: axisOptions(root, 'orm'), initialValue: null }),\n )\n const ui = bail(\n await p.select({ message: 'UI adapter', options: axisOptions(root, 'ui'), initialValue: null }),\n )\n\n p.outro('Configuration ready.')\n\n return {\n $schema: './schemas/framework.config.schema.json',\n projectName,\n harnesses,\n orm,\n ui,\n }\n}\n","// `aef sync` — re-render from the (updated) framework source and reconcile with\n// local edits via a git-native 3-way merge (BASE = last render, LOCAL = on-disk,\n// NEW = fresh render). Exit code 2 signals unresolved conflicts written to the tree.\nimport { readFileSync, writeFileSync, existsSync, rmSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { reconcileSkill, type ReconcileStatus } from '../reconcile.js'\nimport { writeManifest, wireNewSkills, harnessSkillsDir, type ManifestSkills } from '../consumer-io.js'\n\ninterface RenderManifestFile {\n selection: unknown\n skills: ManifestSkills\n}\n\nconst REPORT: Record<ReconcileStatus, (s: string) => string> = {\n installed: (s) => ` + ${s}: installed`,\n unchanged: (s) => ` = ${s}: framework unchanged`,\n forwarded: (s) => ` ↑ ${s}: updated (no local edits)`,\n merged: (s) => ` ⇄ ${s}: merged local edits + framework update (clean)`,\n conflict: (s) => ` ⇄ ${s}: merged — CONFLICT(S), resolve in working tree`,\n}\n\nexport interface SyncOptions {\n out?: string\n}\n\nexport function runSync(opts: SyncOptions): void {\n const root = FRAMEWORK_ROOT\n const out = opts.out ?? join(root, 'examples/consumer')\n const config = FrameworkConfigSchema.parse(\n JSON.parse(readFileSync(join(out, 'framework.config.json'), 'utf8')),\n )\n const manifestPath = join(out, '.ai', '.render-manifest.json')\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as RenderManifestFile\n\n const { skills: desired } = selectSkills(root, config)\n const desiredSet = new Set(desired)\n const installed = Object.keys(manifest.skills)\n\n const harnessDirs = new Map<string, string | null>()\n for (const h of config.harnesses) harnessDirs.set(h, harnessSkillsDir(root, h))\n\n // Remove skills no longer in the desired set (tier removed or axis cleared).\n for (const s of installed) {\n if (desiredSet.has(s)) continue\n rmSync(join(out, '.ai', 'skills', s), { recursive: true, force: true })\n rmSync(join(out, '.ai', '.base', s), { recursive: true, force: true })\n delete manifest.skills[s]\n for (const dir of harnessDirs.values())\n if (dir) rmSync(join(out, dir, s), { recursive: true, force: true })\n }\n\n const report: string[] = []\n let conflicts = 0\n const newSkills: string[] = []\n for (const skill of desired) {\n const isNew = !manifest.skills[skill]\n const r = reconcileSkill(root, out, config, skill)\n manifest.skills[skill] = { digest: r.digest, inputs: r.inputs }\n conflicts += r.conflicts\n report.push(REPORT[r.status](skill))\n if (isNew) newSkills.push(skill)\n }\n\n if (newSkills.length > 0) wireNewSkills(root, out, config, newSkills)\n\n writeManifest(out, config, manifest.skills)\n\n console.log(`Synced ${relative(process.cwd(), out) || '.'} from framework source`)\n // Refresh synced read-only framework lessons (loop closure, decision #8).\n const fwLessonsSrc = join(root, 'core', 'ai', 'lessons.framework.md')\n if (existsSync(fwLessonsSrc)) {\n const dest = join(out, '.ai', 'lessons.framework.md')\n const next = readFileSync(fwLessonsSrc, 'utf8')\n if (!existsSync(dest) || readFileSync(dest, 'utf8') !== next) {\n writeFileSync(dest, next)\n report.push(' ↑ lessons.framework.md: refreshed (synced, read-only)')\n }\n }\n\n report.forEach((l) => console.log(l))\n if (conflicts) {\n console.log(\n `\\n${conflicts} conflict(s) written as <<<<<<< markers. Review with 'git diff', resolve, commit.`,\n )\n process.exitCode = 2\n }\n}\n","// Shared per-skill reconcile: render a skill from the current framework source and\n// fold the result into a consumer, preserving local edits via a git-native 3-way merge.\n// Used by both `aef sync` and `aef add`/`remove` so the reconcile semantics —\n// fast-forward, clean merge, conflict, and provenance refresh — live in exactly one place.\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { renderSkill, type InputRef } from '../core/render.js'\nimport { mergeFile } from '../core/merge.js'\nimport type { FrameworkConfig } from '../core/contracts.js'\nimport { writeSkill, writeBase } from './consumer-io.js'\n\nexport type ReconcileStatus = 'installed' | 'unchanged' | 'forwarded' | 'merged' | 'conflict'\n\nexport interface ReconcileResult {\n status: ReconcileStatus\n digest: string\n inputs: InputRef[]\n conflicts: number\n}\n\n/**\n * Reconcile one skill in `out` against the current render:\n * - not yet on disk → install fresh (+ BASE),\n * - framework unchanged → leave LOCAL alone (local edits kept),\n * - framework changed, no edits → fast-forward to NEW,\n * - both changed → 3-way merge (conflicts land as <<<<<<< markers).\n * Always refreshes provenance.json to the fresh render and returns the new digest/inputs\n * so the caller can update the render manifest.\n */\nexport function reconcileSkill(\n root: string,\n out: string,\n config: FrameworkConfig,\n skill: string,\n): ReconcileResult {\n const { rendered: NEW, manifest, digest } = renderSkill(root, config, skill)\n const skillMd = join(out, '.ai', 'skills', skill, 'SKILL.md')\n\n if (!existsSync(skillMd)) {\n writeSkill(out, skill, NEW, manifest)\n writeBase(out, skill, NEW)\n return { status: 'installed', digest, inputs: manifest.inputs, conflicts: 0 }\n }\n\n const baseMd = join(out, '.ai', '.base', skill, 'SKILL.md')\n const BASE = existsSync(baseMd) ? readFileSync(baseMd, 'utf8') : NEW\n const LOCAL = readFileSync(skillMd, 'utf8')\n\n let status: ReconcileStatus = 'unchanged'\n let conflicts = 0\n if (NEW !== BASE) {\n if (LOCAL === BASE) {\n writeFileSync(skillMd, NEW)\n status = 'forwarded'\n } else {\n const { merged, conflicts: n } = mergeFile(LOCAL, BASE, NEW)\n writeFileSync(skillMd, merged)\n conflicts = n\n status = n ? 'conflict' : 'merged'\n }\n writeBase(out, skill, NEW)\n }\n // Provenance always tracks the fresh render (improve-framework reads it to route edits).\n writeFileSync(\n join(out, '.ai', 'skills', skill, 'provenance.json'),\n JSON.stringify(manifest, null, 2) + '\\n',\n )\n return { status, digest, inputs: manifest.inputs, conflicts }\n}\n","// `aef dev` — the \"meta\" install for developing THIS framework. Wires the repo's\n// own harness skill dirs to dev/ skills (source symlinks) and renders shipped skills\n// from dev/framework.config.json into the same dirs. Harness dirs are gitignored.\nimport { readFileSync, writeFileSync, readdirSync, existsSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { AdapterSchema, FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { isLink } from '../consumer-io.js'\n\nexport function runDev(root: string = FRAMEWORK_ROOT): void {\n const devSkillsDir = join(root, 'dev', 'skills')\n if (!existsSync(devSkillsDir)) {\n console.error('no dev/skills/ found')\n process.exit(1)\n }\n const devSkills = readdirSync(devSkillsDir).filter((d) => existsSync(join(devSkillsDir, d, 'SKILL.md')))\n\n const devConfigPath = join(root, 'dev', 'framework.config.json')\n if (!existsSync(devConfigPath)) {\n console.error('no dev/framework.config.json found — run from the framework root')\n process.exit(1)\n }\n const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync(devConfigPath, 'utf8')))\n const devSkillNames = new Set(devSkills)\n const { skills: allShipped, skipped } = selectSkills(root, config)\n const shippedSkills = allShipped.filter((s) => !devSkillNames.has(s))\n\n const harnessRoot = join(root, 'adapters', 'harness')\n const harnesses = readdirSync(harnessRoot).filter((d) => existsSync(join(harnessRoot, d, 'adapter.json')))\n\n const wired: string[] = []\n for (const harness of harnesses) {\n const ad = AdapterSchema.parse(\n JSON.parse(readFileSync(join(harnessRoot, harness, 'adapter.json'), 'utf8')),\n )\n if (!ad.skillsDir) continue\n const hdir = join(root, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n\n // Dev skills: symlink so edits to SKILL.md are immediately reflected.\n const target = relative(hdir, devSkillsDir)\n for (const skill of devSkills) {\n const link = join(hdir, skill)\n if (existsSync(link) || isLink(link)) rmSync(link, { recursive: true, force: true })\n symlinkSync(join(target, skill), link)\n }\n\n // Shipped skills: render with the dev config and write SKILL.md directly.\n for (const skill of shippedSkills) {\n const dest = join(hdir, skill)\n if (existsSync(dest) || isLink(dest)) rmSync(dest, { recursive: true, force: true })\n mkdirSync(dest, { recursive: true })\n const { rendered } = renderSkill(root, config, skill)\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n }\n\n wired.push(`${harness} -> ${ad.skillsDir}`)\n }\n\n console.log('Framework dev install (meta):')\n console.log(` dev skills : ${devSkills.join(', ') || '(none)'}`)\n console.log(` shipped skills: ${shippedSkills.join(', ') || '(none)'}`)\n if (skipped.length) console.log(` skipped : ${skipped.join(', ')}`)\n console.log(` harnesses : ${wired.join(' | ')}`)\n console.log(' (harness dirs are gitignored; re-run after adding or changing a skill)')\n}\n","// `aef render` — render a single skill to stdout (or --out dir) for inspection.\n// The lightweight counterpart to `init`; handy while authoring skills/adapters and\n// the render step the improve-framework skill points at.\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\n\nexport interface RenderOptions {\n skill: string\n config?: string\n out?: string\n}\n\nexport function runRender(opts: RenderOptions): void {\n if (!opts.config) {\n throw new Error(\n `--config is required.\\n\\nUsage: aef render --skill <name> --config framework.config.json\\n\\nRun 'aef render --help' for all options.`,\n )\n }\n const root = FRAMEWORK_ROOT\n const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync(opts.config, 'utf8')))\n const { rendered, manifest, digest } = renderSkill(root, config, opts.skill)\n\n if (opts.out) {\n const dest = join(opts.out, opts.skill)\n mkdirSync(dest, { recursive: true })\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n writeFileSync(join(dest, 'provenance.json'), JSON.stringify(manifest, null, 2) + '\\n')\n console.error(\n `Rendered '${opts.skill}' (orm=${manifest.selection.orm ?? 'none'}) -> ${relative(root, dest)}`,\n )\n console.error(\n ` digest ${digest} · ${manifest.regions.length} regions · ${manifest.inputs.length} inputs`,\n )\n } else {\n // Body to stdout (pipeable); summary to stderr.\n process.stdout.write(rendered)\n console.error(\n ` digest ${digest} · ${manifest.regions.length} regions · ${manifest.inputs.length} inputs`,\n )\n }\n}\n","// `aef add <adapter>` / `aef remove <adapter>` — change an axis selection in a\n// consumer's framework.config.json and reconcile the installed skill set:\n// • newly-selected skills are rendered fresh (+ BASE snapshot),\n// • skills no longer selected are uninstalled (skill dir, BASE, harness links),\n// • surviving skills are 3-way merged (like sync) so adapter-content changes flow in\n// without clobbering local edits.\n// The adapter's axis is read from its adapter.json, so the command is `add <name>`.\nimport { readFileSync, writeFileSync, existsSync, rmSync, cpSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema, type FrameworkConfig } from '../../core/contracts.js'\nimport { selectSkills, loadTiers } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { writeManifest, wireHarnesses, harnessSkillsDir, type ManifestSkills } from '../consumer-io.js'\nimport { reconcileSkill } from '../reconcile.js'\n\nconst AXES = ['orm', 'ui', 'stack', 'harness'] as const\n\ninterface ManifestFile {\n selection: unknown\n skills: ManifestSkills\n}\n\nexport interface AdapterCmdOptions {\n out?: string\n copy?: boolean\n}\n\n/** Find which axis an adapter name belongs to by locating its adapter.json on disk. */\nfunction resolveAxis(root: string, name: string): (typeof AXES)[number] {\n for (const axis of AXES) {\n if (existsSync(join(root, 'adapters', axis, name, 'adapter.json'))) return axis\n }\n throw new Error(`no adapter '${name}' found under adapters/{${AXES.join(',')}}/`)\n}\n\nexport function runAdd(name: string, opts: AdapterCmdOptions): void {\n mutate(name, 'add', opts)\n}\n\nexport function runRemove(name: string, opts: AdapterCmdOptions): void {\n mutate(name, 'remove', opts)\n}\n\nfunction mutate(name: string, op: 'add' | 'remove', opts: AdapterCmdOptions): void {\n const root = FRAMEWORK_ROOT\n const out = opts.out ?? join(root, 'examples/consumer')\n const useCopy = Boolean(opts.copy)\n const cfgPath = join(out, 'framework.config.json')\n\n const raw = JSON.parse(readFileSync(cfgPath, 'utf8')) as Record<string, unknown>\n const prevConfig = FrameworkConfigSchema.parse(raw)\n const prevHarnesses = [...(prevConfig.harnesses ?? [])]\n\n const tierDef = loadTiers(root)\n const isTier = name in tierDef.tiers\n\n if (isTier) {\n if (tierDef.default.includes(name))\n throw new Error(\n `tier '${name}' is a default tier — it is always active and cannot be ${op === 'add' ? 'explicitly opted in' : 'removed'}`,\n )\n const current = prevConfig.tiers ?? []\n if (op === 'add') {\n if (!current.includes(name)) raw.tiers = [...current, name]\n } else {\n if (!current.includes(name)) throw new Error(`tier '${name}' is not enabled; nothing to remove`)\n const after = current.filter((t) => t !== name)\n if (after.length > 0) raw.tiers = after\n else delete raw.tiers\n }\n } else {\n const axis = resolveAxis(root, name)\n if (axis === 'harness') {\n const list = new Set(prevHarnesses)\n if (op === 'add') {\n list.add(name)\n } else {\n if (!list.has(name)) throw new Error(`harness '${name}' is not installed; nothing to remove`)\n if (list.size === 1) throw new Error('cannot remove the last harness — at least one is required')\n list.delete(name)\n }\n raw.harnesses = [...list]\n } else if (op === 'add') {\n raw[axis] = name\n } else {\n if (raw[axis] !== name)\n throw new Error(`'${name}' is not the active ${axis} adapter; nothing to remove`)\n raw[axis] = null\n }\n }\n\n const config = FrameworkConfigSchema.parse(raw)\n writeFileSync(cfgPath, JSON.stringify(raw, null, 2) + '\\n')\n\n if (isTier && name === 'framework') {\n const outboxDst = join(out, '.ai', 'framework-feedback')\n if (op === 'add') {\n const outboxSrc = join(root, 'core', 'ai', 'framework-feedback')\n if (existsSync(outboxSrc)) cpSync(outboxSrc, outboxDst, { recursive: true })\n } else {\n rmSync(outboxDst, { recursive: true, force: true })\n }\n }\n\n const conflicts = reconcile(root, out, config, prevHarnesses, useCopy)\n const kind = isTier ? 'tier' : 'adapter'\n console.log(\n `${op === 'add' ? 'Added' : 'Removed'} ${name} (${kind}) in ${relative(process.cwd(), out) || '.'}`,\n )\n if (conflicts) {\n console.log(\n `\\n${conflicts} conflict(s) written as <<<<<<< markers — review with 'git diff', resolve, commit.`,\n )\n process.exitCode = 2\n }\n}\n\nfunction reconcile(\n root: string,\n out: string,\n config: FrameworkConfig,\n prevHarnesses: string[],\n useCopy: boolean,\n): number {\n const manifestPath = join(out, '.ai', '.render-manifest.json')\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as ManifestFile\n\n const { skills: selected } = selectSkills(root, config)\n const selectedSet = new Set(selected)\n const installed = Object.keys(manifest.skills)\n\n // Resolve each harness's skills dir once (used when removing skills and harnesses).\n const dirByHarness = new Map<string, string | null>()\n for (const h of new Set([...prevHarnesses, ...(config.harnesses ?? [])]))\n dirByHarness.set(h, harnessSkillsDir(root, h))\n\n // 1. Uninstall skills no longer selected.\n for (const s of installed) {\n if (selectedSet.has(s)) continue\n rmSync(join(out, '.ai', 'skills', s), { recursive: true, force: true })\n rmSync(join(out, '.ai', '.base', s), { recursive: true, force: true })\n delete manifest.skills[s]\n for (const dir of dirByHarness.values())\n if (dir) rmSync(join(out, dir, s), { recursive: true, force: true })\n }\n\n // 2. Install new + 3-way-merge surviving skills (shared with `sync`).\n let conflicts = 0\n for (const s of selected) {\n const r = reconcileSkill(root, out, config, s)\n manifest.skills[s] = { digest: r.digest, inputs: r.inputs }\n conflicts += r.conflicts\n }\n\n // 3. Drop skills dirs for harnesses removed entirely, then re-wire the surviving set.\n for (const h of prevHarnesses) {\n if ((config.harnesses ?? []).includes(h)) continue\n const dir = dirByHarness.get(h)\n if (dir && existsSync(join(out, dir))) rmSync(join(out, dir), { recursive: true, force: true })\n }\n wireHarnesses(root, out, config, selected, useCopy)\n\n writeManifest(out, config, manifest.skills)\n return conflicts\n}\n"],"mappings":"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","names":["readFileSync","readFileSync","writeFileSync","join","join","p","join","existsSync","join","readFileSync","join","writeFileSync","readFileSync","writeFileSync","existsSync","rmSync","join","relative","readFileSync","writeFileSync","existsSync","join","join","existsSync","readFileSync","writeFileSync","join","readFileSync","rmSync","relative","existsSync","writeFileSync","readFileSync","writeFileSync","readdirSync","existsSync","mkdirSync","rmSync","symlinkSync","join","relative","join","existsSync","readdirSync","readFileSync","mkdirSync","relative","rmSync","symlinkSync","writeFileSync","readFileSync","writeFileSync","mkdirSync","join","relative","readFileSync","join","mkdirSync","writeFileSync","relative","readFileSync","writeFileSync","existsSync","rmSync","cpSync","join","relative","existsSync","join","readFileSync","writeFileSync","cpSync","rmSync","relative","readFileSync"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/root.ts","../../src/cli/consumer-io.ts","../../src/cli/wizard.ts","../../src/cli/commands/sync.ts","../../src/cli/reconcile.ts","../../src/cli/commands/dev.ts","../../src/cli/commands/render.ts","../../src/cli/commands/adapter.ts"],"sourcesContent":["#!/usr/bin/env node\n// aef — CLI for the Agentic Engineering Framework.\n//\n// aef init [--config <cfg>] [--out <dir>] [--copy] [--interactive]\n// aef sync [--out <dir>]\n// aef add <adapter> [--out <dir>] [--copy]\n// aef remove <adapter> [--out <dir>] [--copy]\n// aef dev\nimport { readFileSync } from 'node:fs'\nimport { Command } from 'commander'\nimport { ZodError, ZodIssueCode } from 'zod'\nimport { runInit } from './commands/init.js'\nimport { runSync } from './commands/sync.js'\nimport { runDev } from './commands/dev.js'\nimport { runRender } from './commands/render.js'\nimport { runAdd, runRemove } from './commands/adapter.js'\nimport { FrameworkConfigSchema } from '../core/contracts.js'\n\n// Single source of truth for the version: read the package's own package.json at\n// runtime so it never drifts from release-please's bump (dev: src/cli/, built:\n// dist/cli/ — both resolve to the package root).\nconst { version } = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')) as {\n version: string\n}\n\nfunction levenshtein(a: string, b: string): number {\n const dp = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n let prev = dp[0]!\n dp[0] = i\n for (let j = 1; j <= b.length; j++) {\n const temp = dp[j]!\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, temp, dp[j - 1]!)\n prev = temp\n }\n }\n return dp[b.length]!\n}\n\nfunction suggestKey(unknown: string, valid: string[]): string | null {\n let best: string | null = null\n let bestDist = Infinity\n for (const k of valid) {\n const d = levenshtein(unknown, k)\n if (d < bestDist) {\n bestDist = d\n best = k\n }\n }\n return best !== null && bestDist / Math.max(unknown.length, best.length) <= 0.4 ? best : null\n}\n\nconst program = new Command()\n\nprogram\n .name('aef')\n .description('Render slot-based engineering skills into a consumer repo and keep them in sync.')\n .version(version)\n\nprogram\n .command('init')\n .description('Render the configured skill set into a consumer repo and wire harnesses.')\n .option('--config <path>', 'path to framework.config.json (required unless --interactive)')\n .option('--out <dir>', 'consumer directory to write into (default: current directory)')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .option('-i, --interactive', 'build the config interactively via prompts')\n .action((opts) => runInit(opts))\n\nprogram\n .command('render')\n .description('Render a single skill to stdout (or --out <dir>) for inspection.')\n .requiredOption('--skill <name>', 'skill id to render')\n .option('--config <path>', 'path to framework.config.json (required)')\n .option('--out <dir>', 'write SKILL.md + provenance.json under <dir>/<skill>/ instead of stdout')\n .action((opts) => runRender(opts))\n\nprogram\n .command('sync')\n .description('Re-render from framework source and reconcile with local edits (3-way merge).')\n .option('--out <dir>', 'consumer directory to sync (default: current directory)')\n .action((opts) => runSync(opts))\n\nprogram\n .command('add')\n .argument('<adapter>', 'adapter name to select (axis inferred from its adapter.json)')\n .description('Select an adapter and reconcile the installed skill set (merges local edits).')\n .option('--out <dir>', 'consumer directory to update')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .action((adapter, opts) => runAdd(adapter, opts))\n\nprogram\n .command('remove')\n .argument('<adapter>', 'adapter name to deselect (axis inferred from its adapter.json)')\n .description('Deselect an adapter; uninstalls skills that required its axis.')\n .option('--out <dir>', 'consumer directory to update')\n .option('--copy', 'copy rendered skills into harness dirs instead of symlinking')\n .action((adapter, opts) => runRemove(adapter, opts))\n\nprogram\n .command('dev')\n .description('Meta-install: wire this repo’s harness dirs to dev/ skills for framework development.')\n .action(() => runDev())\n\nconst validRootKeys = Object.keys(FrameworkConfigSchema.shape)\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (err instanceof ZodError) {\n console.error('Invalid configuration:')\n for (const issue of err.issues) {\n if (issue.code === ZodIssueCode.unrecognized_keys && issue.path.length === 0) {\n for (const key of issue.keys) {\n const suggestion = suggestKey(key, validRootKeys)\n const hint = suggestion != null ? ` Did you mean '${suggestion}'?` : ''\n console.error(` - Unknown key '${key}'.${hint}`)\n }\n console.error(` Valid keys: ${validRootKeys.join(', ')}`)\n } else {\n console.error(` - ${issue.path.join('.') || '(root)'}: ${issue.message}`)\n }\n }\n } else {\n console.error(err instanceof Error ? err.message : String(err))\n }\n process.exit(1)\n})\n","// `aef init` — render the configured skill set into <out>/.ai/skills/, snapshot a\n// BASE under <out>/.ai/.base/, write the render manifest (sync's base), persist the\n// resolved config, and wire each harness.\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport {\n writeSkill,\n writeBase,\n writeManifest,\n wireHarnesses,\n writeConventions,\n pinAefInPackageJson,\n type ManifestSkills,\n} from '../consumer-io.js'\nimport { runWizard } from '../wizard.js'\n\nexport interface InitOptions {\n config?: string\n out?: string\n copy?: boolean\n interactive?: boolean\n}\n\nexport async function runInit(opts: InitOptions): Promise<void> {\n const root = FRAMEWORK_ROOT\n\n if (opts.config && opts.interactive) {\n throw new Error(\n `--config and --interactive are mutually exclusive. Pass --config to use a file or --interactive to build one via prompts.`,\n )\n }\n if (!opts.config && !opts.interactive) {\n throw new Error(\n `--config is required.\\n\\nUsage: aef init --config framework.config.json --out . --copy\\n\\nTo get started, create a framework.config.json. Minimum required:\\n {\\n \"harnesses\": [\"claude-code\"]\\n }\\n\\nRun 'aef init --help' for all options.`,\n )\n }\n\n // `raw` is what we persist to framework.config.json (byte-stable); `config` is the\n // zod-validated view the renderer consumes.\n const raw: unknown = opts.interactive\n ? await runWizard(root)\n : JSON.parse(readFileSync(opts.config!, 'utf8'))\n const config = FrameworkConfigSchema.parse(raw)\n\n const out = opts.out ?? process.cwd()\n const useCopy = Boolean(opts.copy)\n\n const { skills, skipped } = selectSkills(root, config)\n\n const manifestSkills: ManifestSkills = {}\n for (const skill of skills) {\n const { rendered, manifest, digest } = renderSkill(root, config, skill)\n writeSkill(out, skill, rendered, manifest)\n writeBase(out, skill, rendered)\n manifestSkills[skill] = { digest, inputs: manifest.inputs }\n }\n writeManifest(out, config, manifestSkills)\n writeFileSync(join(out, 'framework.config.json'), JSON.stringify(raw, null, 2) + '\\n')\n\n const conventions = writeConventions(root, out, config)\n const wired = wireHarnesses(root, out, config, skills, useCopy)\n\n const { version } = JSON.parse(readFileSync(join(FRAMEWORK_ROOT, 'package.json'), 'utf8')) as {\n version: string\n }\n const pkgNote = pinAefInPackageJson(out, version)\n\n console.log(`Initialised agentic framework into ${relative(process.cwd(), out) || '.'}`)\n console.log(` skills installed: ${skills.join(', ') || '(none)'}`)\n console.log(` conventions: ${conventions.join(', ')}`)\n if (skipped.length) console.log(` skipped (axis not configured): ${skipped.join(', ')}`)\n console.log(` harnesses wired: ${wired.join(' | ') || '(none)'}`)\n console.log(` package.json: ${pkgNote}`)\n}\n","import { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\n\n// The framework SOURCE root (where core/, adapters/, schemas/ live). Resolves the\n// same whether running from src/cli/ via tsx or from dist/cli/ after a build —\n// both are two levels below the package root.\nexport const FRAMEWORK_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..')\n","// Filesystem side of init/sync: writing a consumer's .ai/ tree and wiring harnesses.\n// Kept separate from the command wiring so the behaviour is unit-testable.\nimport {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n lstatSync,\n rmSync,\n cpSync,\n symlinkSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { AdapterSchema, type FrameworkConfig } from '../core/contracts.js'\nimport type { InputRef, RenderManifest } from '../core/render.js'\n\nexport const isLink = (p: string): boolean => {\n try {\n return lstatSync(p).isSymbolicLink()\n } catch {\n return false\n }\n}\n\nexport function pick<T extends Record<string, unknown>>(o: T, keys: string[]): Record<string, unknown> {\n const r: Record<string, unknown> = {}\n for (const k of keys) if (k in o) r[k] = o[k]\n return r\n}\n\n/**\n * Install the generic `core/ai` conventions into a consumer: the specs/qa/runs scaffolding,\n * a starter lessons.md, a CLAUDE.md, and AGENTS.md rendered from the template with\n * {{PROJECT_NAME}} substituted. Idempotent — safe to re-run. Returns the paths written.\n */\nexport function writeConventions(root: string, out: string, config: FrameworkConfig): string[] {\n const projectName = config.projectName ?? 'your project'\n const sub = (s: string): string => s.split('{{PROJECT_NAME}}').join(projectName)\n const ai = join(out, '.ai')\n mkdirSync(ai, { recursive: true })\n const written: string[] = []\n\n for (const dir of ['specs', 'qa', 'runs']) {\n const src = join(root, 'core', 'ai', dir)\n if (existsSync(src)) {\n cpSync(src, join(ai, dir), { recursive: true })\n written.push(`.ai/${dir}/`)\n }\n }\n // Substitute {{PROJECT_NAME}} in the one convention file that carries it.\n const specsReadme = join(ai, 'specs', 'README.md')\n if (existsSync(specsReadme)) writeFileSync(specsReadme, sub(readFileSync(specsReadme, 'utf8')))\n\n const lessonsSrc = join(root, 'core', 'ai', 'lessons.md')\n if (existsSync(lessonsSrc)) {\n writeFileSync(join(ai, 'lessons.md'), sub(readFileSync(lessonsSrc, 'utf8')))\n written.push('.ai/lessons.md')\n }\n // Synced-read-only generic lessons.\n const fwLessons = join(root, 'core', 'ai', 'lessons.framework.md')\n if (existsSync(fwLessons)) {\n writeFileSync(join(ai, 'lessons.framework.md'), readFileSync(fwLessons, 'utf8'))\n written.push('.ai/lessons.framework.md')\n }\n // Framework-feedback outbox: only for consumers who have opted in to the framework tier.\n const outbox = join(root, 'core', 'ai', 'framework-feedback')\n if (existsSync(outbox) && config.tiers?.includes('framework')) {\n cpSync(outbox, join(ai, 'framework-feedback'), { recursive: true })\n written.push('.ai/framework-feedback/')\n }\n\n const tpl = join(root, 'core', 'AGENTS.md.template')\n if (existsSync(tpl)) {\n writeFileSync(join(out, 'AGENTS.md'), sub(readFileSync(tpl, 'utf8')))\n written.push('AGENTS.md')\n }\n writeFileSync(join(out, 'CLAUDE.md'), '@AGENTS.md\\n')\n written.push('CLAUDE.md')\n return written\n}\n\nexport function writeSkill(out: string, skill: string, rendered: string, manifest: RenderManifest): void {\n const dest = join(out, '.ai', 'skills', skill)\n mkdirSync(dest, { recursive: true })\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n writeFileSync(join(dest, 'provenance.json'), JSON.stringify(manifest, null, 2) + '\\n')\n}\n\nexport function writeBase(out: string, skill: string, rendered: string): void {\n const d = join(out, '.ai', '.base', skill)\n mkdirSync(d, { recursive: true })\n writeFileSync(join(d, 'SKILL.md'), rendered)\n}\n\nexport type ManifestSkills = Record<string, { digest: string; inputs: InputRef[] }>\n\nexport function writeManifest(out: string, config: FrameworkConfig, skills: ManifestSkills): void {\n mkdirSync(join(out, '.ai'), { recursive: true })\n writeFileSync(\n join(out, '.ai', '.render-manifest.json'),\n JSON.stringify(\n { selection: pick(config, ['orm', 'ui', 'stack', 'harnesses', 'tiers']), skills },\n null,\n 2,\n ) + '\\n',\n )\n}\n\nexport function harnessSkillsDir(root: string, harness: string): string | null {\n const p = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(p)) return null\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(p, 'utf8')))\n return ad.skillsDir ?? null\n}\n\nexport function wireNewSkills(root: string, out: string, config: FrameworkConfig, skills: string[]): void {\n for (const harness of config.harnesses) {\n const adPath = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(adPath)) continue\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(adPath, 'utf8')))\n if (!ad.skillsDir || !ad.linkBase) continue\n const hdir = join(out, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n for (const skill of skills) {\n const link = join(hdir, skill)\n if (!existsSync(link) && !isLink(link)) symlinkSync(`${ad.linkBase}/${skill}`, link)\n }\n }\n}\n\nfunction detectIndent(json: string): string | number {\n const m = json.match(/^\\s*[{[]\\r?\\n([ \\t]+)/)\n return m ? m[1]! : 2\n}\n\n/**\n * Upsert `@zizzfizzix/aef@^<version>` into the consumer's `package.json` devDependencies\n * and add an `\"aef\": \"aef\"` script so collaborators can run `pnpm aef sync` without a\n * global or npx-resolved binary. Preserves existing indentation. Returns a human-readable\n * note for the init/sync summary line. Silently skips (with a hint) when no package.json\n * is present; throws a friendly error when the file is present but malformed.\n */\nexport function pinAefInPackageJson(out: string, version: string): string {\n const pkgPath = join(out, 'package.json')\n if (!existsSync(pkgPath)) {\n return `no package.json found — run: pnpm add -D @zizzfizzix/aef@^${version}`\n }\n const raw = readFileSync(pkgPath, 'utf8')\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(raw) as Record<string, unknown>\n } catch (e) {\n throw new Error(`Failed to parse ${pkgPath}: ${e instanceof Error ? e.message : String(e)}`)\n }\n const indent = detectIndent(raw)\n const scripts = (pkg['scripts'] as Record<string, string> | undefined) ?? {}\n const devDeps = (pkg['devDependencies'] as Record<string, string> | undefined) ?? {}\n const wasPresent = '@zizzfizzix/aef' in devDeps\n scripts['aef'] = 'aef'\n devDeps['@zizzfizzix/aef'] = `^${version}`\n pkg['scripts'] = scripts\n pkg['devDependencies'] = devDeps\n writeFileSync(pkgPath, JSON.stringify(pkg, null, indent) + '\\n')\n return wasPresent\n ? `updated @zizzfizzix/aef to ^${version} in devDependencies`\n : `added @zizzfizzix/aef@^${version} to devDependencies — run \\`pnpm install\\` then \\`pnpm aef --help\\``\n}\n\nexport function wireHarnesses(\n root: string,\n out: string,\n config: FrameworkConfig,\n skills: string[],\n useCopy: boolean,\n): string[] {\n const aiSkills = join(out, '.ai', 'skills')\n const wired: string[] = []\n for (const harness of config.harnesses) {\n const adPath = join(root, 'adapters', 'harness', harness, 'adapter.json')\n if (!existsSync(adPath)) {\n console.warn(`! no harness adapter '${harness}', skipping`)\n continue\n }\n const ad = AdapterSchema.parse(JSON.parse(readFileSync(adPath, 'utf8')))\n if (!ad.skillsDir || !ad.linkBase) {\n console.warn(`! harness adapter '${harness}' is missing skillsDir/linkBase, skipping`)\n continue\n }\n const hdir = join(out, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n for (const skill of skills) {\n const link = join(hdir, skill)\n if (existsSync(link) || isLink(link)) rmSync(link, { recursive: true, force: true })\n if (useCopy) cpSync(join(aiSkills, skill), link, { recursive: true })\n else symlinkSync(`${ad.linkBase}/${skill}`, link)\n }\n wired.push(`${harness} -> ${ad.skillsDir} (${useCopy ? 'copy' : 'symlink'})`)\n }\n return wired\n}\n","// Interactive `init` wizard (opt-in via --interactive). Discovers the available\n// adapters on disk and builds a framework.config object via @clack/prompts.\nimport { readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\n\nfunction listAdapters(root: string, axis: string): string[] {\n const dir = join(root, 'adapters', axis)\n if (!existsSync(dir)) return []\n return readdirSync(dir).filter((n) => existsSync(join(dir, n, 'adapter.json')))\n}\n\nfunction bail<T>(value: T | symbol): T {\n if (p.isCancel(value)) {\n p.cancel('Cancelled — nothing written.')\n process.exit(1)\n }\n return value as T\n}\n\nconst axisOptions = (root: string, axis: string): { value: string | null; label: string }[] => [\n { value: null, label: 'none' },\n ...listAdapters(root, axis).map((v) => ({ value: v, label: v })),\n]\n\nexport async function runWizard(root: string): Promise<Record<string, unknown>> {\n p.intro('aef init')\n\n const projectName = bail(\n await p.text({ message: 'Project name', placeholder: 'my-app', defaultValue: 'my-app' }),\n )\n const harnesses = bail(\n await p.multiselect({\n message: 'Which AI harnesses should be wired?',\n options: listAdapters(root, 'harness').map((v) => ({ value: v, label: v })),\n required: true,\n }),\n )\n const orm = bail(\n await p.select({ message: 'ORM adapter', options: axisOptions(root, 'orm'), initialValue: null }),\n )\n const ui = bail(\n await p.select({ message: 'UI adapter', options: axisOptions(root, 'ui'), initialValue: null }),\n )\n\n p.outro('Configuration ready.')\n\n return {\n $schema: './schemas/framework.config.schema.json',\n projectName,\n harnesses,\n orm,\n ui,\n }\n}\n","// `aef sync` — re-render from the (updated) framework source and reconcile with\n// local edits via a git-native 3-way merge (BASE = last render, LOCAL = on-disk,\n// NEW = fresh render). Exit code 2 signals unresolved conflicts written to the tree.\nimport { readFileSync, writeFileSync, existsSync, rmSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { reconcileSkill, type ReconcileStatus } from '../reconcile.js'\nimport {\n writeManifest,\n wireNewSkills,\n harnessSkillsDir,\n pinAefInPackageJson,\n type ManifestSkills,\n} from '../consumer-io.js'\n\ninterface RenderManifestFile {\n selection: unknown\n skills: ManifestSkills\n}\n\nconst REPORT: Record<ReconcileStatus, (s: string) => string> = {\n installed: (s) => ` + ${s}: installed`,\n unchanged: (s) => ` = ${s}: framework unchanged`,\n forwarded: (s) => ` ↑ ${s}: updated (no local edits)`,\n merged: (s) => ` ⇄ ${s}: merged local edits + framework update (clean)`,\n conflict: (s) => ` ⇄ ${s}: merged — CONFLICT(S), resolve in working tree`,\n}\n\nexport interface SyncOptions {\n out?: string\n}\n\nexport function runSync(opts: SyncOptions): void {\n const root = FRAMEWORK_ROOT\n const out = opts.out ?? process.cwd()\n const config = FrameworkConfigSchema.parse(\n JSON.parse(readFileSync(join(out, 'framework.config.json'), 'utf8')),\n )\n const manifestPath = join(out, '.ai', '.render-manifest.json')\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as RenderManifestFile\n\n const { skills: desired } = selectSkills(root, config)\n const desiredSet = new Set(desired)\n const installed = Object.keys(manifest.skills)\n\n const harnessDirs = new Map<string, string | null>()\n for (const h of config.harnesses) harnessDirs.set(h, harnessSkillsDir(root, h))\n\n // Remove skills no longer in the desired set (tier removed or axis cleared).\n for (const s of installed) {\n if (desiredSet.has(s)) continue\n rmSync(join(out, '.ai', 'skills', s), { recursive: true, force: true })\n rmSync(join(out, '.ai', '.base', s), { recursive: true, force: true })\n delete manifest.skills[s]\n for (const dir of harnessDirs.values())\n if (dir) rmSync(join(out, dir, s), { recursive: true, force: true })\n }\n\n const report: string[] = []\n let conflicts = 0\n const newSkills: string[] = []\n for (const skill of desired) {\n const isNew = !manifest.skills[skill]\n const r = reconcileSkill(root, out, config, skill)\n manifest.skills[skill] = { digest: r.digest, inputs: r.inputs }\n conflicts += r.conflicts\n report.push(REPORT[r.status](skill))\n if (isNew) newSkills.push(skill)\n }\n\n if (newSkills.length > 0) wireNewSkills(root, out, config, newSkills)\n\n writeManifest(out, config, manifest.skills)\n\n console.log(`Synced ${relative(process.cwd(), out) || '.'} from framework source`)\n // Refresh synced read-only framework lessons (loop closure, decision #8).\n const fwLessonsSrc = join(root, 'core', 'ai', 'lessons.framework.md')\n if (existsSync(fwLessonsSrc)) {\n const dest = join(out, '.ai', 'lessons.framework.md')\n const next = readFileSync(fwLessonsSrc, 'utf8')\n if (!existsSync(dest) || readFileSync(dest, 'utf8') !== next) {\n writeFileSync(dest, next)\n report.push(' ↑ lessons.framework.md: refreshed (synced, read-only)')\n }\n }\n\n report.forEach((l) => console.log(l))\n\n const { version } = JSON.parse(readFileSync(join(FRAMEWORK_ROOT, 'package.json'), 'utf8')) as {\n version: string\n }\n console.log(` package.json: ${pinAefInPackageJson(out, version)}`)\n\n if (conflicts) {\n console.log(\n `\\n${conflicts} conflict(s) written as <<<<<<< markers. Review with 'git diff', resolve, commit.`,\n )\n process.exitCode = 2\n }\n}\n","// Shared per-skill reconcile: render a skill from the current framework source and\n// fold the result into a consumer, preserving local edits via a git-native 3-way merge.\n// Used by both `aef sync` and `aef add`/`remove` so the reconcile semantics —\n// fast-forward, clean merge, conflict, and provenance refresh — live in exactly one place.\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { renderSkill, type InputRef } from '../core/render.js'\nimport { mergeFile } from '../core/merge.js'\nimport type { FrameworkConfig } from '../core/contracts.js'\nimport { writeSkill, writeBase } from './consumer-io.js'\n\nexport type ReconcileStatus = 'installed' | 'unchanged' | 'forwarded' | 'merged' | 'conflict'\n\nexport interface ReconcileResult {\n status: ReconcileStatus\n digest: string\n inputs: InputRef[]\n conflicts: number\n}\n\n/**\n * Reconcile one skill in `out` against the current render:\n * - not yet on disk → install fresh (+ BASE),\n * - framework unchanged → leave LOCAL alone (local edits kept),\n * - framework changed, no edits → fast-forward to NEW,\n * - both changed → 3-way merge (conflicts land as <<<<<<< markers).\n * Always refreshes provenance.json to the fresh render and returns the new digest/inputs\n * so the caller can update the render manifest.\n */\nexport function reconcileSkill(\n root: string,\n out: string,\n config: FrameworkConfig,\n skill: string,\n): ReconcileResult {\n const { rendered: NEW, manifest, digest } = renderSkill(root, config, skill)\n const skillMd = join(out, '.ai', 'skills', skill, 'SKILL.md')\n\n if (!existsSync(skillMd)) {\n writeSkill(out, skill, NEW, manifest)\n writeBase(out, skill, NEW)\n return { status: 'installed', digest, inputs: manifest.inputs, conflicts: 0 }\n }\n\n const baseMd = join(out, '.ai', '.base', skill, 'SKILL.md')\n const BASE = existsSync(baseMd) ? readFileSync(baseMd, 'utf8') : NEW\n const LOCAL = readFileSync(skillMd, 'utf8')\n\n let status: ReconcileStatus = 'unchanged'\n let conflicts = 0\n if (NEW !== BASE) {\n if (LOCAL === BASE) {\n writeFileSync(skillMd, NEW)\n status = 'forwarded'\n } else {\n const { merged, conflicts: n } = mergeFile(LOCAL, BASE, NEW)\n writeFileSync(skillMd, merged)\n conflicts = n\n status = n ? 'conflict' : 'merged'\n }\n writeBase(out, skill, NEW)\n }\n // Provenance always tracks the fresh render (improve-framework reads it to route edits).\n writeFileSync(\n join(out, '.ai', 'skills', skill, 'provenance.json'),\n JSON.stringify(manifest, null, 2) + '\\n',\n )\n return { status, digest, inputs: manifest.inputs, conflicts }\n}\n","// `aef dev` — the \"meta\" install for developing THIS framework. Wires the repo's\n// own harness skill dirs to dev/ skills (source symlinks) and renders shipped skills\n// from dev/framework.config.json into the same dirs. Harness dirs are gitignored.\nimport { readFileSync, writeFileSync, readdirSync, existsSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { AdapterSchema, FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { selectSkills } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { isLink } from '../consumer-io.js'\n\nexport function runDev(root: string = FRAMEWORK_ROOT): void {\n const devSkillsDir = join(root, 'dev', 'skills')\n if (!existsSync(devSkillsDir)) {\n console.error('no dev/skills/ found')\n process.exit(1)\n }\n const devSkills = readdirSync(devSkillsDir).filter((d) => existsSync(join(devSkillsDir, d, 'SKILL.md')))\n\n const devConfigPath = join(root, 'dev', 'framework.config.json')\n if (!existsSync(devConfigPath)) {\n console.error('no dev/framework.config.json found — run from the framework root')\n process.exit(1)\n }\n const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync(devConfigPath, 'utf8')))\n const devSkillNames = new Set(devSkills)\n const { skills: allShipped, skipped } = selectSkills(root, config)\n const shippedSkills = allShipped.filter((s) => !devSkillNames.has(s))\n\n const harnessRoot = join(root, 'adapters', 'harness')\n const harnesses = readdirSync(harnessRoot).filter((d) => existsSync(join(harnessRoot, d, 'adapter.json')))\n\n const wired: string[] = []\n for (const harness of harnesses) {\n const ad = AdapterSchema.parse(\n JSON.parse(readFileSync(join(harnessRoot, harness, 'adapter.json'), 'utf8')),\n )\n if (!ad.skillsDir) continue\n const hdir = join(root, ad.skillsDir)\n mkdirSync(hdir, { recursive: true })\n\n // Dev skills: symlink so edits to SKILL.md are immediately reflected.\n const target = relative(hdir, devSkillsDir)\n for (const skill of devSkills) {\n const link = join(hdir, skill)\n if (existsSync(link) || isLink(link)) rmSync(link, { recursive: true, force: true })\n symlinkSync(join(target, skill), link)\n }\n\n // Shipped skills: render with the dev config and write SKILL.md directly.\n for (const skill of shippedSkills) {\n const dest = join(hdir, skill)\n if (existsSync(dest) || isLink(dest)) rmSync(dest, { recursive: true, force: true })\n mkdirSync(dest, { recursive: true })\n const { rendered } = renderSkill(root, config, skill)\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n }\n\n wired.push(`${harness} -> ${ad.skillsDir}`)\n }\n\n console.log('Framework dev install (meta):')\n console.log(` dev skills : ${devSkills.join(', ') || '(none)'}`)\n console.log(` shipped skills: ${shippedSkills.join(', ') || '(none)'}`)\n if (skipped.length) console.log(` skipped : ${skipped.join(', ')}`)\n console.log(` harnesses : ${wired.join(' | ')}`)\n console.log(' (harness dirs are gitignored; re-run after adding or changing a skill)')\n}\n","// `aef render` — render a single skill to stdout (or --out dir) for inspection.\n// The lightweight counterpart to `init`; handy while authoring skills/adapters and\n// the render step the improve-framework skill points at.\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema } from '../../core/contracts.js'\nimport { renderSkill } from '../../core/render.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\n\nexport interface RenderOptions {\n skill: string\n config?: string\n out?: string\n}\n\nexport function runRender(opts: RenderOptions): void {\n if (!opts.config) {\n throw new Error(\n `--config is required.\\n\\nUsage: aef render --skill <name> --config framework.config.json\\n\\nRun 'aef render --help' for all options.`,\n )\n }\n const root = FRAMEWORK_ROOT\n const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync(opts.config, 'utf8')))\n const { rendered, manifest, digest } = renderSkill(root, config, opts.skill)\n\n if (opts.out) {\n const dest = join(opts.out, opts.skill)\n mkdirSync(dest, { recursive: true })\n writeFileSync(join(dest, 'SKILL.md'), rendered)\n writeFileSync(join(dest, 'provenance.json'), JSON.stringify(manifest, null, 2) + '\\n')\n console.error(\n `Rendered '${opts.skill}' (orm=${manifest.selection.orm ?? 'none'}) -> ${relative(root, dest)}`,\n )\n console.error(\n ` digest ${digest} · ${manifest.regions.length} regions · ${manifest.inputs.length} inputs`,\n )\n } else {\n // Body to stdout (pipeable); summary to stderr.\n process.stdout.write(rendered)\n console.error(\n ` digest ${digest} · ${manifest.regions.length} regions · ${manifest.inputs.length} inputs`,\n )\n }\n}\n","// `aef add <adapter>` / `aef remove <adapter>` — change an axis selection in a\n// consumer's framework.config.json and reconcile the installed skill set:\n// • newly-selected skills are rendered fresh (+ BASE snapshot),\n// • skills no longer selected are uninstalled (skill dir, BASE, harness links),\n// • surviving skills are 3-way merged (like sync) so adapter-content changes flow in\n// without clobbering local edits.\n// The adapter's axis is read from its adapter.json, so the command is `add <name>`.\nimport { readFileSync, writeFileSync, existsSync, rmSync, cpSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { FrameworkConfigSchema, type FrameworkConfig } from '../../core/contracts.js'\nimport { selectSkills, loadTiers } from '../../core/select.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport {\n writeManifest,\n wireHarnesses,\n harnessSkillsDir,\n pinAefInPackageJson,\n type ManifestSkills,\n} from '../consumer-io.js'\nimport { reconcileSkill } from '../reconcile.js'\n\nconst AXES = ['orm', 'ui', 'stack', 'harness'] as const\n\ninterface ManifestFile {\n selection: unknown\n skills: ManifestSkills\n}\n\nexport interface AdapterCmdOptions {\n out?: string\n copy?: boolean\n}\n\n/** Find which axis an adapter name belongs to by locating its adapter.json on disk. */\nfunction resolveAxis(root: string, name: string): (typeof AXES)[number] {\n for (const axis of AXES) {\n if (existsSync(join(root, 'adapters', axis, name, 'adapter.json'))) return axis\n }\n throw new Error(`no adapter '${name}' found under adapters/{${AXES.join(',')}}/`)\n}\n\nexport function runAdd(name: string, opts: AdapterCmdOptions): void {\n mutate(name, 'add', opts)\n}\n\nexport function runRemove(name: string, opts: AdapterCmdOptions): void {\n mutate(name, 'remove', opts)\n}\n\nfunction mutate(name: string, op: 'add' | 'remove', opts: AdapterCmdOptions): void {\n const root = FRAMEWORK_ROOT\n const out = opts.out ?? join(root, 'examples/consumer')\n const useCopy = Boolean(opts.copy)\n const cfgPath = join(out, 'framework.config.json')\n\n const raw = JSON.parse(readFileSync(cfgPath, 'utf8')) as Record<string, unknown>\n const prevConfig = FrameworkConfigSchema.parse(raw)\n const prevHarnesses = [...(prevConfig.harnesses ?? [])]\n\n const tierDef = loadTiers(root)\n const isTier = name in tierDef.tiers\n\n if (isTier) {\n if (tierDef.default.includes(name))\n throw new Error(\n `tier '${name}' is a default tier — it is always active and cannot be ${op === 'add' ? 'explicitly opted in' : 'removed'}`,\n )\n const current = prevConfig.tiers ?? []\n if (op === 'add') {\n if (!current.includes(name)) raw.tiers = [...current, name]\n } else {\n if (!current.includes(name)) throw new Error(`tier '${name}' is not enabled; nothing to remove`)\n const after = current.filter((t) => t !== name)\n if (after.length > 0) raw.tiers = after\n else delete raw.tiers\n }\n } else {\n const axis = resolveAxis(root, name)\n if (axis === 'harness') {\n const list = new Set(prevHarnesses)\n if (op === 'add') {\n list.add(name)\n } else {\n if (!list.has(name)) throw new Error(`harness '${name}' is not installed; nothing to remove`)\n if (list.size === 1) throw new Error('cannot remove the last harness — at least one is required')\n list.delete(name)\n }\n raw.harnesses = [...list]\n } else if (op === 'add') {\n raw[axis] = name\n } else {\n if (raw[axis] !== name)\n throw new Error(`'${name}' is not the active ${axis} adapter; nothing to remove`)\n raw[axis] = null\n }\n }\n\n const config = FrameworkConfigSchema.parse(raw)\n writeFileSync(cfgPath, JSON.stringify(raw, null, 2) + '\\n')\n\n if (isTier && name === 'framework') {\n const outboxDst = join(out, '.ai', 'framework-feedback')\n if (op === 'add') {\n const outboxSrc = join(root, 'core', 'ai', 'framework-feedback')\n if (existsSync(outboxSrc)) cpSync(outboxSrc, outboxDst, { recursive: true })\n } else {\n rmSync(outboxDst, { recursive: true, force: true })\n }\n }\n\n const conflicts = reconcile(root, out, config, prevHarnesses, useCopy)\n const kind = isTier ? 'tier' : 'adapter'\n console.log(\n `${op === 'add' ? 'Added' : 'Removed'} ${name} (${kind}) in ${relative(process.cwd(), out) || '.'}`,\n )\n\n const { version } = JSON.parse(readFileSync(join(FRAMEWORK_ROOT, 'package.json'), 'utf8')) as {\n version: string\n }\n console.log(` package.json: ${pinAefInPackageJson(out, version)}`)\n\n if (conflicts) {\n console.log(\n `\\n${conflicts} conflict(s) written as <<<<<<< markers — review with 'git diff', resolve, commit.`,\n )\n process.exitCode = 2\n }\n}\n\nfunction reconcile(\n root: string,\n out: string,\n config: FrameworkConfig,\n prevHarnesses: string[],\n useCopy: boolean,\n): number {\n const manifestPath = join(out, '.ai', '.render-manifest.json')\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as ManifestFile\n\n const { skills: selected } = selectSkills(root, config)\n const selectedSet = new Set(selected)\n const installed = Object.keys(manifest.skills)\n\n // Resolve each harness's skills dir once (used when removing skills and harnesses).\n const dirByHarness = new Map<string, string | null>()\n for (const h of new Set([...prevHarnesses, ...(config.harnesses ?? [])]))\n dirByHarness.set(h, harnessSkillsDir(root, h))\n\n // 1. Uninstall skills no longer selected.\n for (const s of installed) {\n if (selectedSet.has(s)) continue\n rmSync(join(out, '.ai', 'skills', s), { recursive: true, force: true })\n rmSync(join(out, '.ai', '.base', s), { recursive: true, force: true })\n delete manifest.skills[s]\n for (const dir of dirByHarness.values())\n if (dir) rmSync(join(out, dir, s), { recursive: true, force: true })\n }\n\n // 2. Install new + 3-way-merge surviving skills (shared with `sync`).\n let conflicts = 0\n for (const s of selected) {\n const r = reconcileSkill(root, out, config, s)\n manifest.skills[s] = { digest: r.digest, inputs: r.inputs }\n conflicts += r.conflicts\n }\n\n // 3. Drop skills dirs for harnesses removed entirely, then re-wire the surviving set.\n for (const h of prevHarnesses) {\n if ((config.harnesses ?? []).includes(h)) continue\n const dir = dirByHarness.get(h)\n if (dir && existsSync(join(out, dir))) rmSync(join(out, dir), { recursive: true, force: true })\n }\n wireHarnesses(root, out, config, selected, useCopy)\n\n writeManifest(out, config, manifest.skills)\n return conflicts\n}\n"],"mappings":"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","names":["readFileSync","readFileSync","writeFileSync","join","join","p","join","version","existsSync","join","readFileSync","writeFileSync","join","version","readFileSync","writeFileSync","existsSync","rmSync","join","relative","readFileSync","writeFileSync","existsSync","join","join","existsSync","readFileSync","writeFileSync","readFileSync","join","rmSync","relative","existsSync","writeFileSync","version","readFileSync","writeFileSync","readdirSync","existsSync","mkdirSync","rmSync","symlinkSync","join","relative","join","existsSync","readdirSync","readFileSync","mkdirSync","relative","rmSync","symlinkSync","writeFileSync","readFileSync","writeFileSync","mkdirSync","join","relative","readFileSync","join","mkdirSync","writeFileSync","relative","readFileSync","writeFileSync","existsSync","rmSync","cpSync","join","relative","existsSync","join","readFileSync","writeFileSync","cpSync","rmSync","relative","version","readFileSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zizzfizzix/aef",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Slot-based, adapter-driven engineering skills for AI coding harnesses.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -31,7 +31,8 @@
31
31
  }
32
32
  },
33
33
  "scripts": {
34
- "cli": "tsx src/cli/index.ts",
34
+ "aef": "tsx src/cli/index.ts",
35
+ "cli": "pnpm aef",
35
36
  "build": "tsup",
36
37
  "test": "vitest run",
37
38
  "test:watch": "vitest",