@avodado/cli 0.0.1 → 0.0.2

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
@@ -111,7 +111,7 @@ async function runCheck(opts) {
111
111
  exitCode
112
112
  };
113
113
  }
114
- var BASE_THEMES = /* @__PURE__ */ new Set(["navy", "teal", "plum", "slate", "dark", "soft"]);
114
+ var BASE_THEMES = /* @__PURE__ */ new Set(["minimal", "teal", "plum", "slate", "dark", "soft"]);
115
115
  var COLOR_TO_VAR = {
116
116
  primary: "--navy",
117
117
  // headings, primary nodes, links, section numbers
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/io/config.ts","../src/io/files.ts","../src/commands/check.tsx","../src/io/theme.ts","../src/commands/render.ts","../src/commands/export.ts","../src/commands/preview.ts","../src/commands/init.ts","../src/commands/sync.ts","../src/commands/new.tsx","../src/ui/codeFrame.ts","../src/ui/DiagnosticsTable.tsx","../src/ui/banner.ts","../src/tty.ts","../src/app.tsx","../src/bin.ts"],"names":["yamlParse","resolve","existsSync","readFileSync","readFile","parsePath","parseDocument","mkdir","writeFile","renderDocument","join","dirname","basename","pc","jsx","Box","jsxs","Text","BLOCK_TYPES","inkRender"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * Loads `avodado.config.{ts,json,yml}` from the project root.\n *\n * Defaults are returned if no config is found, so most users never need a\n * config file.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as yamlParse } from 'yaml';\nimport { createJiti } from 'jiti';\n\n/** Loaded configuration. */\nexport interface AvodadoConfig {\n /** Where docs live (relative to project root). Defaults to `docs`. */\n readonly docsDir: string;\n /** Where rendered output goes (relative to project root). Defaults to `dist`. */\n readonly outDir: string;\n}\n\nconst DEFAULTS: AvodadoConfig = { docsDir: 'docs', outDir: 'dist' };\n\nconst CONFIG_FILES = [\n 'avodado.config.ts',\n 'avodado.config.js',\n 'avodado.config.mjs',\n 'avodado.config.json',\n 'avodado.config.yml',\n 'avodado.config.yaml',\n];\n\n/** Loads a config file from `cwd`, returning defaults if none exists. */\nexport async function loadConfig(cwd: string): Promise<AvodadoConfig> {\n for (const name of CONFIG_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n const raw = await readConfig(path);\n return mergeWithDefaults(raw);\n }\n return DEFAULTS;\n}\n\nasync function readConfig(path: string): Promise<unknown> {\n if (path.endsWith('.json')) {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown;\n }\n if (path.endsWith('.yml') || path.endsWith('.yaml')) {\n return yamlParse(readFileSync(path, 'utf8')) as unknown;\n }\n const jiti = createJiti(import.meta.url);\n const mod = (await jiti.import(path)) as { default?: unknown };\n return mod.default ?? mod;\n}\n\nfunction mergeWithDefaults(raw: unknown): AvodadoConfig {\n if (raw === null || typeof raw !== 'object') return DEFAULTS;\n const r = raw as { docsDir?: unknown; outDir?: unknown };\n return {\n docsDir: typeof r.docsDir === 'string' ? r.docsDir : DEFAULTS.docsDir,\n outDir: typeof r.outDir === 'string' ? r.outDir : DEFAULTS.outDir,\n };\n}\n","/**\n * File-system helpers: glob expansion, document reading, slug derivation.\n *\n * Slug rule: a doc's slug is its path relative to the docs root, stripped of\n * `.md` and normalised to forward slashes. Files outside the docs root fall\n * back to their basename without `.md`.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, relative, resolve, sep } from 'node:path';\nimport fg from 'fast-glob';\n\n/** A document file on disk, with derived slug. */\nexport interface DocFile {\n /** Absolute path on disk. */\n readonly absolute: string;\n /** Path relative to cwd (used in diagnostics). */\n readonly file: string;\n /** Slug derived from path under the docs root. */\n readonly slug: string;\n /** Raw markdown source. */\n readonly source: string;\n}\n\n/**\n * Expands one or more glob patterns to a list of {@link DocFile}s with read\n * content and derived slugs.\n *\n * @param patterns - One or more glob patterns (relative to `cwd`).\n * @param cwd - The working directory the patterns resolve from.\n * @param docsRoot - The docs root the slug is derived against.\n */\nexport async function loadDocs(\n patterns: readonly string[],\n cwd: string,\n docsRoot: string,\n): Promise<DocFile[]> {\n const matches = await fg(patterns as string[], {\n cwd,\n absolute: true,\n onlyFiles: true,\n dot: false,\n });\n const docsRootAbs = resolve(cwd, docsRoot);\n const files = await Promise.all(\n matches.map(async (absolute): Promise<DocFile> => {\n const file = relative(cwd, absolute);\n const slug = deriveSlug(absolute, docsRootAbs);\n const source = await readFile(absolute, 'utf8');\n return { absolute, file, slug, source };\n }),\n );\n files.sort((a, b) => a.file.localeCompare(b.file));\n return files;\n}\n\nfunction deriveSlug(absolute: string, docsRootAbs: string): string {\n const rel = relative(docsRootAbs, absolute);\n const inside = !rel.startsWith('..') && !rel.startsWith(sep) && rel.length > 0;\n const path = inside ? rel : basename(absolute);\n return path.replace(/\\\\/g, '/').replace(/\\.md$/i, '');\n}\n","/**\n * `avo check` — validate one or more documents and report diagnostics.\n *\n * Pure {@link runCheck} returns `{ diagnostics, exitCode }`. The UI layer\n * picks how to render: JSON, Ink table (interactive TTY), or plain text (CI).\n */\n\nimport { parseDocument, resolveRefs, validateDocument, type Diagnostic, type Document } from '@avodado/core';\nimport { loadDocs, type DocFile } from '../io/files.js';\n\n/** Inputs to {@link runCheck}. */\nexport interface CheckOptions {\n /** Glob patterns to expand. */\n readonly patterns: readonly string[];\n /** Working directory. */\n readonly cwd: string;\n /** Docs root for slug derivation. */\n readonly docsRoot: string;\n}\n\n/** Result of running `avo check` — diagnostics aggregated across all matched docs. */\nexport interface CheckResult {\n /** All diagnostics in file/line order. */\n readonly diagnostics: readonly Diagnostic[];\n /** Files that were checked. */\n readonly files: readonly string[];\n /** Per-file source lines, for code frames (keyed by the diagnostic `file`). */\n readonly sources: ReadonlyMap<string, readonly string[]>;\n /** Suggested exit code: 0 = clean, 1 = errors present. */\n readonly exitCode: 0 | 1;\n}\n\n/**\n * Validates a set of documents and resolves references across them.\n *\n * @param opts - Options including glob patterns and docs root.\n * @returns Aggregated diagnostics + suggested exit code.\n */\nexport async function runCheck(opts: CheckOptions): Promise<CheckResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const parsed: { doc: Document; file: string }[] = docs.map((d) => ({\n doc: parseDocument(d.source, d.slug),\n file: d.file,\n }));\n\n const diagnostics: Diagnostic[] = [];\n\n for (const { doc, file } of parsed) {\n diagnostics.push(...validateDocument(doc, file));\n }\n\n const resolved = resolveRefs(parsed);\n diagnostics.push(...resolved.diagnostics);\n\n diagnostics.sort((a, b) => {\n const f = a.file.localeCompare(b.file);\n if (f !== 0) return f;\n return (a.line ?? 0) - (b.line ?? 0);\n });\n\n const exitCode = diagnostics.some((d) => d.level === 'error') ? 1 : 0;\n\n const sources = new Map<string, readonly string[]>();\n for (const d of docs) sources.set(d.file, d.source.split(/\\r\\n|\\r|\\n/));\n\n return {\n diagnostics,\n files: docs.map((d: DocFile) => d.file),\n sources,\n exitCode,\n };\n}\n","/**\n * Loads a project theme file (`avodado.theme.json`) and maps its friendly\n * color/font names to the CSS variables the renderer reads.\n *\n * The whole point: a user edits one small JSON file with human names\n * (`primary`, `accent`, `ink`…) and re-runs `avo render` — no rebuild, no\n * CSS knowledge. Anything omitted falls back to the built-in theme.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/** Friendly theme-file shape. Every field is optional. */\nexport interface ThemeFile {\n /** Optional name, for your own reference. */\n readonly name?: string;\n /** Base built-in theme to start from: navy | 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(['navy', 'teal', 'plum', 'slate', 'dark', 'soft']);\n\n/** Friendly color name → internal CSS variable. */\nconst COLOR_TO_VAR: Readonly<Record<string, string>> = {\n primary: '--navy', // headings, primary nodes, links, section numbers\n secondary: '--blue', // secondary accents, CDN/consumer nodes\n accent: '--highlight', // highlight pills, FK keys, \"current\" markers\n positive: '--positive', // success / service nodes / done\n negative: '--negative', // errors / forbidden edges / danger\n purple: '--purple', // data / context / provider nodes\n teal: '--teal', // queues / topics / caches\n ink: '--charcoal', // body text\n muted: '--gray', // captions, dim text, external nodes\n rule: '--rule', // hairlines, borders, dividers\n paper: '--white', // surfaces / card fills\n};\n\n/** Friendly font slot → internal CSS variable. */\nconst FONT_TO_VAR: Readonly<Record<string, string>> = {\n display: '--font-display', // titles / headings\n body: '--font-body', // paragraphs / labels\n mono: '--font-mono', // code / technical labels\n};\n\nconst THEME_FILES = ['avodado.theme.json', 'avodado.theme.jsonc'];\n\n/**\n * Reads the project theme file (if any) and returns CSS-variable overrides\n * ready to pass to `renderDocument({ themeVars })`. Returns `undefined` when\n * there is no theme file, so the default theme is used unchanged.\n *\n * Unknown color/font names are ignored (a warning is the caller's choice) so a\n * typo never crashes a render.\n */\nexport function loadTheme(cwd: string): LoadedTheme {\n for (const name of THEME_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n let raw: unknown;\n try {\n raw = JSON.parse(stripComments(readFileSync(path, 'utf8'))) as unknown;\n } catch {\n return {}; // malformed file → fall back to default theme\n }\n const file = raw !== null && typeof raw === 'object' ? (raw as ThemeFile) : {};\n const out: { theme?: string; themeVars?: Readonly<Record<string, string>> } = {};\n if (typeof file.theme === 'string' && BASE_THEMES.has(file.theme)) out.theme = file.theme;\n const vars = toVars(raw);\n if (vars !== undefined) out.themeVars = vars;\n return out;\n }\n return {};\n}\n\n/** Converts a parsed theme file into CSS-variable overrides. */\nfunction toVars(raw: unknown): Readonly<Record<string, string>> | undefined {\n if (raw === null || typeof raw !== 'object') return undefined;\n const file = raw as ThemeFile;\n const vars: Record<string, string> = {};\n if (file.colors !== undefined) {\n for (const key of Object.keys(file.colors)) {\n const cssVar = COLOR_TO_VAR[key.toLowerCase()];\n const value = file.colors[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n if (file.fonts !== undefined) {\n for (const key of Object.keys(file.fonts)) {\n const cssVar = FONT_TO_VAR[key.toLowerCase()];\n const value = file.fonts[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n return Object.keys(vars).length > 0 ? vars : undefined;\n}\n\n/** Strips `//` line comments so `.jsonc`-style files parse. */\nfunction stripComments(src: string): string {\n return src.replace(/^\\s*\\/\\/.*$/gm, '');\n}\n","/**\n * `avo render` — render one document to a standalone HTML file.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, parse as parsePath, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument, type ThemeName } from '@avodado/render';\nimport { loadTheme } from '../io/theme.js';\n\nexport interface RenderOptions {\n /** Input doc path. */\n readonly input: string;\n /** Output path. Defaults to `<input>.html` next to the input. */\n readonly output?: string;\n /** Working directory. */\n readonly cwd: string;\n}\n\n/** Result of a render. */\nexport interface RenderResult {\n readonly input: string;\n readonly output: string;\n readonly bytes: number;\n}\n\n/**\n * Reads `opts.input`, parses + renders it, and writes the resulting HTML.\n *\n * @returns The output path and byte size written.\n */\nexport async function runRender(opts: RenderOptions): Promise<RenderResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const { theme, themeVars } = loadTheme(opts.cwd);\n const html = renderDocument(doc, {\n ...(theme !== undefined ? { theme: theme as ThemeName } : {}),\n ...(themeVars !== undefined ? { themeVars } : {}),\n });\n\n const outputAbs = opts.output !== undefined ? resolve(opts.cwd, opts.output) : inputAbs.replace(/\\.md$/i, '.html');\n await mkdir(dirname(outputAbs), { recursive: true });\n await writeFile(outputAbs, html, 'utf8');\n return { input: opts.input, output: outputAbs, bytes: html.length };\n}\n","/**\n * `avo export` — batch-export one or more documents to HTML and/or PDF.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { toHtml, toPdf } from '@avodado/export';\nimport { loadDocs } from '../io/files.js';\n\nexport type ExportFormat = 'html' | 'pdf';\n\nexport interface ExportOptions {\n readonly patterns: readonly string[];\n readonly cwd: string;\n readonly docsRoot: string;\n readonly outDir: string;\n readonly formats: readonly ExportFormat[];\n}\n\nexport interface ExportItem {\n readonly file: string;\n readonly outputs: readonly { format: ExportFormat; path: string; bytes: number }[];\n}\n\nexport interface ExportResult {\n readonly items: readonly ExportItem[];\n}\n\n/**\n * Reads, parses, and renders each matched document into one or more output\n * formats under `outDir`. Filenames mirror the doc's slug.\n */\nexport async function runExport(opts: ExportOptions): Promise<ExportResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const outRoot = resolve(opts.cwd, opts.outDir);\n await mkdir(outRoot, { recursive: true });\n\n const items: ExportItem[] = [];\n for (const d of docs) {\n const doc = parseDocument(d.source, d.slug);\n const outputs: { format: ExportFormat; path: string; bytes: number }[] = [];\n for (const fmt of opts.formats) {\n const outPath = join(outRoot, `${d.slug}.${fmt}`);\n await mkdir(resolve(outPath, '..'), { recursive: true });\n if (fmt === 'html') {\n const html = toHtml(doc);\n await writeFile(outPath, html, 'utf8');\n outputs.push({ format: fmt, path: outPath, bytes: html.length });\n } else {\n const pdf = await toPdf(doc);\n await writeFile(outPath, pdf);\n outputs.push({ format: fmt, path: outPath, bytes: pdf.byteLength });\n }\n }\n items.push({ file: d.file, outputs });\n }\n return { items };\n}\n","/**\n * `avo preview` — render a single doc to a temp HTML file and open it in the\n * default browser.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { join, parse as parsePath, resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument } from '@avodado/render';\n\nexport interface PreviewOptions {\n readonly input: string;\n readonly cwd: string;\n}\n\nexport interface PreviewResult {\n readonly file: string;\n}\n\n/**\n * Renders the doc to a temp file (named by a hash of the source path so\n * repeated previews reuse the same file) and opens it in the OS browser.\n */\nexport async function runPreview(opts: PreviewOptions): Promise<PreviewResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const html = renderDocument(doc);\n\n const hash = createHash('sha1').update(inputAbs).digest('hex').slice(0, 8);\n const dir = join(tmpdir(), 'avodado-preview');\n await mkdir(dir, { recursive: true });\n const out = join(dir, `${slug}-${hash}.html`);\n await writeFile(out, html, 'utf8');\n await open(out);\n return { file: out };\n}\n","/**\n * `avo init` — scaffold a new Avodado project in the current directory.\n *\n * Copies the template tree (docs sample, config, the authoring skill, and\n * editor adapters for Claude Code + Cursor) into `cwd`.\n */\n\nimport { cp, mkdir } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface InitOptions {\n readonly cwd: string;\n /** Overwrite files that already exist. Default: false (skip with a notice). */\n readonly force?: boolean;\n}\n\nexport interface InitResult {\n readonly created: readonly string[];\n readonly skipped: readonly string[];\n}\n\n/**\n * Resolves the templates directory packaged with the CLI.\n *\n * Walks up from this module's location looking for a `templates` sibling.\n * Works for both `dist/bin.js` (one level up) and source layout\n * (`src/commands/init.ts`, two levels up).\n */\nfunction templatesDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'templates');\n if (existsSync(candidate) && statSync(candidate).isDirectory()) return candidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(`Could not locate avodado/cli templates directory near ${import.meta.url}`);\n}\n\nconst FILES: readonly string[] = [\n 'avodado.config.json',\n 'docs/getting-started.md',\n 'CLAUDE.md',\n '.cursor/rules/avodado.mdc',\n '.avodado/skill/SKILL.md',\n];\n\n/**\n * Copies the template tree into `cwd`. Files that already exist are skipped\n * unless `force: true`. Returns the lists of created and skipped relative\n * paths so the caller can report them.\n */\nexport async function runInit(opts: InitOptions): Promise<InitResult> {\n const srcRoot = templatesDir();\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const rel of FILES) {\n const src = resolve(srcRoot, rel);\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n continue;\n }\n await mkdir(dirname(dst), { recursive: true });\n await cp(src, dst);\n created.push(rel);\n }\n\n return { created, skipped };\n}\n","/**\n * `avo sync openapi` — generate an Avodado doc from an OpenAPI spec, or\n * verify that an existing doc matches what the spec would generate (CI drift).\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, resolve, extname } from 'node:path';\nimport { openapiToMarkdown, parseOpenApi } from '@avodado/sync';\n\n/** Inputs for {@link runSyncOpenApi}. */\nexport interface SyncOpenApiOptions {\n readonly cwd: string;\n /** Path to the OpenAPI spec (relative or absolute). */\n readonly spec: string;\n /** Output path (write mode). Mutually exclusive with `check`. */\n readonly out?: string;\n /** Path to compare generated output against (drift mode). */\n readonly check?: string;\n /** Slug used to namespace generated block ids. Defaults to the output basename. */\n readonly slug?: string;\n}\n\n/** Result of `avo sync openapi`. */\nexport interface SyncOpenApiResult {\n readonly exitCode: 0 | 1 | 2;\n /** A short, plain-text summary suitable for logging. */\n readonly message: string;\n /** When `check` mode finds drift: the line-level diff. */\n readonly diff?: string;\n}\n\nfunction slugFromPath(path: string): string {\n const base = basename(path, extname(path));\n return base.length > 0 ? base : 'api';\n}\n\n/**\n * Generates an Avodado doc from an OpenAPI spec — either writing it to disk,\n * or comparing the in-memory result against an existing doc on disk and\n * reporting drift.\n */\nexport async function runSyncOpenApi(opts: SyncOpenApiOptions): Promise<SyncOpenApiResult> {\n if (opts.out === undefined && opts.check === undefined) {\n return { exitCode: 2, message: 'avo sync openapi: must specify --out <path> or --check <path>' };\n }\n if (opts.out !== undefined && opts.check !== undefined) {\n return { exitCode: 2, message: 'avo sync openapi: --out and --check are mutually exclusive' };\n }\n\n const specAbs = resolve(opts.cwd, opts.spec);\n if (!existsSync(specAbs)) {\n return { exitCode: 2, message: `Spec not found: ${specAbs}` };\n }\n\n const source = await readFile(specAbs, 'utf8');\n let spec;\n try {\n spec = parseOpenApi(source);\n } catch (err) {\n return { exitCode: 1, message: `Failed to parse spec: ${(err as Error).message}` };\n }\n\n const targetPath = opts.out ?? opts.check;\n if (targetPath === undefined) {\n return { exitCode: 2, message: 'no target path' };\n }\n const slug = opts.slug ?? slugFromPath(targetPath);\n const generated = openapiToMarkdown(spec, { slug });\n\n if (opts.out !== undefined) {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, generated, 'utf8');\n return {\n exitCode: 0,\n message: `Wrote ${outAbs} (${generated.length} bytes)`,\n };\n }\n\n // Check mode — compare against existing file.\n const checkAbs = resolve(opts.cwd, opts.check ?? '');\n if (!existsSync(checkAbs)) {\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} does not exist. Run with --out ${opts.check} to generate it.`,\n };\n }\n const existing = await readFile(checkAbs, 'utf8');\n if (existing === generated) {\n return {\n exitCode: 0,\n message: `OK: ${checkAbs} matches ${specAbs} (${generated.length} bytes)`,\n };\n }\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} differs from what ${specAbs} would generate.`,\n diff: simpleDiff(existing, generated),\n };\n}\n\n/** Tiny line-level diff for the drift report. Not a full diff library; good enough for CI. */\nfunction simpleDiff(a: string, b: string): string {\n const aLines = a.split('\\n');\n const bLines = b.split('\\n');\n const out: string[] = [];\n const max = Math.max(aLines.length, bLines.length);\n for (let i = 0; i < max; i++) {\n const av = aLines[i];\n const bv = bLines[i];\n if (av === bv) continue;\n if (av !== undefined) out.push(`- ${av}`);\n if (bv !== undefined) out.push(`+ ${bv}`);\n if (out.length >= 40) {\n out.push(`… (truncated; ${max - i - 1} more lines)`);\n break;\n }\n }\n return out.join('\\n');\n}\n","/**\n * `avo new` — scaffold a new doc from a block-type template.\n *\n * Interactive (Ink) when run in a TTY; non-interactive with `--type <kind>\n * --out <path>` for CI usage.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport React, { useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { BLOCK_TYPES, type BlockType } from '@avodado/core';\n\nexport interface NewOptions {\n readonly cwd: string;\n readonly type?: BlockType;\n readonly out?: string;\n}\n\nconst TEMPLATES: Record<BlockType, string> = {\n meta: '```meta\\ntitle: New document\\nsubtitle: One-line description.\\ntag: DRAFT\\n```\\n',\n callout:\n '```callout\\ntone: note\\ntitle: Heads up\\nbody: A short note that the reader should not miss.\\n```\\n',\n table: '```table\\ncolumns: [Field, Description]\\nrows:\\n - [name, Display name]\\n - [id, Stable identifier]\\n```\\n',\n sequence:\n '```sequence\\nid: seq-example\\nactors:\\n - { id: Client, name: Client }\\n - { id: Server, name: Server }\\nmessages:\\n - { from: Client, to: Server, label: request, kind: sync }\\n - { from: Server, to: Client, label: response, kind: response }\\n```\\n',\n erd:\n '```erd\\nid: erd-example\\nentities:\\n - name: orders\\n columns:\\n - { name: id, type: uuid, pk: true }\\n - { name: user_id, type: uuid, fk: true }\\nrelations: []\\n```\\n',\n userstory:\n '```userstory\\nid: US-001\\nrole: user\\nwant: do the thing\\nsoThat: I get the outcome\\ncriteria:\\n - { given: a precondition, when: I act, then: the outcome }\\n```\\n',\n timeline:\n '```timeline\\nitems:\\n - label: Phase 1\\n date: now\\n status: current\\n desc: What is happening now\\n - label: Phase 2\\n date: next\\n status: next\\n desc: What is next\\n```\\n',\n kanban:\n '```kanban\\ncolumns:\\n - label: Now\\n cards:\\n - { title: Current task }\\n - label: Next\\n cards:\\n - { title: Upcoming task }\\n - label: Later\\n cards:\\n - { title: Eventually }\\n```\\n',\n tracker:\n '```tracker\\nitems:\\n - { task: First task, status: doing, priority: high }\\n - { task: Second task, status: todo, priority: med }\\n```\\n',\n prose:\n '```prose\\ntitle: Overview\\nblocks:\\n - { type: h, text: Background }\\n - { type: p, text: A paragraph explaining the context. }\\n - { type: ul, items: [Idea one, Idea two, Idea three] }\\n```\\n',\n glossary:\n '```glossary\\nterms:\\n - { term: Idempotency, def: Doing a thing twice has the same effect as doing it once. }\\n - { term: SLO, def: Service-level objective the team commits to. }\\n```\\n',\n proscons:\n '```proscons\\ntitle: Synchronous vs async\\nprosLabel: Synchronous\\nconsLabel: Asynchronous\\npros:\\n - Easy to reason about\\n - One transaction\\ncons:\\n - Latency-bound\\n - Single point of failure\\n```\\n',\n cvt:\n '```cvt\\ntitle: Migration plan\\ncurrent:\\n label: Today\\n items: [Single monolith, Shared database, Manual deploys]\\ntarget:\\n label: Target\\n items: [Modular services, Per-service stores, Automated deploys]\\nnote: Migrate one service per quarter.\\n```\\n',\n stats:\n '```stats\\ntitle: This quarter\\nstats:\\n - { value: 12.4k, label: Active users, delta: \"+18%\", trend: up }\\n - { value: 99.95%, label: Uptime, delta: \"0\", trend: flat }\\n - { value: 142ms, label: p95 latency, delta: \"-22ms\", trend: up }\\n```\\n',\n code:\n '```code\\ntitle: Reference\\nblocks:\\n - title: index.ts\\n lang: TypeScript\\n code: |\\n export function add(a: number, b: number): number {\\n return a + b;\\n }\\n```\\n',\n agenda:\n '```agenda\\nitems:\\n - { time: \"09:00\", duration: 30m, title: Intros, owner: Host }\\n - { time: \"09:30\", duration: 45m, title: Status updates, desc: Each team for 5 min }\\n - { time: \"10:15\", duration: 15m, title: Wrap-up }\\n```\\n',\n tree:\n '```tree\\nnodes:\\n - { id: src, label: src }\\n - { id: components, parent: src, label: components }\\n - { id: hooks, parent: src, label: hooks }\\n - { id: index, parent: src, label: index.ts, note: entry point }\\n```\\n',\n pyramid:\n '```pyramid\\nlevels:\\n - { label: Vision, desc: Long-term direction }\\n - { label: Strategy, desc: How we get there }\\n - { label: Tactics, desc: This quarter }\\n - { label: Tasks, desc: This week }\\n```\\n',\n funnel:\n '```funnel\\nstages:\\n - { label: Visited, value: 10000 }\\n - { label: Signed up, value: 2400 }\\n - { label: Activated, value: 1100 }\\n - { label: Paying, value: 320 }\\n```\\n',\n flow:\n '```flow\\ntitle: Decision flow\\nnodes:\\n - { id: start, col: 1, row: 1, kind: start, label: Start }\\n - { id: check, col: 2, row: 1, kind: decision, label: Is valid? }\\n - { id: yes, col: 3, row: 1, kind: process, label: Process }\\n - { id: no, col: 2, row: 2, kind: end, label: Reject }\\n - { id: done, col: 3, row: 2, kind: end, label: Done }\\nedges:\\n - { from: start, to: check }\\n - { from: check, to: yes, label: \"yes\" }\\n - { from: check, to: no, label: \"no\", kind: error }\\n - { from: yes, to: done }\\n```\\n',\n state:\n '```state\\ntitle: Order lifecycle\\nstates:\\n - { id: s0, col: 1, row: 1, kind: start }\\n - { id: pending, col: 2, row: 1, kind: wait, name: PENDING }\\n - { id: confirmed, col: 3, row: 1, kind: active, name: CONFIRMED }\\n - { id: end, col: 4, row: 1, kind: terminal }\\ntransitions:\\n - { from: s0, to: pending, event: create }\\n - { from: pending, to: confirmed, event: pay }\\n - { from: confirmed, to: end, event: ship }\\n```\\n',\n dfd:\n '```dfd\\ntitle: Data flow\\nnodes:\\n - { id: ext, col: 1, row: 1, kind: external, name: Client }\\n - { id: proc, col: 2, row: 1, kind: process, name: Process, num: 1 }\\n - { id: store, col: 3, row: 1, kind: store, name: Orders }\\nedges:\\n - { from: ext, to: proc, label: request }\\n - { from: proc, to: store, label: write }\\n```\\n',\n journey:\n '```journey\\ntitle: Onboarding journey\\nstages:\\n - { label: Discover }\\n - { label: Sign up }\\n - { label: Activate }\\n - { label: Pay }\\nrows:\\n - { label: Touchpoint, cells: [Landing, Form, Email, Checkout] }\\n - { label: Friction, cells: [Low, Med, Low, Med] }\\nemotion: [0.7, 0.4, 0.6, 0.8]\\n```\\n',\n gantt:\n '```gantt\\ntitle: Roadmap\\nperiods: [Q1, Q2, Q3, Q4]\\ntasks:\\n - { label: Discovery, start: 0, span: 1, kind: done }\\n - { label: Build, start: 1, span: 2, kind: active }\\n - { label: Ship, start: 3, span: 1 }\\n - { label: GA, start: 3, span: 1, kind: milestone }\\n```\\n',\n graph:\n '```graph\\ntitle: Dependency graph\\nnodes:\\n - { id: a, col: 1, row: 1, label: Module A, group: 0 }\\n - { id: b, col: 2, row: 1, label: Module B, group: 1 }\\n - { id: c, col: 3, row: 1, label: Module C, group: 2 }\\n - { id: d, col: 2, row: 2, label: Shared, group: 3 }\\nedges:\\n - { from: a, to: b }\\n - { from: b, to: c }\\n - { from: a, to: d }\\n - { from: b, to: d, dir: undirected }\\n```\\n',\n quadrant:\n '```quadrant\\ntitle: Effort vs impact\\nxAxis: { label: Effort, low: Low, high: High }\\nyAxis: { label: Impact, low: Low, high: High }\\nitems:\\n - { x: 0.2, y: 0.8, label: Quick win }\\n - { x: 0.8, y: 0.8, label: Big bet }\\n - { x: 0.2, y: 0.2, label: Fill-in }\\n - { x: 0.8, y: 0.2, label: Thankless }\\n```\\n',\n swimlane:\n '```swimlane\\ntitle: Cross-functional flow\\nlanes:\\n - { label: Customer }\\n - { label: Sales }\\n - { label: Ops }\\nsteps:\\n - { id: req, col: 1, lane: 0, kind: start, label: Submit request }\\n - { id: qual, col: 2, lane: 1, kind: decision, label: Qualify }\\n - { id: fulfill, col: 3, lane: 2, label: Fulfill }\\n - { id: done, col: 4, lane: 0, kind: end, label: Receive }\\nlinks:\\n - { from: req, to: qual }\\n - { from: qual, to: fulfill }\\n - { from: fulfill, to: done }\\n```\\n',\n c4:\n '```c4\\ntitle: System context\\nlevel: context\\nnodes:\\n - { id: user, col: 1, row: 1, kind: person, name: Shopper, desc: A customer placing an order. }\\n - { id: app, col: 2, row: 1, kind: system, name: ShopCo, desc: The retail platform. }\\n - { id: pay, col: 3, row: 1, kind: external, name: Payment GW, desc: Stripe authorisation. }\\nedges:\\n - { from: user, to: app, label: places order }\\n - { from: app, to: pay, label: authorises }\\n```\\n',\n uml:\n '```uml\\ntitle: Class model\\nclasses:\\n - { id: order, col: 1, row: 1, name: Order, attrs: [\"id: UUID\", \"status: Status\", \"total: Money\"], methods: [\"place()\", \"cancel()\"] }\\n - { id: item, col: 2, row: 1, name: OrderItem, attrs: [\"id: UUID\", \"sku: String\", \"qty: int\"] }\\n - { id: status, col: 1, row: 2, name: Status, stereotype: enumeration, attrs: [\"PENDING\", \"CONFIRMED\", \"CANCELLED\"] }\\nrels:\\n - { from: order, to: item, kind: composition }\\n - { from: order, to: status, kind: association, label: has }\\n```\\n',\n mece:\n '```mece\\ntitle: Why are conversions down?\\nnodes:\\n - { id: root, label: Lower conversion }\\n - { id: traffic, parent: root, label: Traffic }\\n - { id: friction, parent: root, label: Friction }\\n - { id: t1, parent: traffic, label: Lower quality, note: paid ads }\\n - { id: t2, parent: traffic, label: Wrong audience }\\n - { id: f1, parent: friction, label: Slow checkout }\\n - { id: f2, parent: friction, label: Mobile bugs }\\n```\\n',\n frontend:\n '```frontend\\ntitle: React component tree\\nnodes:\\n - { id: app, kind: root, name: App }\\n - { id: layout, parent: app, kind: layout, name: Layout }\\n - { id: home, parent: layout, kind: page, name: Home }\\n - { id: orders, parent: layout, kind: page, name: Orders }\\n - { id: card, parent: orders, kind: component, name: OrderCard }\\n - { id: useOrder, parent: orders, kind: hook, name: useOrder }\\n - { id: store, parent: app, kind: store, name: cart, note: Zustand }\\n```\\n',\n cluster:\n '```cluster\\ntitle: Production cluster\\nclusters:\\n - { id: api, label: api namespace, kind: namespace }\\n - { id: data, label: data namespace, kind: namespace }\\nservices:\\n - { id: web, cluster: api, label: web, kind: service, tech: Next.js, replicas: 3 }\\n - { id: orders, cluster: api, label: orders, kind: service, tech: Go, replicas: 4 }\\n - { id: pg, cluster: data, label: postgres, kind: store, tech: Postgres 16, replicas: 1 }\\n - { id: redis, cluster: data, label: redis, kind: cache, tech: Redis 7, replicas: 2 }\\nedges:\\n - { from: web, to: orders }\\n - { from: orders, to: pg }\\n - { from: orders, to: redis }\\n```\\n',\n block:\n '```block\\ntitle: System architecture\\ngroups:\\n - { col: 1, row: 1, cols: 1, rows: 2, label: Edge, color: \"#0e54a1\" }\\n - { col: 2, row: 1, cols: 2, rows: 2, label: Services, color: \"#1f9747\" }\\nnodes:\\n - { id: cdn, col: 1, row: 1, kind: cdn, name: CDN, tech: Cloudflare }\\n - { id: gw, col: 1, row: 2, kind: gateway, name: Gateway, tech: Envoy }\\n - { id: api, col: 2, row: 1, kind: service, name: API, tech: Go }\\n - { id: worker, col: 3, row: 1, kind: service, name: Worker, tech: Go }\\n - { id: pg, col: 2, row: 2, kind: store, name: Postgres, tech: \"16\" }\\n - { id: q, col: 3, row: 2, kind: queue, name: Events, tech: NATS }\\nedges:\\n - { from: cdn, to: gw }\\n - { from: gw, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: q }\\n - { from: q, to: worker, kind: dashed }\\n```\\n',\n infra:\n '```infra\\ntitle: AWS topology\\nsystemLabel: ShopCo · us-east-1\\nlayers:\\n - { label: Edge }\\n - { label: Compute }\\n - { label: Data }\\nnodes:\\n - { id: cf, layer: 0, kind: cdn, name: CloudFront, tech: CDN }\\n - { id: alb, layer: 0, kind: gateway, name: ALB, tech: Application LB }\\n - { id: api, layer: 1, kind: service, name: API, tech: ECS Fargate }\\n - { id: worker, layer: 1, kind: service, name: Worker, tech: ECS Fargate }\\n - { id: pg, layer: 2, kind: store, name: orders-db, tech: RDS Postgres }\\n - { id: cache, layer: 2, kind: cache, name: cache, tech: ElastiCache }\\nedges:\\n - { from: cf, to: alb }\\n - { from: alb, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: cache }\\n - { from: api, to: worker, kind: dashed }\\n```\\n',\n event:\n '```event\\ntitle: Pub/sub choreography\\nnodes:\\n - { id: orders, col: 1, row: 1, kind: producer, name: orders }\\n - { id: bus, col: 2, row: 1, kind: topic, name: order.events }\\n - { id: ship, col: 3, row: 1, kind: consumer, name: shipping }\\n - { id: bill, col: 3, row: 2, kind: consumer, name: billing }\\nedges:\\n - { from: orders, to: bus }\\n - { from: bus, to: ship }\\n - { from: bus, to: bill }\\n```\\n',\n ddd:\n '```ddd\\ntitle: Bounded contexts\\nnodes:\\n - { id: cat, col: 1, row: 1, kind: context, name: Catalog }\\n - { id: order, col: 2, row: 1, kind: context, name: Orders }\\n - { id: pay, col: 3, row: 1, kind: context, name: Payments }\\n - { id: ship, col: 2, row: 2, kind: context, name: Shipping }\\nedges:\\n - { from: order, to: cat, label: reads, kind: dashed }\\n - { from: order, to: pay }\\n - { from: order, to: ship }\\n```\\n',\n network:\n '```network\\ntitle: Security zones\\nnodes:\\n - { id: edge, col: 1, row: 1, kind: gateway, name: Edge / WAF }\\n - { id: fw, col: 2, row: 1, kind: firewall, name: Perimeter FW }\\n - { id: api, col: 3, row: 1, kind: service, name: API }\\n - { id: db, col: 3, row: 2, kind: store, name: DB (private) }\\nedges:\\n - { from: edge, to: fw }\\n - { from: fw, to: api }\\n - { from: api, to: db }\\n```\\n',\n felogic:\n '```felogic\\ntitle: Frontend modules\\nnodes:\\n - { id: hook, col: 1, row: 1, kind: hook, name: useOrders }\\n - { id: svc, col: 2, row: 1, kind: service, name: ordersService }\\n - { id: iface, col: 3, row: 1, kind: interface, name: OrdersClient }\\n - { id: impl, col: 4, row: 1, kind: strategy, name: HttpOrdersClient }\\n - { id: api, col: 5, row: 1, kind: external, name: Orders API }\\nedges:\\n - { from: hook, to: svc }\\n - { from: svc, to: iface, kind: uses }\\n - { from: impl, to: iface, kind: implements }\\n - { from: impl, to: api, kind: egress, label: HTTPS }\\n```\\n',\n belogic:\n '```belogic\\ntitle: Backend modules\\nnodes:\\n - { id: ctrl, col: 1, row: 1, kind: controller, name: OrdersController }\\n - { id: svc, col: 2, row: 1, kind: service, name: PlaceOrder }\\n - { id: repo, col: 3, row: 1, kind: repository, name: OrdersRepo }\\n - { id: db, col: 4, row: 1, kind: db, name: postgres }\\n - { id: pay, col: 3, row: 2, kind: external, name: Stripe }\\nedges:\\n - { from: ctrl, to: svc }\\n - { from: svc, to: repo }\\n - { from: repo, to: db, kind: reads }\\n - { from: svc, to: pay, kind: egress, label: authorise }\\n```\\n',\n dag:\n '```dag\\ntitle: Build pipeline\\nnodes:\\n - { id: src, col: 1, row: 1, kind: start, label: Source }\\n - { id: lint, col: 2, row: 1, kind: process, label: Lint }\\n - { id: test, col: 3, row: 1, kind: process, label: Test }\\n - { id: build, col: 4, row: 1, kind: process, label: Build }\\n - { id: deploy, col: 5, row: 1, kind: end, label: Deploy }\\nedges:\\n - { from: src, to: lint }\\n - { from: lint, to: test }\\n - { from: test, to: build }\\n - { from: build, to: deploy }\\n```\\n',\n wireframe:\n '```wireframe\\ntitle: What the user sees\\nscreens:\\n - device: browser\\n title: Dashboard\\n url: app.example.com\\n label: Desktop\\n elements:\\n - { type: nav, label: \"Home, Inbox, Settings\" }\\n - { type: header, label: Notifications }\\n - { type: list, rows: 4 }\\n - { type: button, label: Mark all as read }\\n - device: phone\\n title: \"9:41\"\\n label: iPhone\\n elements:\\n - { type: header, label: Alerts }\\n - { type: card, rows: 3 }\\n - { type: tabs, label: \"Home, Search, Bell, You\" }\\n```\\n',\n};\n\n/** Returns the template string for a block type. */\nexport function templateFor(type: BlockType): string {\n return `\\`\\`\\`meta\\ntitle: New document\\ntag: DRAFT\\n\\`\\`\\`\\n\\n## ${type}\\n\\n${TEMPLATES[type]}`;\n}\n\n/**\n * Multi-block *document* templates (as opposed to single-block scaffolds).\n * Each is a complete, `avo check`-clean starting doc for a common doc kind.\n */\nconst ADR_TEMPLATE = [\n '```meta',\n 'title: ADR-NNN — decision title',\n 'subtitle: One line on what we decided and why it matters.',\n 'tag: ADR · Proposed · YYYY-MM-DD',\n '```',\n '',\n '## Status',\n '',\n '**Proposed** — YYYY-MM-DD. (Proposed → Accepted → Superseded.)',\n '',\n '## Context',\n '',\n 'What forces a decision here? The constraints, requirements, and the problem',\n 'being solved. Two to four sentences of plain prose — no block needed.',\n '',\n '```callout',\n 'tone: note',\n 'title: Decision',\n 'body: \"State the decision in one or two sentences — what we will do, and the single most important reason why.\"',\n '```',\n '',\n '## Options considered',\n '',\n '```proscons',\n 'id: the-choice',\n 'title: Chosen option vs the alternative',\n 'prosLabel: Chosen option',\n 'consLabel: The alternative',\n 'pros:',\n ' - A concrete reason the chosen option wins',\n ' - Another benefit worth the trade-off',\n 'cons:',\n ' - A real cost of the alternative',\n ' - Another drawback we are accepting against',\n '```',\n '',\n '## Architecture',\n '',\n '```block',\n 'id: architecture',\n 'title: How it fits together',\n 'nodes:',\n ' - { id: client, col: 1, row: 1, kind: client, name: Client }',\n ' - { id: svc, col: 2, row: 1, kind: service, name: Service, tech: your stack }',\n ' - { id: db, col: 3, row: 1, kind: store, name: Database }',\n 'edges:',\n ' - { from: client, to: svc }',\n ' - { from: svc, to: db }',\n '```',\n '',\n '## Consequences',\n '',\n '```tracker',\n 'id: consequences',\n 'title: Consequences & follow-ups',\n 'items:',\n ' - { task: \"Something that becomes easier or newly required\", status: todo, priority: high }',\n ' - { task: \"A migration or new responsibility this creates\", status: todo, priority: med }',\n ' - { task: \"A risk to watch as we roll this out\", status: todo, priority: low }',\n '```',\n '',\n].join('\\n');\n\n/** Full-document templates, keyed by name (`avo new --type adr`). */\nexport const DOC_TEMPLATES: Record<string, string> = {\n adr: ADR_TEMPLATE,\n};\n\n/** True when `name` is a full-document template rather than a block type. */\nexport function isDocTemplate(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(DOC_TEMPLATES, name);\n}\n\n/**\n * Writes a new doc to `out` from the chosen block type. Returns the absolute\n * path written. Non-interactive: requires `type` + `out`.\n */\nexport async function writeNewDoc(opts: { cwd: string; type: string; out: string }): Promise<string> {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n const content = isDocTemplate(opts.type)\n ? (DOC_TEMPLATES[opts.type] as string)\n : templateFor(opts.type as BlockType);\n await writeFile(outAbs, content, 'utf8');\n return outAbs;\n}\n\ninterface PickerProps {\n readonly onPick: (type: BlockType) => void;\n}\n\n/** Ink picker UI for selecting a block type interactively. */\nexport function NewPicker({ onPick }: PickerProps): React.ReactElement {\n const items = BLOCK_TYPES.map((t) => ({ label: t, value: t }));\n return (\n <Box flexDirection=\"column\">\n <Text bold>Pick a block type to scaffold:</Text>\n <SelectInput\n items={items}\n onSelect={(item) => onPick(item.value as BlockType)}\n />\n </Box>\n );\n}\n\ninterface AppProps {\n readonly cwd: string;\n readonly out: string;\n}\n\n/** Full Ink app for interactive `avo new` — picker → write → exit. */\nexport function NewApp({ cwd, out }: AppProps): React.ReactElement {\n const [picked, setPicked] = useState<BlockType | null>(null);\n const [writtenPath, setWrittenPath] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handlePick = (type: BlockType): void => {\n setPicked(type);\n void writeNewDoc({ cwd, type, out }).then((path) => {\n setWrittenPath(path);\n setTimeout(exit, 50);\n });\n };\n\n if (writtenPath !== null) {\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> Wrote </Text>\n <Text bold>{writtenPath}</Text>\n </Box>\n );\n }\n if (picked !== null) {\n return <Text>Writing {out}…</Text>;\n }\n return <NewPicker onPick={handlePick} />;\n}\n","/**\n * Renders a code frame — the offending source line(s) with a caret underline —\n * for a diagnostic, in the style of Rust / TypeScript / Babel errors.\n *\n * Pure and dependency-free; the caller supplies the file's source lines so this\n * stays I/O-free and testable.\n */\n\nimport pc from 'picocolors';\n\n/** Inputs for {@link renderCodeFrame}. */\nexport interface CodeFrameInput {\n /** The file's source split into lines (no trailing newline per line). */\n readonly lines: readonly string[];\n /** 1-based line of the offending token. */\n readonly line: number;\n /** 1-based column of the offending token, if known. */\n readonly column?: number;\n /** 1-based exclusive end column, if known (for a multi-char underline). */\n readonly endColumn?: number;\n /** Number of context lines to show above the offending line. Default 1. */\n readonly contextBefore?: number;\n /** Caret colour: 'error' (red) or 'warn' (yellow). Default 'error'. */\n readonly level?: 'error' | 'warn';\n}\n\n/**\n * Builds a code frame string. Returns an empty string if the line is out of\n * range (so callers can unconditionally append it).\n *\n * @example\n * ```\n * 30 | - { from: Client, kind: bogus }\n * | ^^^^^\n * ```\n */\nexport function renderCodeFrame(input: CodeFrameInput): string {\n const { lines, line } = input;\n if (line < 1 || line > lines.length) return '';\n\n const contextBefore = input.contextBefore ?? 1;\n const start = Math.max(1, line - contextBefore);\n const gutterWidth = String(line).length + 1;\n const tint = input.level === 'warn' ? pc.yellow : pc.red;\n\n const out: string[] = [];\n for (let n = start; n <= line; n++) {\n const text = lines[n - 1] ?? '';\n const gutter = pc.dim(`${String(n).padStart(gutterWidth)} | `);\n out.push(gutter + text);\n }\n\n // Caret line under the offending span.\n if (input.column !== undefined && input.column >= 1) {\n const col = input.column;\n const span = input.endColumn !== undefined ? Math.max(1, input.endColumn - col) : 1;\n const pad = ' '.repeat(gutterWidth) + pc.dim(' | ') + ' '.repeat(col - 1);\n out.push(pad + tint('^'.repeat(span)));\n }\n\n return out.join('\\n');\n}\n","/**\n * Diagnostics rendering for `avo check`.\n *\n * - {@link DiagnosticsTable} is the interactive (TTY) Ink view.\n * - {@link formatDiagnosticsPlain} is the CI / non-TTY text view.\n *\n * Both show a code frame (the offending line with a caret) plus the one-line\n * `hint` and help URL, so an error teaches the fix in place.\n */\n\nimport { Box, Text } from 'ink';\nimport { helpUrl, type Diagnostic } from '@avodado/core';\nimport React from 'react';\nimport { renderCodeFrame } from './codeFrame.js';\n\ntype Sources = ReadonlyMap<string, readonly string[]>;\n\ninterface Props {\n readonly diagnostics: readonly Diagnostic[];\n readonly fileCount: number;\n readonly sources: Sources;\n}\n\nconst COLOR: Record<Diagnostic['level'], string> = {\n error: 'red',\n warn: 'yellow',\n};\n\nfunction frameFor(d: Diagnostic, sources: Sources): string {\n if (d.line === undefined) return '';\n const lines = sources.get(d.file);\n if (lines === undefined) return '';\n return renderCodeFrame({\n lines,\n line: d.line,\n ...(d.column !== undefined ? { column: d.column } : {}),\n ...(d.endColumn !== undefined ? { endColumn: d.endColumn } : {}),\n level: d.level,\n });\n}\n\nexport function DiagnosticsTable({ diagnostics, fileCount, sources }: Props): React.ReactElement {\n const errorCount = diagnostics.filter((d) => d.level === 'error').length;\n const warnCount = diagnostics.filter((d) => d.level === 'warn').length;\n\n if (diagnostics.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n ✓ {fileCount} {fileCount === 1 ? 'file' : 'files'} checked — no diagnostics\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {diagnostics.map((d, i) => {\n const frame = frameFor(d, sources);\n return (\n <Box key={`${d.file}:${d.line ?? '-'}:${i}`} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={COLOR[d.level]} bold>\n {d.level === 'error' ? '✖' : '⚠'}{' '}\n </Text>\n <Text dimColor>\n {d.file}\n {d.line !== undefined ? `:${d.line}` : ''}\n {d.column !== undefined ? `:${d.column}` : ''}{' '}\n </Text>\n <Text color={COLOR[d.level]}>{d.code} </Text>\n <Text>{d.message}</Text>\n </Box>\n {frame.length > 0 ? <Text>{frame}</Text> : null}\n {d.hint !== undefined ? (\n <Text>\n {' '}\n <Text color=\"cyan\">hint:</Text> {d.hint}\n </Text>\n ) : null}\n <Text dimColor>\n {' '}\n {helpUrl(d.code)}\n </Text>\n </Box>\n );\n })}\n <Box>\n <Text bold color={errorCount > 0 ? 'red' : warnCount > 0 ? 'yellow' : 'green'}>\n {errorCount} {errorCount === 1 ? 'error' : 'errors'}, {warnCount}{' '}\n {warnCount === 1 ? 'warning' : 'warnings'} across {fileCount}{' '}\n {fileCount === 1 ? 'file' : 'files'}\n </Text>\n </Box>\n </Box>\n );\n}\n\n/** Formats diagnostics for plain (non-TTY / CI) output. */\nexport function formatDiagnosticsPlain(\n diagnostics: readonly Diagnostic[],\n fileCount: number,\n sources: Sources,\n): string {\n if (diagnostics.length === 0) {\n return `OK: ${fileCount} ${fileCount === 1 ? 'file' : 'files'} checked, no diagnostics\\n`;\n }\n const blocks = diagnostics.map((d) => {\n const loc =\n d.line !== undefined\n ? `${d.file}:${d.line}${d.column !== undefined ? `:${d.column}` : ''}`\n : d.file;\n const parts = [`${loc} ${d.level} ${d.code} ${d.message}`];\n const frame = frameFor(d, sources);\n if (frame.length > 0) parts.push(frame);\n if (d.hint !== undefined) parts.push(` hint: ${d.hint}`);\n return parts.join('\\n');\n });\n const errors = diagnostics.filter((d) => d.level === 'error').length;\n const warns = diagnostics.filter((d) => d.level === 'warn').length;\n blocks.push(`${errors} error(s), ${warns} warning(s) across ${fileCount} file(s)`);\n return blocks.join('\\n\\n') + '\\n';\n}\n","/**\n * A small colored brand banner for the CLI — an avocado half (green rind, amber\n * pit) next to the wordmark. Shown on `avo` / `avo --help` and `avo init`.\n */\n\nimport pc from 'picocolors';\n\nexport function banner(version = '0.0.1'): string {\n const g = pc.green;\n const pit = pc.yellow('●');\n const name = pc.green(pc.bold('avodado'));\n const ver = pc.dim(`v${version}`);\n const tag = pc.dim('Documentation-as-code — Markdown with typed, fenced YAML blocks.');\n return [\n '',\n ` ${g('╭───────╮')}`,\n ` ${g('│ ')}${pit}${g(' ')}${pit}${g(' │')} ${name} ${ver}`,\n ` ${g('│ ')}${pc.yellow('◡')}${g(' │')} ${tag}`,\n ` ${g('╰───────╯')}`,\n '',\n ].join('\\n');\n}\n\n/** The \"what do I actually do\" workflow, shown after top-level help. */\nexport function examples(): string {\n const step = (n: string, cmd: string, note: string): string =>\n ` ${pc.dim(n)} ${pc.cyan(cmd.padEnd(26))}${pc.dim(note)}`;\n return [\n '',\n pc.bold('Workflow:'),\n step('1', 'avo init', 'scaffold docs/, config, and the agent skill'),\n step('2', 'edit docs/*.md', 'prose + typed blocks (grammar in .avodado/skill)'),\n step('3', 'avo check', 'validate — exits non-zero on errors (use in CI)'),\n step('4', 'avo preview docs/x.md', 'render and open it in your browser'),\n '',\n ` ${pc.dim('Per-command help:')} avo ${pc.cyan('<command>')} --help`,\n ` ${pc.dim('Docs:')} https://github.com/jdiejim/avodado`,\n '',\n ].join('\\n');\n}\n","/**\n * TTY-awareness helpers. The CLI renders Ink only when stdout is a TTY and the\n * environment is not CI; otherwise it falls back to plain, log-friendly output\n * so logs stay parseable.\n */\n\n/** True when the process is running interactively (TTY, not CI, not AVO_PLAIN). */\nexport const isInteractive: boolean =\n process.stdout.isTTY === true &&\n process.env['CI'] !== 'true' &&\n process.env['AVO_PLAIN'] !== '1';\n","/**\n * CLI dispatcher. Parses argv via commander, runs the matching command, and\n * decides between Ink rendering, plain output, and JSON output based on\n * {@link isInteractive} and `--json` flags.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport React from 'react';\nimport { render as inkRender, Text } from 'ink';\nimport { loadConfig } from './io/config.js';\nimport { runCheck } from './commands/check.js';\nimport { runRender } from './commands/render.js';\nimport { runExport, type ExportFormat } from './commands/export.js';\nimport { runPreview } from './commands/preview.js';\nimport { runInit } from './commands/init.js';\nimport { runSyncOpenApi } from './commands/sync.js';\nimport { NewApp, templateFor, writeNewDoc, DOC_TEMPLATES, isDocTemplate } from './commands/new.js';\nimport { DiagnosticsTable, formatDiagnosticsPlain } from './ui/DiagnosticsTable.js';\nimport { banner, examples } from './ui/banner.js';\nimport { isInteractive } from './tty.js';\nimport type { BlockType } from '@avodado/core';\nimport { BLOCK_TYPES } from '@avodado/core';\n\n/** Runs the CLI for the given argv (typically `process.argv`). */\nexport async function main(argv: readonly string[]): Promise<number> {\n const program = new Command();\n program\n .name('avo')\n .description('Author, validate, render, and export Avodado documentation.')\n .version('0.0.1')\n // Banner + workflow only on top-level help — not on every subcommand's --help.\n .addHelpText('beforeAll', (ctx) => (ctx.command.name() === 'avo' ? banner() : ''))\n .addHelpText('after', (ctx) => (ctx.command.name() === 'avo' ? examples() : ''))\n .exitOverride();\n\n let exitCode = 0;\n\n program\n .command('init')\n .description('Scaffold a new Avodado project in the current directory')\n .option('--force', 'overwrite existing files')\n .action(async (opts: { force?: boolean }) => {\n const cwd = process.cwd();\n const result = await runInit({ cwd, ...(opts.force ? { force: true } : {}) });\n for (const f of result.created) console.log(pc.green('+ ') + f);\n for (const f of result.skipped) console.log(pc.dim(' skip ') + f + pc.dim(' (exists)'));\n console.log(\n pc.bold(\n `\\nCreated ${result.created.length} file(s), skipped ${result.skipped.length}.\\n` +\n `Next: avo check`,\n ),\n );\n });\n\n program\n .command('new')\n .description('Scaffold a new doc from a block template')\n .option(\n '--type <kind>',\n 'doc template (' + Object.keys(DOC_TEMPLATES).join(', ') + ') or block type (' + BLOCK_TYPES.join(', ') + ')',\n )\n .option('--out <path>', 'output file path')\n .action(async (opts: { type?: string; out?: string }) => {\n const cwd = process.cwd();\n const type = opts.type;\n if (type !== undefined && !BLOCK_TYPES.includes(type as BlockType) && !isDocTemplate(type)) {\n console.error(pc.red(`Unknown type: ${opts.type ?? ''}`));\n exitCode = 2;\n return;\n }\n if (!isInteractive) {\n if (type === undefined || opts.out === undefined) {\n console.error(pc.red('In non-interactive mode, both --type and --out are required.'));\n exitCode = 2;\n return;\n }\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n if (type !== undefined && opts.out !== undefined) {\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n const out = opts.out ?? './docs/new-doc.md';\n const { waitUntilExit } = inkRender(<NewApp cwd={cwd} out={out} />);\n await waitUntilExit();\n });\n\n program\n .command('check [globs...]')\n .description('Validate documents (default: docs/**/*.md)')\n .option('--json', 'emit machine-readable JSON')\n .action(async (globs: string[], opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const result = await runCheck({ patterns, cwd, docsRoot: config.docsDir });\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ diagnostics: result.diagnostics, files: result.files }, null, 2) + '\\n',\n );\n } else if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <DiagnosticsTable\n diagnostics={result.diagnostics}\n fileCount={result.files.length}\n sources={result.sources}\n />,\n );\n await waitUntilExit();\n } else {\n process.stdout.write(\n formatDiagnosticsPlain(result.diagnostics, result.files.length, result.sources),\n );\n }\n exitCode = result.exitCode;\n });\n\n program\n .command('render <input>')\n .description('Render one document to a standalone HTML file')\n .option('-o, --output <path>', 'output file path (defaults to <input>.html)')\n .action(async (input: string, opts: { output?: string }) => {\n const cwd = process.cwd();\n const result = await runRender({\n cwd,\n input,\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n });\n if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <Text>\n <Text color=\"green\">✓ </Text>Wrote <Text bold>{result.output}</Text>{' '}\n <Text dimColor>({result.bytes} bytes)</Text>\n </Text>,\n );\n await waitUntilExit();\n } else {\n console.log(`${pc.green('✓')} rendered ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n }\n });\n\n program\n .command('export [globs...]')\n .description('Batch-export documents to HTML and/or PDF')\n .option('--format <list>', 'comma-separated formats: html,pdf', 'html')\n .option('--out <dir>', 'output directory (defaults to config outDir or dist)')\n .action(async (globs: string[], opts: { format: string; out?: string }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const formats = opts.format\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter((s): s is ExportFormat => s === 'html' || s === 'pdf');\n if (formats.length === 0) {\n console.error(pc.red('No valid --format specified (expected html, pdf, or both).'));\n exitCode = 2;\n return;\n }\n const result = await runExport({\n cwd,\n patterns,\n docsRoot: config.docsDir,\n outDir: opts.out ?? config.outDir,\n formats,\n });\n for (const item of result.items) {\n for (const o of item.outputs) {\n console.log(`${pc.green('✓')} ${o.path} ${pc.dim(`(${o.bytes} bytes)`)}`);\n }\n }\n console.log(pc.bold(`\\n${result.items.length} document(s) exported.`));\n });\n\n program\n .command('preview <input>')\n .description('Render a document to a temp HTML file and open it')\n .action(async (input: string) => {\n const cwd = process.cwd();\n const result = await runPreview({ cwd, input });\n console.log(pc.green('✓ ') + 'Opened ' + result.file);\n });\n\n const syncCmd = program.command('sync').description('Generate Avodado docs from external sources (OpenAPI)');\n syncCmd\n .command('openapi <spec>')\n .description('Generate (or drift-check) a doc from an OpenAPI 3.x spec')\n .option('-o, --out <path>', 'write generated markdown to this path')\n .option('--check <path>', 'compare against an existing doc and fail on drift')\n .option('--slug <slug>', 'block-id namespace (defaults to the output basename)')\n .action(\n async (\n spec: string,\n opts: { out?: string; check?: string; slug?: string },\n ) => {\n const result = await runSyncOpenApi({\n cwd: process.cwd(),\n spec,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.check !== undefined ? { check: opts.check } : {}),\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n });\n if (result.exitCode === 0) {\n console.log(pc.green('✓ ') + result.message);\n } else {\n console.error(pc.red(result.message));\n if (result.diff !== undefined) console.error(result.diff);\n }\n exitCode = result.exitCode;\n },\n );\n\n try {\n await program.parseAsync(argv as string[], { from: 'node' });\n } catch (err) {\n const e = err as Error & { code?: string; exitCode?: number };\n if (e.code === 'commander.helpDisplayed' || e.code === 'commander.version') {\n return 0;\n }\n if (e.code === 'commander.help') return 0;\n if (typeof e.exitCode === 'number' && e.code?.startsWith('commander.')) {\n return e.exitCode;\n }\n console.error(pc.red(e.message ?? String(err)));\n return 1;\n }\n\n return exitCode;\n}\n\n// Re-export the template helper for tests + downstream consumers.\nexport { templateFor };\n","/**\n * `avo` CLI entry point. Tsup adds the `#!/usr/bin/env node` shebang at build\n * time; this file is the JS that runs after.\n */\n\nimport { main } from './app.js';\n\nconst code = await main(process.argv);\nprocess.exit(code);\n"]}
1
+ {"version":3,"sources":["../src/io/config.ts","../src/io/files.ts","../src/commands/check.tsx","../src/io/theme.ts","../src/commands/render.ts","../src/commands/export.ts","../src/commands/preview.ts","../src/commands/init.ts","../src/commands/sync.ts","../src/commands/new.tsx","../src/ui/codeFrame.ts","../src/ui/DiagnosticsTable.tsx","../src/ui/banner.ts","../src/tty.ts","../src/app.tsx","../src/bin.ts"],"names":["yamlParse","resolve","existsSync","readFileSync","readFile","parsePath","parseDocument","mkdir","writeFile","renderDocument","join","dirname","basename","pc","jsx","Box","jsxs","Text","BLOCK_TYPES","inkRender"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * Loads `avodado.config.{ts,json,yml}` from the project root.\n *\n * Defaults are returned if no config is found, so most users never need a\n * config file.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as yamlParse } from 'yaml';\nimport { createJiti } from 'jiti';\n\n/** Loaded configuration. */\nexport interface AvodadoConfig {\n /** Where docs live (relative to project root). Defaults to `docs`. */\n readonly docsDir: string;\n /** Where rendered output goes (relative to project root). Defaults to `dist`. */\n readonly outDir: string;\n}\n\nconst DEFAULTS: AvodadoConfig = { docsDir: 'docs', outDir: 'dist' };\n\nconst CONFIG_FILES = [\n 'avodado.config.ts',\n 'avodado.config.js',\n 'avodado.config.mjs',\n 'avodado.config.json',\n 'avodado.config.yml',\n 'avodado.config.yaml',\n];\n\n/** Loads a config file from `cwd`, returning defaults if none exists. */\nexport async function loadConfig(cwd: string): Promise<AvodadoConfig> {\n for (const name of CONFIG_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n const raw = await readConfig(path);\n return mergeWithDefaults(raw);\n }\n return DEFAULTS;\n}\n\nasync function readConfig(path: string): Promise<unknown> {\n if (path.endsWith('.json')) {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown;\n }\n if (path.endsWith('.yml') || path.endsWith('.yaml')) {\n return yamlParse(readFileSync(path, 'utf8')) as unknown;\n }\n const jiti = createJiti(import.meta.url);\n const mod = (await jiti.import(path)) as { default?: unknown };\n return mod.default ?? mod;\n}\n\nfunction mergeWithDefaults(raw: unknown): AvodadoConfig {\n if (raw === null || typeof raw !== 'object') return DEFAULTS;\n const r = raw as { docsDir?: unknown; outDir?: unknown };\n return {\n docsDir: typeof r.docsDir === 'string' ? r.docsDir : DEFAULTS.docsDir,\n outDir: typeof r.outDir === 'string' ? r.outDir : DEFAULTS.outDir,\n };\n}\n","/**\n * File-system helpers: glob expansion, document reading, slug derivation.\n *\n * Slug rule: a doc's slug is its path relative to the docs root, stripped of\n * `.md` and normalised to forward slashes. Files outside the docs root fall\n * back to their basename without `.md`.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, relative, resolve, sep } from 'node:path';\nimport fg from 'fast-glob';\n\n/** A document file on disk, with derived slug. */\nexport interface DocFile {\n /** Absolute path on disk. */\n readonly absolute: string;\n /** Path relative to cwd (used in diagnostics). */\n readonly file: string;\n /** Slug derived from path under the docs root. */\n readonly slug: string;\n /** Raw markdown source. */\n readonly source: string;\n}\n\n/**\n * Expands one or more glob patterns to a list of {@link DocFile}s with read\n * content and derived slugs.\n *\n * @param patterns - One or more glob patterns (relative to `cwd`).\n * @param cwd - The working directory the patterns resolve from.\n * @param docsRoot - The docs root the slug is derived against.\n */\nexport async function loadDocs(\n patterns: readonly string[],\n cwd: string,\n docsRoot: string,\n): Promise<DocFile[]> {\n const matches = await fg(patterns as string[], {\n cwd,\n absolute: true,\n onlyFiles: true,\n dot: false,\n });\n const docsRootAbs = resolve(cwd, docsRoot);\n const files = await Promise.all(\n matches.map(async (absolute): Promise<DocFile> => {\n const file = relative(cwd, absolute);\n const slug = deriveSlug(absolute, docsRootAbs);\n const source = await readFile(absolute, 'utf8');\n return { absolute, file, slug, source };\n }),\n );\n files.sort((a, b) => a.file.localeCompare(b.file));\n return files;\n}\n\nfunction deriveSlug(absolute: string, docsRootAbs: string): string {\n const rel = relative(docsRootAbs, absolute);\n const inside = !rel.startsWith('..') && !rel.startsWith(sep) && rel.length > 0;\n const path = inside ? rel : basename(absolute);\n return path.replace(/\\\\/g, '/').replace(/\\.md$/i, '');\n}\n","/**\n * `avo check` — validate one or more documents and report diagnostics.\n *\n * Pure {@link runCheck} returns `{ diagnostics, exitCode }`. The UI layer\n * picks how to render: JSON, Ink table (interactive TTY), or plain text (CI).\n */\n\nimport { parseDocument, resolveRefs, validateDocument, type Diagnostic, type Document } from '@avodado/core';\nimport { loadDocs, type DocFile } from '../io/files.js';\n\n/** Inputs to {@link runCheck}. */\nexport interface CheckOptions {\n /** Glob patterns to expand. */\n readonly patterns: readonly string[];\n /** Working directory. */\n readonly cwd: string;\n /** Docs root for slug derivation. */\n readonly docsRoot: string;\n}\n\n/** Result of running `avo check` — diagnostics aggregated across all matched docs. */\nexport interface CheckResult {\n /** All diagnostics in file/line order. */\n readonly diagnostics: readonly Diagnostic[];\n /** Files that were checked. */\n readonly files: readonly string[];\n /** Per-file source lines, for code frames (keyed by the diagnostic `file`). */\n readonly sources: ReadonlyMap<string, readonly string[]>;\n /** Suggested exit code: 0 = clean, 1 = errors present. */\n readonly exitCode: 0 | 1;\n}\n\n/**\n * Validates a set of documents and resolves references across them.\n *\n * @param opts - Options including glob patterns and docs root.\n * @returns Aggregated diagnostics + suggested exit code.\n */\nexport async function runCheck(opts: CheckOptions): Promise<CheckResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const parsed: { doc: Document; file: string }[] = docs.map((d) => ({\n doc: parseDocument(d.source, d.slug),\n file: d.file,\n }));\n\n const diagnostics: Diagnostic[] = [];\n\n for (const { doc, file } of parsed) {\n diagnostics.push(...validateDocument(doc, file));\n }\n\n const resolved = resolveRefs(parsed);\n diagnostics.push(...resolved.diagnostics);\n\n diagnostics.sort((a, b) => {\n const f = a.file.localeCompare(b.file);\n if (f !== 0) return f;\n return (a.line ?? 0) - (b.line ?? 0);\n });\n\n const exitCode = diagnostics.some((d) => d.level === 'error') ? 1 : 0;\n\n const sources = new Map<string, readonly string[]>();\n for (const d of docs) sources.set(d.file, d.source.split(/\\r\\n|\\r|\\n/));\n\n return {\n diagnostics,\n files: docs.map((d: DocFile) => d.file),\n sources,\n exitCode,\n };\n}\n","/**\n * Loads a project theme file (`avodado.theme.json`) and maps its friendly\n * color/font names to the CSS variables the renderer reads.\n *\n * The whole point: a user edits one small JSON file with human names\n * (`primary`, `accent`, `ink`…) and re-runs `avo render` — no rebuild, no\n * CSS knowledge. Anything omitted falls back to the built-in theme.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/** Friendly theme-file shape. Every field is optional. */\nexport interface ThemeFile {\n /** Optional name, for your own reference. */\n readonly name?: string;\n /** Base built-in theme to start from: minimal | teal | plum | slate | dark | soft. */\n readonly theme?: string;\n /** Friendly color name → hex/CSS color. */\n readonly colors?: Readonly<Record<string, string>>;\n /** Friendly font slot → CSS font-family stack. */\n readonly fonts?: Readonly<Record<string, string>>;\n}\n\n/** Resolved theme: a base theme name and/or custom variable overrides. */\nexport interface LoadedTheme {\n readonly theme?: string;\n readonly themeVars?: Readonly<Record<string, string>>;\n}\n\nconst BASE_THEMES = new Set(['minimal', 'teal', 'plum', 'slate', 'dark', 'soft']);\n\n/** Friendly color name → internal CSS variable. */\nconst COLOR_TO_VAR: Readonly<Record<string, string>> = {\n primary: '--navy', // headings, primary nodes, links, section numbers\n secondary: '--blue', // secondary accents, CDN/consumer nodes\n accent: '--highlight', // highlight pills, FK keys, \"current\" markers\n positive: '--positive', // success / service nodes / done\n negative: '--negative', // errors / forbidden edges / danger\n purple: '--purple', // data / context / provider nodes\n teal: '--teal', // queues / topics / caches\n ink: '--charcoal', // body text\n muted: '--gray', // captions, dim text, external nodes\n rule: '--rule', // hairlines, borders, dividers\n paper: '--white', // surfaces / card fills\n};\n\n/** Friendly font slot → internal CSS variable. */\nconst FONT_TO_VAR: Readonly<Record<string, string>> = {\n display: '--font-display', // titles / headings\n body: '--font-body', // paragraphs / labels\n mono: '--font-mono', // code / technical labels\n};\n\nconst THEME_FILES = ['avodado.theme.json', 'avodado.theme.jsonc'];\n\n/**\n * Reads the project theme file (if any) and returns CSS-variable overrides\n * ready to pass to `renderDocument({ themeVars })`. Returns `undefined` when\n * there is no theme file, so the default theme is used unchanged.\n *\n * Unknown color/font names are ignored (a warning is the caller's choice) so a\n * typo never crashes a render.\n */\nexport function loadTheme(cwd: string): LoadedTheme {\n for (const name of THEME_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n let raw: unknown;\n try {\n raw = JSON.parse(stripComments(readFileSync(path, 'utf8'))) as unknown;\n } catch {\n return {}; // malformed file → fall back to default theme\n }\n const file = raw !== null && typeof raw === 'object' ? (raw as ThemeFile) : {};\n const out: { theme?: string; themeVars?: Readonly<Record<string, string>> } = {};\n if (typeof file.theme === 'string' && BASE_THEMES.has(file.theme)) out.theme = file.theme;\n const vars = toVars(raw);\n if (vars !== undefined) out.themeVars = vars;\n return out;\n }\n return {};\n}\n\n/** Converts a parsed theme file into CSS-variable overrides. */\nfunction toVars(raw: unknown): Readonly<Record<string, string>> | undefined {\n if (raw === null || typeof raw !== 'object') return undefined;\n const file = raw as ThemeFile;\n const vars: Record<string, string> = {};\n if (file.colors !== undefined) {\n for (const key of Object.keys(file.colors)) {\n const cssVar = COLOR_TO_VAR[key.toLowerCase()];\n const value = file.colors[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n if (file.fonts !== undefined) {\n for (const key of Object.keys(file.fonts)) {\n const cssVar = FONT_TO_VAR[key.toLowerCase()];\n const value = file.fonts[key];\n if (cssVar !== undefined && typeof value === 'string') vars[cssVar] = value;\n }\n }\n return Object.keys(vars).length > 0 ? vars : undefined;\n}\n\n/** Strips `//` line comments so `.jsonc`-style files parse. */\nfunction stripComments(src: string): string {\n return src.replace(/^\\s*\\/\\/.*$/gm, '');\n}\n","/**\n * `avo render` — render one document to a standalone HTML file.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, parse as parsePath, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument, type ThemeName } from '@avodado/render';\nimport { loadTheme } from '../io/theme.js';\n\nexport interface RenderOptions {\n /** Input doc path. */\n readonly input: string;\n /** Output path. Defaults to `<input>.html` next to the input. */\n readonly output?: string;\n /** Working directory. */\n readonly cwd: string;\n}\n\n/** Result of a render. */\nexport interface RenderResult {\n readonly input: string;\n readonly output: string;\n readonly bytes: number;\n}\n\n/**\n * Reads `opts.input`, parses + renders it, and writes the resulting HTML.\n *\n * @returns The output path and byte size written.\n */\nexport async function runRender(opts: RenderOptions): Promise<RenderResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const { theme, themeVars } = loadTheme(opts.cwd);\n const html = renderDocument(doc, {\n ...(theme !== undefined ? { theme: theme as ThemeName } : {}),\n ...(themeVars !== undefined ? { themeVars } : {}),\n });\n\n const outputAbs = opts.output !== undefined ? resolve(opts.cwd, opts.output) : inputAbs.replace(/\\.md$/i, '.html');\n await mkdir(dirname(outputAbs), { recursive: true });\n await writeFile(outputAbs, html, 'utf8');\n return { input: opts.input, output: outputAbs, bytes: html.length };\n}\n","/**\n * `avo export` — batch-export one or more documents to HTML and/or PDF.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parseDocument } from '@avodado/core';\nimport { toHtml, toPdf } from '@avodado/export';\nimport { loadDocs } from '../io/files.js';\n\nexport type ExportFormat = 'html' | 'pdf';\n\nexport interface ExportOptions {\n readonly patterns: readonly string[];\n readonly cwd: string;\n readonly docsRoot: string;\n readonly outDir: string;\n readonly formats: readonly ExportFormat[];\n}\n\nexport interface ExportItem {\n readonly file: string;\n readonly outputs: readonly { format: ExportFormat; path: string; bytes: number }[];\n}\n\nexport interface ExportResult {\n readonly items: readonly ExportItem[];\n}\n\n/**\n * Reads, parses, and renders each matched document into one or more output\n * formats under `outDir`. Filenames mirror the doc's slug.\n */\nexport async function runExport(opts: ExportOptions): Promise<ExportResult> {\n const docs = await loadDocs(opts.patterns, opts.cwd, opts.docsRoot);\n const outRoot = resolve(opts.cwd, opts.outDir);\n await mkdir(outRoot, { recursive: true });\n\n const items: ExportItem[] = [];\n for (const d of docs) {\n const doc = parseDocument(d.source, d.slug);\n const outputs: { format: ExportFormat; path: string; bytes: number }[] = [];\n for (const fmt of opts.formats) {\n const outPath = join(outRoot, `${d.slug}.${fmt}`);\n await mkdir(resolve(outPath, '..'), { recursive: true });\n if (fmt === 'html') {\n const html = toHtml(doc);\n await writeFile(outPath, html, 'utf8');\n outputs.push({ format: fmt, path: outPath, bytes: html.length });\n } else {\n const pdf = await toPdf(doc);\n await writeFile(outPath, pdf);\n outputs.push({ format: fmt, path: outPath, bytes: pdf.byteLength });\n }\n }\n items.push({ file: d.file, outputs });\n }\n return { items };\n}\n","/**\n * `avo preview` — render a single doc to a temp HTML file and open it in the\n * default browser.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { join, parse as parsePath, resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument } from '@avodado/core';\nimport { renderDocument } from '@avodado/render';\n\nexport interface PreviewOptions {\n readonly input: string;\n readonly cwd: string;\n}\n\nexport interface PreviewResult {\n readonly file: string;\n}\n\n/**\n * Renders the doc to a temp file (named by a hash of the source path so\n * repeated previews reuse the same file) and opens it in the OS browser.\n */\nexport async function runPreview(opts: PreviewOptions): Promise<PreviewResult> {\n const inputAbs = resolve(opts.cwd, opts.input);\n const source = await readFile(inputAbs, 'utf8');\n const slug = parsePath(inputAbs).name;\n const doc = parseDocument(source, slug);\n const html = renderDocument(doc);\n\n const hash = createHash('sha1').update(inputAbs).digest('hex').slice(0, 8);\n const dir = join(tmpdir(), 'avodado-preview');\n await mkdir(dir, { recursive: true });\n const out = join(dir, `${slug}-${hash}.html`);\n await writeFile(out, html, 'utf8');\n await open(out);\n return { file: out };\n}\n","/**\n * `avo init` — scaffold a new Avodado project in the current directory.\n *\n * Copies the template tree (docs sample, config, the authoring skill, and\n * editor adapters for Claude Code + Cursor) into `cwd`.\n */\n\nimport { cp, mkdir } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface InitOptions {\n readonly cwd: string;\n /** Overwrite files that already exist. Default: false (skip with a notice). */\n readonly force?: boolean;\n}\n\nexport interface InitResult {\n readonly created: readonly string[];\n readonly skipped: readonly string[];\n}\n\n/**\n * Resolves the templates directory packaged with the CLI.\n *\n * Walks up from this module's location looking for a `templates` sibling.\n * Works for both `dist/bin.js` (one level up) and source layout\n * (`src/commands/init.ts`, two levels up).\n */\nfunction templatesDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'templates');\n if (existsSync(candidate) && statSync(candidate).isDirectory()) return candidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(`Could not locate avodado/cli templates directory near ${import.meta.url}`);\n}\n\nconst FILES: readonly string[] = [\n 'avodado.config.json',\n 'docs/getting-started.md',\n 'CLAUDE.md',\n '.cursor/rules/avodado.mdc',\n '.avodado/skill/SKILL.md',\n];\n\n/**\n * Copies the template tree into `cwd`. Files that already exist are skipped\n * unless `force: true`. Returns the lists of created and skipped relative\n * paths so the caller can report them.\n */\nexport async function runInit(opts: InitOptions): Promise<InitResult> {\n const srcRoot = templatesDir();\n const created: string[] = [];\n const skipped: string[] = [];\n\n for (const rel of FILES) {\n const src = resolve(srcRoot, rel);\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n continue;\n }\n await mkdir(dirname(dst), { recursive: true });\n await cp(src, dst);\n created.push(rel);\n }\n\n return { created, skipped };\n}\n","/**\n * `avo sync openapi` — generate an Avodado doc from an OpenAPI spec, or\n * verify that an existing doc matches what the spec would generate (CI drift).\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, resolve, extname } from 'node:path';\nimport { openapiToMarkdown, parseOpenApi } from '@avodado/sync';\n\n/** Inputs for {@link runSyncOpenApi}. */\nexport interface SyncOpenApiOptions {\n readonly cwd: string;\n /** Path to the OpenAPI spec (relative or absolute). */\n readonly spec: string;\n /** Output path (write mode). Mutually exclusive with `check`. */\n readonly out?: string;\n /** Path to compare generated output against (drift mode). */\n readonly check?: string;\n /** Slug used to namespace generated block ids. Defaults to the output basename. */\n readonly slug?: string;\n}\n\n/** Result of `avo sync openapi`. */\nexport interface SyncOpenApiResult {\n readonly exitCode: 0 | 1 | 2;\n /** A short, plain-text summary suitable for logging. */\n readonly message: string;\n /** When `check` mode finds drift: the line-level diff. */\n readonly diff?: string;\n}\n\nfunction slugFromPath(path: string): string {\n const base = basename(path, extname(path));\n return base.length > 0 ? base : 'api';\n}\n\n/**\n * Generates an Avodado doc from an OpenAPI spec — either writing it to disk,\n * or comparing the in-memory result against an existing doc on disk and\n * reporting drift.\n */\nexport async function runSyncOpenApi(opts: SyncOpenApiOptions): Promise<SyncOpenApiResult> {\n if (opts.out === undefined && opts.check === undefined) {\n return { exitCode: 2, message: 'avo sync openapi: must specify --out <path> or --check <path>' };\n }\n if (opts.out !== undefined && opts.check !== undefined) {\n return { exitCode: 2, message: 'avo sync openapi: --out and --check are mutually exclusive' };\n }\n\n const specAbs = resolve(opts.cwd, opts.spec);\n if (!existsSync(specAbs)) {\n return { exitCode: 2, message: `Spec not found: ${specAbs}` };\n }\n\n const source = await readFile(specAbs, 'utf8');\n let spec;\n try {\n spec = parseOpenApi(source);\n } catch (err) {\n return { exitCode: 1, message: `Failed to parse spec: ${(err as Error).message}` };\n }\n\n const targetPath = opts.out ?? opts.check;\n if (targetPath === undefined) {\n return { exitCode: 2, message: 'no target path' };\n }\n const slug = opts.slug ?? slugFromPath(targetPath);\n const generated = openapiToMarkdown(spec, { slug });\n\n if (opts.out !== undefined) {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, generated, 'utf8');\n return {\n exitCode: 0,\n message: `Wrote ${outAbs} (${generated.length} bytes)`,\n };\n }\n\n // Check mode — compare against existing file.\n const checkAbs = resolve(opts.cwd, opts.check ?? '');\n if (!existsSync(checkAbs)) {\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} does not exist. Run with --out ${opts.check} to generate it.`,\n };\n }\n const existing = await readFile(checkAbs, 'utf8');\n if (existing === generated) {\n return {\n exitCode: 0,\n message: `OK: ${checkAbs} matches ${specAbs} (${generated.length} bytes)`,\n };\n }\n return {\n exitCode: 1,\n message: `Drift: ${checkAbs} differs from what ${specAbs} would generate.`,\n diff: simpleDiff(existing, generated),\n };\n}\n\n/** Tiny line-level diff for the drift report. Not a full diff library; good enough for CI. */\nfunction simpleDiff(a: string, b: string): string {\n const aLines = a.split('\\n');\n const bLines = b.split('\\n');\n const out: string[] = [];\n const max = Math.max(aLines.length, bLines.length);\n for (let i = 0; i < max; i++) {\n const av = aLines[i];\n const bv = bLines[i];\n if (av === bv) continue;\n if (av !== undefined) out.push(`- ${av}`);\n if (bv !== undefined) out.push(`+ ${bv}`);\n if (out.length >= 40) {\n out.push(`… (truncated; ${max - i - 1} more lines)`);\n break;\n }\n }\n return out.join('\\n');\n}\n","/**\n * `avo new` — scaffold a new doc from a block-type template.\n *\n * Interactive (Ink) when run in a TTY; non-interactive with `--type <kind>\n * --out <path>` for CI usage.\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport React, { useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { BLOCK_TYPES, type BlockType } from '@avodado/core';\n\nexport interface NewOptions {\n readonly cwd: string;\n readonly type?: BlockType;\n readonly out?: string;\n}\n\nconst TEMPLATES: Record<BlockType, string> = {\n meta: '```meta\\ntitle: New document\\nsubtitle: One-line description.\\ntag: DRAFT\\n```\\n',\n callout:\n '```callout\\ntone: note\\ntitle: Heads up\\nbody: A short note that the reader should not miss.\\n```\\n',\n table: '```table\\ncolumns: [Field, Description]\\nrows:\\n - [name, Display name]\\n - [id, Stable identifier]\\n```\\n',\n sequence:\n '```sequence\\nid: seq-example\\nactors:\\n - { id: Client, name: Client }\\n - { id: Server, name: Server }\\nmessages:\\n - { from: Client, to: Server, label: request, kind: sync }\\n - { from: Server, to: Client, label: response, kind: response }\\n```\\n',\n erd:\n '```erd\\nid: erd-example\\nentities:\\n - name: orders\\n columns:\\n - { name: id, type: uuid, pk: true }\\n - { name: user_id, type: uuid, fk: true }\\nrelations: []\\n```\\n',\n userstory:\n '```userstory\\nid: US-001\\nrole: user\\nwant: do the thing\\nsoThat: I get the outcome\\ncriteria:\\n - { given: a precondition, when: I act, then: the outcome }\\n```\\n',\n timeline:\n '```timeline\\nitems:\\n - label: Phase 1\\n date: now\\n status: current\\n desc: What is happening now\\n - label: Phase 2\\n date: next\\n status: next\\n desc: What is next\\n```\\n',\n kanban:\n '```kanban\\ncolumns:\\n - label: Now\\n cards:\\n - { title: Current task }\\n - label: Next\\n cards:\\n - { title: Upcoming task }\\n - label: Later\\n cards:\\n - { title: Eventually }\\n```\\n',\n tracker:\n '```tracker\\nitems:\\n - { task: First task, status: doing, priority: high }\\n - { task: Second task, status: todo, priority: med }\\n```\\n',\n prose:\n '```prose\\ntitle: Overview\\nblocks:\\n - { type: h, text: Background }\\n - { type: p, text: A paragraph explaining the context. }\\n - { type: ul, items: [Idea one, Idea two, Idea three] }\\n```\\n',\n glossary:\n '```glossary\\nterms:\\n - { term: Idempotency, def: Doing a thing twice has the same effect as doing it once. }\\n - { term: SLO, def: Service-level objective the team commits to. }\\n```\\n',\n proscons:\n '```proscons\\ntitle: Synchronous vs async\\nprosLabel: Synchronous\\nconsLabel: Asynchronous\\npros:\\n - Easy to reason about\\n - One transaction\\ncons:\\n - Latency-bound\\n - Single point of failure\\n```\\n',\n cvt:\n '```cvt\\ntitle: Migration plan\\ncurrent:\\n label: Today\\n items: [Single monolith, Shared database, Manual deploys]\\ntarget:\\n label: Target\\n items: [Modular services, Per-service stores, Automated deploys]\\nnote: Migrate one service per quarter.\\n```\\n',\n stats:\n '```stats\\ntitle: This quarter\\nstats:\\n - { value: 12.4k, label: Active users, delta: \"+18%\", trend: up }\\n - { value: 99.95%, label: Uptime, delta: \"0\", trend: flat }\\n - { value: 142ms, label: p95 latency, delta: \"-22ms\", trend: up }\\n```\\n',\n code:\n '```code\\ntitle: Reference\\nblocks:\\n - title: index.ts\\n lang: TypeScript\\n code: |\\n export function add(a: number, b: number): number {\\n return a + b;\\n }\\n```\\n',\n agenda:\n '```agenda\\nitems:\\n - { time: \"09:00\", duration: 30m, title: Intros, owner: Host }\\n - { time: \"09:30\", duration: 45m, title: Status updates, desc: Each team for 5 min }\\n - { time: \"10:15\", duration: 15m, title: Wrap-up }\\n```\\n',\n tree:\n '```tree\\nnodes:\\n - { id: src, label: src }\\n - { id: components, parent: src, label: components }\\n - { id: hooks, parent: src, label: hooks }\\n - { id: index, parent: src, label: index.ts, note: entry point }\\n```\\n',\n pyramid:\n '```pyramid\\nlevels:\\n - { label: Vision, desc: Long-term direction }\\n - { label: Strategy, desc: How we get there }\\n - { label: Tactics, desc: This quarter }\\n - { label: Tasks, desc: This week }\\n```\\n',\n funnel:\n '```funnel\\nstages:\\n - { label: Visited, value: 10000 }\\n - { label: Signed up, value: 2400 }\\n - { label: Activated, value: 1100 }\\n - { label: Paying, value: 320 }\\n```\\n',\n flow:\n '```flow\\ntitle: Decision flow\\nnodes:\\n - { id: start, col: 1, row: 1, kind: start, label: Start }\\n - { id: check, col: 2, row: 1, kind: decision, label: Is valid? }\\n - { id: yes, col: 3, row: 1, kind: process, label: Process }\\n - { id: no, col: 2, row: 2, kind: end, label: Reject }\\n - { id: done, col: 3, row: 2, kind: end, label: Done }\\nedges:\\n - { from: start, to: check }\\n - { from: check, to: yes, label: \"yes\" }\\n - { from: check, to: no, label: \"no\", kind: error }\\n - { from: yes, to: done }\\n```\\n',\n state:\n '```state\\ntitle: Order lifecycle\\nstates:\\n - { id: s0, col: 1, row: 1, kind: start }\\n - { id: pending, col: 2, row: 1, kind: wait, name: PENDING }\\n - { id: confirmed, col: 3, row: 1, kind: active, name: CONFIRMED }\\n - { id: end, col: 4, row: 1, kind: terminal }\\ntransitions:\\n - { from: s0, to: pending, event: create }\\n - { from: pending, to: confirmed, event: pay }\\n - { from: confirmed, to: end, event: ship }\\n```\\n',\n dfd:\n '```dfd\\ntitle: Data flow\\nnodes:\\n - { id: ext, col: 1, row: 1, kind: external, name: Client }\\n - { id: proc, col: 2, row: 1, kind: process, name: Process, num: 1 }\\n - { id: store, col: 3, row: 1, kind: store, name: Orders }\\nedges:\\n - { from: ext, to: proc, label: request }\\n - { from: proc, to: store, label: write }\\n```\\n',\n journey:\n '```journey\\ntitle: Onboarding journey\\nstages:\\n - { label: Discover }\\n - { label: Sign up }\\n - { label: Activate }\\n - { label: Pay }\\nrows:\\n - { label: Touchpoint, cells: [Landing, Form, Email, Checkout] }\\n - { label: Friction, cells: [Low, Med, Low, Med] }\\nemotion: [0.7, 0.4, 0.6, 0.8]\\n```\\n',\n gantt:\n '```gantt\\ntitle: Roadmap\\nperiods: [Q1, Q2, Q3, Q4]\\ntasks:\\n - { label: Discovery, start: 0, span: 1, kind: done }\\n - { label: Build, start: 1, span: 2, kind: active }\\n - { label: Ship, start: 3, span: 1 }\\n - { label: GA, start: 3, span: 1, kind: milestone }\\n```\\n',\n graph:\n '```graph\\ntitle: Dependency graph\\nnodes:\\n - { id: a, col: 1, row: 1, label: Module A, group: 0 }\\n - { id: b, col: 2, row: 1, label: Module B, group: 1 }\\n - { id: c, col: 3, row: 1, label: Module C, group: 2 }\\n - { id: d, col: 2, row: 2, label: Shared, group: 3 }\\nedges:\\n - { from: a, to: b }\\n - { from: b, to: c }\\n - { from: a, to: d }\\n - { from: b, to: d, dir: undirected }\\n```\\n',\n quadrant:\n '```quadrant\\ntitle: Effort vs impact\\nxAxis: { label: Effort, low: Low, high: High }\\nyAxis: { label: Impact, low: Low, high: High }\\nitems:\\n - { x: 0.2, y: 0.8, label: Quick win }\\n - { x: 0.8, y: 0.8, label: Big bet }\\n - { x: 0.2, y: 0.2, label: Fill-in }\\n - { x: 0.8, y: 0.2, label: Thankless }\\n```\\n',\n swimlane:\n '```swimlane\\ntitle: Cross-functional flow\\nlanes:\\n - { label: Customer }\\n - { label: Sales }\\n - { label: Ops }\\nsteps:\\n - { id: req, col: 1, lane: 0, kind: start, label: Submit request }\\n - { id: qual, col: 2, lane: 1, kind: decision, label: Qualify }\\n - { id: fulfill, col: 3, lane: 2, label: Fulfill }\\n - { id: done, col: 4, lane: 0, kind: end, label: Receive }\\nlinks:\\n - { from: req, to: qual }\\n - { from: qual, to: fulfill }\\n - { from: fulfill, to: done }\\n```\\n',\n c4:\n '```c4\\ntitle: System context\\nlevel: context\\nnodes:\\n - { id: user, col: 1, row: 1, kind: person, name: Shopper, desc: A customer placing an order. }\\n - { id: app, col: 2, row: 1, kind: system, name: ShopCo, desc: The retail platform. }\\n - { id: pay, col: 3, row: 1, kind: external, name: Payment GW, desc: Stripe authorisation. }\\nedges:\\n - { from: user, to: app, label: places order }\\n - { from: app, to: pay, label: authorises }\\n```\\n',\n uml:\n '```uml\\ntitle: Class model\\nclasses:\\n - { id: order, col: 1, row: 1, name: Order, attrs: [\"id: UUID\", \"status: Status\", \"total: Money\"], methods: [\"place()\", \"cancel()\"] }\\n - { id: item, col: 2, row: 1, name: OrderItem, attrs: [\"id: UUID\", \"sku: String\", \"qty: int\"] }\\n - { id: status, col: 1, row: 2, name: Status, stereotype: enumeration, attrs: [\"PENDING\", \"CONFIRMED\", \"CANCELLED\"] }\\nrels:\\n - { from: order, to: item, kind: composition }\\n - { from: order, to: status, kind: association, label: has }\\n```\\n',\n mece:\n '```mece\\ntitle: Why are conversions down?\\nnodes:\\n - { id: root, label: Lower conversion }\\n - { id: traffic, parent: root, label: Traffic }\\n - { id: friction, parent: root, label: Friction }\\n - { id: t1, parent: traffic, label: Lower quality, note: paid ads }\\n - { id: t2, parent: traffic, label: Wrong audience }\\n - { id: f1, parent: friction, label: Slow checkout }\\n - { id: f2, parent: friction, label: Mobile bugs }\\n```\\n',\n frontend:\n '```frontend\\ntitle: React component tree\\nnodes:\\n - { id: app, kind: root, name: App }\\n - { id: layout, parent: app, kind: layout, name: Layout }\\n - { id: home, parent: layout, kind: page, name: Home }\\n - { id: orders, parent: layout, kind: page, name: Orders }\\n - { id: card, parent: orders, kind: component, name: OrderCard }\\n - { id: useOrder, parent: orders, kind: hook, name: useOrder }\\n - { id: store, parent: app, kind: store, name: cart, note: Zustand }\\n```\\n',\n cluster:\n '```cluster\\ntitle: Production cluster\\nclusters:\\n - { id: api, label: api namespace, kind: namespace }\\n - { id: data, label: data namespace, kind: namespace }\\nservices:\\n - { id: web, cluster: api, label: web, kind: service, tech: Next.js, replicas: 3 }\\n - { id: orders, cluster: api, label: orders, kind: service, tech: Go, replicas: 4 }\\n - { id: pg, cluster: data, label: postgres, kind: store, tech: Postgres 16, replicas: 1 }\\n - { id: redis, cluster: data, label: redis, kind: cache, tech: Redis 7, replicas: 2 }\\nedges:\\n - { from: web, to: orders }\\n - { from: orders, to: pg }\\n - { from: orders, to: redis }\\n```\\n',\n block:\n '```block\\ntitle: System architecture\\ngroups:\\n - { col: 1, row: 1, cols: 1, rows: 2, label: Edge, color: \"#0e54a1\" }\\n - { col: 2, row: 1, cols: 2, rows: 2, label: Services, color: \"#1f9747\" }\\nnodes:\\n - { id: cdn, col: 1, row: 1, kind: cdn, name: CDN, tech: Cloudflare }\\n - { id: gw, col: 1, row: 2, kind: gateway, name: Gateway, tech: Envoy }\\n - { id: api, col: 2, row: 1, kind: service, name: API, tech: Go }\\n - { id: worker, col: 3, row: 1, kind: service, name: Worker, tech: Go }\\n - { id: pg, col: 2, row: 2, kind: store, name: Postgres, tech: \"16\" }\\n - { id: q, col: 3, row: 2, kind: queue, name: Events, tech: NATS }\\nedges:\\n - { from: cdn, to: gw }\\n - { from: gw, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: q }\\n - { from: q, to: worker, kind: dashed }\\n```\\n',\n infra:\n '```infra\\ntitle: AWS topology\\nsystemLabel: ShopCo · us-east-1\\nlayers:\\n - { label: Edge }\\n - { label: Compute }\\n - { label: Data }\\nnodes:\\n - { id: cf, layer: 0, kind: cdn, name: CloudFront, tech: CDN }\\n - { id: alb, layer: 0, kind: gateway, name: ALB, tech: Application LB }\\n - { id: api, layer: 1, kind: service, name: API, tech: ECS Fargate }\\n - { id: worker, layer: 1, kind: service, name: Worker, tech: ECS Fargate }\\n - { id: pg, layer: 2, kind: store, name: orders-db, tech: RDS Postgres }\\n - { id: cache, layer: 2, kind: cache, name: cache, tech: ElastiCache }\\nedges:\\n - { from: cf, to: alb }\\n - { from: alb, to: api }\\n - { from: api, to: pg }\\n - { from: api, to: cache }\\n - { from: api, to: worker, kind: dashed }\\n```\\n',\n event:\n '```event\\ntitle: Pub/sub choreography\\nnodes:\\n - { id: orders, col: 1, row: 1, kind: producer, name: orders }\\n - { id: bus, col: 2, row: 1, kind: topic, name: order.events }\\n - { id: ship, col: 3, row: 1, kind: consumer, name: shipping }\\n - { id: bill, col: 3, row: 2, kind: consumer, name: billing }\\nedges:\\n - { from: orders, to: bus }\\n - { from: bus, to: ship }\\n - { from: bus, to: bill }\\n```\\n',\n ddd:\n '```ddd\\ntitle: Bounded contexts\\nnodes:\\n - { id: cat, col: 1, row: 1, kind: context, name: Catalog }\\n - { id: order, col: 2, row: 1, kind: context, name: Orders }\\n - { id: pay, col: 3, row: 1, kind: context, name: Payments }\\n - { id: ship, col: 2, row: 2, kind: context, name: Shipping }\\nedges:\\n - { from: order, to: cat, label: reads, kind: dashed }\\n - { from: order, to: pay }\\n - { from: order, to: ship }\\n```\\n',\n network:\n '```network\\ntitle: Security zones\\nnodes:\\n - { id: edge, col: 1, row: 1, kind: gateway, name: Edge / WAF }\\n - { id: fw, col: 2, row: 1, kind: firewall, name: Perimeter FW }\\n - { id: api, col: 3, row: 1, kind: service, name: API }\\n - { id: db, col: 3, row: 2, kind: store, name: DB (private) }\\nedges:\\n - { from: edge, to: fw }\\n - { from: fw, to: api }\\n - { from: api, to: db }\\n```\\n',\n felogic:\n '```felogic\\ntitle: Frontend modules\\nnodes:\\n - { id: hook, col: 1, row: 1, kind: hook, name: useOrders }\\n - { id: svc, col: 2, row: 1, kind: service, name: ordersService }\\n - { id: iface, col: 3, row: 1, kind: interface, name: OrdersClient }\\n - { id: impl, col: 4, row: 1, kind: strategy, name: HttpOrdersClient }\\n - { id: api, col: 5, row: 1, kind: external, name: Orders API }\\nedges:\\n - { from: hook, to: svc }\\n - { from: svc, to: iface, kind: uses }\\n - { from: impl, to: iface, kind: implements }\\n - { from: impl, to: api, kind: egress, label: HTTPS }\\n```\\n',\n belogic:\n '```belogic\\ntitle: Backend modules\\nnodes:\\n - { id: ctrl, col: 1, row: 1, kind: controller, name: OrdersController }\\n - { id: svc, col: 2, row: 1, kind: service, name: PlaceOrder }\\n - { id: repo, col: 3, row: 1, kind: repository, name: OrdersRepo }\\n - { id: db, col: 4, row: 1, kind: db, name: postgres }\\n - { id: pay, col: 3, row: 2, kind: external, name: Stripe }\\nedges:\\n - { from: ctrl, to: svc }\\n - { from: svc, to: repo }\\n - { from: repo, to: db, kind: reads }\\n - { from: svc, to: pay, kind: egress, label: authorise }\\n```\\n',\n dag:\n '```dag\\ntitle: Build pipeline\\nnodes:\\n - { id: src, col: 1, row: 1, kind: start, label: Source }\\n - { id: lint, col: 2, row: 1, kind: process, label: Lint }\\n - { id: test, col: 3, row: 1, kind: process, label: Test }\\n - { id: build, col: 4, row: 1, kind: process, label: Build }\\n - { id: deploy, col: 5, row: 1, kind: end, label: Deploy }\\nedges:\\n - { from: src, to: lint }\\n - { from: lint, to: test }\\n - { from: test, to: build }\\n - { from: build, to: deploy }\\n```\\n',\n wireframe:\n '```wireframe\\ntitle: What the user sees\\nscreens:\\n - device: browser\\n title: Dashboard\\n url: app.example.com\\n label: Desktop\\n elements:\\n - { type: nav, label: \"Home, Inbox, Settings\" }\\n - { type: header, label: Notifications }\\n - { type: list, rows: 4 }\\n - { type: button, label: Mark all as read }\\n - device: phone\\n title: \"9:41\"\\n label: iPhone\\n elements:\\n - { type: header, label: Alerts }\\n - { type: card, rows: 3 }\\n - { type: tabs, label: \"Home, Search, Bell, You\" }\\n```\\n',\n};\n\n/** Returns the template string for a block type. */\nexport function templateFor(type: BlockType): string {\n return `\\`\\`\\`meta\\ntitle: New document\\ntag: DRAFT\\n\\`\\`\\`\\n\\n## ${type}\\n\\n${TEMPLATES[type]}`;\n}\n\n/**\n * Multi-block *document* templates (as opposed to single-block scaffolds).\n * Each is a complete, `avo check`-clean starting doc for a common doc kind.\n */\nconst ADR_TEMPLATE = [\n '```meta',\n 'title: ADR-NNN — decision title',\n 'subtitle: One line on what we decided and why it matters.',\n 'tag: ADR · Proposed · YYYY-MM-DD',\n '```',\n '',\n '## Status',\n '',\n '**Proposed** — YYYY-MM-DD. (Proposed → Accepted → Superseded.)',\n '',\n '## Context',\n '',\n 'What forces a decision here? The constraints, requirements, and the problem',\n 'being solved. Two to four sentences of plain prose — no block needed.',\n '',\n '```callout',\n 'tone: note',\n 'title: Decision',\n 'body: \"State the decision in one or two sentences — what we will do, and the single most important reason why.\"',\n '```',\n '',\n '## Options considered',\n '',\n '```proscons',\n 'id: the-choice',\n 'title: Chosen option vs the alternative',\n 'prosLabel: Chosen option',\n 'consLabel: The alternative',\n 'pros:',\n ' - A concrete reason the chosen option wins',\n ' - Another benefit worth the trade-off',\n 'cons:',\n ' - A real cost of the alternative',\n ' - Another drawback we are accepting against',\n '```',\n '',\n '## Architecture',\n '',\n '```block',\n 'id: architecture',\n 'title: How it fits together',\n 'nodes:',\n ' - { id: client, col: 1, row: 1, kind: client, name: Client }',\n ' - { id: svc, col: 2, row: 1, kind: service, name: Service, tech: your stack }',\n ' - { id: db, col: 3, row: 1, kind: store, name: Database }',\n 'edges:',\n ' - { from: client, to: svc }',\n ' - { from: svc, to: db }',\n '```',\n '',\n '## Consequences',\n '',\n '```tracker',\n 'id: consequences',\n 'title: Consequences & follow-ups',\n 'items:',\n ' - { task: \"Something that becomes easier or newly required\", status: todo, priority: high }',\n ' - { task: \"A migration or new responsibility this creates\", status: todo, priority: med }',\n ' - { task: \"A risk to watch as we roll this out\", status: todo, priority: low }',\n '```',\n '',\n].join('\\n');\n\n/** Full-document templates, keyed by name (`avo new --type adr`). */\nexport const DOC_TEMPLATES: Record<string, string> = {\n adr: ADR_TEMPLATE,\n};\n\n/** True when `name` is a full-document template rather than a block type. */\nexport function isDocTemplate(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(DOC_TEMPLATES, name);\n}\n\n/**\n * Writes a new doc to `out` from the chosen block type. Returns the absolute\n * path written. Non-interactive: requires `type` + `out`.\n */\nexport async function writeNewDoc(opts: { cwd: string; type: string; out: string }): Promise<string> {\n const outAbs = resolve(opts.cwd, opts.out);\n await mkdir(dirname(outAbs), { recursive: true });\n const content = isDocTemplate(opts.type)\n ? (DOC_TEMPLATES[opts.type] as string)\n : templateFor(opts.type as BlockType);\n await writeFile(outAbs, content, 'utf8');\n return outAbs;\n}\n\ninterface PickerProps {\n readonly onPick: (type: BlockType) => void;\n}\n\n/** Ink picker UI for selecting a block type interactively. */\nexport function NewPicker({ onPick }: PickerProps): React.ReactElement {\n const items = BLOCK_TYPES.map((t) => ({ label: t, value: t }));\n return (\n <Box flexDirection=\"column\">\n <Text bold>Pick a block type to scaffold:</Text>\n <SelectInput\n items={items}\n onSelect={(item) => onPick(item.value as BlockType)}\n />\n </Box>\n );\n}\n\ninterface AppProps {\n readonly cwd: string;\n readonly out: string;\n}\n\n/** Full Ink app for interactive `avo new` — picker → write → exit. */\nexport function NewApp({ cwd, out }: AppProps): React.ReactElement {\n const [picked, setPicked] = useState<BlockType | null>(null);\n const [writtenPath, setWrittenPath] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handlePick = (type: BlockType): void => {\n setPicked(type);\n void writeNewDoc({ cwd, type, out }).then((path) => {\n setWrittenPath(path);\n setTimeout(exit, 50);\n });\n };\n\n if (writtenPath !== null) {\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> Wrote </Text>\n <Text bold>{writtenPath}</Text>\n </Box>\n );\n }\n if (picked !== null) {\n return <Text>Writing {out}…</Text>;\n }\n return <NewPicker onPick={handlePick} />;\n}\n","/**\n * Renders a code frame — the offending source line(s) with a caret underline —\n * for a diagnostic, in the style of Rust / TypeScript / Babel errors.\n *\n * Pure and dependency-free; the caller supplies the file's source lines so this\n * stays I/O-free and testable.\n */\n\nimport pc from 'picocolors';\n\n/** Inputs for {@link renderCodeFrame}. */\nexport interface CodeFrameInput {\n /** The file's source split into lines (no trailing newline per line). */\n readonly lines: readonly string[];\n /** 1-based line of the offending token. */\n readonly line: number;\n /** 1-based column of the offending token, if known. */\n readonly column?: number;\n /** 1-based exclusive end column, if known (for a multi-char underline). */\n readonly endColumn?: number;\n /** Number of context lines to show above the offending line. Default 1. */\n readonly contextBefore?: number;\n /** Caret colour: 'error' (red) or 'warn' (yellow). Default 'error'. */\n readonly level?: 'error' | 'warn';\n}\n\n/**\n * Builds a code frame string. Returns an empty string if the line is out of\n * range (so callers can unconditionally append it).\n *\n * @example\n * ```\n * 30 | - { from: Client, kind: bogus }\n * | ^^^^^\n * ```\n */\nexport function renderCodeFrame(input: CodeFrameInput): string {\n const { lines, line } = input;\n if (line < 1 || line > lines.length) return '';\n\n const contextBefore = input.contextBefore ?? 1;\n const start = Math.max(1, line - contextBefore);\n const gutterWidth = String(line).length + 1;\n const tint = input.level === 'warn' ? pc.yellow : pc.red;\n\n const out: string[] = [];\n for (let n = start; n <= line; n++) {\n const text = lines[n - 1] ?? '';\n const gutter = pc.dim(`${String(n).padStart(gutterWidth)} | `);\n out.push(gutter + text);\n }\n\n // Caret line under the offending span.\n if (input.column !== undefined && input.column >= 1) {\n const col = input.column;\n const span = input.endColumn !== undefined ? Math.max(1, input.endColumn - col) : 1;\n const pad = ' '.repeat(gutterWidth) + pc.dim(' | ') + ' '.repeat(col - 1);\n out.push(pad + tint('^'.repeat(span)));\n }\n\n return out.join('\\n');\n}\n","/**\n * Diagnostics rendering for `avo check`.\n *\n * - {@link DiagnosticsTable} is the interactive (TTY) Ink view.\n * - {@link formatDiagnosticsPlain} is the CI / non-TTY text view.\n *\n * Both show a code frame (the offending line with a caret) plus the one-line\n * `hint` and help URL, so an error teaches the fix in place.\n */\n\nimport { Box, Text } from 'ink';\nimport { helpUrl, type Diagnostic } from '@avodado/core';\nimport React from 'react';\nimport { renderCodeFrame } from './codeFrame.js';\n\ntype Sources = ReadonlyMap<string, readonly string[]>;\n\ninterface Props {\n readonly diagnostics: readonly Diagnostic[];\n readonly fileCount: number;\n readonly sources: Sources;\n}\n\nconst COLOR: Record<Diagnostic['level'], string> = {\n error: 'red',\n warn: 'yellow',\n};\n\nfunction frameFor(d: Diagnostic, sources: Sources): string {\n if (d.line === undefined) return '';\n const lines = sources.get(d.file);\n if (lines === undefined) return '';\n return renderCodeFrame({\n lines,\n line: d.line,\n ...(d.column !== undefined ? { column: d.column } : {}),\n ...(d.endColumn !== undefined ? { endColumn: d.endColumn } : {}),\n level: d.level,\n });\n}\n\nexport function DiagnosticsTable({ diagnostics, fileCount, sources }: Props): React.ReactElement {\n const errorCount = diagnostics.filter((d) => d.level === 'error').length;\n const warnCount = diagnostics.filter((d) => d.level === 'warn').length;\n\n if (diagnostics.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n ✓ {fileCount} {fileCount === 1 ? 'file' : 'files'} checked — no diagnostics\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {diagnostics.map((d, i) => {\n const frame = frameFor(d, sources);\n return (\n <Box key={`${d.file}:${d.line ?? '-'}:${i}`} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={COLOR[d.level]} bold>\n {d.level === 'error' ? '✖' : '⚠'}{' '}\n </Text>\n <Text dimColor>\n {d.file}\n {d.line !== undefined ? `:${d.line}` : ''}\n {d.column !== undefined ? `:${d.column}` : ''}{' '}\n </Text>\n <Text color={COLOR[d.level]}>{d.code} </Text>\n <Text>{d.message}</Text>\n </Box>\n {frame.length > 0 ? <Text>{frame}</Text> : null}\n {d.hint !== undefined ? (\n <Text>\n {' '}\n <Text color=\"cyan\">hint:</Text> {d.hint}\n </Text>\n ) : null}\n <Text dimColor>\n {' '}\n {helpUrl(d.code)}\n </Text>\n </Box>\n );\n })}\n <Box>\n <Text bold color={errorCount > 0 ? 'red' : warnCount > 0 ? 'yellow' : 'green'}>\n {errorCount} {errorCount === 1 ? 'error' : 'errors'}, {warnCount}{' '}\n {warnCount === 1 ? 'warning' : 'warnings'} across {fileCount}{' '}\n {fileCount === 1 ? 'file' : 'files'}\n </Text>\n </Box>\n </Box>\n );\n}\n\n/** Formats diagnostics for plain (non-TTY / CI) output. */\nexport function formatDiagnosticsPlain(\n diagnostics: readonly Diagnostic[],\n fileCount: number,\n sources: Sources,\n): string {\n if (diagnostics.length === 0) {\n return `OK: ${fileCount} ${fileCount === 1 ? 'file' : 'files'} checked, no diagnostics\\n`;\n }\n const blocks = diagnostics.map((d) => {\n const loc =\n d.line !== undefined\n ? `${d.file}:${d.line}${d.column !== undefined ? `:${d.column}` : ''}`\n : d.file;\n const parts = [`${loc} ${d.level} ${d.code} ${d.message}`];\n const frame = frameFor(d, sources);\n if (frame.length > 0) parts.push(frame);\n if (d.hint !== undefined) parts.push(` hint: ${d.hint}`);\n return parts.join('\\n');\n });\n const errors = diagnostics.filter((d) => d.level === 'error').length;\n const warns = diagnostics.filter((d) => d.level === 'warn').length;\n blocks.push(`${errors} error(s), ${warns} warning(s) across ${fileCount} file(s)`);\n return blocks.join('\\n\\n') + '\\n';\n}\n","/**\n * A small colored brand banner for the CLI — an avocado half (green rind, amber\n * pit) next to the wordmark. Shown on `avo` / `avo --help` and `avo init`.\n */\n\nimport pc from 'picocolors';\n\nexport function banner(version = '0.0.1'): string {\n const g = pc.green;\n const pit = pc.yellow('●');\n const name = pc.green(pc.bold('avodado'));\n const ver = pc.dim(`v${version}`);\n const tag = pc.dim('Documentation-as-code — Markdown with typed, fenced YAML blocks.');\n return [\n '',\n ` ${g('╭───────╮')}`,\n ` ${g('│ ')}${pit}${g(' ')}${pit}${g(' │')} ${name} ${ver}`,\n ` ${g('│ ')}${pc.yellow('◡')}${g(' │')} ${tag}`,\n ` ${g('╰───────╯')}`,\n '',\n ].join('\\n');\n}\n\n/** The \"what do I actually do\" workflow, shown after top-level help. */\nexport function examples(): string {\n const step = (n: string, cmd: string, note: string): string =>\n ` ${pc.dim(n)} ${pc.cyan(cmd.padEnd(26))}${pc.dim(note)}`;\n return [\n '',\n pc.bold('Workflow:'),\n step('1', 'avo init', 'scaffold docs/, config, and the agent skill'),\n step('2', 'edit docs/*.md', 'prose + typed blocks (grammar in .avodado/skill)'),\n step('3', 'avo check', 'validate — exits non-zero on errors (use in CI)'),\n step('4', 'avo preview docs/x.md', 'render and open it in your browser'),\n '',\n ` ${pc.dim('Per-command help:')} avo ${pc.cyan('<command>')} --help`,\n ` ${pc.dim('Docs:')} https://github.com/jdiejim/avodado`,\n '',\n ].join('\\n');\n}\n","/**\n * TTY-awareness helpers. The CLI renders Ink only when stdout is a TTY and the\n * environment is not CI; otherwise it falls back to plain, log-friendly output\n * so logs stay parseable.\n */\n\n/** True when the process is running interactively (TTY, not CI, not AVO_PLAIN). */\nexport const isInteractive: boolean =\n process.stdout.isTTY === true &&\n process.env['CI'] !== 'true' &&\n process.env['AVO_PLAIN'] !== '1';\n","/**\n * CLI dispatcher. Parses argv via commander, runs the matching command, and\n * decides between Ink rendering, plain output, and JSON output based on\n * {@link isInteractive} and `--json` flags.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport React from 'react';\nimport { render as inkRender, Text } from 'ink';\nimport { loadConfig } from './io/config.js';\nimport { runCheck } from './commands/check.js';\nimport { runRender } from './commands/render.js';\nimport { runExport, type ExportFormat } from './commands/export.js';\nimport { runPreview } from './commands/preview.js';\nimport { runInit } from './commands/init.js';\nimport { runSyncOpenApi } from './commands/sync.js';\nimport { NewApp, templateFor, writeNewDoc, DOC_TEMPLATES, isDocTemplate } from './commands/new.js';\nimport { DiagnosticsTable, formatDiagnosticsPlain } from './ui/DiagnosticsTable.js';\nimport { banner, examples } from './ui/banner.js';\nimport { isInteractive } from './tty.js';\nimport type { BlockType } from '@avodado/core';\nimport { BLOCK_TYPES } from '@avodado/core';\n\n/** Runs the CLI for the given argv (typically `process.argv`). */\nexport async function main(argv: readonly string[]): Promise<number> {\n const program = new Command();\n program\n .name('avo')\n .description('Author, validate, render, and export Avodado documentation.')\n .version('0.0.1')\n // Banner + workflow only on top-level help — not on every subcommand's --help.\n .addHelpText('beforeAll', (ctx) => (ctx.command.name() === 'avo' ? banner() : ''))\n .addHelpText('after', (ctx) => (ctx.command.name() === 'avo' ? examples() : ''))\n .exitOverride();\n\n let exitCode = 0;\n\n program\n .command('init')\n .description('Scaffold a new Avodado project in the current directory')\n .option('--force', 'overwrite existing files')\n .action(async (opts: { force?: boolean }) => {\n const cwd = process.cwd();\n const result = await runInit({ cwd, ...(opts.force ? { force: true } : {}) });\n for (const f of result.created) console.log(pc.green('+ ') + f);\n for (const f of result.skipped) console.log(pc.dim(' skip ') + f + pc.dim(' (exists)'));\n console.log(\n pc.bold(\n `\\nCreated ${result.created.length} file(s), skipped ${result.skipped.length}.\\n` +\n `Next: avo check`,\n ),\n );\n });\n\n program\n .command('new')\n .description('Scaffold a new doc from a block template')\n .option(\n '--type <kind>',\n 'doc template (' + Object.keys(DOC_TEMPLATES).join(', ') + ') or block type (' + BLOCK_TYPES.join(', ') + ')',\n )\n .option('--out <path>', 'output file path')\n .action(async (opts: { type?: string; out?: string }) => {\n const cwd = process.cwd();\n const type = opts.type;\n if (type !== undefined && !BLOCK_TYPES.includes(type as BlockType) && !isDocTemplate(type)) {\n console.error(pc.red(`Unknown type: ${opts.type ?? ''}`));\n exitCode = 2;\n return;\n }\n if (!isInteractive) {\n if (type === undefined || opts.out === undefined) {\n console.error(pc.red('In non-interactive mode, both --type and --out are required.'));\n exitCode = 2;\n return;\n }\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n if (type !== undefined && opts.out !== undefined) {\n const path = await writeNewDoc({ cwd, type, out: opts.out });\n console.log(pc.green('✓ ') + 'Wrote ' + path);\n return;\n }\n const out = opts.out ?? './docs/new-doc.md';\n const { waitUntilExit } = inkRender(<NewApp cwd={cwd} out={out} />);\n await waitUntilExit();\n });\n\n program\n .command('check [globs...]')\n .description('Validate documents (default: docs/**/*.md)')\n .option('--json', 'emit machine-readable JSON')\n .action(async (globs: string[], opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const result = await runCheck({ patterns, cwd, docsRoot: config.docsDir });\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ diagnostics: result.diagnostics, files: result.files }, null, 2) + '\\n',\n );\n } else if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <DiagnosticsTable\n diagnostics={result.diagnostics}\n fileCount={result.files.length}\n sources={result.sources}\n />,\n );\n await waitUntilExit();\n } else {\n process.stdout.write(\n formatDiagnosticsPlain(result.diagnostics, result.files.length, result.sources),\n );\n }\n exitCode = result.exitCode;\n });\n\n program\n .command('render <input>')\n .description('Render one document to a standalone HTML file')\n .option('-o, --output <path>', 'output file path (defaults to <input>.html)')\n .action(async (input: string, opts: { output?: string }) => {\n const cwd = process.cwd();\n const result = await runRender({\n cwd,\n input,\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n });\n if (isInteractive) {\n const { waitUntilExit } = inkRender(\n <Text>\n <Text color=\"green\">✓ </Text>Wrote <Text bold>{result.output}</Text>{' '}\n <Text dimColor>({result.bytes} bytes)</Text>\n </Text>,\n );\n await waitUntilExit();\n } else {\n console.log(`${pc.green('✓')} rendered ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n }\n });\n\n program\n .command('export [globs...]')\n .description('Batch-export documents to HTML and/or PDF')\n .option('--format <list>', 'comma-separated formats: html,pdf', 'html')\n .option('--out <dir>', 'output directory (defaults to config outDir or dist)')\n .action(async (globs: string[], opts: { format: string; out?: string }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const patterns = globs.length > 0 ? globs : [`${config.docsDir}/**/*.md`];\n const formats = opts.format\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter((s): s is ExportFormat => s === 'html' || s === 'pdf');\n if (formats.length === 0) {\n console.error(pc.red('No valid --format specified (expected html, pdf, or both).'));\n exitCode = 2;\n return;\n }\n const result = await runExport({\n cwd,\n patterns,\n docsRoot: config.docsDir,\n outDir: opts.out ?? config.outDir,\n formats,\n });\n for (const item of result.items) {\n for (const o of item.outputs) {\n console.log(`${pc.green('✓')} ${o.path} ${pc.dim(`(${o.bytes} bytes)`)}`);\n }\n }\n console.log(pc.bold(`\\n${result.items.length} document(s) exported.`));\n });\n\n program\n .command('preview <input>')\n .description('Render a document to a temp HTML file and open it')\n .action(async (input: string) => {\n const cwd = process.cwd();\n const result = await runPreview({ cwd, input });\n console.log(pc.green('✓ ') + 'Opened ' + result.file);\n });\n\n const syncCmd = program.command('sync').description('Generate Avodado docs from external sources (OpenAPI)');\n syncCmd\n .command('openapi <spec>')\n .description('Generate (or drift-check) a doc from an OpenAPI 3.x spec')\n .option('-o, --out <path>', 'write generated markdown to this path')\n .option('--check <path>', 'compare against an existing doc and fail on drift')\n .option('--slug <slug>', 'block-id namespace (defaults to the output basename)')\n .action(\n async (\n spec: string,\n opts: { out?: string; check?: string; slug?: string },\n ) => {\n const result = await runSyncOpenApi({\n cwd: process.cwd(),\n spec,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.check !== undefined ? { check: opts.check } : {}),\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n });\n if (result.exitCode === 0) {\n console.log(pc.green('✓ ') + result.message);\n } else {\n console.error(pc.red(result.message));\n if (result.diff !== undefined) console.error(result.diff);\n }\n exitCode = result.exitCode;\n },\n );\n\n try {\n await program.parseAsync(argv as string[], { from: 'node' });\n } catch (err) {\n const e = err as Error & { code?: string; exitCode?: number };\n if (e.code === 'commander.helpDisplayed' || e.code === 'commander.version') {\n return 0;\n }\n if (e.code === 'commander.help') return 0;\n if (typeof e.exitCode === 'number' && e.code?.startsWith('commander.')) {\n return e.exitCode;\n }\n console.error(pc.red(e.message ?? String(err)));\n return 1;\n }\n\n return exitCode;\n}\n\n// Re-export the template helper for tests + downstream consumers.\nexport { templateFor };\n","/**\n * `avo` CLI entry point. Tsup adds the `#!/usr/bin/env node` shebang at build\n * time; this file is the JS that runs after.\n */\n\nimport { main } from './app.js';\n\nconst code = await main(process.argv);\nprocess.exit(code);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avodado/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Avodado CLI — author, validate, render, and export typed Markdown docs.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,10 +25,10 @@
25
25
  "picocolors": "^1.1.1",
26
26
  "react": "^18.3.1",
27
27
  "yaml": "^2.6.1",
28
- "@avodado/core": "0.0.1",
29
- "@avodado/export": "0.0.1",
30
- "@avodado/render": "0.0.1",
31
- "@avodado/sync": "0.0.1"
28
+ "@avodado/core": "0.0.2",
29
+ "@avodado/export": "0.0.2",
30
+ "@avodado/render": "0.0.2",
31
+ "@avodado/sync": "0.0.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/react": "^18.3.18",