@zizzfizzix/aef 0.2.0 → 0.4.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
@@ -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`;
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
  `
@@ -349,16 +381,24 @@ ${conflicts} conflict(s) written as <<<<<<< markers. Review with 'git diff', res
349
381
  }
350
382
 
351
383
  // 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";
384
+ 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
385
  import { join as join7, relative as relative3 } from "path";
354
- function runDev() {
355
- const root = FRAMEWORK_ROOT;
386
+ function runDev(root = FRAMEWORK_ROOT) {
356
387
  const devSkillsDir = join7(root, "dev", "skills");
357
388
  if (!existsSync5(devSkillsDir)) {
358
389
  console.error("no dev/skills/ found");
359
390
  process.exit(1);
360
391
  }
361
392
  const devSkills = readdirSync2(devSkillsDir).filter((d) => existsSync5(join7(devSkillsDir, d, "SKILL.md")));
393
+ const devConfigPath = join7(root, "dev", "framework.config.json");
394
+ if (!existsSync5(devConfigPath)) {
395
+ console.error("no dev/framework.config.json found \u2014 run from the framework root");
396
+ process.exit(1);
397
+ }
398
+ const config = FrameworkConfigSchema.parse(JSON.parse(readFileSync5(devConfigPath, "utf8")));
399
+ const devSkillNames = new Set(devSkills);
400
+ const { skills: allShipped, skipped } = selectSkills(root, config);
401
+ const shippedSkills = allShipped.filter((s) => !devSkillNames.has(s));
362
402
  const harnessRoot = join7(root, "adapters", "harness");
363
403
  const harnesses = readdirSync2(harnessRoot).filter((d) => existsSync5(join7(harnessRoot, d, "adapter.json")));
364
404
  const wired = [];
@@ -375,16 +415,25 @@ function runDev() {
375
415
  if (existsSync5(link) || isLink(link)) rmSync3(link, { recursive: true, force: true });
376
416
  symlinkSync2(join7(target, skill), link);
377
417
  }
418
+ for (const skill of shippedSkills) {
419
+ const dest = join7(hdir, skill);
420
+ if (existsSync5(dest) || isLink(dest)) rmSync3(dest, { recursive: true, force: true });
421
+ mkdirSync2(dest, { recursive: true });
422
+ const { rendered } = renderSkill(root, config, skill);
423
+ writeFileSync5(join7(dest, "SKILL.md"), rendered);
424
+ }
378
425
  wired.push(`${harness} -> ${ad.skillsDir}`);
379
426
  }
380
427
  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)");
428
+ console.log(` dev skills : ${devSkills.join(", ") || "(none)"}`);
429
+ console.log(` shipped skills: ${shippedSkills.join(", ") || "(none)"}`);
430
+ if (skipped.length) console.log(` skipped : ${skipped.join(", ")}`);
431
+ console.log(` harnesses : ${wired.join(" | ")}`);
432
+ console.log(" (harness dirs are gitignored; re-run after adding or changing a skill)");
384
433
  }
385
434
 
386
435
  // src/cli/commands/render.ts
387
- import { readFileSync as readFileSync6, writeFileSync as writeFileSync5, mkdirSync as mkdirSync3 } from "fs";
436
+ import { readFileSync as readFileSync6, writeFileSync as writeFileSync6, mkdirSync as mkdirSync3 } from "fs";
388
437
  import { join as join8, relative as relative4 } from "path";
389
438
  function runRender(opts) {
390
439
  if (!opts.config) {
@@ -402,8 +451,8 @@ Run 'aef render --help' for all options.`
402
451
  if (opts.out) {
403
452
  const dest = join8(opts.out, opts.skill);
404
453
  mkdirSync3(dest, { recursive: true });
405
- writeFileSync5(join8(dest, "SKILL.md"), rendered);
406
- writeFileSync5(join8(dest, "provenance.json"), JSON.stringify(manifest, null, 2) + "\n");
454
+ writeFileSync6(join8(dest, "SKILL.md"), rendered);
455
+ writeFileSync6(join8(dest, "provenance.json"), JSON.stringify(manifest, null, 2) + "\n");
407
456
  console.error(
408
457
  `Rendered '${opts.skill}' (orm=${manifest.selection.orm ?? "none"}) -> ${relative4(root, dest)}`
409
458
  );
@@ -419,7 +468,7 @@ Run 'aef render --help' for all options.`
419
468
  }
420
469
 
421
470
  // src/cli/commands/adapter.ts
422
- import { readFileSync as readFileSync7, writeFileSync as writeFileSync6, existsSync as existsSync6, rmSync as rmSync4, cpSync as cpSync2 } from "fs";
471
+ import { readFileSync as readFileSync7, writeFileSync as writeFileSync7, existsSync as existsSync6, rmSync as rmSync4, cpSync as cpSync2 } from "fs";
423
472
  import { join as join9, relative as relative5 } from "path";
424
473
  var AXES = ["orm", "ui", "stack", "harness"];
425
474
  function resolveAxis(root, name) {
@@ -479,7 +528,7 @@ function mutate(name, op, opts) {
479
528
  }
480
529
  }
481
530
  const config = FrameworkConfigSchema.parse(raw);
482
- writeFileSync6(cfgPath, JSON.stringify(raw, null, 2) + "\n");
531
+ writeFileSync7(cfgPath, JSON.stringify(raw, null, 2) + "\n");
483
532
  if (isTier && name === "framework") {
484
533
  const outboxDst = join9(out, ".ai", "framework-feedback");
485
534
  if (op === "add") {
@@ -494,6 +543,8 @@ function mutate(name, op, opts) {
494
543
  console.log(
495
544
  `${op === "add" ? "Added" : "Removed"} ${name} (${kind}) in ${relative5(process.cwd(), out) || "."}`
496
545
  );
546
+ const { version: version2 } = JSON.parse(readFileSync7(join9(FRAMEWORK_ROOT, "package.json"), "utf8"));
547
+ console.log(` package.json: ${pinAefInPackageJson(out, version2)}`);
497
548
  if (conflicts) {
498
549
  console.log(
499
550
  `
@@ -560,13 +611,13 @@ function suggestKey(unknown, valid) {
560
611
  best = k;
561
612
  }
562
613
  }
563
- 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;
564
615
  }
565
616
  var program = new Command();
566
617
  program.name("aef").description("Render slot-based engineering skills into a consumer repo and keep them in sync.").version(version);
567
- 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));
568
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));
569
- 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));
570
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));
571
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));
572
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). 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 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`\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.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Slot-based, adapter-driven engineering skills for AI coding harnesses.",
5
5
  "type": "module",
6
6
  "license": "MIT",