@sightmap/sightmap 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +625 -117
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/validate.ts","../../src/validate.ts","../../src/diagnostics.ts","../../src/parse.ts","../../src/cli/_fsHelpers.ts","../../src/cli/envelope.ts","../../src/cli/humanFormat.ts","../../src/cli/lint.ts","../../src/loadDirectory.ts","../../src/merge.ts","../../src/lintRules/duplicateName.ts","../../src/lintRules/duplicateRoute.ts","../../src/lintRules/routeShadowing.ts","../../src/lintRules/unknownSource.ts","../../src/lintRules/selectorSyntax.ts","../../src/lint.ts","../../src/cli/match.ts","../../src/routeMatch.ts","../../src/resolver.ts","../../src/match.ts","../../src/cli/explain.ts","../../src/explain.ts","../../src/cli/check.ts","../../src/cli/checkConventions.ts","../../src/conventions/walker.ts","../../src/conventions/slug.ts","../../src/conventions/rules.ts","../../src/cli/fmt.ts","../../src/format/canonicalize.ts","../../src/format/canonical-rules.ts","../../src/cli/init/index.ts","../../src/cli/init/detect/framework.ts","../../src/cli/init/detect/harness.ts","../../src/cli/init/detect/vendor.ts","../../src/cli/init/vendor-allowlist.ts","../../src/cli/init/detect/sightmap-dir.ts","../../src/cli/init/tui.ts","../../src/cli/init/mcp-config/claude-code.ts","../../src/cli/init/mcp-config/cursor.ts","../../src/cli/init/mcp-config/opencode.ts","../../src/cli/init/mcp-config/codex.ts","../../src/cli/init/tarball.ts","../../src/cli/init/skills-copy.ts","../../src/cli/init/version-pin.ts","../../src/cli/init/plugin-path.ts","../../src/cli/init/framework-setup/package-manager.ts","../../src/cli/init/framework-setup/install-adapter.ts","../../src/cli/init/framework-setup/codegen.ts","../../src/cli/init/framework-setup/provider-codemod.ts","../../src/cli/init/existing-corpus.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { runValidate } from \"./validate.js\";\nimport { runLint } from \"./lint.js\";\nimport { runMatch } from \"./match.js\";\nimport { runExplain } from \"./explain.js\";\nimport { runCheck, runCheckFromStdin } from \"./check.js\";\nimport { runCheckConventions } from \"./checkConventions.js\";\nimport { runFmt } from \"./fmt.js\";\nimport { runInit } from \"./init/index.js\";\n\nconst program = new Command();\nprogram\n .name(\"sightmap\")\n .description(\"CLI for the Sightmap spec — validate, lint, match, explain.\")\n .version(\"0.1.0\");\n\nprogram.option(\"--cwd <dir>\", \"working directory (resolves [path] arguments)\", process.cwd());\n\nprogram\n .command(\"validate [path]\")\n .description(\"Validate .sightmap/ against the schema.\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (path: string | undefined, opts: { json?: boolean }) => {\n const code = await runValidate({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n });\n process.exit(code);\n });\n\nprogram\n .command(\"lint [path]\")\n .description(\"Run quality checks beyond schema.\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--strict\", \"treat all warnings as errors (exit 1)\")\n .option(\"--rules <list>\", \"comma-separated list of rule codes to disable (prefix '-') or only-enable\")\n .action(async (path: string | undefined, opts: { json?: boolean; strict?: boolean; rules?: string }) => {\n const code = await runLint({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n strict: opts.strict === true,\n ...(opts.rules !== undefined ? { rules: opts.rules } : {}),\n });\n process.exit(code);\n });\n\nprogram\n .command(\"check [path]\")\n .description(\"Run schema + quality checks (combined validate + lint).\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--level <level>\", \"'schema' or 'quality' (default 'quality')\", \"quality\")\n .option(\"--stdin\", \"read sightmap content from stdin instead of a path\")\n .action(\n async (\n path: string | undefined,\n opts: { json?: boolean; level?: string; stdin?: boolean },\n ) => {\n const level: \"schema\" | \"quality\" = opts.level === \"schema\" ? \"schema\" : \"quality\";\n if (opts.stdin === true) {\n const stdinCode = await runCheckFromStdin({\n level,\n json: opts.json === true,\n });\n process.exit(stdinCode);\n }\n const code = await runCheck({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n level,\n json: opts.json === true,\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"match <url> [path]\")\n .description(\"Resolve sightmap context for a URL.\")\n .option(\"--method <m>\", \"HTTP method filter for requests\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--require-view\", \"exit 1 if no view matched\")\n .action(\n async (\n url: string,\n path: string | undefined,\n opts: { method?: string; json?: boolean; requireView?: boolean },\n ) => {\n const code = await runMatch({\n url,\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n requireView: opts.requireView === true,\n ...(opts.method !== undefined ? { method: opts.method } : {}),\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"explain <query> [path]\")\n .description(\"Look up sightmap entries by name and/or source path.\")\n .option(\"--by <kind>\", \"scope to 'name' or 'path'\")\n .option(\"--type <kind>\", \"scope to 'view', 'component', or 'request'\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--require-hit\", \"exit 1 if zero hits\")\n .action(\n async (\n query: string,\n path: string | undefined,\n opts: {\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n json?: boolean;\n requireHit?: boolean;\n },\n ) => {\n const code = await runExplain({\n query,\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n requireHit: opts.requireHit === true,\n ...(opts.by !== undefined ? { by: opts.by } : {}),\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"check-conventions [path]\")\n .description(\"Validate repo filename conventions (SEPs, conformance fixtures).\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (path: string | undefined, opts: { json?: boolean }) => {\n const code = await runCheckConventions({\n path: path ?? \".\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n });\n process.exit(code);\n });\n\nprogram\n .command(\"fmt [path]\")\n .description(\"Canonicalize .sightmap/*.yaml files (default --check; --write to fix in place).\")\n .option(\"--check\", \"exit non-zero if any file is not canonical (default mode)\")\n .option(\"--write\", \"rewrite non-canonical files in place\")\n .option(\"--json\", \"machine-readable output\")\n .action(\n async (\n path: string | undefined,\n opts: { check?: boolean; write?: boolean; json?: boolean },\n ) => {\n if (opts.check === true && opts.write === true) {\n process.stderr.write(\"fatal: --check and --write are mutually exclusive\\n\");\n process.exit(2);\n }\n const code = await runFmt({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n check: opts.write !== true, // default true unless --write\n write: opts.write === true,\n json: opts.json === true,\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"init\")\n .description(\"Initialize Sightmap in this project (detects framework + coding agent, writes config).\")\n .option(\"--yes\", \"accept all defaults (non-interactive)\")\n .option(\"--plugin\", \"force plugin install path\")\n .option(\"--manual\", \"force manual install path\")\n .option(\"--host <names>\", \"comma-separated hosts: claude-code,codex,cursor,opencode\")\n .option(\"--with-browser\", \"force bundled Playwright + browser tools\")\n .option(\"--curate-only\", \"force curation-only (skip browser tools)\")\n .option(\"--no-codegen\", \"skip sightmap-react gen\")\n .option(\"--no-provider\", \"skip <SightmapProvider> codemod\")\n .action(async (opts: {\n yes?: boolean;\n plugin?: boolean;\n manual?: boolean;\n host?: string;\n withBrowser?: boolean;\n curateOnly?: boolean;\n codegen?: boolean;\n provider?: boolean;\n }) => {\n const code = await runInit({\n cwd: program.opts<{ cwd: string }>().cwd,\n yes: opts.yes === true,\n ...(opts.plugin ? { installPath: \"plugin\" as const } : {}),\n ...(opts.manual ? { installPath: \"manual\" as const } : {}),\n ...(opts.host !== undefined ? { hosts: opts.host.split(\",\").map(s => s.trim()) } : {}),\n ...(opts.withBrowser ? { withBrowser: true } : {}),\n ...(opts.curateOnly ? { curateOnly: true } : {}),\n ...(opts.codegen === false ? { noCodegen: true } : {}),\n ...(opts.provider === false ? { noProvider: true } : {}),\n });\n process.exit(code);\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n process.stderr.write(`fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(2);\n});\n","import { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { validate } from \"../validate.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatValidate } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport interface RunValidateOptions {\n path: string;\n cwd: string;\n json: boolean;\n}\n\nexport async function runValidate(opts: RunValidateOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const files = (await collectYamlFiles(dir)).sort();\n const fileResults: { path: string; ok: boolean }[] = [];\n const diagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(opts.cwd, file);\n const text = await readFile(file, \"utf8\");\n const r = validate(text, { sourceFile: relPath });\n fileResults.push({ path: relPath, ok: r.ok });\n if (!r.ok) diagnostics.push(...r.diagnostics);\n }\n\n const ok = diagnostics.length === 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"validate\",\n ok,\n diagnostics,\n result: { files: fileResults },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n","import yaml from \"js-yaml\";\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type { ValidateResult, SightmapFragment } from \"./sightmap.js\";\nimport {\n PARSE_ERROR,\n SCHEMA_VALIDATION_FAILED,\n UNKNOWN_VERSION,\n type Diagnostic,\n} from \"./diagnostics.js\";\nimport { parse } from \"./parse.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolve, dirname } from \"node:path\";\n\n// Lazily initialized to avoid crashing when this module is bundled into a\n// browser context (fileURLToPath is Node-only). validate() itself is Node-only\n// and should never be called from browser code.\nlet _ajvValidate: ReturnType<InstanceType<typeof Ajv2020>[\"compile\"]> | undefined;\n\nfunction getValidator() {\n if (_ajvValidate) return _ajvValidate;\n // These Node APIs run only on first call to validate(), not at module load.\n const __dirname = dirname(fileURLToPath(import.meta.url));\n // Resolve the vendored schema in two contexts:\n // - Production (published package): bundled file lives at dist/index.js, schema at dist/vendored/.\n // - Dev (vitest, source files): validate.ts lives at src/, schema at ../vendored/.\n const schemaCandidates = [\n resolve(__dirname, \"./vendored/sightmap.schema.json\"),\n resolve(__dirname, \"../vendored/sightmap.schema.json\"),\n ];\n const schemaPath = schemaCandidates.find((p) => existsSync(p));\n if (schemaPath === undefined) {\n throw new Error(\n `vendored sightmap.schema.json not found. Looked in: ${schemaCandidates.join(\", \")}`,\n );\n }\n const schema = JSON.parse(readFileSync(schemaPath, \"utf8\")) as unknown;\n const ajv = new Ajv2020({ allErrors: true, strict: false });\n _ajvValidate = ajv.compile(schema as object);\n return _ajvValidate;\n}\n\nexport interface ValidateOptions {\n sourceFile?: string;\n}\n\nexport function validate(input: string | object, opts: ValidateOptions = {}): ValidateResult {\n const diagnostics: Diagnostic[] = [];\n let doc: unknown;\n\n if (typeof input === \"string\") {\n try {\n doc = yaml.load(input);\n } catch (err) {\n const e = err as { message?: string; mark?: { line?: number; column?: number } };\n diagnostics.push({\n severity: \"error\",\n code: PARSE_ERROR,\n message: e.message ?? \"YAML parse error\",\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n ...(e.mark\n ? { loc: { line: (e.mark.line ?? 0) + 1, column: (e.mark.column ?? 0) + 1 } }\n : {}),\n });\n return { ok: false, diagnostics };\n }\n } else {\n doc = input;\n }\n\n if (doc === null || typeof doc !== \"object\" || Array.isArray(doc)) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: \"Expected document root to be an object\",\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n });\n return { ok: false, diagnostics };\n }\n\n const obj = doc as Record<string, unknown>;\n if (obj[\"version\"] !== 1) {\n diagnostics.push({\n severity: \"error\",\n code: UNKNOWN_VERSION,\n message:\n obj[\"version\"] === undefined\n ? \"Missing required `version` field\"\n : `Unsupported version: ${String(obj[\"version\"])} (expected 1)`,\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n path: \"/version\",\n });\n return { ok: false, diagnostics };\n }\n\n const ajvValidate = getValidator();\n const ok = ajvValidate(obj);\n if (!ok) {\n for (const e of ajvValidate.errors ?? []) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: `${e.instancePath || \"(root)\"} ${e.message ?? \"\"}`.trim(),\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n ...(e.instancePath ? { path: e.instancePath } : {}),\n });\n }\n return { ok: false, diagnostics };\n }\n\n // Schema-valid: now run parse() (which normalizes selectors and brands).\n let value: SightmapFragment;\n try {\n value = parse(obj, opts.sourceFile !== undefined ? { sourceFile: opts.sourceFile } : {});\n } catch (err) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: err instanceof Error ? err.message : String(err),\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n });\n return { ok: false, diagnostics };\n }\n return { ok: true, value };\n}\n","export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n code: string;\n message: string;\n file?: string;\n path?: string;\n loc?: { line: number; column: number };\n source?: string;\n}\n\n// Stable, kebab-case codes. Renames require an SEP.\nexport const PARSE_ERROR = \"parse-error\";\nexport const SCHEMA_VALIDATION_FAILED = \"schema-validation-failed\";\nexport const UNKNOWN_VERSION = \"unknown-version\";\nexport const MERGE_COLLISION_VIEW = \"merge-collision-view\";\nexport const MERGE_COLLISION_COMPONENT = \"merge-collision-component\";\nexport const DUPLICATE_VIEW_NAME = \"duplicate-view-name\";\nexport const DUPLICATE_ROUTE = \"duplicate-route\";\nexport const ROUTE_SHADOWING = \"route-shadowing\";\nexport const UNKNOWN_SOURCE = \"unknown-source\";\nexport const SELECTOR_SYNTAX = \"selector-syntax\";\n\n// fmt CLI diagnostic codes (sightmap/spec docs/authoring-conventions.md#diagnostic-codes-authoring-side).\nexport const FMT_NOT_CANONICAL = \"fmt.not-canonical\";\nexport const FMT_PARSE_ERROR = \"fmt.parse-error\";\nexport const FMT_SCHEMA_INVALID = \"fmt.schema-invalid\";\n\n// Repo-conventions codes (WI-6). See docs/repo-conventions.md in the spec repo.\nexport const CONVENTION_SEP_FILENAME = \"convention.sep-filename\";\nexport const CONVENTION_FIXTURE_DIRNAME = \"convention.fixture-dirname\";\nexport const CONVENTION_INVALID_SLUG = \"convention.invalid-slug\";\nexport const CONVENTION_UNEXPECTED_FILE = \"convention.unexpected-file\";\n","import yaml from \"js-yaml\";\nimport type { SightmapFragment } from \"./sightmap.js\";\nimport type { Component } from \"./types.js\";\n\nexport interface ParseOptions {\n /** Optional source file path; recorded on the fragment for canonical-order merging. */\n sourceFile?: string;\n}\n\n/**\n * Parse a single sightmap file (YAML string or pre-parsed object).\n * Throws on parse error, missing version, or version mismatch.\n * Normalizes `selector: string` to `selector: [string]` everywhere.\n */\nexport function parse(input: string | object, opts: ParseOptions = {}): SightmapFragment {\n let doc: unknown;\n if (typeof input === \"string\") {\n try {\n doc = yaml.load(input);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`YAML parse error: ${msg}`);\n }\n } else {\n // Shallow-clone caller's object so we don't mutate it.\n doc = { ...input };\n }\n\n if (doc === null || typeof doc !== \"object\" || Array.isArray(doc)) {\n throw new Error(\"Expected sightmap document to be an object at the root\");\n }\n\n const obj = doc as Record<string, unknown>;\n if (obj[\"version\"] === undefined) {\n throw new Error(\"Missing required `version` field\");\n }\n if (obj[\"version\"] !== 1) {\n throw new Error(`Unsupported version: ${String(obj[\"version\"])} (expected 1)`);\n }\n\n // Normalize selectors recursively. Spread each view to avoid mutating\n // shared view objects when the caller passed a pre-parsed input.\n if (Array.isArray(obj[\"components\"])) {\n obj[\"components\"] = (obj[\"components\"] as Component[]).map(normalizeComponent);\n }\n if (Array.isArray(obj[\"views\"])) {\n obj[\"views\"] = (obj[\"views\"] as Array<Record<string, unknown>>).map((v) => {\n const out = { ...v };\n if (Array.isArray(out[\"components\"])) {\n out[\"components\"] = (out[\"components\"] as Component[]).map(normalizeComponent);\n }\n return out;\n });\n }\n\n const fragment = {\n ...obj,\n __brand: \"SightmapFragment\" as const,\n ...(opts.sourceFile !== undefined ? { __sourceFile: opts.sourceFile } : {}),\n } as SightmapFragment;\n return fragment;\n}\n\nfunction normalizeComponent(c: Component): Component {\n // Common migration error: `selectors` (plural) instead of `selector` (singular).\n // The schema only accepts singular `selector`; the singular field already takes\n // a string or string-array, so a plural alias would be redundant. Surface\n // explicitly rather than silently dropping the value.\n if ((c as unknown as Record<string, unknown>)[\"selectors\"] !== undefined && c.selector === undefined) {\n const name = (c as { name?: string }).name ?? \"(unnamed)\";\n throw new Error(\n `Component \"${name}\": use \\`selector\\` (singular), not \\`selectors\\` (plural). ` +\n `\\`selector\\` accepts either a single string or an array of strings.`,\n );\n }\n const sel = c.selector;\n const normalized: Component = {\n ...c,\n selector: typeof sel === \"string\" ? [sel] : (sel as [string, ...string[]]),\n };\n if (Array.isArray(c.children)) {\n normalized.children = c.children.map(normalizeComponent);\n }\n return normalized;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\n\nexport async function collectYamlFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n out.push(...(await collectYamlFiles(p)));\n } else if (e.isFile()) {\n const ext = extname(p).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") out.push(p);\n }\n }\n return out;\n}\n","import type { Diagnostic } from \"../diagnostics.js\";\n\nexport type Command = \"validate\" | \"lint\" | \"match\" | \"explain\" | \"check\" | \"check-conventions\" | \"fmt\";\n\nexport interface Envelope<R = unknown> {\n ok: boolean;\n command: Command;\n diagnostics: Diagnostic[];\n result: R;\n}\n\nexport function makeEnvelope<R>(args: {\n command: Command;\n ok: boolean;\n diagnostics: Diagnostic[];\n result: R;\n}): Envelope<R> {\n return {\n ok: args.ok,\n command: args.command,\n diagnostics: [...args.diagnostics],\n result: args.result,\n };\n}\n\nexport function emitJson<R>(env: Envelope<R>): void {\n process.stdout.write(JSON.stringify(env, null, 2) + \"\\n\");\n}\n","import type { Diagnostic } from \"../diagnostics.js\";\nimport type { MatchResult, ExplainResult } from \"../sightmap.js\";\n\nconst SEV_TAG: Record<Diagnostic[\"severity\"], string> = {\n error: \"ERROR\",\n warning: \"warn \",\n info: \"info \",\n};\n\nexport function formatDiagnostics(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"\";\n const lines = diags.map((d) => {\n const where = [d.file, d.path, d.loc ? `${d.loc.line}:${d.loc.column}` : null]\n .filter(Boolean)\n .join(\" \");\n return `${SEV_TAG[d.severity]} ${d.code} ${where}\\n ${d.message}`;\n });\n return lines.join(\"\\n\");\n}\n\nexport function formatValidate(result: { files: { path: string; ok: boolean }[] }, diags: Diagnostic[]): string {\n const fileLines = result.files.map((f) => `${f.ok ? \"ok \" : \"FAIL \"} ${f.path}`).join(\"\\n\");\n const diagLines = formatDiagnostics(diags);\n return [fileLines, \"\", diagLines, \"\", `${result.files.length} file(s) checked.`].filter(Boolean).join(\"\\n\");\n}\n\nexport function formatLint(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"lint: no issues.\";\n return formatDiagnostics(diags);\n}\n\nexport function formatMatch(r: MatchResult): string {\n const lines: string[] = [];\n if (r.view === null) {\n lines.push(\"no view matched.\");\n } else {\n lines.push(`view ${r.view.name} (route ${r.view.route})`);\n if (r.view.source !== undefined) lines.push(` source ${r.view.source}`);\n }\n for (const c of r.components) {\n const chain = c.parentChain.length > 0 ? ` (in ${c.parentChain.join(\" > \")})` : \"\";\n lines.push(`comp ${c.name}${chain} ${c.scope} selector=${c.selector.join(\" | \")}`);\n }\n for (const q of r.requests) {\n lines.push(`req ${q.name} ${q.method ?? \"ANY\"} ${q.route}`);\n }\n if (r.memory.length > 0) {\n lines.push(\"\");\n lines.push(\"[Guide]\");\n for (const m of r.memory) lines.push(` - ${m}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatCheckConventions(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"check-conventions: ok\";\n return formatDiagnostics(diags) + `\\n\\n${diags.length} convention violation(s).`;\n}\n\nexport function formatExplain(r: ExplainResult): string {\n if (r.hits.length === 0) return `no hits for \"${r.query}\".`;\n const lines = [`${r.hits.length} hit(s) for \"${r.query}\":`];\n for (const h of r.hits) {\n const e = h.entry as { name?: string; source?: string };\n lines.push(` ${h.type} ${e.name ?? \"?\"} matchedAs=${h.matchedAs}${e.source !== undefined ? ` src=${e.source}` : \"\"}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport interface FmtFileLine {\n path: string;\n status: \"ok\" | \"not-canonical\" | \"rewritten\" | \"error\";\n}\n\nexport function formatFmtCheck(lines: FmtFileLine[]): string {\n const body = lines\n .map((l) => {\n switch (l.status) {\n case \"ok\": return `${l.path}: ok`;\n case \"not-canonical\": return `${l.path}: not canonical (run \\`sightmap fmt --write\\` to fix)`;\n case \"error\": return `${l.path}: error`;\n case \"rewritten\": return `${l.path}: rewritten`; // shouldn't appear in --check\n }\n })\n .join(\"\\n\");\n const need = lines.filter((l) => l.status === \"not-canonical\").length;\n const total = lines.length;\n const summary =\n total === 0\n ? `No YAML files found.`\n : need === 0\n ? `\\n\\nAll ${total} file(s) canonical.`\n : `\\n\\n${need} of ${total} file(s) need formatting.`;\n return body + summary;\n}\n\nexport function formatFmtWrite(lines: FmtFileLine[]): string {\n const body = lines\n .map((l) => {\n switch (l.status) {\n case \"ok\": return `${l.path}: ok`;\n case \"rewritten\": return `${l.path}: rewritten`;\n case \"error\": return `${l.path}: error`;\n case \"not-canonical\": return `${l.path}: not canonical`; // shouldn't appear in --write\n }\n })\n .join(\"\\n\");\n const rewritten = lines.filter((l) => l.status === \"rewritten\").length;\n const summary =\n lines.length === 0 ? `No YAML files found.` : `\\n\\n${rewritten} file(s) rewritten.`;\n return body + summary;\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { lint } from \"../lint.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatLint } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport interface RunLintOptions {\n path: string;\n cwd: string;\n json: boolean;\n strict: boolean;\n rules?: string;\n}\n\nexport async function runLint(opts: RunLintOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n\n const ruleConfig = parseRules(opts.rules);\n const lintDiags = await lint(sightmap, {\n ...(ruleConfig !== undefined ? { rules: ruleConfig } : {}),\n root: opts.cwd,\n });\n\n const all: Diagnostic[] = [...sightmap.diagnostics, ...lintDiags];\n const hasError = all.some((d) => d.severity === \"error\");\n const hasWarning = all.some((d) => d.severity === \"warning\");\n\n let code = 0;\n if (hasError) code = 1;\n else if (opts.strict && hasWarning) code = 1;\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"lint\",\n ok: code === 0,\n diagnostics: all,\n result: {},\n }),\n );\n } else {\n process.stdout.write(formatLint(all) + \"\\n\");\n }\n return code;\n}\n\nfunction parseRules(spec: string | undefined): Record<string, boolean> | undefined {\n if (spec === undefined) return undefined;\n const out: Record<string, boolean> = {};\n for (const tok of spec.split(\",\").map((s) => s.trim()).filter(Boolean)) {\n if (tok.startsWith(\"-\")) out[tok.slice(1)] = false;\n else out[tok] = true;\n }\n return out;\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative, resolve } from \"node:path\";\nimport { merge } from \"./merge.js\";\nimport { validate } from \"./validate.js\";\nimport type { Sightmap, SightmapFragment } from \"./sightmap.js\";\nimport type { Diagnostic } from \"./diagnostics.js\";\n\nexport interface LoadDirectoryOptions {\n /** Optional root for `file` fields in diagnostics. Default: the directory passed in. */\n diagnosticRoot?: string;\n}\n\n/**\n * Recursively load all *.yaml/*.yml files under `dir`, validate each, and merge.\n *\n * Files that fail validation contribute their diagnostics to the merged Sightmap's\n * `diagnostics` array but are otherwise skipped. This keeps loadDirectory total —\n * a single bad file doesn't abort the whole load.\n */\nexport async function loadDirectory(\n dir: string,\n opts: LoadDirectoryOptions = {},\n): Promise<Sightmap> {\n const absDir = resolve(dir);\n const root = opts.diagnosticRoot !== undefined ? resolve(opts.diagnosticRoot) : absDir;\n\n const files = await collectYamlFiles(absDir);\n files.sort(); // alphabetical canonical order\n\n const fragments: SightmapFragment[] = [];\n const loadDiagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(root, file);\n const text = await readFile(file, \"utf8\");\n const r = validate(text, { sourceFile: relPath });\n if (r.ok) {\n fragments.push(r.value);\n } else {\n loadDiagnostics.push(...r.diagnostics);\n }\n }\n\n const merged = merge(fragments);\n return {\n ...merged,\n diagnostics: [...loadDiagnostics, ...merged.diagnostics],\n };\n}\n\nasync function collectYamlFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n out.push(...(await collectYamlFiles(p)));\n } else if (e.isFile()) {\n const ext = extname(p).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") out.push(p);\n }\n }\n return out;\n}\n","import type { SightmapFragment, Sightmap } from \"./sightmap.js\";\nimport type { View, Component, Request } from \"./types.js\";\nimport {\n MERGE_COLLISION_VIEW,\n MERGE_COLLISION_COMPONENT,\n type Diagnostic,\n} from \"./diagnostics.js\";\n\n/**\n * Merge fragments into a queryable Sightmap.\n *\n * Canonical order: fragments are sorted by `__sourceFile` (code-point order; locale-independent\n * for cross-environment determinism). Fragments without a `__sourceFile` sort first, and ES2019\n * sort stability preserves their input order. Within each fragment, declaration order is\n * preserved. The merged collection's order = (sourceFile order, then declaration order).\n *\n * Duplicate view names produce `merge-collision-view` warnings; duplicate global component\n * names produce `merge-collision-component`. The first occurrence wins.\n *\n * Returned arrays are fresh, but element objects (View/Component/Request) are shared with\n * the input fragments — callers must not mutate them.\n */\nexport function merge(fragments: SightmapFragment[]): Sightmap {\n const sorted = [...fragments].sort((a, b) => {\n const aFile = a.__sourceFile ?? \"\";\n const bFile = b.__sourceFile ?? \"\";\n return aFile < bFile ? -1 : aFile > bFile ? 1 : 0;\n });\n\n const views: View[] = [];\n const globalComponents: Component[] = [];\n const globalRequests: Request[] = [];\n const fileMemory: { memory: string[]; sourceFile: string }[] = [];\n const diagnostics: Diagnostic[] = [];\n\n const seenViewNames = new Map<string, string>(); // name → sourceFile\n const seenComponentNames = new Map<string, string>();\n\n for (const f of sorted) {\n const file = f.__sourceFile ?? \"<unknown>\";\n\n for (const v of f.views ?? []) {\n const prev = seenViewNames.get(v.name);\n if (prev !== undefined) {\n diagnostics.push({\n severity: \"warning\",\n code: MERGE_COLLISION_VIEW,\n message: `View name \"${v.name}\" defined in both \"${prev}\" and \"${file}\"; first occurrence wins.`,\n file,\n });\n } else {\n seenViewNames.set(v.name, file);\n }\n views.push(v); // keep all views; first-match-wins is enforced at resolve time\n }\n\n for (const c of f.components ?? []) {\n const prev = seenComponentNames.get(c.name);\n if (prev !== undefined) {\n diagnostics.push({\n severity: \"warning\",\n code: MERGE_COLLISION_COMPONENT,\n message: `Component name \"${c.name}\" defined in both \"${prev}\" and \"${file}\"; first occurrence wins.`,\n file,\n });\n } else {\n seenComponentNames.set(c.name, file);\n }\n globalComponents.push(c);\n }\n\n for (const r of f.requests ?? []) {\n globalRequests.push(r);\n }\n\n if (Array.isArray(f.memory) && f.memory.length > 0) {\n fileMemory.push({ memory: [...f.memory], sourceFile: file });\n }\n }\n\n return {\n version: 1,\n views,\n globalComponents,\n globalRequests,\n fileMemory,\n diagnostics,\n __brand: \"Sightmap\",\n };\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { DUPLICATE_VIEW_NAME, type Diagnostic } from \"../diagnostics.js\";\n\nexport function duplicateName(sightmap: Sightmap): Diagnostic[] {\n const seen = new Map<string, number>();\n const out: Diagnostic[] = [];\n sightmap.views.forEach((v) => {\n const count = (seen.get(v.name) ?? 0) + 1;\n seen.set(v.name, count);\n if (count > 1) {\n out.push({\n severity: \"warning\",\n code: DUPLICATE_VIEW_NAME,\n message: `Duplicate view name \"${v.name}\" (occurrence ${count}).`,\n });\n }\n });\n return out;\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { DUPLICATE_ROUTE, type Diagnostic } from \"../diagnostics.js\";\n\nexport function duplicateRoute(sightmap: Sightmap): Diagnostic[] {\n const seen = new Map<string, string>(); // route → first-view-name\n const out: Diagnostic[] = [];\n for (const v of sightmap.views) {\n const prev = seen.get(v.route);\n if (prev !== undefined) {\n out.push({\n severity: \"warning\",\n code: DUPLICATE_ROUTE,\n message: `Route \"${v.route}\" is defined by both \"${prev}\" and \"${v.name}\". Only \"${prev}\" will match.`,\n });\n } else {\n seen.set(v.route, v.name);\n }\n }\n return out;\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { ROUTE_SHADOWING, type Diagnostic } from \"../diagnostics.js\";\n\n/**\n * Detect routes made unreachable under React Router 7 specificity rules.\n *\n * React Router picks the most specific matching route, not the\n * first-declared. So a wildcard like `/*` does not shadow a more specific\n * route like `/login`, regardless of file/declaration order. A route B is\n * truly shadowed by an earlier route A only when:\n *\n * 1. A and B match the exact same set of URLs (same shape; `*` and `:param`\n * are treated as equivalent placeholders here, since both match a single\n * arbitrary segment), AND\n * 2. A is at least as specific as B at every position. Per-segment\n * specificity: literal > `:param` > `*` > `**`. When scores tie, the\n * earlier-declared route wins React Router's tie-break.\n */\nexport function routeShadowing(sightmap: Sightmap): Diagnostic[] {\n const out: Diagnostic[] = [];\n const views = sightmap.views;\n for (let j = 1; j < views.length; j++) {\n const later = views[j]!;\n const laterKey = matchSetKey(later.route);\n const laterScore = specificity(later.route);\n for (let i = 0; i < j; i++) {\n const earlier = views[i]!;\n if (earlier.route === later.route) continue; // duplicate-route covers this\n if (matchSetKey(earlier.route) !== laterKey) continue;\n if (specificity(earlier.route) < laterScore) continue;\n out.push({\n severity: \"warning\",\n code: ROUTE_SHADOWING,\n message: `Route \"${later.route}\" (view \"${later.name}\") is shadowed by earlier route \"${earlier.route}\" (view \"${earlier.name}\"); they match the same URLs and the earlier route is at least as specific, making this route unreachable.`,\n });\n break; // only report the first shadower\n }\n }\n return out;\n}\n\n/**\n * Canonical \"match-set\" key for a pattern: literal segments are kept; `:param`\n * is normalized to `*` (both match exactly one arbitrary segment); `**` is\n * preserved (variable-depth). Two patterns with the same key match the same\n * set of URLs under the spec's matching rules.\n */\nfunction matchSetKey(route: string): string {\n return route\n .split(\"/\")\n .map((seg) => (seg.startsWith(\":\") ? \"*\" : seg))\n .join(\"/\");\n}\n\n/**\n * Specificity score for a pattern (higher = more specific). Static literals\n * outrank params, params outrank single-segment wildcards, and `**` is the\n * least specific.\n */\nfunction specificity(route: string): number {\n let total = 0;\n for (const seg of route.split(\"/\")) {\n if (seg === \"\" || seg === \"**\") continue;\n if (seg === \"*\") total += 1;\n else if (seg.startsWith(\":\")) total += 2;\n else total += 3;\n }\n return total;\n}\n","import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Sightmap } from \"../sightmap.js\";\nimport type { Component } from \"../types.js\";\nimport { UNKNOWN_SOURCE, type Diagnostic } from \"../diagnostics.js\";\n\nexport interface UnknownSourceOptions {\n /** Filesystem root for resolving `source:` paths. Defaults to process.cwd(). */\n root?: string;\n}\n\nexport async function unknownSource(\n sightmap: Sightmap,\n opts: UnknownSourceOptions = {},\n): Promise<Diagnostic[]> {\n const root = opts.root ?? process.cwd();\n const out: Diagnostic[] = [];\n const seen = new Set<string>();\n\n const check = async (source: string | undefined, label: string): Promise<void> => {\n if (source === undefined) return;\n if (seen.has(source)) return;\n seen.add(source);\n try {\n await stat(resolve(root, source));\n } catch {\n out.push({\n severity: \"warning\",\n code: UNKNOWN_SOURCE,\n message: `${label}: source path \"${source}\" does not exist on disk (relative to ${root}).`,\n });\n }\n };\n\n for (const v of sightmap.views) {\n await check(v.source, `view \"${v.name}\"`);\n for (const c of v.components ?? []) {\n await walkComponent(c, `component \"${c.name}\"`, check);\n }\n }\n for (const c of sightmap.globalComponents) {\n await walkComponent(c, `component \"${c.name}\"`, check);\n }\n for (const r of sightmap.globalRequests) {\n await check(r.source, `request \"${r.name}\"`);\n }\n\n return out;\n}\n\nasync function walkComponent(\n c: Component,\n label: string,\n check: (source: string | undefined, label: string) => Promise<void>,\n): Promise<void> {\n await check(c.source, label);\n for (const child of c.children ?? []) {\n await walkComponent(child, `component \"${child.name}\"`, check);\n }\n}\n","import { parse as parseSelector } from \"css-what\";\nimport type { Sightmap } from \"../sightmap.js\";\nimport type { Component } from \"../types.js\";\nimport { SELECTOR_SYNTAX, type Diagnostic } from \"../diagnostics.js\";\n\nexport function selectorSyntax(sightmap: Sightmap): Diagnostic[] {\n const out: Diagnostic[] = [];\n const visit = (c: Component, scope: string): void => {\n const selectors: string[] = Array.isArray(c.selector)\n ? c.selector\n : [c.selector as unknown as string];\n selectors.forEach((sel, i) => {\n try {\n parseSelector(sel);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n out.push({\n severity: \"warning\",\n code: SELECTOR_SYNTAX,\n message: `${scope}: selector at index ${i} (\"${sel}\") failed to parse: ${msg}`,\n });\n }\n });\n for (const child of c.children ?? []) visit(child, `component \"${child.name}\"`);\n };\n\n for (const c of sightmap.globalComponents) visit(c, `component \"${c.name}\"`);\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) visit(c, `component \"${c.name}\"`);\n }\n return out;\n}\n","import type { Sightmap } from \"./sightmap.js\";\nimport type { Diagnostic } from \"./diagnostics.js\";\nimport { duplicateName } from \"./lintRules/duplicateName.js\";\nimport { duplicateRoute } from \"./lintRules/duplicateRoute.js\";\nimport { routeShadowing } from \"./lintRules/routeShadowing.js\";\nimport { unknownSource } from \"./lintRules/unknownSource.js\";\nimport { selectorSyntax } from \"./lintRules/selectorSyntax.js\";\n\nexport interface LintOptions {\n /** Per-rule enable/disable. Default: all rules enabled. */\n rules?: Record<string, boolean>;\n /** Filesystem root for `unknown-source`. Defaults to process.cwd(). */\n root?: string;\n}\n\nexport async function lint(sightmap: Sightmap, opts: LintOptions = {}): Promise<Diagnostic[]> {\n const enabled = (code: string): boolean => opts.rules?.[code] !== false;\n const out: Diagnostic[] = [];\n if (enabled(\"duplicate-view-name\")) out.push(...duplicateName(sightmap));\n if (enabled(\"duplicate-route\")) out.push(...duplicateRoute(sightmap));\n if (enabled(\"route-shadowing\")) out.push(...routeShadowing(sightmap));\n if (enabled(\"selector-syntax\")) out.push(...selectorSyntax(sightmap));\n if (enabled(\"unknown-source\")) {\n out.push(...(await unknownSource(sightmap, opts.root !== undefined ? { root: opts.root } : {})));\n }\n return out;\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { match } from \"../match.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatMatch } from \"./humanFormat.js\";\n\nexport interface RunMatchOptions {\n url: string;\n path: string;\n cwd: string;\n json: boolean;\n method?: string;\n requireView: boolean;\n}\n\nexport async function runMatch(opts: RunMatchOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n const result = match(sightmap, {\n url: opts.url,\n ...(opts.method !== undefined ? { method: opts.method } : {}),\n });\n\n const code = opts.requireView && result.view === null ? 1 : 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"match\",\n ok: code === 0,\n diagnostics: [...sightmap.diagnostics],\n result,\n }),\n );\n } else {\n process.stdout.write(formatMatch(result) + \"\\n\");\n }\n return code;\n}\n","/**\n * Canonicalize a URL or pathname for matching.\n * - Accepts absolute URL or pathname.\n * - Strips scheme, host, query string, and fragment.\n * - Normalizes trailing slashes (except for the root \"/\").\n */\nexport function canonicalizeUrl(input: string): string {\n let s = input;\n // Strip absolute prefix.\n const protoMatch = /^[a-z][a-z0-9+.-]*:\\/\\/[^/]*/i.exec(s);\n if (protoMatch) {\n s = s.slice(protoMatch[0].length) || \"/\";\n }\n // Strip fragment.\n const hash = s.indexOf(\"#\");\n if (hash !== -1) s = s.slice(0, hash);\n // Strip query.\n const q = s.indexOf(\"?\");\n if (q !== -1) s = s.slice(0, q);\n // Trailing slash.\n if (s.length > 1 && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\n/**\n * Test whether a glob route pattern matches a URL pathname.\n * Pattern syntax (per spec):\n * - Literal segments match themselves\n * - \"*\" matches exactly one path segment\n * - \"**\" matches any depth of segments\n * - \":param\" segments normalize to \"*\"\n * - Matching is case-sensitive\n * - Trailing slashes ignored\n */\nexport function routeMatch(pattern: string, url: string): boolean {\n const p = normalizePattern(pattern);\n const u = canonicalizeUrl(url);\n const patternSegs = splitSegments(p);\n const urlSegs = splitSegments(u);\n return matchSegs(patternSegs, urlSegs);\n}\n\nfunction normalizePattern(p: string): string {\n // Replace \":param\" segments with \"*\"\n let s = p\n .split(\"/\")\n .map((seg) => (seg.startsWith(\":\") ? \"*\" : seg))\n .join(\"/\");\n if (s.length > 1 && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\nfunction splitSegments(path: string): string[] {\n if (path === \"/\" || path === \"\") return [];\n const trimmed = path.startsWith(\"/\") ? path.slice(1) : path;\n return trimmed.split(\"/\");\n}\n\nfunction matchSegs(pattern: string[], url: string[]): boolean {\n if (pattern.length === 0 && url.length === 0) return true;\n if (pattern.length === 0) return false;\n\n const head = pattern[0]!;\n const rest = pattern.slice(1);\n\n if (head === \"**\") {\n // Match zero or more segments.\n if (rest.length === 0) return true;\n for (let i = 0; i <= url.length; i++) {\n if (matchSegs(rest, url.slice(i))) return true;\n }\n return false;\n }\n\n if (url.length === 0) return false;\n if (head === \"*\" || head === url[0]) {\n return matchSegs(rest, url.slice(1));\n }\n return false;\n}\n","import type {\n Sightmap,\n MatchResult,\n ExplainHit,\n ResolvedView,\n ResolvedComponent,\n ResolvedRequest,\n} from \"./sightmap.js\";\nimport type { View, Component, Request } from \"./types.js\";\nimport { routeMatch } from \"./routeMatch.js\";\n\nexport function resolveByUrl(\n sightmap: Sightmap,\n url: string,\n method?: string,\n): MatchResult {\n // First-match-wins on views.\n let matchedView: View | null = null;\n for (const v of sightmap.views) {\n if (routeMatch(v.route, url)) {\n matchedView = v;\n break;\n }\n }\n\n const components: ResolvedComponent[] = [];\n for (const c of sightmap.globalComponents) {\n components.push(...flattenComponent(c, [], \"global\", undefined));\n }\n if (matchedView !== null && Array.isArray(matchedView.components)) {\n for (const c of matchedView.components) {\n components.push(...flattenComponent(c, [], \"view-scoped\", matchedView.name));\n }\n }\n\n const requests: ResolvedRequest[] = [];\n const requestPool: Request[] = [\n ...sightmap.globalRequests,\n ...((matchedView?.requests ?? [])),\n ];\n for (const req of requestPool) {\n if (!routeMatch(req.route, url)) continue;\n if (method !== undefined && req.method !== undefined && req.method !== method) continue;\n requests.push(toResolvedRequest(req));\n }\n\n const memory: string[] = [];\n for (const fm of sightmap.fileMemory) memory.push(...fm.memory);\n if (matchedView?.memory) memory.push(...matchedView.memory);\n\n return {\n view: matchedView !== null ? toResolvedView(matchedView) : null,\n components,\n requests,\n memory,\n };\n}\n\nexport function resolveByName(sightmap: Sightmap, name: string): ExplainHit[] {\n const hits: ExplainHit[] = [];\n for (const v of sightmap.views) {\n if (v.name === name) hits.push({ type: \"view\", matchedAs: \"name\", entry: toResolvedView(v) });\n }\n for (const c of sightmap.globalComponents) {\n for (const rc of flattenComponent(c, [], \"global\", undefined)) {\n if (rc.name === name) hits.push({ type: \"component\", matchedAs: \"name\", entry: rc });\n }\n }\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) {\n for (const rc of flattenComponent(c, [], \"view-scoped\", v.name)) {\n if (rc.name === name) hits.push({ type: \"component\", matchedAs: \"name\", entry: rc });\n }\n }\n }\n for (const r of sightmap.globalRequests) {\n if (r.name === name) hits.push({ type: \"request\", matchedAs: \"name\", entry: toResolvedRequest(r) });\n }\n for (const v of sightmap.views) {\n for (const r of v.requests ?? []) {\n if (r.name === name) hits.push({ type: \"request\", matchedAs: \"name\", entry: toResolvedRequest(r) });\n }\n }\n return hits;\n}\n\nexport function resolveBySourcePath(sightmap: Sightmap, path: string): ExplainHit[] {\n const hits: ExplainHit[] = [];\n for (const v of sightmap.views) {\n if (v.source === path) hits.push({ type: \"view\", matchedAs: \"path\", entry: toResolvedView(v) });\n }\n for (const c of sightmap.globalComponents) {\n for (const rc of flattenComponent(c, [], \"global\", undefined)) {\n if (rc.source === path) hits.push({ type: \"component\", matchedAs: \"path\", entry: rc });\n }\n }\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) {\n for (const rc of flattenComponent(c, [], \"view-scoped\", v.name)) {\n if (rc.source === path) hits.push({ type: \"component\", matchedAs: \"path\", entry: rc });\n }\n }\n }\n for (const r of sightmap.globalRequests) {\n if (r.source === path) hits.push({ type: \"request\", matchedAs: \"path\", entry: toResolvedRequest(r) });\n }\n return hits;\n}\n\nfunction flattenComponent(\n c: Component,\n parentChain: string[],\n scope: \"global\" | \"view-scoped\",\n scopedToView: string | undefined,\n): ResolvedComponent[] {\n const out: ResolvedComponent[] = [];\n const selector = Array.isArray(c.selector) ? c.selector : [c.selector as unknown as string];\n out.push({\n name: c.name,\n selector,\n ...(c.source !== undefined ? { source: c.source } : {}),\n ...(c.description !== undefined ? { description: c.description } : {}),\n memory: c.memory ? [...c.memory] : [],\n parentChain: [...parentChain],\n scope,\n ...(scopedToView !== undefined ? { scopedToView } : {}),\n definedIn: { file: \"<unknown>\" },\n });\n for (const child of c.children ?? []) {\n out.push(...flattenComponent(child, [...parentChain, c.name], scope, scopedToView));\n }\n return out;\n}\n\nfunction toResolvedView(v: View): ResolvedView {\n return {\n name: v.name,\n route: v.route,\n ...(v.source !== undefined ? { source: v.source } : {}),\n ...(v.description !== undefined ? { description: v.description } : {}),\n memory: v.memory ? [...v.memory] : [],\n definedIn: { file: \"<unknown>\" },\n };\n}\n\nfunction toResolvedRequest(r: Request): ResolvedRequest {\n return {\n name: r.name,\n route: r.route,\n ...(r.method !== undefined ? { method: r.method } : {}),\n ...(r.source !== undefined ? { source: r.source } : {}),\n ...(r.description !== undefined ? { description: r.description } : {}),\n ...(r.request !== undefined ? { request: { fields: r.request.fields ?? [] } } : {}),\n ...(r.response !== undefined ? { response: { fields: r.response.fields ?? [] } } : {}),\n ...(r.headers !== undefined ? { headers: r.headers } : {}),\n memory: r.memory ? [...r.memory] : [],\n definedIn: { file: \"<unknown>\" },\n };\n}\n","import type { Sightmap, MatchResult } from \"./sightmap.js\";\nimport { resolveByUrl } from \"./resolver.js\";\n\nexport interface MatchOptions {\n url: string;\n method?: string;\n}\n\nexport function match(sightmap: Sightmap, opts: MatchOptions): MatchResult {\n return resolveByUrl(sightmap, opts.url, opts.method);\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { explain } from \"../explain.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatExplain } from \"./humanFormat.js\";\n\nexport interface RunExplainOptions {\n query: string;\n path: string;\n cwd: string;\n json: boolean;\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n requireHit: boolean;\n}\n\nexport async function runExplain(opts: RunExplainOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n const result = explain(sightmap, opts.query, {\n ...(opts.by !== undefined ? { by: opts.by } : {}),\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n });\n\n const code = opts.requireHit && result.hits.length === 0 ? 1 : 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"explain\",\n ok: code === 0,\n diagnostics: [...sightmap.diagnostics],\n result,\n }),\n );\n } else {\n process.stdout.write(formatExplain(result) + \"\\n\");\n }\n return code;\n}\n","import type { Sightmap, ExplainResult, ExplainHit, ExplainMatchedAs } from \"./sightmap.js\";\nimport { resolveByName, resolveBySourcePath } from \"./resolver.js\";\n\nexport interface ExplainOptions {\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n}\n\nexport function explain(\n sightmap: Sightmap,\n query: string,\n opts: ExplainOptions = {},\n): ExplainResult {\n const byName = opts.by === \"path\" ? [] : resolveByName(sightmap, query);\n const byPath = opts.by === \"name\" ? [] : resolveBySourcePath(sightmap, query);\n\n // Merge: when an entry appears in both lookups, label as \"name-and-path\".\n // Use entry identity (type + name) as the dedup key.\n const key = (h: ExplainHit): string => `${h.type}:${h.entry.name}`;\n const namedKeys = new Set(byName.map(key));\n const pathKeys = new Set(byPath.map(key));\n\n const merged: ExplainHit[] = [];\n for (const h of byName) {\n if (pathKeys.has(key(h))) {\n merged.push(withMatchedAs(h, \"name-and-path\"));\n } else {\n merged.push(h);\n }\n }\n for (const h of byPath) {\n if (!namedKeys.has(key(h))) {\n merged.push(h);\n }\n // (entries already in both have been pushed above with \"name-and-path\".)\n }\n\n const filtered =\n opts.type !== undefined ? merged.filter((h) => h.type === opts.type) : merged;\n return { query, hits: filtered };\n}\n\nfunction withMatchedAs(h: ExplainHit, matchedAs: ExplainMatchedAs): ExplainHit {\n switch (h.type) {\n case \"view\":\n return { type: \"view\", matchedAs, entry: h.entry };\n case \"component\":\n return { type: \"component\", matchedAs, entry: h.entry };\n case \"request\":\n return { type: \"request\", matchedAs, entry: h.entry };\n }\n}\n","import { resolve, relative } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { lint } from \"../lint.js\";\nimport { validate } from \"../validate.js\";\nimport { merge } from \"../merge.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatValidate } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport type CheckLevel = \"schema\" | \"quality\";\n\nexport interface RunCheckOptions {\n path: string;\n cwd: string;\n level: CheckLevel;\n json: boolean;\n}\n\nexport async function runCheck(opts: RunCheckOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const files = (await collectYamlFiles(dir)).sort();\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n\n const diagnostics: Diagnostic[] = [...sightmap.diagnostics];\n if (opts.level === \"quality\") {\n const lintDiags = await lint(sightmap, { root: opts.cwd });\n diagnostics.push(...lintDiags);\n }\n\n const flagged = new Set(\n diagnostics.filter((d) => d.file !== undefined).map((d) => d.file!),\n );\n const fileResults = files.map((file) => {\n const relPath = relative(opts.cwd, file);\n return { path: relPath, ok: !flagged.has(relPath) };\n });\n\n const ok = diagnostics.length === 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check\",\n ok,\n diagnostics,\n result: {\n files: fileResults,\n level: opts.level,\n views: sightmap.views.length,\n },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n\nexport interface RunCheckStdinOptions {\n level: CheckLevel;\n json: boolean;\n /** Override stdin for tests; defaults to process.stdin. */\n input?: string;\n}\n\nasync function readAllStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function runCheckFromStdin(opts: RunCheckStdinOptions): Promise<number> {\n const text = opts.input ?? (await readAllStdin());\n const sourceFile = \"<stdin>\";\n const diagnostics: Diagnostic[] = [];\n\n const validation = validate(text, { sourceFile });\n let viewCount = 0;\n if (!validation.ok) {\n diagnostics.push(...validation.diagnostics);\n } else {\n const sightmap = merge([validation.value]);\n viewCount = sightmap.views.length;\n if (opts.level === \"quality\") {\n diagnostics.push(...sightmap.diagnostics);\n const lintDiags = await lint(sightmap);\n diagnostics.push(...lintDiags);\n }\n }\n\n const ok = diagnostics.length === 0;\n const fileResults = [{ path: sourceFile, ok }];\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check\",\n ok,\n diagnostics,\n result: { files: fileResults, level: opts.level, views: viewCount },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n","import { resolve } from \"node:path\";\nimport { checkConventions } from \"../conventions/index.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatCheckConventions } from \"./humanFormat.js\";\n\nexport interface RunCheckConventionsOptions {\n path: string;\n cwd: string;\n json: boolean;\n}\n\nexport async function runCheckConventions(opts: RunCheckConventionsOptions): Promise<number> {\n const root = resolve(opts.cwd, opts.path);\n const result = await checkConventions({ root });\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check-conventions\",\n ok: result.ok,\n diagnostics: result.diagnostics,\n result: { root },\n }),\n );\n } else {\n process.stdout.write(formatCheckConventions(result.diagnostics) + \"\\n\");\n }\n\n return result.ok ? 0 : 1;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { Diagnostic } from \"../diagnostics.js\";\nimport { checkSepFilename, checkFixtureDirname } from \"./rules.js\";\n\nexport interface CheckConventionsOptions {\n root: string;\n}\n\nexport interface CheckConventionsResult {\n ok: boolean;\n diagnostics: Diagnostic[];\n}\n\nconst IGNORED_LEAF_NAMES = new Set([\"README.md\", \".gitkeep\", \".DS_Store\"]);\n\nexport async function walkRepo(opts: CheckConventionsOptions): Promise<CheckConventionsResult> {\n const diagnostics: Diagnostic[] = [];\n const root = opts.root;\n\n // SEPs: every .md file directly under seps/, except IGNORED_LEAF_NAMES.\n const sepsDir = join(root, \"seps\");\n if (existsSync(sepsDir)) {\n const entries = await readdir(sepsDir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isFile()) continue;\n if (IGNORED_LEAF_NAMES.has(e.name)) continue;\n if (!e.name.endsWith(\".md\")) continue;\n const rel = relative(root, join(sepsDir, e.name));\n const r = checkSepFilename(rel);\n if (!r.ok && r.diagnostics) diagnostics.push(...r.diagnostics);\n }\n }\n\n // Conformance fixtures: every directory directly under conformance/.\n const confDir = join(root, \"conformance\");\n if (existsSync(confDir)) {\n const entries = await readdir(confDir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (IGNORED_LEAF_NAMES.has(e.name)) continue;\n const rel = relative(root, join(confDir, e.name));\n const r = checkFixtureDirname(rel);\n if (!r.ok && r.diagnostics) diagnostics.push(...r.diagnostics);\n }\n }\n\n return { ok: diagnostics.length === 0, diagnostics };\n}\n","export const SLUG_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\nexport function isValidSlug(s: string): boolean {\n return SLUG_REGEX.test(s);\n}\n","import {\n CONVENTION_SEP_FILENAME,\n CONVENTION_FIXTURE_DIRNAME,\n} from \"../diagnostics.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\nimport { isValidSlug } from \"./slug.js\";\n\nexport interface ConventionRuleResult {\n ok: boolean;\n diagnostics?: Diagnostic[];\n}\n\nconst SEP_FILE_RE = /^seps\\/(\\d{4})-(.+)\\.md$/;\nconst FIXTURE_DIR_RE = /^conformance\\/(\\d{3})-(.+)\\.fixture$/;\n\nexport function checkSepFilename(relPath: string): ConventionRuleResult {\n const m = relPath.match(SEP_FILE_RE);\n if (!m) {\n return mkFail(\n CONVENTION_SEP_FILENAME,\n relPath,\n `SEP filename must match seps/NNNN-{slug}.md (got \"${relPath}\")`,\n );\n }\n const slug = m[2]!;\n if (!isValidSlug(slug)) {\n return mkFail(\n CONVENTION_SEP_FILENAME,\n relPath,\n `SEP slug \"${slug}\" violates ^[a-z0-9]+(-[a-z0-9]+)*$`,\n );\n }\n return { ok: true };\n}\n\nexport function checkFixtureDirname(relPath: string): ConventionRuleResult {\n const m = relPath.match(FIXTURE_DIR_RE);\n if (!m) {\n if (relPath.startsWith(\"conformance/\") && !relPath.endsWith(\".fixture\")) {\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture directory must match conformance/NNN-{slug}.fixture/ (got \"${relPath}\"); did you forget the .fixture suffix?`,\n );\n }\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture directory must match conformance/NNN-{slug}.fixture/ (got \"${relPath}\")`,\n );\n }\n const slug = m[2]!;\n if (!isValidSlug(slug)) {\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture slug \"${slug}\" violates ^[a-z0-9]+(-[a-z0-9]+)*$`,\n );\n }\n return { ok: true };\n}\n\nfunction mkFail(code: string, file: string, message: string): ConventionRuleResult {\n return {\n ok: false,\n diagnostics: [\n {\n severity: \"error\",\n code,\n message,\n file,\n },\n ],\n };\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { canonicalize } from \"../format/canonicalize.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { FMT_NOT_CANONICAL, type Diagnostic } from \"../diagnostics.js\";\nimport { formatFmtCheck, formatFmtWrite, type FmtFileLine } from \"./humanFormat.js\";\n\nexport interface RunFmtOptions {\n path: string;\n cwd: string;\n check: boolean;\n write: boolean;\n json: boolean;\n}\n\ninterface FmtFileResult {\n path: string;\n matchesExpected?: boolean;\n changed?: boolean;\n}\n\nexport async function runFmt(opts: RunFmtOptions): Promise<number> {\n const target = resolve(opts.cwd, opts.path);\n const files = (await resolveTarget(target)).sort();\n\n const fileResults: FmtFileResult[] = [];\n const diagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(opts.cwd, file);\n await processFile(file, relPath, opts, fileResults, diagnostics);\n }\n\n const errCount = diagnostics.filter((d) => d.severity === \"error\").length;\n const warnCount = diagnostics.filter((d) => d.severity === \"warning\").length;\n const ok = errCount === 0 && warnCount === 0;\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"fmt\",\n ok,\n diagnostics,\n result: { files: fileResults },\n }),\n );\n } else {\n const lines: FmtFileLine[] = fileResults.map((f) => {\n // Files with error-severity diagnostics get `error` status.\n const hasErr = diagnostics.some((d) => d.severity === \"error\" && d.file === f.path);\n if (hasErr) return { path: f.path, status: \"error\" };\n if (opts.write) {\n return { path: f.path, status: f.changed ? \"rewritten\" : \"ok\" };\n }\n return { path: f.path, status: f.matchesExpected ? \"ok\" : \"not-canonical\" };\n });\n const out = opts.write ? formatFmtWrite(lines) : formatFmtCheck(lines);\n process.stdout.write(out + \"\\n\");\n }\n\n if (errCount > 0) return 2;\n if (warnCount > 0) return 1;\n return 0;\n}\n\nasync function resolveTarget(target: string): Promise<string[]> {\n const st = await stat(target);\n if (st.isFile()) return [target];\n return collectYamlFiles(target);\n}\n\nasync function processFile(\n absPath: string,\n relPath: string,\n opts: RunFmtOptions,\n fileResults: FmtFileResult[],\n diagnostics: Diagnostic[],\n): Promise<void> {\n const text = await readFile(absPath, \"utf8\");\n const result = canonicalize(text, { file: relPath });\n\n if (result.kind === \"parse-error\" || result.kind === \"schema-invalid\") {\n diagnostics.push(...result.diagnostics);\n fileResults.push(opts.write ? { path: relPath, changed: false } : { path: relPath, matchesExpected: false });\n return;\n }\n\n if (opts.write) {\n if (result.changed) {\n await writeFile(absPath, result.text, \"utf8\");\n }\n fileResults.push({ path: relPath, changed: result.changed });\n return;\n }\n\n fileResults.push({ path: relPath, matchesExpected: !result.changed });\n if (result.changed) {\n diagnostics.push({\n severity: \"warning\",\n code: FMT_NOT_CANONICAL,\n message: \"file is not in canonical form (run `sightmap fmt --write` to fix)\",\n file: relPath,\n });\n }\n}\n","// CST-preserving canonical YAML writer. Backs `sightmap fmt`.\n//\n// See sightmap/spec docs/authoring-conventions.md#canonical-formatting-rules\n// for the normative rules this implements.\n\nimport { parseDocument, isMap, isSeq, isScalar, type Document, type YAMLMap, type YAMLSeq, type Pair, type Scalar } from \"yaml\";\nimport { validate } from \"../validate.js\";\nimport {\n FMT_PARSE_ERROR,\n FMT_SCHEMA_INVALID,\n type Diagnostic,\n} from \"../diagnostics.js\";\nimport {\n TOP_LEVEL_KEY_ORDER,\n VIEW_KEY_ORDER,\n COMPONENT_KEY_ORDER,\n REQUEST_KEY_ORDER,\n compareByName,\n compareRequests,\n} from \"./canonical-rules.js\";\n\nexport type CanonicalizeResult =\n | { kind: \"canonical\"; text: string; changed: boolean }\n | { kind: \"parse-error\"; diagnostics: Diagnostic[] }\n | { kind: \"schema-invalid\"; diagnostics: Diagnostic[] };\n\nexport interface CanonicalizeOptions {\n /** Source-file path for diagnostics (relative to cwd, typically). */\n file: string;\n}\n\nexport function canonicalize(input: string, opts: CanonicalizeOptions): CanonicalizeResult {\n const doc = parseDocument(input, { keepSourceTokens: false });\n\n const first = doc.errors[0];\n if (first !== undefined) {\n const loc = first.linePos?.[0]\n ? { line: first.linePos[0].line, column: first.linePos[0].col }\n : undefined;\n return {\n kind: \"parse-error\",\n diagnostics: [\n {\n severity: \"error\",\n code: FMT_PARSE_ERROR,\n message: first.message,\n file: opts.file,\n ...(loc !== undefined ? { loc } : {}),\n },\n ],\n };\n }\n\n const v = validate(input, { sourceFile: opts.file });\n if (!v.ok) {\n // Re-code the validate diagnostics under fmt.schema-invalid; preserve\n // message/loc but normalize severity to error and overwrite the code.\n const diagnostics: Diagnostic[] = v.diagnostics.map((d) => ({\n ...d,\n severity: \"error\" as const,\n code: FMT_SCHEMA_INVALID,\n file: opts.file,\n }));\n return { kind: \"schema-invalid\", diagnostics };\n }\n\n // Mutation passes (only run when input parses + validates).\n if (isMap(doc.contents)) {\n reorderTopLevelKeys(doc.contents);\n reorderEntriesUnder(doc.contents, \"views\", VIEW_KEY_ORDER);\n reorderEntriesUnder(doc.contents, \"components\", COMPONENT_KEY_ORDER);\n reorderEntriesUnder(doc.contents, \"requests\", REQUEST_KEY_ORDER);\n // Per-spec: nested seqs (view.components, view.requests) also follow per-entry-type key order.\n forEachViewEntry(doc.contents, (view) => {\n reorderEntriesUnder(view, \"components\", COMPONENT_KEY_ORDER);\n reorderEntriesUnder(view, \"requests\", REQUEST_KEY_ORDER);\n forEachComponentEntry(view, \"components\", (cmp) => {\n reorderChildrenRecursive(cmp);\n });\n });\n forEachComponentEntry(doc.contents, \"components\", (cmp) => {\n reorderChildrenRecursive(cmp);\n });\n sortTopLevelSeq(doc.contents, \"views\", (a, b) => {\n const an = scalarPropFromMapItem(a, \"name\");\n const bn = scalarPropFromMapItem(b, \"name\");\n return compareByName({ name: an ?? \"\" }, { name: bn ?? \"\" });\n });\n sortTopLevelSeq(doc.contents, \"components\", (a, b) => {\n const an = scalarPropFromMapItem(a, \"name\");\n const bn = scalarPropFromMapItem(b, \"name\");\n return compareByName({ name: an ?? \"\" }, { name: bn ?? \"\" });\n });\n sortTopLevelSeq(doc.contents, \"requests\", (a, b) => {\n return compareRequests(\n { route: scalarPropFromMapItem(a, \"route\") ?? \"\", method: scalarPropFromMapItem(a, \"method\") },\n { route: scalarPropFromMapItem(b, \"route\") ?? \"\", method: scalarPropFromMapItem(b, \"method\") },\n );\n });\n visitAllScalars(doc, (scalar) => {\n if (typeof scalar.value !== \"string\") return;\n scalar.type = chooseQuoteType(scalar.value);\n });\n normalizeBlankLines(doc);\n }\n\n const output = serialize(doc);\n return { kind: \"canonical\", text: output, changed: output !== input };\n}\n\nfunction reorderTopLevelKeys(map: YAMLMap): void {\n reorderMapKeys(map, TOP_LEVEL_KEY_ORDER);\n}\n\nfunction reorderMapKeys(map: YAMLMap, keyOrder: readonly string[]): void {\n const items = map.items as Pair[];\n const byKey = new Map<string, Pair>();\n const unknownInOrder: Pair[] = [];\n for (const item of items) {\n const key = scalarKey(item);\n if (key === null) {\n unknownInOrder.push(item);\n continue;\n }\n if (keyOrder.includes(key)) {\n byKey.set(key, item);\n } else {\n unknownInOrder.push(item);\n }\n }\n const reordered: Pair[] = [];\n for (const k of keyOrder) {\n const p = byKey.get(k);\n if (p !== undefined) reordered.push(p);\n }\n reordered.push(...unknownInOrder);\n map.items = reordered;\n}\n\nfunction reorderEntriesUnder(map: YAMLMap, key: string, keyOrder: readonly string[]): void {\n const seq = lookupSeq(map, key);\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) reorderMapKeys(item, keyOrder);\n }\n}\n\nfunction forEachViewEntry(root: YAMLMap, fn: (view: YAMLMap) => void): void {\n const seq = lookupSeq(root, \"views\");\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) fn(item);\n }\n}\n\nfunction forEachComponentEntry(root: YAMLMap, key: string, fn: (cmp: YAMLMap) => void): void {\n const seq = lookupSeq(root, key);\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) fn(item);\n }\n}\n\nfunction reorderChildrenRecursive(cmp: YAMLMap): void {\n const children = lookupSeq(cmp, \"children\");\n if (children === null) return;\n for (const child of children.items) {\n if (!isMap(child)) continue;\n reorderMapKeys(child, COMPONENT_KEY_ORDER);\n reorderChildrenRecursive(child);\n }\n}\n\nfunction lookupSeq(map: YAMLMap, key: string): YAMLSeq | null {\n for (const item of map.items as Pair[]) {\n if (scalarKey(item) === key && isSeq(item.value)) return item.value;\n }\n return null;\n}\n\nfunction scalarKey(pair: Pair): string | null {\n // Pair.key may be a Scalar node or a raw value depending on parse path.\n const k = (pair.key as { value?: unknown }) ?? null;\n if (k === null) return null;\n const v = typeof k === \"object\" && k !== null && \"value\" in k ? k.value : k;\n return typeof v === \"string\" ? v : null;\n}\n\nfunction sortTopLevelSeq(\n root: YAMLMap,\n key: string,\n cmp: (a: unknown, b: unknown) => number,\n): void {\n const seq = lookupSeq(root, key);\n if (seq === null) return;\n // Array.prototype.sort is stable in V8/JSC since 2019.\n seq.items = (seq.items as unknown[]).slice().sort(cmp);\n}\n\nfunction scalarPropFromMapItem(item: unknown, key: string): string | undefined {\n if (!isMap(item)) return undefined;\n for (const pair of item.items as Pair[]) {\n if (scalarKey(pair) !== key) continue;\n const v = pair.value as { value?: unknown } | unknown;\n if (v !== null && typeof v === \"object\" && \"value\" in (v as object)) {\n const inner = (v as { value: unknown }).value;\n return typeof inner === \"string\" ? inner : undefined;\n }\n return typeof v === \"string\" ? v : undefined;\n }\n return undefined;\n}\n\nfunction visitAllScalars(doc: Document, fn: (scalar: Scalar) => void): void {\n walk(doc.contents, fn);\n}\n\nfunction walk(node: unknown, fn: (scalar: Scalar) => void): void {\n if (node === null || node === undefined) return;\n if (isScalar(node)) {\n fn(node);\n return;\n }\n if (isMap(node)) {\n for (const pair of node.items as Pair[]) {\n walk(pair.key, fn);\n walk(pair.value, fn);\n }\n return;\n }\n if (isSeq(node)) {\n for (const item of node.items) walk(item, fn);\n }\n}\n\nfunction normalizeBlankLines(doc: Document): void {\n const root = doc.contents;\n if (!isMap(root)) return;\n\n // HEADER blank-line normalization: emit exactly one blank line between a\n // leading comment block (HEADER) and the first content. Per spec: if no\n // HEADER, no leading blank.\n //\n // eemeli/yaml attaches a leading `# foo` block to the first Pair's *key*\n // (`firstPair.key.commentBefore`), not to `doc.commentBefore`. Setting\n // `spaceBefore` on the key produces a blank BEFORE the comment (wrong);\n // setting it on the Pair has no effect while the comment lives on the key.\n // Workaround: lift the key's commentBefore up to `doc.commentBefore`, clear\n // it on the key, then set `spaceBefore = true` on the first Pair so the\n // serializer emits the desired `<header>\\n\\n<content>` shape.\n const firstPair = (root.items as Pair[])[0];\n if (firstPair !== undefined) {\n const keyNode = firstPair.key as { commentBefore?: string | null } | null;\n const docMutable = doc as { commentBefore?: string | null };\n const keyComment = keyNode?.commentBefore;\n const docComment = docMutable.commentBefore;\n if (typeof keyComment === \"string\" && keyComment.length > 0) {\n docMutable.commentBefore = keyComment;\n keyNode!.commentBefore = null;\n }\n const hasHeader =\n (typeof docMutable.commentBefore === \"string\" && docMutable.commentBefore.length > 0) ||\n (typeof docComment === \"string\" && docComment.length > 0);\n (firstPair as { spaceBefore?: boolean }).spaceBefore = hasHeader;\n }\n\n for (const key of [\"views\", \"components\", \"requests\"] as const) {\n const seq = lookupSeq(root, key);\n if (seq === null) continue;\n seq.items.forEach((item, idx) => {\n // Items at the top level of these seqs get a blank line before them\n // (except the first item). spaceBefore may not be pre-set; assign directly.\n if (typeof item === \"object\" && item !== null) {\n (item as { spaceBefore: boolean }).spaceBefore = idx > 0;\n }\n });\n // Recurse into nested entries to clear any blank lines within an entry's body.\n for (const item of seq.items) {\n if (isMap(item)) clearInnerBlankLines(item);\n }\n }\n}\n\nfunction clearInnerBlankLines(map: YAMLMap): void {\n for (const pair of map.items as Pair[]) {\n (pair as { spaceBefore?: boolean }).spaceBefore = false;\n if (isSeq(pair.value)) {\n for (const item of (pair.value as YAMLSeq).items) {\n if (typeof item === \"object\" && item !== null) {\n (item as { spaceBefore?: boolean }).spaceBefore = false;\n }\n if (isMap(item)) clearInnerBlankLines(item);\n }\n } else if (isMap(pair.value)) {\n clearInnerBlankLines(pair.value);\n }\n }\n}\n\n// Quote-type selection per sightmap/spec authoring-conventions.md#quoting.\nfunction chooseQuoteType(value: string): Scalar.Type {\n if (requiresDoubleQuotes(value)) return \"QUOTE_DOUBLE\";\n if (value.includes('\"')) return \"QUOTE_SINGLE\";\n if (isPlainSafe(value)) return \"PLAIN\";\n return \"QUOTE_SINGLE\";\n}\n\nfunction requiresDoubleQuotes(s: string): boolean {\n // Any ASCII control character (\\x00-\\x1f) requires double-quoted escaping.\n // Includes tab, newline, CR, which canonical form encodes via \\t / \\n / \\r\n // escapes to keep one-line representation (spec: \"Long strings stay on one\n // line. Do not wrap.\").\n // eslint-disable-next-line no-control-regex\n return /[\\x00-\\x1f]/.test(s);\n}\n\nfunction isPlainSafe(s: string): boolean {\n if (s.length === 0) return false;\n // Leading character restrictions per YAML 1.2 plain scalar rules.\n const first = s[0]!;\n if (\"-?:,[]{}#&*!|>'\\\"%@`\".includes(first)) return false;\n if (first === \" \" || first === \"\\t\") return false;\n // Sequences that change parse semantics anywhere in the string.\n if (s.includes(\": \")) return false;\n if (s.includes(\" #\")) return false;\n // Reserved YAML true/false/null/numeric forms.\n if (/^(true|false|null|~|y|n|yes|no|on|off|True|False|Null|Yes|No|On|Off|TRUE|FALSE|NULL|YES|NO|ON|OFF)$/.test(s)) return false;\n if (/^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) return false;\n if (/^0[xob]/.test(s)) return false;\n return true;\n}\n\nfunction serialize(doc: Document): string {\n const out = doc.toString({\n indent: 2,\n lineWidth: 0,\n minContentWidth: 0,\n blockQuote: \"literal\",\n });\n return out.endsWith(\"\\n\") ? out : out + \"\\n\";\n}\n","// Shared canonical-form constants and comparators used by both the value-based\n// format() writer and the CST-preserving canonicalize() writer.\n//\n// Source of truth for the spec rules in\n// sightmap/spec docs/authoring-conventions.md#canonical-formatting-rules.\n\nexport const TOP_LEVEL_KEY_ORDER = [\n \"version\",\n \"memory\",\n \"views\",\n \"components\",\n \"requests\",\n] as const;\n\nexport const VIEW_KEY_ORDER = [\n \"name\",\n \"route\",\n \"description\",\n \"components\",\n \"memory\",\n \"requests\",\n] as const;\n\nexport const COMPONENT_KEY_ORDER = [\n \"name\",\n \"selector\",\n \"description\",\n \"children\",\n \"memory\",\n] as const;\n\n// Schema-derived order. The spec's authoring-conventions doc table lists\n// `method, url, description, memory` for Request — that table is stale\n// relative to the JSON Schema, which has `name, route, method, description,\n// source, request, response, headers, memory` (no `url` field exists). The\n// schema is the source of truth tools enforce; we follow it here.\nexport const REQUEST_KEY_ORDER = [\n \"name\",\n \"route\",\n \"method\",\n \"description\",\n \"source\",\n \"request\",\n \"response\",\n \"headers\",\n \"memory\",\n] as const;\n\n// Lexicographic byte-by-byte comparison on YAML scalar strings.\n// No Unicode normalization, no case folding (per spec).\nexport function compareByName(a: { name: string }, b: { name: string }): number {\n return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\n}\n\n// Sort requests by (route, method). Spec doc says (url, method) but `url`\n// is not a real field — see REQUEST_KEY_ORDER comment above.\n// `method?: string | undefined` (rather than `method?: string`) so callers\n// can pass through optional-or-undefined extractions without spreading.\nexport function compareRequests(\n a: { route: string; method?: string | undefined },\n b: { route: string; method?: string | undefined },\n): number {\n if (a.route !== b.route) return a.route < b.route ? -1 : 1;\n const am = a.method ?? \"\";\n const bm = b.method ?? \"\";\n return am < bm ? -1 : am > bm ? 1 : 0;\n}\n","import { resolve } from \"node:path\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport * as clack from \"@clack/prompts\";\nimport { detectFramework } from \"./detect/framework.js\";\nimport { detectHarnesses } from \"./detect/harness.js\";\nimport { detectSightmapAwareVendor } from \"./detect/vendor.js\";\nimport { detectSightmapDir } from \"./detect/sightmap-dir.js\";\nimport * as tui from \"./tui.js\";\nimport { writeClaudeCodeMcp } from \"./mcp-config/claude-code.js\";\nimport { writeCursorMcp } from \"./mcp-config/cursor.js\";\nimport { writeOpenCodeMcp } from \"./mcp-config/opencode.js\";\nimport { writeCodexMcp } from \"./mcp-config/codex.js\";\nimport { fetchPluginTarball } from \"./tarball.js\";\nimport { copyPluginAssets } from \"./skills-copy.js\";\nimport { buildSightmapMcpServerDef } from \"./version-pin.js\";\nimport { renderPluginInstructions } from \"./plugin-path.js\";\nimport { detectPackageManager } from \"./framework-setup/package-manager.js\";\nimport { installAdapter } from \"./framework-setup/install-adapter.js\";\nimport { buildCodegenCommand, runCodegen } from \"./framework-setup/codegen.js\";\nimport { wrapWithSightmapProvider } from \"./framework-setup/provider-codemod.js\";\nimport { formatExistingCorpusReport } from \"./existing-corpus.js\";\nimport { runLint } from \"../lint.js\";\nimport type { DetectResult, Host, Framework } from \"./types.js\";\n\nexport interface RunInitOptions {\n cwd: string;\n yes: boolean;\n dryRun?: boolean;\n installPath?: \"plugin\" | \"manual\";\n hosts?: string[];\n withBrowser?: boolean;\n curateOnly?: boolean;\n noCodegen?: boolean;\n noProvider?: boolean;\n}\n\nconst REACT_FRAMEWORKS: Framework[] = [\"react-vite\", \"react-cra\", \"next-app\", \"next-pages\", \"react-router-7\"];\n\nexport async function runInit(opts: RunInitOptions): Promise<number> {\n tui.intro();\n\n const detect: DetectResult = {\n framework: await detectFramework(opts.cwd),\n hosts: await detectHarnesses(opts.cwd),\n sightmapAwareVendor: false,\n sightmapDir: await detectSightmapDir(opts.cwd),\n };\n detect.sightmapAwareVendor = await detectSightmapAwareVendor(opts.cwd, detect.hosts);\n tui.showDetection(detect);\n\n // Framework setup branch\n if (detect.sightmapDir.present) {\n await runExistingCorpusFlow(opts.cwd, detect.sightmapDir.viewCount ?? 0);\n } else {\n await runFreshFrameworkSetup(opts, detect);\n }\n\n let installPath = opts.installPath;\n if (!installPath) {\n if (opts.yes) installPath = \"plugin\";\n else {\n const choice = await tui.selectInstallPath(\"plugin\");\n if (typeof choice === \"symbol\") return 1;\n installPath = choice;\n }\n }\n\n const hosts = await resolveHosts(opts, detect);\n if (hosts.length === 0) {\n tui.outro(\"No hosts selected — nothing to do.\");\n return 0;\n }\n\n const withBrowser = resolveBrowserBundle(opts, detect);\n\n if (installPath === \"plugin\") {\n clack.note(renderPluginInstructions(hosts), \"Next\");\n tui.outro(\"Run those, then restart your agent.\");\n return 0;\n }\n\n // Manual path\n const tarballDir = resolve(tmpdir(), `sightmap-plugin-${Date.now()}`);\n await mkdir(tarballDir, { recursive: true });\n try {\n const tar = await fetchPluginTarball({ destDir: tarballDir, version: \"latest\" });\n\n const serverDef = buildSightmapMcpServerDef({\n compatibleMcpVersion: tar.compatibleMcpVersion,\n pluginVersion: tar.pluginVersion,\n withBrowser,\n sightmapDir: \".sightmap\",\n curateRoot: \".sightmap\",\n });\n\n for (const h of hosts) {\n await writeMcpForHost(h, opts.cwd, serverDef);\n await copyPluginAssets({ tarballDir, projectDir: opts.cwd, host: h });\n }\n } finally {\n await rm(tarballDir, { recursive: true, force: true });\n }\n\n tui.outro(\"Done. Restart your agent to pick up the new MCP.\");\n return 0;\n}\n\nasync function runFreshFrameworkSetup(opts: RunInitOptions, detect: DetectResult): Promise<void> {\n if (!REACT_FRAMEWORKS.includes(detect.framework)) {\n // Empty .sightmap/ scaffold for unsupported frameworks\n await mkdir(resolve(opts.cwd, \".sightmap\"), { recursive: true });\n await writeFile(\n resolve(opts.cwd, \".sightmap/app.yaml\"),\n `version: 1\\nviews: []\\n`,\n \"utf8\",\n );\n return;\n }\n\n const pm = await detectPackageManager(opts.cwd);\n const spinner = clack.spinner();\n\n spinner.start(`Installing @sightmap/react via ${pm}`);\n await installAdapter({ cwd: opts.cwd, packageManager: pm, packageName: \"@sightmap/react\" });\n spinner.stop(\"Installed @sightmap/react\");\n\n // Provider codemod\n if (!opts.noProvider) {\n const entry = await findAppEntry(opts.cwd, detect.framework);\n if (entry) {\n const source = await readFile(entry, \"utf8\");\n const result = wrapWithSightmapProvider(source);\n if (result.changed) {\n if (opts.yes || (await confirmCodemod(entry))) {\n await writeFile(entry, result.code, \"utf8\");\n }\n } else if (result.reason) {\n clack.log.warn(`SightmapProvider codemod skipped: ${result.reason}. Add manually to ${entry}.`);\n }\n } else {\n clack.log.warn(\"Could not locate an app entry file. Add <SightmapProvider> manually.\");\n }\n }\n\n // Codegen\n if (!opts.noCodegen) {\n const cmd = buildCodegenCommand({ framework: detect.framework, packageManager: pm });\n if (cmd) {\n spinner.start(\"Running sightmap-react gen\");\n await runCodegen(opts.cwd, cmd);\n spinner.stop(\"Scaffolded .sightmap/\");\n }\n }\n}\n\nasync function findAppEntry(cwd: string, framework: Framework): Promise<string | null> {\n const candidates: Record<Framework, string[]> = {\n \"react-vite\": [\"src/main.tsx\", \"src/main.jsx\", \"src/index.tsx\", \"src/index.jsx\"],\n \"react-cra\": [\"src/index.tsx\", \"src/index.jsx\"],\n \"next-app\": [\"app/layout.tsx\", \"app/layout.jsx\"],\n \"next-pages\": [\"pages/_app.tsx\", \"pages/_app.jsx\"],\n \"react-router-7\": [\"app/root.tsx\", \"app/root.jsx\", \"src/root.tsx\"],\n unknown: [],\n };\n for (const rel of candidates[framework]) {\n const abs = resolve(cwd, rel);\n try {\n await readFile(abs, \"utf8\");\n return abs;\n } catch {\n // try next\n }\n }\n return null;\n}\n\nasync function confirmCodemod(entry: string): Promise<boolean> {\n const choice = await clack.confirm({\n message: `Wrap ${entry} with <SightmapProvider>?`,\n initialValue: true,\n });\n return typeof choice === \"boolean\" ? choice : false;\n}\n\nasync function runExistingCorpusFlow(cwd: string, viewCount: number): Promise<void> {\n const spinner = clack.spinner();\n spinner.start(\"Auditing existing corpus...\");\n await runLint({ path: \".sightmap\", cwd, json: false, strict: false });\n spinner.stop(\"Audit complete\");\n clack.note(formatExistingCorpusReport({ viewCount, diagnostics: [] }), `${viewCount} view${viewCount === 1 ? \"\" : \"s\"}`);\n}\n\nasync function resolveHosts(opts: RunInitOptions, detect: DetectResult): Promise<Host[]> {\n if (opts.hosts) {\n const valid = new Set<Host>([\"claude-code\", \"codex\", \"cursor\", \"opencode\"]);\n const invalid = opts.hosts.filter(h => !valid.has(h as Host));\n if (invalid.length > 0) {\n throw new Error(\n `Unknown host(s): ${invalid.join(\", \")}. Valid: claude-code, codex, cursor, opencode`,\n );\n }\n return opts.hosts as Host[];\n }\n if (opts.yes) return detect.hosts.length > 0 ? detect.hosts : [\"claude-code\"];\n const defaults = detect.hosts.length > 0 ? detect.hosts : ([\"claude-code\"] as Host[]);\n const choice = await tui.selectHosts(detect.hosts, defaults);\n if (typeof choice === \"symbol\") return [];\n return choice;\n}\n\nfunction resolveBrowserBundle(opts: RunInitOptions, detect: DetectResult): boolean {\n if (opts.withBrowser) return true;\n if (opts.curateOnly) return false;\n return !detect.sightmapAwareVendor;\n}\n\nasync function writeMcpForHost(host: Host, cwd: string, serverDef: ReturnType<typeof buildSightmapMcpServerDef>): Promise<void> {\n const common = { cwd, serverName: \"sightmap\", serverDef };\n if (host === \"claude-code\") return writeClaudeCodeMcp(common);\n if (host === \"cursor\") return writeCursorMcp(common);\n if (host === \"opencode\") return writeOpenCodeMcp(common);\n if (host === \"codex\") {\n return writeCodexMcp({\n configPath: resolve(process.env.HOME ?? cwd, \".codex/config.toml\"),\n serverName: \"sightmap\",\n serverDef,\n });\n }\n}\n","import { readFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Framework } from \"../types.js\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectFramework(cwd: string): Promise<Framework> {\n const pkgPath = resolve(cwd, \"package.json\");\n if (!(await exists(pkgPath))) return \"unknown\";\n\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n\n if (deps.next) {\n if (await exists(resolve(cwd, \"app\"))) return \"next-app\";\n if (await exists(resolve(cwd, \"pages\"))) return \"next-pages\";\n return \"next-app\";\n }\n\n const rrVersion = deps[\"react-router\"];\n const rr7 = rrVersion ? /^[\\^~>=<]*7\\./.test(rrVersion) : false;\n if (rr7 || (await exists(resolve(cwd, \"react-router.config.ts\")))) {\n return \"react-router-7\";\n }\n\n if (deps.react) {\n if (deps.vite || (await exists(resolve(cwd, \"vite.config.ts\"))) || (await exists(resolve(cwd, \"vite.config.js\")))) {\n return \"react-vite\";\n }\n if (deps[\"react-scripts\"]) return \"react-cra\";\n }\n\n return \"unknown\";\n}\n","import { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Host } from \"../types.js\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nconst HARNESS_ORDER: Host[] = [\"claude-code\", \"codex\", \"cursor\", \"opencode\"];\n\nexport async function detectHarnesses(cwd: string): Promise<Host[]> {\n const out: Host[] = [];\n for (const h of HARNESS_ORDER) {\n let found = false;\n if (h === \"claude-code\") found = await exists(resolve(cwd, \".claude\"));\n else if (h === \"cursor\") found = await exists(resolve(cwd, \".cursor\"));\n else if (h === \"codex\") found = await exists(resolve(cwd, \".codex\"));\n else if (h === \"opencode\") found = await exists(resolve(cwd, \"opencode.json\"));\n if (found) out.push(h);\n }\n return out;\n}\n","import { readFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { isKnownVendor, type McpServerEntry } from \"../vendor-allowlist.js\";\nimport type { Host } from \"../types.js\";\n\nasync function readJsonIfExists(path: string): Promise<unknown | null> {\n try {\n await access(path);\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction extractServers(parsed: unknown): McpServerEntry[] {\n if (!parsed || typeof parsed !== \"object\") return [];\n const root = parsed as { mcpServers?: Record<string, { command?: string; args?: string[] }> };\n const servers = root.mcpServers ?? {};\n return Object.entries(servers).map(([name, def]) => ({\n name,\n command: def.command ?? \"\",\n args: def.args ?? [],\n }));\n}\n\nexport async function detectSightmapAwareVendor(cwd: string, hosts: Host[]): Promise<boolean> {\n const candidates: string[] = [];\n if (hosts.includes(\"claude-code\")) candidates.push(resolve(cwd, \".mcp.json\"));\n if (hosts.includes(\"cursor\")) candidates.push(resolve(cwd, \".cursor/mcp.json\"));\n if (hosts.includes(\"opencode\")) candidates.push(resolve(cwd, \"opencode.json\"));\n // Codex (TOML) handled in a later iteration if needed.\n\n for (const path of candidates) {\n const parsed = await readJsonIfExists(path);\n if (!parsed) continue;\n for (const entry of extractServers(parsed)) {\n if (isKnownVendor(entry)) return true;\n }\n }\n return false;\n}\n","export const KNOWN_SIGHTMAP_VENDORS = [\"subtext\"] as const;\n\nexport interface McpServerEntry {\n name: string;\n command: string;\n args: string[];\n}\n\nexport function isKnownVendor(entry: McpServerEntry): boolean {\n const haystacks = [entry.name, entry.command, ...entry.args];\n return KNOWN_SIGHTMAP_VENDORS.some(vendor =>\n haystacks.some(h => h.toLowerCase().includes(vendor.toLowerCase())),\n );\n}\n","import { access, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport interface SightmapDirInfo {\n present: boolean;\n viewCount?: number;\n}\n\nexport async function detectSightmapDir(cwd: string): Promise<SightmapDirInfo> {\n const dir = resolve(cwd, \".sightmap\");\n try {\n await access(dir);\n } catch {\n return { present: false };\n }\n const entries = await readdir(dir);\n const yamls = entries.filter(e => e.endsWith(\".yaml\") || e.endsWith(\".yml\"));\n return { present: true, viewCount: yamls.length };\n}\n","import * as clack from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { DetectResult, Framework, Host } from \"./types.js\";\n\nconst FRAMEWORK_LABELS: Record<Framework, string> = {\n \"react-vite\": \"React (Vite)\",\n \"react-cra\": \"React (CRA)\",\n \"next-app\": \"Next.js (App Router)\",\n \"next-pages\": \"Next.js (Pages Router)\",\n \"react-router-7\": \"React Router 7\",\n unknown: \"unknown\",\n};\n\nconst HOST_LABELS: Record<Host, string> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n cursor: \"Cursor\",\n opencode: \"OpenCode\",\n};\n\nexport function formatDetectionSummary(d: DetectResult): string[] {\n const fw = `Framework: ${FRAMEWORK_LABELS[d.framework]}`;\n const hosts =\n d.hosts.length > 0\n ? `Coding agents: ${d.hosts.map((h) => HOST_LABELS[h]).join(\", \")}`\n : \"Coding agents: none detected\";\n const vendor = d.sightmapAwareVendor\n ? \"Browser MCP: Sightmap-aware vendor detected\"\n : \"Browser MCP: none detected\";\n const dir = d.sightmapDir.present\n ? `.sightmap/: present (${d.sightmapDir.viewCount ?? 0} views)`\n : \".sightmap/: not present\";\n return [fw, hosts, vendor, dir];\n}\n\nexport function intro(): void {\n clack.intro(pc.cyan(\"◆ Sightmap\") + \" curate your view inventory\");\n}\n\nexport function outro(message: string): void {\n clack.outro(pc.green(message));\n}\n\nexport function showDetection(d: DetectResult): void {\n clack.note(formatDetectionSummary(d).join(\"\\n\"), pc.dim(\"Detected\"));\n}\n\nexport async function selectInstallPath(\n suggestion: \"plugin\" | \"manual\" = \"plugin\",\n): Promise<\"plugin\" | \"manual\" | symbol> {\n return clack.select({\n message: \"How would you like to install Sightmap?\",\n initialValue: suggestion,\n options: [\n {\n value: \"plugin\" as const,\n label: \"Plugin (recommended)\",\n hint: \"Two copy-paste commands per host. Skills, hooks, MCP — all together.\",\n },\n {\n value: \"manual\" as const,\n label: \"Manual\",\n hint: \"Write MCP config + copy skills/hooks into this repo.\",\n },\n ],\n }) as Promise<\"plugin\" | \"manual\" | symbol>;\n}\n\nexport async function selectHosts(\n detected: Host[],\n defaults: Host[],\n): Promise<Host[] | symbol> {\n const options = (\n [\"claude-code\", \"codex\", \"cursor\", \"opencode\"] as const\n ).map((h) => ({\n value: h,\n label: HOST_LABELS[h] + (detected.includes(h) ? pc.dim(\" (detected)\") : \"\"),\n }));\n return clack.multiselect({\n message: \"Which hosts?\",\n options,\n initialValues: defaults,\n required: true,\n }) as Promise<Host[] | symbol>;\n}\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nasync function readJsonIfExists(path: string): Promise<Record<string, unknown> | null> {\n try {\n await access(path);\n return JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function writeClaudeCodeMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \".mcp.json\");\n const existing = (await readJsonIfExists(path)) ?? {};\n const servers = (existing.mcpServers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcpServers: {\n ...servers,\n [opts.serverName]: opts.serverDef,\n },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nexport async function writeCursorMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \".cursor/mcp.json\");\n let existing: Record<string, unknown> = {};\n try {\n await access(path);\n existing = JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n await mkdir(dirname(path), { recursive: true });\n }\n const servers = (existing.mcpServers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcpServers: { ...servers, [opts.serverName]: opts.serverDef },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nexport async function writeOpenCodeMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \"opencode.json\");\n let existing: Record<string, unknown> = {};\n try {\n await access(path);\n existing = JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n // create new file\n }\n const mcp = (existing.mcp as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcp: { ...mcp, [opts.serverName]: opts.serverDef },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport type { McpServerDefinition } from \"./types.js\";\n\nexport interface WriteCodexMcpOptions {\n configPath: string;\n serverName: string;\n serverDef: McpServerDefinition;\n}\n\nexport async function writeCodexMcp(opts: WriteCodexMcpOptions): Promise<void> {\n let existing: Record<string, unknown> = {};\n try {\n await access(opts.configPath);\n existing = parse(await readFile(opts.configPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n await mkdir(dirname(opts.configPath), { recursive: true });\n }\n const servers = (existing.mcp_servers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcp_servers: {\n ...servers,\n [opts.serverName]: opts.serverDef,\n },\n };\n await writeFile(opts.configPath, stringify(next as never), \"utf8\");\n}\n","import pacote from \"pacote\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport interface FetchResult {\n destDir: string;\n compatibleMcpVersion: string;\n pluginVersion: string;\n}\n\nexport interface FetchOptions {\n destDir: string;\n version: string;\n}\n\nexport async function fetchPluginTarball(opts: FetchOptions): Promise<FetchResult> {\n const spec = `@sightmap/plugin@${opts.version}`;\n await pacote.extract(spec, opts.destDir);\n const manifestPath = resolve(opts.destDir, \".claude-plugin/plugin.json\");\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n version?: string;\n compatibleMcpVersion?: string;\n };\n if (!manifest.compatibleMcpVersion) {\n throw new Error(\"Plugin tarball missing 'compatibleMcpVersion' in plugin.json\");\n }\n return {\n destDir: opts.destDir,\n compatibleMcpVersion: manifest.compatibleMcpVersion,\n pluginVersion: manifest.version ?? \"0.0.0\",\n };\n}\n","import { cp, mkdir, readFile, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Host } from \"./types.js\";\n\nexport interface CopyAssetsOptions {\n tarballDir: string;\n projectDir: string;\n host: Host;\n}\n\nexport async function copyPluginAssets(opts: CopyAssetsOptions): Promise<void> {\n const targets = resolveTargets(opts.host, opts.projectDir);\n\n await mkdir(targets.skills, { recursive: true });\n await cp(resolve(opts.tarballDir, \"skills\"), targets.skills, { recursive: true });\n\n if (targets.agents) {\n await mkdir(targets.agents, { recursive: true });\n await cp(resolve(opts.tarballDir, \"agents\"), targets.agents, { recursive: true });\n }\n\n if (targets.hooksJson) {\n const srcPath = resolve(opts.tarballDir, \"hooks/hooks.json\");\n const dstPath = targets.hooksJson;\n let merged: Record<string, unknown>;\n try {\n await access(dstPath);\n const existing = JSON.parse(await readFile(dstPath, \"utf8\")) as Record<string, unknown>;\n const incoming = JSON.parse(await readFile(srcPath, \"utf8\")) as Record<string, unknown>;\n merged = { ...existing, ...incoming };\n } catch {\n merged = JSON.parse(await readFile(srcPath, \"utf8\")) as Record<string, unknown>;\n }\n await writeFile(dstPath, JSON.stringify(merged, null, 2) + \"\\n\", \"utf8\");\n }\n}\n\nfunction resolveTargets(\n host: Host,\n projectDir: string,\n): { skills: string; agents?: string; hooksJson?: string } {\n switch (host) {\n case \"claude-code\":\n return {\n skills: resolve(projectDir, \".claude/skills/sightmap\"),\n agents: resolve(projectDir, \".claude/agents\"),\n hooksJson: resolve(projectDir, \".claude/hooks.json\"),\n };\n case \"codex\":\n return {\n skills: resolve(projectDir, \".codex/skills/sightmap\"),\n agents: resolve(projectDir, \".codex/agents\"),\n hooksJson: resolve(projectDir, \".codex/hooks.json\"),\n };\n case \"cursor\":\n return { skills: resolve(projectDir, \".cursor/rules/sightmap\") };\n case \"opencode\":\n return { skills: resolve(projectDir, \".opencode/plugins/sightmap\") };\n }\n}\n","import type { McpServerDefinition } from \"./mcp-config/types.js\";\n\nexport interface BuildServerDefOptions {\n compatibleMcpVersion: string;\n pluginVersion: string;\n withBrowser: boolean;\n sightmapDir: string;\n curateRoot: string;\n}\n\nexport function buildSightmapMcpServerDef(opts: BuildServerDefOptions): McpServerDefinition {\n const args = [\"-y\", `@sightmap/mcp@${opts.compatibleMcpVersion}`,\n \"--sightmap-dir\", opts.sightmapDir,\n \"--curate-root\", opts.curateRoot];\n if (opts.withBrowser) {\n args.push(\"--\", \"npx\", \"-y\", \"@playwright/mcp@latest\");\n } else {\n args.push(\"--curate-only\");\n }\n return {\n command: \"npx\",\n args,\n env: { SIGHTMAP_PLUGIN_VERSION: opts.pluginVersion },\n };\n}\n","import type { Host } from \"./types.js\";\n\nconst SECTIONS: Record<Host, string> = {\n \"claude-code\":\n \"Claude Code:\\n\" +\n \" /plugin marketplace add sightmap/plugin\\n\" +\n \" /plugin install sightmap@sightmap-marketplace\",\n codex:\n \"Codex:\\n\" +\n \" codex plugin marketplace add sightmap/plugin\\n\" +\n \" codex plugin install sightmap@sightmap-marketplace\",\n cursor:\n \"Cursor:\\n\" + \" /plugin add sightmap/plugin\\n\" + \" (in the Cursor command palette)\",\n opencode:\n \"OpenCode:\\n\" +\n \" Add to opencode.json plugin array:\\n\" +\n ' \"plugin\": [\"sightmap@git+https://github.com/sightmap/plugin\"]\\n' +\n \" Then restart OpenCode.\",\n};\n\nexport function renderPluginInstructions(hosts: Host[]): string {\n const head = \"Run these to finish setup:\\n\";\n const body = hosts.map((h) => SECTIONS[h]).join(\"\\n\\n\");\n const foot = \"\\n\\nThen restart your agent.\";\n return head + \"\\n\" + body + foot;\n}\n","import { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\";\n\nasync function exists(p: string): Promise<boolean> {\n try { await access(p); return true; } catch { return false; }\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(resolve(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await exists(resolve(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n","import { spawn } from \"node:child_process\";\nimport type { PackageManager } from \"./package-manager.js\";\n\nconst ADD_VERB: Record<PackageManager, string> = {\n pnpm: \"add\",\n yarn: \"add\",\n npm: \"install\",\n};\n\nexport interface InstallAdapterOptions {\n cwd: string;\n packageManager: PackageManager;\n packageName: string;\n}\n\nexport async function installAdapter(opts: InstallAdapterOptions): Promise<void> {\n await new Promise<void>((resolveP, reject) => {\n const child = spawn(opts.packageManager, [ADD_VERB[opts.packageManager], opts.packageName], {\n cwd: opts.cwd,\n stdio: \"inherit\",\n });\n child.on(\"error\", reject);\n child.on(\"exit\", code => code === 0 ? resolveP() : reject(new Error(`${opts.packageManager} exited with code ${code}`)));\n });\n}\n","import { spawn } from \"node:child_process\";\nimport type { Framework } from \"../types.js\";\nimport type { PackageManager } from \"./package-manager.js\";\n\nconst REACT_FRAMEWORKS: Framework[] = [\"react-vite\", \"react-cra\", \"next-app\", \"next-pages\", \"react-router-7\"];\n\nconst EXEC_VERB: Record<PackageManager, string[]> = {\n pnpm: [\"exec\"],\n yarn: [\"exec\"],\n npm: [\"exec\", \"--\"],\n};\n\nexport interface CodegenCommand {\n command: string;\n args: string[];\n}\n\nexport interface BuildCodegenOptions {\n framework: Framework;\n packageManager: PackageManager;\n}\n\nexport function buildCodegenCommand(opts: BuildCodegenOptions): CodegenCommand | null {\n if (!REACT_FRAMEWORKS.includes(opts.framework)) return null;\n return {\n command: opts.packageManager,\n args: [...EXEC_VERB[opts.packageManager], \"sightmap-react\", \"gen\"],\n };\n}\n\nexport async function runCodegen(cwd: string, cmd: CodegenCommand): Promise<void> {\n await new Promise<void>((resolveP, reject) => {\n const child = spawn(cmd.command, cmd.args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", code => code === 0 ? resolveP() : reject(new Error(`codegen exited ${code}`)));\n });\n}\n","import * as recast from \"recast\";\nimport * as parser from \"@babel/parser\";\nimport type { File } from \"@babel/types\";\n\nconst babelParser = {\n parse(source: string) {\n return parser.parse(source, {\n sourceType: \"module\",\n tokens: true,\n plugins: [\"jsx\", \"typescript\"],\n });\n },\n};\n\nexport interface CodemodResult {\n code: string;\n changed: boolean;\n reason?: string;\n}\n\nexport function wrapWithSightmapProvider(source: string): CodemodResult {\n if (source.includes(\"SightmapProvider\")) {\n return { code: source, changed: false, reason: \"SightmapProvider already present\" };\n }\n\n const ast = recast.parse(source, { parser: babelParser }) as File;\n const b = recast.types.builders;\n\n let renderCall: any = null;\n let renderArgIndex = -1;\n\n recast.types.visit(ast, {\n visitCallExpression(path) {\n const callee = path.node.callee;\n // matches ReactDOM.createRoot(...).render(<App/>) and createRoot(...).render(<App/>)\n if (\n callee.type === \"MemberExpression\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"render\"\n ) {\n renderCall = path.node;\n renderArgIndex = 0;\n return false;\n }\n this.traverse(path);\n },\n });\n\n if (!renderCall) {\n return { code: source, changed: false, reason: \"no .render() call found\" };\n }\n\n const arg = renderCall.arguments[renderArgIndex];\n if (!arg) return { code: source, changed: false, reason: \"render() called with no args\" };\n\n const wrapped = b.jsxElement(\n b.jsxOpeningElement(b.jsxIdentifier(\"SightmapProvider\"), [], false),\n b.jsxClosingElement(b.jsxIdentifier(\"SightmapProvider\")),\n [arg as never],\n );\n renderCall.arguments[renderArgIndex] = wrapped;\n\n const importDecl = b.importDeclaration(\n [b.importSpecifier(b.identifier(\"SightmapProvider\"), b.identifier(\"SightmapProvider\"))],\n b.stringLiteral(\"@sightmap/react\"),\n );\n ast.program.body.unshift(importDecl as never);\n\n const output = recast.print(ast, { quote: \"single\" }).code;\n return { code: output, changed: true };\n}\n","export interface ExistingCorpusReportInput {\n viewCount: number;\n diagnostics: Array<{ severity: string; code: string; view?: string; message: string }>;\n}\n\nexport function formatExistingCorpusReport(input: ExistingCorpusReportInput): string {\n const errors = input.diagnostics.filter(d => d.severity === \"error\");\n const warnings = input.diagnostics.filter(d => d.severity === \"warning\");\n\n const lines: string[] = [];\n lines.push(`sightmap check passed (${input.viewCount} views, ${errors.length} schema errors)`);\n\n if (warnings.length > 0) {\n const byCode = new Map<string, number>();\n for (const w of warnings) byCode.set(w.code, (byCode.get(w.code) ?? 0) + 1);\n const emptyMemory = byCode.get(\"EMPTY_MEMORY\") ?? 0;\n if (emptyMemory > 0) {\n lines.push(`${emptyMemory} views have empty memory blocks — run /sightmap audit for details`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["resolve","yaml","yaml","resolve","resolve","readFile","readdir","join","extname","relative","resolve","resolve","collectYamlFiles","relative","readFile","readdir","join","extname","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","relative","resolve","relative","resolve","readdir","join","relative","existsSync","join","existsSync","readdir","relative","resolve","readFile","stat","resolve","relative","resolve","relative","stat","readFile","resolve","mkdir","readFile","writeFile","clack","readFile","resolve","access","resolve","exists","readFile","access","resolve","access","readFile","resolve","access","readdir","resolve","intro","outro","readFile","writeFile","access","resolve","readJsonIfExists","readFile","writeFile","access","resolve","dirname","readFile","writeFile","access","resolve","readFile","writeFile","access","mkdir","dirname","parse","readFile","resolve","mkdir","readFile","writeFile","access","resolve","access","resolve","exists","spawn","REACT_FRAMEWORKS","intro","outro","resolve","mkdir","writeFile","spinner","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/validate.ts","../../src/validate.ts","../../src/diagnostics.ts","../../src/parse.ts","../../src/cli/_fsHelpers.ts","../../src/cli/envelope.ts","../../src/cli/humanFormat.ts","../../src/cli/lint.ts","../../src/loadDirectory.ts","../../src/merge.ts","../../src/lintRules/duplicateName.ts","../../src/lintRules/duplicateRoute.ts","../../src/lintRules/routeShadowing.ts","../../src/lintRules/unknownSource.ts","../../src/lintRules/selectorSyntax.ts","../../src/lint.ts","../../src/cli/match.ts","../../src/routeMatch.ts","../../src/resolver.ts","../../src/match.ts","../../src/cli/explain.ts","../../src/explain.ts","../../src/cli/check.ts","../../src/cli/checkConventions.ts","../../src/conventions/walker.ts","../../src/conventions/slug.ts","../../src/conventions/rules.ts","../../src/cli/fmt.ts","../../src/format/canonicalize.ts","../../src/format/canonical-rules.ts","../../src/cli/init/index.ts","../../src/cli/init/detect/framework.ts","../../src/cli/init/detect/harness.ts","../../src/cli/init/detect/vendor.ts","../../src/cli/init/vendor-allowlist.ts","../../src/cli/init/detect/sightmap-dir.ts","../../src/cli/init/detect/workspaces.ts","../../src/cli/init/tui.ts","../../src/cli/init/framework-setup/provider-snippet.ts","../../src/cli/init/mcp-config/claude-code.ts","../../src/cli/init/mcp-config/cursor.ts","../../src/cli/init/mcp-config/opencode.ts","../../src/cli/init/mcp-config/codex.ts","../../src/cli/init/tarball.ts","../../src/cli/init/skills-copy.ts","../../src/cli/init/settings-merge.ts","../../src/cli/init/version-pin.ts","../../src/cli/init/framework-setup/package-manager.ts","../../src/cli/init/framework-setup/install-adapter.ts","../../src/cli/init/framework-setup/codegen.ts","../../src/cli/init/framework-setup/provider-codemod.ts","../../src/cli/init/existing-corpus.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { runValidate } from \"./validate.js\";\nimport { runLint } from \"./lint.js\";\nimport { runMatch } from \"./match.js\";\nimport { runExplain } from \"./explain.js\";\nimport { runCheck, runCheckFromStdin } from \"./check.js\";\nimport { runCheckConventions } from \"./checkConventions.js\";\nimport { runFmt } from \"./fmt.js\";\nimport { runInit } from \"./init/index.js\";\n\nconst program = new Command();\nprogram\n .name(\"sightmap\")\n .description(\"CLI for the Sightmap spec — validate, lint, match, explain.\")\n .version(\"0.1.0\");\n\nprogram.option(\"--cwd <dir>\", \"working directory (resolves [path] arguments)\", process.cwd());\n\nprogram\n .command(\"validate [path]\")\n .description(\"Validate .sightmap/ against the schema.\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (path: string | undefined, opts: { json?: boolean }) => {\n const code = await runValidate({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n });\n process.exit(code);\n });\n\nprogram\n .command(\"lint [path]\")\n .description(\"Run quality checks beyond schema.\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--strict\", \"treat all warnings as errors (exit 1)\")\n .option(\"--rules <list>\", \"comma-separated list of rule codes to disable (prefix '-') or only-enable\")\n .action(async (path: string | undefined, opts: { json?: boolean; strict?: boolean; rules?: string }) => {\n const code = await runLint({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n strict: opts.strict === true,\n ...(opts.rules !== undefined ? { rules: opts.rules } : {}),\n });\n process.exit(code);\n });\n\nprogram\n .command(\"check [path]\")\n .description(\"Run schema + quality checks (combined validate + lint).\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--level <level>\", \"'schema' or 'quality' (default 'quality')\", \"quality\")\n .option(\"--stdin\", \"read sightmap content from stdin instead of a path\")\n .action(\n async (\n path: string | undefined,\n opts: { json?: boolean; level?: string; stdin?: boolean },\n ) => {\n const level: \"schema\" | \"quality\" = opts.level === \"schema\" ? \"schema\" : \"quality\";\n if (opts.stdin === true) {\n const stdinCode = await runCheckFromStdin({\n level,\n json: opts.json === true,\n });\n process.exit(stdinCode);\n }\n const code = await runCheck({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n level,\n json: opts.json === true,\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"match <url> [path]\")\n .description(\"Resolve sightmap context for a URL.\")\n .option(\"--method <m>\", \"HTTP method filter for requests\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--require-view\", \"exit 1 if no view matched\")\n .action(\n async (\n url: string,\n path: string | undefined,\n opts: { method?: string; json?: boolean; requireView?: boolean },\n ) => {\n const code = await runMatch({\n url,\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n requireView: opts.requireView === true,\n ...(opts.method !== undefined ? { method: opts.method } : {}),\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"explain <query> [path]\")\n .description(\"Look up sightmap entries by name and/or source path.\")\n .option(\"--by <kind>\", \"scope to 'name' or 'path'\")\n .option(\"--type <kind>\", \"scope to 'view', 'component', or 'request'\")\n .option(\"--json\", \"machine-readable output\")\n .option(\"--require-hit\", \"exit 1 if zero hits\")\n .action(\n async (\n query: string,\n path: string | undefined,\n opts: {\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n json?: boolean;\n requireHit?: boolean;\n },\n ) => {\n const code = await runExplain({\n query,\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n requireHit: opts.requireHit === true,\n ...(opts.by !== undefined ? { by: opts.by } : {}),\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"check-conventions [path]\")\n .description(\"Validate repo filename conventions (SEPs, conformance fixtures).\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (path: string | undefined, opts: { json?: boolean }) => {\n const code = await runCheckConventions({\n path: path ?? \".\",\n cwd: program.opts<{ cwd: string }>().cwd,\n json: opts.json === true,\n });\n process.exit(code);\n });\n\nprogram\n .command(\"fmt [path]\")\n .description(\"Canonicalize .sightmap/*.yaml files (default --check; --write to fix in place).\")\n .option(\"--check\", \"exit non-zero if any file is not canonical (default mode)\")\n .option(\"--write\", \"rewrite non-canonical files in place\")\n .option(\"--json\", \"machine-readable output\")\n .action(\n async (\n path: string | undefined,\n opts: { check?: boolean; write?: boolean; json?: boolean },\n ) => {\n if (opts.check === true && opts.write === true) {\n process.stderr.write(\"fatal: --check and --write are mutually exclusive\\n\");\n process.exit(2);\n }\n const code = await runFmt({\n path: path ?? \".sightmap\",\n cwd: program.opts<{ cwd: string }>().cwd,\n check: opts.write !== true, // default true unless --write\n write: opts.write === true,\n json: opts.json === true,\n });\n process.exit(code);\n },\n );\n\nprogram\n .command(\"init\")\n .description(\"Initialize Sightmap in this project (detects framework + coding agent, writes config).\")\n .option(\"--yes\", \"accept all defaults (non-interactive)\")\n .option(\"--plugin\", \"force plugin install path\")\n .option(\"--manual\", \"force manual install path\")\n .option(\"--host <names>\", \"comma-separated hosts: claude-code,codex,cursor,opencode\")\n .option(\"--with-browser\", \"force bundled Playwright + browser tools\")\n .option(\"--curate-only\", \"force curation-only (skip browser tools)\")\n .option(\"--no-codegen\", \"skip sightmap-react gen\")\n .option(\"--no-provider\", \"skip <SightmapProvider> codemod\")\n .action(async (opts: {\n yes?: boolean;\n plugin?: boolean;\n manual?: boolean;\n host?: string;\n withBrowser?: boolean;\n curateOnly?: boolean;\n codegen?: boolean;\n provider?: boolean;\n }) => {\n const code = await runInit({\n cwd: program.opts<{ cwd: string }>().cwd,\n yes: opts.yes === true,\n ...(opts.plugin ? { installPath: \"plugin\" as const } : {}),\n ...(opts.manual ? { installPath: \"manual\" as const } : {}),\n ...(opts.host !== undefined ? { hosts: opts.host.split(\",\").map(s => s.trim()) } : {}),\n ...(opts.withBrowser ? { withBrowser: true } : {}),\n ...(opts.curateOnly ? { curateOnly: true } : {}),\n ...(opts.codegen === false ? { noCodegen: true } : {}),\n ...(opts.provider === false ? { noProvider: true } : {}),\n });\n process.exit(code);\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n process.stderr.write(`fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(2);\n});\n","import { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { validate } from \"../validate.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatValidate } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport interface RunValidateOptions {\n path: string;\n cwd: string;\n json: boolean;\n}\n\nexport async function runValidate(opts: RunValidateOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const files = (await collectYamlFiles(dir)).sort();\n const fileResults: { path: string; ok: boolean }[] = [];\n const diagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(opts.cwd, file);\n const text = await readFile(file, \"utf8\");\n const r = validate(text, { sourceFile: relPath });\n fileResults.push({ path: relPath, ok: r.ok });\n if (!r.ok) diagnostics.push(...r.diagnostics);\n }\n\n const ok = diagnostics.length === 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"validate\",\n ok,\n diagnostics,\n result: { files: fileResults },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n","import yaml from \"js-yaml\";\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type { ValidateResult, SightmapFragment } from \"./sightmap.js\";\nimport {\n PARSE_ERROR,\n SCHEMA_VALIDATION_FAILED,\n UNKNOWN_VERSION,\n type Diagnostic,\n} from \"./diagnostics.js\";\nimport { parse } from \"./parse.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolve, dirname } from \"node:path\";\n\n// Lazily initialized to avoid crashing when this module is bundled into a\n// browser context (fileURLToPath is Node-only). validate() itself is Node-only\n// and should never be called from browser code.\nlet _ajvValidate: ReturnType<InstanceType<typeof Ajv2020>[\"compile\"]> | undefined;\n\nfunction getValidator() {\n if (_ajvValidate) return _ajvValidate;\n // These Node APIs run only on first call to validate(), not at module load.\n const __dirname = dirname(fileURLToPath(import.meta.url));\n // Resolve the vendored schema in two contexts:\n // - Production (published package): bundled file lives at dist/index.js, schema at dist/vendored/.\n // - Dev (vitest, source files): validate.ts lives at src/, schema at ../vendored/.\n const schemaCandidates = [\n resolve(__dirname, \"./vendored/sightmap.schema.json\"),\n resolve(__dirname, \"../vendored/sightmap.schema.json\"),\n ];\n const schemaPath = schemaCandidates.find((p) => existsSync(p));\n if (schemaPath === undefined) {\n throw new Error(\n `vendored sightmap.schema.json not found. Looked in: ${schemaCandidates.join(\", \")}`,\n );\n }\n const schema = JSON.parse(readFileSync(schemaPath, \"utf8\")) as unknown;\n const ajv = new Ajv2020({ allErrors: true, strict: false });\n _ajvValidate = ajv.compile(schema as object);\n return _ajvValidate;\n}\n\nexport interface ValidateOptions {\n sourceFile?: string;\n}\n\nexport function validate(input: string | object, opts: ValidateOptions = {}): ValidateResult {\n const diagnostics: Diagnostic[] = [];\n let doc: unknown;\n\n if (typeof input === \"string\") {\n try {\n doc = yaml.load(input);\n } catch (err) {\n const e = err as { message?: string; mark?: { line?: number; column?: number } };\n diagnostics.push({\n severity: \"error\",\n code: PARSE_ERROR,\n message: e.message ?? \"YAML parse error\",\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n ...(e.mark\n ? { loc: { line: (e.mark.line ?? 0) + 1, column: (e.mark.column ?? 0) + 1 } }\n : {}),\n });\n return { ok: false, diagnostics };\n }\n } else {\n doc = input;\n }\n\n if (doc === null || typeof doc !== \"object\" || Array.isArray(doc)) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: \"Expected document root to be an object\",\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n });\n return { ok: false, diagnostics };\n }\n\n const obj = doc as Record<string, unknown>;\n if (obj[\"version\"] !== 1) {\n diagnostics.push({\n severity: \"error\",\n code: UNKNOWN_VERSION,\n message:\n obj[\"version\"] === undefined\n ? \"Missing required `version` field\"\n : `Unsupported version: ${String(obj[\"version\"])} (expected 1)`,\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n path: \"/version\",\n });\n return { ok: false, diagnostics };\n }\n\n const ajvValidate = getValidator();\n const ok = ajvValidate(obj);\n if (!ok) {\n for (const e of ajvValidate.errors ?? []) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: `${e.instancePath || \"(root)\"} ${e.message ?? \"\"}`.trim(),\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n ...(e.instancePath ? { path: e.instancePath } : {}),\n });\n }\n return { ok: false, diagnostics };\n }\n\n // Schema-valid: now run parse() (which normalizes selectors and brands).\n let value: SightmapFragment;\n try {\n value = parse(obj, opts.sourceFile !== undefined ? { sourceFile: opts.sourceFile } : {});\n } catch (err) {\n diagnostics.push({\n severity: \"error\",\n code: SCHEMA_VALIDATION_FAILED,\n message: err instanceof Error ? err.message : String(err),\n ...(opts.sourceFile !== undefined ? { file: opts.sourceFile } : {}),\n });\n return { ok: false, diagnostics };\n }\n return { ok: true, value };\n}\n","export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n code: string;\n message: string;\n file?: string;\n path?: string;\n loc?: { line: number; column: number };\n source?: string;\n}\n\n// Stable, kebab-case codes. Renames require an SEP.\nexport const PARSE_ERROR = \"parse-error\";\nexport const SCHEMA_VALIDATION_FAILED = \"schema-validation-failed\";\nexport const UNKNOWN_VERSION = \"unknown-version\";\nexport const MERGE_COLLISION_VIEW = \"merge-collision-view\";\nexport const MERGE_COLLISION_COMPONENT = \"merge-collision-component\";\nexport const DUPLICATE_VIEW_NAME = \"duplicate-view-name\";\nexport const DUPLICATE_ROUTE = \"duplicate-route\";\nexport const ROUTE_SHADOWING = \"route-shadowing\";\nexport const UNKNOWN_SOURCE = \"unknown-source\";\nexport const SELECTOR_SYNTAX = \"selector-syntax\";\n\n// fmt CLI diagnostic codes (sightmap/spec docs/authoring-conventions.md#diagnostic-codes-authoring-side).\nexport const FMT_NOT_CANONICAL = \"fmt.not-canonical\";\nexport const FMT_PARSE_ERROR = \"fmt.parse-error\";\nexport const FMT_SCHEMA_INVALID = \"fmt.schema-invalid\";\n\n// Repo-conventions codes (WI-6). See docs/repo-conventions.md in the spec repo.\nexport const CONVENTION_SEP_FILENAME = \"convention.sep-filename\";\nexport const CONVENTION_FIXTURE_DIRNAME = \"convention.fixture-dirname\";\nexport const CONVENTION_INVALID_SLUG = \"convention.invalid-slug\";\nexport const CONVENTION_UNEXPECTED_FILE = \"convention.unexpected-file\";\n","import yaml from \"js-yaml\";\nimport type { SightmapFragment } from \"./sightmap.js\";\nimport type { Component } from \"./types.js\";\n\nexport interface ParseOptions {\n /** Optional source file path; recorded on the fragment for canonical-order merging. */\n sourceFile?: string;\n}\n\n/**\n * Parse a single sightmap file (YAML string or pre-parsed object).\n * Throws on parse error, missing version, or version mismatch.\n * Normalizes `selector: string` to `selector: [string]` everywhere.\n */\nexport function parse(input: string | object, opts: ParseOptions = {}): SightmapFragment {\n let doc: unknown;\n if (typeof input === \"string\") {\n try {\n doc = yaml.load(input);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`YAML parse error: ${msg}`);\n }\n } else {\n // Shallow-clone caller's object so we don't mutate it.\n doc = { ...input };\n }\n\n if (doc === null || typeof doc !== \"object\" || Array.isArray(doc)) {\n throw new Error(\"Expected sightmap document to be an object at the root\");\n }\n\n const obj = doc as Record<string, unknown>;\n if (obj[\"version\"] === undefined) {\n throw new Error(\"Missing required `version` field\");\n }\n if (obj[\"version\"] !== 1) {\n throw new Error(`Unsupported version: ${String(obj[\"version\"])} (expected 1)`);\n }\n\n // Normalize selectors recursively. Spread each view to avoid mutating\n // shared view objects when the caller passed a pre-parsed input.\n if (Array.isArray(obj[\"components\"])) {\n obj[\"components\"] = (obj[\"components\"] as Component[]).map(normalizeComponent);\n }\n if (Array.isArray(obj[\"views\"])) {\n obj[\"views\"] = (obj[\"views\"] as Array<Record<string, unknown>>).map((v) => {\n const out = { ...v };\n if (Array.isArray(out[\"components\"])) {\n out[\"components\"] = (out[\"components\"] as Component[]).map(normalizeComponent);\n }\n return out;\n });\n }\n\n const fragment = {\n ...obj,\n __brand: \"SightmapFragment\" as const,\n ...(opts.sourceFile !== undefined ? { __sourceFile: opts.sourceFile } : {}),\n } as SightmapFragment;\n return fragment;\n}\n\nfunction normalizeComponent(c: Component): Component {\n // Common migration error: `selectors` (plural) instead of `selector` (singular).\n // The schema only accepts singular `selector`; the singular field already takes\n // a string or string-array, so a plural alias would be redundant. Surface\n // explicitly rather than silently dropping the value.\n if ((c as unknown as Record<string, unknown>)[\"selectors\"] !== undefined && c.selector === undefined) {\n const name = (c as { name?: string }).name ?? \"(unnamed)\";\n throw new Error(\n `Component \"${name}\": use \\`selector\\` (singular), not \\`selectors\\` (plural). ` +\n `\\`selector\\` accepts either a single string or an array of strings.`,\n );\n }\n const sel = c.selector;\n const normalized: Component = {\n ...c,\n selector: typeof sel === \"string\" ? [sel] : (sel as [string, ...string[]]),\n };\n if (Array.isArray(c.children)) {\n normalized.children = c.children.map(normalizeComponent);\n }\n return normalized;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\n\nexport async function collectYamlFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n out.push(...(await collectYamlFiles(p)));\n } else if (e.isFile()) {\n const ext = extname(p).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") out.push(p);\n }\n }\n return out;\n}\n","import type { Diagnostic } from \"../diagnostics.js\";\n\nexport type Command = \"validate\" | \"lint\" | \"match\" | \"explain\" | \"check\" | \"check-conventions\" | \"fmt\";\n\nexport interface Envelope<R = unknown> {\n ok: boolean;\n command: Command;\n diagnostics: Diagnostic[];\n result: R;\n}\n\nexport function makeEnvelope<R>(args: {\n command: Command;\n ok: boolean;\n diagnostics: Diagnostic[];\n result: R;\n}): Envelope<R> {\n return {\n ok: args.ok,\n command: args.command,\n diagnostics: [...args.diagnostics],\n result: args.result,\n };\n}\n\nexport function emitJson<R>(env: Envelope<R>): void {\n process.stdout.write(JSON.stringify(env, null, 2) + \"\\n\");\n}\n","import type { Diagnostic } from \"../diagnostics.js\";\nimport type { MatchResult, ExplainResult } from \"../sightmap.js\";\n\nconst SEV_TAG: Record<Diagnostic[\"severity\"], string> = {\n error: \"ERROR\",\n warning: \"warn \",\n info: \"info \",\n};\n\nexport function formatDiagnostics(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"\";\n const lines = diags.map((d) => {\n const where = [d.file, d.path, d.loc ? `${d.loc.line}:${d.loc.column}` : null]\n .filter(Boolean)\n .join(\" \");\n return `${SEV_TAG[d.severity]} ${d.code} ${where}\\n ${d.message}`;\n });\n return lines.join(\"\\n\");\n}\n\nexport function formatValidate(result: { files: { path: string; ok: boolean }[] }, diags: Diagnostic[]): string {\n const fileLines = result.files.map((f) => `${f.ok ? \"ok \" : \"FAIL \"} ${f.path}`).join(\"\\n\");\n const diagLines = formatDiagnostics(diags);\n return [fileLines, \"\", diagLines, \"\", `${result.files.length} file(s) checked.`].filter(Boolean).join(\"\\n\");\n}\n\nexport function formatLint(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"lint: no issues.\";\n return formatDiagnostics(diags);\n}\n\nexport function formatMatch(r: MatchResult): string {\n const lines: string[] = [];\n if (r.view === null) {\n lines.push(\"no view matched.\");\n } else {\n lines.push(`view ${r.view.name} (route ${r.view.route})`);\n if (r.view.source !== undefined) lines.push(` source ${r.view.source}`);\n }\n for (const c of r.components) {\n const chain = c.parentChain.length > 0 ? ` (in ${c.parentChain.join(\" > \")})` : \"\";\n lines.push(`comp ${c.name}${chain} ${c.scope} selector=${c.selector.join(\" | \")}`);\n }\n for (const q of r.requests) {\n lines.push(`req ${q.name} ${q.method ?? \"ANY\"} ${q.route}`);\n }\n if (r.memory.length > 0) {\n lines.push(\"\");\n lines.push(\"[Guide]\");\n for (const m of r.memory) lines.push(` - ${m}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatCheckConventions(diags: Diagnostic[]): string {\n if (diags.length === 0) return \"check-conventions: ok\";\n return formatDiagnostics(diags) + `\\n\\n${diags.length} convention violation(s).`;\n}\n\nexport function formatExplain(r: ExplainResult): string {\n if (r.hits.length === 0) return `no hits for \"${r.query}\".`;\n const lines = [`${r.hits.length} hit(s) for \"${r.query}\":`];\n for (const h of r.hits) {\n const e = h.entry as { name?: string; source?: string };\n lines.push(` ${h.type} ${e.name ?? \"?\"} matchedAs=${h.matchedAs}${e.source !== undefined ? ` src=${e.source}` : \"\"}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport interface FmtFileLine {\n path: string;\n status: \"ok\" | \"not-canonical\" | \"rewritten\" | \"error\";\n}\n\nexport function formatFmtCheck(lines: FmtFileLine[]): string {\n const body = lines\n .map((l) => {\n switch (l.status) {\n case \"ok\": return `${l.path}: ok`;\n case \"not-canonical\": return `${l.path}: not canonical (run \\`sightmap fmt --write\\` to fix)`;\n case \"error\": return `${l.path}: error`;\n case \"rewritten\": return `${l.path}: rewritten`; // shouldn't appear in --check\n }\n })\n .join(\"\\n\");\n const need = lines.filter((l) => l.status === \"not-canonical\").length;\n const total = lines.length;\n const summary =\n total === 0\n ? `No YAML files found.`\n : need === 0\n ? `\\n\\nAll ${total} file(s) canonical.`\n : `\\n\\n${need} of ${total} file(s) need formatting.`;\n return body + summary;\n}\n\nexport function formatFmtWrite(lines: FmtFileLine[]): string {\n const body = lines\n .map((l) => {\n switch (l.status) {\n case \"ok\": return `${l.path}: ok`;\n case \"rewritten\": return `${l.path}: rewritten`;\n case \"error\": return `${l.path}: error`;\n case \"not-canonical\": return `${l.path}: not canonical`; // shouldn't appear in --write\n }\n })\n .join(\"\\n\");\n const rewritten = lines.filter((l) => l.status === \"rewritten\").length;\n const summary =\n lines.length === 0 ? `No YAML files found.` : `\\n\\n${rewritten} file(s) rewritten.`;\n return body + summary;\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { lint } from \"../lint.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatLint } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport interface RunLintOptions {\n path: string;\n cwd: string;\n json: boolean;\n strict: boolean;\n rules?: string;\n}\n\nexport async function runLint(opts: RunLintOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n\n const ruleConfig = parseRules(opts.rules);\n const lintDiags = await lint(sightmap, {\n ...(ruleConfig !== undefined ? { rules: ruleConfig } : {}),\n root: opts.cwd,\n });\n\n const all: Diagnostic[] = [...sightmap.diagnostics, ...lintDiags];\n const hasError = all.some((d) => d.severity === \"error\");\n const hasWarning = all.some((d) => d.severity === \"warning\");\n\n let code = 0;\n if (hasError) code = 1;\n else if (opts.strict && hasWarning) code = 1;\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"lint\",\n ok: code === 0,\n diagnostics: all,\n result: {},\n }),\n );\n } else {\n process.stdout.write(formatLint(all) + \"\\n\");\n }\n return code;\n}\n\nfunction parseRules(spec: string | undefined): Record<string, boolean> | undefined {\n if (spec === undefined) return undefined;\n const out: Record<string, boolean> = {};\n for (const tok of spec.split(\",\").map((s) => s.trim()).filter(Boolean)) {\n if (tok.startsWith(\"-\")) out[tok.slice(1)] = false;\n else out[tok] = true;\n }\n return out;\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative, resolve } from \"node:path\";\nimport { merge } from \"./merge.js\";\nimport { validate } from \"./validate.js\";\nimport type { Sightmap, SightmapFragment } from \"./sightmap.js\";\nimport type { Diagnostic } from \"./diagnostics.js\";\n\nexport interface LoadDirectoryOptions {\n /** Optional root for `file` fields in diagnostics. Default: the directory passed in. */\n diagnosticRoot?: string;\n}\n\n/**\n * Recursively load all *.yaml/*.yml files under `dir`, validate each, and merge.\n *\n * Files that fail validation contribute their diagnostics to the merged Sightmap's\n * `diagnostics` array but are otherwise skipped. This keeps loadDirectory total —\n * a single bad file doesn't abort the whole load.\n */\nexport async function loadDirectory(\n dir: string,\n opts: LoadDirectoryOptions = {},\n): Promise<Sightmap> {\n const absDir = resolve(dir);\n const root = opts.diagnosticRoot !== undefined ? resolve(opts.diagnosticRoot) : absDir;\n\n const files = await collectYamlFiles(absDir);\n files.sort(); // alphabetical canonical order\n\n const fragments: SightmapFragment[] = [];\n const loadDiagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(root, file);\n const text = await readFile(file, \"utf8\");\n const r = validate(text, { sourceFile: relPath });\n if (r.ok) {\n fragments.push(r.value);\n } else {\n loadDiagnostics.push(...r.diagnostics);\n }\n }\n\n const merged = merge(fragments);\n return {\n ...merged,\n diagnostics: [...loadDiagnostics, ...merged.diagnostics],\n };\n}\n\nasync function collectYamlFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n out.push(...(await collectYamlFiles(p)));\n } else if (e.isFile()) {\n const ext = extname(p).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") out.push(p);\n }\n }\n return out;\n}\n","import type { SightmapFragment, Sightmap } from \"./sightmap.js\";\nimport type { View, Component, Request } from \"./types.js\";\nimport {\n MERGE_COLLISION_VIEW,\n MERGE_COLLISION_COMPONENT,\n type Diagnostic,\n} from \"./diagnostics.js\";\n\n/**\n * Merge fragments into a queryable Sightmap.\n *\n * Canonical order: fragments are sorted by `__sourceFile` (code-point order; locale-independent\n * for cross-environment determinism). Fragments without a `__sourceFile` sort first, and ES2019\n * sort stability preserves their input order. Within each fragment, declaration order is\n * preserved. The merged collection's order = (sourceFile order, then declaration order).\n *\n * Duplicate view names produce `merge-collision-view` warnings; duplicate global component\n * names produce `merge-collision-component`. The first occurrence wins.\n *\n * Returned arrays are fresh, but element objects (View/Component/Request) are shared with\n * the input fragments — callers must not mutate them.\n */\nexport function merge(fragments: SightmapFragment[]): Sightmap {\n const sorted = [...fragments].sort((a, b) => {\n const aFile = a.__sourceFile ?? \"\";\n const bFile = b.__sourceFile ?? \"\";\n return aFile < bFile ? -1 : aFile > bFile ? 1 : 0;\n });\n\n const views: View[] = [];\n const globalComponents: Component[] = [];\n const globalRequests: Request[] = [];\n const fileMemory: { memory: string[]; sourceFile: string }[] = [];\n const diagnostics: Diagnostic[] = [];\n\n const seenViewNames = new Map<string, string>(); // name → sourceFile\n const seenComponentNames = new Map<string, string>();\n\n for (const f of sorted) {\n const file = f.__sourceFile ?? \"<unknown>\";\n\n for (const v of f.views ?? []) {\n const prev = seenViewNames.get(v.name);\n if (prev !== undefined) {\n diagnostics.push({\n severity: \"warning\",\n code: MERGE_COLLISION_VIEW,\n message: `View name \"${v.name}\" defined in both \"${prev}\" and \"${file}\"; first occurrence wins.`,\n file,\n });\n } else {\n seenViewNames.set(v.name, file);\n }\n views.push(v); // keep all views; first-match-wins is enforced at resolve time\n }\n\n for (const c of f.components ?? []) {\n const prev = seenComponentNames.get(c.name);\n if (prev !== undefined) {\n diagnostics.push({\n severity: \"warning\",\n code: MERGE_COLLISION_COMPONENT,\n message: `Component name \"${c.name}\" defined in both \"${prev}\" and \"${file}\"; first occurrence wins.`,\n file,\n });\n } else {\n seenComponentNames.set(c.name, file);\n }\n globalComponents.push(c);\n }\n\n for (const r of f.requests ?? []) {\n globalRequests.push(r);\n }\n\n if (Array.isArray(f.memory) && f.memory.length > 0) {\n fileMemory.push({ memory: [...f.memory], sourceFile: file });\n }\n }\n\n return {\n version: 1,\n views,\n globalComponents,\n globalRequests,\n fileMemory,\n diagnostics,\n __brand: \"Sightmap\",\n };\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { DUPLICATE_VIEW_NAME, type Diagnostic } from \"../diagnostics.js\";\n\nexport function duplicateName(sightmap: Sightmap): Diagnostic[] {\n const seen = new Map<string, number>();\n const out: Diagnostic[] = [];\n sightmap.views.forEach((v) => {\n const count = (seen.get(v.name) ?? 0) + 1;\n seen.set(v.name, count);\n if (count > 1) {\n out.push({\n severity: \"warning\",\n code: DUPLICATE_VIEW_NAME,\n message: `Duplicate view name \"${v.name}\" (occurrence ${count}).`,\n });\n }\n });\n return out;\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { DUPLICATE_ROUTE, type Diagnostic } from \"../diagnostics.js\";\n\nexport function duplicateRoute(sightmap: Sightmap): Diagnostic[] {\n const seen = new Map<string, string>(); // route → first-view-name\n const out: Diagnostic[] = [];\n for (const v of sightmap.views) {\n const prev = seen.get(v.route);\n if (prev !== undefined) {\n out.push({\n severity: \"warning\",\n code: DUPLICATE_ROUTE,\n message: `Route \"${v.route}\" is defined by both \"${prev}\" and \"${v.name}\". Only \"${prev}\" will match.`,\n });\n } else {\n seen.set(v.route, v.name);\n }\n }\n return out;\n}\n","import type { Sightmap } from \"../sightmap.js\";\nimport { ROUTE_SHADOWING, type Diagnostic } from \"../diagnostics.js\";\n\n/**\n * Detect routes made unreachable under React Router 7 specificity rules.\n *\n * React Router picks the most specific matching route, not the\n * first-declared. So a wildcard like `/*` does not shadow a more specific\n * route like `/login`, regardless of file/declaration order. A route B is\n * truly shadowed by an earlier route A only when:\n *\n * 1. A and B match the exact same set of URLs (same shape; `*` and `:param`\n * are treated as equivalent placeholders here, since both match a single\n * arbitrary segment), AND\n * 2. A is at least as specific as B at every position. Per-segment\n * specificity: literal > `:param` > `*` > `**`. When scores tie, the\n * earlier-declared route wins React Router's tie-break.\n */\nexport function routeShadowing(sightmap: Sightmap): Diagnostic[] {\n const out: Diagnostic[] = [];\n const views = sightmap.views;\n for (let j = 1; j < views.length; j++) {\n const later = views[j]!;\n const laterKey = matchSetKey(later.route);\n const laterScore = specificity(later.route);\n for (let i = 0; i < j; i++) {\n const earlier = views[i]!;\n if (earlier.route === later.route) continue; // duplicate-route covers this\n if (matchSetKey(earlier.route) !== laterKey) continue;\n if (specificity(earlier.route) < laterScore) continue;\n out.push({\n severity: \"warning\",\n code: ROUTE_SHADOWING,\n message: `Route \"${later.route}\" (view \"${later.name}\") is shadowed by earlier route \"${earlier.route}\" (view \"${earlier.name}\"); they match the same URLs and the earlier route is at least as specific, making this route unreachable.`,\n });\n break; // only report the first shadower\n }\n }\n return out;\n}\n\n/**\n * Canonical \"match-set\" key for a pattern: literal segments are kept; `:param`\n * is normalized to `*` (both match exactly one arbitrary segment); `**` is\n * preserved (variable-depth). Two patterns with the same key match the same\n * set of URLs under the spec's matching rules.\n */\nfunction matchSetKey(route: string): string {\n return route\n .split(\"/\")\n .map((seg) => (seg.startsWith(\":\") ? \"*\" : seg))\n .join(\"/\");\n}\n\n/**\n * Specificity score for a pattern (higher = more specific). Static literals\n * outrank params, params outrank single-segment wildcards, and `**` is the\n * least specific.\n */\nfunction specificity(route: string): number {\n let total = 0;\n for (const seg of route.split(\"/\")) {\n if (seg === \"\" || seg === \"**\") continue;\n if (seg === \"*\") total += 1;\n else if (seg.startsWith(\":\")) total += 2;\n else total += 3;\n }\n return total;\n}\n","import { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Sightmap } from \"../sightmap.js\";\nimport type { Component } from \"../types.js\";\nimport { UNKNOWN_SOURCE, type Diagnostic } from \"../diagnostics.js\";\n\nexport interface UnknownSourceOptions {\n /** Filesystem root for resolving `source:` paths. Defaults to process.cwd(). */\n root?: string;\n}\n\nexport async function unknownSource(\n sightmap: Sightmap,\n opts: UnknownSourceOptions = {},\n): Promise<Diagnostic[]> {\n const root = opts.root ?? process.cwd();\n const out: Diagnostic[] = [];\n const seen = new Set<string>();\n\n const check = async (source: string | undefined, label: string): Promise<void> => {\n if (source === undefined) return;\n if (seen.has(source)) return;\n seen.add(source);\n try {\n await stat(resolve(root, source));\n } catch {\n out.push({\n severity: \"warning\",\n code: UNKNOWN_SOURCE,\n message: `${label}: source path \"${source}\" does not exist on disk (relative to ${root}).`,\n });\n }\n };\n\n for (const v of sightmap.views) {\n await check(v.source, `view \"${v.name}\"`);\n for (const c of v.components ?? []) {\n await walkComponent(c, `component \"${c.name}\"`, check);\n }\n }\n for (const c of sightmap.globalComponents) {\n await walkComponent(c, `component \"${c.name}\"`, check);\n }\n for (const r of sightmap.globalRequests) {\n await check(r.source, `request \"${r.name}\"`);\n }\n\n return out;\n}\n\nasync function walkComponent(\n c: Component,\n label: string,\n check: (source: string | undefined, label: string) => Promise<void>,\n): Promise<void> {\n await check(c.source, label);\n for (const child of c.children ?? []) {\n await walkComponent(child, `component \"${child.name}\"`, check);\n }\n}\n","import { parse as parseSelector } from \"css-what\";\nimport type { Sightmap } from \"../sightmap.js\";\nimport type { Component } from \"../types.js\";\nimport { SELECTOR_SYNTAX, type Diagnostic } from \"../diagnostics.js\";\n\nexport function selectorSyntax(sightmap: Sightmap): Diagnostic[] {\n const out: Diagnostic[] = [];\n const visit = (c: Component, scope: string): void => {\n const selectors: string[] = Array.isArray(c.selector)\n ? c.selector\n : [c.selector as unknown as string];\n selectors.forEach((sel, i) => {\n try {\n parseSelector(sel);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n out.push({\n severity: \"warning\",\n code: SELECTOR_SYNTAX,\n message: `${scope}: selector at index ${i} (\"${sel}\") failed to parse: ${msg}`,\n });\n }\n });\n for (const child of c.children ?? []) visit(child, `component \"${child.name}\"`);\n };\n\n for (const c of sightmap.globalComponents) visit(c, `component \"${c.name}\"`);\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) visit(c, `component \"${c.name}\"`);\n }\n return out;\n}\n","import type { Sightmap } from \"./sightmap.js\";\nimport type { Diagnostic } from \"./diagnostics.js\";\nimport { duplicateName } from \"./lintRules/duplicateName.js\";\nimport { duplicateRoute } from \"./lintRules/duplicateRoute.js\";\nimport { routeShadowing } from \"./lintRules/routeShadowing.js\";\nimport { unknownSource } from \"./lintRules/unknownSource.js\";\nimport { selectorSyntax } from \"./lintRules/selectorSyntax.js\";\n\nexport interface LintOptions {\n /** Per-rule enable/disable. Default: all rules enabled. */\n rules?: Record<string, boolean>;\n /** Filesystem root for `unknown-source`. Defaults to process.cwd(). */\n root?: string;\n}\n\nexport async function lint(sightmap: Sightmap, opts: LintOptions = {}): Promise<Diagnostic[]> {\n const enabled = (code: string): boolean => opts.rules?.[code] !== false;\n const out: Diagnostic[] = [];\n if (enabled(\"duplicate-view-name\")) out.push(...duplicateName(sightmap));\n if (enabled(\"duplicate-route\")) out.push(...duplicateRoute(sightmap));\n if (enabled(\"route-shadowing\")) out.push(...routeShadowing(sightmap));\n if (enabled(\"selector-syntax\")) out.push(...selectorSyntax(sightmap));\n if (enabled(\"unknown-source\")) {\n out.push(...(await unknownSource(sightmap, opts.root !== undefined ? { root: opts.root } : {})));\n }\n return out;\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { match } from \"../match.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatMatch } from \"./humanFormat.js\";\n\nexport interface RunMatchOptions {\n url: string;\n path: string;\n cwd: string;\n json: boolean;\n method?: string;\n requireView: boolean;\n}\n\nexport async function runMatch(opts: RunMatchOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n const result = match(sightmap, {\n url: opts.url,\n ...(opts.method !== undefined ? { method: opts.method } : {}),\n });\n\n const code = opts.requireView && result.view === null ? 1 : 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"match\",\n ok: code === 0,\n diagnostics: [...sightmap.diagnostics],\n result,\n }),\n );\n } else {\n process.stdout.write(formatMatch(result) + \"\\n\");\n }\n return code;\n}\n","/**\n * Canonicalize a URL or pathname for matching.\n * - Accepts absolute URL or pathname.\n * - Strips scheme, host, query string, and fragment.\n * - Normalizes trailing slashes (except for the root \"/\").\n */\nexport function canonicalizeUrl(input: string): string {\n let s = input;\n // Strip absolute prefix.\n const protoMatch = /^[a-z][a-z0-9+.-]*:\\/\\/[^/]*/i.exec(s);\n if (protoMatch) {\n s = s.slice(protoMatch[0].length) || \"/\";\n }\n // Strip fragment.\n const hash = s.indexOf(\"#\");\n if (hash !== -1) s = s.slice(0, hash);\n // Strip query.\n const q = s.indexOf(\"?\");\n if (q !== -1) s = s.slice(0, q);\n // Trailing slash.\n if (s.length > 1 && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\n/**\n * Test whether a glob route pattern matches a URL pathname.\n * Pattern syntax (per spec):\n * - Literal segments match themselves\n * - \"*\" matches exactly one path segment\n * - \"**\" matches any depth of segments\n * - \":param\" segments normalize to \"*\"\n * - Matching is case-sensitive\n * - Trailing slashes ignored\n */\nexport function routeMatch(pattern: string, url: string): boolean {\n const p = normalizePattern(pattern);\n const u = canonicalizeUrl(url);\n const patternSegs = splitSegments(p);\n const urlSegs = splitSegments(u);\n return matchSegs(patternSegs, urlSegs);\n}\n\nfunction normalizePattern(p: string): string {\n // Replace \":param\" segments with \"*\"\n let s = p\n .split(\"/\")\n .map((seg) => (seg.startsWith(\":\") ? \"*\" : seg))\n .join(\"/\");\n if (s.length > 1 && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\nfunction splitSegments(path: string): string[] {\n if (path === \"/\" || path === \"\") return [];\n const trimmed = path.startsWith(\"/\") ? path.slice(1) : path;\n return trimmed.split(\"/\");\n}\n\nfunction matchSegs(pattern: string[], url: string[]): boolean {\n if (pattern.length === 0 && url.length === 0) return true;\n if (pattern.length === 0) return false;\n\n const head = pattern[0]!;\n const rest = pattern.slice(1);\n\n if (head === \"**\") {\n // Match zero or more segments.\n if (rest.length === 0) return true;\n for (let i = 0; i <= url.length; i++) {\n if (matchSegs(rest, url.slice(i))) return true;\n }\n return false;\n }\n\n if (url.length === 0) return false;\n if (head === \"*\" || head === url[0]) {\n return matchSegs(rest, url.slice(1));\n }\n return false;\n}\n","import type {\n Sightmap,\n MatchResult,\n ExplainHit,\n ResolvedView,\n ResolvedComponent,\n ResolvedRequest,\n} from \"./sightmap.js\";\nimport type { View, Component, Request } from \"./types.js\";\nimport { routeMatch } from \"./routeMatch.js\";\n\nexport function resolveByUrl(\n sightmap: Sightmap,\n url: string,\n method?: string,\n): MatchResult {\n // First-match-wins on views.\n let matchedView: View | null = null;\n for (const v of sightmap.views) {\n if (routeMatch(v.route, url)) {\n matchedView = v;\n break;\n }\n }\n\n const components: ResolvedComponent[] = [];\n for (const c of sightmap.globalComponents) {\n components.push(...flattenComponent(c, [], \"global\", undefined));\n }\n if (matchedView !== null && Array.isArray(matchedView.components)) {\n for (const c of matchedView.components) {\n components.push(...flattenComponent(c, [], \"view-scoped\", matchedView.name));\n }\n }\n\n const requests: ResolvedRequest[] = [];\n const requestPool: Request[] = [\n ...sightmap.globalRequests,\n ...((matchedView?.requests ?? [])),\n ];\n for (const req of requestPool) {\n if (!routeMatch(req.route, url)) continue;\n if (method !== undefined && req.method !== undefined && req.method !== method) continue;\n requests.push(toResolvedRequest(req));\n }\n\n const memory: string[] = [];\n for (const fm of sightmap.fileMemory) memory.push(...fm.memory);\n if (matchedView?.memory) memory.push(...matchedView.memory);\n\n return {\n view: matchedView !== null ? toResolvedView(matchedView) : null,\n components,\n requests,\n memory,\n };\n}\n\nexport function resolveByName(sightmap: Sightmap, name: string): ExplainHit[] {\n const hits: ExplainHit[] = [];\n for (const v of sightmap.views) {\n if (v.name === name) hits.push({ type: \"view\", matchedAs: \"name\", entry: toResolvedView(v) });\n }\n for (const c of sightmap.globalComponents) {\n for (const rc of flattenComponent(c, [], \"global\", undefined)) {\n if (rc.name === name) hits.push({ type: \"component\", matchedAs: \"name\", entry: rc });\n }\n }\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) {\n for (const rc of flattenComponent(c, [], \"view-scoped\", v.name)) {\n if (rc.name === name) hits.push({ type: \"component\", matchedAs: \"name\", entry: rc });\n }\n }\n }\n for (const r of sightmap.globalRequests) {\n if (r.name === name) hits.push({ type: \"request\", matchedAs: \"name\", entry: toResolvedRequest(r) });\n }\n for (const v of sightmap.views) {\n for (const r of v.requests ?? []) {\n if (r.name === name) hits.push({ type: \"request\", matchedAs: \"name\", entry: toResolvedRequest(r) });\n }\n }\n return hits;\n}\n\nexport function resolveBySourcePath(sightmap: Sightmap, path: string): ExplainHit[] {\n const hits: ExplainHit[] = [];\n for (const v of sightmap.views) {\n if (v.source === path) hits.push({ type: \"view\", matchedAs: \"path\", entry: toResolvedView(v) });\n }\n for (const c of sightmap.globalComponents) {\n for (const rc of flattenComponent(c, [], \"global\", undefined)) {\n if (rc.source === path) hits.push({ type: \"component\", matchedAs: \"path\", entry: rc });\n }\n }\n for (const v of sightmap.views) {\n for (const c of v.components ?? []) {\n for (const rc of flattenComponent(c, [], \"view-scoped\", v.name)) {\n if (rc.source === path) hits.push({ type: \"component\", matchedAs: \"path\", entry: rc });\n }\n }\n }\n for (const r of sightmap.globalRequests) {\n if (r.source === path) hits.push({ type: \"request\", matchedAs: \"path\", entry: toResolvedRequest(r) });\n }\n return hits;\n}\n\nfunction flattenComponent(\n c: Component,\n parentChain: string[],\n scope: \"global\" | \"view-scoped\",\n scopedToView: string | undefined,\n): ResolvedComponent[] {\n const out: ResolvedComponent[] = [];\n const selector = Array.isArray(c.selector) ? c.selector : [c.selector as unknown as string];\n out.push({\n name: c.name,\n selector,\n ...(c.source !== undefined ? { source: c.source } : {}),\n ...(c.description !== undefined ? { description: c.description } : {}),\n memory: c.memory ? [...c.memory] : [],\n parentChain: [...parentChain],\n scope,\n ...(scopedToView !== undefined ? { scopedToView } : {}),\n definedIn: { file: \"<unknown>\" },\n });\n for (const child of c.children ?? []) {\n out.push(...flattenComponent(child, [...parentChain, c.name], scope, scopedToView));\n }\n return out;\n}\n\nfunction toResolvedView(v: View): ResolvedView {\n return {\n name: v.name,\n route: v.route,\n ...(v.source !== undefined ? { source: v.source } : {}),\n ...(v.description !== undefined ? { description: v.description } : {}),\n memory: v.memory ? [...v.memory] : [],\n definedIn: { file: \"<unknown>\" },\n };\n}\n\nfunction toResolvedRequest(r: Request): ResolvedRequest {\n return {\n name: r.name,\n route: r.route,\n ...(r.method !== undefined ? { method: r.method } : {}),\n ...(r.source !== undefined ? { source: r.source } : {}),\n ...(r.description !== undefined ? { description: r.description } : {}),\n ...(r.request !== undefined ? { request: { fields: r.request.fields ?? [] } } : {}),\n ...(r.response !== undefined ? { response: { fields: r.response.fields ?? [] } } : {}),\n ...(r.headers !== undefined ? { headers: r.headers } : {}),\n memory: r.memory ? [...r.memory] : [],\n definedIn: { file: \"<unknown>\" },\n };\n}\n","import type { Sightmap, MatchResult } from \"./sightmap.js\";\nimport { resolveByUrl } from \"./resolver.js\";\n\nexport interface MatchOptions {\n url: string;\n method?: string;\n}\n\nexport function match(sightmap: Sightmap, opts: MatchOptions): MatchResult {\n return resolveByUrl(sightmap, opts.url, opts.method);\n}\n","import { resolve } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { explain } from \"../explain.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatExplain } from \"./humanFormat.js\";\n\nexport interface RunExplainOptions {\n query: string;\n path: string;\n cwd: string;\n json: boolean;\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n requireHit: boolean;\n}\n\nexport async function runExplain(opts: RunExplainOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n const result = explain(sightmap, opts.query, {\n ...(opts.by !== undefined ? { by: opts.by } : {}),\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n });\n\n const code = opts.requireHit && result.hits.length === 0 ? 1 : 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"explain\",\n ok: code === 0,\n diagnostics: [...sightmap.diagnostics],\n result,\n }),\n );\n } else {\n process.stdout.write(formatExplain(result) + \"\\n\");\n }\n return code;\n}\n","import type { Sightmap, ExplainResult, ExplainHit, ExplainMatchedAs } from \"./sightmap.js\";\nimport { resolveByName, resolveBySourcePath } from \"./resolver.js\";\n\nexport interface ExplainOptions {\n by?: \"name\" | \"path\";\n type?: \"view\" | \"component\" | \"request\";\n}\n\nexport function explain(\n sightmap: Sightmap,\n query: string,\n opts: ExplainOptions = {},\n): ExplainResult {\n const byName = opts.by === \"path\" ? [] : resolveByName(sightmap, query);\n const byPath = opts.by === \"name\" ? [] : resolveBySourcePath(sightmap, query);\n\n // Merge: when an entry appears in both lookups, label as \"name-and-path\".\n // Use entry identity (type + name) as the dedup key.\n const key = (h: ExplainHit): string => `${h.type}:${h.entry.name}`;\n const namedKeys = new Set(byName.map(key));\n const pathKeys = new Set(byPath.map(key));\n\n const merged: ExplainHit[] = [];\n for (const h of byName) {\n if (pathKeys.has(key(h))) {\n merged.push(withMatchedAs(h, \"name-and-path\"));\n } else {\n merged.push(h);\n }\n }\n for (const h of byPath) {\n if (!namedKeys.has(key(h))) {\n merged.push(h);\n }\n // (entries already in both have been pushed above with \"name-and-path\".)\n }\n\n const filtered =\n opts.type !== undefined ? merged.filter((h) => h.type === opts.type) : merged;\n return { query, hits: filtered };\n}\n\nfunction withMatchedAs(h: ExplainHit, matchedAs: ExplainMatchedAs): ExplainHit {\n switch (h.type) {\n case \"view\":\n return { type: \"view\", matchedAs, entry: h.entry };\n case \"component\":\n return { type: \"component\", matchedAs, entry: h.entry };\n case \"request\":\n return { type: \"request\", matchedAs, entry: h.entry };\n }\n}\n","import { resolve, relative } from \"node:path\";\nimport { loadDirectory } from \"../loadDirectory.js\";\nimport { lint } from \"../lint.js\";\nimport { validate } from \"../validate.js\";\nimport { merge } from \"../merge.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatValidate } from \"./humanFormat.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\n\nexport type CheckLevel = \"schema\" | \"quality\";\n\nexport interface RunCheckOptions {\n path: string;\n cwd: string;\n level: CheckLevel;\n json: boolean;\n}\n\nexport async function runCheck(opts: RunCheckOptions): Promise<number> {\n const dir = resolve(opts.cwd, opts.path);\n const files = (await collectYamlFiles(dir)).sort();\n const sightmap = await loadDirectory(dir, { diagnosticRoot: opts.cwd });\n\n const diagnostics: Diagnostic[] = [...sightmap.diagnostics];\n if (opts.level === \"quality\") {\n const lintDiags = await lint(sightmap, { root: opts.cwd });\n diagnostics.push(...lintDiags);\n }\n\n const flagged = new Set(\n diagnostics.filter((d) => d.file !== undefined).map((d) => d.file!),\n );\n const fileResults = files.map((file) => {\n const relPath = relative(opts.cwd, file);\n return { path: relPath, ok: !flagged.has(relPath) };\n });\n\n const ok = diagnostics.length === 0;\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check\",\n ok,\n diagnostics,\n result: {\n files: fileResults,\n level: opts.level,\n views: sightmap.views.length,\n },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n\nexport interface RunCheckStdinOptions {\n level: CheckLevel;\n json: boolean;\n /** Override stdin for tests; defaults to process.stdin. */\n input?: string;\n}\n\nasync function readAllStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport async function runCheckFromStdin(opts: RunCheckStdinOptions): Promise<number> {\n const text = opts.input ?? (await readAllStdin());\n const sourceFile = \"<stdin>\";\n const diagnostics: Diagnostic[] = [];\n\n const validation = validate(text, { sourceFile });\n let viewCount = 0;\n if (!validation.ok) {\n diagnostics.push(...validation.diagnostics);\n } else {\n const sightmap = merge([validation.value]);\n viewCount = sightmap.views.length;\n if (opts.level === \"quality\") {\n diagnostics.push(...sightmap.diagnostics);\n const lintDiags = await lint(sightmap);\n diagnostics.push(...lintDiags);\n }\n }\n\n const ok = diagnostics.length === 0;\n const fileResults = [{ path: sourceFile, ok }];\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check\",\n ok,\n diagnostics,\n result: { files: fileResults, level: opts.level, views: viewCount },\n }),\n );\n } else {\n process.stdout.write(formatValidate({ files: fileResults }, diagnostics) + \"\\n\");\n }\n return ok ? 0 : 1;\n}\n","import { resolve } from \"node:path\";\nimport { checkConventions } from \"../conventions/index.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { formatCheckConventions } from \"./humanFormat.js\";\n\nexport interface RunCheckConventionsOptions {\n path: string;\n cwd: string;\n json: boolean;\n}\n\nexport async function runCheckConventions(opts: RunCheckConventionsOptions): Promise<number> {\n const root = resolve(opts.cwd, opts.path);\n const result = await checkConventions({ root });\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"check-conventions\",\n ok: result.ok,\n diagnostics: result.diagnostics,\n result: { root },\n }),\n );\n } else {\n process.stdout.write(formatCheckConventions(result.diagnostics) + \"\\n\");\n }\n\n return result.ok ? 0 : 1;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { Diagnostic } from \"../diagnostics.js\";\nimport { checkSepFilename, checkFixtureDirname } from \"./rules.js\";\n\nexport interface CheckConventionsOptions {\n root: string;\n}\n\nexport interface CheckConventionsResult {\n ok: boolean;\n diagnostics: Diagnostic[];\n}\n\nconst IGNORED_LEAF_NAMES = new Set([\"README.md\", \".gitkeep\", \".DS_Store\"]);\n\nexport async function walkRepo(opts: CheckConventionsOptions): Promise<CheckConventionsResult> {\n const diagnostics: Diagnostic[] = [];\n const root = opts.root;\n\n // SEPs: every .md file directly under seps/, except IGNORED_LEAF_NAMES.\n const sepsDir = join(root, \"seps\");\n if (existsSync(sepsDir)) {\n const entries = await readdir(sepsDir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isFile()) continue;\n if (IGNORED_LEAF_NAMES.has(e.name)) continue;\n if (!e.name.endsWith(\".md\")) continue;\n const rel = relative(root, join(sepsDir, e.name));\n const r = checkSepFilename(rel);\n if (!r.ok && r.diagnostics) diagnostics.push(...r.diagnostics);\n }\n }\n\n // Conformance fixtures: every directory directly under conformance/.\n const confDir = join(root, \"conformance\");\n if (existsSync(confDir)) {\n const entries = await readdir(confDir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (IGNORED_LEAF_NAMES.has(e.name)) continue;\n const rel = relative(root, join(confDir, e.name));\n const r = checkFixtureDirname(rel);\n if (!r.ok && r.diagnostics) diagnostics.push(...r.diagnostics);\n }\n }\n\n return { ok: diagnostics.length === 0, diagnostics };\n}\n","export const SLUG_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\nexport function isValidSlug(s: string): boolean {\n return SLUG_REGEX.test(s);\n}\n","import {\n CONVENTION_SEP_FILENAME,\n CONVENTION_FIXTURE_DIRNAME,\n} from \"../diagnostics.js\";\nimport type { Diagnostic } from \"../diagnostics.js\";\nimport { isValidSlug } from \"./slug.js\";\n\nexport interface ConventionRuleResult {\n ok: boolean;\n diagnostics?: Diagnostic[];\n}\n\nconst SEP_FILE_RE = /^seps\\/(\\d{4})-(.+)\\.md$/;\nconst FIXTURE_DIR_RE = /^conformance\\/(\\d{3})-(.+)\\.fixture$/;\n\nexport function checkSepFilename(relPath: string): ConventionRuleResult {\n const m = relPath.match(SEP_FILE_RE);\n if (!m) {\n return mkFail(\n CONVENTION_SEP_FILENAME,\n relPath,\n `SEP filename must match seps/NNNN-{slug}.md (got \"${relPath}\")`,\n );\n }\n const slug = m[2]!;\n if (!isValidSlug(slug)) {\n return mkFail(\n CONVENTION_SEP_FILENAME,\n relPath,\n `SEP slug \"${slug}\" violates ^[a-z0-9]+(-[a-z0-9]+)*$`,\n );\n }\n return { ok: true };\n}\n\nexport function checkFixtureDirname(relPath: string): ConventionRuleResult {\n const m = relPath.match(FIXTURE_DIR_RE);\n if (!m) {\n if (relPath.startsWith(\"conformance/\") && !relPath.endsWith(\".fixture\")) {\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture directory must match conformance/NNN-{slug}.fixture/ (got \"${relPath}\"); did you forget the .fixture suffix?`,\n );\n }\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture directory must match conformance/NNN-{slug}.fixture/ (got \"${relPath}\")`,\n );\n }\n const slug = m[2]!;\n if (!isValidSlug(slug)) {\n return mkFail(\n CONVENTION_FIXTURE_DIRNAME,\n relPath,\n `fixture slug \"${slug}\" violates ^[a-z0-9]+(-[a-z0-9]+)*$`,\n );\n }\n return { ok: true };\n}\n\nfunction mkFail(code: string, file: string, message: string): ConventionRuleResult {\n return {\n ok: false,\n diagnostics: [\n {\n severity: \"error\",\n code,\n message,\n file,\n },\n ],\n };\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { canonicalize } from \"../format/canonicalize.js\";\nimport { collectYamlFiles } from \"./_fsHelpers.js\";\nimport { makeEnvelope, emitJson } from \"./envelope.js\";\nimport { FMT_NOT_CANONICAL, type Diagnostic } from \"../diagnostics.js\";\nimport { formatFmtCheck, formatFmtWrite, type FmtFileLine } from \"./humanFormat.js\";\n\nexport interface RunFmtOptions {\n path: string;\n cwd: string;\n check: boolean;\n write: boolean;\n json: boolean;\n}\n\ninterface FmtFileResult {\n path: string;\n matchesExpected?: boolean;\n changed?: boolean;\n}\n\nexport async function runFmt(opts: RunFmtOptions): Promise<number> {\n const target = resolve(opts.cwd, opts.path);\n const files = (await resolveTarget(target)).sort();\n\n const fileResults: FmtFileResult[] = [];\n const diagnostics: Diagnostic[] = [];\n\n for (const file of files) {\n const relPath = relative(opts.cwd, file);\n await processFile(file, relPath, opts, fileResults, diagnostics);\n }\n\n const errCount = diagnostics.filter((d) => d.severity === \"error\").length;\n const warnCount = diagnostics.filter((d) => d.severity === \"warning\").length;\n const ok = errCount === 0 && warnCount === 0;\n\n if (opts.json) {\n emitJson(\n makeEnvelope({\n command: \"fmt\",\n ok,\n diagnostics,\n result: { files: fileResults },\n }),\n );\n } else {\n const lines: FmtFileLine[] = fileResults.map((f) => {\n // Files with error-severity diagnostics get `error` status.\n const hasErr = diagnostics.some((d) => d.severity === \"error\" && d.file === f.path);\n if (hasErr) return { path: f.path, status: \"error\" };\n if (opts.write) {\n return { path: f.path, status: f.changed ? \"rewritten\" : \"ok\" };\n }\n return { path: f.path, status: f.matchesExpected ? \"ok\" : \"not-canonical\" };\n });\n const out = opts.write ? formatFmtWrite(lines) : formatFmtCheck(lines);\n process.stdout.write(out + \"\\n\");\n }\n\n if (errCount > 0) return 2;\n if (warnCount > 0) return 1;\n return 0;\n}\n\nasync function resolveTarget(target: string): Promise<string[]> {\n const st = await stat(target);\n if (st.isFile()) return [target];\n return collectYamlFiles(target);\n}\n\nasync function processFile(\n absPath: string,\n relPath: string,\n opts: RunFmtOptions,\n fileResults: FmtFileResult[],\n diagnostics: Diagnostic[],\n): Promise<void> {\n const text = await readFile(absPath, \"utf8\");\n const result = canonicalize(text, { file: relPath });\n\n if (result.kind === \"parse-error\" || result.kind === \"schema-invalid\") {\n diagnostics.push(...result.diagnostics);\n fileResults.push(opts.write ? { path: relPath, changed: false } : { path: relPath, matchesExpected: false });\n return;\n }\n\n if (opts.write) {\n if (result.changed) {\n await writeFile(absPath, result.text, \"utf8\");\n }\n fileResults.push({ path: relPath, changed: result.changed });\n return;\n }\n\n fileResults.push({ path: relPath, matchesExpected: !result.changed });\n if (result.changed) {\n diagnostics.push({\n severity: \"warning\",\n code: FMT_NOT_CANONICAL,\n message: \"file is not in canonical form (run `sightmap fmt --write` to fix)\",\n file: relPath,\n });\n }\n}\n","// CST-preserving canonical YAML writer. Backs `sightmap fmt`.\n//\n// See sightmap/spec docs/authoring-conventions.md#canonical-formatting-rules\n// for the normative rules this implements.\n\nimport { parseDocument, isMap, isSeq, isScalar, type Document, type YAMLMap, type YAMLSeq, type Pair, type Scalar } from \"yaml\";\nimport { validate } from \"../validate.js\";\nimport {\n FMT_PARSE_ERROR,\n FMT_SCHEMA_INVALID,\n type Diagnostic,\n} from \"../diagnostics.js\";\nimport {\n TOP_LEVEL_KEY_ORDER,\n VIEW_KEY_ORDER,\n COMPONENT_KEY_ORDER,\n REQUEST_KEY_ORDER,\n compareByName,\n compareRequests,\n} from \"./canonical-rules.js\";\n\nexport type CanonicalizeResult =\n | { kind: \"canonical\"; text: string; changed: boolean }\n | { kind: \"parse-error\"; diagnostics: Diagnostic[] }\n | { kind: \"schema-invalid\"; diagnostics: Diagnostic[] };\n\nexport interface CanonicalizeOptions {\n /** Source-file path for diagnostics (relative to cwd, typically). */\n file: string;\n}\n\nexport function canonicalize(input: string, opts: CanonicalizeOptions): CanonicalizeResult {\n const doc = parseDocument(input, { keepSourceTokens: false });\n\n const first = doc.errors[0];\n if (first !== undefined) {\n const loc = first.linePos?.[0]\n ? { line: first.linePos[0].line, column: first.linePos[0].col }\n : undefined;\n return {\n kind: \"parse-error\",\n diagnostics: [\n {\n severity: \"error\",\n code: FMT_PARSE_ERROR,\n message: first.message,\n file: opts.file,\n ...(loc !== undefined ? { loc } : {}),\n },\n ],\n };\n }\n\n const v = validate(input, { sourceFile: opts.file });\n if (!v.ok) {\n // Re-code the validate diagnostics under fmt.schema-invalid; preserve\n // message/loc but normalize severity to error and overwrite the code.\n const diagnostics: Diagnostic[] = v.diagnostics.map((d) => ({\n ...d,\n severity: \"error\" as const,\n code: FMT_SCHEMA_INVALID,\n file: opts.file,\n }));\n return { kind: \"schema-invalid\", diagnostics };\n }\n\n // Mutation passes (only run when input parses + validates).\n if (isMap(doc.contents)) {\n reorderTopLevelKeys(doc.contents);\n reorderEntriesUnder(doc.contents, \"views\", VIEW_KEY_ORDER);\n reorderEntriesUnder(doc.contents, \"components\", COMPONENT_KEY_ORDER);\n reorderEntriesUnder(doc.contents, \"requests\", REQUEST_KEY_ORDER);\n // Per-spec: nested seqs (view.components, view.requests) also follow per-entry-type key order.\n forEachViewEntry(doc.contents, (view) => {\n reorderEntriesUnder(view, \"components\", COMPONENT_KEY_ORDER);\n reorderEntriesUnder(view, \"requests\", REQUEST_KEY_ORDER);\n forEachComponentEntry(view, \"components\", (cmp) => {\n reorderChildrenRecursive(cmp);\n });\n });\n forEachComponentEntry(doc.contents, \"components\", (cmp) => {\n reorderChildrenRecursive(cmp);\n });\n sortTopLevelSeq(doc.contents, \"views\", (a, b) => {\n const an = scalarPropFromMapItem(a, \"name\");\n const bn = scalarPropFromMapItem(b, \"name\");\n return compareByName({ name: an ?? \"\" }, { name: bn ?? \"\" });\n });\n sortTopLevelSeq(doc.contents, \"components\", (a, b) => {\n const an = scalarPropFromMapItem(a, \"name\");\n const bn = scalarPropFromMapItem(b, \"name\");\n return compareByName({ name: an ?? \"\" }, { name: bn ?? \"\" });\n });\n sortTopLevelSeq(doc.contents, \"requests\", (a, b) => {\n return compareRequests(\n { route: scalarPropFromMapItem(a, \"route\") ?? \"\", method: scalarPropFromMapItem(a, \"method\") },\n { route: scalarPropFromMapItem(b, \"route\") ?? \"\", method: scalarPropFromMapItem(b, \"method\") },\n );\n });\n visitAllScalars(doc, (scalar) => {\n if (typeof scalar.value !== \"string\") return;\n scalar.type = chooseQuoteType(scalar.value);\n });\n normalizeBlankLines(doc);\n }\n\n const output = serialize(doc);\n return { kind: \"canonical\", text: output, changed: output !== input };\n}\n\nfunction reorderTopLevelKeys(map: YAMLMap): void {\n reorderMapKeys(map, TOP_LEVEL_KEY_ORDER);\n}\n\nfunction reorderMapKeys(map: YAMLMap, keyOrder: readonly string[]): void {\n const items = map.items as Pair[];\n const byKey = new Map<string, Pair>();\n const unknownInOrder: Pair[] = [];\n for (const item of items) {\n const key = scalarKey(item);\n if (key === null) {\n unknownInOrder.push(item);\n continue;\n }\n if (keyOrder.includes(key)) {\n byKey.set(key, item);\n } else {\n unknownInOrder.push(item);\n }\n }\n const reordered: Pair[] = [];\n for (const k of keyOrder) {\n const p = byKey.get(k);\n if (p !== undefined) reordered.push(p);\n }\n reordered.push(...unknownInOrder);\n map.items = reordered;\n}\n\nfunction reorderEntriesUnder(map: YAMLMap, key: string, keyOrder: readonly string[]): void {\n const seq = lookupSeq(map, key);\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) reorderMapKeys(item, keyOrder);\n }\n}\n\nfunction forEachViewEntry(root: YAMLMap, fn: (view: YAMLMap) => void): void {\n const seq = lookupSeq(root, \"views\");\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) fn(item);\n }\n}\n\nfunction forEachComponentEntry(root: YAMLMap, key: string, fn: (cmp: YAMLMap) => void): void {\n const seq = lookupSeq(root, key);\n if (seq === null) return;\n for (const item of seq.items) {\n if (isMap(item)) fn(item);\n }\n}\n\nfunction reorderChildrenRecursive(cmp: YAMLMap): void {\n const children = lookupSeq(cmp, \"children\");\n if (children === null) return;\n for (const child of children.items) {\n if (!isMap(child)) continue;\n reorderMapKeys(child, COMPONENT_KEY_ORDER);\n reorderChildrenRecursive(child);\n }\n}\n\nfunction lookupSeq(map: YAMLMap, key: string): YAMLSeq | null {\n for (const item of map.items as Pair[]) {\n if (scalarKey(item) === key && isSeq(item.value)) return item.value;\n }\n return null;\n}\n\nfunction scalarKey(pair: Pair): string | null {\n // Pair.key may be a Scalar node or a raw value depending on parse path.\n const k = (pair.key as { value?: unknown }) ?? null;\n if (k === null) return null;\n const v = typeof k === \"object\" && k !== null && \"value\" in k ? k.value : k;\n return typeof v === \"string\" ? v : null;\n}\n\nfunction sortTopLevelSeq(\n root: YAMLMap,\n key: string,\n cmp: (a: unknown, b: unknown) => number,\n): void {\n const seq = lookupSeq(root, key);\n if (seq === null) return;\n // Array.prototype.sort is stable in V8/JSC since 2019.\n seq.items = (seq.items as unknown[]).slice().sort(cmp);\n}\n\nfunction scalarPropFromMapItem(item: unknown, key: string): string | undefined {\n if (!isMap(item)) return undefined;\n for (const pair of item.items as Pair[]) {\n if (scalarKey(pair) !== key) continue;\n const v = pair.value as { value?: unknown } | unknown;\n if (v !== null && typeof v === \"object\" && \"value\" in (v as object)) {\n const inner = (v as { value: unknown }).value;\n return typeof inner === \"string\" ? inner : undefined;\n }\n return typeof v === \"string\" ? v : undefined;\n }\n return undefined;\n}\n\nfunction visitAllScalars(doc: Document, fn: (scalar: Scalar) => void): void {\n walk(doc.contents, fn);\n}\n\nfunction walk(node: unknown, fn: (scalar: Scalar) => void): void {\n if (node === null || node === undefined) return;\n if (isScalar(node)) {\n fn(node);\n return;\n }\n if (isMap(node)) {\n for (const pair of node.items as Pair[]) {\n walk(pair.key, fn);\n walk(pair.value, fn);\n }\n return;\n }\n if (isSeq(node)) {\n for (const item of node.items) walk(item, fn);\n }\n}\n\nfunction normalizeBlankLines(doc: Document): void {\n const root = doc.contents;\n if (!isMap(root)) return;\n\n // HEADER blank-line normalization: emit exactly one blank line between a\n // leading comment block (HEADER) and the first content. Per spec: if no\n // HEADER, no leading blank.\n //\n // eemeli/yaml attaches a leading `# foo` block to the first Pair's *key*\n // (`firstPair.key.commentBefore`), not to `doc.commentBefore`. Setting\n // `spaceBefore` on the key produces a blank BEFORE the comment (wrong);\n // setting it on the Pair has no effect while the comment lives on the key.\n // Workaround: lift the key's commentBefore up to `doc.commentBefore`, clear\n // it on the key, then set `spaceBefore = true` on the first Pair so the\n // serializer emits the desired `<header>\\n\\n<content>` shape.\n const firstPair = (root.items as Pair[])[0];\n if (firstPair !== undefined) {\n const keyNode = firstPair.key as { commentBefore?: string | null } | null;\n const docMutable = doc as { commentBefore?: string | null };\n const keyComment = keyNode?.commentBefore;\n const docComment = docMutable.commentBefore;\n if (typeof keyComment === \"string\" && keyComment.length > 0) {\n docMutable.commentBefore = keyComment;\n keyNode!.commentBefore = null;\n }\n const hasHeader =\n (typeof docMutable.commentBefore === \"string\" && docMutable.commentBefore.length > 0) ||\n (typeof docComment === \"string\" && docComment.length > 0);\n (firstPair as { spaceBefore?: boolean }).spaceBefore = hasHeader;\n }\n\n for (const key of [\"views\", \"components\", \"requests\"] as const) {\n const seq = lookupSeq(root, key);\n if (seq === null) continue;\n seq.items.forEach((item, idx) => {\n // Items at the top level of these seqs get a blank line before them\n // (except the first item). spaceBefore may not be pre-set; assign directly.\n if (typeof item === \"object\" && item !== null) {\n (item as { spaceBefore: boolean }).spaceBefore = idx > 0;\n }\n });\n // Recurse into nested entries to clear any blank lines within an entry's body.\n for (const item of seq.items) {\n if (isMap(item)) clearInnerBlankLines(item);\n }\n }\n}\n\nfunction clearInnerBlankLines(map: YAMLMap): void {\n for (const pair of map.items as Pair[]) {\n (pair as { spaceBefore?: boolean }).spaceBefore = false;\n if (isSeq(pair.value)) {\n for (const item of (pair.value as YAMLSeq).items) {\n if (typeof item === \"object\" && item !== null) {\n (item as { spaceBefore?: boolean }).spaceBefore = false;\n }\n if (isMap(item)) clearInnerBlankLines(item);\n }\n } else if (isMap(pair.value)) {\n clearInnerBlankLines(pair.value);\n }\n }\n}\n\n// Quote-type selection per sightmap/spec authoring-conventions.md#quoting.\nfunction chooseQuoteType(value: string): Scalar.Type {\n if (requiresDoubleQuotes(value)) return \"QUOTE_DOUBLE\";\n if (value.includes('\"')) return \"QUOTE_SINGLE\";\n if (isPlainSafe(value)) return \"PLAIN\";\n return \"QUOTE_SINGLE\";\n}\n\nfunction requiresDoubleQuotes(s: string): boolean {\n // Any ASCII control character (\\x00-\\x1f) requires double-quoted escaping.\n // Includes tab, newline, CR, which canonical form encodes via \\t / \\n / \\r\n // escapes to keep one-line representation (spec: \"Long strings stay on one\n // line. Do not wrap.\").\n // eslint-disable-next-line no-control-regex\n return /[\\x00-\\x1f]/.test(s);\n}\n\nfunction isPlainSafe(s: string): boolean {\n if (s.length === 0) return false;\n // Leading character restrictions per YAML 1.2 plain scalar rules.\n const first = s[0]!;\n if (\"-?:,[]{}#&*!|>'\\\"%@`\".includes(first)) return false;\n if (first === \" \" || first === \"\\t\") return false;\n // Sequences that change parse semantics anywhere in the string.\n if (s.includes(\": \")) return false;\n if (s.includes(\" #\")) return false;\n // Reserved YAML true/false/null/numeric forms.\n if (/^(true|false|null|~|y|n|yes|no|on|off|True|False|Null|Yes|No|On|Off|TRUE|FALSE|NULL|YES|NO|ON|OFF)$/.test(s)) return false;\n if (/^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) return false;\n if (/^0[xob]/.test(s)) return false;\n return true;\n}\n\nfunction serialize(doc: Document): string {\n const out = doc.toString({\n indent: 2,\n lineWidth: 0,\n minContentWidth: 0,\n blockQuote: \"literal\",\n });\n return out.endsWith(\"\\n\") ? out : out + \"\\n\";\n}\n","// Shared canonical-form constants and comparators used by both the value-based\n// format() writer and the CST-preserving canonicalize() writer.\n//\n// Source of truth for the spec rules in\n// sightmap/spec docs/authoring-conventions.md#canonical-formatting-rules.\n\nexport const TOP_LEVEL_KEY_ORDER = [\n \"version\",\n \"memory\",\n \"views\",\n \"components\",\n \"requests\",\n] as const;\n\nexport const VIEW_KEY_ORDER = [\n \"name\",\n \"route\",\n \"description\",\n \"components\",\n \"memory\",\n \"requests\",\n] as const;\n\nexport const COMPONENT_KEY_ORDER = [\n \"name\",\n \"selector\",\n \"description\",\n \"children\",\n \"memory\",\n] as const;\n\n// Schema-derived order. The spec's authoring-conventions doc table lists\n// `method, url, description, memory` for Request — that table is stale\n// relative to the JSON Schema, which has `name, route, method, description,\n// source, request, response, headers, memory` (no `url` field exists). The\n// schema is the source of truth tools enforce; we follow it here.\nexport const REQUEST_KEY_ORDER = [\n \"name\",\n \"route\",\n \"method\",\n \"description\",\n \"source\",\n \"request\",\n \"response\",\n \"headers\",\n \"memory\",\n] as const;\n\n// Lexicographic byte-by-byte comparison on YAML scalar strings.\n// No Unicode normalization, no case folding (per spec).\nexport function compareByName(a: { name: string }, b: { name: string }): number {\n return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\n}\n\n// Sort requests by (route, method). Spec doc says (url, method) but `url`\n// is not a real field — see REQUEST_KEY_ORDER comment above.\n// `method?: string | undefined` (rather than `method?: string`) so callers\n// can pass through optional-or-undefined extractions without spreading.\nexport function compareRequests(\n a: { route: string; method?: string | undefined },\n b: { route: string; method?: string | undefined },\n): number {\n if (a.route !== b.route) return a.route < b.route ? -1 : 1;\n const am = a.method ?? \"\";\n const bm = b.method ?? \"\";\n return am < bm ? -1 : am > bm ? 1 : 0;\n}\n","import { resolve } from \"node:path\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport * as clack from \"@clack/prompts\";\nimport { detectFramework } from \"./detect/framework.js\";\nimport { detectHarnesses } from \"./detect/harness.js\";\nimport { detectSightmapAwareVendor } from \"./detect/vendor.js\";\nimport { detectSightmapDir } from \"./detect/sightmap-dir.js\";\nimport { enumerateWorkspaces, type WorkspaceInfo } from \"./detect/workspaces.js\";\nimport * as tui from \"./tui.js\";\nimport { writeClaudeCodeMcp } from \"./mcp-config/claude-code.js\";\nimport { writeCursorMcp } from \"./mcp-config/cursor.js\";\nimport { writeOpenCodeMcp } from \"./mcp-config/opencode.js\";\nimport { writeCodexMcp } from \"./mcp-config/codex.js\";\nimport { fetchPluginTarball } from \"./tarball.js\";\nimport { copyPluginAssets } from \"./skills-copy.js\";\nimport { buildSightmapMcpServerDef } from \"./version-pin.js\";\nimport { detectPackageManager } from \"./framework-setup/package-manager.js\";\nimport { installAdapter } from \"./framework-setup/install-adapter.js\";\nimport { buildCodegenCommand, runCodegen } from \"./framework-setup/codegen.js\";\nimport { wrapWithSightmapProvider } from \"./framework-setup/provider-codemod.js\";\nimport { renderProviderSnippet } from \"./framework-setup/provider-snippet.js\";\nimport { formatExistingCorpusReport } from \"./existing-corpus.js\";\nimport { runLint } from \"../lint.js\";\nimport type { DetectResult, Host, Framework } from \"./types.js\";\n\nexport interface RunInitOptions {\n cwd: string;\n yes: boolean;\n dryRun?: boolean;\n installPath?: \"plugin\" | \"manual\";\n hosts?: string[];\n withBrowser?: boolean;\n curateOnly?: boolean;\n noCodegen?: boolean;\n noProvider?: boolean;\n}\n\nconst REACT_FRAMEWORKS: Framework[] = [\"react-vite\", \"react-cra\", \"next-app\", \"next-pages\", \"react-router-7\"];\n\nexport async function runInit(opts: RunInitOptions): Promise<number> {\n tui.intro();\n\n let detect: DetectResult = {\n framework: await detectFramework(opts.cwd),\n hosts: await detectHarnesses(opts.cwd),\n sightmapAwareVendor: false,\n sightmapDir: await detectSightmapDir(opts.cwd),\n };\n detect.sightmapAwareVendor = await detectSightmapAwareVendor(opts.cwd, detect.hosts);\n tui.showDetection(detect);\n\n // Monorepo branch: if the cwd has no framework and no .sightmap/, but workspaces\n // exist, ask which workspace to target and re-detect from there.\n if (detect.framework === \"unknown\" && !detect.sightmapDir.present) {\n const chosen = await maybePickWorkspace(opts);\n if (typeof chosen === \"symbol\") return 1;\n if (chosen) {\n opts = { ...opts, cwd: chosen.dir };\n clack.log.info(`Targeting workspace: ${chosen.relPath}`);\n detect = {\n framework: await detectFramework(opts.cwd),\n hosts: detect.hosts,\n sightmapAwareVendor: detect.sightmapAwareVendor,\n sightmapDir: await detectSightmapDir(opts.cwd),\n };\n }\n }\n\n // Framework setup branch\n if (detect.sightmapDir.present) {\n await runExistingCorpusFlow(opts.cwd, detect.sightmapDir.viewCount ?? 0);\n } else {\n await runFreshFrameworkSetup(opts, detect);\n }\n\n let installPath = opts.installPath;\n if (!installPath) {\n if (opts.yes) installPath = \"plugin\";\n else {\n const choice = await tui.selectInstallPath(\"plugin\");\n if (typeof choice === \"symbol\") return 1;\n installPath = choice;\n }\n }\n\n const hosts = await resolveHosts(opts, detect);\n if (hosts.length === 0) {\n tui.outro(\"No hosts selected — nothing to do.\");\n return 0;\n }\n\n const withBrowser = resolveBrowserBundle(opts, detect);\n\n if (installPath === \"plugin\") {\n tui.showPluginInstructions(hosts);\n tui.outro(\"Run those, then restart your agent.\");\n return 0;\n }\n\n // Manual path\n const tarballDir = resolve(tmpdir(), `sightmap-plugin-${Date.now()}`);\n await mkdir(tarballDir, { recursive: true });\n try {\n const tar = await fetchPluginTarball({ destDir: tarballDir, version: \"latest\" });\n\n const serverDef = buildSightmapMcpServerDef({\n compatibleMcpVersion: tar.compatibleMcpVersion,\n pluginVersion: tar.pluginVersion,\n withBrowser,\n sightmapDir: \".sightmap\",\n curateRoot: \".sightmap\",\n });\n\n for (const h of hosts) {\n await writeMcpForHost(h, opts.cwd, serverDef);\n await copyPluginAssets({ tarballDir, projectDir: opts.cwd, host: h });\n }\n } finally {\n await rm(tarballDir, { recursive: true, force: true });\n }\n\n tui.outro(\"Done. Restart your agent to pick up the new MCP.\");\n return 0;\n}\n\nasync function runFreshFrameworkSetup(opts: RunInitOptions, detect: DetectResult): Promise<void> {\n if (!REACT_FRAMEWORKS.includes(detect.framework)) {\n // Empty .sightmap/ scaffold for unsupported frameworks\n await mkdir(resolve(opts.cwd, \".sightmap\"), { recursive: true });\n await writeFile(\n resolve(opts.cwd, \".sightmap/app.yaml\"),\n `version: 1\\nviews: []\\n`,\n \"utf8\",\n );\n return;\n }\n\n const pm = await detectPackageManager(opts.cwd);\n const spinner = clack.spinner();\n\n spinner.start(`Installing @sightmap/react via ${pm}`);\n await installAdapter({ cwd: opts.cwd, packageManager: pm, packageName: \"@sightmap/react\" });\n spinner.stop(\"Installed @sightmap/react\");\n\n if (!opts.noProvider) {\n await runProviderStep(opts, detect);\n }\n\n // Codegen\n if (!opts.noCodegen) {\n const cmd = buildCodegenCommand({ framework: detect.framework, packageManager: pm });\n if (cmd) {\n spinner.start(\"Running sightmap-react gen\");\n await runCodegen(opts.cwd, cmd);\n spinner.stop(\"Scaffolded .sightmap/\");\n }\n }\n}\n\nasync function runProviderStep(opts: RunInitOptions, detect: DetectResult): Promise<void> {\n const entry = await findAppEntry(opts.cwd, detect.framework);\n if (!entry) {\n const snippet = renderProviderSnippet({\n framework: detect.framework,\n cwd: opts.cwd,\n entryAbsPath: \"your app's root component file\",\n });\n tui.showProviderSnippet(snippet, \"We couldn't locate the entry file — drop these lines into your app's root.\");\n return;\n }\n\n const source = await readFile(entry, \"utf8\");\n const result = wrapWithSightmapProvider(source, { framework: detect.framework });\n\n // If the codemod can't safely produce a wrap (no render call, no usable\n // default export, etc.), there is no \"Wrap automatically\" option — fall\n // straight through to the snippet.\n if (!result.changed) {\n const snippet = renderProviderSnippet({\n framework: detect.framework,\n cwd: opts.cwd,\n entryAbsPath: entry,\n });\n const note = result.reason\n ? `Codemod skipped: ${result.reason}.`\n : undefined;\n tui.showProviderSnippet(snippet, note);\n return;\n }\n\n // Codemod produced a wrap. In --yes mode, apply silently. Otherwise let\n // the user pick: apply, see the snippet, or skip.\n if (opts.yes) {\n await writeFile(entry, result.code, \"utf8\");\n return;\n }\n\n const entryRel = relativePath(opts.cwd, entry);\n const choice = await tui.selectProviderAction(entryRel);\n if (choice === \"auto\") {\n await writeFile(entry, result.code, \"utf8\");\n } else if (choice === \"snippet\") {\n const snippet = renderProviderSnippet({\n framework: detect.framework,\n cwd: opts.cwd,\n entryAbsPath: entry,\n });\n tui.showProviderSnippet(snippet);\n }\n // \"skip\" or cancelled → do nothing.\n}\n\nfunction relativePath(cwd: string, abs: string): string {\n if (abs.startsWith(cwd + \"/\")) return abs.slice(cwd.length + 1);\n return abs;\n}\n\nasync function findAppEntry(cwd: string, framework: Framework): Promise<string | null> {\n const candidates: Record<Framework, string[]> = {\n \"react-vite\": [\"src/main.tsx\", \"src/main.jsx\", \"src/index.tsx\", \"src/index.jsx\"],\n \"react-cra\": [\"src/index.tsx\", \"src/index.jsx\"],\n \"next-app\": [\"app/layout.tsx\", \"app/layout.jsx\"],\n \"next-pages\": [\"pages/_app.tsx\", \"pages/_app.jsx\"],\n \"react-router-7\": [\"app/root.tsx\", \"app/root.jsx\", \"src/root.tsx\"],\n unknown: [],\n };\n for (const rel of candidates[framework]) {\n const abs = resolve(cwd, rel);\n try {\n await readFile(abs, \"utf8\");\n return abs;\n } catch {\n // try next\n }\n }\n return null;\n}\n\n\nasync function runExistingCorpusFlow(cwd: string, viewCount: number): Promise<void> {\n const spinner = clack.spinner();\n spinner.start(\"Auditing existing corpus...\");\n await runLint({ path: \".sightmap\", cwd, json: false, strict: false });\n spinner.stop(\"Audit complete\");\n const header = `${viewCount} view${viewCount === 1 ? \"\" : \"s\"}`;\n const body = formatExistingCorpusReport({ viewCount, diagnostics: [] });\n clack.log.message(`${header}\\n\\n${body}`);\n}\n\nasync function resolveHosts(opts: RunInitOptions, detect: DetectResult): Promise<Host[]> {\n if (opts.hosts) {\n const valid = new Set<Host>([\"claude-code\", \"codex\", \"cursor\", \"opencode\"]);\n const invalid = opts.hosts.filter(h => !valid.has(h as Host));\n if (invalid.length > 0) {\n throw new Error(\n `Unknown host(s): ${invalid.join(\", \")}. Valid: claude-code, codex, cursor, opencode`,\n );\n }\n return opts.hosts as Host[];\n }\n if (opts.yes) return detect.hosts.length > 0 ? detect.hosts : [\"claude-code\"];\n const defaults = detect.hosts.length > 0 ? detect.hosts : ([\"claude-code\"] as Host[]);\n const choice = await tui.selectHosts(detect.hosts, defaults);\n if (typeof choice === \"symbol\") return [];\n return choice;\n}\n\nfunction resolveBrowserBundle(opts: RunInitOptions, detect: DetectResult): boolean {\n if (opts.withBrowser) return true;\n if (opts.curateOnly) return false;\n return !detect.sightmapAwareVendor;\n}\n\nasync function maybePickWorkspace(opts: RunInitOptions): Promise<WorkspaceInfo | null | symbol> {\n const all = await enumerateWorkspaces({ root: opts.cwd });\n if (all.length === 0) return null;\n\n const withFramework = all.filter((w) => w.framework !== \"unknown\");\n if (withFramework.length === 0) return null;\n\n if (opts.yes) {\n if (withFramework.length === 1) return withFramework[0] as WorkspaceInfo;\n clack.log.warn(\n `Found ${withFramework.length} workspaces with a framework. Re-run from one of them, or without -y to pick interactively.`,\n );\n return null;\n }\n\n return tui.selectWorkspace(withFramework);\n}\n\nasync function writeMcpForHost(host: Host, cwd: string, serverDef: ReturnType<typeof buildSightmapMcpServerDef>): Promise<void> {\n const common = { cwd, serverName: \"sightmap\", serverDef };\n if (host === \"claude-code\") return writeClaudeCodeMcp(common);\n if (host === \"cursor\") return writeCursorMcp(common);\n if (host === \"opencode\") return writeOpenCodeMcp(common);\n if (host === \"codex\") {\n return writeCodexMcp({\n configPath: resolve(process.env.HOME ?? cwd, \".codex/config.toml\"),\n serverName: \"sightmap\",\n serverDef,\n });\n }\n}\n","import { readFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Framework } from \"../types.js\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectFramework(cwd: string): Promise<Framework> {\n const pkgPath = resolve(cwd, \"package.json\");\n if (!(await exists(pkgPath))) return \"unknown\";\n\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n\n if (deps.next) {\n if (await exists(resolve(cwd, \"app\"))) return \"next-app\";\n if (await exists(resolve(cwd, \"pages\"))) return \"next-pages\";\n return \"next-app\";\n }\n\n const rrVersion = deps[\"react-router\"];\n const rr7 = rrVersion ? /^[\\^~>=<]*7\\./.test(rrVersion) : false;\n if (rr7 || (await exists(resolve(cwd, \"react-router.config.ts\")))) {\n return \"react-router-7\";\n }\n\n if (deps.react) {\n if (deps.vite || (await exists(resolve(cwd, \"vite.config.ts\"))) || (await exists(resolve(cwd, \"vite.config.js\")))) {\n return \"react-vite\";\n }\n if (deps[\"react-scripts\"]) return \"react-cra\";\n }\n\n return \"unknown\";\n}\n","import { access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Host } from \"../types.js\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nconst HARNESS_ORDER: Host[] = [\"claude-code\", \"codex\", \"cursor\", \"opencode\"];\n\nexport async function detectHarnesses(cwd: string): Promise<Host[]> {\n const out: Host[] = [];\n for (const h of HARNESS_ORDER) {\n let found = false;\n if (h === \"claude-code\") found = await exists(resolve(cwd, \".claude\"));\n else if (h === \"cursor\") found = await exists(resolve(cwd, \".cursor\"));\n else if (h === \"codex\") found = await exists(resolve(cwd, \".codex\"));\n else if (h === \"opencode\") found = await exists(resolve(cwd, \"opencode.json\"));\n if (found) out.push(h);\n }\n return out;\n}\n","import { readFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { isKnownVendor, type McpServerEntry } from \"../vendor-allowlist.js\";\nimport type { Host } from \"../types.js\";\n\nasync function readJsonIfExists(path: string): Promise<unknown | null> {\n try {\n await access(path);\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction extractServers(parsed: unknown): McpServerEntry[] {\n if (!parsed || typeof parsed !== \"object\") return [];\n const root = parsed as { mcpServers?: Record<string, { command?: string; args?: string[] }> };\n const servers = root.mcpServers ?? {};\n return Object.entries(servers).map(([name, def]) => ({\n name,\n command: def.command ?? \"\",\n args: def.args ?? [],\n }));\n}\n\nexport async function detectSightmapAwareVendor(cwd: string, hosts: Host[]): Promise<boolean> {\n const candidates: string[] = [];\n if (hosts.includes(\"claude-code\")) candidates.push(resolve(cwd, \".mcp.json\"));\n if (hosts.includes(\"cursor\")) candidates.push(resolve(cwd, \".cursor/mcp.json\"));\n if (hosts.includes(\"opencode\")) candidates.push(resolve(cwd, \"opencode.json\"));\n // Codex (TOML) handled in a later iteration if needed.\n\n for (const path of candidates) {\n const parsed = await readJsonIfExists(path);\n if (!parsed) continue;\n for (const entry of extractServers(parsed)) {\n if (isKnownVendor(entry)) return true;\n }\n }\n return false;\n}\n","export const KNOWN_SIGHTMAP_VENDORS = [\"subtext\"] as const;\n\nexport interface McpServerEntry {\n name: string;\n command: string;\n args: string[];\n}\n\nexport function isKnownVendor(entry: McpServerEntry): boolean {\n const haystacks = [entry.name, entry.command, ...entry.args];\n return KNOWN_SIGHTMAP_VENDORS.some(vendor =>\n haystacks.some(h => h.toLowerCase().includes(vendor.toLowerCase())),\n );\n}\n","import { access, readdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport interface SightmapDirInfo {\n present: boolean;\n viewCount?: number;\n}\n\nexport async function detectSightmapDir(cwd: string): Promise<SightmapDirInfo> {\n const dir = resolve(cwd, \".sightmap\");\n try {\n await access(dir);\n } catch {\n return { present: false };\n }\n const entries = await readdir(dir);\n const yamls = entries.filter(e => e.endsWith(\".yaml\") || e.endsWith(\".yml\"));\n return { present: true, viewCount: yamls.length };\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { detectFramework } from \"./framework.js\";\nimport type { Framework } from \"../types.js\";\n\nexport interface WorkspaceInfo {\n dir: string;\n relPath: string;\n framework: Framework;\n}\n\nexport interface EnumerateOptions {\n root: string;\n}\n\nasync function exists(p: string): Promise<boolean> {\n try { await stat(p); return true; } catch { return false; }\n}\n\nasync function readWorkspacePatterns(root: string): Promise<string[]> {\n const patterns: string[] = [];\n\n const pnpmWs = resolve(root, \"pnpm-workspace.yaml\");\n if (await exists(pnpmWs)) {\n try {\n const parsed = parseYaml(await readFile(pnpmWs, \"utf8\")) as { packages?: unknown } | null;\n const list = parsed && Array.isArray(parsed.packages) ? parsed.packages : [];\n for (const p of list) {\n if (typeof p === \"string\") patterns.push(p);\n }\n } catch {\n // ignore malformed\n }\n }\n\n const pkgJson = resolve(root, \"package.json\");\n if (await exists(pkgJson)) {\n try {\n const pkg = JSON.parse(await readFile(pkgJson, \"utf8\")) as {\n workspaces?: string[] | { packages?: string[] };\n };\n const ws = pkg.workspaces;\n if (Array.isArray(ws)) patterns.push(...ws);\n else if (ws && Array.isArray(ws.packages)) patterns.push(...ws.packages);\n } catch {\n // ignore malformed\n }\n }\n\n return patterns;\n}\n\nasync function expandPattern(root: string, pattern: string): Promise<string[]> {\n const trimmed = pattern.replace(/^\\.\\//, \"\").replace(/\\/$/, \"\");\n if (trimmed.startsWith(\"!\")) return [];\n if (trimmed.includes(\"**\")) return expandDoubleStar(root, trimmed);\n\n const segments = trimmed.split(\"/\");\n return expandSegments(root, segments, 0, root);\n}\n\nasync function expandSegments(root: string, segs: string[], idx: number, current: string): Promise<string[]> {\n if (idx >= segs.length) {\n if (await isPackageDir(current)) return [current];\n return [];\n }\n const seg = segs[idx];\n if (seg === undefined) return [];\n if (seg === \"*\") {\n let entries: string[] = [];\n try {\n entries = await readdir(current);\n } catch {\n return [];\n }\n const out: string[] = [];\n for (const name of entries) {\n if (name.startsWith(\".\")) continue;\n const child = resolve(current, name);\n let s;\n try { s = await stat(child); } catch { continue; }\n if (!s.isDirectory()) continue;\n out.push(...(await expandSegments(root, segs, idx + 1, child)));\n }\n return out;\n }\n return expandSegments(root, segs, idx + 1, resolve(current, seg));\n}\n\nasync function expandDoubleStar(root: string, pattern: string): Promise<string[]> {\n // Limited recursion; only used when user wrote 'packages/**' or similar.\n const prefix = (pattern.split(\"**\")[0] ?? \"\").replace(/\\/$/, \"\");\n const base = prefix ? resolve(root, prefix) : root;\n const out: string[] = [];\n await walk(base, 0, 5, out);\n return out;\n}\n\nasync function walk(dir: string, depth: number, maxDepth: number, out: string[]): Promise<void> {\n if (depth > maxDepth) return;\n if (await isPackageDir(dir)) out.push(dir);\n let entries: string[] = [];\n try { entries = await readdir(dir); } catch { return; }\n for (const name of entries) {\n if (name.startsWith(\".\") || name === \"node_modules\") continue;\n const child = resolve(dir, name);\n let s;\n try { s = await stat(child); } catch { continue; }\n if (s.isDirectory()) await walk(child, depth + 1, maxDepth, out);\n }\n}\n\nasync function isPackageDir(dir: string): Promise<boolean> {\n return exists(resolve(dir, \"package.json\"));\n}\n\nexport async function enumerateWorkspaces(opts: EnumerateOptions): Promise<WorkspaceInfo[]> {\n const { root } = opts;\n const patterns = await readWorkspacePatterns(root);\n if (patterns.length === 0) return [];\n\n const dirs = new Set<string>();\n for (const pat of patterns) {\n for (const d of await expandPattern(root, pat)) dirs.add(d);\n }\n\n const result: WorkspaceInfo[] = [];\n for (const dir of dirs) {\n if (dir === root) continue;\n const framework = await detectFramework(dir);\n result.push({ dir, relPath: relative(root, dir) || \".\", framework });\n }\n\n result.sort((a, b) => {\n const ak = a.framework === \"unknown\" ? 1 : 0;\n const bk = b.framework === \"unknown\" ? 1 : 0;\n if (ak !== bk) return ak - bk;\n return a.relPath.localeCompare(b.relPath);\n });\n\n return result;\n}\n","import * as clack from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { DetectResult, Framework, Host } from \"./types.js\";\nimport type { WorkspaceInfo } from \"./detect/workspaces.js\";\nimport type { ProviderSnippet } from \"./framework-setup/provider-snippet.js\";\nimport { formatSnippet } from \"./framework-setup/provider-snippet.js\";\n\nexport type ProviderChoice = \"auto\" | \"snippet\" | \"skip\";\n\nconst FRAMEWORK_LABELS: Record<Framework, string> = {\n \"react-vite\": \"React (Vite)\",\n \"react-cra\": \"React (CRA)\",\n \"next-app\": \"Next.js (App Router)\",\n \"next-pages\": \"Next.js (Pages Router)\",\n \"react-router-7\": \"React Router 7\",\n unknown: \"unknown\",\n};\n\nconst HOST_LABELS: Record<Host, string> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n cursor: \"Cursor\",\n opencode: \"OpenCode\",\n};\n\nfunction row(label: string, value: string): string {\n return `${pc.cyan(label)} ${pc.white(value)}`;\n}\n\nexport function formatDetectionSummary(d: DetectResult): string[] {\n const fw = row(\"Framework:\", FRAMEWORK_LABELS[d.framework]);\n const hosts = row(\n \"Coding agents:\",\n d.hosts.length > 0 ? d.hosts.map((h) => HOST_LABELS[h]).join(\", \") : \"none detected\",\n );\n const vendor = row(\n \"Browser MCP:\",\n d.sightmapAwareVendor ? \"Sightmap-aware vendor detected\" : \"none detected\",\n );\n const dir = row(\n \".sightmap/:\",\n d.sightmapDir.present\n ? `present (${d.sightmapDir.viewCount ?? 0} views)`\n : \"not present\",\n );\n return [fw, hosts, vendor, dir];\n}\n\nexport function intro(): void {\n clack.intro(pc.cyan(\"◆ Sightmap\") + \" curate your view inventory\");\n}\n\nexport function outro(message: string): void {\n clack.outro(pc.green(message));\n}\n\nexport function showDetection(d: DetectResult): void {\n // One log.message call so clack renders the rows tight (no bar between each).\n clack.log.message(\n [pc.bold(\"Detected\"), \"\", ...formatDetectionSummary(d)].join(\"\\n\"),\n { symbol: pc.cyan(\"◇\") },\n );\n}\n\nexport function showPluginInstructions(hosts: Host[]): void {\n const lines: string[] = [pc.bold(\"Next: run these to finish setup\"), \"\"];\n for (let i = 0; i < hosts.length; i++) {\n const h = hosts[i] as Host;\n lines.push(...pluginSection(h));\n if (i < hosts.length - 1) lines.push(\"\");\n }\n lines.push(\"\", pc.dim(\"Then restart your agent.\"));\n clack.log.message(lines.join(\"\\n\"), { symbol: pc.cyan(\"◇\") });\n}\n\nfunction pluginSection(host: Host): string[] {\n switch (host) {\n case \"claude-code\":\n return [\n pc.cyan(\"Claude Code\"),\n pc.white(\" /plugin marketplace add sightmap/plugin\"),\n pc.white(\" /plugin install sightmap@sightmap-marketplace\"),\n ];\n case \"codex\":\n return [\n pc.cyan(\"Codex\"),\n pc.white(\" codex plugin marketplace add sightmap/plugin\"),\n pc.white(\" codex plugin install sightmap@sightmap-marketplace\"),\n ];\n case \"cursor\":\n return [\n pc.cyan(\"Cursor\"),\n pc.white(\" /plugin add sightmap/plugin\"),\n pc.dim(\" (in the Cursor command palette)\"),\n ];\n case \"opencode\":\n return [\n pc.cyan(\"OpenCode\"),\n pc.white(' Add to opencode.json plugin array:'),\n pc.white(' \"plugin\": [\"sightmap@git+https://github.com/sightmap/plugin\"]'),\n pc.dim(\" Then restart OpenCode.\"),\n ];\n }\n}\n\nexport async function selectInstallPath(\n suggestion: \"plugin\" | \"manual\" = \"plugin\",\n): Promise<\"plugin\" | \"manual\" | symbol> {\n return clack.select({\n message: \"How would you like to install Sightmap?\",\n initialValue: suggestion,\n options: [\n {\n value: \"plugin\" as const,\n label: \"Plugin (recommended)\",\n hint: \"Two copy-paste commands per host. Skills, hooks, MCP — all together.\",\n },\n {\n value: \"manual\" as const,\n label: \"Manual\",\n hint: \"Write MCP config + copy skills/hooks into this repo.\",\n },\n ],\n }) as Promise<\"plugin\" | \"manual\" | symbol>;\n}\n\nexport async function selectWorkspace(\n workspaces: WorkspaceInfo[],\n): Promise<WorkspaceInfo | symbol> {\n const options = workspaces.map((w) => ({\n value: w,\n label: w.relPath,\n hint:\n w.framework === \"unknown\"\n ? pc.dim(\"no framework\")\n : FRAMEWORK_LABELS[w.framework],\n }));\n return clack.select({\n message: \"Multiple workspaces found. Which one should we set up?\",\n options,\n initialValue: workspaces[0] as WorkspaceInfo,\n }) as Promise<WorkspaceInfo | symbol>;\n}\n\nexport async function selectProviderAction(\n entryRelPath: string,\n): Promise<ProviderChoice | symbol> {\n const options: Array<{ value: ProviderChoice; label: string; hint: string }> = [\n { value: \"auto\", label: \"Wrap automatically\", hint: \"Edit the file in place via codemod.\" },\n { value: \"snippet\", label: \"Show me the snippet to paste\", hint: \"Print the exact lines; I'll add them myself.\" },\n { value: \"skip\", label: \"Skip\", hint: \"Already done, or I'll handle it later.\" },\n ];\n return clack.select({\n message: `Add <SightmapProvider> to ${entryRelPath}?`,\n initialValue: \"auto\" as ProviderChoice,\n options,\n }) as Promise<ProviderChoice | symbol>;\n}\n\nexport function showProviderSnippet(snippet: ProviderSnippet, note?: string): void {\n const header = pc.bold(\"Add <SightmapProvider> manually\");\n const body = formatSnippet(snippet);\n const trailer = note ? `\\n\\n${pc.dim(note)}` : \"\";\n clack.log.message(`${header}\\n\\n${body}${trailer}`, { symbol: pc.cyan(\"◇\") });\n}\n\nexport async function selectHosts(\n detected: Host[],\n defaults: Host[],\n): Promise<Host[] | symbol> {\n const options = (\n [\"claude-code\", \"codex\", \"cursor\", \"opencode\"] as const\n ).map((h) => ({\n value: h,\n label: HOST_LABELS[h] + (detected.includes(h) ? pc.dim(\" (detected)\") : \"\"),\n }));\n return clack.multiselect({\n message: \"Which hosts?\",\n options,\n initialValues: defaults,\n required: true,\n }) as Promise<Host[] | symbol>;\n}\n","import { relative } from \"node:path\";\nimport type { Framework } from \"../types.js\";\n\nexport interface SnippetOptions {\n framework: Framework;\n entryAbsPath: string;\n cwd: string;\n}\n\nexport interface ProviderSnippet {\n /** Filename relative to the project root, e.g. `app/root.tsx`. */\n relPath: string;\n /** The exact import line to add to the top of the file. */\n importLine: string;\n /** A short, framework-specific instruction (one line). */\n instruction: string;\n /** A representative wrapped-JSX example. */\n example: string;\n}\n\nconst IMPORT_LINE = `import { SightmapProvider } from '@sightmap/react';`;\n\nexport function renderProviderSnippet(opts: SnippetOptions): ProviderSnippet {\n const relPath = relative(opts.cwd, opts.entryAbsPath) || opts.entryAbsPath;\n switch (opts.framework) {\n case \"react-vite\":\n case \"react-cra\":\n return {\n relPath,\n importLine: IMPORT_LINE,\n instruction: \"Wrap your render root with <SightmapProvider>:\",\n example:\n`ReactDOM.createRoot(document.getElementById('root')!).render(\n <SightmapProvider>\n <App />\n </SightmapProvider>,\n);`,\n };\n case \"next-app\":\n return {\n relPath,\n importLine: IMPORT_LINE,\n instruction: \"Wrap the layout's {children} with <SightmapProvider>:\",\n example:\n`export default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <SightmapProvider>{children}</SightmapProvider>\n </body>\n </html>\n );\n}`,\n };\n case \"next-pages\":\n return {\n relPath,\n importLine: IMPORT_LINE,\n instruction: \"Wrap <Component {...pageProps} /> with <SightmapProvider>:\",\n example:\n`export default function App({ Component, pageProps }) {\n return (\n <SightmapProvider>\n <Component {...pageProps} />\n </SightmapProvider>\n );\n}`,\n };\n case \"react-router-7\":\n return {\n relPath,\n importLine: IMPORT_LINE,\n instruction: \"Wrap the default export's returned JSX with <SightmapProvider>:\",\n example:\n`export default function Root() {\n return (\n <SightmapProvider>\n <Outlet />\n </SightmapProvider>\n );\n}`,\n };\n case \"unknown\":\n return {\n relPath,\n importLine: IMPORT_LINE,\n instruction: \"Wrap your application's root component with <SightmapProvider>.\",\n example: `<SightmapProvider>{/* your app */}</SightmapProvider>`,\n };\n }\n}\n\n/** A short multi-line block suitable for printing into a clack.log.message. */\nexport function formatSnippet(snippet: ProviderSnippet): string {\n return [\n `In ${snippet.relPath}:`,\n \"\",\n ` ${snippet.importLine}`,\n \"\",\n snippet.instruction,\n \"\",\n ...snippet.example.split(\"\\n\").map((l) => ` ${l}`),\n ].join(\"\\n\");\n}\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nasync function readJsonIfExists(path: string): Promise<Record<string, unknown> | null> {\n try {\n await access(path);\n return JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function writeClaudeCodeMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \".mcp.json\");\n const existing = (await readJsonIfExists(path)) ?? {};\n const servers = (existing.mcpServers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcpServers: {\n ...servers,\n [opts.serverName]: opts.serverDef,\n },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nexport async function writeCursorMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \".cursor/mcp.json\");\n let existing: Record<string, unknown> = {};\n try {\n await access(path);\n existing = JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n await mkdir(dirname(path), { recursive: true });\n }\n const servers = (existing.mcpServers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcpServers: { ...servers, [opts.serverName]: opts.serverDef },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { WriteMcpOptions } from \"./types.js\";\n\nexport async function writeOpenCodeMcp(opts: WriteMcpOptions): Promise<void> {\n const path = resolve(opts.cwd, \"opencode.json\");\n let existing: Record<string, unknown> = {};\n try {\n await access(path);\n existing = JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n // create new file\n }\n const mcp = (existing.mcp as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcp: { ...mcp, [opts.serverName]: opts.serverDef },\n };\n await writeFile(path, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n","import { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport type { McpServerDefinition } from \"./types.js\";\n\nexport interface WriteCodexMcpOptions {\n configPath: string;\n serverName: string;\n serverDef: McpServerDefinition;\n}\n\nexport async function writeCodexMcp(opts: WriteCodexMcpOptions): Promise<void> {\n let existing: Record<string, unknown> = {};\n try {\n await access(opts.configPath);\n existing = parse(await readFile(opts.configPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n await mkdir(dirname(opts.configPath), { recursive: true });\n }\n const servers = (existing.mcp_servers as Record<string, unknown> | undefined) ?? {};\n const next = {\n ...existing,\n mcp_servers: {\n ...servers,\n [opts.serverName]: opts.serverDef,\n },\n };\n await writeFile(opts.configPath, stringify(next as never), \"utf8\");\n}\n","import pacote from \"pacote\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport interface FetchResult {\n destDir: string;\n compatibleMcpVersion: string;\n pluginVersion: string;\n}\n\nexport interface FetchOptions {\n destDir: string;\n version: string;\n}\n\nexport async function fetchPluginTarball(opts: FetchOptions): Promise<FetchResult> {\n const spec = `@sightmap/plugin@${opts.version}`;\n await pacote.extract(spec, opts.destDir);\n const manifestPath = resolve(opts.destDir, \".claude-plugin/plugin.json\");\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as {\n version?: string;\n compatibleMcpVersion?: string;\n };\n if (!manifest.compatibleMcpVersion) {\n throw new Error(\"Plugin tarball missing 'compatibleMcpVersion' in plugin.json\");\n }\n return {\n destDir: opts.destDir,\n compatibleMcpVersion: manifest.compatibleMcpVersion,\n pluginVersion: manifest.version ?? \"0.0.0\",\n };\n}\n","import { chmod, cp, mkdir, readFile, readdir, stat, writeFile, access } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Host } from \"./types.js\";\nimport {\n mergeHooksIntoSettings,\n rewriteHookCommands,\n type HooksBlock,\n type SettingsShape,\n} from \"./settings-merge.js\";\n\nexport interface CopyAssetsOptions {\n tarballDir: string;\n projectDir: string;\n host: Host;\n}\n\nexport async function copyPluginAssets(opts: CopyAssetsOptions): Promise<void> {\n const targets = resolveTargets(opts.host, opts.projectDir);\n\n await mkdir(targets.skills, { recursive: true });\n await cp(resolve(opts.tarballDir, \"skills\"), targets.skills, { recursive: true });\n\n if (targets.agents) {\n await mkdir(targets.agents, { recursive: true });\n await cp(resolve(opts.tarballDir, \"agents\"), targets.agents, { recursive: true });\n }\n\n if (targets.bin) {\n await mkdir(targets.bin, { recursive: true });\n await cp(resolve(opts.tarballDir, \"bin\"), targets.bin, { recursive: true });\n await chmodShellScripts(targets.bin);\n }\n\n if (targets.settingsJson && targets.bin && targets.binEnvPath) {\n await installHooksIntoSettings({\n tarballDir: opts.tarballDir,\n settingsPath: targets.settingsJson,\n binEnvPath: targets.binEnvPath,\n });\n } else if (targets.hooksJson) {\n // Hosts without a settings.json merge path: write the plugin-style hooks.json,\n // rewriting the CLAUDE_PLUGIN_ROOT token to point at our copied bin dir.\n await installLegacyHooksJson({\n tarballDir: opts.tarballDir,\n dstPath: targets.hooksJson,\n binEnvPath: targets.binEnvPath ?? `\\${CLAUDE_PROJECT_DIR}/.claude/sightmap`,\n });\n }\n}\n\nasync function installHooksIntoSettings(opts: {\n tarballDir: string;\n settingsPath: string;\n binEnvPath: string;\n}): Promise<void> {\n const incomingRaw = JSON.parse(\n await readFile(resolve(opts.tarballDir, \"hooks/hooks.json\"), \"utf8\"),\n ) as { hooks?: HooksBlock };\n const incoming = incomingRaw.hooks ?? {};\n const rewritten = rewriteHookCommands(incoming, opts.binEnvPath);\n\n let existing: SettingsShape = {};\n try {\n await access(opts.settingsPath);\n existing = JSON.parse(await readFile(opts.settingsPath, \"utf8\")) as SettingsShape;\n } catch {\n // missing or unreadable — start fresh\n }\n\n const merged = mergeHooksIntoSettings(existing, rewritten);\n await mkdir(resolve(opts.settingsPath, \"..\"), { recursive: true });\n await writeFile(opts.settingsPath, JSON.stringify(merged, null, 2) + \"\\n\", \"utf8\");\n}\n\nasync function installLegacyHooksJson(opts: {\n tarballDir: string;\n dstPath: string;\n binEnvPath: string;\n}): Promise<void> {\n const srcRaw = JSON.parse(\n await readFile(resolve(opts.tarballDir, \"hooks/hooks.json\"), \"utf8\"),\n ) as { hooks?: HooksBlock };\n const rewritten = rewriteHookCommands(srcRaw.hooks ?? {}, opts.binEnvPath);\n let merged: { hooks: HooksBlock } = { hooks: rewritten };\n try {\n await access(opts.dstPath);\n const existing = JSON.parse(await readFile(opts.dstPath, \"utf8\")) as { hooks?: HooksBlock };\n merged = { hooks: { ...(existing.hooks ?? {}), ...rewritten } };\n } catch {\n // ignore\n }\n await mkdir(resolve(opts.dstPath, \"..\"), { recursive: true });\n await writeFile(opts.dstPath, JSON.stringify(merged, null, 2) + \"\\n\", \"utf8\");\n}\n\nasync function chmodShellScripts(dir: string): Promise<void> {\n const entries = await readdir(dir);\n for (const name of entries) {\n const p = resolve(dir, name);\n const s = await stat(p);\n if (s.isDirectory()) {\n await chmodShellScripts(p);\n } else if (name.endsWith(\".sh\")) {\n await chmod(p, 0o755);\n }\n }\n}\n\ninterface CopyTargets {\n skills: string;\n agents?: string;\n bin?: string;\n binEnvPath?: string;\n /** When set, merge hooks into this settings.json. Preferred for hosts that read hooks from settings.json (e.g. Claude Code). */\n settingsJson?: string;\n /** Fallback: write a plugin-style hooks.json. Used only for hosts without a settings.json hook surface. */\n hooksJson?: string;\n}\n\nfunction resolveTargets(host: Host, projectDir: string): CopyTargets {\n switch (host) {\n case \"claude-code\":\n return {\n skills: resolve(projectDir, \".claude/skills/sightmap\"),\n agents: resolve(projectDir, \".claude/agents\"),\n bin: resolve(projectDir, \".claude/sightmap/bin\"),\n // Stand-in for CLAUDE_PLUGIN_ROOT — tarball commands are written as\n // ${CLAUDE_PLUGIN_ROOT}/bin/X.sh, so we replace the plugin root, not the bin dir.\n binEnvPath: \"${CLAUDE_PROJECT_DIR}/.claude/sightmap\",\n settingsJson: resolve(projectDir, \".claude/settings.json\"),\n };\n case \"codex\":\n return {\n skills: resolve(projectDir, \".codex/skills/sightmap\"),\n agents: resolve(projectDir, \".codex/agents\"),\n bin: resolve(projectDir, \".codex/sightmap/bin\"),\n binEnvPath: \"${CLAUDE_PROJECT_DIR}/.codex/sightmap\",\n hooksJson: resolve(projectDir, \".codex/hooks.json\"),\n };\n case \"cursor\":\n return { skills: resolve(projectDir, \".cursor/rules/sightmap\") };\n case \"opencode\":\n return { skills: resolve(projectDir, \".opencode/plugins/sightmap\") };\n }\n}\n","export interface HookEntry {\n type: \"command\";\n command: string;\n timeout?: number;\n}\n\nexport interface HookGroup {\n matcher?: string;\n hooks: HookEntry[];\n}\n\nexport interface HooksBlock {\n [event: string]: HookGroup[];\n}\n\nexport interface SettingsShape {\n hooks?: HooksBlock;\n [key: string]: unknown;\n}\n\nconst PLUGIN_ROOT_TOKEN = /\\$\\{CLAUDE_PLUGIN_ROOT\\}/g;\n\nexport function rewriteHookCommands(hooks: HooksBlock, replacement: string): HooksBlock {\n const out: HooksBlock = {};\n for (const [event, groups] of Object.entries(hooks)) {\n out[event] = groups.map((g) => ({\n ...(g.matcher !== undefined ? { matcher: g.matcher } : {}),\n hooks: g.hooks.map((h) => ({\n ...h,\n command: h.command.replace(PLUGIN_ROOT_TOKEN, replacement),\n })),\n }));\n }\n return out;\n}\n\nexport function mergeHooksIntoSettings(\n existing: SettingsShape,\n incoming: HooksBlock,\n): SettingsShape {\n const merged: SettingsShape = { ...existing };\n const mergedHooks: HooksBlock = { ...(existing.hooks ?? {}) };\n\n for (const [event, incomingGroups] of Object.entries(incoming)) {\n const existingGroups = mergedHooks[event] ?? [];\n const combined = [...existingGroups];\n for (const g of incomingGroups) {\n if (!hasGroup(combined, g)) combined.push(g);\n }\n mergedHooks[event] = combined;\n }\n\n merged.hooks = mergedHooks;\n return merged;\n}\n\nfunction hasGroup(groups: HookGroup[], candidate: HookGroup): boolean {\n return groups.some(\n (g) =>\n (g.matcher ?? \"\") === (candidate.matcher ?? \"\") &&\n g.hooks.length === candidate.hooks.length &&\n g.hooks.every((h, i) => h.command === candidate.hooks[i]?.command),\n );\n}\n","import type { McpServerDefinition } from \"./mcp-config/types.js\";\n\nexport interface BuildServerDefOptions {\n compatibleMcpVersion: string;\n pluginVersion: string;\n withBrowser: boolean;\n sightmapDir: string;\n curateRoot: string;\n}\n\nexport function buildSightmapMcpServerDef(opts: BuildServerDefOptions): McpServerDefinition {\n const args = [\"-y\", `@sightmap/mcp@${opts.compatibleMcpVersion}`,\n \"--sightmap-dir\", opts.sightmapDir,\n \"--curate-root\", opts.curateRoot];\n if (opts.withBrowser) {\n args.push(\"--\", \"npx\", \"-y\", \"@playwright/mcp@latest\");\n } else {\n args.push(\"--curate-only\");\n }\n return {\n command: \"npx\",\n args,\n env: { SIGHTMAP_PLUGIN_VERSION: opts.pluginVersion },\n };\n}\n","import { access } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\";\n\nasync function exists(p: string): Promise<boolean> {\n try { await access(p); return true; } catch { return false; }\n}\n\nconst SIGNALS: Array<{ file: string; pm: PackageManager }> = [\n { file: \"pnpm-lock.yaml\", pm: \"pnpm\" },\n { file: \"pnpm-workspace.yaml\", pm: \"pnpm\" },\n { file: \"yarn.lock\", pm: \"yarn\" },\n];\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n let dir = resolve(cwd);\n while (true) {\n for (const { file, pm } of SIGNALS) {\n if (await exists(resolve(dir, file))) return pm;\n }\n const parent = dirname(dir);\n if (parent === dir) return \"npm\";\n dir = parent;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { PackageManager } from \"./package-manager.js\";\n\nconst ADD_VERB: Record<PackageManager, string> = {\n pnpm: \"add\",\n yarn: \"add\",\n npm: \"install\",\n};\n\nexport interface InstallAdapterOptions {\n cwd: string;\n packageManager: PackageManager;\n packageName: string;\n}\n\nexport async function installAdapter(opts: InstallAdapterOptions): Promise<void> {\n await new Promise<void>((resolveP, reject) => {\n const child = spawn(opts.packageManager, [ADD_VERB[opts.packageManager], opts.packageName], {\n cwd: opts.cwd,\n stdio: \"inherit\",\n });\n child.on(\"error\", reject);\n child.on(\"exit\", code => code === 0 ? resolveP() : reject(new Error(`${opts.packageManager} exited with code ${code}`)));\n });\n}\n","import { spawn } from \"node:child_process\";\nimport type { Framework } from \"../types.js\";\nimport type { PackageManager } from \"./package-manager.js\";\n\nconst REACT_FRAMEWORKS: Framework[] = [\"react-vite\", \"react-cra\", \"next-app\", \"next-pages\", \"react-router-7\"];\n\nconst EXEC_VERB: Record<PackageManager, string[]> = {\n pnpm: [\"exec\"],\n yarn: [\"exec\"],\n npm: [\"exec\", \"--\"],\n};\n\nexport interface CodegenCommand {\n command: string;\n args: string[];\n}\n\nexport interface BuildCodegenOptions {\n framework: Framework;\n packageManager: PackageManager;\n}\n\nexport function buildCodegenCommand(opts: BuildCodegenOptions): CodegenCommand | null {\n if (!REACT_FRAMEWORKS.includes(opts.framework)) return null;\n // `--router=auto` lets sightmap-react pick framework-mode (app/routes.ts) vs\n // declarative (<Routes> JSX) based on what the project actually uses. The CLI's\n // own default is \"react-router-7\" (declarative-only), which silently misses\n // programmatic-config RR7 framework apps.\n return {\n command: opts.packageManager,\n args: [...EXEC_VERB[opts.packageManager], \"sightmap-react\", \"gen\", \"--router=auto\"],\n };\n}\n\nexport async function runCodegen(cwd: string, cmd: CodegenCommand): Promise<void> {\n await new Promise<void>((resolveP, reject) => {\n const child = spawn(cmd.command, cmd.args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", code => code === 0 ? resolveP() : reject(new Error(`codegen exited ${code}`)));\n });\n}\n","import * as recast from \"recast\";\nimport * as parser from \"@babel/parser\";\nimport type { File } from \"@babel/types\";\nimport type { Framework } from \"../types.js\";\n\nconst babelParser = {\n parse(source: string) {\n return parser.parse(source, {\n sourceType: \"module\",\n tokens: true,\n plugins: [\"jsx\", \"typescript\"],\n });\n },\n};\n\nexport interface CodemodResult {\n code: string;\n changed: boolean;\n reason?: string;\n}\n\nexport interface CodemodOptions {\n framework?: Framework;\n}\n\nexport function wrapWithSightmapProvider(source: string, opts: CodemodOptions = {}): CodemodResult {\n if (source.includes(\"SightmapProvider\")) {\n return { code: source, changed: false, reason: \"SightmapProvider already present\" };\n }\n\n const ast = recast.parse(source, { parser: babelParser }) as File;\n const b = recast.types.builders;\n const wrap = (inner: unknown) =>\n b.jsxElement(\n b.jsxOpeningElement(b.jsxIdentifier(\"SightmapProvider\"), [], false),\n b.jsxClosingElement(b.jsxIdentifier(\"SightmapProvider\")),\n [stripPrintMetadata(inner) as never],\n );\n\n // Strategy 1: ReactDOM.createRoot(...).render(<App/>) — Vite / CRA / Next pages\n let wrapped = false;\n let reason: string | undefined;\n\n recast.types.visit(ast, {\n visitCallExpression(path) {\n if (wrapped) return false;\n const callee = path.node.callee;\n if (\n callee.type === \"MemberExpression\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"render\"\n ) {\n const arg = path.node.arguments[0];\n if (!arg) {\n reason = \"render() called with no args\";\n return false;\n }\n path.node.arguments[0] = wrap(arg) as never;\n wrapped = true;\n return false;\n }\n this.traverse(path);\n },\n });\n\n // Strategy 2: RR7 framework mode — wrap default-exported component's returned JSX\n if (!wrapped && opts.framework === \"react-router-7\") {\n wrapped = tryWrapDefaultExport(ast, wrap);\n if (!wrapped) reason = \"no default export returning JSX found in app/root.tsx\";\n }\n\n if (!wrapped) {\n return { code: source, changed: false, reason: reason ?? \"no .render() call found\" };\n }\n\n const importDecl = b.importDeclaration(\n [b.importSpecifier(b.identifier(\"SightmapProvider\"), b.identifier(\"SightmapProvider\"))],\n b.stringLiteral(\"@sightmap/react\"),\n );\n insertImportAfterHeaderComments(ast, importDecl);\n\n return { code: recast.print(ast, { quote: \"single\" }).code, changed: true };\n}\n\n// Insert the import at the top while keeping any leading header comments\n// (license blocks, copyright notices) above it. babel-parser attaches such\n// comments as `leadingComments` of the first statement; we move them onto our\n// new import so recast prints `[comments]\\n[our import]\\n[old first]`.\nfunction insertImportAfterHeaderComments(ast: File, importDecl: unknown): void {\n const body = ast.program.body as Array<{ leadingComments?: unknown[]; comments?: unknown[] }>;\n const firstStmt = body[0];\n if (firstStmt) {\n // recast tracks both `leadingComments` (babel) and `comments` (its own) on\n // a node. Move both onto the new import so the header (license/copyright)\n // stays at the very top of the file.\n const newImp = importDecl as { leadingComments?: unknown[]; comments?: unknown[] };\n if (Array.isArray(firstStmt.leadingComments) && firstStmt.leadingComments.length > 0) {\n newImp.leadingComments = firstStmt.leadingComments;\n firstStmt.leadingComments = [];\n }\n if (Array.isArray(firstStmt.comments) && firstStmt.comments.length > 0) {\n newImp.comments = firstStmt.comments;\n firstStmt.comments = [];\n }\n }\n body.unshift(importDecl as never);\n}\n\n// Forces recast to re-print this node from scratch instead of replaying the\n// original source. Without this, a node that came from `return (<jsx/>)`\n// retains its surrounding parens, which become literal JSX text characters\n// when nested inside another JSXElement.\nfunction stripPrintMetadata(node: unknown): unknown {\n const n = node as { original?: unknown; loc?: unknown; extra?: { parenthesized?: boolean } };\n if (n && typeof n === \"object\") {\n // recast seals `original` on visited nodes, so assignment (not delete) is required.\n try { n.original = undefined; } catch { /* ignore */ }\n try { n.loc = undefined; } catch { /* ignore */ }\n if (n.extra) n.extra.parenthesized = false;\n }\n return node;\n}\n\nfunction tryWrapDefaultExport(ast: File, wrap: (inner: unknown) => unknown): boolean {\n let done = false;\n recast.types.visit(ast, {\n visitExportDefaultDeclaration(path) {\n if (done) return false;\n const decl = path.node.declaration as { type?: string; body?: unknown; params?: unknown };\n // export default function Root() { return <jsx/> } | export default () => <jsx/>\n const body = (decl as { body?: { type?: string; body?: Array<{ type?: string; argument?: unknown }> } }).body;\n if (\n (decl.type === \"FunctionDeclaration\" || decl.type === \"ArrowFunctionExpression\" || decl.type === \"FunctionExpression\") &&\n body &&\n body.type === \"BlockStatement\" &&\n Array.isArray(body.body)\n ) {\n for (const stmt of body.body) {\n if (stmt.type === \"ReturnStatement\" && stmt.argument) {\n const arg = stmt.argument as { type?: string };\n if (arg.type === \"JSXElement\" || arg.type === \"JSXFragment\") {\n stmt.argument = wrap(stmt.argument) as never;\n done = true;\n return false;\n }\n }\n }\n }\n // export default () => <jsx/> — arrow with expression body\n if (\n decl.type === \"ArrowFunctionExpression\" &&\n body &&\n ((body as { type?: string }).type === \"JSXElement\" || (body as { type?: string }).type === \"JSXFragment\")\n ) {\n (decl as { body: unknown }).body = wrap(body);\n done = true;\n return false;\n }\n return false;\n },\n });\n return done;\n}\n","export interface ExistingCorpusReportInput {\n viewCount: number;\n diagnostics: Array<{ severity: string; code: string; view?: string; message: string }>;\n}\n\nexport function formatExistingCorpusReport(input: ExistingCorpusReportInput): string {\n const errors = input.diagnostics.filter(d => d.severity === \"error\");\n const warnings = input.diagnostics.filter(d => d.severity === \"warning\");\n\n const lines: string[] = [];\n lines.push(`sightmap check passed (${input.viewCount} views, ${errors.length} schema errors)`);\n\n if (warnings.length > 0) {\n const byCode = new Map<string, number>();\n for (const w of warnings) byCode.set(w.code, (byCode.get(w.code) ?? 0) + 1);\n const emptyMemory = byCode.get(\"EMPTY_MEMORY\") ?? 0;\n if (emptyMemory > 0) {\n lines.push(`${emptyMemory} views have empty memory blocks — run /sightmap audit for details`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["resolve","yaml","yaml","resolve","resolve","readFile","readdir","join","extname","relative","resolve","resolve","collectYamlFiles","relative","readFile","readdir","join","extname","resolve","resolve","resolve","resolve","resolve","resolve","resolve","resolve","relative","resolve","relative","resolve","readdir","join","relative","existsSync","join","existsSync","readdir","relative","resolve","readFile","stat","resolve","relative","resolve","relative","stat","readFile","resolve","mkdir","readFile","writeFile","clack","readFile","resolve","access","resolve","exists","readFile","access","resolve","access","readFile","resolve","access","readdir","resolve","readFile","readdir","stat","resolve","relative","exists","stat","resolve","readFile","readdir","walk","relative","relative","intro","outro","readFile","writeFile","access","resolve","readJsonIfExists","readFile","writeFile","access","resolve","dirname","readFile","writeFile","access","resolve","readFile","writeFile","access","mkdir","dirname","parse","readFile","resolve","mkdir","readFile","readdir","stat","writeFile","access","resolve","mkdir","resolve","readFile","access","writeFile","readdir","stat","access","dirname","resolve","exists","spawn","REACT_FRAMEWORKS","intro","outro","resolve","mkdir","writeFile","spinner","readFile"]}
|