chiltepin 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +249 -0
- package/dist/bin.js +3582 -0
- package/dist/bin.js.map +1 -0
- package/package.json +93 -0
- package/templates/chiltepin.config.json +5 -0
- package/templates/demo.md +2161 -0
- package/templates/docs/getting-started.md +155 -0
- package/templates/docs/tutorial.md +559 -0
- package/templates/skill/SKILL.md +172 -0
- package/templates/skill/reference/blocks/INDEX.md +141 -0
- package/templates/skill/reference/blocks/agentic.md +63 -0
- package/templates/skill/reference/blocks/algorithms.md +49 -0
- package/templates/skill/reference/blocks/api.md +40 -0
- package/templates/skill/reference/blocks/architecture.md +94 -0
- package/templates/skill/reference/blocks/business.md +70 -0
- package/templates/skill/reference/blocks/charts-overviews.md +74 -0
- package/templates/skill/reference/blocks/data-model.md +34 -0
- package/templates/skill/reference/blocks/design-system.md +50 -0
- package/templates/skill/reference/blocks/flows.md +74 -0
- package/templates/skill/reference/blocks/narrative.md +65 -0
- package/templates/skill/reference/blocks/planning.md +74 -0
- package/templates/skill/reference/blocks/quality.md +43 -0
- package/templates/skill/reference/blocks/tables-data.md +55 -0
- package/templates/skill/reference/check.md +62 -0
- package/templates/skill/reference/decks.md +198 -0
- package/templates/skill/reference/exemplars/adr.md +87 -0
- package/templates/skill/reference/exemplars/agent-system.md +113 -0
- package/templates/skill/reference/exemplars/api-reference.md +110 -0
- package/templates/skill/reference/exemplars/backend-arch.md +117 -0
- package/templates/skill/reference/exemplars/data-pipeline.md +107 -0
- package/templates/skill/reference/exemplars/frontend-arch.md +93 -0
- package/templates/skill/reference/exemplars/incident-postmortem.md +93 -0
- package/templates/skill/reference/exemplars/migration-plan.md +95 -0
- package/templates/skill/reference/exemplars/onboarding.md +78 -0
- package/templates/skill/reference/exemplars/product-spec.md +81 -0
- package/templates/skill/reference/intake.md +140 -0
- package/templates/skill/reference/mermaid.md +216 -0
- package/templates/skill/reference/organizing.md +118 -0
- package/templates/skill/reference/patterns-design.md +59 -0
- package/templates/skill/reference/patterns.md +167 -0
- package/templates/skill/reference/recipes.md +153 -0
- package/templates/skill/reference/style-ste.md +119 -0
- package/templates/skill/reference/system-design.md +161 -0
- package/templates/skill/reference/writing.md +132 -0
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/io/config.ts","../src/io/version.ts","../src/io/files.ts","../src/commands/conventions.ts","../src/commands/check.tsx","../src/io/pdf.ts","../src/io/write.ts","../src/commands/renderGuard.ts","../src/commands/single.ts","../src/commands/init.ts","../src/commands/demo.ts","../src/commands/DemoApp.tsx","../src/io/manifest.ts","../src/commands/site.ts","../src/commands/build.ts","../src/io/watch.ts","../src/commands/serve.ts","../src/commands/studio.ts","../src/commands/block.ts","../src/io/clipboard.ts","../src/commands/skill.ts","../src/commands/sync.ts","../src/commands/new.tsx","../src/commands/status.ts","../src/commands/audit/builtinSource.ts","../src/commands/audit/graphifySource.ts","../src/commands/audit/rules.ts","../src/commands/audit/run.ts","../src/ui/codeFrame.ts","../src/ui/DiagnosticsTable.tsx","../src/ui/banner.ts","../src/tty.ts","../src/app.tsx","../src/bin.ts"],"names":["yamlParse","existsSync","readFileSync","resolve","cp","rel","inside","relative","sep","basename","require","join","dirname","code","readFile","parsePath","parseDocument","mkdir","renderDocument","writeFile","fileURLToPath","DEMO_FAMILIES","tmpdir","SelectInput","htmlRenderers","validateDocument","resolveRefs","toSlides","walk","escapeHtml","url","banner","open","DEBOUNCE_MS","HEARTBEAT_MS","createHash","createServer","BLOCK_TYPES","familyBlocks","extname","useApp","useInput","items","BLOCK_FAMILIES","jsxs","Box","Text","jsx","BLOCK_DESCRIPTIONS","pc","readdir","text","stat","extOf","inkRender","BLOCK_ALIASES","resolvePath"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * Loads `chiltepin.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. */\ninterface ChiltepinConfig {\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 /** Build the rich site index (TLDR, grouped doc map, cross-reference graph).\n * Defaults to `true` (absent = on); set `false` — or pass `--no-rich-index` —\n * to keep the plain card grid. */\n readonly richIndex: boolean;\n /**\n * The colour scheme of every rendered page: `dark` (default — the look),\n * `light`, or `system` (the reader's OS decides). Print is always light.\n */\n readonly colorScheme: 'dark' | 'light' | 'system';\n}\n\nconst DEFAULTS: ChiltepinConfig = {\n docsDir: 'docs',\n outDir: 'dist',\n richIndex: true,\n colorScheme: 'dark',\n};\n\nconst CONFIG_EXTENSIONS = ['ts', 'js', 'mjs', 'json', 'yml', 'yaml'];\n\n/** Current names first; the pre-rename `avodado.config.*` still loads, with a warning. */\nconst CONFIG_FILES = [\n ...CONFIG_EXTENSIONS.map((ext) => `chiltepin.config.${ext}`),\n ...CONFIG_EXTENSIONS.map((ext) => `avodado.config.${ext}`),\n];\n\n/** True for the legacy (pre-rename) config filename. */\nexport const isLegacyConfigName = (name: string): boolean => name.startsWith('avodado.config.');\n\nlet warnedLegacy = false;\n\n/**\n * Returns the filename of the config found in `cwd`, or `undefined` when the\n * directory isn't a Chiltepin project (used by the smart bare `chiltepin`).\n */\nexport function findConfig(cwd: string): string | undefined {\n return CONFIG_FILES.find((name) => existsSync(resolve(cwd, name)));\n}\n\n/** Loads a config file from `cwd`, returning defaults if none exists. */\nexport async function loadConfig(cwd: string): Promise<ChiltepinConfig> {\n for (const name of CONFIG_FILES) {\n const path = resolve(cwd, name);\n if (!existsSync(path)) continue;\n if (isLegacyConfigName(name) && !warnedLegacy) {\n warnedLegacy = true;\n process.stderr.write(\n `${name} is the old name — rename it to ${name.replace('avodado', 'chiltepin')}. It still loads for now.\\n`,\n );\n }\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): ChiltepinConfig {\n if (raw === null || typeof raw !== 'object') return DEFAULTS;\n const r = raw as {\n docsDir?: unknown;\n outDir?: unknown;\n richIndex?: unknown;\n colorScheme?: unknown;\n };\n const scheme =\n r.colorScheme === 'light' || r.colorScheme === 'system' || r.colorScheme === 'dark'\n ? r.colorScheme\n : DEFAULTS.colorScheme;\n return {\n docsDir: typeof r.docsDir === 'string' ? r.docsDir : DEFAULTS.docsDir,\n outDir: typeof r.outDir === 'string' ? r.outDir : DEFAULTS.outDir,\n richIndex: typeof r.richIndex === 'boolean' ? r.richIndex : DEFAULTS.richIndex,\n colorScheme: scheme,\n };\n}\n","/**\n * Resolves the chiltepin CLI's own version at runtime — shared by the `--version`\n * flag and the studio's `/api/meta` endpoint.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Reads the CLI's own version from the nearest package.json. Walks up from\n * this module so it works from both `dist/bin.js` and the source layout.\n */\nexport function cliVersion(): string {\n try {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const p = join(dir, 'package.json');\n if (existsSync(p)) {\n const j = JSON.parse(readFileSync(p, 'utf8')) as { name?: string; version?: string };\n // The package was renamed twice (@avodado/cli -> avodado -> chiltepin); accept all so the\n // walk matches its own package.json and never a stray parent's.\n if (\n (j.name === 'chiltepin' || j.name === 'avodado' || j.name === '@avodado/cli') &&\n typeof j.version === 'string'\n ) {\n return j.version;\n }\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n /* fall through to the placeholder below */\n }\n return '0.0.0';\n}\n","/**\n * 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 * Encoding rule: a document is UTF-8. A file that is not gets `source: ''` and\n * an `encodingError`, which the callers turn into an `E_ENCODING` diagnostic —\n * validating mojibake and calling it clean is worse than refusing to read it.\n */\n\nimport { readFile, realpath } from 'node:fs/promises';\nimport { basename, relative, resolve, sep } from 'node:path';\nimport fg from 'fast-glob';\nimport type { Diagnostic } from 'chiltepin-core';\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. Empty when {@link encodingError} is set. */\n readonly source: string;\n /** Why the bytes on disk are not a UTF-8 document, when they are not. */\n readonly encodingError?: string;\n /** 1-based line the bad bytes sit on, when known. */\n readonly encodingLine?: number;\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 * Symlinks are not followed, and files that still resolve to the same inode\n * (a hard link, or a link named by two patterns) are loaded once — a `docs/loop\n * -> .` cycle otherwise yields the same document under dozens of slugs and a\n * pile of invented duplicate-id errors.\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 followSymbolicLinks: false,\n });\n const docsRootAbs = resolve(cwd, docsRoot);\n\n // One entry per real path. A symlinked directory that fast-glob still walked\n // (because the link sits in the pattern itself) collapses back to one doc.\n const seen = new Set<string>();\n const unique: string[] = [];\n for (const absolute of matches) {\n let real: string;\n try {\n real = await realpath(absolute);\n } catch {\n real = absolute;\n }\n if (seen.has(real)) continue;\n seen.add(real);\n unique.push(absolute);\n }\n\n const files = await Promise.all(\n unique.map(async (absolute): Promise<DocFile> => {\n const file = relative(cwd, absolute);\n const slug = deriveSlug(absolute, docsRootAbs);\n const decoded = decodeUtf8(await readFile(absolute));\n return { absolute, file, slug, ...decoded };\n }),\n );\n files.sort((a, b) => a.file.localeCompare(b.file));\n return files;\n}\n\n/** Turns the encoding failures in a doc set into diagnostics. */\nexport function encodingDiagnostics(docs: readonly DocFile[]): Diagnostic[] {\n const out: Diagnostic[] = [];\n for (const d of docs) {\n if (d.encodingError === undefined) continue;\n out.push({\n file: d.file,\n ...(d.encodingLine !== undefined ? { line: d.encodingLine } : {}),\n level: 'error',\n code: 'E_ENCODING',\n message: d.encodingError,\n hint: 'Re-save the file as UTF-8 (no byte order mark).',\n });\n }\n return out;\n}\n\n/** Byte order marks that prove the file is not UTF-8, longest first. */\nconst BOMS: ReadonlyArray<{ readonly bytes: readonly number[]; readonly label: string }> = [\n { bytes: [0xff, 0xfe, 0x00, 0x00], label: 'UTF-32 LE' },\n { bytes: [0x00, 0x00, 0xfe, 0xff], label: 'UTF-32 BE' },\n { bytes: [0xff, 0xfe], label: 'UTF-16 LE' },\n { bytes: [0xfe, 0xff], label: 'UTF-16 BE' },\n];\n\nconst startsWith = (buf: Buffer, bytes: readonly number[]): boolean =>\n buf.length >= bytes.length && bytes.every((b, i) => buf[i] === b);\n\n/**\n * Decodes document bytes as UTF-8. A UTF-8 byte order mark is stripped (it is\n * valid UTF-8, but it would push the first fence off line 1); anything else\n * that is not UTF-8 comes back as an error instead of replacement characters.\n */\nexport function decodeUtf8(buf: Buffer): {\n source: string;\n encodingError?: string;\n encodingLine?: number;\n} {\n for (const bom of BOMS) {\n if (startsWith(buf, bom.bytes)) {\n return {\n source: '',\n encodingError: `The file is not UTF-8: it starts with a ${bom.label} byte order mark.`,\n encodingLine: 1,\n };\n }\n }\n const body = startsWith(buf, [0xef, 0xbb, 0xbf]) ? buf.subarray(3) : buf;\n const bad = firstInvalidUtf8(body);\n if (bad !== undefined) {\n let line = 1;\n for (let i = 0; i < bad; i += 1) if (body[i] === 0x0a) line += 1;\n return {\n source: '',\n encodingError: `The file is not UTF-8: byte ${bad} is not part of a valid UTF-8 sequence.`,\n encodingLine: line,\n };\n }\n return { source: body.toString('utf8') };\n}\n\n/**\n * Returns the offset of the first byte that breaks UTF-8, or `undefined` when\n * the buffer decodes cleanly. Rejects over-long encodings, surrogate halves,\n * and values above U+10FFFF, so `TextDecoder`'s replacement character can\n * never stand in for real data.\n */\nfunction firstInvalidUtf8(buf: Buffer): number | undefined {\n const len = buf.length;\n let i = 0;\n while (i < len) {\n const b = buf[i] as number;\n if (b < 0x80) {\n i += 1;\n continue;\n }\n let need: number;\n let cp: number;\n if (b >= 0xc2 && b <= 0xdf) {\n need = 1;\n cp = b & 0x1f;\n } else if (b >= 0xe0 && b <= 0xef) {\n need = 2;\n cp = b & 0x0f;\n } else if (b >= 0xf0 && b <= 0xf4) {\n need = 3;\n cp = b & 0x07;\n } else {\n return i; // continuation byte in lead position, or an over-long lead\n }\n if (i + need > len - 1) return i; // truncated sequence at end of file\n for (let k = 1; k <= need; k += 1) {\n const c = buf[i + k] as number;\n if ((c & 0xc0) !== 0x80) return i;\n cp = (cp << 6) | (c & 0x3f);\n }\n if (need === 2 && (cp < 0x800 || (cp >= 0xd800 && cp <= 0xdfff))) return i;\n if (need === 3 && (cp < 0x10000 || cp > 0x10ffff)) return i;\n i += need + 1;\n }\n return undefined;\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 * On-disk convention lint (`W_DOC_CONVENTION`) — path-based, so it lives in\n * the CLI, not in `chiltepin-core`.\n *\n * The convention: docs live under the configured docs root with one level of\n * grouping (`docs/<area>/<doc>.md`), and filenames are kebab-case slugs\n * (lowercase a-z, 0-9, hyphens, `.md`). The slug is the reference prefix\n * (`doc#id`), so names are load-bearing. Files outside the docs root are not\n * checked — checking `resources/` fixtures is a legitimate use of `chiltepin check`.\n *\n * Findings are always warnings. No flag escalates them.\n */\n\nimport { basename, relative, resolve, sep } from 'node:path';\nimport type { Diagnostic } from 'chiltepin-core';\n\n/** Kebab-case doc filename: lowercase a-z, 0-9, single hyphens, `.md`. */\nconst KEBAB_FILE = /^[a-z0-9]+(-[a-z0-9]+)*\\.md$/;\n\n/** Maximum path depth under the docs root: `<area>/<doc>.md` = 2 segments. */\nconst MAX_DEPTH = 2;\n\n/** Suggests a kebab-case name for a filename that is not kebab-case. */\nexport function kebabSuggestion(filename: string): string {\n const stem = filename.replace(/\\.md$/i, '');\n const slug = stem\n // CamelCase → camel-case, before everything is lowercased.\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase()\n // Every run of non-slug characters (underscores, spaces, dots, …) → one hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `${slug.length > 0 ? slug : 'doc'}.md`;\n}\n\n/**\n * Checks one file path against the on-disk convention.\n *\n * @param file - Path relative to `cwd` (as reported in diagnostics).\n * @param absolute - Absolute path on disk.\n * @param cwd - The working directory.\n * @param docsRoot - The configured docs root, relative to `cwd`.\n * @returns Zero or more `W_DOC_CONVENTION` warnings. Files outside the docs\n * root return none.\n */\nexport function lintConventions(\n file: string,\n absolute: string,\n cwd: string,\n docsRoot: string,\n): Diagnostic[] {\n const rel = relative(resolve(cwd, docsRoot), absolute);\n const inside = rel.length > 0 && !rel.startsWith('..') && !rel.startsWith(sep);\n if (!inside) return [];\n\n const diagnostics: Diagnostic[] = [];\n const name = basename(absolute);\n\n if (!KEBAB_FILE.test(name)) {\n diagnostics.push({\n file,\n level: 'warn',\n code: 'W_DOC_CONVENTION',\n message: `The file name \"${name}\" is not kebab-case. Doc names use lowercase a-z, 0-9, and hyphens. The name is the reference prefix, so refs to this doc inherit it.`,\n value: name,\n hint: `Rename the file to kebab-case: ${kebabSuggestion(name)}.`,\n });\n }\n\n const depth = rel.split(sep).length;\n if (depth > MAX_DEPTH) {\n diagnostics.push({\n file,\n level: 'warn',\n code: 'W_DOC_CONVENTION',\n message: `The file is ${depth} levels below ${docsRoot}/. The convention permits one group level: ${docsRoot}/<area>/<doc>.md.`,\n value: rel.split(sep).join('/'),\n hint: `Move the file to ${docsRoot}/<area>/${name}, then update refs to its old slug.`,\n });\n }\n\n return diagnostics;\n}\n","/**\n * `chiltepin check` — validate one or more documents and report diagnostics.\n *\n * Runs schema validation, cross-doc reference resolution, the STE-informed\n * prose lint (`lintProse`), the density-budget lint (`lintDensity`), and the\n * on-disk convention check (`lintConventions`) over every matched doc. Prose\n * findings are warnings by default; `--strict-prose` escalates them to errors.\n * Density and convention findings stay warnings always.\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 {\n lintDensity,\n lintProse,\n parseDocument,\n PROSE_CHECK_CODES,\n resolveRefs,\n validateDocument,\n type Diagnostic,\n type Document,\n} from 'chiltepin-core';\nimport { encodingDiagnostics, loadDocs, type DocFile } from '../io/files.js';\nimport { lintConventions } from './conventions.js';\n\n/** The prose-lint codes, as a set for the strict-prose escalation. */\nconst PROSE_CODES: ReadonlySet<string> = new Set(PROSE_CHECK_CODES);\n\n/** Inputs to {@link runCheck}. */\ninterface 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 /** Escalate W_PROSE_* warnings to errors (they then affect the exit code). */\n readonly strictProse?: boolean;\n}\n\n/** Result of running `chiltepin 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 // A file that is not UTF-8 is reported, not parsed: validating the\n // replacement characters it decodes to would call mojibake a clean document.\n const parsed: { doc: Document; file: string }[] = docs\n .filter((d) => d.encodingError === undefined)\n .map((d) => ({\n doc: parseDocument(d.source, d.slug),\n file: d.file,\n }));\n\n const diagnostics: Diagnostic[] = [...encodingDiagnostics(docs)];\n\n for (const { doc, file } of parsed) {\n diagnostics.push(...validateDocument(doc, file));\n diagnostics.push(...lintProse(doc, file));\n // Density budgets stay warnings even under --strict-prose: W_DENSE_BLOCK\n // is a design nudge (\"split this diagram\"), never a gate.\n diagnostics.push(...lintDensity(doc, file));\n }\n\n // On-disk convention (path-based, so it runs here, not in core). Always a\n // warning — `--strict-prose` does not escalate it.\n for (const d of docs) {\n diagnostics.push(...lintConventions(d.file, d.absolute, opts.cwd, opts.docsRoot));\n }\n\n const resolved = resolveRefs(parsed);\n diagnostics.push(...resolved.diagnostics);\n\n // `--strict-prose`: prose findings become errors and gate the exit code.\n const escalated: Diagnostic[] =\n opts.strictProse === true\n ? diagnostics.map((d) =>\n d.level === 'warn' && PROSE_CODES.has(d.code) ? { ...d, level: 'error' } : d,\n )\n : diagnostics;\n\n escalated.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 = escalated.some((d) => d.level === 'error') ? 1 : 0;\n\n const sources = new Map<string, readonly string[]>();\n for (const d of docs) {\n if (d.encodingError !== undefined) continue; // no readable text to frame\n sources.set(d.file, d.source.split(/\\r\\n|\\r|\\n/));\n }\n\n return {\n diagnostics: escalated,\n files: docs.map((d: DocFile) => d.file),\n sources,\n exitCode,\n };\n}\n","/**\n * PDF export via headless Chromium (Playwright).\n *\n * Playwright is an optional dependency — importing it lazily means consumers\n * who never touch `chiltepin pdf` aren't forced to download Chromium. Callers who\n * use {@link toPdf} can pass `autoInstallBrowser: true` to download the matching\n * Chromium on first use; otherwise a missing browser throws a clear error.\n */\n\nimport { spawn } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport type { Document } from 'chiltepin-core';\nimport { renderDocument } from 'chiltepin-render';\nimport type * as Playwright from 'playwright';\n\ntype PlaywrightModule = typeof Playwright;\n\nconst require = createRequire(import.meta.url);\n\n/** Page format for the generated PDF. */\ntype PdfFormat = 'A4' | 'Letter';\n\n/** Options for {@link toPdf}. */\ninterface PdfOptions {\n /** Page format. Defaults to `A4`. */\n readonly format?: PdfFormat;\n /**\n * Custom page width in CSS pixels. When set, it wins over `format`: the page\n * becomes `pageWidthPx` wide with portrait A-series proportions\n * (height = width × √2). Used by the CLI `--size` presets.\n */\n readonly pageWidthPx?: number;\n /** Optional page margins (CSS length strings). */\n readonly margin?: {\n readonly top?: string;\n readonly right?: string;\n readonly bottom?: string;\n readonly left?: string;\n };\n /**\n * If Chromium isn't installed, download it (via the bundled Playwright, so the\n * version always matches) and retry once, instead of throwing. Default `false`.\n */\n readonly autoInstallBrowser?: boolean;\n /** Progress logger for the one-time browser download. */\n readonly log?: (message: string) => void;\n}\n\n/** True if the error is Playwright complaining the browser binary is missing. */\nfunction isMissingBrowserError(message: string): boolean {\n return /Executable doesn't exist|playwright install|just installed or updated/i.test(message);\n}\n\n/** Resolves the bundled Playwright CLI entry (`cli.js`), or `undefined`. */\nfunction playwrightCliPath(): string | undefined {\n try {\n return join(dirname(require.resolve('playwright/package.json')), 'cli.js');\n } catch {\n return undefined;\n }\n}\n\n/**\n * Downloads the Chromium build the *installed* Playwright needs, by running its\n * own bundled CLI (`node …/playwright/cli.js install chromium`). Using the\n * bundled CLI guarantees the browser build matches the library version — the\n * usual cause of \"Executable doesn't exist at …chromium-XXXX\" errors.\n */\nasync function installChromium(log: (message: string) => void = () => {}): Promise<void> {\n const cli = playwrightCliPath();\n if (cli === undefined) {\n throw new Error('Could not locate the Playwright CLI. Run `npx playwright install chromium`.');\n }\n log('Downloading Chromium for PDF export (one-time, ~100 MB)…');\n await new Promise<void>((resolvePromise, rejectPromise) => {\n const child = spawn(process.execPath, [cli, 'install', 'chromium'], {\n stdio: ['ignore', 'inherit', 'inherit'],\n });\n child.on('error', rejectPromise);\n child.on('exit', (code) =>\n code === 0 ? resolvePromise() : rejectPromise(new Error(`playwright install exited with code ${String(code)}`)),\n );\n });\n}\n\n/**\n * Returns `true` if `playwright` is installed AND the Chromium binary is\n * available on disk.\n *\n * Use this to gate PDF tests in CI and to give callers a clear error before\n * launching a browser that doesn't exist.\n */\nexport async function isChromiumAvailable(): Promise<boolean> {\n try {\n const pw: PlaywrightModule = await import('playwright');\n const exe = pw.chromium.executablePath();\n if (typeof exe !== 'string' || exe.length === 0) return false;\n const { existsSync } = await import('node:fs');\n return existsSync(exe);\n } catch {\n return false;\n }\n}\n\n/**\n * Renders a document (or pre-rendered HTML string) to a PDF byte buffer.\n *\n * @param input - A {@link Document} or an HTML string. A Document is rendered\n * to HTML first via the renderer.\n * @param opts - Optional page format and margins.\n * @returns The PDF bytes.\n *\n * @example\n * ```ts\n * const bytes = await toPdf(doc, { format: 'A4' });\n * await writeFile('out.pdf', bytes);\n * ```\n *\n * @throws If Playwright is not installed or its Chromium binary is missing.\n */\nexport async function toPdf(input: Document | string, opts: PdfOptions = {}): Promise<Uint8Array> {\n const html = typeof input === 'string' ? input : renderDocument(input);\n const pw = await loadPlaywright();\n const browser = await launchChromium(pw, opts);\n try {\n const page = await browser.newPage();\n await page.setContent(html, { waitUntil: 'networkidle' });\n const buffer = await page.pdf({\n // A custom pixel width wins over the named format (Playwright ignores\n // `format` when width/height are given): portrait A-series proportions\n // keep the page shape familiar at every preset.\n ...(opts.pageWidthPx !== undefined\n ? {\n width: `${String(opts.pageWidthPx)}px`,\n height: `${String(Math.round(opts.pageWidthPx * Math.SQRT2))}px`,\n }\n : { format: opts.format ?? 'A4' }),\n printBackground: true,\n ...(opts.margin !== undefined ? { margin: opts.margin } : {}),\n });\n return new Uint8Array(buffer);\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Launches headless Chromium. If the browser binary is missing, either\n * auto-installs it (when `opts.autoInstallBrowser`) and retries, or throws a\n * clear, actionable error with the exact command to run.\n *\n * Exported for the other Chromium-backed exporter ({@link ../pptx.js toPptx});\n * not part of the public CLI surface.\n */\nasync function launchChromium(pw: PlaywrightModule, opts: PdfOptions): Promise<Playwright.Browser> {\n try {\n return await pw.chromium.launch({ headless: true });\n } catch (err) {\n const message = (err as Error).message;\n if (!isMissingBrowserError(message)) throw err;\n if (opts.autoInstallBrowser === true) {\n await installChromium(opts.log);\n return await pw.chromium.launch({ headless: true });\n }\n const cli = playwrightCliPath();\n const cmd = cli !== undefined ? `node \"${cli}\" install chromium` : 'npx playwright install chromium';\n throw new Error(\n `Chromium isn't installed for PDF export. Install it once with:\\n ${cmd}\\nOriginal error: ${message}`,\n );\n }\n}\n\n/** Lazy Playwright import shared by the PDF and PPTX exporters. */\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n try {\n return await import('playwright');\n } catch (err) {\n throw new Error(\n `Playwright is required for PDF export. Run: pnpm add playwright && npx playwright install chromium\\n` +\n `Original error: ${(err as Error).message}`,\n );\n }\n}\n","/**\n * Overwrite safety for every command that writes to a path the user named.\n *\n * The rule, applied identically everywhere:\n *\n * - A command that writes a **document** (`chiltepin sync … --out`, `chiltepin new -o`,\n * `chiltepin new -o`, `chiltepin skill -o`)\n * never replaces an existing file. Those paths point into `docs/`, and the\n * file there is usually hand-written.\n * - A command that writes an **export** (`chiltepin html|slides|pdf`, and the\n * gallery writers `demo` / `catalog` / `compare` / `design -p -o`, which all\n * route through the same writer) replaces a file only when the path already\n * carries the extension that command produces. Re-exporting `report.html`\n * over `report.html` is the intended loop; writing HTML over `notes.md` or\n * `Makefile` is data loss, and refuses.\n * - `--force` overrides both.\n *\n * `chiltepin build` is out of scope here: it owns its output directory and tracks\n * what it generated in a manifest (see `io/manifest.ts`).\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\n/** Inputs to {@link overwriteRefusal}. */\ninterface OverwriteGuard {\n /** The user asked for the overwrite explicitly — never refuse. */\n readonly force?: boolean | undefined;\n /**\n * Path suffixes this command regenerates in place (e.g. `['.html']`).\n * A target that ends with one of them is treated as this command's own\n * previous output. Omitted (the document case) protects every existing file.\n */\n readonly regenerates?: readonly string[];\n /** Flag name quoted in the refusal. Defaults to `--force`. */\n readonly flag?: string;\n}\n\n/**\n * Returns the refusal message for writing `abs`, or `undefined` when the write\n * is safe. Pure apart from one `existsSync`.\n */\nexport function overwriteRefusal(abs: string, guard: OverwriteGuard = {}): string | undefined {\n if (guard.force === true) return undefined;\n if (!existsSync(abs)) return undefined;\n const lower = abs.toLowerCase();\n const regenerates = guard.regenerates ?? [];\n if (regenerates.some((ext) => lower.endsWith(ext.toLowerCase()))) return undefined;\n const flag = guard.flag ?? '--force';\n return `${abs} already exists — refusing to overwrite it. Pass ${flag} to replace it, or write to another path.`;\n}\n\n/** Thrown by {@link assertWritable} — carries only the refusal message. */\nexport class OverwriteRefusedError extends Error {\n public override readonly name = 'OverwriteRefusedError';\n}\n\n/**\n * Throws {@link OverwriteRefusedError} when writing `abs` would destroy an\n * existing file. For command modules that report by throwing (the CLI's\n * top-level handler prints the message and exits 1).\n */\nexport function assertWritable(abs: string, guard: OverwriteGuard = {}): void {\n const refusal = overwriteRefusal(abs, guard);\n if (refusal !== undefined) throw new OverwriteRefusedError(refusal);\n}\n\n/** Creates the parent directory and writes `data`, refusing to clobber. */\nexport async function writeFileSafe(\n abs: string,\n data: string | Uint8Array,\n guard: OverwriteGuard = {},\n): Promise<void> {\n assertWritable(abs, guard);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, data);\n}\n","/**\n * Render-failure attribution.\n *\n * A renderer is supposed to be a pure function of validated data, but a bad\n * value can still make one throw (an unbounded loop that hits V8's string cap,\n * a required field the schema rejected but the build rendered anyway). Left\n * alone, that surfaces from `chiltepin build` as a bare `Invalid string length` with\n * no file, no line, and no block type.\n *\n * {@link renderFailure} turns any throw into a normal `E_RENDER` diagnostic\n * that names the document and, when it can find it, the exact block: on the\n * failure path only, each typed block is re-rendered on its own until one\n * throws the same way.\n */\n\nimport type { Diagnostic, Document, TypedSegment } from 'chiltepin-core';\nimport { htmlRenderers } from 'chiltepin-render';\n\n/** The message of a thrown value, whatever it was. */\nfunction errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n/** Every typed block renderer, keyed by type, with the data types erased. */\nconst renderers = htmlRenderers as unknown as Readonly<\n Record<string, (data: unknown) => string>\n>;\n\n/**\n * Re-renders each typed block on its own and returns the first that throws.\n * `undefined` means no single block reproduces the failure — the crash came\n * from document-level assembly (slides, sections, the shell).\n */\nexport function failingBlock(doc: Document): TypedSegment | undefined {\n for (const seg of doc.segments) {\n if (seg.kind === 'markdown') continue;\n if (seg.data === undefined) continue;\n const render = renderers[seg.kind];\n if (render === undefined) continue;\n try {\n render(seg.data);\n } catch {\n return seg;\n }\n }\n return undefined;\n}\n\n/**\n * Builds the `E_RENDER` diagnostic for a failed render.\n *\n * @param doc - The document being rendered.\n * @param file - Its path, as diagnostics report it.\n * @param what - What was being produced, e.g. `page` or `slide deck`.\n * @param err - The thrown value.\n */\nexport function renderFailure(\n doc: Document,\n file: string,\n what: string,\n err: unknown,\n): Diagnostic {\n const reason = errorMessage(err);\n const block = failingBlock(doc);\n if (block === undefined) {\n return {\n file,\n level: 'error',\n code: 'E_RENDER',\n message: `The ${what} could not be rendered: ${reason}`,\n hint: 'No single block reproduces the failure — the whole document does.',\n };\n }\n const label = block.sourceType ?? block.kind;\n return {\n file,\n line: block.line,\n level: 'error',\n code: 'E_RENDER',\n message: `The ${what} could not be rendered: the \\`${label}\\` block failed — ${reason}`,\n ...(block.id !== undefined ? { value: block.id } : {}),\n hint: 'Fix the values in this block, or remove it and re-run `chiltepin build`.',\n };\n}\n\n/** Result of {@link guardRender}: the value, or the diagnostic that replaced it. */\ntype GuardedRender<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly diagnostic: Diagnostic };\n\n/** Runs `render`, converting a throw into an `E_RENDER` diagnostic. */\nexport function guardRender<T>(\n doc: Document,\n file: string,\n what: string,\n render: () => T,\n): GuardedRender<T> {\n try {\n return { ok: true, value: render() };\n } catch (err) {\n return { ok: false, diagnostic: renderFailure(doc, file, what, err) };\n }\n}\n","/**\n * Single-document export shortcuts behind `chiltepin html` / `chiltepin slides` / `chiltepin pdf`.\n * Each renders one doc, applying the project theme (`chiltepin.theme.json`), and\n * writes a single output file (defaulting next to the input).\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, parse as parsePath, relative, resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument } from 'chiltepin-core';\nimport { renderDocument, toSlides } from 'chiltepin-render';\nimport { toPdf } from '../io/pdf.js';\nimport { assertWritable } from '../io/write.js';\nimport { loadConfig } from '../io/config.js';\nimport { renderFailure } from './renderGuard.js';\n\nexport type SingleFormat = 'html' | 'slides' | 'pdf';\n\n/** Page-width preset for the page-shaped exports (`html`, `pdf`). */\nexport type ExportSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Page width in CSS pixels for each `--size` preset. The unflagged default\n * stays the house content width (1180 px) and, for PDF, the A4 page.\n */\nexport const SIZE_WIDTHS: Readonly<Record<ExportSize, number>> = {\n sm: 720,\n md: 960,\n lg: 1280,\n xl: 1600,\n};\n\n/** Parses a `--size` value; returns `undefined` for an unknown preset. */\nexport function parseExportSize(value: string): ExportSize | undefined {\n return value === 'sm' || value === 'md' || value === 'lg' || value === 'xl'\n ? value\n : undefined;\n}\n\nconst EXT: Readonly<Record<SingleFormat, string>> = {\n html: 'html',\n slides: 'slides.html',\n pdf: 'pdf',\n};\n\n/**\n * Path suffixes each format is allowed to replace in place. Re-exporting over\n * the last export is the normal loop; writing a rendered file over a source\n * file (`-o notes.md`) is data loss and refuses without `--force`.\n */\nconst REGENERATES: Readonly<Record<SingleFormat, readonly string[]>> = {\n html: ['.html', '.htm'],\n slides: ['.html', '.htm'],\n pdf: ['.pdf'],\n};\n\nexport interface SingleResult {\n readonly output: string;\n readonly bytes: number;\n readonly opened: boolean;\n}\n\n/** Renders `opts.input` to `opts.format` and writes it (or previews it). */\nexport async function runSingle(opts: {\n readonly cwd: string;\n readonly input: string;\n readonly output?: string;\n readonly format: SingleFormat;\n readonly preview?: boolean;\n /**\n * With `preview`, whether to actually open the browser (default true).\n * `false` keeps the temp-file rendering but stays script-safe (non-TTY\n * `chiltepin <file.md>`).\n */\n readonly open?: boolean;\n /**\n * `html` and `pdf` only: page-width preset. Sets the content width\n * (`--page-max`) and, for PDF, the page width. Unset keeps the defaults\n * (1180 px content width; A4 page).\n */\n readonly size?: ExportSize;\n /**\n * Replace an existing file at `output`. Without it, a path that does not\n * already carry this format's extension is refused rather than overwritten.\n */\n readonly force?: boolean;\n}): Promise<SingleResult> {\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\n // A size preset widens (or narrows) the page: the content column follows the\n // `--page-max` CSS variable the house stylesheet reads. Slides/PPTX keep\n // their fixed 16:9 stage, so the preset only applies to html and pdf.\n const sizePx =\n opts.size !== undefined && (opts.format === 'html' || opts.format === 'pdf')\n ? SIZE_WIDTHS[opts.size]\n : undefined;\n const config = await loadConfig(opts.cwd);\n const themeOpts = {\n colorScheme: config.colorScheme,\n ...(sizePx !== undefined ? { themeVars: { '--page-max': `${String(sizePx)}px` } } : {}),\n };\n\n // Preview → a temp file keyed by the *content* (source + format + size), so an\n // edit produces a new filename and the browser opens a fresh tab instead of\n // showing the previously-cached one. Unchanged content reuses the same file.\n let outputAbs: string;\n if (opts.preview === true) {\n const hash = createHash('sha1')\n .update(`${source}\\u0000${opts.format}\\u0000${JSON.stringify(themeOpts)}`)\n .digest('hex')\n .slice(0, 10);\n const dir = join(tmpdir(), 'chiltepin-preview');\n await mkdir(dir, { recursive: true });\n outputAbs = join(dir, `${slug}-${hash}.${EXT[opts.format]}`);\n } else {\n outputAbs =\n opts.output !== undefined\n ? resolve(opts.cwd, opts.output)\n : inputAbs.replace(/\\.md$/i, `.${EXT[opts.format]}`);\n // Only a path the user named is guarded: the derived sibling\n // (`doc.md` → `doc.html`) is this command's own artifact by construction.\n if (opts.output !== undefined) {\n assertWritable(outputAbs, {\n ...(opts.force === true ? { force: true } : {}),\n regenerates: REGENERATES[opts.format],\n });\n }\n await mkdir(dirname(outputAbs), { recursive: true });\n }\n\n // A renderer that throws must say which document and which block — the bare\n // V8 message (\"Invalid string length\") names neither.\n const named = async <T>(what: string, produce: () => T | Promise<T>): Promise<T> => {\n try {\n return await produce();\n } catch (err) {\n const d = renderFailure(doc, relative(opts.cwd, inputAbs) || opts.input, what, err);\n const where = d.line !== undefined ? `${d.file}:${d.line}` : d.file;\n throw new Error(`${where} ${d.message}`, { cause: err });\n }\n };\n\n let bytes: number;\n if (opts.format === 'pdf') {\n // Auto-download the matching Chromium on first use, so `chiltepin pdf` just works.\n const page = await named('PDF', () => renderDocument(doc, themeOpts));\n const pdf = await toPdf(page, {\n autoInstallBrowser: true,\n log: (m) => console.error(m),\n // With a size preset the PDF page itself takes the preset width (portrait\n // A-series proportions); without one the page stays A4.\n ...(sizePx !== undefined ? { pageWidthPx: sizePx } : {}),\n });\n await writeFile(outputAbs, pdf);\n bytes = pdf.byteLength;\n } else {\n const html = await named(opts.format === 'slides' ? 'slide deck' : 'page', () =>\n opts.format === 'slides' ? toSlides(doc, themeOpts) : renderDocument(doc, themeOpts),\n );\n await writeFile(outputAbs, html, 'utf8');\n bytes = html.length;\n }\n\n const doOpen = opts.preview === true && opts.open !== false;\n if (doOpen) await open(outputAbs);\n return { output: outputAbs, bytes, opened: doOpen };\n}\n","/**\n * `chiltepin init` — scaffold a new Chiltepin project in the current directory:\n * the config file and two starter docs. Nothing else.\n *\n * The authoring skill is not copied here. It installs into any agent with one\n * command — `npx skills add jdiejim/chiltepin` — and lives once, in the\n * repository's `skills/chiltepin/` folder. This module still knows where that\n * folder is (packaged as `templates/skill/`, or the repo copy when running\n * from source) for the two consumers that need the whole skill as one\n * document: `chiltepin skill` and the MCP server's embed.\n */\n\nimport { cp, mkdir, readFile } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * The skill's reference files, in stitch order (hub first, then the block\n * index, the block families, recipes, and the authoring guidance). `chiltepin skill`\n * and the MCP embed concatenate exactly this list; the on-disk folder may\n * carry more (the exemplars), which stay out of the single-file form.\n *\n * This is the one list of skill reference files the CLI stitches for `chiltepin skill`.\n */\nexport const SKILL_REFERENCE_FILES: readonly string[] = [\n 'reference/blocks/INDEX.md',\n 'reference/blocks/narrative.md',\n 'reference/blocks/tables-data.md',\n 'reference/blocks/api.md',\n 'reference/blocks/architecture.md',\n 'reference/blocks/flows.md',\n 'reference/blocks/data-model.md',\n 'reference/blocks/charts-overviews.md',\n 'reference/blocks/planning.md',\n 'reference/blocks/business.md',\n 'reference/blocks/design-system.md',\n 'reference/blocks/algorithms.md',\n 'reference/blocks/agentic.md',\n 'reference/blocks/quality.md',\n 'reference/recipes.md',\n 'reference/patterns.md',\n 'reference/patterns-design.md',\n 'reference/mermaid.md',\n 'reference/writing.md',\n 'reference/check.md',\n 'reference/system-design.md',\n 'reference/decks.md',\n 'reference/intake.md',\n 'reference/organizing.md',\n 'reference/style-ste.md',\n];\n\n/** The hub + its references, in stitch order. */\nconst SKILL_FILES: readonly string[] = ['SKILL.md', ...SKILL_REFERENCE_FILES];\n\n/** Files `chiltepin init` writes, template-relative = repo-relative. */\nconst BASE_FILES: readonly string[] = [\n 'chiltepin.config.json',\n 'docs/getting-started.md',\n 'docs/tutorial.md',\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 */\nexport function 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 chiltepin/cli templates directory near ${import.meta.url}`);\n}\n\n/**\n * Resolves the authoring skill folder: the packaged copy (`templates/skill`,\n * written by `scripts/sync-skill.mjs` at build time) or, when running from the\n * repository, the single source at `skills/chiltepin/`.\n */\nexport function skillDir(): string {\n // Inside this monorepo (a `pnpm-workspace.yaml` beside `skills/`) the repo\n // copy wins, so an edited skill never hides behind a stale build-time copy.\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, 'skills', 'chiltepin');\n if (existsSync(join(candidate, 'SKILL.md')) && existsSync(join(dir, 'pnpm-workspace.yaml'))) {\n return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n const packaged = join(templatesDir(), 'skill');\n if (existsSync(join(packaged, 'SKILL.md'))) return packaged;\n throw new Error('Could not locate the Chiltepin skill (templates/skill or skills/chiltepin)');\n}\n\n/**\n * Stitches the skill hub + every reference file (in {@link SKILL_REFERENCE_FILES}\n * order) into one self-contained markdown document, for consumers with no\n * filesystem beside the skill: `chiltepin skill` and the MCP server's embed. The\n * hub's \"live beside this file\" pointer language is rewritten since the\n * references follow inline.\n */\nexport async function stitchSkill(srcRoot: string = skillDir()): Promise<string> {\n const parts = await Promise.all(SKILL_FILES.map((f) => readFile(resolve(srcRoot, f), 'utf8')));\n return (parts.map((p) => p.trimEnd()).join('\\n\\n---\\n\\n') + '\\n').replaceAll(\n 'live beside this file — read them on demand',\n 'are included in full below — read them on demand',\n );\n}\n\ninterface 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 * Scaffolds a Chiltepin project into `cwd`: the config and the two starter\n * docs. Existing files are skipped unless `force: true`. Returns the\n * created/skipped relative paths for reporting.\n */\nexport async function runInit(opts: InitOptions): Promise<InitResult> {\n const srcRoot = templatesDir();\n const created: string[] = [];\n const skipped: string[] = [];\n for (const rel of BASE_FILES) {\n const dst = join(opts.cwd, rel);\n if (existsSync(dst) && opts.force !== true) {\n skipped.push(rel);\n continue;\n }\n await mkdir(dirname(dst), { recursive: true });\n await cp(resolve(srcRoot, rel), dst);\n created.push(rel);\n }\n return { created, skipped };\n}\n","/**\n * `chiltepin demo [family]` — render the bundled showcase doc (every block type, or\n * just one family of blocks) so a user can see Chiltepin without writing\n * anything. Defaults to opening an HTML preview in the browser.\n */\n\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { parseDocument } from 'chiltepin-core';\nimport { runSingle, type SingleFormat, type SingleResult } from './single.js';\nimport { templatesDir } from './init.js';\nimport { BLOCK_FAMILY, BLOCK_FAMILIES as DEMO_FAMILIES, type BlockFamily as DemoFamily } from 'chiltepin-core';\n\n/**\n * Filters the demo source down to one family of blocks.\n *\n * Mechanism: `parseDocument` yields ordered segments; markdown segments carry\n * their raw `.text` and typed segments carry the raw body `.raw` plus the fence\n * tag `.kind`, so the filtered doc is re-emitted losslessly — markdown segments\n * verbatim, typed segments as a rebuilt ` ```kind … ``` ` fence. The `meta`\n * cover is always kept; a markdown run (usually a `## heading` + lede) is kept\n * only when the typed block *immediately after it* is kept, so orphan headings\n * for filtered-out blocks are dropped.\n */\nfunction filterDemoSource(source: string, family: DemoFamily): string {\n const doc = parseDocument(source, 'demo');\n const label = DEMO_FAMILIES.find((f) => f.id === family)?.label ?? family;\n const out: string[] = [];\n let pendingMarkdown: string | undefined;\n for (const seg of doc.segments) {\n if (seg.kind === 'markdown') {\n // Only the run directly before a kept block survives — track the latest.\n pendingMarkdown = seg.text;\n continue;\n }\n const keep = seg.kind === 'meta' || BLOCK_FAMILY[seg.kind] === family;\n if (keep) {\n if (seg.kind === 'meta') {\n // Re-tag the cover so the filtered showcase names its family.\n out.push('```meta\\n' + retagMeta(seg.raw, label) + '\\n```');\n } else {\n if (pendingMarkdown !== undefined) out.push(pendingMarkdown.trim());\n out.push('```' + seg.kind + '\\n' + seg.raw + '\\n```');\n }\n }\n pendingMarkdown = undefined; // consumed or orphaned either way\n }\n return out.join('\\n\\n') + '\\n';\n}\n\n/** Rewrites the demo cover's `tag:` line to name the family being shown. */\nfunction retagMeta(raw: string, label: string): string {\n const tagged = `tag: DEMO · ${label.toUpperCase()}`;\n if (/^tag:.*$/m.test(raw)) return raw.replace(/^tag:.*$/m, tagged);\n return `${raw}\\n${tagged}`;\n}\n\n/** Renders the bundled demo doc to `format` and opens it (preview by default). */\nexport async function runDemo(opts: {\n readonly format?: SingleFormat;\n readonly preview?: boolean;\n /** Absolute output path (the caller resolves it) — disables preview. */\n readonly output?: string;\n /** Restrict the showcase to one block family. */\n readonly family?: DemoFamily;\n /** With `output`, replace a file that is not already an HTML export. */\n readonly force?: boolean;\n}): Promise<SingleResult> {\n const format = opts.format ?? 'html';\n let source = await readFile(join(templatesDir(), 'demo.md'), 'utf8');\n if (opts.family !== undefined) source = filterDemoSource(source, opts.family);\n\n // Drop the demo doc in its own temp dir and render it from there, so it\n // never touches the user's project.\n const dir = join(tmpdir(), 'chiltepin-demo');\n await mkdir(dir, { recursive: true });\n const input = join(dir, opts.family === undefined ? 'demo.md' : `demo-${opts.family}.md`);\n await writeFile(input, source, 'utf8');\n\n return runSingle({\n cwd: dir,\n input,\n format,\n ...(opts.output !== undefined ? { output: opts.output } : { preview: opts.preview ?? true }),\n ...(opts.force === true ? { force: true } : {}),\n });\n}\n","/**\n * Interactive family picker for bare `chiltepin demo` in a TTY (Ink). \"Everything\"\n * (the full showcase) comes first, then the 12 block families; `q`/escape\n * cancels without rendering.\n */\n\nimport React from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { BLOCK_TYPES, BLOCK_FAMILIES as DEMO_FAMILIES, familyBlocks, type BlockFamily as DemoFamily } from 'chiltepin-core';\n\nconst EVERYTHING = '__all__';\n\n/** What the picker resolved to: a family, or `undefined` for the full showcase. */\nexport interface DemoPick {\n readonly family?: DemoFamily;\n}\n\ninterface DemoAppProps {\n /** Called once on selection; not called when the user cancels. */\n readonly onPick: (pick: DemoPick) => void;\n}\n\nexport function DemoApp({ onPick }: DemoAppProps): React.JSX.Element {\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) exit();\n });\n\n const items = [\n { label: `Everything — the full showcase, all ${BLOCK_TYPES.length} blocks`, value: EVERYTHING },\n ...DEMO_FAMILIES.map((f) => ({\n label: `${f.label} — ${familyBlocks(f.id).length} blocks`,\n value: f.id as string,\n })),\n ];\n\n function pick(value: string): void {\n onPick(value === EVERYTHING ? {} : { family: value as DemoFamily });\n exit();\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n What do you want to see? <Text dimColor>(↑↓ move · enter to render · q to quit)</Text>\n </Text>\n <SelectInput items={items} onSelect={(item) => pick(item.value)} />\n </Box>\n );\n}\n","/**\n * Build manifest — the record of what `chiltepin build` generated, so the next build\n * can remove what it no longer generates.\n *\n * The prune rule: **a build deletes only the files the previous build recorded\n * as its own output.** Nothing else in the output directory is ever touched —\n * a `CNAME`, a `.nojekyll`, an `assets/` folder, a hand-placed `404.html` were\n * never in the manifest, so they survive every build.\n *\n * Degradation: an output directory with no manifest (built by an older\n * Chiltepin, or by something else entirely) is left completely alone. The build\n * writes its files, writes a manifest, and reports that it pruned nothing;\n * from the next build on, pruning works.\n */\n\nimport { readFile, rmdir, unlink, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\n/** File name of the manifest inside the output directory. */\nexport const MANIFEST_FILE = '.chiltepin-build.json';\n/** The pre-rename manifest name — read once so an existing site still prunes. */\nconst LEGACY_MANIFEST_FILE = '.avodado-build.json';\n\n/** On-disk shape. `files` are output-relative POSIX paths. */\ninterface BuildManifest {\n readonly version: 1;\n /** CLI version that wrote it — informational. */\n readonly generator: string;\n /** Every path this build wrote, output-relative. */\n readonly files: readonly string[];\n}\n\n/**\n * Reads the manifest in `outDir`. Returns `undefined` when it is absent,\n * unreadable, or not a manifest this version understands — every one of those\n * means \"prune nothing\".\n */\nexport async function readManifest(outDir: string): Promise<BuildManifest | undefined> {\n let raw: string;\n try {\n raw = await readFile(join(outDir, MANIFEST_FILE), 'utf8');\n } catch {\n try {\n raw = await readFile(join(outDir, LEGACY_MANIFEST_FILE), 'utf8');\n } catch {\n return undefined;\n }\n }\n try {\n const parsed = JSON.parse(raw) as Partial<BuildManifest>;\n if (parsed.version !== 1 || !Array.isArray(parsed.files)) return undefined;\n const files = parsed.files.filter((f): f is string => typeof f === 'string');\n return { version: 1, generator: String(parsed.generator ?? ''), files };\n } catch {\n return undefined;\n }\n}\n\n/** Writes the manifest for the files this build generated. */\nexport async function writeManifest(\n outDir: string,\n files: readonly string[],\n generator: string,\n): Promise<void> {\n const manifest: BuildManifest = { version: 1, generator, files: [...files].sort() };\n await writeFile(join(outDir, MANIFEST_FILE), JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n try {\n await unlink(join(outDir, LEGACY_MANIFEST_FILE)); // superseded by the file above\n } catch {\n /* none there — the common case */\n }\n}\n\n/** True when `abs` is inside `root` (and is not `root` itself). */\nfunction inside(root: string, abs: string): boolean {\n const rel = relative(root, abs);\n return rel !== '' && !rel.startsWith('..') && !rel.startsWith(sep);\n}\n\n/**\n * Removes files the previous build generated that this build did not.\n *\n * `previous` comes off disk, so every entry is re-checked: a path that escapes\n * `outDir` is ignored, and a missing file is a no-op. Directories left empty by\n * the removal are cleaned up, stopping at `outDir` itself.\n *\n * @returns The output-relative paths actually removed, sorted.\n */\nexport async function pruneStale(\n outDir: string,\n previous: readonly string[],\n current: ReadonlySet<string>,\n): Promise<string[]> {\n const root = resolve(outDir);\n const removed: string[] = [];\n const parents = new Set<string>();\n for (const rel of previous) {\n if (current.has(rel)) continue;\n const abs = resolve(root, rel);\n if (!inside(root, abs)) continue; // tampered manifest — never climb out\n try {\n await unlink(abs);\n } catch {\n continue; // already gone, or a directory — leave it\n }\n removed.push(rel);\n parents.add(dirname(abs));\n }\n // Drop directories the removal emptied, deepest first, never outDir itself.\n for (const dir of [...parents].sort((a, b) => b.length - a.length)) {\n let cur = dir;\n while (inside(root, cur)) {\n try {\n await rmdir(cur); // fails (and stops the climb) when not empty\n } catch {\n break;\n }\n cur = dirname(cur);\n }\n }\n removed.sort();\n return removed;\n}\n","/**\n * Site core shared by `chiltepin build` and `chiltepin serve` — pure functions, no I/O.\n *\n * {@link buildSite} turns a set of parsed documents into a multi-page static\n * site: one HTML page per doc (wrapped in a shell with a left nav sidebar), a\n * companion slide deck per doc at `<slug>.slides.html` (a Doc | Slides toggle\n * on each page links the two views), plus an `index.html` card grid built from\n * each doc's `meta`. Cross-doc reference\n * chips (`data-ref=\"doc#id\"`) are rewritten to relative `<slug>.html#id` links\n * using the {@link resolveRefs} graph.\n *\n * Diagnostics (schema + ref) are returned as values — the callers decide how\n * to surface them (`chiltepin build` warns, `chiltepin serve` shows an in-page banner).\n */\n\nimport {\n resolveRefs,\n validateDocument,\n type BlockDataMap,\n type Diagnostic,\n type Document,\n} from 'chiltepin-core';\nimport {\n buildThemeVars,\n DEFAULT_THEME,\n escapeHtml,\n FAVICON_LINK,\n houseCss,\n htmlRenderers,\n renderDocumentParts,\n type DocumentParts,\n type DocumentSection,\n toSlides,\n schemeMarkup,\n type ColorScheme,\n} from 'chiltepin-render';\nimport { guardRender } from './renderGuard.js';\n\n/** A loaded document ready for site rendering. */\nexport interface SiteDoc {\n /** Slug (path under the docs root without `.md`, e.g. `guides/api`). */\n readonly slug: string;\n /** Source file path relative to the project root (for diagnostics). */\n readonly file: string;\n /** The parsed document. */\n readonly doc: Document;\n}\n\n/** One rendered page of the site. */\nexport interface SitePage {\n /** Output path relative to the site root (`index.html`, `<slug>.html`, or\n * the doc's deck at `<slug>.slides.html`). */\n readonly path: string;\n /** Complete standalone HTML. */\n readonly html: string;\n /** Page title. */\n readonly title: string;\n}\n\n/** Options for {@link buildSite}. */\ninterface SiteOptions {\n /** Internal escape hatch: CSS-variable overrides emitted on `:root`. */\n readonly themeVars?: Readonly<Record<string, string>>;\n /** The pages' colour scheme (`dark` by default). */\n readonly colorScheme?: ColorScheme;\n /** Inject the live-reload `EventSource` script (serve only, never build). */\n readonly liveReload?: boolean;\n /** Build the rich index page: project TLDR, doc map grouped by tag, and a\n * cross-reference graph. On by default — `false` emits the plain card grid. */\n readonly richIndex?: boolean;\n}\n\n/** Result of {@link buildSite}. */\ninterface SiteResult {\n /** All pages: `index.html` first, then per doc the page + its slide deck. */\n readonly pages: readonly SitePage[];\n /** Schema + reference diagnostics across the whole doc set. */\n readonly diagnostics: readonly Diagnostic[];\n}\n\n/** Live-reload client (kept tiny; EventSource reconnects natively). */\nconst LIVE_RELOAD_SCRIPT = `<script>new EventSource('/__events').onmessage=()=>location.reload()</script>`;\n\n/**\n * Sidebar + index stylesheet in the editorial skin (`packages/render/DESIGN.md`):\n * role tokens only (`--paper`, `--ink`, `--muted`, `--soft`, `--rule`, …), so\n * the chrome follows the same light/dark sets the document does — those are\n * defined once, on `:root`, in the house CSS. Hairlines, no shadows, no filled\n * pills; small labels are mono eyebrows. Sticky sidebar that collapses to a\n * top list under 900px. Inlined into every page so pages stay self-contained.\n */\nconst SITE_CSS = `\nbody{margin:0;}\n.site{display:flex;align-items:flex-start;max-width:1440px;margin:0 auto;}\n.site-nav{position:sticky;top:0;flex:none;width:248px;max-height:100vh;overflow-y:auto;padding:28px 18px 48px;border-right:1px solid var(--rule);font-family:var(--font-body);font-size:13px;color:var(--ink);}\n.site-nav .nav-brand{display:block;font-family:var(--font-display);font-weight:600;font-size:14px;letter-spacing:.01em;color:var(--ink);text-decoration:none;padding:4px 8px;margin-bottom:6px;}\n.site-eyebrow{font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--soft);}\n.site-nav .nav-head{padding:10px 8px 6px;border-top:1px solid var(--rule);}\n.site-nav a{display:block;color:var(--ink);text-decoration:none;padding:4px 8px;border-radius:4px;line-height:1.45;}\n.site-nav a:hover{background:var(--paper-2);}\n.site-nav a.current{color:var(--ink);font-weight:600;background:var(--paper-2);box-shadow:inset 2px 0 0 var(--ink);}\n.site-nav .nav-sections{margin:2px 0 8px 12px;padding-left:10px;border-left:1px solid var(--rule);}\n.site-nav .nav-sections a{font-size:12px;color:var(--muted);}\n.site-nav .nav-sections a:hover{color:var(--ink);}\n.site-main{flex:1;min-width:0;}\n.site-main .docskin{padding-top:40px;}\n@media (max-width:900px){\n.site{display:block;}\n.site-nav{position:static;width:auto;max-height:none;border-right:0;border-bottom:1px solid var(--rule);padding:20px 24px;}\n}\n.idx-head{padding:16px 0 28px;margin-bottom:36px;border-bottom:1px solid var(--rule);}\n.idx-eyebrow{margin-bottom:10px;}\n.idx-title{font-family:var(--font-display);font-weight:700;font-size:clamp(32px,4.4vw,48px);line-height:1.1;letter-spacing:-.015em;color:var(--ink);margin:0;}\n.idx-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;}\n.idx-card{display:block;border:1px solid var(--rule-solid);border-radius:6px;background:var(--paper);padding:20px 22px 16px;text-decoration:none;color:var(--ink);box-shadow:none;}\n.idx-card:hover{border-color:var(--ink);}\n.idx-card .idx-tag{display:inline-block;font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;line-height:1.3;padding:2px 7px;border:1px solid var(--rule-solid);border-radius:2px;background:var(--paper);color:var(--muted);margin-bottom:12px;}\n.idx-card h2{font-family:var(--font-body);font-weight:600;font-size:16px;line-height:1.3;color:var(--ink);margin:0 0 6px;}\n.idx-card p{font-size:13px;line-height:1.55;color:var(--muted);margin:0 0 12px;}\n.idx-card .idx-slug{font-family:var(--font-mono);font-size:11px;color:var(--soft);}\n.site-main{position:relative;}\n.view-toggle{position:absolute;top:30px;right:32px;z-index:30;display:inline-flex;border:1px solid var(--rule-solid);border-radius:6px;background:var(--paper);overflow:hidden;font-family:var(--font-body);font-size:12px;font-weight:600;letter-spacing:.01em;box-shadow:none;}\n.view-toggle a{display:flex;align-items:center;padding:5px 14px;color:var(--muted);text-decoration:none;line-height:1.4;}\n.view-toggle a + a{border-left:1px solid var(--rule-solid);}\n.view-toggle a:hover{color:var(--ink);background:var(--paper-2);}\n.view-toggle a[aria-current]{background:var(--ink);color:var(--paper);}\n.view-toggle a[aria-current]:hover{background:var(--ink);color:var(--paper);}\n@media (max-width:900px){.view-toggle{top:14px;right:16px;}}\n`;\n\n/**\n * Floating \"Document ▸\" chip spliced into deck pages — top-right, out of the\n * way of the deck's own bottom nav bar; a paper chip with a hairline, no shadow.\n */\nconst DECK_BACK_CSS = `\n.deck-doc-link{position:fixed;top:14px;right:18px;z-index:20;display:inline-flex;align-items:center;gap:7px;\n padding:6px 14px;border:1px solid var(--rule-solid);border-radius:6px;\n background:var(--paper);\n font-family:var(--font-body);font-size:12px;font-weight:600;letter-spacing:.01em;color:var(--ink);\n text-decoration:none;box-shadow:none;}\n.deck-doc-link:hover{background:var(--paper-2);border-color:var(--ink);}\n@media print{.deck-doc-link{display:none;}}\n`;\n\n/** `../` prefix that climbs from a page at `slug` back to the site root. */\nfunction rootPrefix(slug: string): string {\n const depth = slug.split('/').length - 1;\n return '../'.repeat(depth);\n}\n\n/** Matches the ref-chip attribute pair as emitted by the renderers — the\n * attribute order (`data-ref` then `href`) is fixed at emission and locked by\n * render unit tests, so this anchored rewrite is safe over our own markup. */\nconst REF_CHIP_RE = / data-ref=\"([^\"]+)\" href=\"#[^\"]*\"/g;\n\n/** Same shape as core's `REF_RE`: optional doc part + `#` + id. */\nconst REF_RE = /^([\\w/.-]+)?#([\\w.-]+)$/;\n\n/**\n * Rewrites cross-doc ref chips in one page's HTML: `data-ref=\"doc#id\"` gets\n * `href=\"<relative>/doc.html#id\"`; same-doc refs keep `#id`; dangling refs\n * lose the `href` (the chip renders plain) but keep `data-ref`.\n */\nfunction rewriteRefs(\n html: string,\n slug: string,\n nodes: ReadonlyMap<string, { readonly doc: string }>,\n): string {\n const prefix = rootPrefix(slug);\n return html.replace(REF_CHIP_RE, (whole, ref: string) => {\n const m = REF_RE.exec(ref);\n if (m === null) return whole;\n const targetDoc = m[1] ?? slug;\n const id = m[2] ?? '';\n const node = nodes.get(id);\n if (node === undefined || node.doc !== targetDoc) return ` data-ref=\"${ref}\"`; // dangling\n if (node.doc === slug) return ` data-ref=\"${ref}\" href=\"#${id}\"`;\n return ` data-ref=\"${ref}\" href=\"${prefix}${node.doc}.html#${id}\"`;\n });\n}\n\n/** Nav entry for the sidebar doc list. */\ninterface NavDoc {\n readonly slug: string;\n readonly title: string;\n}\n\n/** Renders the left sidebar: all docs (current highlighted) + the current\n * doc's section list. `current === undefined` on the index page. */\nfunction sidebar(\n navDocs: readonly NavDoc[],\n current: string | undefined,\n sections: readonly DocumentSection[],\n): string {\n const prefix = current !== undefined ? rootPrefix(current) : '';\n const items = navDocs\n .map((d) => {\n const isCurrent = d.slug === current;\n const cls = isCurrent ? ' class=\"current\"' : '';\n const link = `<a${cls} href=\"${prefix}${escapeHtml(d.slug)}.html\">${escapeHtml(d.title)}</a>`;\n if (!isCurrent || sections.length === 0) return link;\n const secs = sections\n .map((s) => `<a href=\"#${s.id}\">${escapeHtml(s.title ?? s.label)}</a>`)\n .join('');\n return link + `<div class=\"nav-sections\">${secs}</div>`;\n })\n .join('');\n return (\n `<aside class=\"site-nav\">` +\n `<a class=\"nav-brand\" href=\"${prefix}index.html\">Documentation</a>` +\n `<div class=\"nav-head site-eyebrow\">Documents</div>` +\n `<nav>${items}</nav>` +\n `</aside>`\n );\n}\n\n/** Basename of a slug — deck/page siblings live in the same directory, so\n * their mutual links are plain basenames (correct at any nesting depth). */\nfunction slugBase(slug: string): string {\n return slug.split('/').pop() ?? slug;\n}\n\n/** Compact Doc | Slides segmented control shown on every doc page. */\nfunction viewToggle(slug: string): string {\n const base = escapeHtml(slugBase(slug));\n return (\n `<nav class=\"view-toggle\" aria-label=\"View as\">` +\n `<a aria-current=\"page\" href=\"${base}.html\">Doc</a>` +\n `<a href=\"${base}.slides.html\">Slides</a>` +\n `</nav>`\n );\n}\n\n/**\n * Dresses a standalone deck (from `chiltepin-render`'s `toSlides`) for the\n * site: splices a floating back-link pill — and, when serving, the same\n * live-reload script the doc pages get — just before `</body>`. String-splice\n * only; the deck markup itself is never modified.\n */\nfunction deckWithChrome(deckHtml: string, slug: string, liveReload: boolean): string {\n const base = escapeHtml(slugBase(slug));\n const pill = `<a class=\"deck-doc-link\" href=\"${base}.html\">Document <span aria-hidden=\"true\">▸</span></a>`;\n const chrome = `<style>${DECK_BACK_CSS}</style>${pill}${liveReload ? LIVE_RELOAD_SCRIPT : ''}`;\n return deckHtml\n .replace('</head>', `${FAVICON_LINK}\\n</head>`)\n .replace('</body>', `${chrome}</body>`);\n}\n\n/** Wraps a page's nav + main content into a standalone HTML document. */\nfunction pageShell(args: {\n readonly title: string;\n readonly css: string;\n readonly themeVars: string;\n readonly nav: string;\n readonly main: string;\n readonly liveReload: boolean;\n /** Doc pages only: the Doc | Slides control, pinned to the main column. */\n readonly toggle?: string;\n readonly colorScheme?: ColorScheme;\n}): string {\n const themeBlock = args.themeVars.length > 0 ? `<style>:root{${args.themeVars}}</style>` : '';\n const reload = args.liveReload ? LIVE_RELOAD_SCRIPT : '';\n // Dark is the look; the config's `colorScheme` stamps light or lets the OS\n // choose, the same way `renderDocument` does.\n const scheme = schemeMarkup(args.colorScheme);\n return (\n `<!doctype html>\\n` +\n `<html lang=\"en\"${scheme.stamp}>\\n` +\n `<head>\\n` +\n `<meta charset=\"utf-8\">\\n` +\n `<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\\n` +\n `<title>${escapeHtml(args.title)}</title>\\n` +\n `${FAVICON_LINK}\\n` +\n `<style>${args.css}</style>` +\n themeBlock +\n scheme.style +\n `<style>${SITE_CSS}</style>\\n` +\n `</head>\\n` +\n `<body>\\n` +\n `<div class=\"site\">\\n` +\n args.nav +\n `\\n<main class=\"site-main\">${args.toggle ?? ''}<div class=\"docskin\">${args.main}</div></main>\\n` +\n `</div>\\n` +\n reload +\n `</body>\\n` +\n `</html>\\n`\n );\n}\n\n/** Renders one index card (shared by the plain grid and the rich doc map).\n * `tagDisplay` overrides the tag pill text (rich doc map: first-seen casing\n * inside a group); the default renders `meta.tag` as written. */\nfunction indexCard(d: SiteDoc, tagDisplay?: string): string {\n const meta = d.doc.meta;\n const shownTag = tagDisplay ?? meta?.tag;\n const tag = shownTag !== undefined ? `<span class=\"idx-tag\">${escapeHtml(shownTag)}</span>` : '';\n const title = escapeHtml(meta?.title ?? d.slug);\n const sub = meta?.subtitle !== undefined ? `<p>${escapeHtml(meta.subtitle)}</p>` : '';\n return (\n `<a class=\"idx-card\" href=\"${escapeHtml(d.slug)}.html\">` +\n tag +\n `<h2>${title}</h2>` +\n sub +\n `<span class=\"idx-slug\">${escapeHtml(d.slug)}</span>` +\n `</a>`\n );\n}\n\n/** Renders the index page's meta-card grid. */\nfunction indexCards(docs: readonly SiteDoc[]): string {\n const cards = docs.map((d) => indexCard(d)).join('');\n return (\n `<div class=\"idx-head\">` +\n `<div class=\"idx-eyebrow site-eyebrow\">${docs.length} document${docs.length === 1 ? '' : 's'}</div>` +\n `<h1 class=\"idx-title\">Documentation</h1>` +\n `</div>` +\n `<div class=\"idx-grid\">${cards}</div>`\n );\n}\n\n// ─── Rich index (default; `--no-rich-index` opts out) ────────────────────────\n\n/**\n * Styles for the rich index only. Inlined into the index page's main column,\n * never into `SITE_CSS` — pages built with `--no-rich-index` stay\n * byte-identical to the pre-rich-index output.\n */\nconst RICH_INDEX_CSS = `\n.idx-tldr{display:grid;gap:5px;margin-top:16px;font-size:13px;line-height:1.55;color:var(--muted);}\n.idx-tldr a{color:var(--muted);text-decoration:none;}\n.idx-tldr a:hover{color:var(--ink);}\n.idx-tldr strong{font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--ink);}\n.idx-group{margin-bottom:40px;}\n.idx-group-head{display:flex;align-items:baseline;gap:10px;font-family:var(--font-body);font-weight:600;font-size:18px;color:var(--ink);margin:0 0 14px;padding-bottom:8px;border-bottom:1px solid var(--rule);}\n.idx-group-count{font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.14em;color:var(--soft);}\n.idx-graph{margin-top:8px;}\n.idx-graph-legend{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:6px;font-size:13px;}\n.idx-graph-legend a{color:var(--link);text-decoration:none;font-weight:600;}\n.idx-graph-legend a:hover{text-decoration:underline;}\n.idx-graph-legend .idx-slug{font-family:var(--font-mono);font-size:11px;color:var(--soft);margin-left:8px;}\n`;\n\n/** One group of docs on the rich index (a tag, a folder, or the fallback). */\ninterface IndexGroup {\n /** Display label — a meta tag as written, a folder name, or `Documents`. */\n readonly label: string;\n /** Anchor id on the group's section (`group-…`). */\n readonly anchor: string;\n readonly docs: readonly SiteDoc[];\n}\n\n/** First token of a compound tag badge, the family name:\n * `ADR · Accepted · 2026-06-13` → `ADR`. */\nfunction tagToken(tag: string): string {\n return (tag.split('·')[0] ?? tag).trim();\n}\n\n/** Grouping key + label: the first `meta.tag` token (case-insensitive), else\n * the doc's top folder under the docs root, else `Documents`. Keys are\n * namespaced so a tag and a same-named folder stay separate groups. */\nfunction groupOf(d: SiteDoc): { key: string; label: string } {\n const tag = d.doc.meta?.tag?.trim();\n if (tag !== undefined && tag.length > 0) {\n const token = tagToken(tag);\n if (token.length > 0) return { key: `tag:${token.toLowerCase()}`, label: token };\n }\n const slash = d.slug.indexOf('/');\n if (slash > 0) {\n const folder = d.slug.slice(0, slash);\n return { key: `dir:${folder.toLowerCase()}`, label: folder };\n }\n return { key: 'default', label: 'Documents' };\n}\n\n/** Groups docs for the rich index: largest group first, ties by label. */\nfunction groupDocs(docs: readonly SiteDoc[]): IndexGroup[] {\n const byKey = new Map<string, { label: string; docs: SiteDoc[] }>();\n for (const d of docs) {\n const { key, label } = groupOf(d);\n const g = byKey.get(key);\n if (g !== undefined) g.docs.push(d);\n else byKey.set(key, { label, docs: [d] });\n }\n const groups = [...byKey.values()].sort(\n (a, b) => b.docs.length - a.docs.length || (a.label < b.label ? -1 : 1),\n );\n const seen = new Set<string>();\n return groups.map((g) => {\n const base = `group-${g.label.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'docs'}`;\n let anchor = base;\n for (let n = 2; seen.has(anchor); n += 1) anchor = `${base}-${n}`;\n seen.add(anchor);\n return { label: g.label, anchor, docs: g.docs };\n });\n}\n\n/** TLDR digest: one line per group — its label and doc count. A group of one\n * also carries that doc's subtitle as its one-liner; a larger group does not\n * (one doc's subtitle does not describe the group). Meta fields and counts\n * only. */\nfunction tldrDigest(groups: readonly IndexGroup[]): string {\n const lines = groups\n .map((g) => {\n const sub = g.docs.length === 1 ? g.docs[0]?.doc.meta?.subtitle : undefined;\n const tail = sub !== undefined ? ` — ${escapeHtml(sub)}` : '';\n const count = `${g.docs.length} document${g.docs.length === 1 ? '' : 's'}`;\n return `<a href=\"#${g.anchor}\"><strong>${escapeHtml(g.label)}</strong> · ${count}${tail}</a>`;\n })\n .join('');\n return `<nav class=\"idx-tldr\">${lines}</nav>`;\n}\n\n/**\n * Renders the doc-to-doc cross-reference graph as a real `graph` block via\n * the `chiltepin-render` registry — the renderer owns all layout (auto-grid,\n * left-to-right). An edge A→B means a block in A references an id in B; the\n * reference count becomes the edge `weight` when above 1. Node click-through\n * is not in the graph schema, so a legend under the graph links each doc.\n * Returns `''` when no doc references another — the section is omitted.\n *\n * Fan-in: the shared `ortho` router now offsets entry ports per incoming edge, so arrowheads land at distinct points.\n */\nfunction crossRefGraphSection(\n docs: readonly SiteDoc[],\n refEdges: ReadonlyArray<{ readonly from: string; readonly to: string }>,\n): string {\n // Ref-graph endpoints are `doc#id` (or `doc@line` when the source block has\n // no id); ids and slugs never contain `#` or `@`, so the doc is the head.\n const counts = new Map<string, number>();\n for (const e of refEdges) {\n const from = e.from.split(/[#@]/, 1)[0] ?? '';\n const to = e.to.split('#', 1)[0] ?? '';\n if (from.length === 0 || to.length === 0 || from === to) continue;\n const key = `${from}\\u0000${to}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n if (counts.size === 0) return '';\n\n const involved = new Set<string>();\n for (const key of counts.keys()) {\n const [from, to] = key.split('\\u0000');\n if (from !== undefined) involved.add(from);\n if (to !== undefined) involved.add(to);\n }\n const graphDocs = docs.filter((d) => involved.has(d.slug));\n const data: BlockDataMap['graph'] = {\n title: 'Cross-references',\n nodes: graphDocs.map((d) => ({ id: d.slug, label: d.doc.meta?.title ?? d.slug })),\n edges: [...counts.entries()].map(([key, count]) => {\n const sep = key.indexOf('\\u0000');\n return {\n from: key.slice(0, sep),\n to: key.slice(sep + 1),\n ...(count > 1 ? { weight: count } : {}),\n };\n }),\n };\n const legend = graphDocs\n .map(\n (d) =>\n `<li><a href=\"${escapeHtml(d.slug)}.html\">${escapeHtml(d.doc.meta?.title ?? d.slug)}</a>` +\n `<span class=\"idx-slug\">${escapeHtml(d.slug)}</span></li>`,\n )\n .join('');\n return (\n `<section class=\"idx-graph\">` +\n htmlRenderers.graph(data) +\n `<ul class=\"idx-graph-legend\">${legend}</ul>` +\n `</section>`\n );\n}\n\n/** Renders one group's cards. Tags that differ only in case inside a group\n * display with the first-seen casing (`Guide` + `GUIDE` → both `Guide`). */\nfunction groupCards(g: IndexGroup): string {\n const firstSeen = new Map<string, string>();\n return g.docs\n .map((d) => {\n const tag = d.doc.meta?.tag;\n if (tag === undefined) return indexCard(d);\n const key = tag.trim().toLowerCase();\n const display = firstSeen.get(key) ?? tag;\n if (!firstSeen.has(key)) firstSeen.set(key, tag);\n return indexCard(d, display);\n })\n .join('');\n}\n\n/** Groups are informative only when docs actually share tags. Above this\n * singleton share, the doc map degrades to a restatement of the card grid —\n * so it (and the digest) is dropped for the plain flat grid. */\nconst SINGLETON_LIMIT = 0.6;\n\n/**\n * Renders the rich index: TLDR head, doc map grouped by tag/folder, and the\n * cross-reference graph. Deterministic — built only from the parsed docs.\n *\n * Degeneracy fallback: when more than {@link SINGLETON_LIMIT} of the groups\n * hold a single doc (every doc tagged uniquely), grouping adds nothing — the\n * page keeps the flat card grid with no digest and no group headers, and the\n * rich index contributes only the cross-reference graph section (if any).\n */\nfunction richIndexMain(\n docs: readonly SiteDoc[],\n refEdges: ReadonlyArray<{ readonly from: string; readonly to: string }>,\n): string {\n const groups = groupDocs(docs);\n const singletons = groups.filter((g) => g.docs.length === 1).length;\n const degenerate = groups.length > 0 && singletons / groups.length > SINGLETON_LIMIT;\n const head =\n `<div class=\"idx-head\">` +\n `<div class=\"idx-eyebrow site-eyebrow\">${docs.length} document${docs.length === 1 ? '' : 's'}</div>` +\n `<h1 class=\"idx-title\">Documentation</h1>` +\n (groups.length > 0 && !degenerate ? tldrDigest(groups) : '') +\n `</div>`;\n const body = degenerate\n ? `<div class=\"idx-grid\">${docs.map((d) => indexCard(d)).join('')}</div>`\n : groups\n .map(\n (g) =>\n `<section class=\"idx-group\" id=\"${g.anchor}\">` +\n `<h2 class=\"idx-group-head\">${escapeHtml(g.label)}` +\n `<span class=\"idx-group-count\">${g.docs.length}</span></h2>` +\n `<div class=\"idx-grid\">${groupCards(g)}</div>` +\n `</section>`,\n )\n .join('');\n return `<style>${RICH_INDEX_CSS}</style>` + head + body + crossRefGraphSection(docs, refEdges);\n}\n\n/** The body of a placeholder page for a document whose render threw. */\nfunction failedBody(d: SiteDoc, message: string): string {\n return (\n `<div class=\"idx-head\">` +\n `<div class=\"idx-eyebrow site-eyebrow\">Render failed</div>` +\n `<h1 class=\"idx-title\">${escapeHtml(d.doc.meta?.title ?? d.slug)}</h1>` +\n `</div>` +\n `<p>${escapeHtml(d.file)} could not be rendered.</p>` +\n `<pre><code>${escapeHtml(message)}</code></pre>`\n );\n}\n\n/** Stand-in parts for a document whose render threw — same shape, no content. */\nfunction failedParts(d: SiteDoc, message: string): DocumentParts {\n return {\n css: houseCss,\n themeVars: '',\n body: failedBody(d, message),\n title: d.doc.meta?.title ?? d.slug,\n sections: [],\n };\n}\n\n/**\n * Builds the whole site in memory: `index.html` plus, per doc, one page and\n * one slide deck, with the sidebar nav and cross-doc ref links resolved.\n * Pure — no file writes.\n *\n * A renderer that throws is contained: that document gets a placeholder page\n * and an `E_RENDER` diagnostic naming the block, and every other document\n * still builds.\n */\nexport function buildSite(docs: readonly SiteDoc[], opts: SiteOptions = {}): SiteResult {\n const diagnostics: Diagnostic[] = [];\n for (const d of docs) diagnostics.push(...validateDocument(d.doc, d.file));\n const resolved = resolveRefs(docs.map((d) => ({ doc: d.doc, file: d.file })));\n diagnostics.push(...resolved.diagnostics);\n\n const themeOpts = {\n ...(opts.themeVars !== undefined ? { themeVars: opts.themeVars } : {}),\n ...(opts.colorScheme !== undefined ? { colorScheme: opts.colorScheme } : {}),\n };\n const liveReload = opts.liveReload === true;\n\n // A renderer that throws takes down its own document, not the build. The\n // diagnostic names the file and the offending block; the page it would have\n // produced becomes a placeholder carrying the same message, so the site keeps\n // the same URLs and nothing 404s while the author fixes the block.\n const rendered = docs.map((d) => {\n const guarded = guardRender(d.doc, d.file, 'page', () =>\n renderDocumentParts(d.doc, themeOpts),\n );\n if (guarded.ok) return { doc: d, parts: guarded.value, failed: false };\n diagnostics.push(guarded.diagnostic);\n return { doc: d, parts: failedParts(d, guarded.diagnostic.message), failed: true };\n });\n const navDocs: NavDoc[] = rendered.map((r) => ({\n slug: r.doc.slug,\n title: r.doc.doc.meta?.title ?? r.doc.slug,\n }));\n // The index reuses the first doc's css/themeVars (identical for every doc);\n // an empty doc set still gets a styled index from the skin directly.\n const first = rendered[0];\n const css = first?.parts.css ?? houseCss;\n const themeVars = first?.parts.themeVars ?? buildThemeVars(DEFAULT_THEME, opts.themeVars);\n\n const pages: SitePage[] = [];\n pages.push({\n path: 'index.html',\n title: 'Documentation',\n html: pageShell({\n title: 'Documentation',\n css,\n themeVars,\n nav: sidebar(navDocs, undefined, []),\n main:\n opts.richIndex !== false\n ? richIndexMain(docs, resolved.graph.edges)\n : indexCards(docs),\n liveReload,\n ...(opts.colorScheme !== undefined ? { colorScheme: opts.colorScheme } : {}),\n }),\n });\n\n for (const { doc, parts, failed } of rendered) {\n const shell = pageShell({\n title: parts.title,\n css: parts.css,\n themeVars: parts.themeVars,\n nav: sidebar(navDocs, doc.slug, parts.sections),\n main: parts.body,\n liveReload,\n ...(opts.colorScheme !== undefined ? { colorScheme: opts.colorScheme } : {}),\n toggle: viewToggle(doc.slug),\n });\n pages.push({\n path: `${doc.slug}.html`,\n title: parts.title,\n html: rewriteRefs(shell, doc.slug, resolved.graph.nodes),\n });\n // Every doc also ships as a slide deck, linked from the page's toggle. A\n // document whose page already failed is not re-rendered as slides — the\n // deck would fail the same way, slowly, and say nothing new.\n let deckHtml: string | undefined;\n let deckError = 'The page could not be rendered.';\n if (!failed) {\n const deck = guardRender(doc.doc, doc.file, 'slide deck', () =>\n deckWithChrome(toSlides(doc.doc, themeOpts), doc.slug, liveReload),\n );\n if (deck.ok) deckHtml = deck.value;\n else {\n diagnostics.push(deck.diagnostic);\n deckError = deck.diagnostic.message;\n }\n }\n pages.push({\n path: `${doc.slug}.slides.html`,\n title: `${parts.title} — Slides`,\n html:\n deckHtml ??\n pageShell({\n title: `${parts.title} — Slides`,\n css: parts.css,\n themeVars: parts.themeVars,\n nav: sidebar(navDocs, doc.slug, []),\n main: failedBody(doc, deckError),\n liveReload,\n ...(opts.colorScheme !== undefined ? { colorScheme: opts.colorScheme } : {}),\n }),\n });\n }\n\n return { pages, diagnostics };\n}\n","/**\n * `chiltepin build` — render every doc into a static HTML site on disk.\n *\n * Loads config (docsDir/outDir) and docs, builds the site via\n * {@link buildSite}, and writes `index.html` plus one page and one slide\n * deck (`<slug>.slides.html`) per doc under the out directory (nested slugs\n * keep their directories).\n *\n * The build then **prunes**: a file the previous build recorded in its manifest\n * (`.chiltepin-build.json`) and this build did not generate is deleted, so a doc\n * removed from `docs/` stops being served. Only manifest-listed files are\n * removed — anything else in the output directory (a `CNAME`, an `assets/`\n * folder) is never touched, and an output directory with no manifest is left\n * entirely alone.\n *\n * Diagnostics are returned for the CLI to print. Schema and reference findings\n * are **warnings** — `chiltepin check` remains the CI gate. A renderer that throws is\n * an `E_RENDER` error: that document gets a placeholder page, the rest of the\n * build finishes, and the exit code is 1.\n */\n\nimport { mkdir, readdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { parseDocument, type Diagnostic } from 'chiltepin-core';\nimport { loadConfig } from '../io/config.js';\nimport { encodingDiagnostics, loadDocs } from '../io/files.js';\nimport { readManifest, writeManifest, pruneStale, MANIFEST_FILE } from '../io/manifest.js';\nimport { cliVersion } from '../io/version.js';\nimport { buildSite, type SiteDoc } from './site.js';\n\n/** Inputs to {@link runBuild}. */\ninterface BuildOptions {\n /** Project root. */\n readonly cwd: string;\n /** Output directory override (defaults to config `outDir`). */\n readonly out?: string;\n /** Build the rich index page. On by default; `--no-rich-index` (or config\n * `richIndex: false`) switches to the plain card grid. Unset falls back to\n * the config value. */\n readonly richIndex?: boolean;\n}\n\n/** Result of {@link runBuild}. */\ninterface BuildResult {\n /** Absolute output directory. */\n readonly outDir: string;\n /** Output directory relative to cwd (for display). */\n readonly outDirRel: string;\n /** Written pages with byte sizes. */\n readonly pages: readonly { readonly path: string; readonly bytes: number }[];\n /** Output-relative paths of stale files this build removed. */\n readonly removed: readonly string[];\n /**\n * True when the output directory held files but no manifest, so this build\n * pruned nothing. The next build has a manifest and prunes normally.\n */\n readonly pruneDeferred: boolean;\n /** Schema, ref, encoding, and render diagnostics. */\n readonly diagnostics: readonly Diagnostic[];\n /** 0, or 1 when a document failed to render. */\n readonly exitCode: number;\n}\n\n/** Builds the docs site and writes it under the out directory. */\nexport async function runBuild(opts: BuildOptions): Promise<BuildResult> {\n const config = await loadConfig(opts.cwd);\n const outDir = resolve(opts.cwd, opts.out ?? config.outDir);\n const files = await loadDocs([`${config.docsDir}/**/*.md`], opts.cwd, config.docsDir);\n const docs: SiteDoc[] = files\n .filter((f) => f.encodingError === undefined)\n .map((f) => ({\n slug: f.slug,\n file: f.file,\n doc: parseDocument(f.source, f.slug),\n }));\n\n const site = buildSite(docs, { richIndex: opts.richIndex ?? config.richIndex, colorScheme: config.colorScheme });\n const diagnostics: Diagnostic[] = [...encodingDiagnostics(files), ...site.diagnostics];\n\n // Read the previous manifest before writing, so a page this build also\n // generates is never a prune candidate.\n const previous = await readManifest(outDir);\n\n const pages: { path: string; bytes: number }[] = [];\n for (const page of site.pages) {\n const abs = join(outDir, page.path);\n await mkdir(dirname(abs), { recursive: true });\n await writeFile(abs, page.html, 'utf8');\n pages.push({ path: page.path, bytes: page.html.length });\n }\n\n const generated = site.pages.map((p) => p.path);\n const removed =\n previous === undefined ? [] : await pruneStale(outDir, previous.files, new Set(generated));\n await writeManifest(outDir, generated, `chiltepin ${cliVersion()}`);\n\n return {\n outDir,\n outDirRel: relative(opts.cwd, outDir) || '.',\n pages,\n removed,\n pruneDeferred: previous === undefined && (await hadContent(outDir, generated)),\n diagnostics,\n exitCode: diagnostics.some((d) => d.code === 'E_RENDER') ? 1 : 0,\n };\n}\n\n/**\n * True when the output directory already held files this build did not\n * generate — the only case where a missing manifest is worth mentioning.\n * Called after the write, so the just-written pages are excluded by name.\n */\nasync function hadContent(outDir: string, generated: readonly string[]): Promise<boolean> {\n const own = new Set<string | undefined>([\n ...generated.map((p) => p.split('/')[0]),\n MANIFEST_FILE,\n ]);\n try {\n const entries = await readdir(outDir);\n return entries.some((e) => !own.has(e));\n } catch {\n return false;\n }\n}\n","/**\n * Shared file-watching helpers for the long-running commands (`chiltepin serve`,\n * `chiltepin studio`).\n *\n * {@link createDocsWatcher} watches a docs directory recursively, with a\n * per-directory fallback for platforms without recursive `fs.watch` (one\n * non-recursive watcher per subdirectory, re-walked on {@link DocsWatcher.resync}\n * so new directories get picked up). {@link createConfigWatcher} watches the\n * project root and fires only for `chiltepin.config.*` files.\n *\n * Watcher errors never propagate — a vanished directory just stops being\n * watched until the next resync.\n */\n\nimport { watch, readdirSync, existsSync, type FSWatcher } from 'node:fs';\nimport { join } from 'node:path';\n\n/** A running docs watcher. */\ninterface DocsWatcher {\n /** Stops all underlying watchers. Idempotent. */\n close(): void;\n /**\n * Re-walks the directory tree so newly created subdirectories get watched.\n * No-op while the recursive watcher is active (it covers new dirs itself);\n * call after every event batch to keep the fallback mode complete.\n */\n resync(): void;\n}\n\n/** A running project-root config watcher. */\nexport interface ConfigWatcher {\n /** Stops the watcher. Idempotent. */\n close(): void;\n}\n\n/** All directories under `root`, including `root` itself (for the watch fallback). */\nfunction walkDirs(root: string): string[] {\n const out: string[] = [root];\n const walk = (dir: string): void => {\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const p = join(dir, e.name);\n out.push(p);\n walk(p);\n }\n };\n walk(root);\n return out;\n}\n\n/**\n * Watches `dirAbs` recursively, falling back to one non-recursive watcher per\n * subdirectory when recursive watch is unsupported (or errors later).\n *\n * `onEvent` receives the absolute path of the changed entry when the platform\n * reports a filename, else `undefined`. If `dirAbs` doesn't exist, the\n * returned watcher is inert.\n */\nexport function createDocsWatcher(\n dirAbs: string,\n onEvent: (absPath?: string) => void,\n): DocsWatcher {\n const dirWatchers = new Map<string, FSWatcher>();\n let rootWatcher: FSWatcher | undefined;\n let usingFallback = false;\n\n /** Per-directory fallback: one non-recursive watcher per subdir. */\n const syncDirWatchers = (): void => {\n const dirs = new Set(walkDirs(dirAbs));\n for (const [dir, w] of dirWatchers) {\n if (!dirs.has(dir)) {\n w.close();\n dirWatchers.delete(dir);\n }\n }\n for (const dir of dirs) {\n if (dirWatchers.has(dir)) continue;\n try {\n const w = watch(dir, (_event, filename) => {\n onEvent(filename === null ? undefined : join(dir, filename));\n });\n w.on('error', () => dirWatchers.delete(dir));\n dirWatchers.set(dir, w);\n } catch {\n /* directory vanished between walk and watch — the next resync catches up */\n }\n }\n };\n\n if (existsSync(dirAbs)) {\n try {\n rootWatcher = watch(dirAbs, { recursive: true }, (_event, filename) => {\n onEvent(filename === null ? undefined : join(dirAbs, filename));\n });\n // An async watcher error (e.g. the dir vanished) must not crash the server.\n rootWatcher.on('error', () => {\n rootWatcher = undefined;\n usingFallback = true;\n syncDirWatchers();\n });\n } catch {\n // ERR_FEATURE_UNAVAILABLE_ON_PLATFORM (recursive watch unsupported).\n usingFallback = true;\n syncDirWatchers();\n }\n }\n\n return {\n resync(): void {\n if (usingFallback) syncDirWatchers();\n },\n close(): void {\n rootWatcher?.close();\n for (const w of dirWatchers.values()) w.close();\n dirWatchers.clear();\n },\n };\n}\n\n/**\n * Watches the project root (non-recursively, filtering by name so a config\n * file created after startup counts) and fires `onEvent` for every\n * `chiltepin.config.*` (or legacy `avodado.config.*`) change. Inert (but valid) when `cwd` can't be watched.\n */\nexport function createConfigWatcher(cwd: string, onEvent: () => void): ConfigWatcher {\n let watcher: FSWatcher | undefined;\n if (existsSync(cwd)) {\n try {\n watcher = watch(cwd, (_event, filename) => {\n if (filename !== null && /^(chiltepin|avodado)\\.config\\./.test(filename)) onEvent();\n });\n watcher.on('error', () => {\n watcher?.close();\n watcher = undefined;\n });\n } catch {\n /* vanished between existsSync and watch — stay inert */\n }\n }\n return {\n close(): void {\n watcher?.close();\n watcher = undefined;\n },\n };\n}\n","/**\n * `chiltepin serve` — zero-dependency local dev server for the docs site.\n *\n * Serves the same site as `chiltepin build`, but from memory: `node:http` routes\n * `/` → index, `/<slug>.html` → page, and `/__events` → a Server-Sent-Events\n * stream that pushes `reload` after every rebuild (each served page carries a\n * tiny injected `EventSource` script — serve only, never in build output).\n *\n * Watching (shared helpers in `../io/watch.js`): recursive `fs.watch` on the\n * docs dir with a per-directory fallback for platforms without recursive\n * watch, plus a non-recursive watch on the project root for\n * `chiltepin.config.*`. Rebuilds are debounced\n * (150 ms) and never crash the server — a bad save shows an in-page\n * diagnostics banner instead.\n *\n * {@link runServe}'s promise resolves only on SIGINT/SIGTERM: `bin.ts` awaits\n * `main()` and then exits, so serve must block until the user stops it.\n */\n\nimport { createServer, type ServerResponse } from 'node:http';\nimport { resolve } from 'node:path';\nimport open from 'open';\nimport { parseDocument, type Diagnostic } from 'chiltepin-core';\nimport { escapeHtml } from 'chiltepin-render';\nimport { loadConfig } from '../io/config.js';\nimport { loadDocs } from '../io/files.js';\nimport { createDocsWatcher, createConfigWatcher } from '../io/watch.js';\nimport { buildSite, type SiteDoc, type SitePage } from './site.js';\n\n/** Inputs to {@link runServe}. */\ninterface ServeOptions {\n /** Project root. */\n readonly cwd: string;\n /** Port to listen on. `0` = ephemeral (the actual port is printed). */\n readonly port: number;\n /** Open the browser once the server is up. */\n readonly open: boolean;\n /** Serve the rich index page. On by default; `--no-rich-index` (or config\n * `richIndex: false`) switches to the plain card grid. Unset falls back to\n * the config value. */\n readonly richIndex?: boolean;\n}\n\nconst DEBOUNCE_MS = 150;\nconst HEARTBEAT_MS = 25_000;\nconst MAX_BANNER_ITEMS = 4;\n\n/** Formats one diagnostic for the in-page banner. */\nfunction fmtDiag(d: Diagnostic): string {\n const loc = d.line !== undefined ? `${d.file}:${d.line}` : d.file;\n return `${loc} ${d.code} ${d.message}`;\n}\n\n/** Fixed-position banner listing the first few diagnostics (or a fatal error). */\nfunction bannerHtml(diagnostics: readonly Diagnostic[], fatal: string | undefined): string {\n const items = fatal !== undefined ? [fatal] : diagnostics.map(fmtDiag);\n if (items.length === 0) return '';\n const isError = fatal !== undefined || diagnostics.some((d) => d.level === 'error');\n const bg = isError ? '#7f1d1d' : '#78350f';\n const shown = items.slice(0, MAX_BANNER_ITEMS);\n const more = items.length - shown.length;\n const rows = shown.map((t) => `<div>${escapeHtml(t)}</div>`).join('');\n const moreRow = more > 0 ? `<div style=\"opacity:.75\">…and ${more} more</div>` : '';\n return (\n `<div id=\"chiltepin-diagnostics\" style=\"position:fixed;left:0;right:0;bottom:0;z-index:2147483647;` +\n `background:${bg};color:#fff;font:12px/1.6 ui-monospace,Menlo,Consolas,monospace;` +\n `padding:10px 18px;box-shadow:0 -2px 10px rgba(0,0,0,.3);white-space:pre-wrap;\">` +\n `<div style=\"font-weight:700;letter-spacing:.06em;text-transform:uppercase;font-size:10px;` +\n `opacity:.85;margin-bottom:4px;\">chiltepin — ${isError ? 'errors' : 'warnings'}</div>` +\n rows +\n moreRow +\n `</div>`\n );\n}\n\n/**\n * Starts the dev server. The returned promise resolves only after SIGINT or\n * SIGTERM (handlers close the server first), keeping the process alive.\n */\nexport async function runServe(opts: ServeOptions): Promise<void> {\n const config = await loadConfig(opts.cwd);\n const docsDirAbs = resolve(opts.cwd, config.docsDir);\n\n const state: {\n pages: ReadonlyMap<string, SitePage>;\n diagnostics: readonly Diagnostic[];\n fatal: string | undefined;\n } = { pages: new Map(), diagnostics: [], fatal: undefined };\n\n const rebuild = async (): Promise<void> => {\n try {\n const files = await loadDocs([`${config.docsDir}/**/*.md`], opts.cwd, config.docsDir);\n const docs: SiteDoc[] = files.map((f) => ({\n slug: f.slug,\n file: f.file,\n doc: parseDocument(f.source, f.slug),\n }));\n const site = buildSite(docs, {\n colorScheme: config.colorScheme,\n liveReload: true,\n richIndex: opts.richIndex ?? config.richIndex,\n });\n const next = new Map<string, SitePage>();\n for (const p of site.pages) next.set(p.path, p);\n state.pages = next;\n state.diagnostics = site.diagnostics;\n state.fatal = undefined;\n } catch (err) {\n // Never crash on a bad save — keep the last good site and show a banner.\n state.fatal = err instanceof Error ? err.message : String(err);\n }\n };\n await rebuild();\n\n // ── HTTP server ────────────────────────────────────────────────────────────\n const sseClients = new Set<ServerResponse>();\n\n const server = createServer((req, res) => {\n const url = (req.url ?? '/').split('?')[0] ?? '/';\n\n if (url === '/__events') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-store',\n Connection: 'keep-alive',\n });\n res.write(':connected\\n\\n');\n sseClients.add(res);\n req.on('close', () => sseClients.delete(res));\n return;\n }\n\n let path: string;\n try {\n path = url === '/' ? 'index.html' : decodeURIComponent(url.replace(/^\\//, ''));\n } catch {\n path = 'index.html';\n }\n const page = state.pages.get(path);\n if (page === undefined) {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end(`404 — no page at ${url}\\n`);\n return;\n }\n // Diagnostics banner rides on every page while problems exist — including\n // deck pages: it overlays the deck's bottom nav bar, but errors must stay\n // visible in either view and keyboard navigation still works.\n const banner = bannerHtml(state.diagnostics, state.fatal);\n const html = banner === '' ? page.html : page.html.replace('<body>', `<body>\\n${banner}`);\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });\n res.end(html);\n });\n\n const heartbeat = setInterval(() => {\n for (const c of sseClients) c.write(':heartbeat\\n\\n');\n }, HEARTBEAT_MS);\n heartbeat.unref();\n\n const broadcastReload = (): void => {\n for (const c of sseClients) c.write('data: reload\\n\\n');\n };\n\n // ── Watching ───────────────────────────────────────────────────────────────\n let debounce: NodeJS.Timeout | undefined;\n\n const onFsEvent = (): void => {\n if (debounce !== undefined) clearTimeout(debounce);\n debounce = setTimeout(() => {\n void (async () => {\n await rebuild();\n docsWatcher.resync(); // fallback mode: pick up new directories\n broadcastReload();\n })();\n }, DEBOUNCE_MS);\n };\n\n const docsWatcher = createDocsWatcher(docsDirAbs, onFsEvent);\n // Config files live at the project root: watch it non-recursively and\n // filter, so files created after startup are covered too.\n const configWatcher = createConfigWatcher(opts.cwd, onFsEvent);\n\n // ── Listen + lifecycle ─────────────────────────────────────────────────────\n await new Promise<void>((ready, fail) => {\n server.once('error', fail);\n server.listen(opts.port, () => {\n server.removeListener('error', fail);\n ready();\n });\n });\n const address = server.address();\n const port = address !== null && typeof address === 'object' ? address.port : opts.port;\n const url = `http://localhost:${port}`;\n console.log(`Serving ${config.docsDir}/ at ${url} (Ctrl-C to stop)`);\n if (opts.open) await open(url);\n\n await new Promise<void>((done) => {\n let closed = false;\n const shutdown = (): void => {\n if (closed) return;\n closed = true;\n if (debounce !== undefined) clearTimeout(debounce);\n clearInterval(heartbeat);\n docsWatcher.close();\n configWatcher.close();\n for (const c of sseClients) c.end();\n server.close(() => done());\n server.closeAllConnections();\n // Safety net: resolve even if a straggling socket stalls `close`.\n setTimeout(done, 1_000).unref();\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n}\n","/**\n * `chiltepin studio` — local file-bridge server for the visual editor.\n *\n * For editing, this does no server-side rendering: the studio web app\n * (`chiltepin-studio`, loaded lazily) renders in the browser and talks to a\n * small JSON API here — list docs, read a doc's raw source, write it back.\n * The Markdown files on disk stay the single source of truth: writes are\n * atomic (temp file + rename), LF-normalized, and guarded by a content hash\n * (`baseHash`) so concurrent edits surface as a 409 instead of silently\n * clobbering each other.\n *\n * The BUILT docs site is also mounted here, under `/site/…` (`/site/` →\n * index, `/site/<slug>.html`, `/site/<slug>.slides.html`): the same\n * in-memory {@link buildSite} pages `chiltepin serve` produces, built lazily on the\n * first `/site` request and invalidated by the same debounced fs events that\n * feed `/__events`. The pages' live-reload script targets `/__events` — the\n * same origin here — so they reload on external changes with zero changes to\n * the page markup. This is what the studio's Site mode iframes.\n *\n * The server binds 127.0.0.1 only — it writes files, so it must never be\n * reachable from the network. `/__events` is the same SSE channel as serve's,\n * but with typed JSON payloads: `{\"type\":\"fs\",\"slug\",\"hash\"}` when a doc\n * changes on disk (the studio's own writes are filtered out via a\n * recent-writes map) and `{\"type\":\"meta\"}` when config files change.\n * CORS headers are deliberately absent: in production the app is served from\n * this same origin, and in development the Vite proxy forwards `/api` and\n * `/__events` so the browser still sees a same-origin API.\n *\n * {@link runStudio}'s promise resolves only on SIGINT/SIGTERM: `bin.ts` awaits\n * `main()` and then exits, so studio must block until the user stops it.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { createHash, randomBytes } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';\nimport { basename, dirname, extname, join, relative, resolve, sep } from 'node:path';\nimport open from 'open';\nimport { parseDocument, validateDocument } from 'chiltepin-core';\nimport { loadConfig } from '../io/config.js';\nimport { loadDocs } from '../io/files.js';\nimport { toPdf } from '../io/pdf.js';\nimport { cliVersion } from '../io/version.js';\nimport { createDocsWatcher, createConfigWatcher } from '../io/watch.js';\nimport { buildSite, type SiteDoc, type SitePage } from './site.js';\n\n/** Inputs to {@link runStudio}. */\ninterface StudioOptions {\n /** Project root. */\n readonly cwd: string;\n /** Port to listen on. `0` = ephemeral (the actual port is printed). */\n readonly port: number;\n /** Open the browser once the server is up. */\n readonly open: boolean;\n}\n\nconst DEBOUNCE_MS = 150;\nconst HEARTBEAT_MS = 25_000;\nconst MAX_BODY_BYTES = 10 * 1024 * 1024;\n\n/** Normalizes CRLF / lone-CR line endings to LF (hashing + writes both use this). */\nconst normalizeLf = (s: string): string => s.replace(/\\r\\n?/g, '\\n');\n\n/** sha256 hex of an (already LF-normalized) source string. */\nconst hashOf = (s: string): string => createHash('sha256').update(s, 'utf8').digest('hex');\n\n/** Writes a JSON response. Every API route answers through this. */\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });\n res.end(JSON.stringify(body));\n}\n\n/**\n * Buffers a request body up to `limit` bytes. Returns `null` when the cap is\n * exceeded (the rest of the stream is drained so a 413 can still be sent).\n */\nfunction readBody(req: IncomingMessage, limit: number): Promise<Buffer | null> {\n return new Promise((done) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let overflowed = false;\n req.on('data', (chunk: Buffer) => {\n if (overflowed) return; // keep draining, keep nothing\n total += chunk.length;\n if (total > limit) {\n overflowed = true;\n chunks.length = 0;\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => done(overflowed ? null : Buffer.concat(chunks)));\n req.on('error', () => done(null));\n });\n}\n\n/** Result of resolving an `/api/doc/<slug…>` remainder to a path on disk. */\ntype DocPathResult =\n | { readonly kind: 'ok'; readonly slug: string; readonly abs: string }\n | { readonly kind: 'bad' } // undecodable / empty slug → 400\n | { readonly kind: 'forbidden' }; // escapes the docs dir → 403\n\n/**\n * Decodes a slug (may contain `/`) and resolves it under the docs dir.\n * SECURITY: the resolved path must stay inside `docsDirAbs` — `..` segments,\n * encoded or not, are rejected before any file I/O happens.\n */\nfunction resolveDocPath(docsDirAbs: string, remainder: string): DocPathResult {\n let slug: string;\n try {\n slug = decodeURIComponent(remainder);\n } catch {\n return { kind: 'bad' };\n }\n if (slug === '') return { kind: 'bad' };\n const abs = resolve(join(docsDirAbs, slug + '.md'));\n if (!abs.startsWith(docsDirAbs + sep)) return { kind: 'forbidden' };\n return { kind: 'ok', slug, abs };\n}\n\n/** File extension → Content-Type for the bundled studio assets. */\nconst MIME: Readonly<Record<string, string>> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.woff2': 'font/woff2',\n '.json': 'application/json',\n '.map': 'application/json',\n};\n\n/** Shown at `/` when the optional `chiltepin-studio` assets aren't installed. */\nconst FALLBACK_HTML =\n '<!doctype html><html><head><meta charset=\"utf-8\"><title>Chiltepin Studio</title></head>' +\n '<body style=\"font:16px/1.6 system-ui,sans-serif;max-width:38rem;margin:4rem auto;padding:0 1rem;\">' +\n '<h1>Chiltepin Studio</h1>' +\n '<p>The studio web app (<code>chiltepin-studio</code>) is not installed, so there is ' +\n 'nothing to show here. Reinstall <code>chiltepin</code> to get the bundled assets.</p>' +\n '<p>The file-bridge API is still running: <code>/api/meta</code>, <code>/api/docs</code>, ' +\n '<code>/api/doc/<slug></code> and the <code>/__events</code> stream all work.</p>' +\n '</body></html>';\n\n/**\n * Starts the studio file-bridge server. The returned promise resolves only\n * after SIGINT or SIGTERM (handlers close the server first), keeping the\n * process alive.\n */\nexport async function runStudio(opts: StudioOptions): Promise<void> {\n const config = await loadConfig(opts.cwd);\n const docsDirAbs = resolve(opts.cwd, config.docsDir);\n /** slug → hash of the studio's own last write, so its fs echo isn't rebroadcast. */\n const recentWrites = new Map<string, string>();\n\n // The studio web app is an optional add-on (wired as a real dependency in a\n // later workstream): import it lazily, once, and degrade to a fallback page\n // — never a crash — when it's absent. `null` = tried and failed.\n let assetsRootPromise: Promise<string | null> | undefined;\n const assetsRoot = (): Promise<string | null> => {\n assetsRootPromise ??= import('chiltepin-studio')\n .then((mod) => resolve(mod.assetsPath()))\n .catch(() => null);\n return assetsRootPromise;\n };\n\n // ── Built site (Site mode) ─────────────────────────────────────────────────\n // Lazy: nothing is rendered until the first /site request; after that the\n // page map is reused until a docs/config fs event invalidates it. A rebuild\n // that throws (e.g. a half-saved doc) keeps serving the last good site.\n let sitePages: ReadonlyMap<string, SitePage> | null = null; // last good build\n let siteFresh = false; // false = rebuild before the next /site response\n let siteBuild: Promise<ReadonlyMap<string, SitePage>> | null = null;\n\n const rebuildSite = async (): Promise<ReadonlyMap<string, SitePage>> => {\n const files = await loadDocs([`${config.docsDir}/**/*.md`], opts.cwd, config.docsDir);\n const docs: SiteDoc[] = files.map((f) => ({\n slug: f.slug,\n file: f.file,\n doc: parseDocument(f.source, f.slug),\n }));\n const site = buildSite(docs, {\n colorScheme: config.colorScheme,\n liveReload: true, // the script hits /__events — same origin here\n richIndex: config.richIndex, // on by default; config `false` opts out\n });\n const next = new Map<string, SitePage>();\n for (const p of site.pages) next.set(p.path, p);\n return next;\n };\n\n const getSitePages = (): Promise<ReadonlyMap<string, SitePage>> => {\n if (siteFresh && sitePages !== null) return Promise.resolve(sitePages);\n siteBuild ??= rebuildSite()\n .then((pages) => {\n sitePages = pages;\n siteFresh = true;\n return pages;\n })\n .catch((err: unknown) => {\n // Keep the last good site on a bad save; only fail with nothing built.\n if (sitePages !== null) return sitePages;\n throw err;\n })\n .finally(() => {\n siteBuild = null;\n });\n return siteBuild;\n };\n\n const invalidateSite = (): void => {\n siteFresh = false;\n };\n\n // ── SSE ────────────────────────────────────────────────────────────────────\n const sseClients = new Set<ServerResponse>();\n const broadcast = (payload: unknown): void => {\n const line = `data: ${JSON.stringify(payload)}\\n\\n`;\n for (const c of sseClients) c.write(line);\n };\n\n // ── Watching ───────────────────────────────────────────────────────────────\n let docsDebounce: NodeJS.Timeout | undefined;\n let metaDebounce: NodeJS.Timeout | undefined;\n const pendingPaths = new Set<string>();\n let pendingUnattributed = false;\n\n /** Debounced fan-out of one fs-event batch: per-file events where the\n * watcher gave a filename, one bare `{type:\"fs\"}` where it didn't. */\n const flushDocsEvents = async (): Promise<void> => {\n docsWatcher.resync(); // fallback mode: pick up newly created directories\n // Any docs change — including the studio's own writes, which are filtered\n // from the SSE broadcast below — makes the built site stale.\n invalidateSite();\n const paths = [...pendingPaths];\n const unattributed = pendingUnattributed;\n pendingPaths.clear();\n pendingUnattributed = false;\n for (const abs of paths) {\n const slug = relative(docsDirAbs, abs).split(sep).join('/').replace(/\\.md$/i, '');\n let hash: string | undefined;\n try {\n hash = hashOf(normalizeLf(await readFile(abs, 'utf8')));\n } catch {\n /* deleted or unreadable → event without a hash; the client refetches */\n }\n if (hash !== undefined && recentWrites.get(slug) === hash) {\n recentWrites.delete(slug); // our own PUT echoing back through fs.watch\n continue;\n }\n broadcast({ type: 'fs', slug, ...(hash !== undefined ? { hash } : {}) });\n }\n if (unattributed) broadcast({ type: 'fs' });\n };\n\n const onDocsEvent = (absPath?: string): void => {\n if (absPath === undefined) pendingUnattributed = true;\n else if (/\\.md$/i.test(absPath)) pendingPaths.add(absPath);\n // Non-.md paths (temp files, new directories) emit nothing, but still\n // schedule a flush so the fallback watcher re-walks for new directories.\n if (docsDebounce !== undefined) clearTimeout(docsDebounce);\n docsDebounce = setTimeout(() => void flushDocsEvents(), DEBOUNCE_MS);\n };\n\n const onMetaEvent = (): void => {\n if (metaDebounce !== undefined) clearTimeout(metaDebounce);\n metaDebounce = setTimeout(() => {\n invalidateSite(); // config changes can reshape every site page\n broadcast({ type: 'meta' });\n }, DEBOUNCE_MS);\n };\n\n const docsWatcher = createDocsWatcher(docsDirAbs, onDocsEvent);\n const configWatcher = createConfigWatcher(opts.cwd, onMetaEvent);\n\n // ── API routes ─────────────────────────────────────────────────────────────\n\n const handleMeta = (res: ServerResponse): void => {\n sendJson(res, 200, { version: cliVersion(), docsDir: config.docsDir, colorScheme: config.colorScheme });\n };\n\n /**\n * Doc-list metadata cache, keyed by file mtime: a list request re-reads and\n * re-stats every doc (that already happened for titles) but parses and\n * validates only the docs whose mtime changed since the last list. So the\n * per-doc `errorCount` costs one parse+validate per CHANGED doc, not per\n * request.\n */\n const docListCache = new Map<string, { mtimeMs: number; title: string; errorCount: number }>();\n\n const handleDocs = async (res: ServerResponse): Promise<void> => {\n const files = await loadDocs([`${config.docsDir}/**/*.md`], opts.cwd, config.docsDir);\n const seen = new Set<string>();\n const docs = await Promise.all(\n files.map(async (f) => {\n const st = await stat(f.absolute);\n seen.add(f.slug);\n let entry = docListCache.get(f.slug);\n if (entry === undefined || entry.mtimeMs !== st.mtimeMs) {\n let title = f.slug;\n let errorCount = 0;\n try {\n const doc = parseDocument(f.source, f.slug);\n title = doc.meta?.title ?? f.slug;\n errorCount = validateDocument(doc, f.file).filter((d) => d.level === 'error').length;\n } catch {\n /* an unparseable doc still lists (slug as title) — and IS broken */\n errorCount = 1;\n }\n entry = { mtimeMs: st.mtimeMs, title, errorCount };\n docListCache.set(f.slug, entry);\n }\n return {\n slug: f.slug,\n file: f.file,\n title: entry.title,\n mtimeMs: st.mtimeMs,\n errorCount: entry.errorCount,\n };\n }),\n );\n for (const slug of [...docListCache.keys()]) {\n if (!seen.has(slug)) docListCache.delete(slug); // deleted docs drop out\n }\n sendJson(res, 200, docs);\n };\n\n const handleDocGet = async (res: ServerResponse, abs: string): Promise<void> => {\n if (!existsSync(abs)) {\n sendJson(res, 404, { error: 'document not found' });\n return;\n }\n const [raw, st] = await Promise.all([readFile(abs, 'utf8'), stat(abs)]);\n const source = normalizeLf(raw);\n sendJson(res, 200, { source, hash: hashOf(source), mtimeMs: st.mtimeMs });\n };\n\n const handleDocPut = async (\n req: IncomingMessage,\n res: ServerResponse,\n slug: string,\n abs: string,\n force: boolean,\n ): Promise<void> => {\n const body = await readBody(req, MAX_BODY_BYTES);\n if (body === null) {\n sendJson(res, 413, { error: `body exceeds ${MAX_BODY_BYTES} bytes` });\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.toString('utf8'));\n } catch {\n sendJson(res, 400, { error: 'invalid JSON body' });\n return;\n }\n if (parsed === null || typeof parsed !== 'object') {\n sendJson(res, 400, { error: 'body must be a JSON object' });\n return;\n }\n const { source: rawSource, baseHash } = parsed as { source?: unknown; baseHash?: unknown };\n if (typeof rawSource !== 'string') {\n sendJson(res, 400, { error: 'missing \"source\" (string)' });\n return;\n }\n if (baseHash !== undefined && typeof baseHash !== 'string') {\n sendJson(res, 400, { error: '\"baseHash\" must be a string when present' });\n return;\n }\n\n const source = normalizeLf(rawSource);\n if (existsSync(abs)) {\n // Update path: clients should always send baseHash here; omitting it\n // overwrites unconditionally (the documented creation path degenerates\n // to last-writer-wins).\n const currentSource = normalizeLf(await readFile(abs, 'utf8'));\n const currentHash = hashOf(currentSource);\n if (baseHash !== undefined && baseHash !== currentHash && !force) {\n sendJson(res, 409, { currentHash, currentSource });\n return;\n }\n } else if (baseHash !== undefined && !force) {\n // The client edited a doc that has since vanished — that's a conflict\n // too, not a silent recreate. `?force=1` recreates it.\n sendJson(res, 409, { error: 'file no longer exists on disk (use ?force=1 to recreate)' });\n return;\n }\n\n // Atomic write: temp file in the same dir + rename, so a crash mid-write\n // never leaves a half-saved doc, and watchers see exactly one change.\n await mkdir(dirname(abs), { recursive: true });\n const tmp = join(dirname(abs), `.${basename(abs)}.${randomBytes(6).toString('hex')}.tmp`);\n await writeFile(tmp, source, 'utf8');\n await rename(tmp, abs);\n\n const hash = hashOf(source);\n recentWrites.set(slug, hash);\n const st = await stat(abs);\n sendJson(res, 200, { hash, mtimeMs: st.mtimeMs });\n };\n\n // ── Chromium export (POST /api/export/pdf) ──────────────────────────────────\n // The studio renders the doc to HTML in the browser and POSTs it here\n // (page HTML for PDF); we run it through headless\n // Chromium and stream the bytes back. Chromium is downloaded on the first\n // export (one time) — hence the loopback-only server is the natural place\n // for it. Failures (Playwright/Chromium missing) surface as a 500 with a\n // readable message the studio shows as a toast.\n const chromiumExport =\n (convert: (html: string) => Promise<Uint8Array>, contentType: string) =>\n async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const body = await readBody(req, MAX_BODY_BYTES);\n if (body === null) {\n sendJson(res, 413, { error: `body exceeds ${MAX_BODY_BYTES} bytes` });\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.toString('utf8'));\n } catch {\n sendJson(res, 400, { error: 'invalid JSON body' });\n return;\n }\n const html = (parsed as { html?: unknown } | null)?.html;\n if (typeof html !== 'string') {\n sendJson(res, 400, { error: 'missing \"html\" (string)' });\n return;\n }\n try {\n const bytes = await convert(html);\n res.writeHead(200, { 'Content-Type': contentType, 'Cache-Control': 'no-store' });\n res.end(Buffer.from(bytes));\n } catch (err) {\n sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });\n }\n };\n const handleExportPdf = chromiumExport(\n (html) => toPdf(html, { autoInstallBrowser: true, log: (m) => console.log(m) }),\n 'application/pdf',\n );\n\n // ── Built site pages (/site/…) ─────────────────────────────────────────────\n\n const handleSite = async (res: ServerResponse, pathname: string): Promise<void> => {\n let rel: string;\n try {\n rel = decodeURIComponent(pathname.slice('/site/'.length));\n } catch {\n rel = '';\n }\n const path = rel === '' ? 'index.html' : rel;\n const pages = await getSitePages();\n const page = pages.get(path);\n if (page === undefined) {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end(`404 — no page at ${pathname}\\n`);\n return;\n }\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });\n res.end(page.html);\n };\n\n // ── Static studio assets (SPA) ─────────────────────────────────────────────\n\n const handleStatic = async (res: ServerResponse, pathname: string): Promise<void> => {\n const root = await assetsRoot();\n let rel: string;\n try {\n rel = decodeURIComponent(pathname).replace(/^\\/+/, '');\n } catch {\n rel = '';\n }\n const isAsset = extname(rel) !== '';\n if (root === null) {\n // Assets not installed: the SPA shell degrades to a hint page, asset\n // URLs 404 — and the API keeps working either way.\n if (isAsset) {\n sendJson(res, 404, { error: 'studio assets not installed' });\n return;\n }\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });\n res.end(FALLBACK_HTML);\n return;\n }\n // SPA fallback: any extensionless path serves index.html (client routing).\n const target = isAsset ? resolve(join(root, rel)) : join(root, 'index.html');\n if (isAsset && !target.startsWith(root + sep)) {\n sendJson(res, 403, { error: 'forbidden' });\n return;\n }\n try {\n const content = await readFile(target);\n const type = MIME[extname(target).toLowerCase()] ?? 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': type, 'Cache-Control': 'no-store' });\n res.end(content);\n } catch {\n sendJson(res, 404, { error: 'not found' });\n }\n };\n\n // ── Dispatch ───────────────────────────────────────────────────────────────\n\n const handle = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const method = req.method ?? 'GET';\n const rawUrl = req.url ?? '/';\n const q = rawUrl.indexOf('?');\n const pathname = q === -1 ? rawUrl : rawUrl.slice(0, q);\n const query = new URLSearchParams(q === -1 ? '' : rawUrl.slice(q + 1));\n\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (pathname === '/__events') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-store',\n Connection: 'keep-alive',\n });\n res.write(':connected\\n\\n');\n sseClients.add(res);\n req.on('close', () => sseClients.delete(res));\n return;\n }\n\n if (pathname === '/api/meta') {\n if (method !== 'GET') return sendJson(res, 405, { error: 'method not allowed' });\n return handleMeta(res);\n }\n if (pathname === '/api/docs') {\n if (method !== 'GET') return sendJson(res, 405, { error: 'method not allowed' });\n return handleDocs(res);\n }\n if (pathname === '/api/export/pdf') {\n if (method !== 'POST') return sendJson(res, 405, { error: 'method not allowed' });\n return handleExportPdf(req, res);\n }\n if (pathname.startsWith('/api/doc/')) {\n const hit = resolveDocPath(docsDirAbs, pathname.slice('/api/doc/'.length));\n if (hit.kind === 'bad') return sendJson(res, 400, { error: 'invalid slug' });\n if (hit.kind === 'forbidden') return sendJson(res, 403, { error: 'forbidden' });\n if (method === 'GET') return handleDocGet(res, hit.abs);\n if (method === 'PUT') {\n return handleDocPut(req, res, hit.slug, hit.abs, query.get('force') === '1');\n }\n return sendJson(res, 405, { error: 'method not allowed' });\n }\n if (pathname.startsWith('/api/')) return sendJson(res, 404, { error: 'unknown API route' });\n\n if (method !== 'GET' && method !== 'HEAD') {\n return sendJson(res, 405, { error: 'method not allowed' });\n }\n // The built docs site rides under /site/ — before the SPA fallback, which\n // would otherwise swallow the extensionless /site/ path as index.html.\n if (pathname === '/site' || pathname.startsWith('/site/')) {\n return handleSite(res, pathname);\n }\n return handleStatic(res, pathname);\n };\n\n const server = createServer((req, res) => {\n // A bad request must never take the server down: unexpected errors become\n // a 500 (or just close the response if headers already went out).\n void handle(req, res).catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n if (!res.headersSent) sendJson(res, 500, { error: message });\n else res.end();\n });\n });\n\n const heartbeat = setInterval(() => {\n for (const c of sseClients) c.write(':heartbeat\\n\\n');\n }, HEARTBEAT_MS);\n heartbeat.unref();\n\n // ── Listen + lifecycle ─────────────────────────────────────────────────────\n // Loopback only: this server writes files, so it must never listen on 0.0.0.0.\n await new Promise<void>((ready, fail) => {\n server.once('error', fail);\n server.listen(opts.port, '127.0.0.1', () => {\n server.removeListener('error', fail);\n ready();\n });\n });\n const address = server.address();\n const port = address !== null && typeof address === 'object' ? address.port : opts.port;\n const url = `http://localhost:${port}`;\n console.log(`Studio at ${url} (Ctrl-C to stop)`);\n console.log(`Editing ${config.docsDir}/ — the files stay the source of truth`);\n if (opts.open) await open(url);\n\n await new Promise<void>((done) => {\n let closed = false;\n const shutdown = (): void => {\n if (closed) return;\n closed = true;\n if (docsDebounce !== undefined) clearTimeout(docsDebounce);\n if (metaDebounce !== undefined) clearTimeout(metaDebounce);\n clearInterval(heartbeat);\n docsWatcher.close();\n configWatcher.close();\n for (const c of sseClients) c.end();\n server.close(() => done());\n server.closeAllConnections();\n // Safety net: resolve even if a straggling socket stalls `close`.\n setTimeout(done, 1_000).unref();\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n}\n","/**\n * `chiltepin block [type]` — the reference an agent reads instead of a Markdown\n * contract. One block: fields, enums, terse forms, and a validating example,\n * all derived from the schema in `chiltepin-core` (so nothing can drift). No\n * argument: every block type, one line each, grouped by family — the map an\n * agent scans to pick a block.\n *\n * Pure: returns text; the dispatcher prints it and sets the exit code.\n */\n\nimport {\n BLOCK_ALIASES,\n BLOCK_DESCRIPTIONS,\n BLOCK_FAMILIES,\n BLOCK_TYPES,\n blockContract,\n familyBlocks,\n formatBlockContract,\n type BlockType,\n} from 'chiltepin-core';\n\n/** Resolves a name — canonical or one of the permanent aliases. */\nexport function resolveBlockName(name: string): { type: BlockType; alias?: string } | undefined {\n if ((BLOCK_TYPES as readonly string[]).includes(name)) return { type: name as BlockType };\n const alias = BLOCK_ALIASES[name];\n if (alias !== undefined) return { type: alias.type, alias: name };\n return undefined;\n}\n\n/** Every block on one line, grouped by family — the selection map. */\nexport function blockIndex(): string {\n const out: string[] = [\n `${BLOCK_TYPES.length} block types — chiltepin block <type> for fields + example`,\n '',\n ];\n for (const fam of BLOCK_FAMILIES) {\n const types = familyBlocks(fam.id);\n out.push(`${fam.label} (${types.length})`);\n for (const t of types) out.push(` ${t.padEnd(14)}${BLOCK_DESCRIPTIONS[t]}`);\n out.push('');\n }\n const aliases = Object.entries(BLOCK_ALIASES).map(([a, d]) => `${a}→${d.type}`);\n out.push(`Old names still accepted: ${aliases.join(' ')}`);\n return out.join('\\n') + '\\n';\n}\n\n/** The text (or JSON) for `chiltepin block <type>`. */\nexport function blockReference(type: BlockType, json: boolean): string {\n return json ? JSON.stringify(blockContract(type), null, 2) + '\\n' : formatBlockContract(type);\n}\n","/**\n * OS clipboard helper for commands that print copy-paste text (`chiltepin skill`,\n * `chiltepin new <name>`).\n */\n\nimport { spawnSync } from 'node:child_process';\n\n/**\n * Copies text to the OS clipboard via the platform's native tool (pbcopy /\n * clip / xclip / wl-copy). Returns true on success; never throws.\n */\nexport function copyToClipboard(text: string): boolean {\n const candidates: ReadonlyArray<readonly [string, readonly string[]]> =\n process.platform === 'darwin'\n ? [['pbcopy', []]]\n : process.platform === 'win32'\n ? [['clip', []]]\n : [\n ['wl-copy', []],\n ['xclip', ['-selection', 'clipboard']],\n ['xsel', ['--clipboard', '--input']],\n ];\n for (const [cmd, args] of candidates) {\n try {\n const r = spawnSync(cmd, [...args], { input: text });\n if (r.status === 0) return true;\n } catch {\n /* try the next tool */\n }\n }\n return false;\n}\n","/**\n * `chiltepin skill` — emit the Chiltepin authoring grammar as a copy-paste **system\n * prompt** for tools that don't read a repo file (Microsoft 365 Copilot, a\n * custom GPT, ChatGPT, Gemini, …). `chiltepin init` writes native adapters for\n * Claude / Cursor / Copilot / Windsurf; this is the bring-your-own-tool path:\n * print it, pipe it, or save it, then paste it into the tool's system /\n * custom-instructions box.\n */\n\nimport { stitchSkill } from './init.js';\n\n/** One-paragraph framing prepended to the grammar to make it a system prompt. */\nconst SYSTEM_HEADER = `# Chiltepin authoring — system prompt\n\nYou are an expert author of **Chiltepin** documents: Markdown files that mix prose\nwith typed, fenced YAML blocks, where the \\`.md\\` file on disk is the single source\nof truth. Whenever you create or edit documentation in a Chiltepin project, follow\nthe grammar and rules below exactly:\n\n- Keep narrative in plain Markdown; put every structured thing (diagram, table,\n roadmap, story) in a documented typed block. Never paste raw HTML or SVG.\n- Use only the documented block types and their documented fields — the schemas\n are strict, so an unknown block or field is an error.\n- Give a block an \\`id:\\` when something references it; reference it as \\`doc#id\\`.\n- Quote any YAML value containing \\`,\\` \\`:\\` \\`#\\` \\`[\\` \\`]\\` \\`{\\` \\`}\\` or a leading special character.\n- Edit blocks surgically — don't regenerate whole files.\n- A change is done only when \\`chiltepin check\\` passes (if the tooling is available).\n\nThe complete block grammar, field contract, and authoring recipe follow.\n\n---\n`;\n\n/**\n * Reads the canonical skill bundled with the CLI, stitched into one document:\n * the `SKILL.md` hub followed by each reference file (the blocks index +\n * contract + family files, system-design, decks, intake, organizing),\n * separated by `---` rules — so consumers with no filesystem get the complete\n * grammar in a single paste.\n */\nasync function readSkill(): Promise<string> {\n return stitchSkill();\n}\n\n/** Strips the leading YAML frontmatter (`---\\n…\\n---`) from skill markdown. */\nfunction stripFrontmatter(md: string): string {\n const m = /^---\\n[\\s\\S]*?\\n---\\n/.exec(md);\n return m !== null ? md.slice(m[0].length).replace(/^\\s+/, '') : md;\n}\n\n/**\n * Builds the copy-paste system prompt: the framing header + the skill grammar\n * with its repo-oriented frontmatter removed. Pass `raw: true` to get the skill\n * file verbatim instead (useful for saving as another tool's skill file).\n */\nexport async function systemPrompt(opts: { raw?: boolean } = {}): Promise<string> {\n const skill = await readSkill();\n if (opts.raw === true) return skill;\n return SYSTEM_HEADER + stripFrontmatter(skill);\n}\n","/**\n * `chiltepin sync` — import external sources into Chiltepin documents.\n *\n * `chiltepin sync openapi` generates a doc from an OpenAPI spec (or drift-checks an\n * existing one); `chiltepin sync csv` turns a CSV into a ready-to-insert block\n * fence, or a minimal doc with `--out`; `chiltepin sync sql | dbml | prisma` turn\n * a database schema into an `erd` fence the same way. All build on the pure\n * importers in `chiltepin-core` (`core/src/import/`); this module only does\n * the I/O.\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, resolve, extname, relative } from 'node:path';\nimport {\n convertDbml,\n convertPrisma,\n convertSqlDdl,\n csvToChart,\n csvToStatustable,\n csvToTable,\n erdFence,\n openapiToMarkdown,\n parseOpenApi,\n suggestCsvImport,\n type CsvDelimiter,\n type CsvImportResult,\n type ImportDiagnostic,\n} from 'chiltepin-core';\nimport { runCheck, type CheckResult } from './check.js';\nimport { overwriteRefusal } from '../io/write.js';\n\n/** Inputs for {@link runSyncOpenApi}. */\ninterface 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 /** Replace an existing file at `out`. Without it, an existing file is kept. */\n readonly force?: boolean;\n}\n\n/** Result of `chiltepin sync openapi`. */\ninterface 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 a Chiltepin 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: 'chiltepin sync openapi: must specify --out <path> or --check <path>' };\n }\n if (opts.out !== undefined && opts.check !== undefined) {\n return { exitCode: 2, message: 'chiltepin 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 const refusal = overwriteRefusal(outAbs, { force: opts.force });\n if (refusal !== undefined) return { exitCode: 1, message: refusal };\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// ─── chiltepin sync csv ────────────────────────────────────────────────────────────\n\n/** The block kinds `chiltepin sync csv` can target. */\nexport type CsvBlockKind = 'table' | 'statustable' | 'chart';\n\n/** Inputs for {@link runSyncCsv}. */\ninterface SyncCsvOptions {\n readonly cwd: string;\n /** Path to the CSV file (relative or absolute). */\n readonly file: string;\n /** Output doc path. Omitted → the caller prints the fence to stdout. */\n readonly out?: string;\n /** Target block; omitted → `suggestCsvImport`'s pick. */\n readonly block?: CsvBlockKind;\n /** Doc title (with `--out`); defaults to a prettified file name. */\n readonly title?: string;\n /** Delimiter override: `,` `;` `tab` (or a literal tab / `\\t`). */\n readonly delimiter?: string;\n /** Replace an existing file at `out`. Without it, an existing file is kept. */\n readonly force?: boolean;\n}\n\n/** Result of `chiltepin sync csv`. */\ninterface SyncCsvResult {\n readonly exitCode: 0 | 1 | 2;\n /** The block kind that was produced (or attempted). */\n readonly block: CsvBlockKind;\n /** `suggestCsvImport`'s one-liner — set only when the block was auto-picked. */\n readonly reason?: string;\n /** The ready-to-paste fence (stdout mode) — trailing newline included. */\n readonly fence?: string;\n /** Absolute output path (write mode). */\n readonly outPath?: string;\n /** Import warnings (row-level parse notes) — print to stderr. */\n readonly warnings: readonly string[];\n /** Fatal message when `exitCode` ≠ 0. */\n readonly message?: string;\n /** `chiltepin check` result for the written doc (write mode only). */\n readonly check?: CheckResult;\n}\n\n// ─── chiltepin sync sql | dbml | prisma ────────────────────────────────────────────\n\n/** The schema dialects `chiltepin sync` reads into an `erd` block. */\nexport type SchemaDialect = 'sql' | 'dbml' | 'prisma';\n\n/** Inputs for {@link runSyncSchema}. */\ninterface SyncSchemaOptions {\n readonly cwd: string;\n /** Path to the schema file (relative or absolute). */\n readonly file: string;\n readonly dialect: SchemaDialect;\n /** Output doc path. Omitted → the caller prints the fence to stdout. */\n readonly out?: string;\n /** Doc title (with `--out`); defaults to a prettified file name. */\n readonly title?: string;\n /** Block id; defaults to the file stem as a slug. */\n readonly id?: string;\n /** Replace an existing file at `out`. Without it, an existing file is kept. */\n readonly force?: boolean;\n}\n\n/** Result of `chiltepin sync sql | dbml | prisma`. */\ninterface SyncSchemaResult {\n readonly exitCode: 0 | 1 | 2;\n /** The ready-to-paste ` ```erd ` fence (stdout mode) — trailing newline included. */\n readonly fence?: string;\n /** Absolute output path (write mode). */\n readonly outPath?: string;\n /** Entity / relation counts, for the log line. */\n readonly entities: number;\n readonly relations: number;\n /** Fatal message when `exitCode` ≠ 0. */\n readonly message?: string;\n /** `chiltepin check` result for the written doc (write mode only). */\n readonly check?: CheckResult;\n}\n\n/** `schema.sql` → `schema`; `my Schema.dbml` → `my-schema`. */\nfunction idFromFile(file: string): string {\n const slug = basename(file, extname(file))\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug === '' ? 'schema' : slug;\n}\n\n/**\n * Converts a SQL DDL, DBML or Prisma schema file to an `erd` fence (stdout\n * mode) or a minimal doc (`--out` mode, validated with `chiltepin check` after\n * writing). A line the dialect subset cannot read is exit 1 with the line.\n */\nexport async function runSyncSchema(opts: SyncSchemaOptions): Promise<SyncSchemaResult> {\n const fileAbs = resolve(opts.cwd, opts.file);\n if (!existsSync(fileAbs)) {\n return { exitCode: 2, entities: 0, relations: 0, message: `Schema not found: ${fileAbs}` };\n }\n const source = await readFile(fileAbs, 'utf8');\n const result =\n opts.dialect === 'sql' ? convertSqlDdl(source) : opts.dialect === 'dbml' ? convertDbml(source) : convertPrisma(source);\n if (!result.ok) {\n const where = result.line !== undefined ? `${opts.file}:${result.line}` : opts.file;\n return { exitCode: 1, entities: 0, relations: 0, message: `Could not read ${where}: ${result.message}` };\n }\n const data = result.data;\n const entities = Array.isArray(data['entities']) ? data['entities'].length : 0;\n const relations = Array.isArray(data['relations']) ? data['relations'].length : 0;\n const fence = erdFence(data, opts.id ?? idFromFile(opts.file));\n\n if (opts.out === undefined) {\n return { exitCode: 0, fence, entities, relations };\n }\n const title = opts.title ?? titleFromFile(opts.file);\n const doc = '```meta\\ntitle: ' + JSON.stringify(title) + '\\n```\\n\\n' + fence;\n const outAbs = resolve(opts.cwd, opts.out);\n const refusal = overwriteRefusal(outAbs, { force: opts.force });\n if (refusal !== undefined) {\n return { exitCode: 1, entities, relations, message: refusal };\n }\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, doc, 'utf8');\n const check = await runCheck({\n patterns: [relative(opts.cwd, outAbs) || opts.out],\n cwd: opts.cwd,\n docsRoot: dirname(relative(opts.cwd, outAbs)) || '.',\n });\n return { exitCode: check.exitCode, outPath: outAbs, entities, relations, check };\n}\n\n/** Parses the `--delimiter` flag; `undefined` input → auto-detect. */\nfunction parseDelimiter(raw: string | undefined): CsvDelimiter | undefined | null {\n if (raw === undefined) return undefined;\n if (raw === ',' || raw === ';' || raw === '\\t') return raw;\n if (raw === 'tab' || raw === '\\\\t') return '\\t';\n return null; // unrecognised\n}\n\n/** `sales-q1.csv` → `Sales q1` — the same prettifying `chiltepin studio` uses for new docs. */\nfunction titleFromFile(file: string): string {\n const stem = basename(file, extname(file));\n const spaced = stem.replace(/[-_]+/g, ' ').trim();\n return spaced === '' ? 'Imported schema' : spaced.replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nconst warnMessages = (diags: readonly ImportDiagnostic[]): string[] =>\n diags.filter((d) => d.level === 'warn').map((d) => d.message);\nconst errorMessages = (diags: readonly ImportDiagnostic[]): string[] =>\n diags.filter((d) => d.level === 'error').map((d) => d.message);\n\n/**\n * Converts a CSV file to a block fence (stdout mode) or a minimal doc\n * (`--out` mode, validated with `chiltepin check` after writing).\n *\n * Block choice: `--block` runs that converter strictly (a CSV that can't take\n * the shape is exit 1); omitted, `suggestCsvImport` picks and its reason is\n * surfaced. Parse warnings ride `warnings`; error-level import diagnostics\n * are fatal (exit 1).\n */\nexport async function runSyncCsv(opts: SyncCsvOptions): Promise<SyncCsvResult> {\n const fallback: CsvBlockKind = opts.block ?? 'table';\n const delimiter = parseDelimiter(opts.delimiter);\n if (delimiter === null) {\n return {\n exitCode: 2,\n block: fallback,\n warnings: [],\n message: `chiltepin sync csv: unknown delimiter ${JSON.stringify(opts.delimiter)} — use \",\" \";\" or \"tab\"`,\n };\n }\n\n const fileAbs = resolve(opts.cwd, opts.file);\n if (!existsSync(fileAbs)) {\n return { exitCode: 2, block: fallback, warnings: [], message: `CSV not found: ${fileAbs}` };\n }\n const csv = await readFile(fileAbs, 'utf8');\n\n let block: CsvBlockKind;\n let reason: string | undefined;\n if (opts.block !== undefined) {\n block = opts.block;\n } else {\n const suggestion = suggestCsvImport(csv);\n block = suggestion.kind;\n reason = suggestion.reason;\n }\n\n const convertOpts = delimiter !== undefined ? { delimiter } : {};\n const result: CsvImportResult<unknown> =\n block === 'statustable'\n ? csvToStatustable(csv, convertOpts)\n : block === 'chart'\n ? csvToChart(csv, convertOpts)\n : csvToTable(csv, convertOpts);\n\n const warnings = warnMessages(result.diagnostics);\n if (result.data === null) {\n const errors = errorMessages(result.diagnostics);\n return {\n exitCode: 1,\n block,\n ...(reason !== undefined ? { reason } : {}),\n warnings,\n message: `Could not import ${opts.file} as ${block}: ${errors.join('; ')}`,\n };\n }\n // Unterminated quotes etc. are error-level even when a table came out —\n // a silently-mangled import is worse than a failing one.\n const parseErrors = errorMessages(result.diagnostics);\n if (parseErrors.length > 0) {\n return {\n exitCode: 1,\n block,\n ...(reason !== undefined ? { reason } : {}),\n warnings,\n message: `CSV parse failed for ${opts.file}: ${parseErrors.join('; ')}`,\n };\n }\n\n if (opts.out === undefined) {\n return {\n exitCode: 0,\n block,\n ...(reason !== undefined ? { reason } : {}),\n fence: result.fence,\n warnings,\n };\n }\n\n // Write mode — wrap the fence in a minimal doc and validate it.\n const title = opts.title ?? titleFromFile(opts.file);\n const doc = '```meta\\ntitle: ' + JSON.stringify(title) + '\\n```\\n\\n' + result.fence;\n const outAbs = resolve(opts.cwd, opts.out);\n const refusal = overwriteRefusal(outAbs, { force: opts.force });\n if (refusal !== undefined) {\n return {\n exitCode: 1,\n block,\n ...(reason !== undefined ? { reason } : {}),\n warnings,\n message: refusal,\n };\n }\n await mkdir(dirname(outAbs), { recursive: true });\n await writeFile(outAbs, doc, 'utf8');\n const check = await runCheck({\n patterns: [relative(opts.cwd, outAbs) || opts.out],\n cwd: opts.cwd,\n docsRoot: dirname(relative(opts.cwd, outAbs)) || '.',\n });\n return {\n exitCode: check.exitCode,\n block,\n ...(reason !== undefined ? { reason } : {}),\n outPath: outAbs,\n warnings,\n check,\n };\n}\n","/**\n * `chiltepin new [name]` — one verb for \"make something\": full-document templates\n * (`chiltepin new adr`) and single-block scaffolds (`chiltepin new sequence`) resolved by\n * name; bare `chiltepin new` in a TTY opens an Ink picker with two sections — Doc\n * templates | Blocks (grouped by family).\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport React, { useState } from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport {\n BLOCK_TEMPLATES,\n BLOCK_DESCRIPTIONS,\n BLOCK_FAMILIES,\n familyBlocks,\n type BlockFamily,\n type BlockType,\n} from 'chiltepin-core';\nimport { DOC_TEMPLATES, DOC_TEMPLATE_INFO, isDocTemplate } from './docTemplates.js';\nimport { assertWritable } from '../io/write.js';\n\n/**\n * Returns the template string for a block type. No scaffold `## <type>`\n * heading: the skill's authoring rule is that headings state what the reader\n * sees (never the block type), and the example block's own title already\n * names the section — a type heading would just near-duplicate it (the\n * renderer would suppress one of them anyway).\n */\nexport function templateFor(type: BlockType): string {\n return `\\`\\`\\`meta\\ntitle: New document\\ntag: DRAFT\\n\\`\\`\\`\\n\\n${BLOCK_TEMPLATES[type]}`;\n}\n\n// Full-document templates (adr, design-doc, deck, …) live in chiltepin-core;\n// re-exported here so `chiltepin new` has one import site.\nexport { DOC_TEMPLATES, DOC_TEMPLATE_INFO, isDocTemplate };\n\n/**\n * Writes a new doc to `out` from the chosen doc-template or block-type name.\n * Returns the absolute path written.\n *\n * A template is a starting point, never a replacement: an existing file at\n * `out` is left alone and the call throws unless `force` is set.\n */\nexport async function writeNewDoc(opts: {\n cwd: string;\n type: string;\n out: string;\n force?: boolean;\n}): Promise<string> {\n const outAbs = resolve(opts.cwd, opts.out);\n assertWritable(outAbs, opts.force === true ? { force: true } : {});\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\nconst DOCS_SECTION = '__docs__';\n\ninterface PickerProps {\n /** Called once with the picked doc-template or block-type name. */\n readonly onPick: (name: string) => void;\n}\n\n/**\n * Ink picker for bare `chiltepin new` — two sections: Doc templates (titles +\n * descriptions from {@link DOC_TEMPLATE_INFO}) | Blocks, grouped by family.\n * `q`/escape cancels; the caller decides what to do with the picked name.\n */\nexport function NewPickerApp({ onPick }: PickerProps): React.JSX.Element {\n const { exit } = useApp();\n const [section, setSection] = useState<'top' | typeof DOCS_SECTION | BlockFamily>('top');\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) exit();\n });\n\n if (section === 'top') {\n const items = [\n {\n label: `Doc templates — a complete starting doc (${Object.keys(DOC_TEMPLATES).length})`,\n value: DOCS_SECTION,\n },\n ...BLOCK_FAMILIES.map((f) => ({\n label: `Blocks · ${f.label} — ${familyBlocks(f.id).length} scaffolds`,\n value: f.id as string,\n })),\n ];\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n What do you want to create? <Text dimColor>(↑↓ move · enter · q to quit)</Text>\n </Text>\n <SelectInput\n items={items}\n onSelect={(item) => setSection(item.value as typeof DOCS_SECTION | BlockFamily)}\n />\n </Box>\n );\n }\n\n const pick = (name: string): void => {\n onPick(name);\n exit();\n };\n\n if (section === DOCS_SECTION) {\n const items = Object.keys(DOC_TEMPLATES).map((name) => {\n const info = DOC_TEMPLATE_INFO[name];\n return { label: `${(info?.title ?? name).padEnd(14)} ${info?.description ?? ''}`, value: name };\n });\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n Doc templates <Text dimColor>(↑↓ move · enter · q to quit)</Text>\n </Text>\n <SelectInput items={items} onSelect={(item) => pick(item.value)} />\n </Box>\n );\n }\n\n const items = familyBlocks(section).map((t) => ({\n label: `${t.padEnd(13)} ${BLOCK_DESCRIPTIONS[t]}`,\n value: t as string,\n }));\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n Blocks · {BLOCK_FAMILIES.find((f) => f.id === section)?.label ?? section}{' '}\n <Text dimColor>(↑↓ move · enter · q to quit)</Text>\n </Text>\n <SelectInput items={items} onSelect={(item) => pick(item.value)} />\n </Box>\n );\n}\n","/**\n * Smart bare `chiltepin` — the mini project status shown when `chiltepin` is run with no\n * arguments inside a Chiltepin project (TTY only). Answers \"where am I and\n * what next?\" without picking through 14 commands: doc count, a quick\n * validate summary (parse + validate via core — no rendering), and the 4-5\n * next actions.\n */\n\nimport pc from 'picocolors';\nimport { loadConfig } from '../io/config.js';\nimport { runCheck } from './check.js';\n\n/** The data behind the bare-`chiltepin` status panel. */\ninterface ProjectStatus {\n /** How many docs matched `<docsDir>/**\\/*.md`. */\n readonly docCount: number;\n /** Error-level diagnostics from a quick validate (no render). */\n readonly errors: number;\n /** Warning-level diagnostics from the same pass. */\n readonly warnings: number;\n /** The configured docs directory. */\n readonly docsDir: string;\n}\n\n/** Gathers the status: doc count + quick validate. */\nexport async function projectStatus(cwd: string): Promise<ProjectStatus> {\n const config = await loadConfig(cwd);\n const result = await runCheck({\n patterns: [`${config.docsDir}/**/*.md`],\n cwd,\n docsRoot: config.docsDir,\n });\n const errors = result.diagnostics.filter((d) => d.level === 'error').length;\n return {\n docCount: result.files.length,\n errors,\n warnings: result.diagnostics.length - errors,\n docsDir: config.docsDir,\n };\n}\n\n/** The next actions listed under the status, with one-liners. */\nconst NEXT_ACTIONS: ReadonlyArray<readonly [cmd: string, note: string]> = [\n ['chiltepin check', 'validate every doc'],\n ['chiltepin <file.md>', 'render + open one doc in the browser'],\n ['chiltepin studio', 'edit visually · Site mode previews the docs site live'],\n ['chiltepin build', 'build the static docs site'],\n ['chiltepin block', 'every block type, or one block\\'s fields + example'],\n];\n\n/**\n * Formats the status panel. `plain` drops color (also exercised by tests);\n * the caller prints the banner line above it.\n */\nexport function formatStatus(status: ProjectStatus, plain = false): string {\n const dim = (s: string): string => (plain ? s : pc.dim(s));\n const cyan = (s: string): string => (plain ? s : pc.cyan(s));\n const bold = (s: string): string => (plain ? s : pc.bold(s));\n const checkLine =\n status.errors > 0\n ? (plain ? '' : pc.red('✗ ')) +\n `${status.errors} error(s)` +\n (status.warnings > 0 ? ` · ${status.warnings} warning(s)` : '') +\n dim(' — run chiltepin check')\n : (plain ? '' : pc.green('✓ ')) +\n 'clean' +\n (status.warnings > 0 ? dim(` (${status.warnings} warning(s))`) : '');\n const width = Math.max(...NEXT_ACTIONS.map(([cmd]) => cmd.length));\n return [\n ` ${dim('docs'.padEnd(8))}${status.docCount} document(s) ${dim(`in ${status.docsDir}/`)}`,\n ` ${dim('check'.padEnd(8))}${checkLine}`,\n '',\n ` ${bold('Next:')}`,\n ...NEXT_ACTIONS.map(([cmd, note]) => ` ${cyan(cmd.padEnd(width))} ${dim(note)}`),\n '',\n ].join('\\n');\n}\n","/**\n * BuiltinSource — deterministic evidence extraction with no graph.\n *\n * A bounded fs walk plus per-language regexes. Nothing here parses ASTs; the\n * goal is countable, citable evidence (entrypoints, routes, schemas,\n * packages, externals, import in-degree), not full program understanding.\n * The walk skips vendored/generated dirs and caps file reads so a huge repo\n * stays fast; when the cap trips, the report says so in `notice`.\n */\n\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { join, relative, posix, sep } from 'node:path';\nimport type {\n AuditStats,\n CollectedEvidence,\n EntrypointEvidence,\n ExternalEvidence,\n GodNodeEvidence,\n PackageEvidence,\n RouteEvidence,\n SchemaEvidence,\n} from './types.js';\n\n/** Hard cap on files read — keeps `chiltepin audit` fast on big repos. */\nexport const FILE_CAP = 2000;\n\n/** Directories never walked (rough .gitignore etiquette). */\nconst SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.scratch',\n 'graphify-out',\n 'coverage',\n '.next',\n '.turbo',\n '__pycache__',\n '.venv',\n 'venv',\n 'vendor',\n 'target',\n 'out',\n]);\n\n/** Extensions whose contents we scan for routes/imports/externals. */\nconst CODE_EXTS = new Set(['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'mts', 'cts', 'py', 'go', 'rb']);\n\n/** Normalizes an extension into a language bucket (`tsx` → `ts`, …). */\nfunction langOf(ext: string): string {\n switch (ext) {\n case 'tsx':\n case 'mts':\n case 'cts':\n return 'ts';\n case 'jsx':\n case 'mjs':\n case 'cjs':\n return 'js';\n case 'yml':\n return 'yaml';\n default:\n return ext;\n }\n}\n\n/** Lowercased extension without the dot, or '' when there is none. */\nfunction extOf(name: string): string {\n const i = name.lastIndexOf('.');\n if (i <= 0) return '';\n return name.slice(i + 1).toLowerCase();\n}\n\n/** Always-forward-slash path relative to the audit root. */\nfunction rel(root: string, abs: string): string {\n return relative(root, abs).split(sep).join('/');\n}\n\ninterface WalkedFile {\n readonly abs: string;\n readonly rel: string;\n readonly ext: string;\n}\n\n/** Walks the tree breadth-first, skipping SKIP_DIRS, capped at FILE_CAP files. */\nasync function walk(root: string): Promise<{ files: WalkedFile[]; truncated: boolean }> {\n const files: WalkedFile[] = [];\n const queue: string[] = [root];\n let truncated = false;\n while (queue.length > 0 && !truncated) {\n const dir = queue.shift() as string;\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n continue; // unreadable dir — skip, the audit is best-effort\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n const abs = join(dir, entry.name);\n if (entry.isDirectory()) {\n // Hidden dirs (.git, .venv, …) and vendored/generated dirs stay out.\n if (!entry.name.startsWith('.') && !SKIP_DIRS.has(entry.name)) queue.push(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (files.length >= FILE_CAP) {\n truncated = true;\n break;\n }\n files.push({ abs, rel: rel(root, abs), ext: extOf(entry.name) });\n }\n }\n return { files, truncated };\n}\n\n/** External SDK / HTTP-client modules we recognize as \"talks to a service\". */\nconst KNOWN_EXTERNALS: readonly string[] = [\n 'axios',\n 'node-fetch',\n 'got',\n 'undici',\n 'ky',\n 'stripe',\n 'openai',\n '@anthropic-ai/',\n '@aws-sdk/',\n 'aws-sdk',\n '@octokit/',\n 'twilio',\n '@sendgrid/',\n '@supabase/',\n 'firebase',\n 'pg',\n 'mysql2',\n 'mongodb',\n 'mongoose',\n 'redis',\n 'ioredis',\n '@prisma/client',\n // Python\n 'requests',\n 'httpx',\n 'boto3',\n 'anthropic',\n];\n\n/** Path segments that mark test/fixture trees — no evidence harvested there. */\nconst TEST_SEGMENT_RE = /(^|\\/)(__tests__|__fixtures__|__mocks__)(\\/|$)/;\n\n/** Test-file names: `*.test.*`, `*.spec.*`. */\nconst TEST_FILE_RE = /\\.(test|spec)\\./i;\n\n/**\n * True for test/fixture paths. These files still count in `stats.files`,\n * but the audit never harvests evidence from them — a route literal inside\n * a test fixture is not a route the repo serves.\n */\nfunction isTestPath(rel: string): boolean {\n return TEST_SEGMENT_RE.test(rel) || TEST_FILE_RE.test(posix.basename(rel));\n}\n\n/** JS/TS import + require specifiers in a file. */\nfunction importSpecifiers(text: string): string[] {\n const out: string[] = [];\n const re = /(?:\\bfrom\\s+|\\bimport\\s+|\\brequire\\(\\s*)['\"]([^'\"\\n]+)['\"]/g;\n for (const m of text.matchAll(re)) out.push(m[1] as string);\n return out;\n}\n\n// Express / Fastify / Hono style: app . get(<quoted path>, …).\nconst JS_ROUTE_RE =\n /\\b(?:app|router|server|fastify|api)\\s*\\.\\s*(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`\\n]+)['\"`]/g;\n\n// FastAPI decorators: @app . get(<quoted path>).\nconst FASTAPI_ROUTE_RE = /@\\w+\\.(get|post|put|patch|delete)\\(\\s*['\"]([^'\"\\n]+)['\"]/g;\n\n// Flask decorators: @app . route(<quoted path>, methods=[…]).\nconst FLASK_ROUTE_RE = /@\\w+\\.route\\(\\s*['\"]([^'\"\\n]+)['\"]([^)\\n]*)/g;\n\n/**\n * Collects builtin evidence for `root`. Pure-ish: reads the fs, writes\n * nothing, returns a value (the CLI owns exit codes and printing).\n */\nexport async function collectBuiltin(root: string): Promise<CollectedEvidence> {\n const { files, truncated } = await walk(root);\n\n // Stats: files walked + language histogram.\n const languages: Record<string, number> = {};\n for (const f of files) {\n if (f.ext === '') continue;\n if (f.ext.length > 6) continue; // not a real extension\n const lang = langOf(f.ext);\n languages[lang] = (languages[lang] ?? 0) + 1;\n }\n\n const entrypoints: EntrypointEvidence[] = [];\n const routes: RouteEvidence[] = [];\n const schemas: SchemaEvidence[] = [];\n const packages: PackageEvidence[] = [];\n const externals = new Map<string, ExternalEvidence>();\n const composeServices: { name: string; file: string }[] = [];\n // import target (posix path, no ext) → set of importer files\n const importers = new Map<string, Set<string>>();\n const seenEntry = new Set<string>();\n let readmeLines: number | undefined;\n let readmeFile: string | undefined;\n\n const addEntry = (file: string, why: string): void => {\n if (seenEntry.has(file)) return;\n seenEntry.add(file);\n entrypoints.push({ file, why });\n };\n\n const fileSet = new Set(files.map((f) => f.rel));\n\n for (const f of files) {\n // Test/fixture files count in stats but never yield evidence — a route\n // or SDK import inside a test fixture is not something the repo serves.\n if (isTestPath(f.rel)) continue;\n const base = posix.basename(f.rel);\n\n // — Schemas: recognized by name/extension, no read needed.\n if (f.ext === 'prisma') schemas.push({ file: f.rel, kind: 'prisma' });\n else if (f.ext === 'proto') schemas.push({ file: f.rel, kind: 'proto' });\n else if (f.ext === 'sql' && /(^|\\/)migrations?\\//.test(f.rel))\n schemas.push({ file: f.rel, kind: 'sql' });\n else if (/^(openapi|swagger)\\./i.test(base) && ['yaml', 'yml', 'json'].includes(f.ext))\n schemas.push({ file: f.rel, kind: 'openapi' });\n else if (/^drizzle\\.config\\./.test(base)) schemas.push({ file: f.rel, kind: 'other' });\n\n // — Conventional entrypoints.\n if (/^src\\/index\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(f.rel)) addEntry(f.rel, 'src/index convention');\n if (/^(main|app|manage)\\.py$/.test(f.rel)) addEntry(f.rel, 'python entry convention');\n if (/^cmd\\/[^/]+\\/main\\.go$/.test(f.rel)) addEntry(f.rel, 'Go cmd/ convention');\n\n // — Root README (onboarding rule input).\n if (f.rel.toLowerCase() === 'readme.md') {\n try {\n const text = await readFile(f.abs, 'utf8');\n // Count newline-terminated lines: a trailing newline does not add one.\n const lines = text.split('\\n');\n if (lines[lines.length - 1] === '') lines.pop();\n readmeLines = lines.length;\n readmeFile = f.rel;\n } catch {\n /* unreadable README counts as absent */\n }\n }\n\n // — package.json: package list + main/bin/start entrypoints.\n if (base === 'package.json') {\n try {\n const pkg = JSON.parse(await readFile(f.abs, 'utf8')) as Record<string, unknown>;\n const dir = posix.dirname(f.rel);\n if (typeof pkg['name'] === 'string') {\n packages.push({ name: pkg['name'], dir: dir === '.' ? '.' : dir });\n }\n const inPkg = (p: string): string => posix.normalize(posix.join(dir === '.' ? '' : dir, p));\n if (typeof pkg['main'] === 'string') addEntry(inPkg(pkg['main']), 'package.json main');\n const bin = pkg['bin'];\n if (typeof bin === 'string') addEntry(inPkg(bin), 'package.json bin');\n else if (bin !== null && typeof bin === 'object') {\n for (const v of Object.values(bin as Record<string, unknown>)) {\n if (typeof v === 'string') addEntry(inPkg(v), 'package.json bin');\n }\n }\n const scripts = pkg['scripts'];\n if (scripts !== null && typeof scripts === 'object') {\n const start = (scripts as Record<string, unknown>)['start'];\n if (typeof start === 'string') {\n const m = start.match(/(\\S+\\.(?:[mc]?[jt]sx?|py))\\b/);\n if (m !== null) addEntry(inPkg(m[1] as string), 'package.json start script');\n }\n }\n } catch {\n /* invalid package.json — no evidence from it */\n }\n }\n\n // — docker-compose services.\n if (/^(docker-)?compose(\\.[\\w-]+)?\\.ya?ml$/.test(base) && posix.dirname(f.rel) === '.') {\n try {\n const lines = (await readFile(f.abs, 'utf8')).split('\\n');\n const start = lines.findIndex((l) => /^services:\\s*$/.test(l));\n if (start >= 0) {\n for (let i = start + 1; i < lines.length; i += 1) {\n const line = lines[i] as string;\n if (/^\\S/.test(line)) break; // left the services: mapping\n const m = line.match(/^ {2}([\\w-]+):\\s*$/);\n if (m !== null) composeServices.push({ name: m[1] as string, file: f.rel });\n }\n }\n } catch {\n /* skip */\n }\n }\n\n // — Code files: routes, externals, import in-degree.\n if (!CODE_EXTS.has(f.ext)) continue;\n let text: string;\n try {\n text = await readFile(f.abs, 'utf8');\n } catch {\n continue;\n }\n\n for (const m of text.matchAll(JS_ROUTE_RE)) {\n routes.push({ method: (m[1] as string).toUpperCase(), path: m[2] as string, file: f.rel });\n }\n if (f.ext === 'py') {\n for (const m of text.matchAll(FASTAPI_ROUTE_RE)) {\n routes.push({ method: (m[1] as string).toUpperCase(), path: m[2] as string, file: f.rel });\n }\n for (const m of text.matchAll(FLASK_ROUTE_RE)) {\n const methods = (m[2] as string).match(/methods\\s*=\\s*\\[([^\\]]*)\\]/);\n const list =\n methods === null\n ? ['GET']\n : (methods[1] as string)\n .split(',')\n .map((s) => s.replace(/['\"\\s]/g, ''))\n .filter((s) => s !== '');\n for (const method of list) {\n routes.push({ method: method.toUpperCase(), path: m[1] as string, file: f.rel });\n }\n }\n // Python externals: `import requests` / `from httpx import …`.\n for (const m of text.matchAll(/^(?:import|from)\\s+([\\w.]+)/gm)) {\n const mod = (m[1] as string).split('.')[0] as string;\n if (KNOWN_EXTERNALS.includes(mod) && !externals.has(mod)) {\n externals.set(mod, { name: mod, file: f.rel });\n }\n }\n continue;\n }\n\n // JS/TS externals + local import graph.\n if (/\\bfetch\\s*\\(/.test(text) && !externals.has('fetch')) {\n externals.set('fetch', { name: 'fetch', file: f.rel });\n }\n for (const spec of importSpecifiers(text)) {\n if (spec.startsWith('.')) {\n // Local import: resolve against the importer's dir, strip extension.\n const target = posix\n .normalize(posix.join(posix.dirname(f.rel), spec))\n .replace(/\\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/, '')\n .replace(/\\/index$/, '');\n let set = importers.get(target);\n if (set === undefined) {\n set = new Set();\n importers.set(target, set);\n }\n set.add(f.rel);\n continue;\n }\n const hit = KNOWN_EXTERNALS.find((k) =>\n k.endsWith('/') ? spec.startsWith(k) : spec === k || spec.startsWith(`${k}/`),\n );\n if (hit !== undefined) {\n const name = hit.endsWith('/') ? spec : hit;\n if (!externals.has(name)) externals.set(name, { name, file: f.rel });\n }\n }\n }\n\n // Next.js file-convention routes (pages/api and app-router route files).\n for (const f of files) {\n if (isTestPath(f.rel)) continue;\n const api = f.rel.match(/(?:^|\\/)pages\\/api\\/(.+)\\.(?:[jt]sx?)$/);\n if (api !== null) {\n const p = `/${(api[1] as string).replace(/\\/index$/, '')}`;\n routes.push({ method: 'ANY', path: `/api${p === '/index' ? '' : p}`, file: f.rel });\n continue;\n }\n const appRoute = f.rel.match(/(?:^|\\/)app\\/(.*?)route\\.(?:[jt]s)$/);\n if (appRoute !== null) {\n const p = `/${(appRoute[1] as string).replace(/\\/$/, '')}`;\n routes.push({ method: 'ANY', path: p === '/' ? '/' : p, file: f.rel });\n }\n }\n\n // God nodes: local modules with the highest import in-degree.\n const godNodes: GodNodeEvidence[] = [...importers.entries()]\n .map(([target, set]) => ({ target, degree: set.size }))\n .filter((g) => g.degree >= 3)\n .sort((a, b) => b.degree - a.degree || a.target.localeCompare(b.target))\n .slice(0, 10)\n .map((g) => {\n // Prefer a real file for the citation: try the common extensions.\n const candidates = [\n g.target,\n ...['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs'].flatMap((e) => [\n `${g.target}.${e}`,\n `${g.target}/index.${e}`,\n ]),\n ];\n const file = candidates.find((c) => fileSet.has(c)) ?? g.target;\n return { name: g.target, degree: g.degree, file };\n });\n\n const stats: AuditStats = { files: files.length, languages };\n return {\n stats,\n evidence: { entrypoints, routes, schemas, packages, externals: [...externals.values()], godNodes },\n composeServices,\n readmeLines,\n readmeFile,\n truncated,\n };\n}\n\n/** True when `p` exists and is a directory (the audit's only hard precondition). */\nexport async function isUsableRoot(p: string): Promise<boolean> {\n try {\n return (await stat(p)).isDirectory();\n } catch {\n return false;\n }\n}\n","/**\n * GraphifySource — enriches the audit from `<root>/graphify-out/graph.json`.\n *\n * ## Field dependence (keep this list current)\n *\n * The graph.json is graphify's node-link export. We depend ONLY on:\n *\n * nodes[]: id, label, source_file (community_name, file_type — read\n * when present, never required)\n * links[]: source, target, relation (confidence — ignored today)\n *\n * Every other field (norm_label, community, confidence_score, weight,\n * graph.hyperedges, …) is ignored, so graphify can change them freely.\n *\n * ## What graphify supplies vs the builtin extractor\n *\n * Graphify classifies files and relations, not routes or schemas. So the\n * adapter COMPOSES: graphify enriches `stats` (distinct source files +\n * language histogram) and `godNodes` (link in-degree over calls/imports);\n * the builtin extractor still supplies entrypoints, routes, schemas,\n * packages, and externals.\n *\n * ## Fallback behavior\n *\n * Validation is a minimal structural check: `nodes` and `links` are arrays,\n * and their first elements carry the fields above. On a missing file the\n * audit silently uses the builtin source (with a \"richer audit\" hint). On a\n * parse error or shape mismatch the audit falls back to the builtin source\n * and reports one notice that names the reason. `chiltepin audit` never fails\n * because graph.json is bad.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { AuditStats, GodNodeEvidence } from './types.js';\n\n/** The node fields we read (all others ignored). */\ninterface GraphifyNode {\n readonly id: string;\n readonly label: string;\n readonly source_file?: string;\n readonly community_name?: string;\n readonly file_type?: string;\n}\n\n/** The link fields we read (all others ignored). */\ninterface GraphifyLink {\n readonly source: string;\n readonly target: string;\n readonly relation?: string;\n readonly confidence?: string;\n}\n\n/** The validated slice of graph.json the audit consumes. */\ninterface GraphifyGraph {\n readonly nodes: readonly GraphifyNode[];\n readonly links: readonly GraphifyLink[];\n}\n\n/** Result of trying to load graph.json. */\ntype GraphifyLoad =\n | { readonly ok: true; readonly graph: GraphifyGraph }\n | { readonly ok: false; readonly missing: true }\n | { readonly ok: false; readonly missing: false; readonly reason: string };\n\n/** Relative location graphify writes its export to. */\nconst GRAPH_PATH = 'graphify-out/graph.json';\n\n/**\n * Loads + minimally validates `<root>/graphify-out/graph.json`.\n * Returns a typed result — the caller decides how to report and fall back.\n */\nexport async function loadGraphify(root: string): Promise<GraphifyLoad> {\n const path = join(root, GRAPH_PATH);\n if (!existsSync(path)) return { ok: false, missing: true };\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(path, 'utf8'));\n } catch (err) {\n return {\n ok: false,\n missing: false,\n reason: `${GRAPH_PATH} did not parse as JSON (${(err as Error).message}).`,\n };\n }\n const obj = parsed as { nodes?: unknown; links?: unknown };\n if (!Array.isArray(obj.nodes) || !Array.isArray(obj.links)) {\n return {\n ok: false,\n missing: false,\n reason: `${GRAPH_PATH} has no nodes/links arrays.`,\n };\n }\n const n0 = obj.nodes[0] as Record<string, unknown> | undefined;\n if (n0 !== undefined && (typeof n0['id'] !== 'string' || typeof n0['label'] !== 'string')) {\n return {\n ok: false,\n missing: false,\n reason: `${GRAPH_PATH} nodes lack the id/label fields.`,\n };\n }\n const l0 = obj.links[0] as Record<string, unknown> | undefined;\n if (l0 !== undefined && (l0['source'] === undefined || l0['target'] === undefined)) {\n return {\n ok: false,\n missing: false,\n reason: `${GRAPH_PATH} links lack the source/target fields.`,\n };\n }\n return { ok: true, graph: { nodes: obj.nodes as GraphifyNode[], links: obj.links as GraphifyLink[] } };\n}\n\n/** Lowercased extension of a path, or '' when there is none. */\nfunction extOf(path: string): string {\n const base = path.slice(path.lastIndexOf('/') + 1);\n const i = base.lastIndexOf('.');\n return i <= 0 ? '' : base.slice(i + 1).toLowerCase();\n}\n\n/** Stats from the graph: distinct source files + their language histogram. */\nexport function graphifyStats(graph: GraphifyGraph): AuditStats {\n const files = new Set<string>();\n for (const node of graph.nodes) {\n if (typeof node.source_file === 'string' && node.source_file !== '') files.add(node.source_file);\n }\n const languages: Record<string, number> = {};\n for (const file of files) {\n const ext = extOf(file);\n if (ext === '' || ext.length > 6) continue;\n languages[ext] = (languages[ext] ?? 0) + 1;\n }\n return { files: files.size, languages };\n}\n\n/**\n * God nodes from the graph: in-degree over `calls`/`imports` links, mapped\n * back to the node's label + source_file for a citable name.\n */\nexport function graphifyGodNodes(graph: GraphifyGraph, top = 10): GodNodeEvidence[] {\n const inDegree = new Map<string, number>();\n for (const link of graph.links) {\n if (link.relation !== 'calls' && link.relation !== 'imports') continue;\n const target = String(link.target);\n inDegree.set(target, (inDegree.get(target) ?? 0) + 1);\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n return [...inDegree.entries()]\n .filter(([, degree]) => degree >= 3)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, top)\n .map(([id, degree]) => {\n const node = byId.get(id);\n return {\n name: node?.label ?? id,\n degree,\n file: node?.source_file ?? '',\n };\n });\n}\n","/**\n * Recommendation rules — deterministic, evidence-cited.\n *\n * Each rule fires only when its evidence exists, cites real files from that\n * evidence, and writes a one-line rationale with the numbers in it. The menu\n * a consumer builds from these is therefore never a fixed list.\n *\n * Thresholds (from BATCH-B-PLAN.md, do not drift):\n * - architecture-overview: ≥2 packages OR ≥2 compose services OR\n * ≥3 entrypoints → high; else ≥1 entrypoint AND ≥5 externals → medium.\n * - data-model: any schema file → high.\n * - request-flows: ≥3 routes → high; 1–2 → low.\n * - api-reference: openapi present → high; ≥5 routes → medium.\n * - dependency-map: top import in-degree ≥15 (graphify) or ≥10 (builtin)\n * → medium.\n * - onboarding-guide: README absent or <30 lines → medium.\n */\n\nimport type {\n AuditRecommendation,\n AuditSourceName,\n CollectedEvidence,\n} from './types.js';\n\n/** Max citations per recommendation — enough to read, not a dump. */\nconst CITE_CAP = 8;\n\n/** First `CITE_CAP` unique entries. */\nfunction cite(files: readonly string[]): string[] {\n return [...new Set(files)].slice(0, CITE_CAP);\n}\n\n/** Derives the recommendation list from collected evidence. */\nexport function deriveRecommendations(\n collected: CollectedEvidence,\n source: AuditSourceName,\n): AuditRecommendation[] {\n const { evidence, composeServices, readmeLines, readmeFile } = collected;\n const out: AuditRecommendation[] = [];\n\n // — architecture-overview\n const pkgCount = evidence.packages.length;\n const svcCount = composeServices.length;\n const entryCount = evidence.entrypoints.length;\n const archCites = cite([\n ...evidence.packages.map((p) => (p.dir === '.' ? 'package.json' : `${p.dir}/package.json`)),\n ...composeServices.map((s) => s.file),\n ...evidence.entrypoints.map((e) => e.file),\n ]);\n if (pkgCount >= 2 || svcCount >= 2 || entryCount >= 3) {\n const parts: string[] = [];\n if (pkgCount >= 2) parts.push(`${pkgCount} packages`);\n if (svcCount >= 2) parts.push(`${svcCount} compose services`);\n if (entryCount >= 3) parts.push(`${entryCount} entrypoints`);\n out.push({\n kind: 'architecture-overview',\n title: 'Architecture overview',\n rationale: `The repo has ${parts.join(' and ')}. An overview shows how they connect.`,\n confidence: 'high',\n citations: archCites,\n template: 'system-design',\n });\n } else if (entryCount >= 1 && evidence.externals.length >= 5) {\n out.push({\n kind: 'architecture-overview',\n title: 'Architecture overview',\n rationale: `The code talks to ${evidence.externals.length} external services from ${entryCount} entrypoint(s). An overview maps the boundary.`,\n confidence: 'medium',\n citations: cite([...archCites, ...evidence.externals.map((e) => e.file)]),\n template: 'system-design',\n });\n }\n\n // — data-model\n if (evidence.schemas.length >= 1) {\n out.push({\n kind: 'data-model',\n title: 'Data model',\n rationale: `The repo defines ${evidence.schemas.length} schema file(s). A data-model doc explains the entities.`,\n confidence: 'high',\n citations: cite(evidence.schemas.map((s) => s.file)),\n template: 'data-model',\n });\n }\n\n // — request-flows\n const routeCount = evidence.routes.length;\n if (routeCount >= 1) {\n out.push({\n kind: 'request-flows',\n title: 'Request flows',\n rationale: `The audit found ${routeCount} route(s). A flow doc traces each request path.`,\n confidence: routeCount >= 3 ? 'high' : 'low',\n citations: cite(evidence.routes.map((r) => r.file)),\n template: 'service-overview',\n });\n }\n\n // — api-reference\n const openapi = evidence.schemas.filter((s) => s.kind === 'openapi');\n if (openapi.length >= 1) {\n out.push({\n kind: 'api-reference',\n title: 'API reference',\n rationale: `An OpenAPI spec exists (${openapi[0]?.file}). An API reference doc can stay in sync with it.`,\n confidence: 'high',\n citations: cite(openapi.map((s) => s.file)),\n template: 'api-spec',\n });\n } else if (routeCount >= 5) {\n out.push({\n kind: 'api-reference',\n title: 'API reference',\n rationale: `The audit found ${routeCount} routes and no OpenAPI spec. An API reference documents them.`,\n confidence: 'medium',\n citations: cite(evidence.routes.map((r) => r.file)),\n template: 'api-spec',\n });\n }\n\n // — dependency-map\n const godThreshold = source === 'graphify' ? 15 : 10;\n const god = evidence.godNodes.find((g) => g.degree >= godThreshold);\n if (god !== undefined) {\n out.push({\n kind: 'dependency-map',\n title: 'Dependency map',\n rationale: `${god.name} has ${god.degree} inbound dependencies. A dependency map shows what breaks when it changes.`,\n confidence: 'medium',\n citations: cite([god.file].filter((f) => f !== '')),\n template: 'system-design',\n });\n }\n\n // — onboarding-guide\n if (readmeLines === undefined || readmeLines < 30) {\n const rationale =\n readmeLines === undefined\n ? 'The repo has no README. An onboarding guide gives new contributors a start.'\n : `The README has only ${readmeLines} line(s). An onboarding guide gives new contributors a start.`;\n out.push({\n kind: 'onboarding-guide',\n title: 'Onboarding guide',\n rationale,\n confidence: 'medium',\n citations: cite(\n [readmeFile, ...evidence.entrypoints.map((e) => e.file)].filter(\n (f): f is string => f !== undefined,\n ),\n ),\n template: 'onboarding',\n });\n }\n\n return out;\n}\n","/**\n * `chiltepin audit [path]` — orchestrates the sources, derives recommendations,\n * and formats the human report. Returns values; the CLI dispatcher owns exit\n * codes and printing. An audit is informational: it exits 0 whenever the\n * path is usable, even when it recommends nothing.\n */\n\nimport pc from 'picocolors';\nimport { resolve } from 'node:path';\nimport { collectBuiltin, isUsableRoot, FILE_CAP } from './builtinSource.js';\nimport { loadGraphify, graphifyStats, graphifyGodNodes } from './graphifySource.js';\nimport { deriveRecommendations } from './rules.js';\nimport type { AuditReport, AuditSourceName } from './types.js';\n\ninterface RunAuditOptions {\n readonly cwd: string;\n /** Directory to audit, relative to cwd (default: cwd itself). */\n readonly path?: string;\n}\n\ntype RunAuditResult =\n | { readonly ok: true; readonly report: AuditReport }\n | { readonly ok: false; readonly error: string };\n\n/** Runs the audit for one directory tree. */\nexport async function runAudit(options: RunAuditOptions): Promise<RunAuditResult> {\n const root = resolve(options.cwd, options.path ?? '.');\n if (!(await isUsableRoot(root))) {\n return { ok: false, error: `Cannot audit ${options.path ?? root}: not a directory.` };\n }\n\n // The builtin extractor always runs — graphify does not classify\n // entrypoints, routes, schemas, packages, or externals.\n const collected = await collectBuiltin(root);\n const graph = await loadGraphify(root);\n\n let source: AuditSourceName = 'builtin';\n const notices: string[] = [];\n let stats = collected.stats;\n let evidence = collected.evidence;\n\n if (graph.ok) {\n source = 'graphify';\n stats = graphifyStats(graph.graph);\n evidence = { ...evidence, godNodes: graphifyGodNodes(graph.graph) };\n } else if (graph.missing) {\n notices.push('Install graphify to get a richer audit (call graph, communities).');\n } else {\n notices.push(`${graph.reason} The audit used the builtin extractor.`);\n }\n if (collected.truncated) {\n notices.push(`The scan stopped at ${FILE_CAP} files. Counts are lower bounds.`);\n }\n\n const merged = { ...collected, stats, evidence };\n const recommendations = deriveRecommendations(merged, source);\n\n const report: AuditReport = {\n version: 1,\n source,\n ...(notices.length > 0 ? { notice: notices.join(' ') } : {}),\n stats,\n evidence,\n recommendations,\n };\n return { ok: true, report };\n}\n\n/** Top languages as `ts 120 · md 14 · …` (largest first, capped). */\nfunction languagesLine(languages: Readonly<Record<string, number>>, cap = 6): string {\n const top = Object.entries(languages)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, cap);\n return top.map(([lang, n]) => `${lang} ${n}`).join(' · ');\n}\n\n/**\n * Formats the human report: stats line, recommendations table, next-step\n * hint. `plain` drops color (non-TTY / CHILTEPIN_PLAIN / tests).\n */\nexport function formatAudit(report: AuditReport, plain = false): string {\n const dim = (s: string): string => (plain ? s : pc.dim(s));\n const bold = (s: string): string => (plain ? s : pc.bold(s));\n const cyan = (s: string): string => (plain ? s : pc.cyan(s));\n const paint = (confidence: string): string => {\n if (plain) return confidence;\n if (confidence === 'high') return pc.green(confidence);\n if (confidence === 'medium') return pc.yellow(confidence);\n return pc.dim(confidence);\n };\n\n const lines: string[] = [];\n const langs = languagesLine(report.stats.languages);\n lines.push(` ${dim('source'.padEnd(8))}${report.source}`);\n lines.push(\n ` ${dim('files'.padEnd(8))}${report.stats.files}${langs === '' ? '' : dim(` · ${langs}`)}`,\n );\n const e = report.evidence;\n const counts = [\n `${e.entrypoints.length} entrypoint(s)`,\n `${e.routes.length} route(s)`,\n `${e.schemas.length} schema(s)`,\n `${e.packages.length} package(s)`,\n `${e.externals.length} external(s)`,\n `${e.godNodes.length} god node(s)`,\n ].join(' · ');\n lines.push(` ${dim('found'.padEnd(8))}${counts}`);\n lines.push('');\n\n if (report.recommendations.length === 0) {\n lines.push(` ${bold('No recommendations.')} ${dim('The audit found too little evidence.')}`);\n } else {\n lines.push(` ${bold('Recommended docs:')}`);\n const kindWidth = Math.max(...report.recommendations.map((r) => r.kind.length));\n for (const r of report.recommendations) {\n lines.push(\n ` ${paint(r.confidence.padEnd(7))} ${cyan(r.kind.padEnd(kindWidth))} ${r.rationale} ${dim(`(${r.citations.length} citation(s))`)}`,\n );\n }\n }\n lines.push('');\n lines.push(` ${dim('Next:')} run ${cyan('/chiltepin audit')} in Claude Code to generate the docs you pick.`);\n if (report.notice !== undefined) lines.push(` ${dim(`note: ${report.notice}`)}`);\n lines.push('');\n return lines.join('\\n');\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}. */\ninterface 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 `chiltepin 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 'chiltepin-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 * The CLI's brand marks — a compact one-line banner for `chiltepin` / `chiltepin --help`\n * — plus the per-command action banners and the grouped help epilogue.\n *\n * Both respect non-TTY stdout and `CHILTEPIN_PLAIN=1`: piped output gets one\n * plain, uncolored line (no ANSI escapes, no cfonts art).\n */\n\nimport pc from 'picocolors';\nimport cfonts from 'cfonts'; // CJS module — default import, then `.render`\n\nconst TAGLINE = 'Documentation-as-code — Markdown with typed, fenced YAML blocks.';\n\n/** Chile red — the ripe→dried gradient the per-command action\n * banners (studio, check, …) render in. Same accent as the render skin. */\nconst BRAND_GRADIENT = ['#e4744c', '#b04a25'];\n\n/** True when output must stay plain: piped/redirected stdout or CHILTEPIN_PLAIN=1. */\nconst plainOutput = (): boolean =>\n process.stdout.isTTY !== true || process.env['CHILTEPIN_PLAIN'] === '1';\n\n/** The one-line plain (uncolored) banner used whenever ANSI isn't welcome. */\nconst plainLine = (version: string): string => `chiltepin v${version} — ${TAGLINE}`;\n\n/**\n * A fun per-command header: the action word rendered big in chile red via\n * cfonts (e.g. \"slides\", \"preview\", \"check\").\n */\nexport function actionBanner(word: string): string {\n try {\n const out = cfonts.render(word, {\n font: 'tiny',\n gradient: BRAND_GRADIENT,\n transitionGradient: true,\n space: false,\n env: 'node',\n });\n if (out !== false && typeof out === 'object' && out.string !== undefined) {\n return `\\n${out.string}\\n`;\n }\n } catch {\n /* fall back to a plain bold word */\n }\n return `\\n ${pc.red(pc.bold(word))}\\n`;\n}\n\nconst FUN_LINES: Readonly<Record<string, string>> = {\n html: 'Roasting your doc into HTML…',\n slides: 'Slicing the pepper into slides…',\n pdf: 'Drying one PDF in the sun…',\n preview: 'Tasting the preview…',\n check: 'Checking the crop for bad pods…',\n new: 'Planting a fresh doc…',\n demo: 'Serving up the chiltepin demo…',\n build: 'Grinding the whole harvest into a site…',\n serve: 'Serving fresh docs — reloads on save…',\n studio: 'Opening the studio — the harvest goes visual…',\n};\n\n/** A fun, action-themed chile status line. */\nexport function funLine(action: string): string {\n return pc.dim(` ${FUN_LINES[action] ?? `${action}…`}`);\n}\n\n/**\n * The compact banner shown on `chiltepin` / `chiltepin --help`: a single line — red\n * chile glyph, bold wordmark, dim version + tagline. Plain and uncolored\n * when stdout isn't a TTY or `CHILTEPIN_PLAIN=1`.\n */\nexport function banner(version = '0.0.2'): string {\n if (plainOutput()) return `\\n${plainLine(version)}\\n`;\n const glyph = pc.red('●');\n const name = pc.bold(pc.red('chiltepin'));\n return `\\n ${glyph} ${name} ${pc.dim(`v${version} — ${TAGLINE}`)}\\n`;\n}\n\n/** The command groups shown after top-level help, in display order. */\nconst HELP_GROUPS: ReadonlyArray<{\n readonly header: string;\n readonly commands: readonly string[];\n}> = [\n { header: 'WORK', commands: ['init', 'new', 'check', 'studio'] },\n { header: 'OUTPUT', commands: ['html', 'slides', 'pdf', 'build'] },\n { header: 'REFERENCE', commands: ['block', 'demo'] },\n { header: 'SETUP', commands: ['sync'] },\n];\n\n/** The grouped command epilogue, shown after top-level help. Uncolored when\n * output must stay plain — picocolors alone would still emit ANSI on piped\n * output whenever a `CI` env var is set (e.g. GitHub Actions). */\nexport function examples(): string {\n const p = plainOutput();\n const dim = (s: string): string => (p ? s : pc.dim(s));\n const cyan = (s: string): string => (p ? s : pc.cyan(s));\n const rows = HELP_GROUPS.map(\n (g) => ` ${dim(g.header.padEnd(10))}${g.commands.map((c) => cyan(c)).join(dim(' · '))}`,\n );\n return [\n '',\n ...rows,\n '',\n ` ${cyan('chiltepin <file.md>')} ${dim('renders + opens a doc — the fastest preview')}`,\n ` ${cyan('npx skills add jdiejim/chiltepin')} ${dim('installs the authoring skill into your AI agent')}`,\n ` ${dim('Docs:')} https://github.com/jdiejim/chiltepin`,\n '',\n ].join('\\n');\n}\n\n/**\n * Real usage examples per visible command — one data table drives every\n * command's `--help` EXAMPLES epilogue ({@link commandExamples}).\n */\nconst COMMAND_EXAMPLES: Readonly<\n Record<string, ReadonlyArray<readonly [cmd: string, note: string]>>\n> = {\n init: [\n ['chiltepin init', 'scaffold docs/ and chiltepin.config.json'],\n ['chiltepin init --force', 'overwrite the starter files'],\n ],\n new: [\n ['chiltepin new', 'pick a doc template or block scaffold interactively'],\n ['chiltepin new adr -o docs/decisions/001-queue.md', 'scaffold an ADR into a file'],\n ['chiltepin new sequence', 'print a sequence-block scaffold to paste'],\n ],\n check: [\n ['chiltepin check', 'validate every doc under docs/'],\n ['chiltepin check docs/api.md', 'validate one file'],\n ['chiltepin check --json', 'machine-readable diagnostics (CI)'],\n ],\n studio: [\n ['chiltepin studio', 'open the studio — Edit · Site · Present, files stay the source of truth'],\n ['chiltepin studio --port 5000 --no-open', 'pick the port, skip the browser'],\n ],\n html: [\n ['chiltepin html docs/design.md', 'write docs/design.html next to the source'],\n ['chiltepin html docs/design.md -p', 'render to a temp file and open it'],\n ],\n slides: [\n ['chiltepin slides docs/roadmap.md -p', 'open the doc as a slide deck'],\n ['chiltepin slides docs/roadmap.md -o deck.html', 'write the deck to a file'],\n ],\n pdf: [\n ['chiltepin pdf docs/design.md', 'write docs/design.pdf (downloads Chromium once)'],\n ['chiltepin pdf docs/design.md -o out/design.pdf', 'choose the output path'],\n ],\n build: [\n ['chiltepin build', 'build the whole site into dist/'],\n ['chiltepin build --out site', 'build into a different directory'],\n ],\n block: [\n ['chiltepin block', 'every block type, one line each, by family'],\n ['chiltepin block sequence', 'fields, enums, terse forms, and a validating example'],\n ['chiltepin block erd --json', 'the same contract as JSON'],\n ],\n demo: [\n ['chiltepin demo', 'render the built-in showcase of every block and open it'],\n ['chiltepin demo charts -s', 'one family, as a slide deck'],\n ],\n sync: [\n ['chiltepin sync openapi api.yaml -o docs/api.md', 'generate a doc from an OpenAPI spec'],\n ['chiltepin sync openapi api.yaml --check docs/api.md', 'fail on drift (CI)'],\n [\n 'chiltepin sync csv sales.csv',\n 'print a ready-to-paste block (auto-picks table/statustable/chart)',\n ],\n [\n 'chiltepin sync csv sales.csv -o docs/sales.md',\n 'wrap the block in a doc, write it, and validate',\n ],\n ['chiltepin sync csv sales.csv --block chart', 'force the target block type'],\n ],\n};\n\n/**\n * The EXAMPLES epilogue for one command's `--help`, or `''` when the command\n * has no examples (hidden compat commands). Plain-aware like {@link examples}.\n */\nexport function commandExamples(name: string): string {\n const rows = COMMAND_EXAMPLES[name];\n if (rows === undefined) return '';\n const p = plainOutput();\n const dim = (s: string): string => (p ? s : pc.dim(s));\n const cyan = (s: string): string => (p ? s : pc.cyan(s));\n const width = Math.max(...rows.map(([cmd]) => cmd.length));\n return [\n '',\n 'Examples:',\n ...rows.map(([cmd, note]) => ` ${cyan('$ ' + cmd.padEnd(width))} ${dim(note)}`),\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 CHILTEPIN_PLAIN). */\nexport const isInteractive: boolean =\n process.stdout.isTTY === true &&\n process.env['CI'] !== 'true' &&\n process.env['CHILTEPIN_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 } from 'ink';\nimport { findConfig, loadConfig } from './io/config.js';\nimport { cliVersion } from './io/version.js';\nimport { runCheck } from './commands/check.js';\nimport {\n parseExportSize,\n runSingle,\n type ExportSize,\n type SingleFormat,\n} from './commands/single.js';\nimport { runDemo } from './commands/demo.js';\nimport { DemoApp, type DemoPick } from './commands/DemoApp.js';\nimport { runBuild } from './commands/build.js';\nimport { runServe } from './commands/serve.js';\nimport { runStudio } from './commands/studio.js';\nimport { runInit, type InitResult } from './commands/init.js';\nimport { blockIndex, blockReference, resolveBlockName } from './commands/block.js';\nimport { copyToClipboard } from './io/clipboard.js';\nimport { systemPrompt } from './commands/skill.js';\nimport { resolve as resolvePath } from 'node:path';\nimport { writeFileSafe } from './io/write.js';\nimport {\n runSyncCsv,\n runSyncOpenApi,\n runSyncSchema,\n type CsvBlockKind,\n type SchemaDialect,\n} from './commands/sync.js';\nimport {\n templateFor,\n writeNewDoc,\n NewPickerApp,\n DOC_TEMPLATES,\n DOC_TEMPLATE_INFO,\n isDocTemplate,\n} from './commands/new.js';\nimport { projectStatus, formatStatus } from './commands/status.js';\nimport { runAudit, formatAudit } from './commands/audit/run.js';\nimport { DiagnosticsTable, formatDiagnosticsPlain } from './ui/DiagnosticsTable.js';\nimport { banner, examples, commandExamples, actionBanner, funLine } from './ui/banner.js';\nimport { isInteractive } from './tty.js';\n\n/** Prints the cfonts action banner + a fun line for a command (interactive only). */\nfunction flourish(word: string, lineKey: string = word): void {\n if (!isInteractive) return;\n console.log(actionBanner(word));\n console.log(funLine(lineKey) + '\\n');\n}\nimport type { BlockType } from 'chiltepin-core';\nimport {\n BLOCK_TYPES,\n BLOCK_ALIASES,\n BLOCK_FAMILIES,\n familyBlocks,\n isBlockFamily,\n type BlockFamily,\n} from 'chiltepin-core';\n\n/** Prints the created/skipped files and next-step hints after `chiltepin init`. */\nfunction printInitSummary(result: InitResult): void {\n for (const f of result.created) console.log(pc.green('+ ') + f);\n for (const f of result.skipped) console.log(pc.dim(' skip ') + f + pc.dim(' (exists)'));\n console.log(\n pc.bold(`\\nCreated ${result.created.length} file(s), skipped ${result.skipped.length}.`),\n );\n console.log(\n pc.dim(\n 'Layout: docs/<area>/<doc>.md, kebab-case names · output goes to dist/ — do not commit it.',\n ),\n );\n console.log(\n `Next: ${pc.cyan('chiltepin check')} ${pc.dim('·')} ${pc.cyan('chiltepin docs/getting-started.md')} ${pc.dim('(render + open)')}`,\n );\n console.log(\n `AI: ${pc.cyan('npx skills add jdiejim/chiltepin')} ${pc.dim('installs the authoring skill into Claude Code, Cursor, Codex, and 70+ agents')}`,\n );\n}\n\n/** Runs the CLI for the given argv (typically `process.argv`). */\nexport async function main(argv: readonly string[]): Promise<number> {\n // Both spellings work: commander allows one short flag per option, so a\n // lone -V normalizes to --version before parsing.\n argv = argv.map((a) => (a === '-V' ? '--version' : a));\n const version = cliVersion();\n const program = new Command();\n program\n .name('chiltepin')\n .description('Author, validate, render, and export Chiltepin documentation.')\n // Lowercase -v is what fingers type; commander's default is -V only, so\n // register the flag string explicitly and alias -V below.\n .version(version, '-v, --version', 'print the version')\n // Banner + workflow only on top-level help — not on every subcommand's --help.\n .addHelpText('beforeAll', (ctx) => (ctx.command.name() === 'chiltepin' ? banner(version) : ''))\n .addHelpText('after', (ctx) => (ctx.command.name() === 'chiltepin' ? examples() : ''))\n .exitOverride();\n\n let exitCode = 0;\n\n // Smart bare `chiltepin` + the `chiltepin <file.md>` shortcut. A bare .md argument is\n // the most natural gesture, so it becomes the shortest command: render +\n // open (today's preview). Bare `chiltepin` in a TTY shows a mini project status\n // (or an init hint outside a project); non-TTY keeps the help output.\n program\n .argument('[file]', 'a .md file to render + open in the browser (same as `chiltepin html <file> -p`)')\n .action(async (file: string | undefined) => {\n const cwd = process.cwd();\n if (file !== undefined) {\n if (!/\\.md$/i.test(file)) {\n // Keep the unknown-command contract for non-.md strays (`chiltepin claude`).\n console.error(`error: unknown command '${file}'`);\n exitCode = 1;\n return;\n }\n flourish('preview');\n const result = await runSingle({\n cwd,\n input: file,\n format: 'html',\n preview: true,\n open: isInteractive, // script-safe: piped output renders but doesn't open\n });\n const verb = result.opened ? 'Opened' : 'Wrote';\n console.log(`${pc.green(verb)} ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n return;\n }\n\n // Non-TTY / CHILTEPIN_PLAIN: stay script-safe — print the regular help.\n if (!isInteractive) {\n program.outputHelp();\n return;\n }\n\n console.log(banner(version));\n if (findConfig(cwd) === undefined) {\n console.log(` Not a Chiltepin project yet — run ${pc.cyan('chiltepin init')} to scaffold one.`);\n console.log(\n ` ${pc.dim('Curious first?')} ${pc.cyan('chiltepin demo')} ${pc.dim('renders every block · ')}${pc.cyan('chiltepin block')} ${pc.dim('lists them.')}`,\n );\n console.log('');\n return;\n }\n const status = await projectStatus(cwd);\n console.log(formatStatus(status));\n });\n\n program\n .command('init')\n .description('Scaffold a new Chiltepin project in the current directory')\n .option('--force', 'overwrite existing files')\n .option('-y, --yes', 'accepted for compatibility (init has no prompts)', undefined)\n .action(async (opts: { force?: boolean }) => {\n const result = await runInit({\n cwd: process.cwd(),\n ...(opts.force === true ? { force: true } : {}),\n });\n printInitSummary(result);\n });\n\n program\n .command('check [globs...]')\n .description('Validate documents (default: docs/**/*.md)')\n .option('--json', 'emit machine-readable JSON')\n .option('--strict-prose', 'treat prose-lint warnings (W_PROSE_*) as errors')\n .action(async (globs: string[], opts: { json?: boolean; strictProse?: 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({\n patterns,\n cwd,\n docsRoot: config.docsDir,\n ...(opts.strictProse === true ? { strictProse: true } : {}),\n });\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 flourish('check');\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 // `chiltepin audit [path]` — evidence report + rule-derived doc recommendations.\n // Informational: exits 0 whenever the path is usable, 2 when it is not.\n program\n .command('audit [path]')\n .description('Audit a codebase and recommend which Chiltepin docs to write (evidence-cited)')\n .option('--json', 'emit machine-readable JSON (schema version 1)')\n .action(async (pathArg: string | undefined, opts: { json?: boolean }) => {\n const result = await runAudit({\n cwd: process.cwd(),\n ...(pathArg !== undefined ? { path: pathArg } : {}),\n });\n if (!result.ok) {\n console.error(pc.red(result.error));\n exitCode = 2;\n return;\n }\n if (opts.json === true) {\n process.stdout.write(JSON.stringify(result.report, null, 2) + '\\n');\n return;\n }\n if (isInteractive) {\n flourish('audit');\n console.log(formatAudit(result.report, false));\n } else {\n process.stdout.write(formatAudit(result.report, true) + '\\n');\n }\n });\n\n // Hidden compat: `chiltepin preview` ≡ `chiltepin <file.md>` ≡ `chiltepin html <file> -p`.\n program\n .command('preview <input>', { hidden: true })\n .description('Render a document to a temp HTML file and open it (same as `chiltepin <file.md>`)')\n .action(async (input: string) => {\n flourish('preview');\n const result = await runSingle({\n cwd: process.cwd(),\n input,\n format: 'html',\n preview: true,\n open: isInteractive,\n });\n const verb = result.opened ? 'Opened' : 'Wrote';\n console.log(`${pc.green(verb)} ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n });\n\n // `chiltepin new [name]` — one verb for \"make something\": doc templates (adr,\n // runbook, …) AND single-block scaffolds (sequence, erd, …), resolved by\n // name (alias spellings like `waterfall` resolve to their canonical block).\n // Bare + TTY → two-section Ink picker; bare + non-TTY → list the names.\n program\n .command('new [name]')\n .description(\n 'Create from a template — a full doc (adr, runbook, …) or a single block (sequence, erd, …)',\n )\n .option('-o, --output <path>', 'write to a file instead of printing to stdout')\n .option('--force', 'with -o, replace the file if it already exists')\n .action(async (nameArg: string | undefined, opts: { output?: string; force?: boolean }) => {\n const cwd = process.cwd();\n\n // Resolve a name: doc template → block type → permanent alias.\n const resolveName = (n: string): { type: string; note?: string } | undefined => {\n if (isDocTemplate(n) || BLOCK_TYPES.includes(n as BlockType)) return { type: n };\n const alias = BLOCK_ALIASES[n];\n if (alias !== undefined) {\n const patch = Object.entries(alias.patch ?? {})\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(', ');\n return {\n type: alias.type,\n note: `\\`${n}\\` now lives in \\`${alias.type}\\`${patch === '' ? '' : ` (${patch})`} — both spellings work; no change needed.`,\n };\n }\n return undefined;\n };\n\n const emit = async (type: string): Promise<void> => {\n if (opts.output !== undefined) {\n const p = await writeNewDoc({\n cwd,\n type,\n out: opts.output,\n ...(opts.force === true ? { force: true } : {}),\n });\n console.log(`${pc.green('✓')} Wrote ${p}`);\n return;\n }\n const content = isDocTemplate(type)\n ? (DOC_TEMPLATES[type] as string)\n : templateFor(type as BlockType);\n if (isInteractive)\n console.log(pc.dim(`# ${type} — paste into a docs/*.md (or re-run with -o <path>)\\n`));\n process.stdout.write(content);\n if (isInteractive && copyToClipboard(content))\n console.log(pc.green('\\n✓ copied to clipboard'));\n };\n\n if (nameArg !== undefined) {\n const hit = resolveName(nameArg);\n if (hit === undefined) {\n console.error(\n pc.red(`Unknown template or block: ${nameArg}. Run \\`chiltepin new\\` to list them.`),\n );\n exitCode = 2;\n return;\n }\n // The alias note rides stderr so piped stdout stays a clean template.\n if (hit.note !== undefined) console.error(pc.yellow(hit.note));\n await emit(hit.type);\n return;\n }\n\n // Bare `chiltepin new`, non-TTY: list every name (script-safe).\n if (!isInteractive) {\n console.log('Doc templates:');\n for (const [name, info] of Object.entries(DOC_TEMPLATE_INFO)) {\n console.log(` ${name.padEnd(14)}${info.description}`);\n }\n console.log('\\nBlocks:');\n for (const fam of BLOCK_FAMILIES) {\n console.log(` ${fam.label}: ${familyBlocks(fam.id).join(' ')}`);\n }\n console.log('\\nUsage: chiltepin new <name> [-o <path>]');\n return;\n }\n\n // Bare `chiltepin new`, TTY: two-section picker (Doc templates | Blocks by family).\n flourish('new');\n let picked: string | undefined;\n const { waitUntilExit } = inkRender(\n <NewPickerApp\n onPick={(n) => {\n picked = n;\n }}\n />,\n );\n await waitUntilExit();\n if (picked === undefined) return; // cancelled with q / escape\n await emit(picked);\n });\n\n // `chiltepin build` — render every doc into a static HTML site under outDir.\n program\n .command('build')\n .description('Build a static HTML site from all docs — index, sidebar nav, cross-doc links')\n .option('--out <dir>', 'output directory (default: config outDir, \"dist\")')\n .option(\n '--rich-index',\n 'build the rich index page — project TLDR, doc map by tag, cross-reference graph (default)',\n )\n .option('--no-rich-index', 'build the plain card-grid index instead')\n .action(async (opts: { out?: string; richIndex?: boolean }) => {\n flourish('build');\n const result = await runBuild({\n cwd: process.cwd(),\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.richIndex !== undefined ? { richIndex: opts.richIndex } : {}),\n });\n // Schema/ref findings are warnings here — `chiltepin check` stays the gate.\n // A render failure (E_RENDER) is an error: it names the document and the\n // block, the rest of the build still ran, and the exit code is 1.\n if (result.diagnostics.length > 0) {\n for (const d of result.diagnostics) {\n const loc = d.line !== undefined ? `${d.file}:${d.line}` : d.file;\n const fatal = d.code === 'E_RENDER' || d.code === 'E_ENCODING';\n const line = `${fatal ? 'error' : 'warn '} ${loc} ${d.code} ${d.message}`;\n console.error(fatal ? pc.red(line) : pc.yellow(line));\n }\n const errors = result.diagnostics.filter(\n (d) => d.code === 'E_RENDER' || d.code === 'E_ENCODING',\n ).length;\n const warnings = result.diagnostics.length - errors;\n const parts: string[] = [];\n if (errors > 0) parts.push(`${errors} error(s)`);\n if (warnings > 0) parts.push(`${warnings} warning(s)`);\n console.error(\n (errors > 0 ? pc.red : pc.yellow)(`${parts.join(', ')} — run \\`chiltepin check\\` for details`),\n );\n }\n const bytes = result.pages.reduce((sum, p) => sum + p.bytes, 0);\n // Decks are companion views, not documents — report them separately so\n // \"page(s)\" keeps meaning index + one per doc.\n const decks = result.pages.filter((p) => p.path.endsWith('.slides.html')).length;\n const deckPart = decks > 0 ? ` + ${decks} deck(s)` : '';\n console.log(\n `${pc.green('✓')} ${result.pages.length - decks} page(s)${deckPart} → ${result.outDirRel}/ ${pc.dim(`(${bytes} bytes)`)}`,\n );\n // Pruning: only files the previous build recorded as its own are removed.\n if (result.removed.length > 0) {\n for (const p of result.removed) console.log(pc.dim(` removed ${p}`));\n console.log(\n `${pc.green('✓')} ${result.removed.length} stale file(s) removed ${pc.dim('(no longer generated)')}`,\n );\n }\n if (result.pruneDeferred) {\n console.log(\n pc.dim(\n `Note: ${result.outDirRel}/ had no build manifest, so nothing was pruned. The next build prunes what this one generated.`,\n ),\n );\n }\n exitCode = result.exitCode;\n });\n\n // Hidden compat: `chiltepin serve` still works, but `chiltepin studio` (Site mode) is\n // the one local surface — it mounts the same live-reloading site at /site/.\n program\n .command('serve', { hidden: true })\n .description(\n 'Serve the docs site locally with live reload (compat — `chiltepin studio` includes this as Site mode)',\n )\n .option('--port <n>', 'port to listen on (0 = pick a free port)', '4173')\n .option('--no-open', \"don't open the browser\")\n .option(\n '--rich-index',\n 'serve the rich index page — project TLDR, doc map by tag, cross-reference graph (default)',\n )\n .option('--no-rich-index', 'serve the plain card-grid index instead')\n .action(async (opts: { port: string; open: boolean; richIndex?: boolean }) => {\n flourish('serve');\n const parsed = Number.parseInt(opts.port, 10);\n await runServe({\n cwd: process.cwd(),\n port: Number.isNaN(parsed) ? 4173 : parsed,\n open: opts.open,\n ...(opts.richIndex !== undefined ? { richIndex: opts.richIndex } : {}),\n });\n });\n\n // `chiltepin studio` — THE local surface: visual editor over a file-bridge API\n // (files stay canonical) with Edit | Site | Present modes in one server.\n program\n .command('studio')\n .description(\n 'open the local studio — a Home page of your docs, edit in place, present as slides; the built site is one click away; files stay the source of truth',\n )\n .option('--port <n>', 'port to listen on (0 = pick a free port)', '4174')\n .option('--no-open', \"don't open the browser\")\n .action(async (opts: { port: string; open: boolean }) => {\n flourish('studio');\n const parsed = Number.parseInt(opts.port, 10);\n await runStudio({\n cwd: process.cwd(),\n port: Number.isNaN(parsed) ? 4174 : parsed,\n open: opts.open,\n });\n });\n\n const syncCmd = program\n .command('sync')\n .description(\n 'Generate Chiltepin docs from external sources (OpenAPI, CSV, SQL / DBML / Prisma schemas)',\n );\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 .option('--force', 'with --out, replace the file if it already exists')\n .action(\n async (\n spec: string,\n opts: { out?: string; check?: string; slug?: string; force?: boolean },\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 ...(opts.force === true ? { force: true } : {}),\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 syncCmd\n .command('csv <file>')\n .description('Turn a CSV into a table/statustable/chart block (stdout), or a whole doc (--out)')\n .option('-o, --out <path>', 'write a minimal doc (meta + block) to this path and validate it')\n .option('--block <type>', 'target block: table | statustable | chart (default: auto-suggest)')\n .option('--title <title>', 'doc title with --out (default: prettified file name)')\n .option('--delimiter <d>', 'field delimiter: \",\" \";\" or \"tab\" (default: auto-detect)')\n .option('--force', 'with --out, replace the file if it already exists')\n .action(\n async (\n file: string,\n opts: { out?: string; block?: string; title?: string; delimiter?: string; force?: boolean },\n ) => {\n if (\n opts.block !== undefined &&\n opts.block !== 'table' &&\n opts.block !== 'statustable' &&\n opts.block !== 'chart'\n ) {\n console.error(pc.red(`Unknown block: ${opts.block}. Use table | statustable | chart.`));\n exitCode = 2;\n return;\n }\n const result = await runSyncCsv({\n cwd: process.cwd(),\n file,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.block !== undefined ? { block: opts.block as CsvBlockKind } : {}),\n ...(opts.title !== undefined ? { title: opts.title } : {}),\n ...(opts.delimiter !== undefined ? { delimiter: opts.delimiter } : {}),\n ...(opts.force === true ? { force: true } : {}),\n });\n // Auto-picked block: say why, on stderr so piped stdout stays a clean fence.\n if (result.reason !== undefined) {\n console.error(pc.dim(`→ ${result.block}: ${result.reason}`));\n }\n for (const w of result.warnings) console.error(pc.yellow(`warn ${w}`));\n if (result.message !== undefined) {\n console.error(pc.red(result.message));\n exitCode = result.exitCode;\n return;\n }\n if (result.fence !== undefined) {\n process.stdout.write(result.fence);\n if (isInteractive && copyToClipboard(result.fence)) {\n console.log(pc.green('\\n✓ copied to clipboard'));\n }\n }\n if (result.outPath !== undefined) {\n console.log(`${pc.green('✓')} Wrote ${result.outPath} ${pc.dim(`(${result.block})`)}`);\n const diags = result.check?.diagnostics ?? [];\n if (diags.length === 0) {\n console.log(`${pc.green('✓')} chiltepin check: clean`);\n } else {\n for (const d of diags) {\n const loc = d.line !== undefined ? `${d.file}:${d.line}` : d.file;\n const paint = d.level === 'error' ? pc.red : pc.yellow;\n console.error(paint(`${d.level} ${loc} ${d.code} ${d.message}`));\n }\n console.error(pc.dim(`chiltepin check: ${diags.length} diagnostic(s)`));\n }\n }\n exitCode = result.exitCode;\n },\n );\n // `chiltepin sync sql | dbml | prisma <file>` — a database schema → an `erd` fence (stdout) or a doc (--out).\n const schemaSync = (dialect: SchemaDialect, what: string): void => {\n syncCmd\n .command(`${dialect} <file>`)\n .description(`Turn ${what} into an erd block (stdout), or a whole doc (--out)`)\n .option('-o, --out <path>', 'write a minimal doc (meta + erd) to this path and validate it')\n .option('--title <title>', 'doc title with --out (default: prettified file name)')\n .option('--id <id>', 'block id (default: the file stem as a slug)')\n .option('--force', 'with --out, replace the file if it already exists')\n .action(\n async (\n file: string,\n opts: { out?: string; title?: string; id?: string; force?: boolean },\n ) => {\n const result = await runSyncSchema({\n cwd: process.cwd(),\n file,\n dialect,\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n ...(opts.title !== undefined ? { title: opts.title } : {}),\n ...(opts.id !== undefined ? { id: opts.id } : {}),\n ...(opts.force === true ? { force: true } : {}),\n });\n if (result.message !== undefined) {\n console.error(pc.red(result.message));\n exitCode = result.exitCode;\n return;\n }\n if (result.fence !== undefined) {\n process.stdout.write(result.fence);\n if (isInteractive && copyToClipboard(result.fence)) {\n console.log(pc.green('\\n✓ copied to clipboard'));\n }\n }\n if (result.outPath !== undefined) {\n console.log(\n `${pc.green('✓')} Wrote ${result.outPath} ${pc.dim(`(erd · ${result.entities} entities · ${result.relations} relations)`)}`,\n );\n const diags = result.check?.diagnostics ?? [];\n if (diags.length === 0) {\n console.log(`${pc.green('✓')} chiltepin check: clean`);\n } else {\n for (const d of diags) {\n const loc = d.line !== undefined ? `${d.file}:${d.line}` : d.file;\n const paint = d.level === 'error' ? pc.red : pc.yellow;\n console.error(paint(`${d.level} ${loc} ${d.code} ${d.message}`));\n }\n console.error(pc.dim(`chiltepin check: ${diags.length} diagnostic(s)`));\n }\n }\n exitCode = result.exitCode;\n },\n );\n };\n schemaSync('sql', 'SQL DDL (CREATE TABLE …)');\n schemaSync('dbml', 'a DBML schema');\n schemaSync('prisma', 'a Prisma schema');\n\n // Single-document shortcuts: `chiltepin html|slides|pdf <input> [-o out] [-p]`.\n const single = (name: SingleFormat, desc: string): void => {\n const cmd = program\n .command(`${name} <input>`)\n .description(desc)\n .option('-o, --output <path>', 'output file path')\n .option('-p, --preview', 'render to a temp file and open it in the browser')\n .option(\n '--force',\n `with -o, replace a file that is not already a .${name === 'slides' ? 'html' : name} file`,\n );\n if (name === 'html' || name === 'pdf') {\n cmd.option(\n '--size <preset>',\n 'set the page width: sm (720 px) | md (960 px) | lg (1280 px) | xl (1600 px). Without this option, the page keeps the default width.',\n );\n }\n cmd.action(\n async (\n input: string,\n opts: {\n output?: string;\n preview?: boolean;\n size?: string;\n force?: boolean;\n },\n ) => {\n let size: ExportSize | undefined;\n if (opts.size !== undefined) {\n size = parseExportSize(opts.size);\n if (size === undefined) {\n console.error(pc.red(`Unknown size: ${opts.size}. Use one of: sm | md | lg | xl`));\n exitCode = 2;\n return;\n }\n }\n const word = opts.preview === true ? 'preview' : name;\n if (isInteractive) {\n console.log(actionBanner(word));\n console.log(funLine(word) + '\\n');\n }\n const result = await runSingle({\n cwd: process.cwd(),\n input,\n format: name,\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n ...(opts.preview === true ? { preview: true } : {}),\n ...(size !== undefined ? { size } : {}),\n ...(opts.force === true ? { force: true } : {}),\n });\n const verb = result.opened ? 'Opened' : 'Wrote';\n console.log(`${pc.green(verb)} ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n },\n );\n };\n single('html', 'Render one document to a standalone HTML file');\n single('slides', 'Render one document to a self-contained slide deck');\n single('pdf', 'Render one document to a PDF (needs Chromium once)');\n\n // `chiltepin demo [family] [-s]` — render the bundled showcase doc (all blocks, or\n // one family) and open it (-s = slides). Bare TTY invocation shows a picker.\n program\n .command('demo [family]')\n .description(\n `Render the built-in showcase and open it — all blocks or one family (${BLOCK_FAMILIES.map((f) => f.id).join(' | ')}); -s for a slide deck`,\n )\n .option('-s, --slides', 'render as a slide deck')\n .option('-o, --output <path>', 'write the rendered file to a path (implies --no-open)')\n .option('--no-open', \"write the file but don't open it\")\n .option('--force', 'with -o, replace a file that is not already an .html file')\n .action(\n async (\n familyArg: string | undefined,\n opts: { slides?: boolean; open?: boolean; output?: string; force?: boolean },\n ) => {\n let family: BlockFamily | undefined;\n if (familyArg !== undefined) {\n if (!isBlockFamily(familyArg)) {\n const choices = BLOCK_FAMILIES.map((f) => f.id).join(' | ');\n console.error(pc.red(`Unknown family: ${familyArg}. Try one of: ${choices}`));\n exitCode = 2;\n return;\n }\n family = familyArg;\n } else if (isInteractive) {\n // Bare `chiltepin demo` in a TTY: pick a family (or everything) interactively.\n let picked: DemoPick | undefined;\n const { waitUntilExit } = inkRender(\n <DemoApp\n onPick={(p) => {\n picked = p;\n }}\n />,\n );\n await waitUntilExit();\n if (picked === undefined) return; // cancelled with q / escape\n family = picked.family;\n }\n flourish('demo');\n const result = await runDemo({\n format: opts.slides === true ? 'slides' : 'html',\n ...(family !== undefined ? { family } : {}),\n ...(opts.output !== undefined\n ? { output: resolvePath(process.cwd(), opts.output) }\n : { preview: opts.open !== false }),\n ...(opts.force === true ? { force: true } : {}),\n });\n const verb = result.opened ? 'Opened' : 'Wrote';\n console.log(`${pc.green(verb)} ${result.output} ${pc.dim(`(${result.bytes} bytes)`)}`);\n },\n );\n\n // `chiltepin block [type]` — the reference an agent reads: every block on one\n // line (no argument), or one block's fields, terse forms, and a validating\n // example, all derived from the schema. `--json` for the structured form.\n program\n .command('block [type]')\n .description(\n \"Block reference — every type on one line, or one type's fields, enums, terse forms, and example\",\n )\n .option('--json', 'emit the contract as JSON')\n .action((typeArg: string | undefined, opts: { json?: boolean }) => {\n if (typeArg === undefined) {\n process.stdout.write(blockIndex());\n return;\n }\n const hit = resolveBlockName(typeArg);\n if (hit === undefined) {\n console.error(pc.red(`Unknown block: ${typeArg}. Run \\`chiltepin block\\` to list them.`));\n exitCode = 2;\n return;\n }\n // The alias note rides stderr so piped stdout stays the clean contract.\n if (hit.alias !== undefined) {\n console.error(\n pc.yellow(\n `\\`${hit.alias}\\` is an old spelling of \\`${hit.type}\\` — both work; showing \\`${hit.type}\\`.`,\n ),\n );\n }\n process.stdout.write(blockReference(hit.type, opts.json === true));\n });\n\n // `chiltepin skill` — emit the authoring grammar as a copy-paste system prompt for\n // any tool without a repo-file adapter (Microsoft 365 Copilot, a custom GPT,\n // ChatGPT, Gemini). Prints to stdout (so it pipes), copies to the clipboard in\n // a terminal, or writes to a file with -o.\n program\n .command('skill', { hidden: true })\n .description(\n 'Print the Chiltepin authoring grammar as a copy-paste system prompt (for Copilot / custom GPTs / any AI)',\n )\n .option('-o, --output <path>', 'write the system prompt to a file instead of printing it')\n .option(\n '--raw',\n 'emit the raw skill file verbatim (with frontmatter) instead of the wrapped prompt',\n )\n .option('--force', 'with -o, replace the file if it already exists')\n .action(async (opts: { output?: string; raw?: boolean; force?: boolean }) => {\n const text = await systemPrompt({ ...(opts.raw === true ? { raw: true } : {}) });\n if (opts.output !== undefined) {\n await writeFileSafe(\n resolvePath(process.cwd(), opts.output),\n text,\n opts.force === true ? { force: true } : {},\n );\n console.log(`${pc.green('✓')} Wrote ${opts.output} ${pc.dim(`(${text.length} chars)`)}`);\n return;\n }\n if (isInteractive) {\n console.log(\n pc.dim(\n \"# Chiltepin system prompt — paste into your tool's system / custom-instructions box\\n\",\n ),\n );\n }\n console.log(text);\n if (isInteractive && copyToClipboard(text)) {\n console.log(pc.green('\\n✓ copied to clipboard') + pc.dim(` (${text.length} chars)`));\n }\n });\n\n // Per-command EXAMPLES epilogue — one data table in banner.ts drives them.\n for (const cmd of program.commands) {\n const name = cmd.name();\n if (commandExamples(name) !== '') {\n cmd.addHelpText('after', () => commandExamples(name));\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","/**\n * `chiltepin` 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\n/**\n * Resolves once the stream's userspace buffer is flushed to the OS. Without this,\n * `process.exit()` can terminate before a large piped write lands — truncating\n * output at the pipe buffer (e.g. `chiltepin skill | pbcopy` cut off at 64 KiB).\n */\nfunction flush(stream: NodeJS.WriteStream): Promise<void> {\n if (stream.writableLength === 0) return Promise.resolve();\n return new Promise((resolve) => {\n // An empty write's callback runs once everything queued before it has\n // reached the OS. Waiting for 'drain' instead would hang whenever the\n // buffer never crossed the high-water mark (no 'drain' is ever emitted)\n // and end the process with an unsettled top-level await.\n stream.write('', () => resolve());\n // Also settle on error/close — a consumer that stops reading (e.g. `| head`)\n // never drains.\n stream.once('error', () => resolve());\n stream.once('close', () => resolve());\n });\n}\n\nconst code = await main(process.argv);\nawait Promise.all([flush(process.stdout), flush(process.stderr)]);\nprocess.exit(code);\n"]}
|