@avodado/cli 0.1.0 → 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
@@ -3,8 +3,9 @@ import { Command } from 'commander';
3
3
  import pc3 from 'picocolors';
4
4
  import { useState } from 'react';
5
5
  import { render, Text, useApp, useInput, Box } from 'ink';
6
- import { existsSync, statSync, readFileSync } from 'fs';
7
- import { join, dirname, resolve, parse, relative, basename, extname, sep } from 'path';
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,7 +16,6 @@ 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
19
  import SelectInput from 'ink-select-input';
20
20
  import { jsx, jsxs } from 'react/jsx-runtime';
21
21
  import { parseOpenApi, openapiToMarkdown } from '@avodado/sync';
@@ -807,6 +807,23 @@ function examples() {
807
807
 
808
808
  // src/tty.ts
809
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
+ }
810
827
  function printInitSummary(result, theme) {
811
828
  for (const f of result.created) console.log(pc3.green("+ ") + f);
812
829
  for (const f of result.skipped) console.log(pc3.dim(" skip ") + f + pc3.dim(" (exists)"));
@@ -819,8 +836,9 @@ Created ${result.created.length} file(s), skipped ${result.skipped.length}.`) +
819
836
  );
820
837
  }
821
838
  async function main(argv) {
839
+ const version = cliVersion();
822
840
  const program = new Command();
823
- 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();
824
842
  let exitCode = 0;
825
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) => {
826
844
  const cwd = process.cwd();
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/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","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 { 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/** 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 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 .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"]}
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.1.0",
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",
@@ -26,10 +26,10 @@
26
26
  "picocolors": "^1.1.1",
27
27
  "react": "^18.3.1",
28
28
  "yaml": "^2.6.1",
29
+ "@avodado/core": "0.0.2",
29
30
  "@avodado/render": "0.0.2",
30
- "@avodado/sync": "0.0.2",
31
31
  "@avodado/export": "0.0.2",
32
- "@avodado/core": "0.0.2"
32
+ "@avodado/sync": "0.0.2"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/react": "^18.3.18",