@avodado/cli 0.0.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -2,9 +2,10 @@
2
2
  import { Command } from 'commander';
3
3
  import pc3 from 'picocolors';
4
4
  import { useState } from 'react';
5
- import { render, Text, useApp, Box } from 'ink';
6
- import { existsSync, statSync, readFileSync } from 'fs';
7
- import { resolve, join, dirname, parse, relative, basename, extname, sep } from 'path';
5
+ import { render, Text, useApp, useInput, Box } from 'ink';
6
+ import { existsSync, readFileSync, statSync } from 'fs';
7
+ import { dirname, join, resolve, parse, relative, basename, extname, sep } from 'path';
8
+ import { fileURLToPath } from 'url';
8
9
  import { parse as parse$1 } from 'yaml';
9
10
  import { createJiti } from 'jiti';
10
11
  import { BLOCK_TYPES, parseDocument, validateDocument, resolveRefs, helpUrl } from '@avodado/core';
@@ -15,10 +16,10 @@ import { toHtml, toPdf } from '@avodado/export';
15
16
  import { createHash } from 'crypto';
16
17
  import { tmpdir } from 'os';
17
18
  import open from 'open';
18
- import { fileURLToPath } from 'url';
19
- import { parseOpenApi, openapiToMarkdown } from '@avodado/sync';
20
19
  import SelectInput from 'ink-select-input';
21
20
  import { jsx, jsxs } from 'react/jsx-runtime';
21
+ import { parseOpenApi, openapiToMarkdown } from '@avodado/sync';
22
+ import cfonts from 'cfonts';
22
23
 
23
24
  var DEFAULTS = { docsDir: "docs", outDir: "dist" };
24
25
  var CONFIG_FILES = [
@@ -243,6 +244,23 @@ async function runPreview(opts) {
243
244
  await open(out);
244
245
  return { file: out };
245
246
  }
247
+ var AI_TOOLS = [
248
+ { id: "claude", label: "Claude Code", file: "CLAUDE.md" },
249
+ { id: "cursor", label: "Cursor", file: ".cursor/rules/avodado.mdc" },
250
+ { id: "copilot", label: "GitHub Copilot", file: ".github/copilot-instructions.md" },
251
+ { id: "windsurf", label: "Windsurf", file: ".windsurfrules" }
252
+ ];
253
+ var ADAPTER_FILE = {
254
+ claude: "CLAUDE.md",
255
+ cursor: ".cursor/rules/avodado.mdc",
256
+ copilot: ".github/copilot-instructions.md",
257
+ windsurf: ".windsurfrules"
258
+ };
259
+ var BASE_FILES = [
260
+ "avodado.config.json",
261
+ "docs/getting-started.md",
262
+ ".avodado/skill/SKILL.md"
263
+ ];
246
264
  function templatesDir() {
247
265
  let dir = dirname(fileURLToPath(import.meta.url));
248
266
  for (let i = 0; i < 6; i++) {
@@ -254,30 +272,128 @@ function templatesDir() {
254
272
  }
255
273
  throw new Error(`Could not locate avodado/cli templates directory near ${import.meta.url}`);
256
274
  }
257
- var FILES = [
258
- "avodado.config.json",
259
- "docs/getting-started.md",
260
- "CLAUDE.md",
261
- ".cursor/rules/avodado.mdc",
262
- ".avodado/skill/SKILL.md"
263
- ];
275
+ function themeFileContents(theme, custom) {
276
+ const base = {
277
+ name: "My theme",
278
+ "//": "1) Pick a base theme. 2) Optionally override colors/fonts. Re-run `avo render` \u2014 no rebuild.",
279
+ theme,
280
+ "//theme-options": "minimal (default, clean white) | soft (modern, white) | dark | teal | plum | slate"
281
+ };
282
+ if (custom) {
283
+ base["//colors"] = "Optional overrides on top of the base theme. Any of: primary, secondary, accent, positive, negative, purple, teal, ink, muted, rule, paper. Values are any CSS color.";
284
+ base["colors"] = {};
285
+ base["//fonts"] = "Optional. display | body | mono. Use single quotes inside font names.";
286
+ base["fonts"] = {};
287
+ }
288
+ return JSON.stringify(base, null, 2) + "\n";
289
+ }
264
290
  async function runInit(opts) {
265
291
  const srcRoot = templatesDir();
266
292
  const created = [];
267
293
  const skipped = [];
268
- for (const rel of FILES) {
269
- const src = resolve(srcRoot, rel);
294
+ const tools = opts.tools ?? AI_TOOLS.map((t) => t.id);
295
+ const copyList = [...BASE_FILES, ...tools.map((t) => ADAPTER_FILE[t])];
296
+ for (const rel of copyList) {
270
297
  const dst = join(opts.cwd, rel);
271
298
  if (existsSync(dst) && opts.force !== true) {
272
299
  skipped.push(rel);
273
300
  continue;
274
301
  }
275
302
  await mkdir(dirname(dst), { recursive: true });
276
- await cp(src, dst);
303
+ await cp(resolve(srcRoot, rel), dst);
277
304
  created.push(rel);
278
305
  }
306
+ const wantThemeFile = opts.customTheme === true || opts.theme !== void 0 && opts.theme !== "minimal";
307
+ if (wantThemeFile) {
308
+ const rel = "avodado.theme.json";
309
+ const dst = join(opts.cwd, rel);
310
+ if (existsSync(dst) && opts.force !== true) {
311
+ skipped.push(rel);
312
+ } else {
313
+ await writeFile(dst, themeFileContents(opts.theme ?? "minimal", opts.customTheme === true), "utf8");
314
+ created.push(rel);
315
+ }
316
+ }
279
317
  return { created, skipped };
280
318
  }
319
+ var CUSTOM = "__custom__";
320
+ var THEME_ITEMS = [
321
+ { label: "Minimal \u2014 clean modern white (default)", value: "minimal" },
322
+ { label: "Soft \u2014 modern light, indigo accent", value: "soft" },
323
+ { label: "Dark \u2014 full dark mode", value: "dark" },
324
+ { label: "Teal \u2014 teal + amber", value: "teal" },
325
+ { label: "Plum \u2014 plum + pink", value: "plum" },
326
+ { label: "Slate \u2014 slate sans", value: "slate" },
327
+ { label: "Custom\u2026 \u2014 scaffold avodado.theme.json to edit", value: CUSTOM }
328
+ ];
329
+ function InitApp({ cwd, force, onComplete }) {
330
+ const { exit } = useApp();
331
+ const [step, setStep] = useState("tools");
332
+ const [cursor, setCursor] = useState(0);
333
+ const [selected, setSelected] = useState(new Set(AI_TOOLS.map((t) => t.id)));
334
+ useInput((input, key) => {
335
+ if (step !== "tools") return;
336
+ if (key.upArrow) setCursor((c) => (c - 1 + AI_TOOLS.length) % AI_TOOLS.length);
337
+ else if (key.downArrow) setCursor((c) => (c + 1) % AI_TOOLS.length);
338
+ else if (input === " ") {
339
+ const tool = AI_TOOLS[cursor];
340
+ if (tool === void 0) return;
341
+ const id = tool.id;
342
+ setSelected((prev) => {
343
+ const next = new Set(prev);
344
+ if (next.has(id)) next.delete(id);
345
+ else next.add(id);
346
+ return next;
347
+ });
348
+ } else if (key.return) {
349
+ setStep("theme");
350
+ }
351
+ });
352
+ async function finish(themeValue) {
353
+ setStep("working");
354
+ const custom = themeValue === CUSTOM;
355
+ const theme = custom ? "minimal" : themeValue;
356
+ const result = await runInit({
357
+ cwd,
358
+ ...force === true ? { force: true } : {},
359
+ tools: AI_TOOLS.map((t) => t.id).filter((id) => selected.has(id)),
360
+ theme,
361
+ ...custom ? { customTheme: true } : {}
362
+ });
363
+ onComplete(result, theme);
364
+ exit();
365
+ }
366
+ if (step === "tools") {
367
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
368
+ /* @__PURE__ */ jsxs(Text, { bold: true, children: [
369
+ "Which AI tools do you use?",
370
+ " ",
371
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "(\u2191\u2193 move \xB7 space toggle \xB7 enter continue)" })
372
+ ] }),
373
+ AI_TOOLS.map((t, i) => {
374
+ const on = selected.has(t.id);
375
+ return /* @__PURE__ */ jsxs(Text, { ...i === cursor ? { color: "green" } : {}, children: [
376
+ i === cursor ? "\u276F " : " ",
377
+ on ? /* @__PURE__ */ jsx(Text, { color: "green", children: "\u25C9" }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u25EF" }),
378
+ " ",
379
+ t.label,
380
+ " ",
381
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
382
+ "\u2192 ",
383
+ t.file
384
+ ] })
385
+ ] }, t.id);
386
+ })
387
+ ] });
388
+ }
389
+ if (step === "theme") {
390
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
391
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Pick a theme:" }),
392
+ /* @__PURE__ */ jsx(SelectInput, { items: [...THEME_ITEMS], onSelect: (item) => void finish(item.value) })
393
+ ] });
394
+ }
395
+ return /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Scaffolding\u2026" });
396
+ }
281
397
  function slugFromPath(path) {
282
398
  const base = basename(path, extname(path));
283
399
  return base.length > 0 ? base : "api";
@@ -638,7 +754,27 @@ function formatDiagnosticsPlain(diagnostics, fileCount, sources) {
638
754
  blocks.push(`${errors} error(s), ${warns} warning(s) across ${fileCount} file(s)`);
639
755
  return blocks.join("\n\n") + "\n";
640
756
  }
641
- function banner(version = "0.0.1") {
757
+ function logo() {
758
+ let art = "";
759
+ try {
760
+ const out = cfonts.render("avodado", {
761
+ font: "block",
762
+ gradient: ["#a5d76e", "#2e7d32"],
763
+ // avocado: light rind → dark skin
764
+ transitionGradient: true,
765
+ space: false,
766
+ env: "node"
767
+ });
768
+ if (out !== false && typeof out === "object") art = out.string ?? "";
769
+ } catch {
770
+ }
771
+ if (art === "") return banner();
772
+ return `
773
+ ${art}
774
+ ${pc3.dim("Documentation-as-code \u2014 Markdown with typed, fenced YAML blocks.")}
775
+ `;
776
+ }
777
+ function banner(version = "0.0.2") {
642
778
  const g = pc3.green;
643
779
  const pit = pc3.yellow("\u25CF");
644
780
  const name = pc3.green(pc3.bold("avodado"));
@@ -671,22 +807,63 @@ function examples() {
671
807
 
672
808
  // src/tty.ts
673
809
  var isInteractive = process.stdout.isTTY === true && process.env["CI"] !== "true" && process.env["AVO_PLAIN"] !== "1";
810
+ function cliVersion() {
811
+ try {
812
+ let dir = dirname(fileURLToPath(import.meta.url));
813
+ for (let i = 0; i < 6; i++) {
814
+ const p = join(dir, "package.json");
815
+ if (existsSync(p)) {
816
+ const j = JSON.parse(readFileSync(p, "utf8"));
817
+ if (j.name === "@avodado/cli" && typeof j.version === "string") return j.version;
818
+ }
819
+ const parent = dirname(dir);
820
+ if (parent === dir) break;
821
+ dir = parent;
822
+ }
823
+ } catch {
824
+ }
825
+ return "0.0.0";
826
+ }
827
+ function printInitSummary(result, theme) {
828
+ for (const f of result.created) console.log(pc3.green("+ ") + f);
829
+ for (const f of result.skipped) console.log(pc3.dim(" skip ") + f + pc3.dim(" (exists)"));
830
+ console.log(
831
+ pc3.bold(`
832
+ Created ${result.created.length} file(s), skipped ${result.skipped.length}.`) + pc3.dim(` (theme: ${theme})`)
833
+ );
834
+ console.log(
835
+ `Next: ${pc3.cyan("avo check")} ${pc3.dim("\xB7")} ${pc3.cyan("avo preview docs/getting-started.md")}`
836
+ );
837
+ }
674
838
  async function main(argv) {
839
+ const version = cliVersion();
675
840
  const program = new Command();
676
- program.name("avo").description("Author, validate, render, and export Avodado documentation.").version("0.0.1").addHelpText("beforeAll", (ctx) => ctx.command.name() === "avo" ? banner() : "").addHelpText("after", (ctx) => ctx.command.name() === "avo" ? examples() : "").exitOverride();
841
+ program.name("avo").description("Author, validate, render, and export Avodado documentation.").version(version).addHelpText("beforeAll", (ctx) => ctx.command.name() === "avo" ? banner(version) : "").addHelpText("after", (ctx) => ctx.command.name() === "avo" ? examples() : "").exitOverride();
677
842
  let exitCode = 0;
678
- program.command("init").description("Scaffold a new Avodado project in the current directory").option("--force", "overwrite existing files").action(async (opts) => {
843
+ program.command("init").description("Scaffold a new Avodado project in the current directory").option("--force", "overwrite existing files").option("-y, --yes", "skip the wizard \u2014 scaffold with defaults (all adapters, minimal theme)").action(async (opts) => {
679
844
  const cwd = process.cwd();
680
- const result = await runInit({ cwd, ...opts.force ? { force: true } : {} });
681
- for (const f of result.created) console.log(pc3.green("+ ") + f);
682
- for (const f of result.skipped) console.log(pc3.dim(" skip ") + f + pc3.dim(" (exists)"));
683
- console.log(
684
- pc3.bold(
685
- `
686
- Created ${result.created.length} file(s), skipped ${result.skipped.length}.
687
- Next: avo check`
688
- )
689
- );
845
+ const force = opts.force === true;
846
+ if (isInteractive && opts.yes !== true) {
847
+ console.log(logo());
848
+ let captured;
849
+ const { waitUntilExit } = render(
850
+ /* @__PURE__ */ jsx(
851
+ InitApp,
852
+ {
853
+ cwd,
854
+ ...force ? { force: true } : {},
855
+ onComplete: (result2, theme) => {
856
+ captured = { result: result2, theme };
857
+ }
858
+ }
859
+ )
860
+ );
861
+ await waitUntilExit();
862
+ if (captured !== void 0) printInitSummary(captured.result, captured.theme);
863
+ return;
864
+ }
865
+ const result = await runInit({ cwd, ...force ? { force: true } : {} });
866
+ printInitSummary(result, "minimal");
690
867
  });
691
868
  program.command("new").description("Scaffold a new doc from a block template").option(
692
869
  "--type <kind>",
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/io/config.ts","../src/io/files.ts","../src/commands/check.tsx","../src/io/theme.ts","../src/commands/render.ts","../src/commands/export.ts","../src/commands/preview.ts","../src/commands/init.ts","../src/commands/sync.ts","../src/commands/new.tsx","../src/ui/codeFrame.ts","../src/ui/DiagnosticsTable.tsx","../src/ui/banner.ts","../src/tty.ts","../src/app.tsx","../src/bin.ts"],"names":["yamlParse","resolve","existsSync","readFileSync","readFile","parsePath","parseDocument","mkdir","writeFile","renderDocument","join","dirname","basename","pc","jsx","Box","jsxs","Text","BLOCK_TYPES","inkRender"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * Loads `avodado.config.{ts,json,yml}` from the project root.\n *\n * Defaults are returned if no config is found, so most users never need a\n * config file.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as yamlParse } from 'yaml';\nimport { createJiti } from 'jiti';\n\n/** Loaded configuration. */\nexport interface AvodadoConfig {\n /** Where docs live (relative to project root). Defaults to `docs`. */\n readonly docsDir: string;\n /** Where rendered output goes (relative to project root). Defaults to `dist`. */\n readonly outDir: string;\n}\n\nconst DEFAULTS: AvodadoConfig = { docsDir: 'docs', outDir: 'dist' };\n\nconst CONFIG_FILES = [\n 'avodado.config.ts',\n 'avodado.config.js',\n 'avodado.config.mjs',\n 'avodado.config.json',\n 'avodado.config.yml',\n 'avodado.config.yaml',\n];\n\n/** Loads a config file from `cwd`, returning defaults if none exists. */\nexport async function loadConfig(cwd: string): Promise<AvodadoConfig> {\n for (const name of CONFIG_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n const raw = await readConfig(path);\n return mergeWithDefaults(raw);\n }\n return DEFAULTS;\n}\n\nasync function readConfig(path: string): Promise<unknown> {\n if (path.endsWith('.json')) {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown;\n }\n if (path.endsWith('.yml') || path.endsWith('.yaml')) {\n return yamlParse(readFileSync(path, 'utf8')) as unknown;\n }\n const jiti = createJiti(import.meta.url);\n const mod = (await jiti.import(path)) as { default?: unknown };\n return mod.default ?? mod;\n}\n\nfunction mergeWithDefaults(raw: unknown): AvodadoConfig {\n if (raw === null || typeof raw !== 'object') return DEFAULTS;\n const r = raw as { docsDir?: unknown; outDir?: unknown };\n return {\n docsDir: typeof r.docsDir === 'string' ? r.docsDir : DEFAULTS.docsDir,\n outDir: typeof r.outDir === 'string' ? r.outDir : DEFAULTS.outDir,\n };\n}\n","/**\n * File-system helpers: glob expansion, document reading, slug derivation.\n *\n * Slug rule: a doc's slug is its path relative to the docs root, stripped of\n * `.md` and normalised to forward slashes. Files outside the docs root fall\n * back to their basename without `.md`.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, relative, resolve, sep } from 'node:path';\nimport fg from 'fast-glob';\n\n/** A document file on disk, with derived slug. */\nexport interface DocFile {\n /** Absolute path on disk. */\n readonly absolute: string;\n /** Path relative to cwd (used in diagnostics). */\n readonly file: string;\n /** Slug derived from path under the docs root. */\n readonly slug: string;\n /** Raw markdown source. */\n readonly source: string;\n}\n\n/**\n * Expands one or more glob patterns to a list of {@link DocFile}s with read\n * content and derived slugs.\n *\n * @param patterns - One or more glob patterns (relative to `cwd`).\n * @param cwd - The working directory the patterns resolve from.\n * @param docsRoot - The docs root the slug is derived against.\n */\nexport async function loadDocs(\n patterns: readonly string[],\n cwd: string,\n docsRoot: string,\n): Promise<DocFile[]> {\n const matches = await fg(patterns as string[], {\n cwd,\n absolute: true,\n onlyFiles: true,\n dot: false,\n });\n const docsRootAbs = resolve(cwd, docsRoot);\n const files = await Promise.all(\n matches.map(async (absolute): Promise<DocFile> => {\n const file = relative(cwd, absolute);\n const slug = deriveSlug(absolute, docsRootAbs);\n const source = await readFile(absolute, 'utf8');\n return { absolute, file, slug, source };\n }),\n );\n files.sort((a, b) => a.file.localeCompare(b.file));\n return files;\n}\n\nfunction deriveSlug(absolute: string, docsRootAbs: string): string {\n const rel = relative(docsRootAbs, absolute);\n const inside = !rel.startsWith('..') && !rel.startsWith(sep) && rel.length > 0;\n const path = inside ? rel : basename(absolute);\n return path.replace(/\\\\/g, '/').replace(/\\.md$/i, '');\n}\n","/**\n * `avo check` — validate one or more documents and report diagnostics.\n *\n * Pure {@link runCheck} returns `{ diagnostics, exitCode }`. The UI layer\n * picks how to render: JSON, Ink table (interactive TTY), or plain text (CI).\n */\n\nimport { parseDocument, resolveRefs, validateDocument, type Diagnostic, type Document } from '@avodado/core';\nimport { loadDocs, type DocFile } from '../io/files.js';\n\n/** Inputs to {@link runCheck}. */\nexport interface CheckOptions {\n /** Glob patterns to expand. */\n readonly patterns: readonly string[];\n /** Working directory. */\n readonly cwd: string;\n /** Docs root for slug derivation. */\n readonly docsRoot: string;\n}\n\n/** Result of running `avo check` — diagnostics aggregated across all matched docs. */\nexport interface CheckResult {\n /** All diagnostics in file/line order. */\n readonly diagnostics: readonly Diagnostic[];\n /** Files that were checked. */\n readonly files: readonly string[];\n /** Per-file source lines, for code frames (keyed by the diagnostic `file`). */\n readonly sources: ReadonlyMap<string, readonly string[]>;\n /** Suggested exit code: 0 = clean, 1 = errors present. */\n readonly exitCode: 0 | 1;\n}\n\n/**\n * Validates a set of documents and resolves references across them.\n *\n * @param opts - Options including glob patterns and docs root.\n * @returns Aggregated diagnostics + suggested exit code.\n */\nexport async function runCheck(opts: CheckOptions): Promise<CheckResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const parsed: { doc: Document; file: string }[] = docs.map((d) => ({\n doc: parseDocument(d.source, d.slug),\n file: d.file,\n }));\n\n const diagnostics: Diagnostic[] = [];\n\n for (const { doc, file } of parsed) {\n diagnostics.push(...validateDocument(doc, file));\n }\n\n const resolved = resolveRefs(parsed);\n diagnostics.push(...resolved.diagnostics);\n\n diagnostics.sort((a, b) => {\n const f = a.file.localeCompare(b.file);\n if (f !== 0) return f;\n return (a.line ?? 0) - (b.line ?? 0);\n });\n\n const exitCode = diagnostics.some((d) => d.level === 'error') ? 1 : 0;\n\n const sources = new Map<string, readonly string[]>();\n for (const d of docs) sources.set(d.file, d.source.split(/\\r\\n|\\r|\\n/));\n\n return {\n diagnostics,\n files: docs.map((d: DocFile) => d.file),\n sources,\n exitCode,\n };\n}\n","/**\n * Loads a project theme file (`avodado.theme.json`) and maps its friendly\n * color/font names to the CSS variables the renderer reads.\n *\n * The whole point: a user edits one small JSON file with human names\n * (`primary`, `accent`, `ink`…) and re-runs `avo render` — no rebuild, no\n * CSS knowledge. Anything omitted falls back to the built-in theme.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/** Friendly theme-file shape. Every field is optional. */\nexport interface ThemeFile {\n /** Optional name, for your own reference. */\n readonly name?: string;\n /** Base built-in theme to start from: minimal | teal | plum | slate | dark | soft. */\n readonly theme?: string;\n /** Friendly color name → hex/CSS color. */\n readonly colors?: Readonly<Record<string, string>>;\n /** Friendly font slot → CSS font-family stack. */\n readonly fonts?: Readonly<Record<string, string>>;\n}\n\n/** Resolved theme: a base theme name and/or custom variable overrides. */\nexport interface LoadedTheme {\n readonly theme?: string;\n readonly themeVars?: Readonly<Record<string, string>>;\n}\n\nconst BASE_THEMES = new Set(['minimal', 'teal', 'plum', 'slate', 'dark', 'soft']);\n\n/** Friendly color name → internal CSS variable. */\nconst COLOR_TO_VAR: Readonly<Record<string, string>> = {\n primary: '--navy', // headings, primary nodes, links, section numbers\n secondary: '--blue', // secondary accents, CDN/consumer nodes\n accent: '--highlight', // highlight pills, FK keys, \"current\" markers\n positive: '--positive', // success / service nodes / done\n negative: '--negative', // errors / forbidden edges / danger\n purple: '--purple', // data / context / provider nodes\n teal: '--teal', // queues / topics / caches\n ink: '--charcoal', // body text\n muted: '--gray', // captions, dim text, external nodes\n rule: '--rule', // hairlines, borders, dividers\n paper: '--white', // surfaces / card fills\n};\n\n/** Friendly font slot → internal CSS variable. */\nconst FONT_TO_VAR: Readonly<Record<string, string>> = {\n display: '--font-display', // titles / headings\n body: '--font-body', // paragraphs / labels\n mono: '--font-mono', // code / technical labels\n};\n\nconst THEME_FILES = ['avodado.theme.json', 'avodado.theme.jsonc'];\n\n/**\n * Reads the project theme file (if any) and returns CSS-variable overrides\n * ready to pass to `renderDocument({ themeVars })`. Returns `undefined` when\n * there is no theme file, so the default theme is used unchanged.\n *\n * Unknown color/font names are ignored (a warning is the caller's choice) so a\n * typo never crashes a render.\n */\nexport function loadTheme(cwd: string): LoadedTheme {\n for (const name of THEME_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n let raw: unknown;\n try {\n raw = JSON.parse(stripComments(readFileSync(path, 'utf8'))) as unknown;\n } catch {\n return {}; // malformed file → fall back to default theme\n }\n const file = raw !== null && typeof raw === 'object' ? (raw as ThemeFile) : {};\n const out: { theme?: string; themeVars?: Readonly<Record<string, string>> } = {};\n if (typeof file.theme === 'string' && BASE_THEMES.has(file.theme)) out.theme = file.theme;\n const vars = toVars(raw);\n if (vars !== undefined) out.themeVars = vars;\n return out;\n }\n return {};\n}\n\n/** Converts a parsed theme file into CSS-variable overrides. */\nfunction toVars(raw: unknown): Readonly<Record<string, string>> | undefined {\n if (raw === null || typeof raw !== 'object') return undefined;\n const file = raw as ThemeFile;\n const vars: Record<string, string> = {};\n if (file.colors !== undefined) {\n for (const key of Object.keys(file.colors)) {\n const cssVar = COLOR_TO_VAR[key.toLowerCase()];\n const value = file.colors[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n if (file.fonts !== undefined) {\n for (const key of Object.keys(file.fonts)) {\n const cssVar = FONT_TO_VAR[key.toLowerCase()];\n const value = file.fonts[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n return Object.keys(vars).length > 0 ? vars : undefined;\n}\n\n/** Strips `//` line comments so `.jsonc`-style files parse. */\nfunction stripComments(src: string): string {\n return src.replace(/^\\s*\\/\\/.*$/gm, '');\n}\n","/**\n * `avo render` — render one document to a standalone HTML file.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, parse as parsePath, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument, type ThemeName } from '@avodado/render';\nimport { loadTheme } from '../io/theme.js';\n\nexport interface RenderOptions {\n /** Input doc path. */\n readonly input: string;\n /** Output path. Defaults to `<input>.html` next to the input. */\n readonly output?: string;\n /** Working directory. */\n readonly cwd: string;\n}\n\n/** Result of a render. */\nexport interface RenderResult {\n readonly input: string;\n readonly output: string;\n readonly bytes: number;\n}\n\n/**\n * Reads `opts.input`, parses + renders it, and writes the resulting HTML.\n *\n * @returns The output path and byte size written.\n */\nexport async function runRender(opts: RenderOptions): Promise<RenderResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const { theme, themeVars } = loadTheme(opts.cwd);\n const html = renderDocument(doc, {\n ...(theme !== undefined ? { theme: theme as ThemeName } : {}),\n ...(themeVars !== undefined ? { themeVars } : {}),\n });\n\n const outputAbs = opts.output !== undefined ? resolve(opts.cwd, opts.output) : inputAbs.replace(/\\.md$/i, '.html');\n await mkdir(dirname(outputAbs), { recursive: true });\n await writeFile(outputAbs, html, 'utf8');\n return { input: opts.input, output: outputAbs, bytes: html.length };\n}\n","/**\n * `avo export` — batch-export one or more documents to HTML and/or PDF.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { toHtml, toPdf } from '@avodado/export';\nimport { loadDocs } from '../io/files.js';\n\nexport type ExportFormat = 'html' | 'pdf';\n\nexport interface ExportOptions {\n readonly patterns: readonly string[];\n readonly cwd: string;\n readonly docsRoot: string;\n readonly outDir: string;\n readonly formats: readonly ExportFormat[];\n}\n\nexport interface ExportItem {\n readonly file: string;\n readonly outputs: readonly { format: ExportFormat; path: string; bytes: number }[];\n}\n\nexport interface ExportResult {\n readonly items: readonly ExportItem[];\n}\n\n/**\n * Reads, parses, and renders each matched document into one or more output\n * formats under `outDir`. Filenames mirror the doc's slug.\n */\nexport async function runExport(opts: ExportOptions): Promise<ExportResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const outRoot = resolve(opts.cwd, opts.outDir);\n await mkdir(outRoot, { recursive: true });\n\n const items: ExportItem[] = [];\n for (const d of docs) {\n const doc = parseDocument(d.source, d.slug);\n const outputs: { format: ExportFormat; path: string; bytes: number }[] = [];\n for (const fmt of opts.formats) {\n const outPath = join(outRoot, `${d.slug}.${fmt}`);\n await mkdir(resolve(outPath, '..'), { recursive: true });\n if (fmt === 'html') {\n const html = toHtml(doc);\n await writeFile(outPath, html, 'utf8');\n outputs.push({ format: fmt, path: outPath, bytes: html.length });\n } else {\n const pdf = await toPdf(doc);\n await writeFile(outPath, pdf);\n outputs.push({ format: fmt, path: outPath, bytes: pdf.byteLength });\n }\n }\n items.push({ file: d.file, outputs });\n }\n return { items };\n}\n","/**\n * `avo preview` — render a single doc to a temp HTML file and open it in the\n * default browser.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { join, parse as parsePath, resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument } from '@avodado/render';\n\nexport interface PreviewOptions {\n readonly input: string;\n readonly cwd: string;\n}\n\nexport interface PreviewResult {\n readonly file: string;\n}\n\n/**\n * Renders the doc to a temp file (named by a hash of the source path so\n * repeated previews reuse the same file) and opens it in the OS browser.\n */\nexport async function runPreview(opts: PreviewOptions): Promise<PreviewResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const html = renderDocument(doc);\n\n const hash = createHash('sha1').update(inputAbs).digest('hex').slice(0, 8);\n const dir = join(tmpdir(), 'avodado-preview');\n await mkdir(dir, { recursive: true });\n const out = join(dir, `${slug}-${hash}.html`);\n await writeFile(out, html, 'utf8');\n await open(out);\n return { file: out };\n}\n","/**\n * `avo init` — scaffold a new Avodado project in the current directory.\n *\n * Copies the template tree (docs sample, config, the authoring skill, and\n * editor adapters for Claude Code + Cursor) into `cwd`.\n */\n\nimport { cp, mkdir } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface InitOptions {\n readonly cwd: string;\n /** Overwrite files that already exist. Default: false (skip with a notice). */\n readonly force?: boolean;\n}\n\nexport interface InitResult {\n readonly created: readonly string[];\n readonly skipped: readonly string[];\n}\n\n/**\n * Resolves the templates directory packaged with the CLI.\n *\n * Walks up from this module's location looking for a `templates` sibling.\n * Works for both `dist/bin.js` (one level up) and source layout\n * (`src/commands/init.ts`, two levels up).\n */\nfunction templatesDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'templates');\n if (existsSync(candidate) && statSync(candidate).isDirectory()) return candidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(`Could not locate avodado/cli templates directory near ${import.meta.url}`);\n}\n\nconst FILES: readonly string[] = [\n 'avodado.config.json',\n 'docs/getting-started.md',\n 'CLAUDE.md',\n '.cursor/rules/avodado.mdc',\n '.avodado/skill/SKILL.md',\n];\n\n/**\n * Copies the template tree into `cwd`. Files that already exist are skipped\n * unless `force: true`. Returns the lists of created and skipped relative\n * paths so the caller can report them.\n */\nexport async function runInit(opts: InitOptions): Promise<InitResult> {\n const srcRoot = templatesDir();\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const rel of FILES) {\n const src = resolve(srcRoot, rel);\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n continue;\n }\n await mkdir(dirname(dst), { recursive: true });\n await cp(src, dst);\n created.push(rel);\n }\n\n return { created, skipped };\n}\n","/**\n * `avo sync openapi` — generate an Avodado doc from an OpenAPI spec, or\n * verify that an existing doc matches what the spec would generate (CI drift).\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, resolve, extname } from 'node:path';\nimport { openapiToMarkdown, parseOpenApi } from '@avodado/sync';\n\n/** Inputs for {@link runSyncOpenApi}. */\nexport interface SyncOpenApiOptions {\n readonly cwd: string;\n /** Path to the OpenAPI spec (relative or absolute). */\n readonly spec: string;\n /** Output path (write mode). Mutually exclusive with `check`. */\n readonly out?: string;\n /** Path to compare generated output against (drift mode). */\n readonly check?: string;\n /** Slug used to namespace generated block ids. Defaults to the output basename. */\n readonly slug?: string;\n}\n\n/** Result of `avo sync openapi`. */\nexport interface SyncOpenApiResult {\n readonly exitCode: 0 | 1 | 2;\n /** A short, plain-text summary suitable for logging. */\n readonly message: string;\n /** When `check` mode finds drift: the line-level diff. */\n readonly diff?: string;\n}\n\nfunction slugFromPath(path: string): string {\n const base = basename(path, extname(path));\n return base.length > 0 ? base : 'api';\n}\n\n/**\n * Generates an Avodado doc from an OpenAPI spec — either writing it to disk,\n * or comparing the in-memory result against an existing doc on disk and\n * reporting drift.\n */\nexport async function runSyncOpenApi(opts: SyncOpenApiOptions): Promise<SyncOpenApiResult> {\n if (opts.out === undefined && opts.check === undefined) {\n return { exitCode: 2, message: 'avo sync openapi: must specify --out <path> or --check <path>' };\n }\n if (opts.out !== undefined && opts.check !== undefined) {\n return { exitCode: 2, message: 'avo sync openapi: --out and --check are mutually exclusive' };\n }\n\n const specAbs = resolve(opts.cwd, opts.spec);\n if (!existsSync(specAbs)) {\n return { exitCode: 2, message: `Spec not found: ${specAbs}` };\n }\n\n const source = await readFile(specAbs, 'utf8');\n let spec;\n try {\n spec = parseOpenApi(source);\n } catch (err) {\n return { exitCode: 1, message: `Failed to parse spec: ${(err as Error).message}` };\n }\n\n const targetPath = opts.out ?? opts.check;\n if (targetPath === undefined) {\n return { exitCode: 2, message: 'no target path' };\n }\n const slug = opts.slug ?? slugFromPath(targetPath);\n const generated = openapiToMarkdown(spec, { slug });\n\n if (opts.out !== undefined) {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, generated, 'utf8');\n return {\n exitCode: 0,\n message: `Wrote ${outAbs} (${generated.length} bytes)`,\n };\n }\n\n // Check mode — compare against existing file.\n const checkAbs = resolve(opts.cwd, opts.check ?? '');\n if (!existsSync(checkAbs)) {\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} does not exist. Run with --out ${opts.check} to generate it.`,\n };\n }\n const existing = await readFile(checkAbs, 'utf8');\n if (existing === generated) {\n return {\n exitCode: 0,\n message: `OK: ${checkAbs} matches ${specAbs} (${generated.length} bytes)`,\n };\n }\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} differs from what ${specAbs} would generate.`,\n diff: simpleDiff(existing, generated),\n };\n}\n\n/** Tiny line-level diff for the drift report. Not a full diff library; good enough for CI. */\nfunction simpleDiff(a: string, b: string): string {\n const aLines = a.split('\\n');\n const bLines = b.split('\\n');\n const out: string[] = [];\n const max = Math.max(aLines.length, bLines.length);\n for (let i = 0; i < max; i++) {\n const av = aLines[i];\n const bv = bLines[i];\n if (av === bv) continue;\n if (av !== undefined) out.push(`- ${av}`);\n if (bv !== undefined) out.push(`+ ${bv}`);\n if (out.length >= 40) {\n out.push(`… (truncated; ${max - i - 1} more lines)`);\n break;\n }\n }\n return out.join('\\n');\n}\n","/**\n * `avo new` — scaffold a new doc from a block-type template.\n *\n * Interactive (Ink) when run in a TTY; non-interactive with `--type <kind>\n * --out <path>` for CI usage.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport React, { useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { BLOCK_TYPES, type BlockType } from '@avodado/core';\n\nexport interface NewOptions {\n readonly cwd: string;\n readonly type?: BlockType;\n readonly out?: string;\n}\n\nconst TEMPLATES: Record<BlockType, string> = {\n meta: '```meta\\ntitle: New document\\nsubtitle: One-line description.\\ntag: DRAFT\\n```\\n',\n callout:\n '```callout\\ntone: note\\ntitle: Heads up\\nbody: A short note that the reader should not miss.\\n```\\n',\n table: '```table\\ncolumns: [Field, Description]\\nrows:\\n - [name, Display name]\\n - [id, Stable identifier]\\n```\\n',\n sequence:\n '```sequence\\nid: seq-example\\nactors:\\n - { id: Client, name: Client }\\n - { id: Server, name: Server }\\nmessages:\\n - { from: Client, to: Server, label: request, kind: sync }\\n - { from: Server, to: Client, label: response, kind: response }\\n```\\n',\n erd:\n '```erd\\nid: erd-example\\nentities:\\n - name: orders\\n columns:\\n - { name: id, type: uuid, pk: true }\\n - { name: user_id, type: uuid, fk: true }\\nrelations: []\\n```\\n',\n userstory:\n '```userstory\\nid: US-001\\nrole: user\\nwant: do the thing\\nsoThat: I get the outcome\\ncriteria:\\n - { given: a precondition, when: I act, then: the outcome }\\n```\\n',\n timeline:\n '```timeline\\nitems:\\n - label: Phase 1\\n date: now\\n status: current\\n desc: What is happening now\\n - label: Phase 2\\n date: next\\n status: next\\n desc: What is next\\n```\\n',\n kanban:\n '```kanban\\ncolumns:\\n - label: Now\\n cards:\\n - { title: Current task }\\n - label: Next\\n cards:\\n - { title: Upcoming task }\\n - label: Later\\n cards:\\n - { title: Eventually }\\n```\\n',\n tracker:\n '```tracker\\nitems:\\n - { task: First task, status: doing, priority: high }\\n - { task: Second task, status: todo, priority: med }\\n```\\n',\n prose:\n '```prose\\ntitle: Overview\\nblocks:\\n - { type: h, text: Background }\\n - { type: p, text: A paragraph explaining the context. }\\n - { type: ul, items: [Idea one, Idea two, Idea three] }\\n```\\n',\n glossary:\n '```glossary\\nterms:\\n - { term: Idempotency, def: Doing a thing twice has the same effect as doing it once. }\\n - { term: SLO, def: Service-level objective the team commits to. }\\n```\\n',\n proscons:\n '```proscons\\ntitle: Synchronous vs async\\nprosLabel: Synchronous\\nconsLabel: Asynchronous\\npros:\\n - Easy to reason about\\n - One transaction\\ncons:\\n - Latency-bound\\n - Single point of failure\\n```\\n',\n cvt:\n '```cvt\\ntitle: Migration plan\\ncurrent:\\n label: Today\\n items: [Single monolith, Shared database, Manual deploys]\\ntarget:\\n label: Target\\n items: [Modular services, Per-service stores, Automated deploys]\\nnote: Migrate one service per quarter.\\n```\\n',\n stats:\n '```stats\\ntitle: This quarter\\nstats:\\n - { value: 12.4k, label: Active users, delta: \"+18%\", trend: up }\\n - { value: 99.95%, label: Uptime, delta: \"0\", trend: flat }\\n - { value: 142ms, label: p95 latency, delta: \"-22ms\", trend: up }\\n```\\n',\n code:\n '```code\\ntitle: Reference\\nblocks:\\n - title: index.ts\\n lang: TypeScript\\n code: |\\n export function add(a: number, b: number): number {\\n return a + b;\\n }\\n```\\n',\n agenda:\n '```agenda\\nitems:\\n - { time: \"09:00\", duration: 30m, title: Intros, owner: Host }\\n - { time: \"09:30\", duration: 45m, title: Status updates, desc: Each team for 5 min }\\n - { time: \"10:15\", duration: 15m, title: Wrap-up }\\n```\\n',\n tree:\n '```tree\\nnodes:\\n - { id: src, label: src }\\n - { id: components, parent: src, label: components }\\n - { id: hooks, parent: src, label: hooks }\\n - { id: index, parent: src, label: index.ts, note: entry point }\\n```\\n',\n pyramid:\n '```pyramid\\nlevels:\\n - { label: Vision, desc: Long-term direction }\\n - { label: Strategy, desc: How we get there }\\n - { label: Tactics, desc: This quarter }\\n - { label: Tasks, desc: This week }\\n```\\n',\n funnel:\n '```funnel\\nstages:\\n - { label: Visited, value: 10000 }\\n - { label: Signed up, value: 2400 }\\n - { label: Activated, value: 1100 }\\n - { label: Paying, value: 320 }\\n```\\n',\n flow:\n '```flow\\ntitle: Decision flow\\nnodes:\\n - { id: start, col: 1, row: 1, kind: start, label: Start }\\n - { id: check, col: 2, row: 1, kind: decision, label: Is valid? }\\n - { id: yes, col: 3, row: 1, kind: process, label: Process }\\n - { id: no, col: 2, row: 2, kind: end, label: Reject }\\n - { id: done, col: 3, row: 2, kind: end, label: Done }\\nedges:\\n - { from: start, to: check }\\n - { from: check, to: yes, label: \"yes\" }\\n - { from: check, to: no, label: \"no\", kind: error }\\n - { from: yes, to: done }\\n```\\n',\n state:\n '```state\\ntitle: Order lifecycle\\nstates:\\n - { id: s0, col: 1, row: 1, kind: start }\\n - { id: pending, col: 2, row: 1, kind: wait, name: PENDING }\\n - { id: confirmed, col: 3, row: 1, kind: active, name: CONFIRMED }\\n - { id: end, col: 4, row: 1, kind: terminal }\\ntransitions:\\n - { from: s0, to: pending, event: create }\\n - { from: pending, to: confirmed, event: pay }\\n - { from: confirmed, to: end, event: ship }\\n```\\n',\n dfd:\n '```dfd\\ntitle: Data flow\\nnodes:\\n - { id: ext, col: 1, row: 1, kind: external, name: Client }\\n - { id: proc, col: 2, row: 1, kind: process, name: Process, num: 1 }\\n - { id: store, col: 3, row: 1, kind: store, name: Orders }\\nedges:\\n - { from: ext, to: proc, label: request }\\n - { from: proc, to: store, label: write }\\n```\\n',\n journey:\n '```journey\\ntitle: Onboarding journey\\nstages:\\n - { label: Discover }\\n - { label: Sign up }\\n - { label: Activate }\\n - { label: Pay }\\nrows:\\n - { label: Touchpoint, cells: [Landing, Form, Email, Checkout] }\\n - { label: Friction, cells: [Low, Med, Low, Med] }\\nemotion: [0.7, 0.4, 0.6, 0.8]\\n```\\n',\n gantt:\n '```gantt\\ntitle: Roadmap\\nperiods: [Q1, Q2, Q3, Q4]\\ntasks:\\n - { label: Discovery, start: 0, span: 1, kind: done }\\n - { label: Build, start: 1, span: 2, kind: active }\\n - { label: Ship, start: 3, span: 1 }\\n - { label: GA, start: 3, span: 1, kind: milestone }\\n```\\n',\n graph:\n '```graph\\ntitle: Dependency graph\\nnodes:\\n - { id: a, col: 1, row: 1, label: Module A, group: 0 }\\n - { id: b, col: 2, row: 1, label: Module B, group: 1 }\\n - { id: c, col: 3, row: 1, label: Module C, group: 2 }\\n - { id: d, col: 2, row: 2, label: Shared, group: 3 }\\nedges:\\n - { from: a, to: b }\\n - { from: b, to: c }\\n - { from: a, to: d }\\n - { from: b, to: d, dir: undirected }\\n```\\n',\n quadrant:\n '```quadrant\\ntitle: Effort vs impact\\nxAxis: { label: Effort, low: Low, high: High }\\nyAxis: { label: Impact, low: Low, high: High }\\nitems:\\n - { x: 0.2, y: 0.8, label: Quick win }\\n - { x: 0.8, y: 0.8, label: Big bet }\\n - { x: 0.2, y: 0.2, label: Fill-in }\\n - { x: 0.8, y: 0.2, label: Thankless }\\n```\\n',\n swimlane:\n '```swimlane\\ntitle: Cross-functional flow\\nlanes:\\n - { label: Customer }\\n - { label: Sales }\\n - { label: Ops }\\nsteps:\\n - { id: req, col: 1, lane: 0, kind: start, label: Submit request }\\n - { id: qual, col: 2, lane: 1, kind: decision, label: Qualify }\\n - { id: fulfill, col: 3, lane: 2, label: Fulfill }\\n - { id: done, col: 4, lane: 0, kind: end, label: Receive }\\nlinks:\\n - { from: req, to: qual }\\n - { from: qual, to: fulfill }\\n - { from: fulfill, to: done }\\n```\\n',\n c4:\n '```c4\\ntitle: System context\\nlevel: context\\nnodes:\\n - { id: user, col: 1, row: 1, kind: person, name: Shopper, desc: A customer placing an order. }\\n - { id: app, col: 2, row: 1, kind: system, name: ShopCo, desc: The retail platform. }\\n - { id: pay, col: 3, row: 1, kind: external, name: Payment GW, desc: Stripe authorisation. }\\nedges:\\n - { from: user, to: app, label: places order }\\n - { from: app, to: pay, label: authorises }\\n```\\n',\n uml:\n '```uml\\ntitle: Class model\\nclasses:\\n - { id: order, col: 1, row: 1, name: Order, attrs: [\"id: UUID\", \"status: Status\", \"total: Money\"], methods: [\"place()\", \"cancel()\"] }\\n - { id: item, col: 2, row: 1, name: OrderItem, attrs: [\"id: UUID\", \"sku: String\", \"qty: int\"] }\\n - { id: status, col: 1, row: 2, name: Status, stereotype: enumeration, attrs: [\"PENDING\", \"CONFIRMED\", \"CANCELLED\"] }\\nrels:\\n - { from: order, to: item, kind: composition }\\n - { from: order, to: status, kind: association, label: has }\\n```\\n',\n mece:\n '```mece\\ntitle: Why are conversions down?\\nnodes:\\n - { id: root, label: Lower conversion }\\n - { id: traffic, parent: root, label: Traffic }\\n - { id: friction, parent: root, label: Friction }\\n - { id: t1, parent: traffic, label: Lower quality, note: paid ads }\\n - { id: t2, parent: traffic, label: Wrong audience }\\n - { id: f1, parent: friction, label: Slow checkout }\\n - { id: f2, parent: friction, label: Mobile bugs }\\n```\\n',\n frontend:\n '```frontend\\ntitle: React component tree\\nnodes:\\n - { id: app, kind: root, name: App }\\n - { id: layout, parent: app, kind: layout, name: Layout }\\n - { id: home, parent: layout, kind: page, name: Home }\\n - { id: orders, parent: layout, kind: page, name: Orders }\\n - { id: card, parent: orders, kind: component, name: OrderCard }\\n - { id: useOrder, parent: orders, kind: hook, name: useOrder }\\n - { id: store, parent: app, kind: store, name: cart, note: Zustand }\\n```\\n',\n cluster:\n '```cluster\\ntitle: Production cluster\\nclusters:\\n - { id: api, label: api namespace, kind: namespace }\\n - { id: data, label: data namespace, kind: namespace }\\nservices:\\n - { id: web, cluster: api, label: web, kind: service, tech: Next.js, replicas: 3 }\\n - { id: orders, cluster: api, label: orders, kind: service, tech: Go, replicas: 4 }\\n - { id: pg, cluster: data, label: postgres, kind: store, tech: Postgres 16, replicas: 1 }\\n - { id: redis, cluster: data, label: redis, kind: cache, tech: Redis 7, replicas: 2 }\\nedges:\\n - { from: web, to: orders }\\n - { from: orders, to: pg }\\n - { from: orders, to: redis }\\n```\\n',\n block:\n '```block\\ntitle: System architecture\\ngroups:\\n - { col: 1, row: 1, cols: 1, rows: 2, label: Edge, color: \"#0e54a1\" }\\n - { col: 2, row: 1, cols: 2, rows: 2, label: Services, color: \"#1f9747\" }\\nnodes:\\n - { id: cdn, col: 1, row: 1, kind: cdn, name: CDN, tech: Cloudflare }\\n - { id: gw, col: 1, row: 2, kind: gateway, name: Gateway, tech: Envoy }\\n - { id: api, col: 2, row: 1, kind: service, name: API, tech: Go }\\n - { id: worker, col: 3, row: 1, kind: service, name: Worker, tech: Go }\\n - { id: pg, col: 2, row: 2, kind: store, name: Postgres, tech: \"16\" }\\n - { id: q, col: 3, row: 2, kind: queue, name: Events, tech: NATS }\\nedges:\\n - { from: cdn, to: gw }\\n - { from: gw, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: q }\\n - { from: q, to: worker, kind: dashed }\\n```\\n',\n infra:\n '```infra\\ntitle: AWS topology\\nsystemLabel: ShopCo · us-east-1\\nlayers:\\n - { label: Edge }\\n - { label: Compute }\\n - { label: Data }\\nnodes:\\n - { id: cf, layer: 0, kind: cdn, name: CloudFront, tech: CDN }\\n - { id: alb, layer: 0, kind: gateway, name: ALB, tech: Application LB }\\n - { id: api, layer: 1, kind: service, name: API, tech: ECS Fargate }\\n - { id: worker, layer: 1, kind: service, name: Worker, tech: ECS Fargate }\\n - { id: pg, layer: 2, kind: store, name: orders-db, tech: RDS Postgres }\\n - { id: cache, layer: 2, kind: cache, name: cache, tech: ElastiCache }\\nedges:\\n - { from: cf, to: alb }\\n - { from: alb, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: cache }\\n - { from: api, to: worker, kind: dashed }\\n```\\n',\n event:\n '```event\\ntitle: Pub/sub choreography\\nnodes:\\n - { id: orders, col: 1, row: 1, kind: producer, name: orders }\\n - { id: bus, col: 2, row: 1, kind: topic, name: order.events }\\n - { id: ship, col: 3, row: 1, kind: consumer, name: shipping }\\n - { id: bill, col: 3, row: 2, kind: consumer, name: billing }\\nedges:\\n - { from: orders, to: bus }\\n - { from: bus, to: ship }\\n - { from: bus, to: bill }\\n```\\n',\n ddd:\n '```ddd\\ntitle: Bounded contexts\\nnodes:\\n - { id: cat, col: 1, row: 1, kind: context, name: Catalog }\\n - { id: order, col: 2, row: 1, kind: context, name: Orders }\\n - { id: pay, col: 3, row: 1, kind: context, name: Payments }\\n - { id: ship, col: 2, row: 2, kind: context, name: Shipping }\\nedges:\\n - { from: order, to: cat, label: reads, kind: dashed }\\n - { from: order, to: pay }\\n - { from: order, to: ship }\\n```\\n',\n network:\n '```network\\ntitle: Security zones\\nnodes:\\n - { id: edge, col: 1, row: 1, kind: gateway, name: Edge / WAF }\\n - { id: fw, col: 2, row: 1, kind: firewall, name: Perimeter FW }\\n - { id: api, col: 3, row: 1, kind: service, name: API }\\n - { id: db, col: 3, row: 2, kind: store, name: DB (private) }\\nedges:\\n - { from: edge, to: fw }\\n - { from: fw, to: api }\\n - { from: api, to: db }\\n```\\n',\n felogic:\n '```felogic\\ntitle: Frontend modules\\nnodes:\\n - { id: hook, col: 1, row: 1, kind: hook, name: useOrders }\\n - { id: svc, col: 2, row: 1, kind: service, name: ordersService }\\n - { id: iface, col: 3, row: 1, kind: interface, name: OrdersClient }\\n - { id: impl, col: 4, row: 1, kind: strategy, name: HttpOrdersClient }\\n - { id: api, col: 5, row: 1, kind: external, name: Orders API }\\nedges:\\n - { from: hook, to: svc }\\n - { from: svc, to: iface, kind: uses }\\n - { from: impl, to: iface, kind: implements }\\n - { from: impl, to: api, kind: egress, label: HTTPS }\\n```\\n',\n belogic:\n '```belogic\\ntitle: Backend modules\\nnodes:\\n - { id: ctrl, col: 1, row: 1, kind: controller, name: OrdersController }\\n - { id: svc, col: 2, row: 1, kind: service, name: PlaceOrder }\\n - { id: repo, col: 3, row: 1, kind: repository, name: OrdersRepo }\\n - { id: db, col: 4, row: 1, kind: db, name: postgres }\\n - { id: pay, col: 3, row: 2, kind: external, name: Stripe }\\nedges:\\n - { from: ctrl, to: svc }\\n - { from: svc, to: repo }\\n - { from: repo, to: db, kind: reads }\\n - { from: svc, to: pay, kind: egress, label: authorise }\\n```\\n',\n dag:\n '```dag\\ntitle: Build pipeline\\nnodes:\\n - { id: src, col: 1, row: 1, kind: start, label: Source }\\n - { id: lint, col: 2, row: 1, kind: process, label: Lint }\\n - { id: test, col: 3, row: 1, kind: process, label: Test }\\n - { id: build, col: 4, row: 1, kind: process, label: Build }\\n - { id: deploy, col: 5, row: 1, kind: end, label: Deploy }\\nedges:\\n - { from: src, to: lint }\\n - { from: lint, to: test }\\n - { from: test, to: build }\\n - { from: build, to: deploy }\\n```\\n',\n wireframe:\n '```wireframe\\ntitle: What the user sees\\nscreens:\\n - device: browser\\n title: Dashboard\\n url: app.example.com\\n label: Desktop\\n elements:\\n - { type: nav, label: \"Home, Inbox, Settings\" }\\n - { type: header, label: Notifications }\\n - { type: list, rows: 4 }\\n - { type: button, label: Mark all as read }\\n - device: phone\\n title: \"9:41\"\\n label: iPhone\\n elements:\\n - { type: header, label: Alerts }\\n - { type: card, rows: 3 }\\n - { type: tabs, label: \"Home, Search, Bell, You\" }\\n```\\n',\n};\n\n/** Returns the template string for a block type. */\nexport function templateFor(type: BlockType): string {\n return `\\`\\`\\`meta\\ntitle: New document\\ntag: DRAFT\\n\\`\\`\\`\\n\\n## ${type}\\n\\n${TEMPLATES[type]}`;\n}\n\n/**\n * Multi-block *document* templates (as opposed to single-block scaffolds).\n * Each is a complete, `avo check`-clean starting doc for a common doc kind.\n */\nconst ADR_TEMPLATE = [\n '```meta',\n 'title: ADR-NNN — decision title',\n 'subtitle: One line on what we decided and why it matters.',\n 'tag: ADR · Proposed · YYYY-MM-DD',\n '```',\n '',\n '## Status',\n '',\n '**Proposed** — YYYY-MM-DD. (Proposed → Accepted → Superseded.)',\n '',\n '## Context',\n '',\n 'What forces a decision here? The constraints, requirements, and the problem',\n 'being solved. Two to four sentences of plain prose — no block needed.',\n '',\n '```callout',\n 'tone: note',\n 'title: Decision',\n 'body: \"State the decision in one or two sentences — what we will do, and the single most important reason why.\"',\n '```',\n '',\n '## Options considered',\n '',\n '```proscons',\n 'id: the-choice',\n 'title: Chosen option vs the alternative',\n 'prosLabel: Chosen option',\n 'consLabel: The alternative',\n 'pros:',\n ' - A concrete reason the chosen option wins',\n ' - Another benefit worth the trade-off',\n 'cons:',\n ' - A real cost of the alternative',\n ' - Another drawback we are accepting against',\n '```',\n '',\n '## Architecture',\n '',\n '```block',\n 'id: architecture',\n 'title: How it fits together',\n 'nodes:',\n ' - { id: client, col: 1, row: 1, kind: client, name: Client }',\n ' - { id: svc, col: 2, row: 1, kind: service, name: Service, tech: your stack }',\n ' - { id: db, col: 3, row: 1, kind: store, name: Database }',\n 'edges:',\n ' - { from: client, to: svc }',\n ' - { from: svc, to: db }',\n '```',\n '',\n '## Consequences',\n '',\n '```tracker',\n 'id: consequences',\n 'title: Consequences & follow-ups',\n 'items:',\n ' - { task: \"Something that becomes easier or newly required\", status: todo, priority: high }',\n ' - { task: \"A migration or new responsibility this creates\", status: todo, priority: med }',\n ' - { task: \"A risk to watch as we roll this out\", status: todo, priority: low }',\n '```',\n '',\n].join('\\n');\n\n/** Full-document templates, keyed by name (`avo new --type adr`). */\nexport const DOC_TEMPLATES: Record<string, string> = {\n adr: ADR_TEMPLATE,\n};\n\n/** True when `name` is a full-document template rather than a block type. */\nexport function isDocTemplate(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(DOC_TEMPLATES, name);\n}\n\n/**\n * Writes a new doc to `out` from the chosen block type. Returns the absolute\n * path written. Non-interactive: requires `type` + `out`.\n */\nexport async function writeNewDoc(opts: { cwd: string; type: string; out: string }): Promise<string> {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n const content = isDocTemplate(opts.type)\n ? (DOC_TEMPLATES[opts.type] as string)\n : templateFor(opts.type as BlockType);\n await writeFile(outAbs, content, 'utf8');\n return outAbs;\n}\n\ninterface PickerProps {\n readonly onPick: (type: BlockType) => void;\n}\n\n/** Ink picker UI for selecting a block type interactively. */\nexport function NewPicker({ onPick }: PickerProps): React.ReactElement {\n const items = BLOCK_TYPES.map((t) => ({ label: t, value: t }));\n return (\n <Box flexDirection=\"column\">\n <Text bold>Pick a block type to scaffold:</Text>\n <SelectInput\n items={items}\n onSelect={(item) => onPick(item.value as BlockType)}\n />\n </Box>\n );\n}\n\ninterface AppProps {\n readonly cwd: string;\n readonly out: string;\n}\n\n/** Full Ink app for interactive `avo new` — picker → write → exit. */\nexport function NewApp({ cwd, out }: AppProps): React.ReactElement {\n const [picked, setPicked] = useState<BlockType | null>(null);\n const [writtenPath, setWrittenPath] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handlePick = (type: BlockType): void => {\n setPicked(type);\n void writeNewDoc({ cwd, type, out }).then((path) => {\n setWrittenPath(path);\n setTimeout(exit, 50);\n });\n };\n\n if (writtenPath !== null) {\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> Wrote </Text>\n <Text bold>{writtenPath}</Text>\n </Box>\n );\n }\n if (picked !== null) {\n return <Text>Writing {out}…</Text>;\n }\n return <NewPicker onPick={handlePick} />;\n}\n","/**\n * Renders a code frame — the offending source line(s) with a caret underline —\n * for a diagnostic, in the style of Rust / TypeScript / Babel errors.\n *\n * Pure and dependency-free; the caller supplies the file's source lines so this\n * stays I/O-free and testable.\n */\n\nimport pc from 'picocolors';\n\n/** Inputs for {@link renderCodeFrame}. */\nexport interface CodeFrameInput {\n /** The file's source split into lines (no trailing newline per line). */\n readonly lines: readonly string[];\n /** 1-based line of the offending token. */\n readonly line: number;\n /** 1-based column of the offending token, if known. */\n readonly column?: number;\n /** 1-based exclusive end column, if known (for a multi-char underline). */\n readonly endColumn?: number;\n /** Number of context lines to show above the offending line. Default 1. */\n readonly contextBefore?: number;\n /** Caret colour: 'error' (red) or 'warn' (yellow). Default 'error'. */\n readonly level?: 'error' | 'warn';\n}\n\n/**\n * Builds a code frame string. Returns an empty string if the line is out of\n * range (so callers can unconditionally append it).\n *\n * @example\n * ```\n * 30 | - { from: Client, kind: bogus }\n * | ^^^^^\n * ```\n */\nexport function renderCodeFrame(input: CodeFrameInput): string {\n const { lines, line } = input;\n if (line < 1 || line > lines.length) return '';\n\n const contextBefore = input.contextBefore ?? 1;\n const start = Math.max(1, line - contextBefore);\n const gutterWidth = String(line).length + 1;\n const tint = input.level === 'warn' ? pc.yellow : pc.red;\n\n const out: string[] = [];\n for (let n = start; n <= line; n++) {\n const text = lines[n - 1] ?? '';\n const gutter = pc.dim(`${String(n).padStart(gutterWidth)} | `);\n out.push(gutter + text);\n }\n\n // Caret line under the offending span.\n if (input.column !== undefined && input.column >= 1) {\n const col = input.column;\n const span = input.endColumn !== undefined ? Math.max(1, input.endColumn - col) : 1;\n const pad = ' '.repeat(gutterWidth) + pc.dim(' | ') + ' '.repeat(col - 1);\n out.push(pad + tint('^'.repeat(span)));\n }\n\n return out.join('\\n');\n}\n","/**\n * Diagnostics rendering for `avo check`.\n *\n * - {@link DiagnosticsTable} is the interactive (TTY) Ink view.\n * - {@link formatDiagnosticsPlain} is the CI / non-TTY text view.\n *\n * Both show a code frame (the offending line with a caret) plus the one-line\n * `hint` and help URL, so an error teaches the fix in place.\n */\n\nimport { Box, Text } from 'ink';\nimport { helpUrl, type Diagnostic } from '@avodado/core';\nimport React from 'react';\nimport { renderCodeFrame } from './codeFrame.js';\n\ntype Sources = ReadonlyMap<string, readonly string[]>;\n\ninterface Props {\n readonly diagnostics: readonly Diagnostic[];\n readonly fileCount: number;\n readonly sources: Sources;\n}\n\nconst COLOR: Record<Diagnostic['level'], string> = {\n error: 'red',\n warn: 'yellow',\n};\n\nfunction frameFor(d: Diagnostic, sources: Sources): string {\n if (d.line === undefined) return '';\n const lines = sources.get(d.file);\n if (lines === undefined) return '';\n return renderCodeFrame({\n lines,\n line: d.line,\n ...(d.column !== undefined ? { column: d.column } : {}),\n ...(d.endColumn !== undefined ? { endColumn: d.endColumn } : {}),\n level: d.level,\n });\n}\n\nexport function DiagnosticsTable({ diagnostics, fileCount, sources }: Props): React.ReactElement {\n const errorCount = diagnostics.filter((d) => d.level === 'error').length;\n const warnCount = diagnostics.filter((d) => d.level === 'warn').length;\n\n if (diagnostics.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n ✓ {fileCount} {fileCount === 1 ? 'file' : 'files'} checked — no diagnostics\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {diagnostics.map((d, i) => {\n const frame = frameFor(d, sources);\n return (\n <Box key={`${d.file}:${d.line ?? '-'}:${i}`} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={COLOR[d.level]} bold>\n {d.level === 'error' ? '✖' : '⚠'}{' '}\n </Text>\n <Text dimColor>\n {d.file}\n {d.line !== undefined ? `:${d.line}` : ''}\n {d.column !== undefined ? `:${d.column}` : ''}{' '}\n </Text>\n <Text color={COLOR[d.level]}>{d.code} </Text>\n <Text>{d.message}</Text>\n </Box>\n {frame.length > 0 ? <Text>{frame}</Text> : null}\n {d.hint !== undefined ? (\n <Text>\n {' '}\n <Text color=\"cyan\">hint:</Text> {d.hint}\n </Text>\n ) : null}\n <Text dimColor>\n {' '}\n {helpUrl(d.code)}\n </Text>\n </Box>\n );\n })}\n <Box>\n <Text bold color={errorCount > 0 ? 'red' : warnCount > 0 ? 'yellow' : 'green'}>\n {errorCount} {errorCount === 1 ? 'error' : 'errors'}, {warnCount}{' '}\n {warnCount === 1 ? 'warning' : 'warnings'} across {fileCount}{' '}\n {fileCount === 1 ? 'file' : 'files'}\n </Text>\n </Box>\n </Box>\n );\n}\n\n/** Formats diagnostics for plain (non-TTY / CI) output. */\nexport function formatDiagnosticsPlain(\n diagnostics: readonly Diagnostic[],\n fileCount: number,\n sources: Sources,\n): string {\n if (diagnostics.length === 0) {\n return `OK: ${fileCount} ${fileCount === 1 ? 'file' : 'files'} checked, no diagnostics\\n`;\n }\n const blocks = diagnostics.map((d) => {\n const loc =\n d.line !== undefined\n ? `${d.file}:${d.line}${d.column !== undefined ? `:${d.column}` : ''}`\n : d.file;\n const parts = [`${loc} ${d.level} ${d.code} ${d.message}`];\n const frame = frameFor(d, sources);\n if (frame.length > 0) parts.push(frame);\n if (d.hint !== undefined) parts.push(` hint: ${d.hint}`);\n return parts.join('\\n');\n });\n const errors = diagnostics.filter((d) => d.level === 'error').length;\n const warns = diagnostics.filter((d) => d.level === 'warn').length;\n blocks.push(`${errors} error(s), ${warns} warning(s) across ${fileCount} file(s)`);\n return blocks.join('\\n\\n') + '\\n';\n}\n","/**\n * A small colored brand banner for the CLI — an avocado half (green rind, amber\n * pit) next to the wordmark. Shown on `avo` / `avo --help` and `avo init`.\n */\n\nimport pc from 'picocolors';\n\nexport function banner(version = '0.0.1'): string {\n const g = pc.green;\n const pit = pc.yellow('●');\n const name = pc.green(pc.bold('avodado'));\n const ver = pc.dim(`v${version}`);\n const tag = pc.dim('Documentation-as-code — Markdown with typed, fenced YAML blocks.');\n return [\n '',\n ` ${g('╭───────╮')}`,\n ` ${g('│ ')}${pit}${g(' ')}${pit}${g(' │')} ${name} ${ver}`,\n ` ${g('│ ')}${pc.yellow('◡')}${g(' │')} ${tag}`,\n ` ${g('╰───────╯')}`,\n '',\n ].join('\\n');\n}\n\n/** The \"what do I actually do\" workflow, shown after top-level help. */\nexport function examples(): string {\n const step = (n: string, cmd: string, note: string): string =>\n ` ${pc.dim(n)} ${pc.cyan(cmd.padEnd(26))}${pc.dim(note)}`;\n return [\n '',\n pc.bold('Workflow:'),\n step('1', 'avo init', 'scaffold docs/, config, and the agent skill'),\n step('2', 'edit docs/*.md', 'prose + typed blocks (grammar in .avodado/skill)'),\n step('3', 'avo check', 'validate — exits non-zero on errors (use in CI)'),\n step('4', 'avo preview docs/x.md', 'render and open it in your browser'),\n '',\n ` ${pc.dim('Per-command help:')} avo ${pc.cyan('<command>')} --help`,\n ` ${pc.dim('Docs:')} https://github.com/jdiejim/avodado`,\n '',\n ].join('\\n');\n}\n","/**\n * TTY-awareness helpers. The CLI renders Ink only when stdout is a TTY and the\n * environment is not CI; otherwise it falls back to plain, log-friendly output\n * so logs stay parseable.\n */\n\n/** True when the process is running interactively (TTY, not CI, not AVO_PLAIN). */\nexport const isInteractive: boolean =\n process.stdout.isTTY === true &&\n process.env['CI'] !== 'true' &&\n process.env['AVO_PLAIN'] !== '1';\n","/**\n * CLI dispatcher. Parses argv via commander, runs the matching command, and\n * decides between Ink rendering, plain output, and JSON output based on\n * {@link isInteractive} and `--json` flags.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport React from 'react';\nimport { render as inkRender, Text } from 'ink';\nimport { loadConfig } from './io/config.js';\nimport { runCheck } from './commands/check.js';\nimport { runRender } from './commands/render.js';\nimport { runExport, type ExportFormat } from './commands/export.js';\nimport { runPreview } from './commands/preview.js';\nimport { runInit } from './commands/init.js';\nimport { runSyncOpenApi } from './commands/sync.js';\nimport { NewApp, templateFor, writeNewDoc, DOC_TEMPLATES, isDocTemplate } from './commands/new.js';\nimport { DiagnosticsTable, formatDiagnosticsPlain } from './ui/DiagnosticsTable.js';\nimport { banner, examples } from './ui/banner.js';\nimport { isInteractive } from './tty.js';\nimport type { BlockType } from '@avodado/core';\nimport { BLOCK_TYPES } from '@avodado/core';\n\n/** Runs the CLI for the given argv (typically `process.argv`). */\nexport async function main(argv: readonly string[]): Promise<number> {\n const program = new Command();\n program\n .name('avo')\n .description('Author, validate, render, and export Avodado documentation.')\n .version('0.0.1')\n // Banner + workflow only on top-level help — not on every subcommand's --help.\n .addHelpText('beforeAll', (ctx) => (ctx.command.name() === 'avo' ? banner() : ''))\n .addHelpText('after', (ctx) => (ctx.command.name() === 'avo' ? examples() : ''))\n .exitOverride();\n\n let exitCode = 0;\n\n program\n .command('init')\n .description('Scaffold a new Avodado project in the current directory')\n .option('--force', 'overwrite existing files')\n .action(async (opts: { force?: boolean }) => {\n const cwd = process.cwd();\n const result = await runInit({ cwd, ...(opts.force ? { force: true } : {}) });\n for (const f of result.created) console.log(pc.green('+ ') + f);\n for (const f of result.skipped) console.log(pc.dim(' skip ') + f + pc.dim(' (exists)'));\n console.log(\n pc.bold(\n `\\nCreated ${result.created.length} file(s), skipped ${result.skipped.length}.\\n` +\n `Next: avo check`,\n ),\n );\n });\n\n program\n .command('new')\n .description('Scaffold a new doc from a block template')\n .option(\n '--type <kind>',\n 'doc template (' + Object.keys(DOC_TEMPLATES).join(', ') + ') or block type (' + BLOCK_TYPES.join(', ') + ')',\n )\n .option('--out <path>', 'output file path')\n .action(async (opts: { type?: string; out?: string }) => {\n const cwd = process.cwd();\n const type = opts.type;\n if (type !== undefined && !BLOCK_TYPES.includes(type as BlockType) && !isDocTemplate(type)) {\n console.error(pc.red(`Unknown type: ${opts.type ?? ''}`));\n exitCode = 2;\n return;\n }\n if (!isInteractive) {\n if (type === undefined || opts.out === undefined) {\n console.error(pc.red('In non-interactive mode, both --type and --out are required.'));\n exitCode = 2;\n return;\n }\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n if (type !== undefined && opts.out !== undefined) {\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n const out = opts.out ?? './docs/new-doc.md';\n const { waitUntilExit } = inkRender(<NewApp cwd={cwd} out={out} />);\n await waitUntilExit();\n });\n\n program\n .command('check [globs...]')\n .description('Validate documents (default: docs/**/*.md)')\n .option('--json', 'emit machine-readable JSON')\n .action(async (globs: string[], opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const result = await runCheck({ patterns, cwd, docsRoot: config.docsDir });\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ diagnostics: result.diagnostics, files: result.files }, null, 2) + '\\n',\n );\n } else if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <DiagnosticsTable\n diagnostics={result.diagnostics}\n fileCount={result.files.length}\n sources={result.sources}\n />,\n );\n await waitUntilExit();\n } else {\n process.stdout.write(\n formatDiagnosticsPlain(result.diagnostics, result.files.length, result.sources),\n );\n }\n exitCode = result.exitCode;\n });\n\n program\n .command('render <input>')\n .description('Render one document to a standalone HTML file')\n .option('-o, --output <path>', 'output file path (defaults to <input>.html)')\n .action(async (input: string, opts: { output?: string }) => {\n const cwd = process.cwd();\n const result = await runRender({\n cwd,\n input,\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n });\n if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <Text>\n <Text color=\"green\">✓ </Text>Wrote <Text bold>{result.output}</Text>{' '}\n <Text dimColor>({result.bytes} bytes)</Text>\n </Text>,\n );\n await waitUntilExit();\n } else {\n console.log(`${pc.green('✓')} rendered ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n }\n });\n\n program\n .command('export [globs...]')\n .description('Batch-export documents to HTML and/or PDF')\n .option('--format <list>', 'comma-separated formats: html,pdf', 'html')\n .option('--out <dir>', 'output directory (defaults to config outDir or dist)')\n .action(async (globs: string[], opts: { format: string; out?: string }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const formats = opts.format\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter((s): s is ExportFormat => s === 'html' || s === 'pdf');\n if (formats.length === 0) {\n console.error(pc.red('No valid --format specified (expected html, pdf, or both).'));\n exitCode = 2;\n return;\n }\n const result = await runExport({\n cwd,\n patterns,\n docsRoot: config.docsDir,\n outDir: opts.out ?? config.outDir,\n formats,\n });\n for (const item of result.items) {\n for (const o of item.outputs) {\n console.log(`${pc.green('✓')} ${o.path} ${pc.dim(`(${o.bytes} bytes)`)}`);\n }\n }\n console.log(pc.bold(`\\n${result.items.length} document(s) exported.`));\n });\n\n program\n .command('preview <input>')\n .description('Render a document to a temp HTML file and open it')\n .action(async (input: string) => {\n const cwd = process.cwd();\n const result = await runPreview({ cwd, input });\n console.log(pc.green('✓ ') + 'Opened ' + result.file);\n });\n\n const syncCmd = program.command('sync').description('Generate Avodado docs from external sources (OpenAPI)');\n syncCmd\n .command('openapi <spec>')\n .description('Generate (or drift-check) a doc from an OpenAPI 3.x spec')\n .option('-o, --out <path>', 'write generated markdown to this path')\n .option('--check <path>', 'compare against an existing doc and fail on drift')\n .option('--slug <slug>', 'block-id namespace (defaults to the output basename)')\n .action(\n async (\n spec: string,\n opts: { out?: string; check?: string; slug?: string },\n ) => {\n const result = await runSyncOpenApi({\n cwd: process.cwd(),\n spec,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.check !== undefined ? { check: opts.check } : {}),\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n });\n if (result.exitCode === 0) {\n console.log(pc.green('✓ ') + result.message);\n } else {\n console.error(pc.red(result.message));\n if (result.diff !== undefined) console.error(result.diff);\n }\n exitCode = result.exitCode;\n },\n );\n\n try {\n await program.parseAsync(argv as string[], { from: 'node' });\n } catch (err) {\n const e = err as Error & { code?: string; exitCode?: number };\n if (e.code === 'commander.helpDisplayed' || e.code === 'commander.version') {\n return 0;\n }\n if (e.code === 'commander.help') return 0;\n if (typeof e.exitCode === 'number' && e.code?.startsWith('commander.')) {\n return e.exitCode;\n }\n console.error(pc.red(e.message ?? String(err)));\n return 1;\n }\n\n return exitCode;\n}\n\n// Re-export the template helper for tests + downstream consumers.\nexport { templateFor };\n","/**\n * `avo` CLI entry point. Tsup adds the `#!/usr/bin/env node` shebang at build\n * time; this file is the JS that runs after.\n */\n\nimport { main } from './app.js';\n\nconst code = await main(process.argv);\nprocess.exit(code);\n"]}
1
+ {"version":3,"sources":["../src/io/config.ts","../src/io/files.ts","../src/commands/check.tsx","../src/io/theme.ts","../src/commands/render.ts","../src/commands/export.ts","../src/commands/preview.ts","../src/commands/init.ts","../src/commands/InitApp.tsx","../src/commands/sync.ts","../src/commands/new.tsx","../src/ui/codeFrame.ts","../src/ui/DiagnosticsTable.tsx","../src/ui/banner.ts","../src/tty.ts","../src/app.tsx","../src/bin.ts"],"names":["yamlParse","resolve","existsSync","readFileSync","readFile","parsePath","parseDocument","mkdir","writeFile","renderDocument","join","dirname","basename","jsxs","Box","jsx","Text","SelectInput","useState","useApp","pc","fileURLToPath","inkRender","result","BLOCK_TYPES"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * Loads `avodado.config.{ts,json,yml}` from the project root.\n *\n * Defaults are returned if no config is found, so most users never need a\n * config file.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as yamlParse } from 'yaml';\nimport { createJiti } from 'jiti';\n\n/** Loaded configuration. */\nexport interface AvodadoConfig {\n /** Where docs live (relative to project root). Defaults to `docs`. */\n readonly docsDir: string;\n /** Where rendered output goes (relative to project root). Defaults to `dist`. */\n readonly outDir: string;\n}\n\nconst DEFAULTS: AvodadoConfig = { docsDir: 'docs', outDir: 'dist' };\n\nconst CONFIG_FILES = [\n 'avodado.config.ts',\n 'avodado.config.js',\n 'avodado.config.mjs',\n 'avodado.config.json',\n 'avodado.config.yml',\n 'avodado.config.yaml',\n];\n\n/** Loads a config file from `cwd`, returning defaults if none exists. */\nexport async function loadConfig(cwd: string): Promise<AvodadoConfig> {\n for (const name of CONFIG_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n const raw = await readConfig(path);\n return mergeWithDefaults(raw);\n }\n return DEFAULTS;\n}\n\nasync function readConfig(path: string): Promise<unknown> {\n if (path.endsWith('.json')) {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown;\n }\n if (path.endsWith('.yml') || path.endsWith('.yaml')) {\n return yamlParse(readFileSync(path, 'utf8')) as unknown;\n }\n const jiti = createJiti(import.meta.url);\n const mod = (await jiti.import(path)) as { default?: unknown };\n return mod.default ?? mod;\n}\n\nfunction mergeWithDefaults(raw: unknown): AvodadoConfig {\n if (raw === null || typeof raw !== 'object') return DEFAULTS;\n const r = raw as { docsDir?: unknown; outDir?: unknown };\n return {\n docsDir: typeof r.docsDir === 'string' ? r.docsDir : DEFAULTS.docsDir,\n outDir: typeof r.outDir === 'string' ? r.outDir : DEFAULTS.outDir,\n };\n}\n","/**\n * File-system helpers: glob expansion, document reading, slug derivation.\n *\n * Slug rule: a doc's slug is its path relative to the docs root, stripped of\n * `.md` and normalised to forward slashes. Files outside the docs root fall\n * back to their basename without `.md`.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, relative, resolve, sep } from 'node:path';\nimport fg from 'fast-glob';\n\n/** A document file on disk, with derived slug. */\nexport interface DocFile {\n /** Absolute path on disk. */\n readonly absolute: string;\n /** Path relative to cwd (used in diagnostics). */\n readonly file: string;\n /** Slug derived from path under the docs root. */\n readonly slug: string;\n /** Raw markdown source. */\n readonly source: string;\n}\n\n/**\n * Expands one or more glob patterns to a list of {@link DocFile}s with read\n * content and derived slugs.\n *\n * @param patterns - One or more glob patterns (relative to `cwd`).\n * @param cwd - The working directory the patterns resolve from.\n * @param docsRoot - The docs root the slug is derived against.\n */\nexport async function loadDocs(\n patterns: readonly string[],\n cwd: string,\n docsRoot: string,\n): Promise<DocFile[]> {\n const matches = await fg(patterns as string[], {\n cwd,\n absolute: true,\n onlyFiles: true,\n dot: false,\n });\n const docsRootAbs = resolve(cwd, docsRoot);\n const files = await Promise.all(\n matches.map(async (absolute): Promise<DocFile> => {\n const file = relative(cwd, absolute);\n const slug = deriveSlug(absolute, docsRootAbs);\n const source = await readFile(absolute, 'utf8');\n return { absolute, file, slug, source };\n }),\n );\n files.sort((a, b) => a.file.localeCompare(b.file));\n return files;\n}\n\nfunction deriveSlug(absolute: string, docsRootAbs: string): string {\n const rel = relative(docsRootAbs, absolute);\n const inside = !rel.startsWith('..') && !rel.startsWith(sep) && rel.length > 0;\n const path = inside ? rel : basename(absolute);\n return path.replace(/\\\\/g, '/').replace(/\\.md$/i, '');\n}\n","/**\n * `avo check` — validate one or more documents and report diagnostics.\n *\n * Pure {@link runCheck} returns `{ diagnostics, exitCode }`. The UI layer\n * picks how to render: JSON, Ink table (interactive TTY), or plain text (CI).\n */\n\nimport { parseDocument, resolveRefs, validateDocument, type Diagnostic, type Document } from '@avodado/core';\nimport { loadDocs, type DocFile } from '../io/files.js';\n\n/** Inputs to {@link runCheck}. */\nexport interface CheckOptions {\n /** Glob patterns to expand. */\n readonly patterns: readonly string[];\n /** Working directory. */\n readonly cwd: string;\n /** Docs root for slug derivation. */\n readonly docsRoot: string;\n}\n\n/** Result of running `avo check` — diagnostics aggregated across all matched docs. */\nexport interface CheckResult {\n /** All diagnostics in file/line order. */\n readonly diagnostics: readonly Diagnostic[];\n /** Files that were checked. */\n readonly files: readonly string[];\n /** Per-file source lines, for code frames (keyed by the diagnostic `file`). */\n readonly sources: ReadonlyMap<string, readonly string[]>;\n /** Suggested exit code: 0 = clean, 1 = errors present. */\n readonly exitCode: 0 | 1;\n}\n\n/**\n * Validates a set of documents and resolves references across them.\n *\n * @param opts - Options including glob patterns and docs root.\n * @returns Aggregated diagnostics + suggested exit code.\n */\nexport async function runCheck(opts: CheckOptions): Promise<CheckResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const parsed: { doc: Document; file: string }[] = docs.map((d) => ({\n doc: parseDocument(d.source, d.slug),\n file: d.file,\n }));\n\n const diagnostics: Diagnostic[] = [];\n\n for (const { doc, file } of parsed) {\n diagnostics.push(...validateDocument(doc, file));\n }\n\n const resolved = resolveRefs(parsed);\n diagnostics.push(...resolved.diagnostics);\n\n diagnostics.sort((a, b) => {\n const f = a.file.localeCompare(b.file);\n if (f !== 0) return f;\n return (a.line ?? 0) - (b.line ?? 0);\n });\n\n const exitCode = diagnostics.some((d) => d.level === 'error') ? 1 : 0;\n\n const sources = new Map<string, readonly string[]>();\n for (const d of docs) sources.set(d.file, d.source.split(/\\r\\n|\\r|\\n/));\n\n return {\n diagnostics,\n files: docs.map((d: DocFile) => d.file),\n sources,\n exitCode,\n };\n}\n","/**\n * Loads a project theme file (`avodado.theme.json`) and maps its friendly\n * color/font names to the CSS variables the renderer reads.\n *\n * The whole point: a user edits one small JSON file with human names\n * (`primary`, `accent`, `ink`…) and re-runs `avo render` — no rebuild, no\n * CSS knowledge. Anything omitted falls back to the built-in theme.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/** Friendly theme-file shape. Every field is optional. */\nexport interface ThemeFile {\n /** Optional name, for your own reference. */\n readonly name?: string;\n /** Base built-in theme to start from: minimal | teal | plum | slate | dark | soft. */\n readonly theme?: string;\n /** Friendly color name → hex/CSS color. */\n readonly colors?: Readonly<Record<string, string>>;\n /** Friendly font slot → CSS font-family stack. */\n readonly fonts?: Readonly<Record<string, string>>;\n}\n\n/** Resolved theme: a base theme name and/or custom variable overrides. */\nexport interface LoadedTheme {\n readonly theme?: string;\n readonly themeVars?: Readonly<Record<string, string>>;\n}\n\nconst BASE_THEMES = new Set(['minimal', 'teal', 'plum', 'slate', 'dark', 'soft']);\n\n/** Friendly color name → internal CSS variable. */\nconst COLOR_TO_VAR: Readonly<Record<string, string>> = {\n primary: '--navy', // headings, primary nodes, links, section numbers\n secondary: '--blue', // secondary accents, CDN/consumer nodes\n accent: '--highlight', // highlight pills, FK keys, \"current\" markers\n positive: '--positive', // success / service nodes / done\n negative: '--negative', // errors / forbidden edges / danger\n purple: '--purple', // data / context / provider nodes\n teal: '--teal', // queues / topics / caches\n ink: '--charcoal', // body text\n muted: '--gray', // captions, dim text, external nodes\n rule: '--rule', // hairlines, borders, dividers\n paper: '--white', // surfaces / card fills\n};\n\n/** Friendly font slot → internal CSS variable. */\nconst FONT_TO_VAR: Readonly<Record<string, string>> = {\n display: '--font-display', // titles / headings\n body: '--font-body', // paragraphs / labels\n mono: '--font-mono', // code / technical labels\n};\n\nconst THEME_FILES = ['avodado.theme.json', 'avodado.theme.jsonc'];\n\n/**\n * Reads the project theme file (if any) and returns CSS-variable overrides\n * ready to pass to `renderDocument({ themeVars })`. Returns `undefined` when\n * there is no theme file, so the default theme is used unchanged.\n *\n * Unknown color/font names are ignored (a warning is the caller's choice) so a\n * typo never crashes a render.\n */\nexport function loadTheme(cwd: string): LoadedTheme {\n for (const name of THEME_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n let raw: unknown;\n try {\n raw = JSON.parse(stripComments(readFileSync(path, 'utf8'))) as unknown;\n } catch {\n return {}; // malformed file → fall back to default theme\n }\n const file = raw !== null && typeof raw === 'object' ? (raw as ThemeFile) : {};\n const out: { theme?: string; themeVars?: Readonly<Record<string, string>> } = {};\n if (typeof file.theme === 'string' && BASE_THEMES.has(file.theme)) out.theme = file.theme;\n const vars = toVars(raw);\n if (vars !== undefined) out.themeVars = vars;\n return out;\n }\n return {};\n}\n\n/** Converts a parsed theme file into CSS-variable overrides. */\nfunction toVars(raw: unknown): Readonly<Record<string, string>> | undefined {\n if (raw === null || typeof raw !== 'object') return undefined;\n const file = raw as ThemeFile;\n const vars: Record<string, string> = {};\n if (file.colors !== undefined) {\n for (const key of Object.keys(file.colors)) {\n const cssVar = COLOR_TO_VAR[key.toLowerCase()];\n const value = file.colors[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n if (file.fonts !== undefined) {\n for (const key of Object.keys(file.fonts)) {\n const cssVar = FONT_TO_VAR[key.toLowerCase()];\n const value = file.fonts[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n return Object.keys(vars).length > 0 ? vars : undefined;\n}\n\n/** Strips `//` line comments so `.jsonc`-style files parse. */\nfunction stripComments(src: string): string {\n return src.replace(/^\\s*\\/\\/.*$/gm, '');\n}\n","/**\n * `avo render` — render one document to a standalone HTML file.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, parse as parsePath, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument, type ThemeName } from '@avodado/render';\nimport { loadTheme } from '../io/theme.js';\n\nexport interface RenderOptions {\n /** Input doc path. */\n readonly input: string;\n /** Output path. Defaults to `<input>.html` next to the input. */\n readonly output?: string;\n /** Working directory. */\n readonly cwd: string;\n}\n\n/** Result of a render. */\nexport interface RenderResult {\n readonly input: string;\n readonly output: string;\n readonly bytes: number;\n}\n\n/**\n * Reads `opts.input`, parses + renders it, and writes the resulting HTML.\n *\n * @returns The output path and byte size written.\n */\nexport async function runRender(opts: RenderOptions): Promise<RenderResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const { theme, themeVars } = loadTheme(opts.cwd);\n const html = renderDocument(doc, {\n ...(theme !== undefined ? { theme: theme as ThemeName } : {}),\n ...(themeVars !== undefined ? { themeVars } : {}),\n });\n\n const outputAbs = opts.output !== undefined ? resolve(opts.cwd, opts.output) : inputAbs.replace(/\\.md$/i, '.html');\n await mkdir(dirname(outputAbs), { recursive: true });\n await writeFile(outputAbs, html, 'utf8');\n return { input: opts.input, output: outputAbs, bytes: html.length };\n}\n","/**\n * `avo export` — batch-export one or more documents to HTML and/or PDF.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { toHtml, toPdf } from '@avodado/export';\nimport { loadDocs } from '../io/files.js';\n\nexport type ExportFormat = 'html' | 'pdf';\n\nexport interface ExportOptions {\n readonly patterns: readonly string[];\n readonly cwd: string;\n readonly docsRoot: string;\n readonly outDir: string;\n readonly formats: readonly ExportFormat[];\n}\n\nexport interface ExportItem {\n readonly file: string;\n readonly outputs: readonly { format: ExportFormat; path: string; bytes: number }[];\n}\n\nexport interface ExportResult {\n readonly items: readonly ExportItem[];\n}\n\n/**\n * Reads, parses, and renders each matched document into one or more output\n * formats under `outDir`. Filenames mirror the doc's slug.\n */\nexport async function runExport(opts: ExportOptions): Promise<ExportResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const outRoot = resolve(opts.cwd, opts.outDir);\n await mkdir(outRoot, { recursive: true });\n\n const items: ExportItem[] = [];\n for (const d of docs) {\n const doc = parseDocument(d.source, d.slug);\n const outputs: { format: ExportFormat; path: string; bytes: number }[] = [];\n for (const fmt of opts.formats) {\n const outPath = join(outRoot, `${d.slug}.${fmt}`);\n await mkdir(resolve(outPath, '..'), { recursive: true });\n if (fmt === 'html') {\n const html = toHtml(doc);\n await writeFile(outPath, html, 'utf8');\n outputs.push({ format: fmt, path: outPath, bytes: html.length });\n } else {\n const pdf = await toPdf(doc);\n await writeFile(outPath, pdf);\n outputs.push({ format: fmt, path: outPath, bytes: pdf.byteLength });\n }\n }\n items.push({ file: d.file, outputs });\n }\n return { items };\n}\n","/**\n * `avo preview` — render a single doc to a temp HTML file and open it in the\n * default browser.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { join, parse as parsePath, resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument } from '@avodado/render';\n\nexport interface PreviewOptions {\n readonly input: string;\n readonly cwd: string;\n}\n\nexport interface PreviewResult {\n readonly file: string;\n}\n\n/**\n * Renders the doc to a temp file (named by a hash of the source path so\n * repeated previews reuse the same file) and opens it in the OS browser.\n */\nexport async function runPreview(opts: PreviewOptions): Promise<PreviewResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const html = renderDocument(doc);\n\n const hash = createHash('sha1').update(inputAbs).digest('hex').slice(0, 8);\n const dir = join(tmpdir(), 'avodado-preview');\n await mkdir(dir, { recursive: true });\n const out = join(dir, `${slug}-${hash}.html`);\n await writeFile(out, html, 'utf8');\n await open(out);\n return { file: out };\n}\n","/**\n * `avo init` — scaffold a new Avodado project in the current directory.\n *\n * Always writes the base tree (docs sample, config, the authoring skill).\n * Editor adapters (Claude Code, Cursor, Copilot, Windsurf) and the theme file\n * are written based on the caller's selections — the interactive wizard\n * ({@link InitApp}) collects them, but they can also be passed directly.\n */\n\nimport { cp, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** AI tools `avo init` can generate an adapter file for. */\nexport type AiTool = 'claude' | 'cursor' | 'copilot' | 'windsurf';\n\n/** Display metadata + target path for each AI-tool adapter. */\nexport const AI_TOOLS: ReadonlyArray<{ id: AiTool; label: string; file: string }> = [\n { id: 'claude', label: 'Claude Code', file: 'CLAUDE.md' },\n { id: 'cursor', label: 'Cursor', file: '.cursor/rules/avodado.mdc' },\n { id: 'copilot', label: 'GitHub Copilot', file: '.github/copilot-instructions.md' },\n { id: 'windsurf', label: 'Windsurf', file: '.windsurfrules' },\n];\n\nconst ADAPTER_FILE: Readonly<Record<AiTool, string>> = {\n claude: 'CLAUDE.md',\n cursor: '.cursor/rules/avodado.mdc',\n copilot: '.github/copilot-instructions.md',\n windsurf: '.windsurfrules',\n};\n\n/** Files always written, regardless of selections. */\nconst BASE_FILES: readonly string[] = [\n 'avodado.config.json',\n 'docs/getting-started.md',\n '.avodado/skill/SKILL.md',\n];\n\nexport interface InitOptions {\n readonly cwd: string;\n /** Overwrite files that already exist. Default: false (skip with a notice). */\n readonly force?: boolean;\n /** Which AI-tool adapters to generate. Default: all of them. */\n readonly tools?: readonly AiTool[];\n /** Built-in theme name to record in `avodado.theme.json`. */\n readonly theme?: string;\n /**\n * Scaffold a full `avodado.theme.json` with friendly color/font slots to edit.\n * When false, a theme file is only written if `theme` is a non-default theme.\n */\n readonly customTheme?: boolean;\n}\n\nexport interface InitResult {\n readonly created: readonly string[];\n readonly skipped: readonly string[];\n}\n\n/**\n * Resolves the templates directory packaged with the CLI.\n *\n * Walks up from this module's location looking for a `templates` sibling.\n * Works for both `dist/bin.js` (one level up) and source layout\n * (`src/commands/init.ts`, two levels up).\n */\nfunction templatesDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'templates');\n if (existsSync(candidate) && statSync(candidate).isDirectory()) return candidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(`Could not locate avodado/cli templates directory near ${import.meta.url}`);\n}\n\n/** Builds the `avodado.theme.json` contents for a chosen base theme. */\nfunction themeFileContents(theme: string, custom: boolean): string {\n const base: Record<string, unknown> = {\n name: 'My theme',\n '//': '1) Pick a base theme. 2) Optionally override colors/fonts. Re-run `avo render` — no rebuild.',\n theme,\n '//theme-options': 'minimal (default, clean white) | soft (modern, white) | dark | teal | plum | slate',\n };\n if (custom) {\n base['//colors'] =\n 'Optional overrides on top of the base theme. Any of: primary, secondary, accent, positive, negative, purple, teal, ink, muted, rule, paper. Values are any CSS color.';\n base['colors'] = {};\n base['//fonts'] = 'Optional. display | body | mono. Use single quotes inside font names.';\n base['fonts'] = {};\n }\n return JSON.stringify(base, null, 2) + '\\n';\n}\n\n/**\n * Scaffolds an Avodado project into `cwd`. Writes the base tree, the adapters\n * for the selected `tools` (defaults to all), and — when a non-default or custom\n * theme is chosen — an `avodado.theme.json`. Existing files are skipped unless\n * `force: true`. Returns the created/skipped relative paths for reporting.\n */\nexport async function runInit(opts: InitOptions): Promise<InitResult> {\n const srcRoot = templatesDir();\n const created: string[] = [];\n const skipped: string[] = [];\n\n const tools = opts.tools ?? AI_TOOLS.map((t) => t.id);\n const copyList = [...BASE_FILES, ...tools.map((t) => ADAPTER_FILE[t])];\n\n for (const rel of copyList) {\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n continue;\n }\n await mkdir(dirname(dst), { recursive: true });\n await cp(resolve(srcRoot, rel), dst);\n created.push(rel);\n }\n\n // Theme file: only when the user picked a non-default theme or asked for a\n // custom scaffold (the default `minimal` needs no file).\n const wantThemeFile = opts.customTheme === true || (opts.theme !== undefined && opts.theme !== 'minimal');\n if (wantThemeFile) {\n const rel = 'avodado.theme.json';\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n } else {\n await writeFile(dst, themeFileContents(opts.theme ?? 'minimal', opts.customTheme === true), 'utf8');\n created.push(rel);\n }\n }\n\n return { created, skipped };\n}\n","/**\n * Interactive `avo init` wizard (Ink).\n *\n * Two steps: a multi-select for AI-tool adapters (space toggles, enter confirms)\n * and a single-select theme picker (with a \"Custom…\" option that scaffolds\n * `avodado.theme.json`). It then runs {@link runInit} and hands the result back\n * via `onComplete` so the CLI can print the summary after Ink unmounts.\n */\n\nimport React, { useState } from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { runInit, AI_TOOLS, type AiTool, type InitResult } from './init.js';\n\nconst CUSTOM = '__custom__';\n\nconst THEME_ITEMS: ReadonlyArray<{ label: string; value: string }> = [\n { label: 'Minimal — clean modern white (default)', value: 'minimal' },\n { label: 'Soft — modern light, indigo accent', value: 'soft' },\n { label: 'Dark — full dark mode', value: 'dark' },\n { label: 'Teal — teal + amber', value: 'teal' },\n { label: 'Plum — plum + pink', value: 'plum' },\n { label: 'Slate — slate sans', value: 'slate' },\n { label: 'Custom… — scaffold avodado.theme.json to edit', value: CUSTOM },\n];\n\ninterface InitAppProps {\n readonly cwd: string;\n readonly force?: boolean;\n readonly onComplete: (result: InitResult, theme: string) => void;\n}\n\nexport function InitApp({ cwd, force, onComplete }: InitAppProps): React.JSX.Element {\n const { exit } = useApp();\n const [step, setStep] = useState<'tools' | 'theme' | 'working'>('tools');\n const [cursor, setCursor] = useState(0);\n const [selected, setSelected] = useState<Set<AiTool>>(new Set(AI_TOOLS.map((t) => t.id)));\n\n useInput((input, key) => {\n if (step !== 'tools') return;\n if (key.upArrow) setCursor((c) => (c - 1 + AI_TOOLS.length) % AI_TOOLS.length);\n else if (key.downArrow) setCursor((c) => (c + 1) % AI_TOOLS.length);\n else if (input === ' ') {\n const tool = AI_TOOLS[cursor];\n if (tool === undefined) return;\n const id = tool.id;\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n } else if (key.return) {\n setStep('theme');\n }\n });\n\n async function finish(themeValue: string): Promise<void> {\n setStep('working');\n const custom = themeValue === CUSTOM;\n const theme = custom ? 'minimal' : themeValue;\n const result = await runInit({\n cwd,\n ...(force === true ? { force: true } : {}),\n tools: AI_TOOLS.map((t) => t.id).filter((id) => selected.has(id)),\n theme,\n ...(custom ? { customTheme: true } : {}),\n });\n onComplete(result, theme);\n exit();\n }\n\n if (step === 'tools') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n Which AI tools do you use?{' '}\n <Text dimColor>(↑↓ move · space toggle · enter continue)</Text>\n </Text>\n {AI_TOOLS.map((t, i) => {\n const on = selected.has(t.id);\n return (\n <Text key={t.id} {...(i === cursor ? { color: 'green' } : {})}>\n {i === cursor ? '❯ ' : ' '}\n {on ? <Text color=\"green\">◉</Text> : <Text dimColor>◯</Text>} {t.label}{' '}\n <Text dimColor>→ {t.file}</Text>\n </Text>\n );\n })}\n </Box>\n );\n }\n\n if (step === 'theme') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Pick a theme:</Text>\n <SelectInput items={[...THEME_ITEMS]} onSelect={(item) => void finish(item.value)} />\n </Box>\n );\n }\n\n return <Text dimColor>Scaffolding…</Text>;\n}\n","/**\n * `avo sync openapi` — generate an Avodado doc from an OpenAPI spec, or\n * verify that an existing doc matches what the spec would generate (CI drift).\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, resolve, extname } from 'node:path';\nimport { openapiToMarkdown, parseOpenApi } from '@avodado/sync';\n\n/** Inputs for {@link runSyncOpenApi}. */\nexport interface SyncOpenApiOptions {\n readonly cwd: string;\n /** Path to the OpenAPI spec (relative or absolute). */\n readonly spec: string;\n /** Output path (write mode). Mutually exclusive with `check`. */\n readonly out?: string;\n /** Path to compare generated output against (drift mode). */\n readonly check?: string;\n /** Slug used to namespace generated block ids. Defaults to the output basename. */\n readonly slug?: string;\n}\n\n/** Result of `avo sync openapi`. */\nexport interface SyncOpenApiResult {\n readonly exitCode: 0 | 1 | 2;\n /** A short, plain-text summary suitable for logging. */\n readonly message: string;\n /** When `check` mode finds drift: the line-level diff. */\n readonly diff?: string;\n}\n\nfunction slugFromPath(path: string): string {\n const base = basename(path, extname(path));\n return base.length > 0 ? base : 'api';\n}\n\n/**\n * Generates an Avodado doc from an OpenAPI spec — either writing it to disk,\n * or comparing the in-memory result against an existing doc on disk and\n * reporting drift.\n */\nexport async function runSyncOpenApi(opts: SyncOpenApiOptions): Promise<SyncOpenApiResult> {\n if (opts.out === undefined && opts.check === undefined) {\n return { exitCode: 2, message: 'avo sync openapi: must specify --out <path> or --check <path>' };\n }\n if (opts.out !== undefined && opts.check !== undefined) {\n return { exitCode: 2, message: 'avo sync openapi: --out and --check are mutually exclusive' };\n }\n\n const specAbs = resolve(opts.cwd, opts.spec);\n if (!existsSync(specAbs)) {\n return { exitCode: 2, message: `Spec not found: ${specAbs}` };\n }\n\n const source = await readFile(specAbs, 'utf8');\n let spec;\n try {\n spec = parseOpenApi(source);\n } catch (err) {\n return { exitCode: 1, message: `Failed to parse spec: ${(err as Error).message}` };\n }\n\n const targetPath = opts.out ?? opts.check;\n if (targetPath === undefined) {\n return { exitCode: 2, message: 'no target path' };\n }\n const slug = opts.slug ?? slugFromPath(targetPath);\n const generated = openapiToMarkdown(spec, { slug });\n\n if (opts.out !== undefined) {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, generated, 'utf8');\n return {\n exitCode: 0,\n message: `Wrote ${outAbs} (${generated.length} bytes)`,\n };\n }\n\n // Check mode — compare against existing file.\n const checkAbs = resolve(opts.cwd, opts.check ?? '');\n if (!existsSync(checkAbs)) {\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} does not exist. Run with --out ${opts.check} to generate it.`,\n };\n }\n const existing = await readFile(checkAbs, 'utf8');\n if (existing === generated) {\n return {\n exitCode: 0,\n message: `OK: ${checkAbs} matches ${specAbs} (${generated.length} bytes)`,\n };\n }\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} differs from what ${specAbs} would generate.`,\n diff: simpleDiff(existing, generated),\n };\n}\n\n/** Tiny line-level diff for the drift report. Not a full diff library; good enough for CI. */\nfunction simpleDiff(a: string, b: string): string {\n const aLines = a.split('\\n');\n const bLines = b.split('\\n');\n const out: string[] = [];\n const max = Math.max(aLines.length, bLines.length);\n for (let i = 0; i < max; i++) {\n const av = aLines[i];\n const bv = bLines[i];\n if (av === bv) continue;\n if (av !== undefined) out.push(`- ${av}`);\n if (bv !== undefined) out.push(`+ ${bv}`);\n if (out.length >= 40) {\n out.push(`… (truncated; ${max - i - 1} more lines)`);\n break;\n }\n }\n return out.join('\\n');\n}\n","/**\n * `avo new` — scaffold a new doc from a block-type template.\n *\n * Interactive (Ink) when run in a TTY; non-interactive with `--type <kind>\n * --out <path>` for CI usage.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport React, { useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { BLOCK_TYPES, type BlockType } from '@avodado/core';\n\nexport interface NewOptions {\n readonly cwd: string;\n readonly type?: BlockType;\n readonly out?: string;\n}\n\nconst TEMPLATES: Record<BlockType, string> = {\n meta: '```meta\\ntitle: New document\\nsubtitle: One-line description.\\ntag: DRAFT\\n```\\n',\n callout:\n '```callout\\ntone: note\\ntitle: Heads up\\nbody: A short note that the reader should not miss.\\n```\\n',\n table: '```table\\ncolumns: [Field, Description]\\nrows:\\n - [name, Display name]\\n - [id, Stable identifier]\\n```\\n',\n sequence:\n '```sequence\\nid: seq-example\\nactors:\\n - { id: Client, name: Client }\\n - { id: Server, name: Server }\\nmessages:\\n - { from: Client, to: Server, label: request, kind: sync }\\n - { from: Server, to: Client, label: response, kind: response }\\n```\\n',\n erd:\n '```erd\\nid: erd-example\\nentities:\\n - name: orders\\n columns:\\n - { name: id, type: uuid, pk: true }\\n - { name: user_id, type: uuid, fk: true }\\nrelations: []\\n```\\n',\n userstory:\n '```userstory\\nid: US-001\\nrole: user\\nwant: do the thing\\nsoThat: I get the outcome\\ncriteria:\\n - { given: a precondition, when: I act, then: the outcome }\\n```\\n',\n timeline:\n '```timeline\\nitems:\\n - label: Phase 1\\n date: now\\n status: current\\n desc: What is happening now\\n - label: Phase 2\\n date: next\\n status: next\\n desc: What is next\\n```\\n',\n kanban:\n '```kanban\\ncolumns:\\n - label: Now\\n cards:\\n - { title: Current task }\\n - label: Next\\n cards:\\n - { title: Upcoming task }\\n - label: Later\\n cards:\\n - { title: Eventually }\\n```\\n',\n tracker:\n '```tracker\\nitems:\\n - { task: First task, status: doing, priority: high }\\n - { task: Second task, status: todo, priority: med }\\n```\\n',\n prose:\n '```prose\\ntitle: Overview\\nblocks:\\n - { type: h, text: Background }\\n - { type: p, text: A paragraph explaining the context. }\\n - { type: ul, items: [Idea one, Idea two, Idea three] }\\n```\\n',\n glossary:\n '```glossary\\nterms:\\n - { term: Idempotency, def: Doing a thing twice has the same effect as doing it once. }\\n - { term: SLO, def: Service-level objective the team commits to. }\\n```\\n',\n proscons:\n '```proscons\\ntitle: Synchronous vs async\\nprosLabel: Synchronous\\nconsLabel: Asynchronous\\npros:\\n - Easy to reason about\\n - One transaction\\ncons:\\n - Latency-bound\\n - Single point of failure\\n```\\n',\n cvt:\n '```cvt\\ntitle: Migration plan\\ncurrent:\\n label: Today\\n items: [Single monolith, Shared database, Manual deploys]\\ntarget:\\n label: Target\\n items: [Modular services, Per-service stores, Automated deploys]\\nnote: Migrate one service per quarter.\\n```\\n',\n stats:\n '```stats\\ntitle: This quarter\\nstats:\\n - { value: 12.4k, label: Active users, delta: \"+18%\", trend: up }\\n - { value: 99.95%, label: Uptime, delta: \"0\", trend: flat }\\n - { value: 142ms, label: p95 latency, delta: \"-22ms\", trend: up }\\n```\\n',\n code:\n '```code\\ntitle: Reference\\nblocks:\\n - title: index.ts\\n lang: TypeScript\\n code: |\\n export function add(a: number, b: number): number {\\n return a + b;\\n }\\n```\\n',\n agenda:\n '```agenda\\nitems:\\n - { time: \"09:00\", duration: 30m, title: Intros, owner: Host }\\n - { time: \"09:30\", duration: 45m, title: Status updates, desc: Each team for 5 min }\\n - { time: \"10:15\", duration: 15m, title: Wrap-up }\\n```\\n',\n tree:\n '```tree\\nnodes:\\n - { id: src, label: src }\\n - { id: components, parent: src, label: components }\\n - { id: hooks, parent: src, label: hooks }\\n - { id: index, parent: src, label: index.ts, note: entry point }\\n```\\n',\n pyramid:\n '```pyramid\\nlevels:\\n - { label: Vision, desc: Long-term direction }\\n - { label: Strategy, desc: How we get there }\\n - { label: Tactics, desc: This quarter }\\n - { label: Tasks, desc: This week }\\n```\\n',\n funnel:\n '```funnel\\nstages:\\n - { label: Visited, value: 10000 }\\n - { label: Signed up, value: 2400 }\\n - { label: Activated, value: 1100 }\\n - { label: Paying, value: 320 }\\n```\\n',\n flow:\n '```flow\\ntitle: Decision flow\\nnodes:\\n - { id: start, col: 1, row: 1, kind: start, label: Start }\\n - { id: check, col: 2, row: 1, kind: decision, label: Is valid? }\\n - { id: yes, col: 3, row: 1, kind: process, label: Process }\\n - { id: no, col: 2, row: 2, kind: end, label: Reject }\\n - { id: done, col: 3, row: 2, kind: end, label: Done }\\nedges:\\n - { from: start, to: check }\\n - { from: check, to: yes, label: \"yes\" }\\n - { from: check, to: no, label: \"no\", kind: error }\\n - { from: yes, to: done }\\n```\\n',\n state:\n '```state\\ntitle: Order lifecycle\\nstates:\\n - { id: s0, col: 1, row: 1, kind: start }\\n - { id: pending, col: 2, row: 1, kind: wait, name: PENDING }\\n - { id: confirmed, col: 3, row: 1, kind: active, name: CONFIRMED }\\n - { id: end, col: 4, row: 1, kind: terminal }\\ntransitions:\\n - { from: s0, to: pending, event: create }\\n - { from: pending, to: confirmed, event: pay }\\n - { from: confirmed, to: end, event: ship }\\n```\\n',\n dfd:\n '```dfd\\ntitle: Data flow\\nnodes:\\n - { id: ext, col: 1, row: 1, kind: external, name: Client }\\n - { id: proc, col: 2, row: 1, kind: process, name: Process, num: 1 }\\n - { id: store, col: 3, row: 1, kind: store, name: Orders }\\nedges:\\n - { from: ext, to: proc, label: request }\\n - { from: proc, to: store, label: write }\\n```\\n',\n journey:\n '```journey\\ntitle: Onboarding journey\\nstages:\\n - { label: Discover }\\n - { label: Sign up }\\n - { label: Activate }\\n - { label: Pay }\\nrows:\\n - { label: Touchpoint, cells: [Landing, Form, Email, Checkout] }\\n - { label: Friction, cells: [Low, Med, Low, Med] }\\nemotion: [0.7, 0.4, 0.6, 0.8]\\n```\\n',\n gantt:\n '```gantt\\ntitle: Roadmap\\nperiods: [Q1, Q2, Q3, Q4]\\ntasks:\\n - { label: Discovery, start: 0, span: 1, kind: done }\\n - { label: Build, start: 1, span: 2, kind: active }\\n - { label: Ship, start: 3, span: 1 }\\n - { label: GA, start: 3, span: 1, kind: milestone }\\n```\\n',\n graph:\n '```graph\\ntitle: Dependency graph\\nnodes:\\n - { id: a, col: 1, row: 1, label: Module A, group: 0 }\\n - { id: b, col: 2, row: 1, label: Module B, group: 1 }\\n - { id: c, col: 3, row: 1, label: Module C, group: 2 }\\n - { id: d, col: 2, row: 2, label: Shared, group: 3 }\\nedges:\\n - { from: a, to: b }\\n - { from: b, to: c }\\n - { from: a, to: d }\\n - { from: b, to: d, dir: undirected }\\n```\\n',\n quadrant:\n '```quadrant\\ntitle: Effort vs impact\\nxAxis: { label: Effort, low: Low, high: High }\\nyAxis: { label: Impact, low: Low, high: High }\\nitems:\\n - { x: 0.2, y: 0.8, label: Quick win }\\n - { x: 0.8, y: 0.8, label: Big bet }\\n - { x: 0.2, y: 0.2, label: Fill-in }\\n - { x: 0.8, y: 0.2, label: Thankless }\\n```\\n',\n swimlane:\n '```swimlane\\ntitle: Cross-functional flow\\nlanes:\\n - { label: Customer }\\n - { label: Sales }\\n - { label: Ops }\\nsteps:\\n - { id: req, col: 1, lane: 0, kind: start, label: Submit request }\\n - { id: qual, col: 2, lane: 1, kind: decision, label: Qualify }\\n - { id: fulfill, col: 3, lane: 2, label: Fulfill }\\n - { id: done, col: 4, lane: 0, kind: end, label: Receive }\\nlinks:\\n - { from: req, to: qual }\\n - { from: qual, to: fulfill }\\n - { from: fulfill, to: done }\\n```\\n',\n c4:\n '```c4\\ntitle: System context\\nlevel: context\\nnodes:\\n - { id: user, col: 1, row: 1, kind: person, name: Shopper, desc: A customer placing an order. }\\n - { id: app, col: 2, row: 1, kind: system, name: ShopCo, desc: The retail platform. }\\n - { id: pay, col: 3, row: 1, kind: external, name: Payment GW, desc: Stripe authorisation. }\\nedges:\\n - { from: user, to: app, label: places order }\\n - { from: app, to: pay, label: authorises }\\n```\\n',\n uml:\n '```uml\\ntitle: Class model\\nclasses:\\n - { id: order, col: 1, row: 1, name: Order, attrs: [\"id: UUID\", \"status: Status\", \"total: Money\"], methods: [\"place()\", \"cancel()\"] }\\n - { id: item, col: 2, row: 1, name: OrderItem, attrs: [\"id: UUID\", \"sku: String\", \"qty: int\"] }\\n - { id: status, col: 1, row: 2, name: Status, stereotype: enumeration, attrs: [\"PENDING\", \"CONFIRMED\", \"CANCELLED\"] }\\nrels:\\n - { from: order, to: item, kind: composition }\\n - { from: order, to: status, kind: association, label: has }\\n```\\n',\n mece:\n '```mece\\ntitle: Why are conversions down?\\nnodes:\\n - { id: root, label: Lower conversion }\\n - { id: traffic, parent: root, label: Traffic }\\n - { id: friction, parent: root, label: Friction }\\n - { id: t1, parent: traffic, label: Lower quality, note: paid ads }\\n - { id: t2, parent: traffic, label: Wrong audience }\\n - { id: f1, parent: friction, label: Slow checkout }\\n - { id: f2, parent: friction, label: Mobile bugs }\\n```\\n',\n frontend:\n '```frontend\\ntitle: React component tree\\nnodes:\\n - { id: app, kind: root, name: App }\\n - { id: layout, parent: app, kind: layout, name: Layout }\\n - { id: home, parent: layout, kind: page, name: Home }\\n - { id: orders, parent: layout, kind: page, name: Orders }\\n - { id: card, parent: orders, kind: component, name: OrderCard }\\n - { id: useOrder, parent: orders, kind: hook, name: useOrder }\\n - { id: store, parent: app, kind: store, name: cart, note: Zustand }\\n```\\n',\n cluster:\n '```cluster\\ntitle: Production cluster\\nclusters:\\n - { id: api, label: api namespace, kind: namespace }\\n - { id: data, label: data namespace, kind: namespace }\\nservices:\\n - { id: web, cluster: api, label: web, kind: service, tech: Next.js, replicas: 3 }\\n - { id: orders, cluster: api, label: orders, kind: service, tech: Go, replicas: 4 }\\n - { id: pg, cluster: data, label: postgres, kind: store, tech: Postgres 16, replicas: 1 }\\n - { id: redis, cluster: data, label: redis, kind: cache, tech: Redis 7, replicas: 2 }\\nedges:\\n - { from: web, to: orders }\\n - { from: orders, to: pg }\\n - { from: orders, to: redis }\\n```\\n',\n block:\n '```block\\ntitle: System architecture\\ngroups:\\n - { col: 1, row: 1, cols: 1, rows: 2, label: Edge, color: \"#0e54a1\" }\\n - { col: 2, row: 1, cols: 2, rows: 2, label: Services, color: \"#1f9747\" }\\nnodes:\\n - { id: cdn, col: 1, row: 1, kind: cdn, name: CDN, tech: Cloudflare }\\n - { id: gw, col: 1, row: 2, kind: gateway, name: Gateway, tech: Envoy }\\n - { id: api, col: 2, row: 1, kind: service, name: API, tech: Go }\\n - { id: worker, col: 3, row: 1, kind: service, name: Worker, tech: Go }\\n - { id: pg, col: 2, row: 2, kind: store, name: Postgres, tech: \"16\" }\\n - { id: q, col: 3, row: 2, kind: queue, name: Events, tech: NATS }\\nedges:\\n - { from: cdn, to: gw }\\n - { from: gw, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: q }\\n - { from: q, to: worker, kind: dashed }\\n```\\n',\n infra:\n '```infra\\ntitle: AWS topology\\nsystemLabel: ShopCo · us-east-1\\nlayers:\\n - { label: Edge }\\n - { label: Compute }\\n - { label: Data }\\nnodes:\\n - { id: cf, layer: 0, kind: cdn, name: CloudFront, tech: CDN }\\n - { id: alb, layer: 0, kind: gateway, name: ALB, tech: Application LB }\\n - { id: api, layer: 1, kind: service, name: API, tech: ECS Fargate }\\n - { id: worker, layer: 1, kind: service, name: Worker, tech: ECS Fargate }\\n - { id: pg, layer: 2, kind: store, name: orders-db, tech: RDS Postgres }\\n - { id: cache, layer: 2, kind: cache, name: cache, tech: ElastiCache }\\nedges:\\n - { from: cf, to: alb }\\n - { from: alb, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: cache }\\n - { from: api, to: worker, kind: dashed }\\n```\\n',\n event:\n '```event\\ntitle: Pub/sub choreography\\nnodes:\\n - { id: orders, col: 1, row: 1, kind: producer, name: orders }\\n - { id: bus, col: 2, row: 1, kind: topic, name: order.events }\\n - { id: ship, col: 3, row: 1, kind: consumer, name: shipping }\\n - { id: bill, col: 3, row: 2, kind: consumer, name: billing }\\nedges:\\n - { from: orders, to: bus }\\n - { from: bus, to: ship }\\n - { from: bus, to: bill }\\n```\\n',\n ddd:\n '```ddd\\ntitle: Bounded contexts\\nnodes:\\n - { id: cat, col: 1, row: 1, kind: context, name: Catalog }\\n - { id: order, col: 2, row: 1, kind: context, name: Orders }\\n - { id: pay, col: 3, row: 1, kind: context, name: Payments }\\n - { id: ship, col: 2, row: 2, kind: context, name: Shipping }\\nedges:\\n - { from: order, to: cat, label: reads, kind: dashed }\\n - { from: order, to: pay }\\n - { from: order, to: ship }\\n```\\n',\n network:\n '```network\\ntitle: Security zones\\nnodes:\\n - { id: edge, col: 1, row: 1, kind: gateway, name: Edge / WAF }\\n - { id: fw, col: 2, row: 1, kind: firewall, name: Perimeter FW }\\n - { id: api, col: 3, row: 1, kind: service, name: API }\\n - { id: db, col: 3, row: 2, kind: store, name: DB (private) }\\nedges:\\n - { from: edge, to: fw }\\n - { from: fw, to: api }\\n - { from: api, to: db }\\n```\\n',\n felogic:\n '```felogic\\ntitle: Frontend modules\\nnodes:\\n - { id: hook, col: 1, row: 1, kind: hook, name: useOrders }\\n - { id: svc, col: 2, row: 1, kind: service, name: ordersService }\\n - { id: iface, col: 3, row: 1, kind: interface, name: OrdersClient }\\n - { id: impl, col: 4, row: 1, kind: strategy, name: HttpOrdersClient }\\n - { id: api, col: 5, row: 1, kind: external, name: Orders API }\\nedges:\\n - { from: hook, to: svc }\\n - { from: svc, to: iface, kind: uses }\\n - { from: impl, to: iface, kind: implements }\\n - { from: impl, to: api, kind: egress, label: HTTPS }\\n```\\n',\n belogic:\n '```belogic\\ntitle: Backend modules\\nnodes:\\n - { id: ctrl, col: 1, row: 1, kind: controller, name: OrdersController }\\n - { id: svc, col: 2, row: 1, kind: service, name: PlaceOrder }\\n - { id: repo, col: 3, row: 1, kind: repository, name: OrdersRepo }\\n - { id: db, col: 4, row: 1, kind: db, name: postgres }\\n - { id: pay, col: 3, row: 2, kind: external, name: Stripe }\\nedges:\\n - { from: ctrl, to: svc }\\n - { from: svc, to: repo }\\n - { from: repo, to: db, kind: reads }\\n - { from: svc, to: pay, kind: egress, label: authorise }\\n```\\n',\n dag:\n '```dag\\ntitle: Build pipeline\\nnodes:\\n - { id: src, col: 1, row: 1, kind: start, label: Source }\\n - { id: lint, col: 2, row: 1, kind: process, label: Lint }\\n - { id: test, col: 3, row: 1, kind: process, label: Test }\\n - { id: build, col: 4, row: 1, kind: process, label: Build }\\n - { id: deploy, col: 5, row: 1, kind: end, label: Deploy }\\nedges:\\n - { from: src, to: lint }\\n - { from: lint, to: test }\\n - { from: test, to: build }\\n - { from: build, to: deploy }\\n```\\n',\n wireframe:\n '```wireframe\\ntitle: What the user sees\\nscreens:\\n - device: browser\\n title: Dashboard\\n url: app.example.com\\n label: Desktop\\n elements:\\n - { type: nav, label: \"Home, Inbox, Settings\" }\\n - { type: header, label: Notifications }\\n - { type: list, rows: 4 }\\n - { type: button, label: Mark all as read }\\n - device: phone\\n title: \"9:41\"\\n label: iPhone\\n elements:\\n - { type: header, label: Alerts }\\n - { type: card, rows: 3 }\\n - { type: tabs, label: \"Home, Search, Bell, You\" }\\n```\\n',\n};\n\n/** Returns the template string for a block type. */\nexport function templateFor(type: BlockType): string {\n return `\\`\\`\\`meta\\ntitle: New document\\ntag: DRAFT\\n\\`\\`\\`\\n\\n## ${type}\\n\\n${TEMPLATES[type]}`;\n}\n\n/**\n * Multi-block *document* templates (as opposed to single-block scaffolds).\n * Each is a complete, `avo check`-clean starting doc for a common doc kind.\n */\nconst ADR_TEMPLATE = [\n '```meta',\n 'title: ADR-NNN — decision title',\n 'subtitle: One line on what we decided and why it matters.',\n 'tag: ADR · Proposed · YYYY-MM-DD',\n '```',\n '',\n '## Status',\n '',\n '**Proposed** — YYYY-MM-DD. (Proposed → Accepted → Superseded.)',\n '',\n '## Context',\n '',\n 'What forces a decision here? The constraints, requirements, and the problem',\n 'being solved. Two to four sentences of plain prose — no block needed.',\n '',\n '```callout',\n 'tone: note',\n 'title: Decision',\n 'body: \"State the decision in one or two sentences — what we will do, and the single most important reason why.\"',\n '```',\n '',\n '## Options considered',\n '',\n '```proscons',\n 'id: the-choice',\n 'title: Chosen option vs the alternative',\n 'prosLabel: Chosen option',\n 'consLabel: The alternative',\n 'pros:',\n ' - A concrete reason the chosen option wins',\n ' - Another benefit worth the trade-off',\n 'cons:',\n ' - A real cost of the alternative',\n ' - Another drawback we are accepting against',\n '```',\n '',\n '## Architecture',\n '',\n '```block',\n 'id: architecture',\n 'title: How it fits together',\n 'nodes:',\n ' - { id: client, col: 1, row: 1, kind: client, name: Client }',\n ' - { id: svc, col: 2, row: 1, kind: service, name: Service, tech: your stack }',\n ' - { id: db, col: 3, row: 1, kind: store, name: Database }',\n 'edges:',\n ' - { from: client, to: svc }',\n ' - { from: svc, to: db }',\n '```',\n '',\n '## Consequences',\n '',\n '```tracker',\n 'id: consequences',\n 'title: Consequences & follow-ups',\n 'items:',\n ' - { task: \"Something that becomes easier or newly required\", status: todo, priority: high }',\n ' - { task: \"A migration or new responsibility this creates\", status: todo, priority: med }',\n ' - { task: \"A risk to watch as we roll this out\", status: todo, priority: low }',\n '```',\n '',\n].join('\\n');\n\n/** Full-document templates, keyed by name (`avo new --type adr`). */\nexport const DOC_TEMPLATES: Record<string, string> = {\n adr: ADR_TEMPLATE,\n};\n\n/** True when `name` is a full-document template rather than a block type. */\nexport function isDocTemplate(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(DOC_TEMPLATES, name);\n}\n\n/**\n * Writes a new doc to `out` from the chosen block type. Returns the absolute\n * path written. Non-interactive: requires `type` + `out`.\n */\nexport async function writeNewDoc(opts: { cwd: string; type: string; out: string }): Promise<string> {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n const content = isDocTemplate(opts.type)\n ? (DOC_TEMPLATES[opts.type] as string)\n : templateFor(opts.type as BlockType);\n await writeFile(outAbs, content, 'utf8');\n return outAbs;\n}\n\ninterface PickerProps {\n readonly onPick: (type: BlockType) => void;\n}\n\n/** Ink picker UI for selecting a block type interactively. */\nexport function NewPicker({ onPick }: PickerProps): React.ReactElement {\n const items = BLOCK_TYPES.map((t) => ({ label: t, value: t }));\n return (\n <Box flexDirection=\"column\">\n <Text bold>Pick a block type to scaffold:</Text>\n <SelectInput\n items={items}\n onSelect={(item) => onPick(item.value as BlockType)}\n />\n </Box>\n );\n}\n\ninterface AppProps {\n readonly cwd: string;\n readonly out: string;\n}\n\n/** Full Ink app for interactive `avo new` — picker → write → exit. */\nexport function NewApp({ cwd, out }: AppProps): React.ReactElement {\n const [picked, setPicked] = useState<BlockType | null>(null);\n const [writtenPath, setWrittenPath] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handlePick = (type: BlockType): void => {\n setPicked(type);\n void writeNewDoc({ cwd, type, out }).then((path) => {\n setWrittenPath(path);\n setTimeout(exit, 50);\n });\n };\n\n if (writtenPath !== null) {\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> Wrote </Text>\n <Text bold>{writtenPath}</Text>\n </Box>\n );\n }\n if (picked !== null) {\n return <Text>Writing {out}…</Text>;\n }\n return <NewPicker onPick={handlePick} />;\n}\n","/**\n * Renders a code frame — the offending source line(s) with a caret underline —\n * for a diagnostic, in the style of Rust / TypeScript / Babel errors.\n *\n * Pure and dependency-free; the caller supplies the file's source lines so this\n * stays I/O-free and testable.\n */\n\nimport pc from 'picocolors';\n\n/** Inputs for {@link renderCodeFrame}. */\nexport interface CodeFrameInput {\n /** The file's source split into lines (no trailing newline per line). */\n readonly lines: readonly string[];\n /** 1-based line of the offending token. */\n readonly line: number;\n /** 1-based column of the offending token, if known. */\n readonly column?: number;\n /** 1-based exclusive end column, if known (for a multi-char underline). */\n readonly endColumn?: number;\n /** Number of context lines to show above the offending line. Default 1. */\n readonly contextBefore?: number;\n /** Caret colour: 'error' (red) or 'warn' (yellow). Default 'error'. */\n readonly level?: 'error' | 'warn';\n}\n\n/**\n * Builds a code frame string. Returns an empty string if the line is out of\n * range (so callers can unconditionally append it).\n *\n * @example\n * ```\n * 30 | - { from: Client, kind: bogus }\n * | ^^^^^\n * ```\n */\nexport function renderCodeFrame(input: CodeFrameInput): string {\n const { lines, line } = input;\n if (line < 1 || line > lines.length) return '';\n\n const contextBefore = input.contextBefore ?? 1;\n const start = Math.max(1, line - contextBefore);\n const gutterWidth = String(line).length + 1;\n const tint = input.level === 'warn' ? pc.yellow : pc.red;\n\n const out: string[] = [];\n for (let n = start; n <= line; n++) {\n const text = lines[n - 1] ?? '';\n const gutter = pc.dim(`${String(n).padStart(gutterWidth)} | `);\n out.push(gutter + text);\n }\n\n // Caret line under the offending span.\n if (input.column !== undefined && input.column >= 1) {\n const col = input.column;\n const span = input.endColumn !== undefined ? Math.max(1, input.endColumn - col) : 1;\n const pad = ' '.repeat(gutterWidth) + pc.dim(' | ') + ' '.repeat(col - 1);\n out.push(pad + tint('^'.repeat(span)));\n }\n\n return out.join('\\n');\n}\n","/**\n * Diagnostics rendering for `avo check`.\n *\n * - {@link DiagnosticsTable} is the interactive (TTY) Ink view.\n * - {@link formatDiagnosticsPlain} is the CI / non-TTY text view.\n *\n * Both show a code frame (the offending line with a caret) plus the one-line\n * `hint` and help URL, so an error teaches the fix in place.\n */\n\nimport { Box, Text } from 'ink';\nimport { helpUrl, type Diagnostic } from '@avodado/core';\nimport React from 'react';\nimport { renderCodeFrame } from './codeFrame.js';\n\ntype Sources = ReadonlyMap<string, readonly string[]>;\n\ninterface Props {\n readonly diagnostics: readonly Diagnostic[];\n readonly fileCount: number;\n readonly sources: Sources;\n}\n\nconst COLOR: Record<Diagnostic['level'], string> = {\n error: 'red',\n warn: 'yellow',\n};\n\nfunction frameFor(d: Diagnostic, sources: Sources): string {\n if (d.line === undefined) return '';\n const lines = sources.get(d.file);\n if (lines === undefined) return '';\n return renderCodeFrame({\n lines,\n line: d.line,\n ...(d.column !== undefined ? { column: d.column } : {}),\n ...(d.endColumn !== undefined ? { endColumn: d.endColumn } : {}),\n level: d.level,\n });\n}\n\nexport function DiagnosticsTable({ diagnostics, fileCount, sources }: Props): React.ReactElement {\n const errorCount = diagnostics.filter((d) => d.level === 'error').length;\n const warnCount = diagnostics.filter((d) => d.level === 'warn').length;\n\n if (diagnostics.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n ✓ {fileCount} {fileCount === 1 ? 'file' : 'files'} checked — no diagnostics\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {diagnostics.map((d, i) => {\n const frame = frameFor(d, sources);\n return (\n <Box key={`${d.file}:${d.line ?? '-'}:${i}`} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={COLOR[d.level]} bold>\n {d.level === 'error' ? '✖' : '⚠'}{' '}\n </Text>\n <Text dimColor>\n {d.file}\n {d.line !== undefined ? `:${d.line}` : ''}\n {d.column !== undefined ? `:${d.column}` : ''}{' '}\n </Text>\n <Text color={COLOR[d.level]}>{d.code} </Text>\n <Text>{d.message}</Text>\n </Box>\n {frame.length > 0 ? <Text>{frame}</Text> : null}\n {d.hint !== undefined ? (\n <Text>\n {' '}\n <Text color=\"cyan\">hint:</Text> {d.hint}\n </Text>\n ) : null}\n <Text dimColor>\n {' '}\n {helpUrl(d.code)}\n </Text>\n </Box>\n );\n })}\n <Box>\n <Text bold color={errorCount > 0 ? 'red' : warnCount > 0 ? 'yellow' : 'green'}>\n {errorCount} {errorCount === 1 ? 'error' : 'errors'}, {warnCount}{' '}\n {warnCount === 1 ? 'warning' : 'warnings'} across {fileCount}{' '}\n {fileCount === 1 ? 'file' : 'files'}\n </Text>\n </Box>\n </Box>\n );\n}\n\n/** Formats diagnostics for plain (non-TTY / CI) output. */\nexport function formatDiagnosticsPlain(\n diagnostics: readonly Diagnostic[],\n fileCount: number,\n sources: Sources,\n): string {\n if (diagnostics.length === 0) {\n return `OK: ${fileCount} ${fileCount === 1 ? 'file' : 'files'} checked, no diagnostics\\n`;\n }\n const blocks = diagnostics.map((d) => {\n const loc =\n d.line !== undefined\n ? `${d.file}:${d.line}${d.column !== undefined ? `:${d.column}` : ''}`\n : d.file;\n const parts = [`${loc} ${d.level} ${d.code} ${d.message}`];\n const frame = frameFor(d, sources);\n if (frame.length > 0) parts.push(frame);\n if (d.hint !== undefined) parts.push(` hint: ${d.hint}`);\n return parts.join('\\n');\n });\n const errors = diagnostics.filter((d) => d.level === 'error').length;\n const warns = diagnostics.filter((d) => d.level === 'warn').length;\n blocks.push(`${errors} error(s), ${warns} warning(s) across ${fileCount} file(s)`);\n return blocks.join('\\n\\n') + '\\n';\n}\n","/**\n * A small colored brand banner for the CLI — an avocado half (green rind, amber\n * pit) next to the wordmark. Shown on `avo` / `avo --help` and `avo init`.\n */\n\nimport pc from 'picocolors';\nimport cfonts from 'cfonts'; // CJS module — default import, then `.render`\n\n/**\n * The big avocado-green \"avodado\" wordmark (via cfonts), shown at the top of the\n * interactive `avo init` wizard. Falls back to the compact {@link banner} if\n * cfonts can't render (e.g. an unusual terminal).\n */\nexport function logo(): string {\n let art = '';\n try {\n const out = cfonts.render('avodado', {\n font: 'block',\n gradient: ['#a5d76e', '#2e7d32'], // avocado: light rind → dark skin\n transitionGradient: true,\n space: false,\n env: 'node',\n });\n if (out !== false && typeof out === 'object') art = out.string ?? '';\n } catch {\n /* fall through to the compact banner */\n }\n if (art === '') return banner();\n return `\\n${art}\\n ${pc.dim('Documentation-as-code — Markdown with typed, fenced YAML blocks.')}\\n`;\n}\n\nexport function banner(version = '0.0.2'): string {\n const g = pc.green;\n const pit = pc.yellow('●');\n const name = pc.green(pc.bold('avodado'));\n const ver = pc.dim(`v${version}`);\n const tag = pc.dim('Documentation-as-code — Markdown with typed, fenced YAML blocks.');\n return [\n '',\n ` ${g('╭───────╮')}`,\n ` ${g('│ ')}${pit}${g(' ')}${pit}${g(' │')} ${name} ${ver}`,\n ` ${g('│ ')}${pc.yellow('◡')}${g(' │')} ${tag}`,\n ` ${g('╰───────╯')}`,\n '',\n ].join('\\n');\n}\n\n/** The \"what do I actually do\" workflow, shown after top-level help. */\nexport function examples(): string {\n const step = (n: string, cmd: string, note: string): string =>\n ` ${pc.dim(n)} ${pc.cyan(cmd.padEnd(26))}${pc.dim(note)}`;\n return [\n '',\n pc.bold('Workflow:'),\n step('1', 'avo init', 'scaffold docs/, config, and the agent skill'),\n step('2', 'edit docs/*.md', 'prose + typed blocks (grammar in .avodado/skill)'),\n step('3', 'avo check', 'validate — exits non-zero on errors (use in CI)'),\n step('4', 'avo preview docs/x.md', 'render and open it in your browser'),\n '',\n ` ${pc.dim('Per-command help:')} avo ${pc.cyan('<command>')} --help`,\n ` ${pc.dim('Docs:')} https://github.com/jdiejim/avodado`,\n '',\n ].join('\\n');\n}\n","/**\n * TTY-awareness helpers. The CLI renders Ink only when stdout is a TTY and the\n * environment is not CI; otherwise it falls back to plain, log-friendly output\n * so logs stay parseable.\n */\n\n/** True when the process is running interactively (TTY, not CI, not AVO_PLAIN). */\nexport const isInteractive: boolean =\n process.stdout.isTTY === true &&\n process.env['CI'] !== 'true' &&\n process.env['AVO_PLAIN'] !== '1';\n","/**\n * CLI dispatcher. Parses argv via commander, runs the matching command, and\n * decides between Ink rendering, plain output, and JSON output based on\n * {@link isInteractive} and `--json` flags.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport React from 'react';\nimport { render as inkRender, Text } from 'ink';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { loadConfig } from './io/config.js';\nimport { runCheck } from './commands/check.js';\nimport { runRender } from './commands/render.js';\nimport { runExport, type ExportFormat } from './commands/export.js';\nimport { runPreview } from './commands/preview.js';\nimport { runInit, type InitResult } from './commands/init.js';\nimport { InitApp } from './commands/InitApp.js';\nimport { runSyncOpenApi } from './commands/sync.js';\nimport { NewApp, templateFor, writeNewDoc, DOC_TEMPLATES, isDocTemplate } from './commands/new.js';\nimport { DiagnosticsTable, formatDiagnosticsPlain } from './ui/DiagnosticsTable.js';\nimport { banner, examples, logo } from './ui/banner.js';\nimport { isInteractive } from './tty.js';\nimport type { BlockType } from '@avodado/core';\nimport { BLOCK_TYPES } from '@avodado/core';\n\n/**\n * Reads @avodado/cli's own version from the nearest package.json. Walks up from\n * this module so it works from both `dist/bin.js` and the source layout.\n */\nfunction cliVersion(): string {\n try {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const p = join(dir, 'package.json');\n if (existsSync(p)) {\n const j = JSON.parse(readFileSync(p, 'utf8')) as { name?: string; version?: string };\n if (j.name === '@avodado/cli' && typeof j.version === 'string') return j.version;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n /* fall through to the placeholder below */\n }\n return '0.0.0';\n}\n\n/** Prints the created/skipped files and next-step hints after `avo init`. */\nfunction printInitSummary(result: InitResult, theme: string): void {\n for (const f of result.created) console.log(pc.green('+ ') + f);\n for (const f of result.skipped) console.log(pc.dim(' skip ') + f + pc.dim(' (exists)'));\n console.log(\n pc.bold(`\\nCreated ${result.created.length} file(s), skipped ${result.skipped.length}.`) +\n pc.dim(` (theme: ${theme})`),\n );\n console.log(\n `Next: ${pc.cyan('avo check')} ${pc.dim('·')} ${pc.cyan('avo preview docs/getting-started.md')}`,\n );\n}\n\n/** Runs the CLI for the given argv (typically `process.argv`). */\nexport async function main(argv: readonly string[]): Promise<number> {\n const version = cliVersion();\n const program = new Command();\n program\n .name('avo')\n .description('Author, validate, render, and export Avodado documentation.')\n .version(version)\n // Banner + workflow only on top-level help — not on every subcommand's --help.\n .addHelpText('beforeAll', (ctx) => (ctx.command.name() === 'avo' ? banner(version) : ''))\n .addHelpText('after', (ctx) => (ctx.command.name() === 'avo' ? examples() : ''))\n .exitOverride();\n\n let exitCode = 0;\n\n program\n .command('init')\n .description('Scaffold a new Avodado project in the current directory')\n .option('--force', 'overwrite existing files')\n .option('-y, --yes', 'skip the wizard — scaffold with defaults (all adapters, minimal theme)')\n .action(async (opts: { force?: boolean; yes?: boolean }) => {\n const cwd = process.cwd();\n const force = opts.force === true;\n\n // Interactive wizard: pick AI-tool adapters + a theme, with a logo.\n if (isInteractive && opts.yes !== true) {\n console.log(logo());\n let captured: { result: InitResult; theme: string } | undefined;\n const { waitUntilExit } = inkRender(\n <InitApp\n cwd={cwd}\n {...(force ? { force: true } : {})}\n onComplete={(result, theme) => {\n captured = { result, theme };\n }}\n />,\n );\n await waitUntilExit();\n if (captured !== undefined) printInitSummary(captured.result, captured.theme);\n return;\n }\n\n // Non-interactive (CI) or --yes: scaffold with defaults.\n const result = await runInit({ cwd, ...(force ? { force: true } : {}) });\n printInitSummary(result, 'minimal');\n });\n\n program\n .command('new')\n .description('Scaffold a new doc from a block template')\n .option(\n '--type <kind>',\n 'doc template (' + Object.keys(DOC_TEMPLATES).join(', ') + ') or block type (' + BLOCK_TYPES.join(', ') + ')',\n )\n .option('--out <path>', 'output file path')\n .action(async (opts: { type?: string; out?: string }) => {\n const cwd = process.cwd();\n const type = opts.type;\n if (type !== undefined && !BLOCK_TYPES.includes(type as BlockType) && !isDocTemplate(type)) {\n console.error(pc.red(`Unknown type: ${opts.type ?? ''}`));\n exitCode = 2;\n return;\n }\n if (!isInteractive) {\n if (type === undefined || opts.out === undefined) {\n console.error(pc.red('In non-interactive mode, both --type and --out are required.'));\n exitCode = 2;\n return;\n }\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n if (type !== undefined && opts.out !== undefined) {\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n const out = opts.out ?? './docs/new-doc.md';\n const { waitUntilExit } = inkRender(<NewApp cwd={cwd} out={out} />);\n await waitUntilExit();\n });\n\n program\n .command('check [globs...]')\n .description('Validate documents (default: docs/**/*.md)')\n .option('--json', 'emit machine-readable JSON')\n .action(async (globs: string[], opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const result = await runCheck({ patterns, cwd, docsRoot: config.docsDir });\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ diagnostics: result.diagnostics, files: result.files }, null, 2) + '\\n',\n );\n } else if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <DiagnosticsTable\n diagnostics={result.diagnostics}\n fileCount={result.files.length}\n sources={result.sources}\n />,\n );\n await waitUntilExit();\n } else {\n process.stdout.write(\n formatDiagnosticsPlain(result.diagnostics, result.files.length, result.sources),\n );\n }\n exitCode = result.exitCode;\n });\n\n program\n .command('render <input>')\n .description('Render one document to a standalone HTML file')\n .option('-o, --output <path>', 'output file path (defaults to <input>.html)')\n .action(async (input: string, opts: { output?: string }) => {\n const cwd = process.cwd();\n const result = await runRender({\n cwd,\n input,\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n });\n if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <Text>\n <Text color=\"green\">✓ </Text>Wrote <Text bold>{result.output}</Text>{' '}\n <Text dimColor>({result.bytes} bytes)</Text>\n </Text>,\n );\n await waitUntilExit();\n } else {\n console.log(`${pc.green('✓')} rendered ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n }\n });\n\n program\n .command('export [globs...]')\n .description('Batch-export documents to HTML and/or PDF')\n .option('--format <list>', 'comma-separated formats: html,pdf', 'html')\n .option('--out <dir>', 'output directory (defaults to config outDir or dist)')\n .action(async (globs: string[], opts: { format: string; out?: string }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const formats = opts.format\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter((s): s is ExportFormat => s === 'html' || s === 'pdf');\n if (formats.length === 0) {\n console.error(pc.red('No valid --format specified (expected html, pdf, or both).'));\n exitCode = 2;\n return;\n }\n const result = await runExport({\n cwd,\n patterns,\n docsRoot: config.docsDir,\n outDir: opts.out ?? config.outDir,\n formats,\n });\n for (const item of result.items) {\n for (const o of item.outputs) {\n console.log(`${pc.green('✓')} ${o.path} ${pc.dim(`(${o.bytes} bytes)`)}`);\n }\n }\n console.log(pc.bold(`\\n${result.items.length} document(s) exported.`));\n });\n\n program\n .command('preview <input>')\n .description('Render a document to a temp HTML file and open it')\n .action(async (input: string) => {\n const cwd = process.cwd();\n const result = await runPreview({ cwd, input });\n console.log(pc.green('✓ ') + 'Opened ' + result.file);\n });\n\n const syncCmd = program.command('sync').description('Generate Avodado docs from external sources (OpenAPI)');\n syncCmd\n .command('openapi <spec>')\n .description('Generate (or drift-check) a doc from an OpenAPI 3.x spec')\n .option('-o, --out <path>', 'write generated markdown to this path')\n .option('--check <path>', 'compare against an existing doc and fail on drift')\n .option('--slug <slug>', 'block-id namespace (defaults to the output basename)')\n .action(\n async (\n spec: string,\n opts: { out?: string; check?: string; slug?: string },\n ) => {\n const result = await runSyncOpenApi({\n cwd: process.cwd(),\n spec,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.check !== undefined ? { check: opts.check } : {}),\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n });\n if (result.exitCode === 0) {\n console.log(pc.green('✓ ') + result.message);\n } else {\n console.error(pc.red(result.message));\n if (result.diff !== undefined) console.error(result.diff);\n }\n exitCode = result.exitCode;\n },\n );\n\n try {\n await program.parseAsync(argv as string[], { from: 'node' });\n } catch (err) {\n const e = err as Error & { code?: string; exitCode?: number };\n if (e.code === 'commander.helpDisplayed' || e.code === 'commander.version') {\n return 0;\n }\n if (e.code === 'commander.help') return 0;\n if (typeof e.exitCode === 'number' && e.code?.startsWith('commander.')) {\n return e.exitCode;\n }\n console.error(pc.red(e.message ?? String(err)));\n return 1;\n }\n\n return exitCode;\n}\n\n// Re-export the template helper for tests + downstream consumers.\nexport { templateFor };\n","/**\n * `avo` CLI entry point. Tsup adds the `#!/usr/bin/env node` shebang at build\n * time; this file is the JS that runs after.\n */\n\nimport { main } from './app.js';\n\nconst code = await main(process.argv);\nprocess.exit(code);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avodado/cli",
3
- "version": "0.0.2",
3
+ "version": "0.1.1",
4
4
  "description": "Avodado CLI — author, validate, render, and export typed Markdown docs.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -15,6 +15,7 @@
15
15
  ],
16
16
  "sideEffects": false,
17
17
  "dependencies": {
18
+ "cfonts": "^3.3.0",
18
19
  "commander": "^12.1.0",
19
20
  "fast-glob": "^3.3.2",
20
21
  "ink": "^5.1.0",
@@ -26,8 +27,8 @@
26
27
  "react": "^18.3.1",
27
28
  "yaml": "^2.6.1",
28
29
  "@avodado/core": "0.0.2",
29
- "@avodado/export": "0.0.2",
30
30
  "@avodado/render": "0.0.2",
31
+ "@avodado/export": "0.0.2",
31
32
  "@avodado/sync": "0.0.2"
32
33
  },
33
34
  "devDependencies": {
@@ -0,0 +1,20 @@
1
+ <!-- Repo location: .github/copilot-instructions.md — GitHub Copilot reads this automatically. -->
2
+
3
+ # Avodado — authoring guide
4
+
5
+ This project uses **Avodado**: documentation-as-code where a doc is Markdown with
6
+ typed, fenced YAML blocks, and the files on disk are the single source of truth.
7
+
8
+ When creating or changing any document under `docs/**/*.md`, follow the authoring
9
+ skill at `.avodado/skill/SKILL.md`. It defines the block grammar, every block's
10
+ fields, and the `doc#id` reference scheme. In short:
11
+
12
+ - Prose is plain Markdown; structure goes in typed blocks (e.g. `sequence`, `erd`,
13
+ `table`, `callout`, `c4`, `flow`, `timeline`, `userstory`). Never paste raw HTML
14
+ or inline SVG.
15
+ - Use only the documented block types and their documented fields — the schemas are
16
+ strict, so an unknown block or field fails validation. Bodies are YAML.
17
+ - Give a block an `id:` when it needs to be referenced; reference it as `doc#id`.
18
+ - Edit the specific block surgically — don't regenerate whole files.
19
+ - Run `avo check` and fix all diagnostics before finishing. A change isn't done
20
+ until it passes.
@@ -0,0 +1,17 @@
1
+ # Avodado — authoring guide
2
+
3
+ This project uses Avodado: documentation-as-code where a doc is Markdown with
4
+ typed, fenced YAML blocks, and the files on disk are the single source of truth.
5
+
6
+ When creating or changing any document under docs/**/*.md, follow the authoring
7
+ skill at .avodado/skill/SKILL.md. It defines the block grammar, every block's
8
+ fields, and the doc#id reference scheme. In short:
9
+
10
+ - Prose is plain Markdown; structure goes in typed blocks (e.g. sequence, erd,
11
+ table, callout, c4, flow, timeline, userstory). Never paste raw HTML or inline SVG.
12
+ - Use only the documented block types and their documented fields — the schemas are
13
+ strict, so an unknown block or field fails validation. Bodies are YAML.
14
+ - Give a block an id: when it needs to be referenced; reference it as doc#id.
15
+ - Edit the specific block surgically — don't regenerate whole files.
16
+ - Run `avo check` and fix all diagnostics before finishing. A change isn't done
17
+ until it passes.