@zizzfizzix/aef 0.2.0 → 0.3.0

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
@@ -349,16 +349,24 @@ ${conflicts} conflict(s) written as <<<<<<< markers. Review with 'git diff', res
349
349
  }
350
350
 
351
351
  // src/cli/commands/dev.ts
352
- import { readFileSync as readFileSync5, readdirSync as readdirSync2, existsSync as existsSync5, mkdirSync as mkdirSync2, rmSync as rmSync3, symlinkSync as symlinkSync2 } from "fs";
352
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync5, readdirSync as readdirSync2, existsSync as existsSync5, mkdirSync as mkdirSync2, rmSync as rmSync3, symlinkSync as symlinkSync2 } from "fs";
353
353
  import { join as join7, relative as relative3 } from "path";
354
- function runDev() {
355
- const root = FRAMEWORK_ROOT;
354
+ function runDev(root = FRAMEWORK_ROOT) {
356
355
  const devSkillsDir = join7(root, "dev", "skills");
357
356
  if (!existsSync5(devSkillsDir)) {
358
357
  console.error("no dev/skills/ found");
359
358
  process.exit(1);
360
359
  }
361
360
  const devSkills = readdirSync2(devSkillsDir).filter((d) => existsSync5(join7(devSkillsDir, d, "SKILL.md")));
361
+ const devConfigPath = join7(root, "dev", "framework.config.json");
362
+ if (!existsSync5(devConfigPath)) {
363
+ console.error("no dev/framework.config.json found \u2014 run from the framework root");
364
+ process.exit(1);
365
+ }
366
+ const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync5(devConfigPath, "utf8")));
367
+ const devSkillNames = new Set(devSkills);
368
+ const { skills: allShipped, skipped } = selectSkills(root, config);
369
+ const shippedSkills = allShipped.filter((s) => !devSkillNames.has(s));
362
370
  const harnessRoot = join7(root, "adapters", "harness");
363
371
  const harnesses = readdirSync2(harnessRoot).filter((d) => existsSync5(join7(harnessRoot, d, "adapter.json")));
364
372
  const wired = [];
@@ -375,16 +383,25 @@ function runDev() {
375
383
  if (existsSync5(link) || isLink(link)) rmSync3(link, { recursive: true, force: true });
376
384
  symlinkSync2(join7(target, skill), link);
377
385
  }
386
+ for (const skill of shippedSkills) {
387
+ const dest = join7(hdir, skill);
388
+ if (existsSync5(dest) || isLink(dest)) rmSync3(dest, { recursive: true, force: true });
389
+ mkdirSync2(dest, { recursive: true });
390
+ const { rendered } = renderSkill(root, config, skill);
391
+ writeFileSync5(join7(dest, "SKILL.md"), rendered);
392
+ }
378
393
  wired.push(`${harness} -> ${ad.skillsDir}`);
379
394
  }
380
395
  console.log("Framework dev install (meta):");
381
- console.log(` dev skills: ${devSkills.join(", ") || "(none)"}`);
382
- console.log(` harnesses : ${wired.join(" | ")}`);
383
- console.log(" (harness dirs are gitignored; re-run after adding a dev skill)");
396
+ console.log(` dev skills : ${devSkills.join(", ") || "(none)"}`);
397
+ console.log(` shipped skills: ${shippedSkills.join(", ") || "(none)"}`);
398
+ if (skipped.length) console.log(` skipped : ${skipped.join(", ")}`);
399
+ console.log(` harnesses : ${wired.join(" | ")}`);
400
+ console.log(" (harness dirs are gitignored; re-run after adding or changing a skill)");
384
401
  }
385
402
 
386
403
  // src/cli/commands/render.ts
387
- import { readFileSync as readFileSync6, writeFileSync as writeFileSync5, mkdirSync as mkdirSync3 } from "fs";
404
+ import { readFileSync as readFileSync6, writeFileSync as writeFileSync6, mkdirSync as mkdirSync3 } from "fs";
388
405
  import { join as join8, relative as relative4 } from "path";
389
406
  function runRender(opts) {
390
407
  if (!opts.config) {
@@ -402,8 +419,8 @@ Run 'aef render --help' for all options.`
402
419
  if (opts.out) {
403
420
  const dest = join8(opts.out, opts.skill);
404
421
  mkdirSync3(dest, { recursive: true });
405
- writeFileSync5(join8(dest, "SKILL.md"), rendered);
406
- writeFileSync5(join8(dest, "provenance.json"), JSON.stringify(manifest, null, 2) + "\n");
422
+ writeFileSync6(join8(dest, "SKILL.md"), rendered);
423
+ writeFileSync6(join8(dest, "provenance.json"), JSON.stringify(manifest, null, 2) + "\n");
407
424
  console.error(
408
425
  `Rendered '${opts.skill}' (orm=${manifest.selection.orm ?? "none"}) -> ${relative4(root, dest)}`
409
426
  );
@@ -419,7 +436,7 @@ Run 'aef render --help' for all options.`
419
436
  }
420
437
 
421
438
  // src/cli/commands/adapter.ts
422
- import { readFileSync as readFileSync7, writeFileSync as writeFileSync6, existsSync as existsSync6, rmSync as rmSync4, cpSync as cpSync2 } from "fs";
439
+ import { readFileSync as readFileSync7, writeFileSync as writeFileSync7, existsSync as existsSync6, rmSync as rmSync4, cpSync as cpSync2 } from "fs";
423
440
  import { join as join9, relative as relative5 } from "path";
424
441
  var AXES = ["orm", "ui", "stack", "harness"];
425
442
  function resolveAxis(root, name) {
@@ -479,7 +496,7 @@ function mutate(name, op, opts) {
479
496
  }
480
497
  }
481
498
  const config = FrameworkConfigSchema.parse(raw);
482
- writeFileSync6(cfgPath, JSON.stringify(raw, null, 2) + "\n");
499
+ writeFileSync7(cfgPath, JSON.stringify(raw, null, 2) + "\n");
483
500
  if (isTier && name === "framework") {
484
501
  const outboxDst = join9(out, ".ai", "framework-feedback");
485
502
  if (op === "add") {
@@ -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). Installs the toolchain, not\n// the shipped product; harness dirs are gitignored.\nimport { readFileSync, readdirSync, existsSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport { AdapterSchema } from '../../core/contracts.js'\nimport { FRAMEWORK_ROOT } from '../root.js'\nimport { isLink } from '../consumer-io.js'\n\nexport function runDev(): void {\n const root = FRAMEWORK_ROOT\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 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 const target = relative(hdir, devSkillsDir) // robust relative link target\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 wired.push(`${harness} -> ${ad.skillsDir}`)\n }\n console.log('Framework dev install (meta):')\n console.log(` dev skills: ${devSkills.join(', ') || '(none)'}`)\n console.log(` harnesses : ${wired.join(' | ')}`)\n console.log(' (harness dirs are gitignored; re-run after adding a dev 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","readdirSync","existsSync","mkdirSync","rmSync","symlinkSync","join","relative","join","existsSync","readdirSync","readFileSync","mkdirSync","relative","rmSync","symlinkSync","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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zizzfizzix/aef",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Slot-based, adapter-driven engineering skills for AI coding harnesses.",
5
5
  "type": "module",
6
6
  "license": "MIT",