@withoperon/cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/cli.js +4100 -0
- package/dist/cli.js.map +1 -0
- package/package.json +67 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/config.ts","../src/lib/exit-codes.ts","../src/lib/globals.ts","../src/lib/logger.ts","../src/store/config.ts","../src/store/paths.ts","../src/commands/doctor.ts","../src/ingestion/claude-code.ts","../src/ingestion/jsonl.ts","../src/ingestion/normalize.ts","../src/ingestion/codex.ts","../src/ingestion/cursor.ts","../src/ingestion/redact.ts","../src/ingestion/index.ts","../src/render/doctor-report.ts","../src/version.ts","../src/commands/install.ts","../src/lib/runs.ts","../src/commands/list.ts","../src/render/candidate-table.ts","../src/store/candidates.ts","../src/store/operons.ts","../src/commands/login.ts","../src/commands/mine.ts","../../../packages/mining/src/prompts.ts","../../../packages/mining/src/filter.ts","../../../packages/mining/src/hashes.ts","../../../packages/mining/src/featurize.ts","../../../packages/mining/src/cluster.ts","../../../packages/mining/src/score.ts","../../../packages/mining/src/render.ts","../../../packages/mining/src/pipeline.ts","../src/lib/duration.ts","../src/lib/events.ts","../src/lib/push.ts","../src/commands/mcp.ts","../../mcp/src/index.ts","../../mcp/src/tools.ts","../src/commands/polish.ts","../src/llm/polish.ts","../src/commands/publish.ts","../src/commands/prune.ts","../src/commands/scan.ts","../src/peer/discover.ts","../src/commands/show.ts","../src/render/show-detail.ts","../src/commands/suggest.ts","../src/lib/suggestions.ts","../src/commands/undo.ts"],"sourcesContent":["// @withoperon/cli entrypoint. The shape is locked by\n// docs/03-mvp-mem-cli/03-cli-surface.md — adding a new verb means\n// updating that doc and (often) opening an ADR. Each subcommand\n// lives in src/commands/<verb>.ts and parses its own options via\n// zod after commander hands them off.\n\nimport { Command, Option } from \"commander\";\nimport { configCommand } from \"./commands/config.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { installCommand } from \"./commands/install.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { mineCommand } from \"./commands/mine.js\";\nimport { mcpCommand } from \"./commands/mcp.js\";\nimport { polishCommand } from \"./commands/polish.js\";\nimport { publishCommand } from \"./commands/publish.js\";\nimport { pruneCommand } from \"./commands/prune.js\";\nimport { scanCommand } from \"./commands/scan.js\";\nimport { showCommand } from \"./commands/show.js\";\nimport { suggestCommand } from \"./commands/suggest.js\";\nimport { undoCommand } from \"./commands/undo.js\";\nimport { setGlobals } from \"./lib/globals.js\";\nimport { log } from \"./lib/logger.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"operon\")\n .description(\"Team agent memory for AI-native engineering teams.\")\n .version(CLI_VERSION)\n .option(\"--json\", \"Machine-readable JSON output\", false)\n .option(\"--no-color\", \"Disable ANSI color\")\n .option(\"-q, --quiet\", \"Suppress non-error output\", false)\n .option(\"-v, --verbose\", \"Show debug-level info\", false)\n .option(\"--config <path>\", \"Override default ~/.operon/config.toml\")\n .option(\"--cwd <path>\", \"Override the inferred project root\")\n // Reserve --no-redact at the program level so it works on any\n // mining-related subcommand without needing per-command wiring.\n .addOption(new Option(\"--no-redact\", \"Skip secrets redaction\").hideHelp())\n .hook(\"preAction\", (thisCommand) => {\n const o = thisCommand.opts<{\n json?: boolean;\n color?: boolean;\n quiet?: boolean;\n verbose?: boolean;\n config?: string;\n cwd?: string;\n }>();\n setGlobals({\n json: o.json ?? false,\n noColor: o.color === false,\n quiet: o.quiet ?? false,\n verbose: o.verbose ?? false,\n configPath: o.config,\n cwd: o.cwd ?? process.cwd(),\n });\n });\n\nprogram.addCommand(scanCommand());\nprogram.addCommand(suggestCommand());\nprogram.addCommand(mineCommand());\nprogram.addCommand(listCommand());\nprogram.addCommand(showCommand());\nprogram.addCommand(polishCommand());\nprogram.addCommand(pruneCommand());\nprogram.addCommand(loginCommand());\nprogram.addCommand(mcpCommand());\nprogram.addCommand(installCommand());\nprogram.addCommand(publishCommand());\nprogram.addCommand(doctorCommand());\nprogram.addCommand(undoCommand());\nprogram.addCommand(configCommand());\n\nprogram.parseAsync().catch((err: unknown) => {\n log.err(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","// `operon config get|set|edit` — read/write ~/.operon/config.json.\n\nimport { Command } from \"commander\";\nimport { spawn } from \"node:child_process\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport {\n getConfigValue,\n readConfig,\n setConfigValue,\n writeConfig,\n} from \"../store/config.js\";\nimport { CONFIG_PATH } from \"../store/paths.js\";\n\nexport function configCommand(): Command {\n const cmd = new Command(\"config\").description(\n \"Read / write ~/.operon/config.json.\"\n );\n\n cmd\n .command(\"get <key>\")\n .description(\"Read a config value by dot path.\")\n .action(async (key: string) => {\n const config = await readConfig();\n const value = getConfigValue(config, key);\n if (getGlobals().json) {\n log.json({ key, value });\n } else {\n log.info(value === undefined ? \"(unset)\" : JSON.stringify(value));\n }\n process.exit(EXIT.ok);\n });\n\n cmd\n .command(\"set <key> <value>\")\n .description(\n \"Write a config value by dot path. Booleans true/false; JSON literal otherwise.\"\n )\n .action(async (key: string, raw: string) => {\n const value = parseConfigValue(raw);\n const config = await readConfig();\n const next = setConfigValue(config, key, value);\n await writeConfig(next);\n log.step(`config set ${key} = ${JSON.stringify(value)}`);\n process.exit(EXIT.ok);\n });\n\n cmd\n .command(\"edit\")\n .description(\"Open ~/.operon/config.json in $EDITOR.\")\n .action(() => {\n const editor = process.env[\"EDITOR\"] ?? process.env[\"VISUAL\"] ?? \"vi\";\n const child = spawn(editor, [CONFIG_PATH], { stdio: \"inherit\" });\n child.on(\"exit\", (code) => process.exit(code ?? 0));\n });\n\n return cmd;\n}\n\n// Parse a CLI-supplied value: true/false, then JSON, then string.\nfunction parseConfigValue(raw: string): unknown {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n","// Conventional exit codes for `operon`. See docs/03-mvp-mem-cli/03-cli-surface.md.\n\nexport const EXIT = {\n ok: 0,\n err: 1,\n noWork: 2, // no sources detected, no candidates produced, etc.\n config: 3, // bad config / setup\n network: 4, // v1\n auth: 5, // v1\n evalFail: 6, // v1\n} as const;\n\nexport type ExitCode = (typeof EXIT)[keyof typeof EXIT];\n","// Process-wide flags resolved from top-level options and env. Every\n// command pulls these from one place so behavior stays consistent.\n//\n// Why a singleton: commander parses options at the program level but\n// hands them off to action callbacks bound to subcommands. Without a\n// shared accessor, each handler would have to re-thread `--json`,\n// `--quiet`, etc. through its own arg parsing.\n\nimport process from \"node:process\";\n\nexport type Globals = {\n json: boolean;\n noColor: boolean;\n quiet: boolean;\n verbose: boolean;\n configPath: string | undefined;\n cwd: string;\n};\n\nlet resolved: Globals | undefined;\n\nexport function setGlobals(g: Globals): void {\n resolved = g;\n}\n\nexport function getGlobals(): Globals {\n if (!resolved) {\n // Conservative defaults if a command runs before parse (tests).\n return {\n json: false,\n noColor: !process.stdout.isTTY,\n quiet: false,\n verbose: false,\n configPath: undefined,\n cwd: process.cwd(),\n };\n }\n return resolved;\n}\n","// Tiny logger that respects --quiet / --verbose / --no-color.\n// The CLI eslint carve-out lets us call console here.\n\nimport chalk from \"chalk\";\nimport { getGlobals } from \"./globals.js\";\n\nconst isColor = (): boolean => !getGlobals().noColor;\n\nconst dim = (s: string): string => (isColor() ? chalk.dim(s) : s);\nconst bold = (s: string): string => (isColor() ? chalk.bold(s) : s);\nconst yellow = (s: string): string => (isColor() ? chalk.yellow(s) : s);\nconst red = (s: string): string => (isColor() ? chalk.red(s) : s);\nconst green = (s: string): string => (isColor() ? chalk.green(s) : s);\n\nexport const log = {\n info(msg: string): void {\n if (getGlobals().quiet) return;\n console.log(msg);\n },\n debug(msg: string): void {\n if (!getGlobals().verbose) return;\n console.log(dim(`[debug] ${msg}`));\n },\n step(msg: string): void {\n if (getGlobals().quiet) return;\n console.log(`${bold(green(\"→\"))} ${msg}`);\n },\n warn(msg: string): void {\n console.warn(`${bold(yellow(\"!\"))} ${msg}`);\n },\n err(msg: string): void {\n console.error(`${bold(red(\"✖\"))} ${msg}`);\n },\n json(value: unknown): void {\n // --json mode: line-delimited JSON to stdout.\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n },\n};\n","// Read/write ~/.operon/config.json. v0 uses JSON; an ADR will\n// migrate to TOML if we need richer config (the doc spec mentions\n// config.toml aspirationally, but we don't add a TOML dep until\n// we have keys richer than scalars).\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { CONFIG_PATH, ensureLayout } from \"./paths.js\";\n\nexport const configSchema = z.object({\n version: z.literal(1).default(1),\n telemetry: z\n .object({\n anonStats: z.boolean().default(false),\n patternHashes: z.boolean().default(false),\n anonUserId: z.string().uuid().optional(),\n })\n .default({}),\n redact: z\n .object({\n patterns: z\n .array(z.object({ kind: z.string().min(1), regex: z.string().min(1) }))\n .default([]),\n redactEmails: z.boolean().default(true),\n })\n .default({}),\n paths: z\n .object({\n // Reserved for `operon scan --cwd` overrides; v0 leaves empty.\n cwdAllowlist: z.array(z.string()).default([]),\n })\n .default({}),\n // Platform endpoint + signed-in identity. apiBase points at the\n // deployed apps/web (or http://localhost:3001 during dogfooding).\n // accessToken may be a Supabase access_token or an op_pat_* token.\n // workspaceSlug is the default --workspace value for publish/install.\n platform: z\n .object({\n apiBase: z.string().url().default(\"https://app.withoperon.com\"),\n accessToken: z.string().optional(),\n refreshToken: z.string().optional(),\n expiresAt: z.number().int().optional(),\n userEmail: z.string().optional(),\n workspaceSlug: z.string().optional(),\n })\n .default({}),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nconst DEFAULT_CONFIG: Config = configSchema.parse({});\n\nexport async function readConfig(): Promise<Config> {\n await ensureLayout();\n try {\n const raw = await readFile(CONFIG_PATH, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return configSchema.parse(parsed);\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function writeConfig(config: Config): Promise<void> {\n await ensureLayout();\n const validated = configSchema.parse(config);\n await writeFile(\n CONFIG_PATH,\n `${JSON.stringify(validated, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\n// Path-style get / set: `telemetry.anonStats` → boolean.\nexport function getConfigValue(config: Config, path: string): unknown {\n const parts = path.split(\".\");\n let cursor: unknown = config;\n for (const p of parts) {\n if (typeof cursor !== \"object\" || cursor === null) return undefined;\n cursor = (cursor as Record<string, unknown>)[p];\n }\n return cursor;\n}\n\nexport function setConfigValue(\n config: Config,\n path: string,\n value: unknown\n): Config {\n const parts = path.split(\".\");\n const next = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n let cursor: Record<string, unknown> = next;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!;\n const child = cursor[key];\n if (typeof child !== \"object\" || child === null) {\n cursor[key] = {};\n }\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]!] = value;\n return configSchema.parse(next);\n}\n","// Filesystem layout for ~/.operon/. Constants live here so the\n// rest of the CLI never hard-codes paths.\n\nimport { mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const ROOT = join(homedir(), \".operon\");\nexport const CANDIDATES_DIR = join(ROOT, \"candidates\");\nexport const OPERONS_DIR = join(ROOT, \"operons\");\nexport const SKILLS_DIR = join(ROOT, \"skills\");\nexport const TRASH_DIR = join(ROOT, \".trash\");\nexport const CONFIG_PATH = join(ROOT, \"config.json\");\n\nexport async function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nexport async function ensureLayout(): Promise<void> {\n await ensureDir(ROOT);\n await ensureDir(CANDIDATES_DIR);\n await ensureDir(OPERONS_DIR);\n await ensureDir(TRASH_DIR);\n}\n\nexport function candidateDir(slug: string): string {\n return join(CANDIDATES_DIR, slug);\n}\n\nexport function operonDir(slug: string): string {\n return join(OPERONS_DIR, slug);\n}\n\nexport function skillFile(workspaceSlug: string, slug: string): string {\n return join(SKILLS_DIR, workspaceSlug, slug, \"SKILL.md\");\n}\n\nexport function trashDir(undoId: string): string {\n return join(TRASH_DIR, undoId);\n}\n","// `operon doctor` — sanity-check the install and local data layout.\n\nimport { stat } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { ADAPTERS } from \"../ingestion/index.js\";\nimport type { SourceName } from \"../ingestion/index.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport {\n renderDoctorReport,\n type DoctorReport,\n type LayoutCheck,\n type SourceCheck,\n} from \"../render/doctor-report.js\";\nimport { readConfig } from \"../store/config.js\";\nimport {\n CANDIDATES_DIR,\n OPERONS_DIR,\n ROOT,\n ensureLayout,\n} from \"../store/paths.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nconst optsSchema = z.object({\n fix: z.boolean().default(false),\n});\n\nexport function doctorCommand(): Command {\n return new Command(\"doctor\")\n .description(\"Sanity-check the install and local data layout.\")\n .option(\"--fix\", \"Attempt to repair config / permissions issues\", false)\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n if (opts.fix) await ensureLayout();\n\n const sources: SourceCheck[] = [];\n for (const [name, adapter] of Object.entries(ADAPTERS)) {\n if (adapter === undefined) {\n sources.push({\n name: name as SourceName,\n present: false,\n reason: \"not enabled in v0\",\n });\n continue;\n }\n const detect = await adapter.detect();\n const result: SourceCheck = {\n name: name as SourceName,\n present: detect.present,\n };\n if (detect.reason !== undefined) result.reason = detect.reason;\n sources.push(result);\n }\n\n const layout: LayoutCheck[] = [];\n for (const path of [ROOT, CANDIDATES_DIR, OPERONS_DIR]) {\n try {\n const s = await stat(path);\n layout.push({\n path,\n ok: s.isDirectory(),\n detail: s.isDirectory() ? \"ok\" : \"not a directory\",\n });\n } catch {\n layout.push({\n path,\n ok: false,\n detail: \"missing — run `operon doctor --fix`\",\n });\n }\n }\n\n const config = await readConfig();\n const report: DoctorReport = {\n sources,\n layout,\n telemetry: {\n anonStats: config.telemetry.anonStats,\n patternHashes: config.telemetry.patternHashes,\n },\n cliVersion: CLI_VERSION,\n };\n\n if (getGlobals().json) {\n log.json(report);\n process.exit(EXIT.ok);\n }\n log.info(renderDoctorReport(report));\n const allOk = sources.some((s) => s.present) && layout.every((l) => l.ok);\n process.exit(allOk ? EXIT.ok : EXIT.config);\n });\n}\n","// Claude Code adapter.\n//\n// Layout: ~/.claude/projects/<project-hash>/<session-uuid>.jsonl.\n// Each .jsonl is one session. Lines are mixed-shape JSON objects\n// keyed by `type`: user / assistant / system / permission-mode /\n// attachment / file-history-snapshot / queue-operation / etc.\n//\n// Schema is undocumented and version-dependent. We are tolerant:\n// we extract what we recognize, ignore what we don't, and never\n// throw on a malformed line — the corrupt-line error is logged but\n// the session keeps building.\n\nimport { readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type { NormalizedSession } from \"@operon/mining\";\nimport { readJsonl } from \"./jsonl.js\";\nimport {\n aggregateToolCalls,\n durationSec,\n fileTouchesFromPaths,\n isAfter,\n safeDate,\n} from \"./normalize.js\";\nimport type {\n DetectResult,\n EnumerateOpts,\n RawSession,\n SourceAdapter,\n} from \"./types.js\";\n\nconst ROOT = join(homedir(), \".claude\", \"projects\");\n\n// Internal tool names that mutate the working tree. Matching the\n// runtime's published tool set 2026-Q2.\nconst FILE_TOUCH_TOOLS = new Set([\n \"Edit\",\n \"Write\",\n \"MultiEdit\",\n \"NotebookEdit\",\n]);\n\ntype CCLine = {\n type?: string;\n message?: {\n role?: string;\n content?:\n | string\n | { type: string; text?: string; name?: string; input?: unknown }[];\n model?: string;\n };\n cwd?: string;\n timestamp?: string;\n sessionId?: string;\n uuid?: string;\n gitBranch?: string;\n};\n\nexport const claudeCodeAdapter: SourceAdapter = {\n name: \"claude-code\",\n\n async detect(): Promise<DetectResult> {\n try {\n const s = await stat(ROOT);\n if (!s.isDirectory()) {\n return { present: false, reason: `${ROOT} is not a directory` };\n }\n return { present: true };\n } catch {\n return { present: false, reason: `${ROOT} not found` };\n }\n },\n\n async *enumerate(opts: EnumerateOpts): AsyncIterable<RawSession> {\n let projects: string[];\n try {\n projects = await readdir(ROOT);\n } catch {\n return;\n }\n let yielded = 0;\n for (const project of projects) {\n const projectDir = join(ROOT, project);\n let entries: string[];\n try {\n entries = await readdir(projectDir);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.endsWith(\".jsonl\")) continue;\n const path = join(projectDir, entry);\n let mtime: Date | undefined;\n try {\n const s = await stat(path);\n mtime = s.mtime;\n } catch {\n continue;\n }\n if (!isAfter(mtime, opts.since)) continue;\n if (opts.cwdFilter !== undefined && opts.cwdFilter.length > 0) {\n // We can't know the session's cwd without reading at least\n // one line; defer the filter to normalize() and keep the\n // file in the candidate stream.\n }\n yield {\n source: \"claude-code\",\n path,\n rawId: basename(entry, \".jsonl\"),\n records: readJsonl(path, {\n onError: (ln, _raw, e) => {\n process.stderr.write(\n `! claude-code: ${path}:${ln} ${e.message}\\n`\n );\n },\n }),\n };\n yielded += 1;\n if (opts.limit !== undefined && yielded >= opts.limit) return;\n }\n }\n },\n\n async normalize(raw: RawSession): Promise<NormalizedSession> {\n const messages: NormalizedSession[\"messages\"] = [];\n const toolCalls: { name: string; arity: number }[] = [];\n const filePaths: string[] = [];\n const modelHints = new Set<string>();\n let cwd: string | undefined;\n let firstTs: Date | undefined;\n let lastTs: Date | undefined;\n\n for await (const record of raw.records) {\n const line = record as CCLine;\n const ts = safeDate(line.timestamp);\n if (ts !== undefined) {\n if (firstTs === undefined || ts < firstTs) firstTs = ts;\n if (lastTs === undefined || ts > lastTs) lastTs = ts;\n }\n if (line.cwd !== undefined && cwd === undefined) cwd = line.cwd;\n\n if (line.type === \"user\" || line.type === \"assistant\") {\n const role = line.message?.role ?? line.type;\n if (line.message?.model !== undefined) {\n modelHints.add(line.message.model);\n }\n const content = line.message?.content;\n if (typeof content === \"string\") {\n messages.push({ role, content });\n } else if (Array.isArray(content)) {\n // Block-style content. Concatenate text + thinking blocks\n // into a single string for downstream featurization, and\n // record tool_use blocks separately.\n const textParts: string[] = [];\n for (const block of content) {\n if (block.type === \"text\" && typeof block.text === \"string\") {\n textParts.push(block.text);\n } else if (\n block.type === \"thinking\" &&\n typeof block.text === \"string\"\n ) {\n textParts.push(block.text);\n } else if (\n block.type === \"tool_use\" &&\n typeof block.name === \"string\"\n ) {\n const arity =\n typeof block.input === \"object\" && block.input !== null\n ? Object.keys(block.input as Record<string, unknown>).length\n : 0;\n toolCalls.push({ name: block.name, arity });\n if (FILE_TOUCH_TOOLS.has(block.name)) {\n const filePath = extractFilePath(\n block.input as Record<string, unknown> | undefined\n );\n if (filePath !== undefined) filePaths.push(filePath);\n }\n }\n }\n if (textParts.length > 0) {\n messages.push({ role, content: textParts.join(\"\\n\") });\n }\n }\n }\n }\n\n const startedAt = firstTs ?? new Date(0);\n const endedAt = lastTs ?? startedAt;\n\n const session: NormalizedSession = {\n id: `claude-code:${raw.rawId}`,\n source: \"claude-code\",\n startedAt,\n endedAt,\n durationSec: durationSec(startedAt, endedAt),\n modelHints: [...modelHints],\n messages,\n toolCalls: aggregateToolCalls(toolCalls),\n fileTouches: fileTouchesFromPaths(filePaths),\n outcome: \"unknown\",\n };\n if (cwd !== undefined) session.cwd = cwd;\n return session;\n },\n};\n\n// Pull a likely path field out of a tool_use input. CC's edit tools\n// use `file_path` consistently; Write also; MultiEdit nests under\n// `file_path` at the top level. We accept any of {file_path, path,\n// notebook_path}.\nfunction extractFilePath(\n input: Record<string, unknown> | undefined\n): string | undefined {\n if (input === undefined) return undefined;\n for (const key of [\"file_path\", \"path\", \"notebook_path\"]) {\n const v = input[key];\n if (typeof v === \"string\" && v.length > 0) return v;\n }\n return undefined;\n}\n","// Resilient JSONL streamer. Emits one parsed record per line and\n// surfaces malformed lines as errors via an onError callback rather\n// than throwing — a single corrupt line in a 50MB session file\n// should never abort ingestion.\n\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\nexport type JsonlOpts = {\n // Skip empty lines silently. Default true.\n skipEmpty?: boolean;\n onError?: (lineNumber: number, raw: string, err: Error) => void;\n};\n\nexport async function* readJsonl(\n path: string,\n opts: JsonlOpts = {}\n): AsyncIterable<unknown> {\n const stream = createReadStream(path, { encoding: \"utf8\" });\n const rl = createInterface({\n input: stream,\n crlfDelay: Infinity,\n });\n let lineNumber = 0;\n for await (const raw of rl) {\n lineNumber += 1;\n if (raw.length === 0 && opts.skipEmpty !== false) continue;\n try {\n yield JSON.parse(raw);\n } catch (e) {\n opts.onError?.(lineNumber, raw, e as Error);\n // Continue — corrupt single line should not abort ingestion.\n }\n }\n}\n","// Cross-adapter helpers used by every adapter's normalize() body.\n\nimport { extname } from \"node:path\";\nimport type { NormalizedSession } from \"@operon/mining\";\n\nexport function fileExtension(p: string): string {\n const ext = extname(p);\n return ext.length > 0 && ext.length < 8 ? ext.toLowerCase() : \"<none>\";\n}\n\n// Build the file-touch histogram from a list of paths. Per the\n// mining pipeline (docs/03-mvp-mem-cli/05-pattern-detection.md), we\n// only need extensions + counts to fingerprint the path shape.\nexport function fileTouchesFromPaths(\n paths: Iterable<string>\n): NormalizedSession[\"fileTouches\"] {\n const counts = new Map<string, number>();\n for (const p of paths) {\n const ext = fileExtension(p);\n counts.set(ext, (counts.get(ext) ?? 0) + 1);\n }\n return [...counts.entries()].map(([extension, count]) => ({\n extension,\n count,\n }));\n}\n\n// Tool fingerprint for normalize-time aggregation. The mining\n// pipeline does its own structured fingerprinting later — this is\n// just for the pre-mining session shape.\nexport function aggregateToolCalls(\n calls: Iterable<{ name: string; arity?: number }>\n): NormalizedSession[\"toolCalls\"] {\n const sums = new Map<string, { name: string; arity: number; uses: number }>();\n for (const c of calls) {\n const key = c.name;\n const existing = sums.get(key) ?? { name: key, arity: 0, uses: 0 };\n existing.arity = Math.max(existing.arity, c.arity ?? 0);\n existing.uses += 1;\n sums.set(key, existing);\n }\n return [...sums.values()].map(({ name, arity, uses }) => ({\n name,\n arity,\n count: uses,\n }));\n}\n\nexport function safeDate(value: unknown): Date | undefined {\n if (typeof value !== \"string\" && typeof value !== \"number\") return undefined;\n const d = new Date(value);\n return Number.isFinite(d.getTime()) ? d : undefined;\n}\n\nexport function durationSec(start: Date, end: Date): number {\n return Math.max(0, Math.round((end.getTime() - start.getTime()) / 1000));\n}\n\n// Common \"is this session within --since cutoff?\" test, used by the\n// adapters' enumerate() to skip files quickly.\nexport function isAfter(\n d: Date | undefined,\n cutoff: Date | undefined\n): boolean {\n if (cutoff === undefined) return true;\n if (d === undefined) return true; // unknown date — keep it\n return d.getTime() >= cutoff.getTime();\n}\n","// Codex CLI adapter.\n//\n// Layout: ~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-<ts>-<uuid>.jsonl\n// Each .jsonl is one rollout (one session). Lines are tagged JSON\n// objects with `type` ∈ {session_meta, response_item, turn_context,\n// item_completed, token_count, ...}. The interesting payloads:\n//\n// session_meta → {payload: {id, cwd, cli_version, timestamp, ...}}\n// response_item → {payload: {type: \"message\"|\"function_call\"|...}}\n//\n// Codex uses OpenAI-style `function_call`s (not block-typed\n// tool_use). Tool name lives at payload.name; args at payload.arguments\n// (a string of JSON). `file_call` and `apply_patch` are the\n// equivalents of CC's Edit/Write — we match on tool name plus\n// presence of a path-shaped argument.\n\nimport { readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type { NormalizedSession } from \"@operon/mining\";\nimport { readJsonl } from \"./jsonl.js\";\nimport {\n aggregateToolCalls,\n durationSec,\n fileTouchesFromPaths,\n isAfter,\n safeDate,\n} from \"./normalize.js\";\nimport type {\n DetectResult,\n EnumerateOpts,\n RawSession,\n SourceAdapter,\n} from \"./types.js\";\n\nconst ROOT = join(homedir(), \".codex\", \"sessions\");\n\ntype CodexLine = {\n type?: string;\n timestamp?: string;\n payload?: {\n type?: string;\n id?: string;\n cwd?: string;\n timestamp?: string;\n cli_version?: string;\n role?: string;\n content?: string | { type?: string; text?: string }[];\n name?: string;\n arguments?: string;\n input?: string;\n model?: string;\n };\n};\n\nexport const codexAdapter: SourceAdapter = {\n name: \"codex\",\n\n async detect(): Promise<DetectResult> {\n try {\n const s = await stat(ROOT);\n if (!s.isDirectory()) {\n return { present: false, reason: `${ROOT} is not a directory` };\n }\n return { present: true };\n } catch {\n return { present: false, reason: `${ROOT} not found` };\n }\n },\n\n async *enumerate(opts: EnumerateOpts): AsyncIterable<RawSession> {\n let yielded = 0;\n for await (const path of walkJsonl(ROOT)) {\n let mtime: Date | undefined;\n try {\n const s = await stat(path);\n mtime = s.mtime;\n } catch {\n continue;\n }\n if (!isAfter(mtime, opts.since)) continue;\n const rawId = parseRawIdFromFilename(basename(path));\n yield {\n source: \"codex\",\n path,\n rawId,\n records: readJsonl(path, {\n onError: (ln, _raw, e) => {\n process.stderr.write(`! codex: ${path}:${ln} ${e.message}\\n`);\n },\n }),\n };\n yielded += 1;\n if (opts.limit !== undefined && yielded >= opts.limit) return;\n }\n },\n\n async normalize(raw: RawSession): Promise<NormalizedSession> {\n const messages: NormalizedSession[\"messages\"] = [];\n const toolCalls: { name: string; arity: number }[] = [];\n const filePaths: string[] = [];\n const modelHints = new Set<string>();\n let cwd: string | undefined;\n let firstTs: Date | undefined;\n let lastTs: Date | undefined;\n\n for await (const record of raw.records) {\n const line = record as CodexLine;\n const ts = safeDate(line.timestamp) ?? safeDate(line.payload?.timestamp);\n if (ts !== undefined) {\n if (firstTs === undefined || ts < firstTs) firstTs = ts;\n if (lastTs === undefined || ts > lastTs) lastTs = ts;\n }\n\n if (line.type === \"session_meta\") {\n if (line.payload?.cwd !== undefined && cwd === undefined) {\n cwd = line.payload.cwd;\n }\n continue;\n }\n\n if (line.type !== \"response_item\") continue;\n const p = line.payload;\n if (p === undefined) continue;\n\n if (p.model !== undefined) modelHints.add(p.model);\n\n if (p.type === \"message\") {\n const role = p.role ?? \"assistant\";\n const content = p.content;\n if (typeof content === \"string\") {\n messages.push({ role, content });\n } else if (Array.isArray(content)) {\n const textParts: string[] = [];\n for (const block of content) {\n if (typeof block.text === \"string\") textParts.push(block.text);\n }\n if (textParts.length > 0) {\n messages.push({ role, content: textParts.join(\"\\n\") });\n }\n }\n } else if (p.type === \"function_call\") {\n if (typeof p.name !== \"string\") continue;\n const args = parseArguments(p.arguments);\n const arity = args !== undefined ? Object.keys(args).length : 0;\n toolCalls.push({ name: p.name, arity });\n const filePath = extractFilePath(args);\n if (filePath !== undefined) filePaths.push(filePath);\n } else if (p.type === \"custom_tool_call\") {\n if (typeof p.name !== \"string\") continue;\n // custom_tool_call uses `input` as a raw string (e.g. the\n // apply_patch v4a payload). Arity is unknown — count is 1.\n toolCalls.push({ name: p.name, arity: 1 });\n const filePath = extractFilePathFromPatch(p.input);\n if (filePath !== undefined) filePaths.push(filePath);\n }\n }\n\n const startedAt = firstTs ?? new Date(0);\n const endedAt = lastTs ?? startedAt;\n\n const session: NormalizedSession = {\n id: `codex:${raw.rawId}`,\n source: \"codex\",\n startedAt,\n endedAt,\n durationSec: durationSec(startedAt, endedAt),\n modelHints: [...modelHints],\n messages,\n toolCalls: aggregateToolCalls(toolCalls),\n fileTouches: fileTouchesFromPaths(filePaths),\n outcome: \"unknown\",\n };\n if (cwd !== undefined) session.cwd = cwd;\n return session;\n },\n};\n\nasync function* walkJsonl(dir: string): AsyncIterable<string> {\n let entries: {\n name: string;\n isDirectory: () => boolean;\n isFile: () => boolean;\n }[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const p = join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkJsonl(p);\n } else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n yield p;\n }\n }\n}\n\n// Filename shape: rollout-<iso-ts>-<uuid>.jsonl. We pull the uuid\n// trailing segment as the raw session id.\nfunction parseRawIdFromFilename(name: string): string {\n const stem = name.replace(/\\.jsonl$/, \"\");\n const m = /-([0-9a-f-]{36})$/.exec(stem);\n return m?.[1] ?? stem;\n}\n\nfunction parseArguments(\n s: string | undefined\n): Record<string, unknown> | undefined {\n if (typeof s !== \"string\" || s.length === 0) return undefined;\n try {\n const parsed: unknown = JSON.parse(s);\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n /* ignore — codex sometimes streams partial args */\n }\n return undefined;\n}\n\nfunction extractFilePath(\n input: Record<string, unknown> | undefined\n): string | undefined {\n if (input === undefined) return undefined;\n for (const key of [\"path\", \"file_path\", \"filename\"]) {\n const v = input[key];\n if (typeof v === \"string\" && v.length > 0) return v;\n }\n return undefined;\n}\n\n// apply_patch (custom_tool_call) puts paths inside the v4a patch\n// envelope. We pull *every* file the patch touches.\nfunction extractFilePathFromPatch(\n input: string | undefined\n): string | undefined {\n if (typeof input !== \"string\") return undefined;\n const m = /\\*\\*\\* (?:Update|Add|Delete) File: (.+)$/m.exec(input);\n return m?.[1] ?? undefined;\n}\n","// Cursor adapter.\n//\n// Cursor persists workspace chat state in VS Code-style SQLite\n// databases:\n// ~/Library/Application Support/Cursor/User/workspaceStorage/<id>/state.vscdb\n//\n// The transcript payload is JSON in ItemTable under\n// `workbench.panel.aichat.view.aichat.chatdata`. Cursor's schema is\n// private and versioned, so this adapter is intentionally tolerant:\n// it reads only recognized fields, opens databases read-only, and\n// treats each chat tab as one session.\n\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { NormalizedSession } from \"@operon/mining\";\nimport {\n aggregateToolCalls,\n durationSec,\n fileTouchesFromPaths,\n isAfter,\n} from \"./normalize.js\";\nimport type {\n DetectResult,\n EnumerateOpts,\n RawSession,\n SourceAdapter,\n} from \"./types.js\";\n\nconst ROOTS = cursorWorkspaceStorageRoots();\nconst CHATDATA_KEY = \"workbench.panel.aichat.view.aichat.chatdata\";\n\nconst require = createRequire(import.meta.url);\n\ntype SqliteRow = { value?: unknown };\ntype SqliteStatement = {\n get(...args: unknown[]): SqliteRow | undefined;\n};\ntype SqliteDatabase = {\n prepare(sql: string): SqliteStatement;\n close(): void;\n};\ntype SqliteModule = {\n DatabaseSync: new (\n filename: string,\n options?: { readOnly?: boolean }\n ) => SqliteDatabase;\n};\n\ntype CursorChatData = {\n tabs?: CursorTab[];\n};\n\ntype CursorTab = {\n tabId?: string;\n chatTitle?: string;\n bubbles?: CursorBubble[];\n};\n\ntype CursorBubble = {\n type?: string;\n messageType?: number;\n rawText?: string;\n initText?: string;\n text?: string;\n aiType?: string;\n modelType?: string;\n contextCacheTimestamp?: number;\n selections?: CursorSelection[];\n fileSelections?: CursorSelection[];\n};\n\ntype CursorSelection = {\n uri?: { fsPath?: string; path?: string; scheme?: string };\n};\n\ntype CursorRawRecord = {\n tab: CursorTab;\n cwd?: string;\n dbMtimeMs: number;\n};\n\nexport const cursorAdapter: SourceAdapter = {\n name: \"cursor\",\n\n async detect(): Promise<DetectResult> {\n if (loadSqlite() === undefined) {\n return { present: false, reason: \"node:sqlite unavailable\" };\n }\n for (const root of ROOTS) {\n try {\n const s = await stat(root);\n if (s.isDirectory()) return { present: true };\n } catch {\n // Try the next platform-specific Cursor location.\n }\n }\n return { present: false, reason: `${ROOTS.join(\", \")} not found` };\n },\n\n async *enumerate(opts: EnumerateOpts): AsyncIterable<RawSession> {\n const sqlite = loadSqlite();\n if (sqlite === undefined) return;\n\n let yielded = 0;\n for (const root of ROOTS) {\n let entries: {\n name: string;\n isDirectory: () => boolean;\n }[];\n try {\n entries = await readdir(root, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const storageDir = join(root, entry.name);\n const dbPath = join(storageDir, \"state.vscdb\");\n let dbMtime: Date;\n try {\n dbMtime = (await stat(dbPath)).mtime;\n } catch {\n continue;\n }\n if (!isAfter(dbMtime, opts.since)) continue;\n\n const chatData = readChatData(sqlite, dbPath);\n if (chatData === undefined) continue;\n const cwd = await readWorkspaceFolder(storageDir);\n const tabs = Array.isArray(chatData.tabs) ? chatData.tabs : [];\n for (const tab of tabs) {\n const startedAt = tabStartedAt(tab, dbMtime);\n if (!isAfter(startedAt, opts.since)) continue;\n const tabId =\n typeof tab.tabId === \"string\" && tab.tabId.length > 0\n ? tab.tabId\n : String(yielded);\n yield {\n source: \"cursor\",\n path: dbPath,\n rawId: `${basename(storageDir)}:${tabId}`,\n records: fromArray([{ tab, cwd, dbMtimeMs: dbMtime.getTime() }]),\n };\n yielded += 1;\n if (opts.limit !== undefined && yielded >= opts.limit) return;\n }\n }\n }\n },\n\n async normalize(raw: RawSession): Promise<NormalizedSession> {\n const messages: NormalizedSession[\"messages\"] = [];\n const toolCalls: { name: string; arity: number }[] = [];\n const filePaths: string[] = [];\n const modelHints = new Set<string>();\n let cwd: string | undefined;\n let firstTs: Date | undefined;\n let lastTs: Date | undefined;\n let fallbackTs = new Date(0);\n\n for await (const record of raw.records) {\n const cursorRecord = record as CursorRawRecord;\n if (cursorRecord.cwd !== undefined && cwd === undefined) {\n cwd = cursorRecord.cwd;\n }\n fallbackTs = new Date(cursorRecord.dbMtimeMs);\n\n for (const bubble of cursorRecord.tab.bubbles ?? []) {\n const ts = timestampFromBubble(bubble);\n if (ts !== undefined) {\n if (firstTs === undefined || ts < firstTs) firstTs = ts;\n if (lastTs === undefined || ts > lastTs) lastTs = ts;\n }\n\n const content = bubbleText(bubble);\n const role = roleFromBubble(bubble);\n if (role !== undefined && content !== undefined) {\n messages.push({ role, content });\n }\n\n if (typeof bubble.modelType === \"string\") {\n modelHints.add(bubble.modelType);\n }\n if (bubble.type === \"ai\" || bubble.messageType === 3) {\n // Cursor's stored chat payload does not expose individual\n // tool calls. Count assistant turns as source-specific work\n // so multi-turn Cursor sessions are not dropped as \"no-work\".\n toolCalls.push({ name: \"CursorChat\", arity: 1 });\n }\n for (const path of selectionPaths(bubble)) {\n filePaths.push(path);\n }\n }\n }\n\n const startedAt = firstTs ?? fallbackTs;\n const endedAt = lastTs ?? startedAt;\n const session: NormalizedSession = {\n id: `cursor:${raw.rawId}`,\n source: \"cursor\",\n startedAt,\n endedAt,\n durationSec: durationSec(startedAt, endedAt),\n modelHints: [...modelHints],\n messages,\n toolCalls: aggregateToolCalls(toolCalls),\n fileTouches: fileTouchesFromPaths(filePaths),\n outcome: \"unknown\",\n };\n if (cwd !== undefined) session.cwd = cwd;\n return session;\n },\n};\n\nfunction loadSqlite(): SqliteModule | undefined {\n try {\n return require(\"node:sqlite\") as SqliteModule;\n } catch {\n return undefined;\n }\n}\n\nfunction cursorWorkspaceStorageRoots(): string[] {\n if (process.platform === \"darwin\") {\n return [\n join(\n homedir(),\n \"Library\",\n \"Application Support\",\n \"Cursor\",\n \"User\",\n \"workspaceStorage\"\n ),\n ];\n }\n if (process.platform === \"win32\" && process.env.APPDATA !== undefined) {\n return [join(process.env.APPDATA, \"Cursor\", \"User\", \"workspaceStorage\")];\n }\n return [join(homedir(), \".config\", \"Cursor\", \"User\", \"workspaceStorage\")];\n}\n\nfunction readChatData(\n sqlite: SqliteModule,\n dbPath: string\n): CursorChatData | undefined {\n let db: SqliteDatabase | undefined;\n try {\n db = new sqlite.DatabaseSync(dbPath, { readOnly: true });\n const row = db\n .prepare(\"select value from ItemTable where key = ?\")\n .get(CHATDATA_KEY);\n if (typeof row?.value !== \"string\") return undefined;\n const parsed: unknown = JSON.parse(row.value);\n if (typeof parsed !== \"object\" || parsed === null) return undefined;\n return parsed as CursorChatData;\n } catch {\n return undefined;\n } finally {\n db?.close();\n }\n}\n\nasync function readWorkspaceFolder(\n storageDir: string\n): Promise<string | undefined> {\n try {\n const raw = await readFile(join(storageDir, \"workspace.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as { folder?: unknown; workspace?: unknown };\n const folder =\n typeof parsed.folder === \"string\"\n ? parsed.folder\n : typeof parsed.workspace === \"string\"\n ? parsed.workspace\n : undefined;\n if (folder === undefined) return undefined;\n if (folder.startsWith(\"file:\")) return fileURLToPath(folder);\n return folder;\n } catch {\n return undefined;\n }\n}\n\nfunction tabStartedAt(tab: CursorTab, fallback: Date): Date {\n const timestamps = (tab.bubbles ?? [])\n .map(timestampFromBubble)\n .filter((d): d is Date => d !== undefined)\n .sort((a, b) => a.getTime() - b.getTime());\n return timestamps[0] ?? fallback;\n}\n\nfunction timestampFromBubble(bubble: CursorBubble): Date | undefined {\n if (\n typeof bubble.contextCacheTimestamp !== \"number\" ||\n !Number.isFinite(bubble.contextCacheTimestamp)\n ) {\n return undefined;\n }\n return new Date(bubble.contextCacheTimestamp);\n}\n\nfunction roleFromBubble(bubble: CursorBubble): string | undefined {\n if (bubble.type === \"user\" || bubble.messageType === 2) return \"user\";\n if (bubble.type === \"ai\" || bubble.messageType === 3) return \"assistant\";\n return undefined;\n}\n\nfunction bubbleText(bubble: CursorBubble): string | undefined {\n for (const value of [bubble.rawText, bubble.initText, bubble.text]) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction selectionPaths(bubble: CursorBubble): string[] {\n const paths: string[] = [];\n for (const selection of [\n ...(bubble.selections ?? []),\n ...(bubble.fileSelections ?? []),\n ]) {\n const uri = selection.uri;\n if (uri === undefined) continue;\n if (typeof uri.fsPath === \"string\" && uri.fsPath.length > 0) {\n paths.push(uri.fsPath);\n } else if (uri.scheme === \"file\" && typeof uri.path === \"string\") {\n paths.push(uri.path);\n }\n }\n return paths;\n}\n\nasync function* fromArray<T>(items: T[]): AsyncIterable<T> {\n for (const item of items) yield item;\n}\n","// Secrets redactor. Runs as the very last step before any session\n// content is written to disk under ~/.operon/. See\n// docs/03-mvp-mem-cli/04-ingestion-sources.md → \"Secrets redaction\".\n//\n// Replaces matches with `[REDACTED:<kind>]` so the operon mining\n// pipeline can still reason about what kind of value was there\n// without leaking the value itself.\n\nimport type { NormalizedSession } from \"@operon/mining\";\n\ntype Matcher = { kind: string; re: RegExp };\n\n// Order matters: more specific patterns first so the entropy\n// heuristic doesn't swallow a structured token.\nconst BUILTIN: Matcher[] = [\n { kind: \"stripe\", re: /sk_(live|test)_[A-Za-z0-9]{24,}/g },\n { kind: \"github\", re: /\\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\\b/g },\n { kind: \"aws\", re: /\\bAKIA[0-9A-Z]{16}\\b/g },\n {\n kind: \"jwt\",\n re: /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g,\n },\n { kind: \"openai\", re: /\\bsk-[A-Za-z0-9]{32,}\\b/g },\n { kind: \"anthropic\", re: /\\bsk-ant-[A-Za-z0-9-]{32,}\\b/g },\n {\n kind: \"email\",\n re: /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n },\n];\n\n// High-entropy heuristic: 40+ chars of base64url-shaped text with\n// at least 6 non-alpha characters. Catches generic bearer tokens\n// the structured matchers miss without flagging code/words.\nconst ENTROPY_RE = /\\b[A-Za-z0-9_+\\/=-]{40,}\\b/g;\n\nexport type RedactConfig = {\n // User patterns from ~/.operon/config.toml (string sources are\n // compiled to RegExp here so the pipeline can be fed inert\n // config types).\n userPatterns?: { kind: string; re: RegExp }[];\n redactEmails?: boolean;\n};\n\nexport function redactString(s: string, cfg: RedactConfig = {}): string {\n if (s.length === 0) return s;\n let out = s;\n for (const { kind, re } of BUILTIN) {\n if (kind === \"email\" && cfg.redactEmails === false) continue;\n out = out.replace(re, `[REDACTED:${kind}]`);\n }\n for (const { kind, re } of cfg.userPatterns ?? []) {\n out = out.replace(re, `[REDACTED:${kind}]`);\n }\n out = out.replace(ENTROPY_RE, (m) =>\n isEntropyHit(m) ? `[REDACTED:high-entropy]` : m\n );\n return out;\n}\n\nfunction isEntropyHit(m: string): boolean {\n // Cheap tie-breaker: require at least one digit AND mixed case OR\n // a high-entropy character class. Words pass the length check but\n // fail this — \"abcdefghijklmnopqrstuvwxyzabcdefghij\" is 36 chars\n // with no digits.\n let hasDigit = false;\n let hasUpper = false;\n let hasLower = false;\n let hasSymbol = false;\n for (const c of m) {\n if (c >= \"0\" && c <= \"9\") hasDigit = true;\n else if (c >= \"A\" && c <= \"Z\") hasUpper = true;\n else if (c >= \"a\" && c <= \"z\") hasLower = true;\n else hasSymbol = true;\n }\n const classes =\n Number(hasDigit) + Number(hasUpper) + Number(hasLower) + Number(hasSymbol);\n return classes >= 3;\n}\n\nexport function redactSession(\n session: NormalizedSession,\n cfg: RedactConfig = {}\n): NormalizedSession {\n return {\n ...session,\n messages: session.messages.map((m) => ({\n ...m,\n content: redactString(m.content, cfg),\n })),\n };\n}\n","// Adapter registry. Source name → adapter. Adding a new adapter\n// is one entry here plus the implementation file.\n\nimport { claudeCodeAdapter } from \"./claude-code.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { cursorAdapter } from \"./cursor.js\";\nimport type { SourceAdapter, SourceName } from \"./types.js\";\n\nexport const ADAPTERS: Record<SourceName, SourceAdapter | undefined> = {\n \"claude-code\": claudeCodeAdapter,\n codex: codexAdapter,\n cursor: cursorAdapter,\n // ChatGPT is exploratory and not wired here.\n chatgpt: undefined,\n};\n\nexport function getAdapter(name: SourceName): SourceAdapter | undefined {\n return ADAPTERS[name];\n}\n\nexport function activeAdapters(): SourceAdapter[] {\n return Object.values(ADAPTERS).filter(\n (a): a is SourceAdapter => a !== undefined\n );\n}\n\nexport type {\n SourceAdapter,\n SourceName,\n RawSession,\n EnumerateOpts,\n} from \"./types.js\";\nexport { redactSession, redactString } from \"./redact.js\";\n","// Doctor report: source detection + ~/.operon/ layout health +\n// telemetry status. Shaped per docs/03-mvp-mem-cli/03-cli-surface.md.\n\nimport chalk from \"chalk\";\nimport { getGlobals } from \"../lib/globals.js\";\n\nexport type SourceCheck = {\n name: string;\n present: boolean;\n reason?: string;\n};\n\nexport type LayoutCheck = {\n path: string;\n ok: boolean;\n detail?: string;\n};\n\nexport type DoctorReport = {\n sources: SourceCheck[];\n layout: LayoutCheck[];\n telemetry: {\n anonStats: boolean;\n patternHashes: boolean;\n };\n cliVersion: string;\n};\n\nexport function renderDoctorReport(r: DoctorReport): string {\n const colored = !getGlobals().noColor;\n const ok = (s: string): string => (colored ? chalk.green(s) : s);\n const bad = (s: string): string => (colored ? chalk.red(s) : s);\n const dim = (s: string): string => (colored ? chalk.dim(s) : s);\n\n const lines: string[] = [];\n lines.push(\"Sources detected:\");\n for (const s of r.sources) {\n const mark = s.present ? ok(\"✓\") : bad(\"✗\");\n const reason = s.reason !== undefined ? dim(` ${s.reason}`) : \"\";\n lines.push(` ${mark} ${s.name}${reason}`);\n }\n lines.push(\"\");\n lines.push(\"Local layout:\");\n for (const l of r.layout) {\n const mark = l.ok ? ok(\"✓\") : bad(\"✗\");\n const detail = l.detail !== undefined ? dim(` ${l.detail}`) : \"\";\n lines.push(` ${mark} ${l.path}${detail}`);\n }\n lines.push(\"\");\n lines.push(\"Telemetry:\");\n lines.push(\n ` anon-stats: ${r.telemetry.anonStats ? ok(\"opt-in\") : dim(\"disabled\")}`\n );\n lines.push(\n ` pattern-hashes: ${\n r.telemetry.patternHashes ? ok(\"opt-in\") : dim(\"disabled\")\n }`\n );\n lines.push(\"\");\n lines.push(`Operon CLI v${r.cliVersion}`);\n return lines.join(\"\\n\");\n}\n","import { readFileSync } from \"node:fs\";\n\nexport const CLI_VERSION = readCliVersion();\n\nfunction readCliVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\"\n ? packageJson.version\n : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n","// `operon install <workspace>/<slug>` - download a published SKILL.md from the\n// Operon platform, verify it, cache it, and install native local skill files.\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { recordRun, RecordRunError } from \"../lib/runs.js\";\nimport { readConfig } from \"../store/config.js\";\nimport { skillFile } from \"../store/paths.js\";\n\nconst slugSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/);\n\nconst workspaceSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/);\n\nconst installRefSchema = z\n .string()\n .min(1)\n .max(129)\n .regex(/^[a-z0-9-]+(?:\\/[a-z0-9-]+)?$/);\n\nconst optsSchema = z.object({\n workspace: workspaceSchema.optional(),\n semver: z\n .string()\n .min(1)\n .max(64)\n .regex(/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/)\n .optional(),\n target: z.enum([\"all\", \"claude\", \"codex\"]).default(\"all\"),\n force: z.boolean().default(false),\n json: z.boolean().default(false),\n apiBase: z.string().url().optional(),\n});\n\nconst installResponseSchema = z.object({\n workspace: z.object({\n slug: z.string(),\n name: z.string(),\n }),\n operon: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n visibility: z.string(),\n tags: z.array(z.string()),\n }),\n version: z.object({\n semver: z.string(),\n contentHash: z.string().regex(/^[a-f0-9]{64}$/i),\n publishStatus: z.string(),\n evalStatus: z.string(),\n createdAt: z.string(),\n changelog: z.string().nullable(),\n }),\n skillUrl: z.string().url(),\n runRecorded: z.boolean().optional(),\n});\n\ntype InstallResponse = z.infer<typeof installResponseSchema>;\ntype InstallTarget = \"cache\" | \"claude\" | \"codex\";\ntype WritePlan = {\n target: InstallTarget;\n path: string;\n status: \"installed\" | \"already-installed\" | \"overwritten\";\n};\n\nexport function installCommand(): Command {\n return new Command(\"install\")\n .argument(\"<workspace/slug>\", \"Operon to install, e.g. acme/review-pr\")\n .description(\"Install an operon's SKILL.md into Claude Code and Codex.\")\n .option(\"--workspace <slug>\", \"Workspace slug for scriptable install form\")\n .option(\"--semver <x.y.z>\", \"Version to install; defaults to current\")\n .option(\"--target <target>\", \"all | claude | codex (default: all)\", \"all\")\n .option(\"--force\", \"Overwrite existing different local skill files\", false)\n .option(\"--json\", \"Machine-readable JSON output\", false)\n .option(\"--api-base <url>\", \"Override platform base URL\")\n .action(async (refArg: string, rawOpts: unknown) => {\n const ref = installRefSchema.parse(refArg);\n const opts = optsSchema.parse(rawOpts);\n const config = await readConfig();\n const parsed = parseInstallRef(ref, opts.workspace);\n const workspaceSlug = parsed.workspace ?? config.platform.workspaceSlug;\n if (workspaceSlug === undefined || workspaceSlug.length === 0) {\n log.err(\n \"missing workspace. Use operon install <workspace>/<slug> or pass --workspace.\"\n );\n process.exit(EXIT.config);\n return;\n }\n\n const apiBase = (\n opts.apiBase ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n const token = config.platform.accessToken;\n const startedAt = new Date();\n\n const metadata = await fetchMetadata({\n apiBase,\n workspaceSlug,\n slug: parsed.slug,\n semver: opts.semver,\n token,\n });\n if (metadata === undefined) return;\n\n const skillBody = await fetchSkill(metadata.skillUrl);\n if (skillBody === undefined) return;\n\n const actualHash = sha256Hex(skillBody);\n const expectedHash = metadata.version.contentHash.toLowerCase();\n if (actualHash !== expectedHash) {\n log.err(\n `content hash mismatch: expected ${expectedHash}, got ${actualHash}`\n );\n process.exit(EXIT.err);\n return;\n }\n\n const plans = await buildWritePlans({\n workspaceSlug: metadata.workspace.slug,\n slug: metadata.operon.slug,\n body: skillBody,\n target: opts.target,\n force: opts.force,\n });\n if (plans === undefined) return;\n\n for (const plan of plans) {\n await mkdir(dirname(plan.path), { recursive: true });\n if (plan.status !== \"already-installed\") {\n await writeFile(plan.path, skillBody, \"utf8\");\n }\n }\n\n let runRecorded = metadata.runRecorded === true;\n if (token !== undefined && token.length > 0) {\n const finishedAt = new Date();\n try {\n await recordRun({\n workspaceSlug: metadata.workspace.slug,\n operonSlug: metadata.operon.slug,\n semver: metadata.version.semver,\n invocationSource: \"cli\",\n status: \"succeeded\",\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: Math.max(0, finishedAt.getTime() - startedAt.getTime()),\n inputHash: expectedHash,\n apiBase,\n token,\n });\n runRecorded = true;\n } catch (e) {\n if (e instanceof RecordRunError) {\n log.err(e.message);\n process.exit(e.exitCode);\n return;\n }\n log.err(`could not record run: ${(e as Error).message}`);\n process.exit(EXIT.err);\n return;\n }\n } else if (!runRecorded) {\n log.warn(\n \"not signed in; installed public operon without recording a run\"\n );\n }\n\n const json = {\n workspace: metadata.workspace.slug,\n slug: metadata.operon.slug,\n semver: metadata.version.semver,\n contentHash: expectedHash,\n runRecorded,\n targets: plans,\n };\n if (getGlobals().json || opts.json) {\n log.json(json);\n } else {\n log.step(\n `installed ${metadata.workspace.slug}/${metadata.operon.slug}@${metadata.version.semver}`\n );\n for (const plan of plans) {\n log.info(` ${plan.target}: ${plan.status} ${plan.path}`);\n }\n if (runRecorded) log.info(\" run recorded\");\n }\n process.exit(EXIT.ok);\n });\n}\n\nfunction parseInstallRef(\n ref: string,\n workspaceOpt: string | undefined\n): { workspace?: string; slug: string } {\n const parts = ref.split(\"/\");\n if (parts.length === 2) {\n const workspace = workspaceSchema.parse(parts[0]);\n const slug = slugSchema.parse(parts[1]);\n if (workspaceOpt !== undefined && workspaceOpt !== workspace) {\n log.err(\n `workspace mismatch: ref uses \"${workspace}\" but --workspace is \"${workspaceOpt}\"`\n );\n process.exit(EXIT.config);\n }\n return { workspace, slug };\n }\n return {\n ...(workspaceOpt !== undefined ? { workspace: workspaceOpt } : {}),\n slug: slugSchema.parse(ref),\n };\n}\n\nasync function buildWritePlans(input: {\n workspaceSlug: string;\n slug: string;\n body: string;\n target: \"all\" | \"claude\" | \"codex\";\n force: boolean;\n}): Promise<WritePlan[] | undefined> {\n const paths: WritePlan[] = [\n {\n target: \"cache\",\n path: skillFile(input.workspaceSlug, input.slug),\n status: \"installed\",\n },\n ];\n if (input.target === \"all\" || input.target === \"claude\") {\n paths.push({\n target: \"claude\",\n path: join(homedir(), \".claude\", \"skills\", input.slug, \"SKILL.md\"),\n status: \"installed\",\n });\n }\n if (input.target === \"all\" || input.target === \"codex\") {\n paths.push({\n target: \"codex\",\n path: join(\n process.env.CODEX_HOME ?? join(homedir(), \".codex\"),\n \"skills\",\n input.slug,\n \"SKILL.md\"\n ),\n status: \"installed\",\n });\n }\n\n const conflicts: string[] = [];\n for (const item of paths) {\n const existing = await readExisting(item.path);\n if (existing === undefined) continue;\n if (existing === input.body) {\n item.status = \"already-installed\";\n continue;\n }\n if (item.target === \"cache\" || input.force) {\n item.status = \"overwritten\";\n continue;\n }\n conflicts.push(`${item.target}: ${item.path}`);\n }\n\n if (conflicts.length > 0) {\n log.err(\n `local skill already exists with different content. Re-run with --force to overwrite:\\n${conflicts\n .map((p) => ` ${p}`)\n .join(\"\\n\")}`\n );\n process.exit(EXIT.err);\n return undefined;\n }\n\n return paths;\n}\n\nasync function readExisting(path: string): Promise<string | undefined> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function fetchMetadata(input: {\n apiBase: string;\n workspaceSlug: string;\n slug: string;\n semver: string | undefined;\n token: string | undefined;\n}): Promise<InstallResponse | undefined> {\n const params = new URLSearchParams();\n if (input.semver !== undefined) params.set(\"semver\", input.semver);\n const query = params.size > 0 ? `?${params.toString()}` : \"\";\n const url = `${input.apiBase}/api/v1/workspaces/${input.workspaceSlug}/operons/${input.slug}${query}`;\n\n let res: Response;\n try {\n const headers: Record<string, string> = { \"x-operon-source\": \"cli\" };\n if (input.token !== undefined && input.token.length > 0) {\n headers.authorization = `Bearer ${input.token}`;\n }\n res = await fetch(url, { headers });\n } catch (e) {\n log.err(`network error: ${(e as Error).message}`);\n process.exit(EXIT.network);\n return undefined;\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n log.err(`server returned ${res.status}: ${body.slice(0, 400)}`);\n process.exit(res.status === 401 ? EXIT.auth : EXIT.err);\n return undefined;\n }\n\n try {\n return installResponseSchema.parse(await res.json());\n } catch (e) {\n log.err(`invalid server response: ${(e as Error).message}`);\n process.exit(EXIT.err);\n return undefined;\n }\n}\n\nasync function fetchSkill(skillUrl: string): Promise<string | undefined> {\n let res: Response;\n try {\n res = await fetch(skillUrl);\n } catch (e) {\n log.err(`skill download failed: ${(e as Error).message}`);\n process.exit(EXIT.network);\n return undefined;\n }\n\n if (!res.ok) {\n log.err(`skill download returned ${res.status}`);\n process.exit(EXIT.err);\n return undefined;\n }\n return res.text();\n}\n\nfunction sha256Hex(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n","// Shared helper for future CLI and MCP run recording.\n// `publish` intentionally does not call this: publishing is not an invocation.\n\nimport { z } from \"zod\";\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\nimport { readConfig } from \"../store/config.js\";\n\nconst slugRe = /^[a-z0-9-]+$/;\nconst semverRe = /^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/;\nconst sha256HexRe = /^[a-f0-9]{64}$/i;\nconst maxInt = 2_147_483_647;\n\nconst recordRunPayloadSchema = z.object({\n workspaceSlug: z.string().min(1).max(64).regex(slugRe),\n operonSlug: z.string().min(1).max(64).regex(slugRe),\n semver: z.string().min(1).max(64).regex(semverRe),\n invocationSource: z.enum([\"cli\", \"mcp\", \"webhook\", \"dashboard\"]),\n status: z.enum([\"running\", \"succeeded\", \"failed\", \"timeout\"]),\n startedAt: z.string().datetime({ offset: true }).optional(),\n finishedAt: z.string().datetime({ offset: true }).optional(),\n durationMs: z.number().int().min(0).max(maxInt).optional(),\n inputHash: z.string().regex(sha256HexRe).optional(),\n tokenIn: z.number().int().min(0).max(maxInt).optional(),\n tokenOut: z.number().int().min(0).max(maxInt).optional(),\n costUsdEstimated: z.number().finite().min(0).max(9999.999999).optional(),\n billedRunCount: z.number().int().min(1).max(maxInt).optional(),\n});\n\nconst recordRunResponseSchema = z.object({\n runId: z.string().uuid(),\n status: z.enum([\"running\", \"succeeded\", \"failed\", \"timeout\"]),\n runsUsedMtd: z.number().int().nonnegative(),\n runsCap: z.number().int().nonnegative().nullable(),\n overCap: z.boolean(),\n});\n\nexport type RecordRunPayload = z.infer<typeof recordRunPayloadSchema>;\nexport type RecordRunResponse = z.infer<typeof recordRunResponseSchema>;\n\nexport type RecordRunOptions = {\n apiBase?: string;\n token?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class RecordRunError extends Error {\n exitCode: ExitCode;\n status: number | undefined;\n body: string | undefined;\n\n constructor(\n message: string,\n exitCode: ExitCode,\n status?: number,\n body?: string\n ) {\n super(message);\n this.name = \"RecordRunError\";\n this.exitCode = exitCode;\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function recordRun(\n input: RecordRunPayload & RecordRunOptions\n): Promise<RecordRunResponse> {\n const {\n apiBase: apiBaseOverride,\n token: tokenOverride,\n fetchImpl = fetch,\n ...payloadInput\n } = input;\n const payload = recordRunPayloadSchema.parse(payloadInput);\n const config = await readConfig();\n const apiBase = (\n apiBaseOverride ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n const token = tokenOverride ?? config.platform.accessToken;\n if (token === undefined || token.length === 0) {\n throw new RecordRunError(\"not signed in. Run: operon login\", EXIT.auth);\n }\n\n let res: Response;\n try {\n res = await fetchImpl(`${apiBase}/api/v1/runs`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-operon-source\": \"cli\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(payload),\n });\n } catch (e) {\n throw new RecordRunError(\n `network error: ${(e as Error).message}`,\n EXIT.network\n );\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n throw new RecordRunError(\n `server returned ${res.status}: ${body.slice(0, 400)}`,\n res.status === 401 ? EXIT.auth : EXIT.err,\n res.status,\n body\n );\n }\n\n return recordRunResponseSchema.parse(await res.json());\n}\n","// `operon list` — list candidates and/or operons.\n\nimport { Command, Option } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { renderCandidateTable } from \"../render/candidate-table.js\";\nimport { listCandidates } from \"../store/candidates.js\";\nimport { listOperons } from \"../store/operons.js\";\n\nconst SORTS = [\"score\", \"recent\", \"name\"] as const;\n\nconst optsSchema = z.object({\n candidates: z.boolean().default(false),\n operons: z.boolean().default(false),\n sort: z.enum(SORTS).default(\"score\"),\n});\n\nexport function listCommand(): Command {\n return new Command(\"list\")\n .alias(\"ls\")\n .description(\"List candidates and operons.\")\n .option(\"--candidates\", \"Show only candidates\", false)\n .option(\"--operons\", \"Show only operons\", false)\n .addOption(new Option(\"--sort <key>\", \"Sort key\").choices([...SORTS]))\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n const showBoth = !opts.candidates && !opts.operons;\n\n const candidates =\n showBoth || opts.candidates ? await listCandidates() : [];\n const operons = showBoth || opts.operons ? await listOperons() : [];\n\n sortCandidates(candidates, opts.sort);\n\n if (getGlobals().json) {\n log.json({ candidates, operons });\n process.exit(EXIT.ok);\n }\n\n if (showBoth || opts.candidates) {\n log.info(\"Candidates:\");\n log.info(renderCandidateTable(candidates));\n log.info(\"\");\n }\n if (showBoth || opts.operons) {\n log.info(\"Operons:\");\n if (operons.length === 0) {\n log.info(\" (none)\");\n } else {\n for (const o of operons) {\n log.info(` ${o.slug} v${o.semver} promoted ${o.promotedAt}`);\n }\n }\n }\n const total = candidates.length + operons.length;\n process.exit(total > 0 ? EXIT.ok : EXIT.noWork);\n });\n}\n\nfunction sortCandidates(\n candidates: Awaited<ReturnType<typeof listCandidates>>,\n key: (typeof SORTS)[number]\n): void {\n switch (key) {\n case \"score\":\n candidates.sort((a, b) => b.score - a.score);\n return;\n case \"recent\":\n candidates.sort((a, b) => b.spanDays - a.spanDays);\n return;\n case \"name\":\n candidates.sort((a, b) => a.slug.localeCompare(b.slug));\n return;\n }\n}\n","// Pretty-print a list of candidates as a fixed-width table.\n// Plain ASCII so it stays readable in --no-color mode.\n\nimport chalk from \"chalk\";\nimport type { Candidate } from \"@operon/mining\";\nimport { getGlobals } from \"../lib/globals.js\";\n\nexport function renderCandidateTable(candidates: Candidate[]): string {\n if (candidates.length === 0) return \"(no candidates)\";\n const colored = !getGlobals().noColor;\n const tint = (s: string, fn: (s: string) => string): string =>\n colored ? fn(s) : s;\n\n const rows: string[][] = [];\n rows.push([\"#\", \"slug\", \"uses\", \"days\", \"score\", \"tools\"]);\n for (const [i, c] of candidates.entries()) {\n rows.push([\n String(i + 1),\n c.slug,\n String(c.uses),\n String(c.spanDays),\n c.score.toFixed(3),\n c.suggestedTools.slice(0, 3).join(\",\") || \"(none)\",\n ]);\n }\n const widths = rows[0]!.map((_, col) =>\n rows.reduce((max, r) => Math.max(max, r[col]!.length), 0)\n );\n const lines: string[] = [];\n for (const [i, r] of rows.entries()) {\n const cells = r.map((cell, col) => cell.padEnd(widths[col]!));\n const joined = cells.join(\" \");\n lines.push(i === 0 ? tint(joined, chalk.bold) : joined);\n }\n return lines.join(\"\\n\");\n}\n\nexport function renderSparkline(values: number[]): string {\n // Unicode block characters for a tiny histogram. Useful for the\n // scan summary (e.g. uses-per-day distribution).\n const bars = \"▁▂▃▄▅▆▇█\";\n if (values.length === 0) return \"\";\n const max = Math.max(...values, 1);\n return values\n .map(\n (v) =>\n bars[\n Math.min(bars.length - 1, Math.floor((v / max) * (bars.length - 1)))\n ]!\n )\n .join(\"\");\n}\n","// Persist mining candidates to ~/.operon/candidates/<slug>/. The\n// layout follows docs/03-mvp-mem-cli/05-pattern-detection.md\n// \"Stage 5: Persist\".\n\nimport { readFile, readdir, rename, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Candidate, NormalizedSession } from \"@operon/mining\";\nimport { CANDIDATES_DIR, candidateDir, ensureDir, trashDir } from \"./paths.js\";\n\nexport async function writeCandidate(\n candidate: Candidate,\n exemplars: NormalizedSession[]\n): Promise<void> {\n const dir = candidateDir(candidate.slug);\n await ensureDir(dir);\n await ensureDir(join(dir, \"exemplars\"));\n\n await writeFile(\n join(dir, \"candidate.json\"),\n `${JSON.stringify(candidate, null, 2)}\\n`,\n \"utf8\"\n );\n await writeFile(join(dir, \"prompt.draft.md\"), candidate.draftPrompt, \"utf8\");\n await writeFile(\n join(dir, \"tools.suggested.json\"),\n `${JSON.stringify(candidate.suggestedTools, null, 2)}\\n`,\n \"utf8\"\n );\n await writeFile(\n join(dir, \"eval.draft.json\"),\n `${JSON.stringify(candidate.draftEval, null, 2)}\\n`,\n \"utf8\"\n );\n\n for (const session of exemplars) {\n await writeFile(\n join(dir, \"exemplars\", `${sanitize(session.id)}.summary.md`),\n renderExemplarSummary(session),\n \"utf8\"\n );\n }\n}\n\nexport async function readCandidate(\n slug: string\n): Promise<Candidate | undefined> {\n const dir = candidateDir(slug);\n try {\n const raw = await readFile(join(dir, \"candidate.json\"), \"utf8\");\n return JSON.parse(raw) as Candidate;\n } catch {\n return undefined;\n }\n}\n\nexport async function listCandidates(): Promise<Candidate[]> {\n let entries: string[];\n try {\n entries = await readdir(CANDIDATES_DIR);\n } catch {\n return [];\n }\n const out: Candidate[] = [];\n for (const slug of entries) {\n const candidate = await readCandidate(slug);\n if (candidate !== undefined) out.push(candidate);\n }\n return out;\n}\n\nexport async function deleteCandidate(slug: string): Promise<void> {\n await rm(candidateDir(slug), { recursive: true, force: true });\n}\n\n// Move a candidate to ~/.operon/.trash/<undo-id>/ so prune is\n// reversible. Returns the undo id.\nexport async function trashCandidate(slug: string): Promise<string> {\n const undoId = `${Date.now().toString(36)}-cand-${slug}`;\n const target = trashDir(undoId);\n await ensureDir(target);\n try {\n await rename(candidateDir(slug), join(target, slug));\n } catch (e) {\n throw new Error(\n `cannot trash candidate \"${slug}\": ${(e as Error).message}`\n );\n }\n return undoId;\n}\n\n// Per spec: 200-character evidence snippets. Privacy-aware — shows\n// the user what was used to generate the candidate without leaking\n// the full session content.\nconst SNIPPET_LEN = 200;\n\nfunction renderExemplarSummary(session: NormalizedSession): string {\n const userMsg = session.messages.find((m) => m.role === \"user\");\n const snippet =\n userMsg !== undefined\n ? userMsg.content.slice(0, SNIPPET_LEN).replace(/\\s+/g, \" \")\n : \"(no user message)\";\n const tools = session.toolCalls.map((t) => t.name).join(\", \") || \"(none)\";\n const exts =\n session.fileTouches.map((f) => `${f.extension}:${f.count}`).join(\", \") ||\n \"(none)\";\n return `# ${session.id}\n\nsource: ${session.source}\nstarted: ${session.startedAt.toISOString()}\nduration: ${session.durationSec}s\ncwd: ${session.cwd ?? \"(unknown)\"}\n\n## first user prompt (200c snippet)\n\n${snippet}\n\n## tools used\n\n${tools}\n\n## file extensions touched\n\n${exts}\n`;\n}\n\nfunction sanitize(id: string): string {\n return id.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n","// Promoted operons live at ~/.operon/operons/<slug>/. Schema is the\n// same skeleton as a candidate, plus a manifest that records which\n// candidate-slug + version produced this operon (so undo can reverse\n// the promotion).\n\nimport { readFile, readdir, rename, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { OPERONS_DIR, ensureDir, operonDir, trashDir } from \"./paths.js\";\n\nexport type OperonManifest = {\n schemaVersion: 1;\n slug: string;\n semver: string;\n promotedFrom: { candidateSlug: string; clusterId: string };\n promotedAt: string;\n notes?: string;\n};\n\nexport async function writeOperon(\n manifest: OperonManifest,\n promptMarkdown: string,\n toolsJson: unknown,\n evalJson: unknown\n): Promise<void> {\n const dir = operonDir(manifest.slug);\n await ensureDir(dir);\n await writeFile(\n join(dir, \"manifest.json\"),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\"\n );\n await writeFile(join(dir, \"prompt.md\"), promptMarkdown, \"utf8\");\n await writeFile(\n join(dir, \"tools.json\"),\n `${JSON.stringify(toolsJson, null, 2)}\\n`,\n \"utf8\"\n );\n await writeFile(\n join(dir, \"eval.json\"),\n `${JSON.stringify(evalJson, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function readOperon(\n slug: string\n): Promise<OperonManifest | undefined> {\n try {\n const raw = await readFile(join(operonDir(slug), \"manifest.json\"), \"utf8\");\n return JSON.parse(raw) as OperonManifest;\n } catch {\n return undefined;\n }\n}\n\nexport async function listOperons(): Promise<OperonManifest[]> {\n let entries: string[];\n try {\n entries = await readdir(OPERONS_DIR);\n } catch {\n return [];\n }\n const out: OperonManifest[] = [];\n for (const slug of entries) {\n const m = await readOperon(slug);\n if (m !== undefined) out.push(m);\n }\n return out;\n}\n\n// Move an operon to the trash bin (used by `operon undo`). Returns\n// the undo id so the user can restore.\nexport async function trashOperon(slug: string): Promise<string> {\n const undoId = `${Date.now().toString(36)}-${slug}`;\n const target = trashDir(undoId);\n await ensureDir(target);\n try {\n await rename(operonDir(slug), join(target, slug));\n } catch (e) {\n // If rename failed because the operon doesn't exist, surface as\n // a clean error rather than the rename error.\n throw new Error(`cannot trash operon \"${slug}\": ${(e as Error).message}`);\n }\n return undoId;\n}\n\nexport async function purgeTrash(undoId: string): Promise<void> {\n await rm(trashDir(undoId), { recursive: true, force: true });\n}\n","// `operon login` — paste-and-go magic-link flow.\n//\n// Two-step, deliberately humble for v0:\n//\n// 1. Print a sign-in URL on the website. User opens it, signs in,\n// and is redirected to a \"device\" page that shows their access\n// token + refresh token (a one-time copy-paste).\n// 2. The CLI prompts for the token and stores it in\n// ~/.operon/config.json under `platform`.\n//\n// The \"real\" device-code flow (no copy-paste) needs a /device\n// endpoint pair on the server — slot for v0.5.\n\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { log } from \"../lib/logger.js\";\nimport { readConfig, writeConfig } from \"../store/config.js\";\n\nconst optsSchema = z.object({\n apiBase: z.string().url().optional(),\n workspace: z.string().min(1).max(64).optional(),\n token: z.string().optional(),\n});\n\nexport function loginCommand(): Command {\n return new Command(\"login\")\n .description(\"Sign in to the Operon platform (paste-token flow for v0).\")\n .option(\n \"--api-base <url>\",\n \"Override platform base URL (default https://app.withoperon.com)\"\n )\n .option(\"--workspace <slug>\", \"Set default workspace slug for publish\")\n .option(\n \"--token <token>\",\n \"Skip the prompt and pass a Supabase access token or op_pat_* PAT\"\n )\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n const config = await readConfig();\n const apiBase =\n opts.apiBase ?? config.platform.apiBase ?? \"https://app.withoperon.com\";\n\n let accessToken = opts.token;\n if (accessToken === undefined) {\n log.step(`Open this URL in your browser to sign in:`);\n log.info(\"\");\n log.info(` ${apiBase}/login?from=cli`);\n log.info(\"\");\n log.info(\n \"After signing in, copy the access token shown on the device page,\"\n );\n log.info(\"then paste it here. You can also paste an op_pat_* token.\");\n log.info(\"\");\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n accessToken = (await rl.question(\"token> \")).trim();\n rl.close();\n }\n if (accessToken === undefined || accessToken.length === 0) {\n log.err(\"no token provided\");\n process.exit(EXIT.config);\n return;\n }\n\n // Soft-validate: hit /api/v1/whoami; if it 200s with {email},\n // we know the token works.\n let email: string | undefined;\n try {\n const res = await fetch(`${apiBase}/api/v1/whoami`, {\n headers: { authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n log.err(\n `Token rejected by ${apiBase} (${res.status}): ${body.slice(0, 200)}`\n );\n process.exit(EXIT.auth);\n return;\n }\n const json = (await res.json()) as { email?: string };\n email = json.email;\n } catch (e) {\n log.err(`Could not reach ${apiBase}: ${(e as Error).message}`);\n process.exit(EXIT.network);\n return;\n }\n\n const next = {\n ...config,\n platform: {\n ...config.platform,\n apiBase,\n accessToken,\n userEmail: email,\n ...(opts.workspace !== undefined\n ? { workspaceSlug: opts.workspace }\n : {}),\n },\n };\n await writeConfig(next);\n log.step(\n `signed in as ${email ?? \"(unknown)\"} → ${apiBase}` +\n (opts.workspace !== undefined\n ? ` default workspace: ${opts.workspace}`\n : \"\")\n );\n log.info(\"Next: operon publish <slug>\");\n process.exit(EXIT.ok);\n });\n}\n","// `operon mine` - one-command scan -> preview -> confirm -> publish flow.\n\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { Command, Option } from \"commander\";\nimport type { Candidate, NormalizedSession } from \"@operon/mining\";\nimport { mineSessions } from \"@operon/mining\";\nimport { z } from \"zod\";\nimport { ADAPTERS, redactSession } from \"../ingestion/index.js\";\nimport type { SourceName } from \"../ingestion/index.js\";\nimport { parseDuration } from \"../lib/duration.js\";\nimport {\n createPlatformEventClient,\n PlatformEventError,\n type PlatformEventClient,\n} from \"../lib/events.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport {\n PushOperonError,\n pushOperon,\n readSkillMarkdown,\n titleCase,\n} from \"../lib/push.js\";\nimport { writeCandidate } from \"../store/candidates.js\";\nimport { readConfig } from \"../store/config.js\";\n\nconst SOURCES = [\"claude-code\", \"codex\", \"cursor\", \"chatgpt\"] as const;\nconst slugRe = /^[a-z0-9-]+$/;\n\nconst optsSchema = z.object({\n source: z.array(z.enum(SOURCES)).default([...SOURCES]),\n workspace: z.string().min(1).max(64).regex(slugRe).optional(),\n since: z.string().default(\"30d\"),\n top: z.coerce.number().int().positive().default(5),\n dryRun: z.boolean().default(false),\n yes: z.boolean().default(false),\n apiBase: z.string().url().optional(),\n});\n\nexport function mineCommand(): Command {\n return new Command(\"mine\")\n .description(\n \"Mine local sessions, preview suggestions, and publish accepted ones.\"\n )\n .addOption(\n new Option(\"--source <src...>\", \"Limit to one or more sources\").choices([\n ...SOURCES,\n ])\n )\n .option(\"--workspace <slug>\", \"Override the default workspace from config\")\n .option(\"--since <duration>\", \"Window to scan (e.g. 7d, 30d, 90d)\", \"30d\")\n .option(\"--top <N>\", \"Max candidates to preview\", \"5\")\n .option(\"--dry-run\", \"Print candidates, do not publish\", false)\n .option(\"--yes\", \"Skip prompts and publish all candidates\", false)\n .option(\"--api-base <url>\", \"Override platform base URL\")\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n let since: Date;\n try {\n since = new Date(Date.now() - parseDuration(opts.since));\n } catch (e) {\n log.err((e as Error).message);\n process.exit(EXIT.config);\n return;\n }\n\n const eventClient = await tryCreateEventClient({\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n ...(opts.workspace !== undefined ? { workspace: opts.workspace } : {}),\n });\n const startedAt = Date.now();\n const sources = (opts.source as SourceName[]).filter(\n (s) => ADAPTERS[s] !== undefined\n );\n await sendMiningEvent(eventClient, \"mining_scan_started\", {\n since: opts.since,\n sources,\n });\n\n const allSessions = await collectSessions(sources, since);\n if (allSessions.length === 0) {\n await sendMiningEvent(eventClient, \"mining_scan_completed\", {\n sessionCount: 0,\n durationMs: Date.now() - startedAt,\n });\n log.err(\n `no sessions in last ${opts.since}. Try --since=90d or --since=365d.`\n );\n process.exit(EXIT.noWork);\n return;\n }\n\n if (!getGlobals().json) {\n log.step(\n `mining ${allSessions.length} sessions from last ${opts.since}...`\n );\n }\n const result = mineSessions(allSessions, { render: { top: opts.top } });\n await sendMiningEvent(eventClient, \"mining_scan_completed\", {\n sessionCount: result.sessionCountKept,\n durationMs: Date.now() - startedAt,\n });\n\n const candidates = result.candidates.slice(0, opts.top);\n if (candidates.length === 0) {\n log.info(\"no reusable patterns found. Try widening --since.\");\n process.exit(EXIT.noWork);\n return;\n }\n\n const sessionsById = new Map(allSessions.map((s) => [s.id, s]));\n for (const candidate of candidates) {\n await persistCandidate(candidate, sessionsById);\n await sendMiningEvent(eventClient, \"pattern_detected\", {\n clusterId: candidate.promptShape,\n clusterSize: candidate.uses,\n score: candidate.score,\n keywords: candidate.suggestedTools,\n });\n }\n const existing = await loadExistingPreviews(candidates, {\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n ...(opts.workspace !== undefined ? { workspace: opts.workspace } : {}),\n });\n\n const jsonPreviewOnly = getGlobals().json && !opts.yes;\n const preview = {\n input: result.sessionCountInput,\n kept: result.sessionCountKept,\n clusters: result.clusterCount,\n dryRun: opts.dryRun || jsonPreviewOnly,\n candidates: candidates.map((candidate) =>\n candidateJson(candidate, existing.get(candidate.slug))\n ),\n };\n\n if (!getGlobals().json) {\n log.info(\"\");\n log.info(\"Mined candidates:\");\n log.info(\"\");\n for (const [index, candidate] of candidates.entries()) {\n printCandidate(index + 1, candidate, existing.get(candidate.slug));\n }\n }\n\n if (opts.dryRun || jsonPreviewOnly) {\n if (getGlobals().json) {\n log.json(preview);\n }\n await sendMiningEvent(eventClient, \"mining_session_completed\", {\n candidatesShown: candidates.length,\n candidatesAccepted: 0,\n candidatesSkipped: 0,\n durationMs: Date.now() - startedAt,\n });\n process.exit(EXIT.ok);\n return;\n }\n\n const published: { slug: string; url: string }[] = [];\n let dismissed = 0;\n const rl =\n opts.yes || getGlobals().json\n ? undefined\n : createInterface({ input, output });\n try {\n for (const candidate of candidates) {\n let targetSlug = candidate.slug;\n const decision = opts.yes\n ? { kind: \"publish\" as const }\n : await promptForDecision(rl, candidate, targetSlug);\n if (decision.kind === \"quit\") break;\n if (decision.kind === \"skip\") {\n dismissed += 1;\n await sendMiningEvent(eventClient, \"suggestion_dismissed\", {\n clusterId: candidate.promptShape,\n slug: targetSlug,\n });\n continue;\n }\n if (decision.kind === \"edit\") {\n targetSlug = decision.slug;\n }\n\n try {\n if (!getGlobals().json) {\n log.step(`publishing ${targetSlug} ...`);\n }\n const pushedResult = await pushOperon({\n slug: targetSlug,\n candidate,\n ...(opts.workspace !== undefined\n ? { workspace: opts.workspace }\n : {}),\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n });\n published.push({ slug: targetSlug, url: pushedResult.url });\n await sendMiningEvent(eventClient, \"suggestion_accepted\", {\n clusterId: candidate.promptShape,\n slug: targetSlug,\n score: candidate.score,\n });\n } catch (e) {\n if (e instanceof PushOperonError) {\n log.err(e.message);\n process.exit(e.exitCode);\n return;\n }\n throw e;\n }\n }\n } finally {\n rl?.close();\n }\n\n await sendMiningEvent(eventClient, \"mining_session_completed\", {\n candidatesShown: candidates.length,\n candidatesAccepted: published.length,\n candidatesSkipped: dismissed,\n durationMs: Date.now() - startedAt,\n });\n\n if (getGlobals().json) {\n log.json({ ...preview, published, dismissed });\n } else {\n log.info(\"\");\n log.step(`Published ${published.length} of ${candidates.length}.`);\n for (const item of published) {\n log.info(` ${item.slug}: ${item.url}`);\n }\n }\n process.exit(EXIT.ok);\n });\n}\n\nasync function collectSessions(\n sources: SourceName[],\n since: Date\n): Promise<NormalizedSession[]> {\n const allSessions: NormalizedSession[] = [];\n for (const sourceName of sources) {\n const adapter = ADAPTERS[sourceName];\n if (adapter === undefined) continue;\n const detect = await adapter.detect();\n if (!detect.present) continue;\n for await (const raw of adapter.enumerate({ since })) {\n let session = await adapter.normalize(raw);\n session = redactSession(session);\n allSessions.push(session);\n }\n }\n return allSessions;\n}\n\nasync function persistCandidate(\n candidate: Candidate,\n sessionsById: Map<string, NormalizedSession>\n): Promise<void> {\n const exemplars = candidate.exemplarSessionIds\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n await writeCandidate(candidate, exemplars);\n}\n\nfunction printCandidate(\n index: number,\n candidate: Candidate,\n existing: ExistingPreview | undefined\n): void {\n const keywords = candidate.suggestedTools.slice(0, 3);\n log.info(` ${index}. ${titleCase(candidate.slug)} (${candidate.slug})`);\n log.info(\n ` cluster ${candidate.uses} sessions, ${candidate.spanDays}d span, score ${candidate.score}`\n );\n log.info(` seen ${candidate.firstSeenAt} -> ${candidate.lastSeenAt}`);\n log.info(` keywords: ${keywords.join(\", \") || \"(none)\"}`);\n log.info(` existing: ${existing?.summary ?? \"unchecked\"}`);\n log.info(\"\");\n}\n\nasync function promptForDecision(\n rl: ReturnType<typeof createInterface> | undefined,\n candidate: Candidate,\n targetSlug: string\n): Promise<\n | { kind: \"publish\" }\n | { kind: \"skip\" }\n | { kind: \"quit\" }\n | { kind: \"edit\"; slug: string }\n> {\n if (rl === undefined) return { kind: \"publish\" };\n for (;;) {\n const raw = (\n await rl.question(\n `${candidate.slug} [p]ublish, [s]kip, [e]dit slug, [q]uit? `\n )\n )\n .trim()\n .toLowerCase();\n if (raw === \"\" || raw === \"p\" || raw === \"publish\") {\n return { kind: \"publish\" };\n }\n if (raw === \"s\" || raw === \"skip\") return { kind: \"skip\" };\n if (raw === \"q\" || raw === \"quit\") return { kind: \"quit\" };\n if (raw === \"e\" || raw === \"edit\") {\n const next = (await rl.question(`slug (${targetSlug}): `)).trim();\n if (!slugRe.test(next)) {\n log.warn(\"slug must match /^[a-z0-9-]+$/\");\n continue;\n }\n return { kind: \"edit\", slug: next };\n }\n }\n}\n\nasync function tryCreateEventClient(opts: {\n apiBase?: string;\n workspace?: string;\n}): Promise<PlatformEventClient | undefined> {\n try {\n return await createPlatformEventClient({\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n ...(opts.workspace !== undefined\n ? { workspaceSlug: opts.workspace }\n : {}),\n });\n } catch (e) {\n if (e instanceof PlatformEventError) {\n log.debug(`telemetry disabled: ${e.message}`);\n return undefined;\n }\n throw e;\n }\n}\n\nasync function sendMiningEvent(\n client: PlatformEventClient | undefined,\n event: Parameters<PlatformEventClient[\"send\"]>[0],\n properties: Parameters<PlatformEventClient[\"send\"]>[1]\n): Promise<void> {\n if (client === undefined) return;\n try {\n await client.send(event, properties);\n } catch (e) {\n if (e instanceof PlatformEventError) {\n log.warn(`telemetry skipped: ${e.message}`);\n return;\n }\n throw e;\n }\n}\n\ntype ExistingPreview = {\n status: \"new\" | \"changed\" | \"same\" | \"unchecked\";\n summary: string;\n};\n\nasync function loadExistingPreviews(\n candidates: Candidate[],\n opts: { apiBase?: string; workspace?: string }\n): Promise<Map<string, ExistingPreview>> {\n const out = new Map<string, ExistingPreview>();\n const config = await readConfig();\n const workspace = opts.workspace ?? config.platform.workspaceSlug;\n const token = config.platform.accessToken;\n if (workspace === undefined || token === undefined || token.length === 0) {\n for (const candidate of candidates) {\n out.set(candidate.slug, {\n status: \"unchecked\",\n summary: \"unchecked (missing workspace or login)\",\n });\n }\n return out;\n }\n\n const apiBase = (\n opts.apiBase ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n\n for (const candidate of candidates) {\n out.set(\n candidate.slug,\n await loadExistingPreview({ apiBase, workspace, token, candidate })\n );\n }\n return out;\n}\n\nasync function loadExistingPreview(input: {\n apiBase: string;\n workspace: string;\n token: string;\n candidate: Candidate;\n}): Promise<ExistingPreview> {\n try {\n const res = await fetch(\n `${input.apiBase}/api/v1/workspaces/${input.workspace}/operons/${input.candidate.slug}`,\n {\n headers: {\n \"x-operon-source\": \"cli\",\n authorization: `Bearer ${input.token}`,\n },\n }\n );\n if (res.status === 404) return { status: \"new\", summary: \"new\" };\n if (!res.ok) {\n return {\n status: \"unchecked\",\n summary: `unchecked (${res.status})`,\n };\n }\n const json = (await res.json()) as { skillUrl?: string };\n if (typeof json.skillUrl !== \"string\") {\n return { status: \"unchecked\", summary: \"unchecked (no skill url)\" };\n }\n const current = await fetch(json.skillUrl).then((r) =>\n r.ok ? r.text() : undefined\n );\n if (current === undefined) {\n return { status: \"unchecked\", summary: \"unchecked (skill unavailable)\" };\n }\n const next = await readSkillMarkdown(input.candidate);\n if (current === next.markdown) {\n return { status: \"same\", summary: \"no SKILL.md changes\" };\n }\n return {\n status: \"changed\",\n summary: `SKILL.md differs (${lineCount(current)} -> ${lineCount(next.markdown)} lines)`,\n };\n } catch (e) {\n return {\n status: \"unchecked\",\n summary: `unchecked (${(e as Error).message})`,\n };\n }\n}\n\nfunction lineCount(s: string): number {\n return s.split(\"\\n\").length;\n}\n\nfunction candidateJson(\n candidate: Candidate,\n existing: ExistingPreview | undefined\n) {\n return {\n slug: candidate.slug,\n name: titleCase(candidate.slug),\n uses: candidate.uses,\n spanDays: candidate.spanDays,\n score: candidate.score,\n firstSeenAt: candidate.firstSeenAt,\n lastSeenAt: candidate.lastSeenAt,\n keywords: candidate.suggestedTools.slice(0, 3),\n existing: existing ?? { status: \"unchecked\", summary: \"unchecked\" },\n };\n}\n","import type { NormalizedSession } from \"./types.js\";\n\nconst NON_ACTIONABLE_PREFIXES = [\n \"<environment_context>\",\n \"<local-command-caveat>\",\n \"<user_info>\",\n] as const;\n\nconst NON_ACTIONABLE_PATTERNS = [\n /^# AGENTS\\.md instructions[^\\n]*(?:\\n|$)/i,\n /<INSTRUCTIONS>[\\s\\S]*?<\\/INSTRUCTIONS>/i,\n /<environment_context>[\\s\\S]*?<\\/environment_context>/i,\n /<local-command-caveat>[\\s\\S]*?<\\/local-command-caveat>/i,\n /<user_info>[\\s\\S]*?<\\/user_info>/i,\n] as const;\n\nexport function firstActionableUserPrompt(\n session: NormalizedSession\n): string | undefined {\n for (const message of session.messages) {\n if (message.role !== \"user\") continue;\n const content = actionablePromptContent(message.content);\n if (content === undefined) continue;\n return content;\n }\n return undefined;\n}\n\nexport function isNonActionablePrompt(content: string): boolean {\n return actionablePromptContent(content) === undefined;\n}\n\nfunction actionablePromptContent(content: string): string | undefined {\n const trimmed = content.trim();\n if (trimmed.length === 0) return undefined;\n if (NON_ACTIONABLE_PREFIXES.some((prefix) => trimmed.startsWith(prefix))) {\n return undefined;\n }\n\n let stripped = trimmed;\n for (const pattern of NON_ACTIONABLE_PATTERNS) {\n stripped = stripped.replace(pattern, \" \").trim();\n }\n return stripped.length === 0 ? undefined : stripped;\n}\n","// Stage 0: filter. Drops sessions that are clearly not workflows.\n// Per docs/03-mvp-mem-cli/05-pattern-detection.md \"Stage 0\".\n//\n// Inclusion criteria (all must hold):\n// - duration ≥ 60s\n// - messages ≥ 3\n// - either ≥1 file touch OR ≥2 tool calls\n\nimport type { FilterResult, NormalizedSession } from \"./types.js\";\nimport { firstActionableUserPrompt } from \"./prompts.js\";\n\nexport type FilterOpts = {\n minDurationSec?: number;\n minMessages?: number;\n minWork?: number; // file touches + (tool calls / 2) — see WORK below\n};\n\nconst DEFAULTS = {\n minDurationSec: 60,\n minMessages: 3,\n minWork: 1,\n} as const;\n\nexport function filterSessions(\n sessions: NormalizedSession[],\n opts: FilterOpts = {}\n): FilterResult {\n const cfg = { ...DEFAULTS, ...opts };\n const kept: NormalizedSession[] = [];\n const dropped: FilterResult[\"dropped\"] = [];\n\n for (const s of sessions) {\n if (s.durationSec < cfg.minDurationSec) {\n dropped.push({ id: s.id, reason: \"too-short\" });\n continue;\n }\n if (s.messages.length < cfg.minMessages) {\n dropped.push({ id: s.id, reason: \"too-few-messages\" });\n continue;\n }\n if (firstActionableUserPrompt(s) === undefined) {\n dropped.push({ id: s.id, reason: \"no-actionable-prompt\" });\n continue;\n }\n const fileTouchTotal = s.fileTouches.reduce((a, t) => a + t.count, 0);\n const toolCallTotal = s.toolCalls.reduce((a, t) => a + (t.count ?? 1), 0);\n // WORK score: 1 file-touch counts as 1, every 2 tool calls\n // counts as 1. Sessions need at least one unit to keep.\n const work = fileTouchTotal + Math.floor(toolCallTotal / 2);\n if (work < cfg.minWork) {\n dropped.push({ id: s.id, reason: \"no-work\" });\n continue;\n }\n kept.push(s);\n }\n return { kept, dropped };\n}\n","// SHA-256 hex digest helpers. node:crypto is fast and sync; the\n// mining pipeline runs in tight loops, so async Web Crypto would\n// hurt performance. We accept node-only for v0; if/when mining\n// runs in Cloudflare Workers, swap to a wasm sha256.\n\nimport { createHash } from \"node:crypto\";\n\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\n// Normalize text for promptShape hashing. Lowercase, strip\n// punctuation, collapse digits to \"#\", token-replace any\n// path/identifier-shaped run.\nexport function normalizePromptText(s: string): string {\n let out = s.toLowerCase();\n // Strip code fences and inline code (they vary too much).\n out = out.replace(/```[\\s\\S]*?```/g, \" \");\n out = out.replace(/`[^`]*`/g, \" \");\n // Strip URLs.\n out = out.replace(/https?:\\/\\/\\S+/g, \"<url>\");\n // Replace paths with <id>.\n out = out.replace(/\\/[^\\s'\"`)]+/g, \"<id>\");\n // Replace digit runs with #.\n out = out.replace(/\\d+/g, \"#\");\n // Collapse non-letter/space/<id> tokens to space.\n out = out.replace(/[^\\p{L}\\s<>#]+/gu, \" \");\n // Collapse whitespace.\n out = out.replace(/\\s+/g, \" \").trim();\n return out;\n}\n\nexport function promptShapeHash(initialPrompt: string): string {\n return sha256(normalizePromptText(initialPrompt));\n}\n\n// Path fingerprint: replace concrete filenames with role buckets,\n// sort, hash. So \"src/foo.tsx\" + \"src/bar.tsx\" + \"src/baz.tsx\"\n// fingerprint identically across sessions touching different\n// concrete filenames in the same shape.\nexport function pathFingerprintHash(extensions: string[]): string {\n const sorted = [...extensions].sort();\n return sha256(sorted.join(\"|\"));\n}\n\nexport function toolFingerprintHash(toolNames: string[]): string {\n const sorted = [...toolNames].sort();\n return sha256(sorted.join(\"|\"));\n}\n","// Stage 1: featurize. Builds SessionFeatures for each kept session.\n//\n// The cluster keys this stage extracts are what makes the algorithm\n// fire on real data. In order of preference:\n//\n// commandHint — slash-command name (`/audit-website` → \"audit-website\")\n// verbObject — \"<verb>-<object>\" pulled from the leading prose\n// actionSignature — primaryTool + top-3 tools + primaryExt + cwdLeaf\n// promptShape — sha256 of normalized prompt (last-resort)\n//\n// Two sessions that share commandHint or actionSignature are\n// almost-certainly the same workflow regardless of how the user\n// phrased the prompt.\n\nimport { sha256 } from \"./hashes.js\";\nimport {\n pathFingerprintHash,\n promptShapeHash,\n toolFingerprintHash,\n} from \"./hashes.js\";\nimport { firstActionableUserPrompt } from \"./prompts.js\";\nimport type { NormalizedSession, SessionFeatures } from \"./types.js\";\n\nconst BASH_TOOLS = new Set([\"Bash\", \"exec_command\", \"shell\"]);\nconst EDIT_TOOLS = new Set([\n \"Edit\",\n \"Write\",\n \"MultiEdit\",\n \"NotebookEdit\",\n \"apply_patch\",\n]);\nconst SEARCH_TOOLS = new Set([\"Grep\", \"Glob\", \"Read\", \"WebSearch\", \"WebFetch\"]);\n\n// Matches both raw `/audit-website` invocations and the\n// `<command-name>/audit-website</command-name>` envelope that\n// Claude Code wraps slash-command messages in.\nconst SLASH_CMD_TAG_RE =\n /<command-name>\\s*\\/?([a-z][\\w-]{0,63})\\s*<\\/command-name>/i;\nconst SLASH_CMD_RAW_RE = /^\\s*\\/([a-z][\\w-]{0,63})(?:\\s|$)/i;\n\nconst VERB_OBJECT_RE =\n /\\b(?:please\\s+|can\\s+you\\s+|let'?s\\s+|i\\s+want\\s+(?:you\\s+)?to\\s+)?(\\w{3,})\\s+(?:the\\s+|a\\s+|this\\s+|my\\s+|our\\s+)?(\\w{3,})/i;\n\n// Stop-word verbs that produce useless slugs (\"the the\", \"be the\").\nconst STOP_VERBS = new Set([\n \"the\",\n \"be\",\n \"is\",\n \"was\",\n \"are\",\n \"were\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"and\",\n \"but\",\n \"or\",\n \"so\",\n \"for\",\n \"from\",\n \"with\",\n \"your\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n]);\n\nexport function featurize(session: NormalizedSession): SessionFeatures {\n const initialPrompt = firstActionableUserPrompt(session) ?? \"\";\n const promptShape = promptShapeHash(initialPrompt);\n const commandHint = extractCommand(initialPrompt);\n const verbObject =\n commandHint === undefined ? extractVerbObject(initialPrompt) : undefined;\n\n const toolHistogram: Record<string, number> = {};\n let toolCallCount = 0;\n for (const t of session.toolCalls) {\n const count = t.count ?? 1;\n toolHistogram[t.name] = (toolHistogram[t.name] ?? 0) + count;\n toolCallCount += count;\n }\n const primaryTool = pickPrimaryTool(toolHistogram);\n\n const bashInvocationCount = sumByName(toolHistogram, BASH_TOOLS);\n const editCount = sumByName(toolHistogram, EDIT_TOOLS);\n const searchCount = sumByName(toolHistogram, SEARCH_TOOLS);\n\n const fileExtensions = [\n ...session.fileTouches.map((f) => f.extension),\n ].sort();\n const pathFingerprint = pathFingerprintHash(fileExtensions);\n\n const cwdLeaf =\n session.cwd === undefined ? undefined : leafOfCwd(session.cwd);\n const actionSignature = buildActionSignature(\n primaryTool,\n toolHistogram,\n fileExtensions,\n cwdLeaf\n );\n\n const features: SessionFeatures = {\n primaryTool,\n fileExtensions,\n modelFamily: detectModelFamily(session.modelHints),\n messageCount: session.messages.length,\n toolCallCount,\n bashInvocationCount,\n editCount,\n searchCount,\n promptShape,\n toolHistogram,\n pathFingerprint,\n commandHint,\n verbObject,\n actionSignature,\n cwdLeaf,\n durationBucket: bucketDuration(session.durationSec),\n outcome: session.outcome,\n sessionId: session.id,\n startedAt: session.startedAt,\n };\n return features;\n}\n\nexport function featurizeMany(\n sessions: NormalizedSession[]\n): SessionFeatures[] {\n return sessions.map(featurize);\n}\n\nexport function toolHistogramFingerprint(\n histogram: Record<string, number>\n): string {\n return toolFingerprintHash(Object.keys(histogram));\n}\n\n// Action signature: hash of the primary tool, the sorted top-3\n// tools, the primary file extension, and the cwd leaf. Designed\n// so that two sessions doing \"the same job\" produce identical\n// signatures even if their prompts and arguments diverge.\nexport function buildActionSignature(\n primaryTool: string,\n histogram: Record<string, number>,\n extensions: string[],\n cwdLeaf: string | undefined\n): string {\n const top3 = [...Object.entries(histogram)]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 3)\n .map(([name]) => name)\n .sort()\n .join(\",\");\n const primaryExt = extensions[0] ?? \"<none>\";\n const leaf = cwdLeaf ?? \"<no-cwd>\";\n return sha256(`${primaryTool}|${top3}|${primaryExt}|${leaf}`);\n}\n\nfunction extractCommand(prompt: string): string | undefined {\n const tagged = SLASH_CMD_TAG_RE.exec(prompt);\n if (tagged?.[1] !== undefined) {\n return tagged[1].toLowerCase();\n }\n const raw = SLASH_CMD_RAW_RE.exec(prompt);\n if (raw?.[1] !== undefined) {\n return raw[1].toLowerCase();\n }\n return undefined;\n}\n\nfunction extractVerbObject(prompt: string): string | undefined {\n // Strip CC's command/system tags before extracting verb-object so\n // we don't pull \"command-message\" out of every prompt.\n const stripped = prompt\n .replace(/<command-message>[\\s\\S]*?<\\/command-message>/gi, \" \")\n .replace(/<command-name>[\\s\\S]*?<\\/command-name>/gi, \" \")\n .replace(/<command-args>[\\s\\S]*?<\\/command-args>/gi, \" \")\n .replace(/<local-command-caveat>[\\s\\S]*?<\\/local-command-caveat>/gi, \" \")\n .replace(/<system-reminder>[\\s\\S]*?<\\/system-reminder>/gi, \" \")\n .trim();\n const m = VERB_OBJECT_RE.exec(stripped);\n if (m === null) return undefined;\n const verb = m[1]!.toLowerCase();\n const object = m[2]!.toLowerCase();\n if (STOP_VERBS.has(verb) || STOP_VERBS.has(object)) return undefined;\n if (verb === object) return undefined;\n const slug = `${verb}-${object}`.replace(/[^a-z0-9-]/g, \"\");\n if (slug.length < 6) return undefined;\n return slug;\n}\n\nfunction leafOfCwd(cwd: string): string {\n const parts = cwd.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] ?? cwd;\n}\n\nfunction pickPrimaryTool(histogram: Record<string, number>): string {\n const entries = Object.entries(histogram);\n if (entries.length === 0) return \"<none>\";\n entries.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));\n return entries[0]![0];\n}\n\nfunction sumByName(\n histogram: Record<string, number>,\n names: Set<string>\n): number {\n let n = 0;\n for (const [k, v] of Object.entries(histogram)) {\n if (names.has(k)) n += v;\n }\n return n;\n}\n\nfunction detectModelFamily(hints: string[]): SessionFeatures[\"modelFamily\"] {\n if (hints.length === 0) return \"unknown\";\n const lower = hints.map((h) => h.toLowerCase());\n const claude = lower.some((h) => h.includes(\"claude\"));\n const gpt = lower.some(\n (h) => h.includes(\"gpt\") || h.includes(\"o1\") || h.includes(\"o3\")\n );\n if (claude && gpt) return \"mixed\";\n if (claude) return \"claude\";\n if (gpt) return \"gpt\";\n return \"unknown\";\n}\n\nfunction bucketDuration(sec: number): SessionFeatures[\"durationBucket\"] {\n if (sec < 5 * 60) return \"short\";\n if (sec < 30 * 60) return \"medium\";\n if (sec < 2 * 60 * 60) return \"long\";\n return \"very-long\";\n}\n","// Stage 2: cluster. Three-tier Pass A + density-based Pass B.\n//\n// Pass A buckets share a strong, deterministic key. In order:\n// 1. cmd:<commandName> — slash-command invocations\n// 2. verb:<verbObject> — extracted \"<verb>-<object>\"\n// 3. action:<actionSig> — primaryTool + top tools + ext + cwd\n// 4. shape:<promptShape> — full prompt hash (last resort)\n//\n// Pass B: greedy density walk on whatever Pass A left over, using\n// a weighted distance dominated by actionSignature + tool jaccard\n// (the things that stay stable across prompt variation).\n\nimport { sha256 } from \"./hashes.js\";\nimport type { Cluster, SessionFeatures } from \"./types.js\";\n\nexport type ClusterWeights = {\n // exact match on the action signature dominates: same tools +\n // same primary extension + same cwd-leaf almost certainly means\n // same workflow.\n actionSignature: number;\n toolJaccard: number;\n extJaccard: number;\n pathFingerprint: number;\n promptShape: number;\n outcome: number;\n};\n\nexport const DEFAULT_WEIGHTS: ClusterWeights = {\n actionSignature: 0.4,\n toolJaccard: 0.3,\n extJaccard: 0.1,\n pathFingerprint: 0.1,\n promptShape: 0.05,\n outcome: 0.05,\n};\n\nexport type ClusterOpts = {\n minClusterSize?: number;\n // Maximum acceptable distance for two sessions to share a Pass-B\n // cluster. Calibrated against ~30 real CC sessions; a single\n // mismatched feature (e.g. action sig differs but everything\n // else matches) lands at ~0.4.\n maxDistance?: number;\n weights?: ClusterWeights;\n};\n\nconst DEFAULTS = {\n // Two-session pairs were too noisy in 90-day dogfood runs: they\n // often captured one-off debugging, setup, or conversational\n // follow-up. Require at least three repeats before surfacing a\n // reusable pattern.\n minClusterSize: 3,\n maxDistance: 0.55,\n} as const;\n\ntype Pass = \"cmd\" | \"verb\" | \"action\" | \"shape\" | \"B\";\n\nexport function clusterSessions(\n features: SessionFeatures[],\n opts: ClusterOpts = {}\n): Cluster[] {\n const cfg = {\n minClusterSize: opts.minClusterSize ?? DEFAULTS.minClusterSize,\n maxDistance: opts.maxDistance ?? DEFAULTS.maxDistance,\n weights: opts.weights ?? DEFAULT_WEIGHTS,\n };\n\n const consumed = new Set<string>();\n const clusters: Cluster[] = [];\n\n // ── Pass A1: bucket by slash-command ─────────────────────────\n bucketByKey(features, consumed, cfg.minClusterSize, \"cmd\", clusters, (f) =>\n f.commandHint === undefined ? undefined : `cmd:${f.commandHint}`\n );\n // ── Pass A2: bucket by verb-object ──────────────────────────\n bucketByKey(features, consumed, cfg.minClusterSize, \"verb\", clusters, (f) =>\n f.verbObject === undefined ? undefined : `verb:${f.verbObject}`\n );\n // ── Pass A3: bucket by action signature ─────────────────────\n bucketByKey(\n features,\n consumed,\n cfg.minClusterSize,\n \"action\",\n clusters,\n (f) => `action:${f.actionSignature}`\n );\n // ── Pass A4: bucket by full prompt hash (legacy fallback) ───\n bucketByKey(\n features,\n consumed,\n cfg.minClusterSize,\n \"shape\",\n clusters,\n (f) => `shape:${f.promptShape}`\n );\n\n // ── Pass B: density clustering on remainder ─────────────────\n const remainder = features.filter((f) => !consumed.has(f.sessionId));\n clusters.push(...densityCluster(remainder, cfg));\n\n return clusters;\n}\n\nfunction bucketByKey(\n features: SessionFeatures[],\n consumed: Set<string>,\n minClusterSize: number,\n pass: Pass,\n clusters: Cluster[],\n keyFn: (f: SessionFeatures) => string | undefined\n): void {\n const buckets = new Map<string, SessionFeatures[]>();\n for (const f of features) {\n if (consumed.has(f.sessionId)) continue;\n const key = keyFn(f);\n if (key === undefined) continue;\n const arr = buckets.get(key) ?? [];\n arr.push(f);\n buckets.set(key, arr);\n }\n for (const arr of buckets.values()) {\n if (arr.length < minClusterSize) continue;\n clusters.push(buildCluster(arr, pass));\n for (const f of arr) consumed.add(f.sessionId);\n }\n}\n\nfunction densityCluster(\n features: SessionFeatures[],\n cfg: { minClusterSize: number; maxDistance: number; weights: ClusterWeights }\n): Cluster[] {\n if (features.length === 0) return [];\n const assigned = new Set<string>();\n const clusters: Cluster[] = [];\n for (const seed of features) {\n if (assigned.has(seed.sessionId)) continue;\n const members = [seed];\n for (const candidate of features) {\n if (\n candidate.sessionId === seed.sessionId ||\n assigned.has(candidate.sessionId)\n ) {\n continue;\n }\n if (distance(seed, candidate, cfg.weights) <= cfg.maxDistance) {\n members.push(candidate);\n }\n }\n if (members.length >= cfg.minClusterSize) {\n clusters.push(buildCluster(members, \"B\"));\n for (const member of members) assigned.add(member.sessionId);\n }\n }\n return clusters;\n}\n\nexport function distance(\n a: SessionFeatures,\n b: SessionFeatures,\n w: ClusterWeights = DEFAULT_WEIGHTS\n): number {\n const actionD = a.actionSignature === b.actionSignature ? 0 : 1;\n const toolD = jaccardDistance(\n Object.keys(a.toolHistogram),\n Object.keys(b.toolHistogram)\n );\n const extD = jaccardDistance(a.fileExtensions, b.fileExtensions);\n const pathD = a.pathFingerprint === b.pathFingerprint ? 0 : 1;\n const promptD = a.promptShape === b.promptShape ? 0 : 1;\n const outcomeD = a.outcome === b.outcome ? 0 : 1;\n return (\n w.actionSignature * actionD +\n w.toolJaccard * toolD +\n w.extJaccard * extD +\n w.pathFingerprint * pathD +\n w.promptShape * promptD +\n w.outcome * outcomeD\n );\n}\n\nfunction jaccardDistance(a: string[], b: string[]): number {\n if (a.length === 0 && b.length === 0) return 0;\n const A = new Set(a);\n const B = new Set(b);\n let intersection = 0;\n for (const x of A) if (B.has(x)) intersection += 1;\n const union = A.size + B.size - intersection;\n if (union === 0) return 0;\n return 1 - intersection / union;\n}\n\nfunction buildCluster(members: SessionFeatures[], pass: Pass): Cluster {\n const sorted = [...members].sort(\n (a, b) => a.startedAt.getTime() - b.startedAt.getTime()\n );\n const centroid = sorted[Math.floor(sorted.length / 2)]!;\n const id = sha256(sorted.map((m) => m.sessionId).join(\"|\"));\n const days = new Set<string>();\n for (const m of sorted) {\n days.add(m.startedAt.toISOString().slice(0, 10));\n }\n return {\n id,\n members: sorted.map((m) => m.sessionId),\n centroidPromptShape: centroid.promptShape,\n centroidFeatures: centroid,\n daysSpanned: days.size,\n pass: passShortLabel(pass),\n };\n}\n\n// The Cluster type's `pass` field is \"A\" | \"B\"; collapse the four\n// Pass-A variants down so consumers don't need to care which one\n// fired. centroidFeatures.commandHint / verbObject / actionSignature\n// already carries the specific reason.\nfunction passShortLabel(pass: Pass): \"A\" | \"B\" {\n return pass === \"B\" ? \"B\" : \"A\";\n}\n","// Stage 3: score. Per docs/03-mvp-mem-cli/05-pattern-detection.md\n// \"Stage 3\" — v0 is outcome-blind: no acceptance_rate term.\n\nimport type { Cluster, SessionFeatures } from \"./types.js\";\n\nexport type ScoreWeights = {\n uses: number;\n recurrence: number;\n toolRichness: number;\n recentlySeenPenalty: number;\n};\n\nexport const DEFAULT_SCORE_WEIGHTS: ScoreWeights = {\n uses: 0.4,\n recurrence: 0.4,\n toolRichness: 0.2,\n recentlySeenPenalty: 0.1,\n};\n\nexport type ScoreOpts = {\n weights?: ScoreWeights;\n // sessions per day to normalize against. 5 = \"5 uses/day = full\n // marks\". Sessions above the ceiling clamp to 1.\n usesCeiling?: number;\n // promoted slugs the user has already accepted; their pattern\n // shapes get the recently-seen penalty.\n alreadyPromotedShapes?: Set<string>;\n};\n\nexport type ScoredCluster = {\n cluster: Cluster;\n score: number;\n breakdown: Record<string, number>;\n};\n\nexport function scoreClusters(\n clusters: Cluster[],\n opts: ScoreOpts = {}\n): ScoredCluster[] {\n const w = opts.weights ?? DEFAULT_SCORE_WEIGHTS;\n const usesCeiling = opts.usesCeiling ?? 5;\n const promoted = opts.alreadyPromotedShapes ?? new Set<string>();\n\n return clusters\n .map((c) => {\n const breakdown = scoreOne(c, w, usesCeiling, promoted);\n const score = sum(breakdown);\n return { cluster: c, score, breakdown };\n })\n .sort((a, b) => b.score - a.score);\n}\n\nfunction scoreOne(\n cluster: Cluster,\n w: ScoreWeights,\n usesCeiling: number,\n promoted: Set<string>\n): Record<string, number> {\n const uses = cluster.members.length;\n const days = Math.max(1, cluster.daysSpanned);\n const usesPerDay = uses / days;\n const usesScore = w.uses * Math.min(1, usesPerDay / usesCeiling);\n\n // recurrence: log scale on days spanned. 1d → 0, 7d → ~0.5,\n // 30d+ → ~1.0. Using log2(days+1) / log2(31).\n const recurrenceScore =\n w.recurrence * Math.min(1, Math.log2(days + 1) / Math.log2(31));\n\n const toolRichnessScore =\n w.toolRichness * toolRichness(cluster.centroidFeatures);\n\n const penalty = promoted.has(cluster.centroidPromptShape)\n ? w.recentlySeenPenalty\n : 0;\n\n return {\n uses: usesScore,\n recurrence: recurrenceScore,\n toolRichness: toolRichnessScore,\n recentlySeenPenalty: -penalty,\n };\n}\n\nfunction toolRichness(f: SessionFeatures): number {\n // 1 distinct tool → 0.0, 2 → 0.4, 3 → 0.7, 4+ → 1.0.\n const distinct = Object.keys(f.toolHistogram).length;\n if (distinct <= 1) return 0;\n if (distinct === 2) return 0.4;\n if (distinct === 3) return 0.7;\n return 1;\n}\n\nfunction sum(record: Record<string, number>): number {\n let total = 0;\n for (const v of Object.values(record)) total += v;\n return total;\n}\n","// Stage 4: render. Turns scored clusters into Candidate objects\n// with deterministic prompts, suggested tools, draft eval, and\n// a slug. Per docs/03-mvp-mem-cli/05-pattern-detection.md → \"Stage 4\".\n\nimport { sha256, toolFingerprintHash, pathFingerprintHash } from \"./hashes.js\";\nimport { firstActionableUserPrompt } from \"./prompts.js\";\nimport type { ScoredCluster } from \"./score.js\";\nimport type { Candidate, NormalizedSession, SessionFeatures } from \"./types.js\";\n\nexport type RenderOpts = {\n // Top-K candidates to render. Default 10.\n top?: number;\n exemplarsPerCandidate?: number;\n};\n\nconst DEFAULTS = {\n top: 10,\n exemplarsPerCandidate: 3,\n} as const;\n\nexport function renderCandidates(\n scored: ScoredCluster[],\n sessionsById: Map<string, NormalizedSession>,\n opts: RenderOpts = {}\n): Candidate[] {\n const limit = opts.top ?? DEFAULTS.top;\n const k = opts.exemplarsPerCandidate ?? DEFAULTS.exemplarsPerCandidate;\n\n const used = new Set<string>();\n const out: Candidate[] = [];\n\n for (const sc of scored) {\n if (out.length >= limit) break;\n const candidate = renderOne(sc, sessionsById, k, used);\n if (candidate === undefined) continue;\n out.push(candidate);\n }\n return out;\n}\n\nfunction renderOne(\n sc: ScoredCluster,\n sessionsById: Map<string, NormalizedSession>,\n k: number,\n usedSlugs: Set<string>\n): Candidate | undefined {\n const cf = sc.cluster.centroidFeatures;\n const exemplarIds = sc.cluster.members.slice(0, k);\n const exemplars = exemplarIds\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n if (exemplars.length === 0) return undefined;\n\n const draftPrompt = buildDraftPrompt(exemplars[0]!);\n const suggestedTools = pickSuggestedTools(exemplars);\n\n const memberSessions = sc.cluster.members\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n const memberStarts = memberSessions.map((s) => s.startedAt.getTime());\n const firstSeenAt = new Date(Math.min(...memberStarts)).toISOString();\n const lastSeenAt = new Date(Math.max(...memberStarts)).toISOString();\n const slug = mintSlug(\n cf.commandHint,\n cf.verbObject,\n draftPrompt,\n sc.cluster.id,\n usedSlugs\n );\n usedSlugs.add(slug);\n\n return {\n slug,\n uses: sc.cluster.members.length,\n spanDays: sc.cluster.daysSpanned,\n toolFingerprint: toolFingerprintHash(suggestedTools),\n pathFingerprint: pathFingerprintHash(cf.fileExtensions),\n promptShape: cf.promptShape,\n score: round(sc.score, 4),\n scoreBreakdown: roundAll(sc.breakdown, 4),\n exemplarSessionIds: exemplarIds,\n firstSeenAt,\n lastSeenAt,\n draftPrompt,\n suggestedTools,\n draftEval: {\n type: \"session-replay\",\n fixtures: exemplarIds,\n asserts: [{ kind: \"tools-used\", subset: suggestedTools.slice(0, 3) }],\n },\n summary: buildSummary(sc, suggestedTools, exemplars),\n };\n}\n\nfunction buildDraftPrompt(centroidSession: NormalizedSession): string {\n let body = firstActionableUserPrompt(centroidSession);\n if (body === undefined) return \"Pattern: see exemplar sessions for shape.\";\n body = body.trim();\n if (body.length > 1500) body = `${body.slice(0, 1497)}…`;\n // Append a generic multi-step hint when the cluster has 3+ tool kinds.\n return body;\n}\n\nfunction pickSuggestedTools(exemplars: NormalizedSession[]): string[] {\n // Intersection across exemplars first, padded by union ordering.\n const sets = exemplars.map((s) => new Set(s.toolCalls.map((t) => t.name)));\n if (sets.length === 0) return [];\n const intersection = new Set(sets[0]);\n for (const s of sets.slice(1)) {\n for (const t of intersection) if (!s.has(t)) intersection.delete(t);\n }\n const union = new Set<string>();\n for (const s of sets) for (const t of s) union.add(t);\n\n const inter = [...intersection];\n const rest = [...union].filter((t) => !intersection.has(t));\n const all = [...inter, ...rest];\n return all.slice(0, 8); // cap per spec\n}\n\nfunction mintSlug(\n commandHint: string | undefined,\n verbObject: string | undefined,\n draftPrompt: string,\n clusterId: string,\n used: Set<string>\n): string {\n const candidate =\n commandHint ??\n verbObject ??\n extractVerbObject(draftPrompt) ??\n `pattern-${clusterId.slice(0, 8)}`;\n if (!used.has(candidate)) return candidate;\n return `${candidate}-${clusterId.slice(0, 4)}`;\n}\n\nconst VERB_OBJECT_REGEX =\n /^(?:please\\s+)?(?:can\\s+you\\s+)?(\\w+)\\s+(?:the\\s+|a\\s+|this\\s+|my\\s+)?(\\w+(?:\\s+\\w+)?)/i;\n\nfunction extractVerbObject(prompt: string): string | undefined {\n const m = VERB_OBJECT_REGEX.exec(prompt.trim());\n if (m === null) return undefined;\n const verb = m[1]!.toLowerCase();\n const object = m[2]!.toLowerCase().replace(/\\s+/g, \"-\");\n // Skip pure-prose extractions (\"the the\", \"is is\").\n if (verb === object) return undefined;\n if (verb.length < 3 || object.length < 3) return undefined;\n return `${verb}-${object}`.replace(/[^a-z0-9-]/g, \"\");\n}\n\nfunction buildSummary(\n sc: ScoredCluster,\n tools: string[],\n exemplars: NormalizedSession[]\n): string {\n const f: SessionFeatures = sc.cluster.centroidFeatures;\n const exts =\n f.fileExtensions.length > 0\n ? f.fileExtensions.slice(0, 5).join(\", \")\n : \"no-file-touches\";\n const exemplarLine = exemplars\n .map((e) => e.id)\n .slice(0, 3)\n .join(\", \");\n return (\n `This pattern appears in ${sc.cluster.members.length} sessions ` +\n `across ${sc.cluster.daysSpanned} days. Each session uses ` +\n `${tools.slice(0, 3).join(\", \") || \"no tools\"}, ` +\n `touches files matching ${exts}. ` +\n `Examples: ${exemplarLine}.`\n );\n}\n\nfunction round(n: number, d: number): number {\n const f = 10 ** d;\n return Math.round(n * f) / f;\n}\n\nfunction roundAll(\n rec: Record<string, number>,\n d: number\n): Record<string, number> {\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(rec)) out[k] = round(v, d);\n return out;\n}\n\n// Internal hash export so the CLI can unit-test deterministic output.\nexport const __testing = { sha256 };\n","// Top-level entry: runs all 5 stages end-to-end and returns\n// candidates plus the dropped-session manifest for diagnostics.\n\nimport { clusterSessions, type ClusterOpts } from \"./cluster.js\";\nimport { featurizeMany } from \"./featurize.js\";\nimport { filterSessions, type FilterOpts } from \"./filter.js\";\nimport { renderCandidates, type RenderOpts } from \"./render.js\";\nimport { scoreClusters, type ScoreOpts } from \"./score.js\";\nimport type { Candidate, FilterResult, NormalizedSession } from \"./types.js\";\n\nexport type MineOpts = {\n filter?: FilterOpts;\n cluster?: ClusterOpts;\n score?: ScoreOpts;\n render?: RenderOpts;\n};\n\nexport type MineResult = {\n candidates: Candidate[];\n filtered: FilterResult;\n clusterCount: number;\n sessionCountInput: number;\n sessionCountKept: number;\n};\n\nexport function mineSessions(\n sessions: NormalizedSession[],\n opts: MineOpts = {}\n): MineResult {\n const filtered = filterSessions(sessions, opts.filter);\n const features = featurizeMany(filtered.kept);\n const clusters = clusterSessions(features, opts.cluster);\n const scored = scoreClusters(clusters, opts.score);\n\n const sessionsById = new Map(filtered.kept.map((s) => [s.id, s]));\n const candidates = renderCandidates(scored, sessionsById, opts.render);\n\n return {\n candidates,\n filtered,\n clusterCount: clusters.length,\n sessionCountInput: sessions.length,\n sessionCountKept: filtered.kept.length,\n };\n}\n","// Parse Prometheus-shaped durations: \"30d\", \"24h\", \"30m\", \"45s\".\n// Returns milliseconds. Throws on malformed input.\n\nconst UNITS: Record<string, number> = {\n s: 1_000,\n m: 60 * 1_000,\n h: 60 * 60 * 1_000,\n d: 24 * 60 * 60 * 1_000,\n};\n\nexport function parseDuration(input: string): number {\n const m = /^(\\d+)([smhd])$/.exec(input.trim());\n if (!m) {\n throw new Error(\n `Invalid duration \"${input}\". Use forms like 30d, 24h, 30m, 45s.`\n );\n }\n const n = Number(m[1]);\n const unit = m[2] as keyof typeof UNITS;\n return n * UNITS[unit]!;\n}\n","import { z } from \"zod\";\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\nimport { readConfig } from \"../store/config.js\";\n\nconst eventNameSchema = z.enum([\n \"mining_scan_started\",\n \"mining_scan_completed\",\n \"pattern_detected\",\n \"suggestion_submitted\",\n \"suggestion_viewed\",\n \"suggestion_voted\",\n \"suggestion_accepted\",\n \"suggestion_dismissed\",\n \"mining_session_completed\",\n]);\n\nconst eventValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(z.union([z.string(), z.number(), z.boolean()])),\n]);\n\nconst eventPropertiesSchema = z.record(eventValueSchema.optional());\n\nexport type PlatformEventName = z.infer<typeof eventNameSchema>;\nexport type PlatformEventProperties = z.infer<typeof eventPropertiesSchema>;\n\nexport type PlatformEventClient = {\n send(\n event: PlatformEventName,\n properties?: PlatformEventProperties\n ): Promise<void>;\n};\n\nexport type PlatformEventClientOptions = {\n apiBase?: string;\n workspaceSlug?: string;\n token?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class PlatformEventError extends Error {\n exitCode: ExitCode;\n status: number | undefined;\n body: string | undefined;\n\n constructor(\n message: string,\n exitCode: ExitCode,\n status?: number,\n body?: string\n ) {\n super(message);\n this.name = \"PlatformEventError\";\n this.exitCode = exitCode;\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function createPlatformEventClient(\n options: PlatformEventClientOptions = {}\n): Promise<PlatformEventClient> {\n const config = await readConfig();\n const apiBase = (\n options.apiBase ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n const token = options.token ?? config.platform.accessToken;\n if (token === undefined || token.length === 0) {\n throw new PlatformEventError(\"not signed in. Run: operon login\", EXIT.auth);\n }\n const workspaceSlug = options.workspaceSlug ?? config.platform.workspaceSlug;\n if (workspaceSlug === undefined || workspaceSlug.length === 0) {\n throw new PlatformEventError(\n \"missing workspace. Pass --workspace or run: operon login --workspace <slug>\",\n EXIT.config\n );\n }\n\n return {\n send: (event, properties = {}) =>\n sendPlatformEvent({\n apiBase,\n token,\n workspaceSlug,\n event,\n properties,\n ...(options.fetchImpl !== undefined\n ? { fetchImpl: options.fetchImpl }\n : {}),\n }),\n };\n}\n\nexport async function sendPlatformEvent(input: {\n apiBase: string;\n token: string;\n workspaceSlug: string;\n event: PlatformEventName;\n properties?: PlatformEventProperties;\n fetchImpl?: typeof fetch;\n}): Promise<void> {\n const event = eventNameSchema.parse(input.event);\n const properties = eventPropertiesSchema.parse(input.properties ?? {});\n const fetchImpl = input.fetchImpl ?? fetch;\n\n let res: Response;\n try {\n res = await fetchImpl(\n `${input.apiBase.replace(/\\/+$/, \"\")}/api/v1/events`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-operon-source\": \"cli\",\n authorization: `Bearer ${input.token}`,\n },\n body: JSON.stringify({\n event,\n properties: {\n ...properties,\n workspaceSlug: input.workspaceSlug,\n source: \"cli\",\n },\n }),\n }\n );\n } catch (e) {\n throw new PlatformEventError(\n `network error: ${(e as Error).message}`,\n EXIT.network\n );\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n throw new PlatformEventError(\n `server returned ${res.status}: ${body.slice(0, 400)}`,\n res.status === 401 ? EXIT.auth : EXIT.err,\n res.status,\n body\n );\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Candidate } from \"@operon/mining\";\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\nimport { readCandidate } from \"../store/candidates.js\";\nimport { readConfig } from \"../store/config.js\";\nimport { candidateDir } from \"../store/paths.js\";\n\nexport type PushOperonOptions = {\n slug: string;\n candidate?: Candidate;\n workspace?: string;\n visibility?: \"private\" | \"team\";\n apiBase?: string;\n token?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport type PushOperonResult = {\n operonId: string;\n versionId: string;\n semver: string;\n storagePath: string;\n workspaceSlug: string;\n requiresEval?: boolean;\n url: string;\n usedDraftPrompt: boolean;\n};\n\nexport class PushOperonError extends Error {\n exitCode: ExitCode;\n status: number | undefined;\n body: string | undefined;\n\n constructor(\n message: string,\n exitCode: ExitCode,\n status?: number,\n body?: string\n ) {\n super(message);\n this.name = \"PushOperonError\";\n this.exitCode = exitCode;\n this.status = status;\n this.body = body;\n }\n}\n\nexport async function pushOperon(\n options: PushOperonOptions\n): Promise<PushOperonResult> {\n const config = await readConfig();\n const apiBase = (\n options.apiBase ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n const token = options.token ?? config.platform.accessToken;\n if (token === undefined || token.length === 0) {\n throw new PushOperonError(\"not signed in. Run: operon login\", EXIT.auth);\n }\n const workspaceSlug = options.workspace ?? config.platform.workspaceSlug;\n\n const candidate = options.candidate ?? (await readCandidate(options.slug));\n if (candidate === undefined) {\n throw new PushOperonError(\n `no candidate \"${options.slug}\" found locally. Run scan first.`,\n EXIT.noWork\n );\n }\n\n const skill = await readSkillMarkdown(candidate);\n const testsYaml = await readTestsYaml(candidate.slug);\n const body = {\n ...(workspaceSlug !== undefined ? { workspaceSlug } : {}),\n slug: options.slug,\n name: titleCase(options.slug),\n description: truncate(candidate.summary, 1800),\n polishedSkillMarkdown: skill.markdown,\n ...(testsYaml !== undefined ? { testsYaml } : {}),\n suggestedTools: candidate.suggestedTools,\n visibility: options.visibility ?? \"team\",\n candidateMeta: {\n uses: candidate.uses,\n spanDays: candidate.spanDays,\n firstSeenAt: candidate.firstSeenAt,\n lastSeenAt: candidate.lastSeenAt,\n score: candidate.score,\n },\n };\n\n const fetchImpl = options.fetchImpl ?? fetch;\n let res: Response;\n try {\n res = await fetchImpl(`${apiBase}/api/v1/operons`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-operon-source\": \"cli\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n } catch (e) {\n throw new PushOperonError(\n `network error: ${(e as Error).message}`,\n EXIT.network\n );\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"<unreadable>\");\n throw new PushOperonError(\n `server returned ${res.status}: ${text.slice(0, 400)}`,\n res.status === 401 ? EXIT.auth : EXIT.err,\n res.status,\n text\n );\n }\n\n const json = (await res.json()) as Omit<\n PushOperonResult,\n \"url\" | \"usedDraftPrompt\"\n >;\n return {\n ...json,\n url: `${apiBase}/${json.workspaceSlug}/${options.slug}`,\n usedDraftPrompt: skill.usedDraftPrompt,\n };\n}\n\nexport async function readTestsYaml(slug: string): Promise<string | undefined> {\n try {\n return await readFile(join(candidateDir(slug), \"tests.yaml\"), \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nexport async function readSkillMarkdown(\n candidate: Candidate\n): Promise<{ markdown: string; usedDraftPrompt: boolean }> {\n try {\n return {\n markdown: await readFile(\n join(candidateDir(candidate.slug), \"polished.md\"),\n \"utf8\"\n ),\n usedDraftPrompt: false,\n };\n } catch {\n return {\n markdown: `---\\nname: ${candidate.slug}\\ndescription: ${truncate(candidate.summary, 90)}\\n---\\n\\n${candidate.draftPrompt}\\n`,\n usedDraftPrompt: true,\n };\n }\n}\n\nexport function titleCase(slug: string): string {\n return slug\n .split(\"-\")\n .map((p) => (p.length === 0 ? p : p[0]!.toUpperCase() + p.slice(1)))\n .join(\" \");\n}\n\nexport function truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n","// `operon mcp` - launch the stdio MCP server used by Claude\n// Desktop, Cursor, and other local MCP-capable clients.\n\nimport { Command } from \"commander\";\nimport { runStdioServer } from \"@operon/mcp\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { log } from \"../lib/logger.js\";\n\nexport function mcpCommand(): Command {\n return new Command(\"mcp\")\n .description(\"Launch the Operon MCP server over stdio.\")\n .action(async () => {\n try {\n await runStdioServer();\n } catch (e) {\n log.err(e instanceof Error ? e.message : String(e));\n process.exit(EXIT.err);\n }\n });\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createOperonMcpServer, type ServerOptions } from \"./tools.js\";\n\nexport {\n DEFAULT_API_BASE,\n OperonApiClient,\n createOperonMcpServer,\n type GetOperonResponse,\n type ListOperonsResponse,\n type OperonApiClientOptions,\n type RecordRunResponse,\n type ServerOptions,\n} from \"./tools.js\";\n\nexport async function runStdioServer(\n options: ServerOptions = {}\n): Promise<void> {\n const server = await createOperonMcpServer(options);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { createHash } from \"node:crypto\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nexport const DEFAULT_API_BASE = \"https://app.withoperon.com\";\nconst slugRe = /^[a-z0-9-]+$/;\nconst semverRe = /^\\d+\\.\\d+\\.\\d+(-[a-z0-9.]+)?$/;\nconst sha256HexRe = /^[a-f0-9]{64}$/i;\nconst maxInt = 2_147_483_647;\n\nconst workspaceSchema = z.string().min(1).max(64).regex(slugRe);\nconst slugSchema = z.string().min(1).max(64).regex(slugRe);\nconst semverSchema = z.string().min(1).max(64).regex(semverRe);\n\nconst listOperonsResponseSchema = z.object({\n workspace: z.object({\n slug: z.string(),\n name: z.string(),\n }),\n operons: z.array(\n z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n visibility: z.string(),\n tags: z.array(z.string()),\n updatedAt: z.string(),\n currentVersion: z\n .object({\n semver: z.string(),\n contentHash: z.string().regex(sha256HexRe),\n publishStatus: z.string(),\n evalStatus: z.string(),\n })\n .nullable(),\n })\n ),\n});\n\nconst pullResponseSchema = z.object({\n workspace: z.object({\n slug: z.string(),\n name: z.string(),\n }),\n operon: z.object({\n slug: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n visibility: z.string(),\n tags: z.array(z.string()),\n }),\n version: z.object({\n semver: z.string(),\n contentHash: z.string().regex(sha256HexRe),\n publishStatus: z.string(),\n evalStatus: z.string(),\n createdAt: z.string(),\n changelog: z.string().nullable(),\n }),\n skillUrl: z.string().url(),\n});\n\nconst recordRunResponseSchema = z.object({\n runId: z.string().uuid(),\n status: z.enum([\"running\", \"succeeded\", \"failed\", \"timeout\"]),\n runsUsedMtd: z.number().int().nonnegative(),\n runsCap: z.number().int().nonnegative().nullable(),\n overCap: z.boolean(),\n});\n\nexport type ListOperonsResponse = z.infer<typeof listOperonsResponseSchema>;\nexport type GetOperonResponse = {\n workspace: string;\n slug: string;\n name: string;\n semver: string;\n contentHash: string;\n skillMarkdown: string;\n};\nexport type RecordRunResponse = z.infer<typeof recordRunResponseSchema>;\n\nexport type OperonApiClientOptions = {\n apiBase: string;\n token: string;\n fetchImpl?: typeof fetch | undefined;\n};\n\nexport class OperonApiClient {\n private readonly apiBase: string;\n private readonly token: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: OperonApiClientOptions) {\n this.apiBase = options.apiBase.replace(/\\/+$/, \"\");\n this.token = options.token;\n const fetchImpl = options.fetchImpl ?? globalThis.fetch;\n this.fetchImpl = (input, init) => fetchImpl(input, init);\n }\n\n async validateToken(): Promise<void> {\n await this.requestJson(`${this.apiBase}/api/v1/whoami`, z.object({}));\n }\n\n listOperons(workspace: string): Promise<ListOperonsResponse> {\n return this.requestJson(\n `${this.apiBase}/api/v1/workspaces/${workspace}/operons`,\n listOperonsResponseSchema\n );\n }\n\n async getOperon(input: {\n workspace: string;\n slug: string;\n semver?: string | undefined;\n }): Promise<GetOperonResponse> {\n const params = new URLSearchParams();\n if (input.semver !== undefined) params.set(\"semver\", input.semver);\n const query = params.size > 0 ? `?${params.toString()}` : \"\";\n const metadata = await this.requestJson(\n `${this.apiBase}/api/v1/workspaces/${input.workspace}/operons/${input.slug}${query}`,\n pullResponseSchema\n );\n\n const skillRes = await this.fetchImpl(metadata.skillUrl);\n if (!skillRes.ok) {\n throw new Error(`skill download returned ${skillRes.status}`);\n }\n const skillMarkdown = await skillRes.text();\n const actualHash = createHash(\"sha256\").update(skillMarkdown).digest(\"hex\");\n const expectedHash = metadata.version.contentHash.toLowerCase();\n if (actualHash !== expectedHash) {\n throw new Error(\n `content hash mismatch: expected ${expectedHash}, got ${actualHash}`\n );\n }\n\n return {\n workspace: metadata.workspace.slug,\n slug: metadata.operon.slug,\n name: metadata.operon.name,\n semver: metadata.version.semver,\n contentHash: expectedHash,\n skillMarkdown,\n };\n }\n\n recordRun(input: {\n workspace: string;\n operonSlug: string;\n semver: string;\n status: \"running\" | \"succeeded\" | \"failed\" | \"timeout\";\n startedAt?: string | undefined;\n finishedAt?: string | undefined;\n durationMs?: number | undefined;\n inputHash?: string | undefined;\n tokenIn?: number | undefined;\n tokenOut?: number | undefined;\n costUsdEstimated?: number | undefined;\n billedRunCount?: number | undefined;\n }): Promise<RecordRunResponse> {\n const payload = {\n workspaceSlug: input.workspace,\n operonSlug: input.operonSlug,\n semver: input.semver,\n invocationSource: \"mcp\",\n status: input.status,\n ...(input.startedAt !== undefined ? { startedAt: input.startedAt } : {}),\n ...(input.finishedAt !== undefined\n ? { finishedAt: input.finishedAt }\n : {}),\n ...(input.durationMs !== undefined\n ? { durationMs: input.durationMs }\n : {}),\n ...(input.inputHash !== undefined ? { inputHash: input.inputHash } : {}),\n ...(input.tokenIn !== undefined ? { tokenIn: input.tokenIn } : {}),\n ...(input.tokenOut !== undefined ? { tokenOut: input.tokenOut } : {}),\n ...(input.costUsdEstimated !== undefined\n ? { costUsdEstimated: input.costUsdEstimated }\n : {}),\n ...(input.billedRunCount !== undefined\n ? { billedRunCount: input.billedRunCount }\n : {}),\n };\n return this.requestJson(\n `${this.apiBase}/api/v1/runs`,\n recordRunResponseSchema,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n }\n );\n }\n\n private async requestJson<T>(\n url: string,\n schema: z.ZodType<T>,\n init: RequestInit = {}\n ): Promise<T> {\n let res: Response;\n try {\n res = await this.fetchImpl(url, {\n ...init,\n headers: {\n ...init.headers,\n \"x-operon-source\": \"mcp\",\n authorization: `Bearer ${this.token}`,\n },\n });\n } catch (e) {\n throw new Error(`network error: ${(e as Error).message}`);\n }\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n throw new Error(`server returned ${res.status}: ${body.slice(0, 400)}`);\n }\n return schema.parse(await res.json());\n }\n}\n\nexport type ServerOptions = {\n apiBase?: string | undefined;\n token?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n validateOnStart?: boolean | undefined;\n};\n\nexport async function createOperonMcpServer(\n options: ServerOptions = {}\n): Promise<McpServer> {\n const apiBase =\n options.apiBase ?? process.env[\"OPERON_API_BASE\"] ?? DEFAULT_API_BASE;\n const token = options.token ?? process.env[\"OPERON_TOKEN\"];\n if (token === undefined || token.length === 0) {\n throw new Error(\"OPERON_TOKEN is required\");\n }\n\n const client = new OperonApiClient({\n apiBase,\n token,\n fetchImpl: options.fetchImpl,\n });\n if (options.validateOnStart !== false) {\n await client.validateToken();\n }\n\n const server = new McpServer({\n name: \"operon\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"list_operons\",\n {\n title: \"List Operons\",\n description: \"List operons visible to a workspace member.\",\n inputSchema: {\n workspace: workspaceSchema.describe(\"Workspace slug\"),\n },\n },\n async ({ workspace }) => jsonResult(await client.listOperons(workspace))\n );\n\n server.registerTool(\n \"get_operon\",\n {\n title: \"Get Operon\",\n description:\n \"Fetch an operon's SKILL.md and version metadata for use as context.\",\n inputSchema: {\n workspace: workspaceSchema.describe(\"Workspace slug\"),\n slug: slugSchema.describe(\"Operon slug\"),\n semver: semverSchema\n .optional()\n .describe(\"Optional semver; defaults to current version\"),\n },\n },\n async ({ workspace, slug, semver }) => {\n const operon = await client.getOperon({ workspace, slug, semver });\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# ${operon.workspace}/${operon.slug}@${operon.semver}\\n\\n${operon.skillMarkdown}`,\n },\n ],\n };\n }\n );\n\n server.registerTool(\n \"record_run\",\n {\n title: \"Record Run\",\n description: \"Record an MCP invocation against an operon version.\",\n inputSchema: {\n workspace: workspaceSchema.describe(\"Workspace slug\"),\n operonSlug: slugSchema.describe(\"Operon slug\"),\n semver: semverSchema.describe(\"Version semver\"),\n status: z\n .enum([\"running\", \"succeeded\", \"failed\", \"timeout\"])\n .describe(\"Run status\"),\n startedAt: z.string().datetime({ offset: true }).optional(),\n finishedAt: z.string().datetime({ offset: true }).optional(),\n durationMs: z.number().int().min(0).max(maxInt).optional(),\n inputHash: z.string().regex(sha256HexRe).optional(),\n tokenIn: z.number().int().min(0).max(maxInt).optional(),\n tokenOut: z.number().int().min(0).max(maxInt).optional(),\n costUsdEstimated: z\n .number()\n .finite()\n .min(0)\n .max(9999.999999)\n .optional(),\n billedRunCount: z.number().int().min(1).max(maxInt).optional(),\n },\n },\n async (input) => jsonResult(await client.recordRun(input))\n );\n\n return server;\n}\n\nfunction jsonResult(value: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(value, null, 2),\n },\n ],\n };\n}\n","// `operon polish <slug>` — call Claude to turn a candidate into a\n// clean SKILL.md. Strict opt-in: requires ANTHROPIC_API_KEY.\n// `operon polish --batch` polishes all candidates above\n// --min-score (default 0).\n\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport type { Candidate, NormalizedSession } from \"@operon/mining\";\nimport { ADAPTERS } from \"../ingestion/index.js\";\nimport { polishCandidate } from \"../llm/polish.js\";\nimport type { PolishError, PolishResult } from \"../llm/polish.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { listCandidates, readCandidate } from \"../store/candidates.js\";\nimport { candidateDir } from \"../store/paths.js\";\n\nconst slugSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/);\n\nconst optsSchema = z.object({\n batch: z.boolean().default(false),\n minScore: z.coerce.number().default(0),\n limit: z.coerce.number().int().positive().default(10),\n});\n\nexport function polishCommand(): Command {\n return new Command(\"polish\")\n .argument(\"[slug]\", \"Candidate slug to polish (omit with --batch)\")\n .description(\n \"Use Claude to turn a candidate into a clean SKILL.md. Requires ANTHROPIC_API_KEY.\"\n )\n .option(\"--batch\", \"Polish every candidate above --min-score\", false)\n .option(\"--min-score <n>\", \"Score threshold for --batch (default 0)\", \"0\")\n .option(\n \"--limit <n>\",\n \"Cap the number of candidates polished in --batch\",\n \"10\"\n )\n .action(async (slugArg: string | undefined, rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n\n if (opts.batch) {\n await runBatch(opts.minScore, opts.limit);\n return;\n }\n\n if (slugArg === undefined) {\n log.err(\"polish: pass a slug or --batch\");\n process.exit(EXIT.config);\n return;\n }\n const slug = slugSchema.parse(slugArg);\n const candidate = await readCandidate(slug);\n if (candidate === undefined) {\n log.err(`no candidate \"${slug}\" found`);\n process.exit(EXIT.noWork);\n return;\n }\n\n const result = await polishOne(candidate);\n if (\"error\" in result) {\n exitFromPolishError(result.error);\n return;\n }\n\n if (getGlobals().json) {\n log.json({\n slug: result.slug,\n path: join(candidateDir(slug), \"polished.md\"),\n model: result.model,\n usage: result.usage,\n });\n } else {\n log.step(\n `wrote ${join(candidateDir(slug), \"polished.md\")} (${result.usage.inputTokens} in / ${result.usage.outputTokens} out tokens)`\n );\n log.info(\"\");\n log.info(result.markdown);\n }\n process.exit(EXIT.ok);\n });\n}\n\nasync function runBatch(minScore: number, limit: number): Promise<void> {\n const all = await listCandidates();\n const eligible = all\n .filter((c) => c.score >= minScore)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n\n if (eligible.length === 0) {\n log.err(\n `no candidates above min-score=${minScore} (out of ${all.length} total)`\n );\n process.exit(EXIT.noWork);\n return;\n }\n\n log.step(\n `batch polishing ${eligible.length} candidate${eligible.length === 1 ? \"\" : \"s\"} via Claude...`\n );\n\n const results: {\n slug: string;\n ok: boolean;\n inputTokens?: number;\n outputTokens?: number;\n error?: string;\n }[] = [];\n\n for (const c of eligible) {\n const r = await polishOne(c);\n if (\"error\" in r) {\n // Hard-fail on no-api-key — pointless to keep trying.\n if (r.error.kind === \"no-api-key\") {\n log.err(\n \"ANTHROPIC_API_KEY is not set. Polish requires explicit opt-in via the env var.\"\n );\n process.exit(EXIT.config);\n return;\n }\n results.push({ slug: c.slug, ok: false, error: errorMessage(r.error) });\n log.warn(` ${c.slug}: ${errorMessage(r.error)}`);\n continue;\n }\n results.push({\n slug: c.slug,\n ok: true,\n inputTokens: r.usage.inputTokens,\n outputTokens: r.usage.outputTokens,\n });\n log.info(\n ` ${c.slug} (${r.usage.inputTokens} in / ${r.usage.outputTokens} out)`\n );\n }\n\n const okCount = results.filter((r) => r.ok).length;\n if (getGlobals().json) {\n log.json({ polished: okCount, total: eligible.length, results });\n } else {\n log.step(`polished ${okCount}/${eligible.length}`);\n }\n process.exit(okCount > 0 ? EXIT.ok : EXIT.err);\n}\n\nasync function polishOne(\n candidate: Candidate\n): Promise<PolishResult | { error: PolishError }> {\n const exemplars = await loadExemplars(candidate.exemplarSessionIds);\n if (exemplars.length === 0) {\n return {\n error: {\n kind: \"empty-response\",\n },\n };\n }\n const result = await polishCandidate(candidate, exemplars);\n if (\"error\" in result) return result;\n const path = join(candidateDir(candidate.slug), \"polished.md\");\n await writeFile(path, `${result.markdown}\\n`, \"utf8\");\n return result;\n}\n\nfunction errorMessage(e: PolishError): string {\n switch (e.kind) {\n case \"no-api-key\":\n return \"ANTHROPIC_API_KEY not set\";\n case \"http-error\":\n return `HTTP ${e.status}: ${e.body.slice(0, 200)}`;\n case \"network-error\":\n return `network: ${e.message}`;\n case \"empty-response\":\n return \"empty/missing exemplars or response\";\n }\n}\n\nfunction exitFromPolishError(e: PolishError): void {\n switch (e.kind) {\n case \"no-api-key\":\n log.err(\n \"ANTHROPIC_API_KEY is not set. Polish requires explicit opt-in via the env var.\"\n );\n process.exit(EXIT.config);\n return;\n case \"http-error\":\n log.err(`Anthropic API returned ${e.status}: ${e.body.slice(0, 400)}`);\n process.exit(EXIT.network);\n return;\n case \"network-error\":\n log.err(`network error: ${e.message}`);\n process.exit(EXIT.network);\n return;\n case \"empty-response\":\n log.err(\"Anthropic API returned empty content (or no exemplars)\");\n process.exit(EXIT.err);\n return;\n }\n}\n\nasync function loadExemplars(ids: string[]): Promise<NormalizedSession[]> {\n // Walk every adapter's enumerate stream, normalize each session,\n // and pick out matches by id. Unfortunate O(N) walk but the\n // candidate set is small and v0 has no session cache. v0.5: store\n // normalized exemplars under ~/.operon/candidates/<slug>/exemplars/\n // as JSON for fast reload.\n const wanted = new Set(ids);\n const out: NormalizedSession[] = [];\n for (const adapter of Object.values(ADAPTERS)) {\n if (adapter === undefined) continue;\n const detect = await adapter.detect();\n if (!detect.present) continue;\n for await (const raw of adapter.enumerate({})) {\n const id = `${adapter.name}:${raw.rawId}`;\n if (!wanted.has(id)) continue;\n const session = await adapter.normalize(raw);\n out.push(session);\n wanted.delete(id);\n if (wanted.size === 0) return out;\n }\n }\n return out;\n}\n","// LLM polish stage. Takes a candidate + its exemplar sessions and\n// asks Claude to write a clean SKILL.md the user can drop into\n// .claude/skills/<slug>/. Strict opt-in: requires\n// ANTHROPIC_API_KEY in env. We never silently call out to the\n// network — if the key is missing, we surface a clear error.\n//\n// The network-zero CI gate stays intact because this code path is\n// only entered behind the explicit `operon polish` command (or\n// `scan --polish`). With no key, we hard-fail rather than fall\n// through.\n\nimport type { Candidate } from \"@operon/mining\";\nimport type { NormalizedSession } from \"@operon/mining\";\n\nconst API = \"https://api.anthropic.com/v1/messages\";\nconst MODEL = \"claude-sonnet-4-6\";\nconst MAX_TOKENS = 1500;\n\nexport type PolishResult = {\n slug: string;\n markdown: string;\n model: string;\n usage: { inputTokens: number; outputTokens: number };\n};\n\nexport type PolishError =\n | { kind: \"no-api-key\" }\n | { kind: \"http-error\"; status: number; body: string }\n | { kind: \"network-error\"; message: string }\n | { kind: \"empty-response\" };\n\nexport async function polishCandidate(\n candidate: Candidate,\n exemplars: NormalizedSession[]\n): Promise<PolishResult | { error: PolishError }> {\n const apiKey = process.env[\"ANTHROPIC_API_KEY\"];\n if (apiKey === undefined || apiKey.length === 0) {\n return { error: { kind: \"no-api-key\" } };\n }\n const prompt = buildPrompt(candidate, exemplars);\n let res: Response;\n try {\n res = await fetch(API, {\n method: \"POST\",\n headers: {\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: MODEL,\n max_tokens: MAX_TOKENS,\n messages: [{ role: \"user\", content: prompt }],\n }),\n });\n } catch (e) {\n return {\n error: { kind: \"network-error\", message: (e as Error).message },\n };\n }\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n return { error: { kind: \"http-error\", status: res.status, body } };\n }\n const json = (await res.json()) as {\n content?: { type: string; text?: string }[];\n usage?: { input_tokens: number; output_tokens: number };\n };\n const text = json.content\n ?.filter((b) => b.type === \"text\")\n .map((b) => b.text ?? \"\")\n .join(\"\\n\")\n .trim();\n if (text === undefined || text.length === 0) {\n return { error: { kind: \"empty-response\" } };\n }\n return {\n slug: candidate.slug,\n markdown: text,\n model: MODEL,\n usage: {\n inputTokens: json.usage?.input_tokens ?? 0,\n outputTokens: json.usage?.output_tokens ?? 0,\n },\n };\n}\n\nfunction buildPrompt(c: Candidate, exemplars: NormalizedSession[]): string {\n const exemplarBlocks = exemplars.slice(0, 3).map((s, i) => {\n const userMsg = s.messages.find((m) => m.role === \"user\");\n const lastAssistant = [...s.messages]\n .reverse()\n .find((m) => m.role === \"assistant\");\n const tools = s.toolCalls\n .map((t) => t.name)\n .slice(0, 12)\n .join(\", \");\n return `### Exemplar ${i + 1}\nsession: ${s.id}\nduration: ${s.durationSec}s\ncwd: ${s.cwd ?? \"(unknown)\"}\ntools used: ${tools || \"(none)\"}\nfile extensions: ${s.fileTouches.map((f) => `${f.extension}:${f.count}`).join(\", \") || \"(none)\"}\n\nfirst user prompt (truncated to 800c):\n${(userMsg?.content ?? \"\").slice(0, 800)}\n\nlast assistant message (truncated to 500c):\n${(lastAssistant?.content ?? \"\").slice(0, 500)}`;\n });\n\n return `You are helping a developer turn a recurring Claude Code workflow into a reusable Skill.\n\nThe Operon mining pipeline detected this pattern across ${c.uses} sessions over ${c.spanDays} day(s). The candidate's auto-generated metadata:\n\nslug: ${c.slug}\nsuggested tools: ${c.suggestedTools.join(\", \") || \"(none)\"}\nfile extensions touched: (see exemplars below)\n\nBelow are ${exemplars.length} exemplar sessions that all matched this pattern. Read them carefully.\n\n${exemplarBlocks.join(\"\\n\\n\")}\n\n---\n\nNow write a clean SKILL.md that:\n\n1. Starts with a 1-sentence \"When to use this skill\" trigger that captures what the user is actually trying to accomplish (NOT what tools they used — those are an implementation detail).\n2. Lists 3-7 specific, actionable steps. Each step should be concrete enough that an agent reading just this skill can execute it. Reference the actual pattern observed across the exemplars — paths, commands, decisions.\n3. Has an \"Allowed tools\" line listing the most-used tools from the exemplars.\n4. Ends with one short example invocation in a fenced code block.\n\nOutput ONLY the SKILL.md content, with frontmatter:\n---\nname: ${c.slug}\ndescription: <short description, under 100 chars, what this skill does>\nallowed-tools: <comma-separated tool list>\n---\n\n(then the body)\n\nNo preamble, no explanation, no \"Here is the SKILL.md\". Just the file content.`;\n}\n","// `operon publish <slug>` — upload a polished candidate to the\n// Operon platform so teammates can install it.\n\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { PushOperonError, pushOperon } from \"../lib/push.js\";\n\nconst slugSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/);\n\nconst optsSchema = z.object({\n workspace: z.string().min(1).max(64).optional(),\n visibility: z.enum([\"private\", \"team\"]).default(\"team\"),\n apiBase: z.string().url().optional(),\n});\n\nexport function publishCommand(): Command {\n return new Command(\"publish\")\n .argument(\"<slug>\", \"Candidate slug to publish\")\n .description(\n \"Upload a polished candidate to the Operon platform (requires `operon login`).\"\n )\n .option(\"--workspace <slug>\", \"Override the default workspace from config\")\n .option(\"--visibility <v>\", \"private | team (default: team)\", \"team\")\n .option(\"--api-base <url>\", \"Override platform base URL\")\n .action(async (slugArg: string, rawOpts: unknown) => {\n const slug = slugSchema.parse(slugArg);\n const opts = optsSchema.parse(rawOpts);\n\n log.step(`publishing ${slug} ...`);\n let json;\n try {\n json = await pushOperon({\n slug,\n ...(opts.workspace !== undefined\n ? { workspace: opts.workspace }\n : {}),\n visibility: opts.visibility,\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n });\n } catch (e) {\n if (e instanceof PushOperonError) {\n log.err(e.message);\n process.exit(e.exitCode);\n return;\n }\n throw e;\n }\n if (json.usedDraftPrompt) {\n log.warn(\n `${slug} hasn't been polished yet. Publishing the raw draft prompt instead.`\n );\n log.warn(\n `For better results: ANTHROPIC_API_KEY=... operon polish ${slug}`\n );\n }\n\n if (getGlobals().json) {\n log.json(json);\n } else {\n log.step(`published ${slug}@${json.semver} to ${json.url}`);\n log.info(` storage: ${json.storagePath}`);\n }\n process.exit(EXIT.ok);\n });\n}\n","// `operon prune` — stale-memory cleanup. Lists or archives\n// candidates whose lastSeenAt is older than --older-than. Reversible\n// via `operon undo --list` (each pruned candidate is trashed under\n// ~/.operon/.trash/<undo-id>/).\n\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { parseDuration } from \"../lib/duration.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { listCandidates, trashCandidate } from \"../store/candidates.js\";\n\nconst optsSchema = z.object({\n olderThan: z.string().default(\"60d\"),\n apply: z.boolean().default(false),\n yes: z.boolean().default(false),\n});\n\nexport function pruneCommand(): Command {\n return new Command(\"prune\")\n .description(\n \"Archive stale candidates (lastSeenAt older than --older-than).\"\n )\n .option(\n \"--older-than <duration>\",\n \"Staleness threshold (e.g. 30d, 60d, 90d)\",\n \"60d\"\n )\n .option(\"--apply\", \"Actually archive (default: dry-run)\", false)\n .option(\"--yes\", \"Skip the confirmation prompt\", false)\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n let cutoff: Date;\n try {\n cutoff = new Date(Date.now() - parseDuration(opts.olderThan));\n } catch (e) {\n log.err((e as Error).message);\n process.exit(EXIT.config);\n return;\n }\n\n const all = await listCandidates();\n const stale = all.filter((c) => new Date(c.lastSeenAt) < cutoff);\n\n if (getGlobals().json) {\n log.json({\n olderThan: opts.olderThan,\n cutoff: cutoff.toISOString(),\n totalCandidates: all.length,\n staleCount: stale.length,\n stale: stale.map((c) => ({\n slug: c.slug,\n lastSeenAt: c.lastSeenAt,\n uses: c.uses,\n })),\n applied: opts.apply,\n });\n if (opts.apply && stale.length > 0) {\n for (const c of stale) await trashCandidate(c.slug);\n }\n process.exit(stale.length > 0 ? EXIT.ok : EXIT.noWork);\n }\n\n if (stale.length === 0) {\n log.info(\n `nothing to prune (0 of ${all.length} candidates older than ${opts.olderThan})`\n );\n process.exit(EXIT.noWork);\n }\n\n log.step(\n `${stale.length} stale candidate${stale.length === 1 ? \"\" : \"s\"} (lastSeenAt < ${cutoff.toISOString().slice(0, 10)}):`\n );\n for (const c of stale) {\n const lastSeen = c.lastSeenAt.slice(0, 10);\n log.info(` ${c.slug} (${c.uses} uses, last seen ${lastSeen})`);\n }\n\n if (!opts.apply) {\n log.info(\"\");\n log.info(\"Dry run. Re-run with --apply to archive.\");\n process.exit(EXIT.ok);\n }\n\n // --apply path. Without --yes, we'd prompt; v0 uses --yes\n // gating for non-interactive dogfooding. (Adding a real\n // prompt is a v0.5 ergonomics task.)\n if (!opts.yes) {\n log.err(\n \"Refusing to archive without --yes. Re-run: operon prune --apply --yes\"\n );\n process.exit(EXIT.config);\n return;\n }\n\n const undoIds: string[] = [];\n for (const c of stale) {\n const undoId = await trashCandidate(c.slug);\n undoIds.push(undoId);\n }\n log.step(\n `archived ${undoIds.length} candidate${undoIds.length === 1 ? \"\" : \"s\"} → ~/.operon/.trash/`\n );\n log.info(\"Restore via: operon undo --list\");\n process.exit(EXIT.ok);\n });\n}\n","// `operon scan` — full mining pipeline: ingest → cluster → score → render.\n\nimport { Command, Option } from \"commander\";\nimport type { NormalizedSession } from \"@operon/mining\";\nimport { mineSessions } from \"@operon/mining\";\nimport { z } from \"zod\";\nimport { ADAPTERS, redactSession } from \"../ingestion/index.js\";\nimport type { SourceName } from \"../ingestion/index.js\";\nimport { parseDuration } from \"../lib/duration.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { discoverPeerSkills, annotateWithPeers } from \"../peer/discover.js\";\nimport { renderCandidateTable } from \"../render/candidate-table.js\";\nimport { writeCandidate } from \"../store/candidates.js\";\n\nconst SOURCES = [\"claude-code\", \"codex\", \"cursor\", \"chatgpt\"] as const;\n\nconst optsSchema = z.object({\n source: z.array(z.enum(SOURCES)).default([...SOURCES]),\n since: z.string().optional(),\n top: z.coerce.number().int().positive().default(10),\n redact: z.boolean().default(true),\n anonStats: z.boolean().default(false),\n peer: z.array(z.string()).default([]),\n});\n\nexport function scanCommand(): Command {\n return new Command(\"scan\")\n .description(\n \"Mine local Claude Code, Codex, and Cursor sessions and render candidate operons.\"\n )\n .addOption(\n new Option(\"--source <src...>\", \"Limit to one or more sources\").choices([\n ...SOURCES,\n ])\n )\n .option(\n \"--since <duration>\",\n \"Only consider sessions newer than (e.g. 30d, 14d, 24h)\"\n )\n .option(\"--top <N>\", \"Render top N candidates\", \"10\")\n .option(\"--no-redact\", \"Skip secrets redaction (warns loudly; dev-only)\")\n .option(\"--anon-stats\", \"Opt in to anonymous usage stats (one-time)\", false)\n .option(\n \"--peer <repo...>\",\n \"Cross-reference candidates against peer repos' .claude/skills/\"\n )\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n log.debug(`scan opts: ${JSON.stringify(opts)}`);\n\n let since: Date | undefined;\n if (opts.since !== undefined) {\n try {\n since = new Date(Date.now() - parseDuration(opts.since));\n } catch (e) {\n log.err((e as Error).message);\n process.exit(EXIT.config);\n }\n }\n if (!opts.redact) {\n log.warn(\n \"redaction disabled — secrets in your sessions may surface in output\"\n );\n }\n\n const sources = (opts.source as SourceName[]).filter(\n (s) => ADAPTERS[s] !== undefined\n );\n if (sources.length === 0) {\n log.err(\"no enabled sources detected (claude-code, codex, cursor)\");\n process.exit(EXIT.noWork);\n }\n\n const summary: Record<string, { sessions: number; messages: number }> =\n {};\n const allSessions: NormalizedSession[] = [];\n\n for (const sourceName of sources) {\n const adapter = ADAPTERS[sourceName];\n if (adapter === undefined) continue;\n const detect = await adapter.detect();\n if (!detect.present) {\n log.debug(`${sourceName}: not present (${detect.reason ?? \"\"})`);\n continue;\n }\n log.step(`scanning ${sourceName}...`);\n const stats = { sessions: 0, messages: 0 };\n const enumerateOpts: { since?: Date } = {};\n if (since !== undefined) enumerateOpts.since = since;\n for await (const raw of adapter.enumerate(enumerateOpts)) {\n let session = await adapter.normalize(raw);\n if (opts.redact) session = redactSession(session);\n stats.sessions += 1;\n stats.messages += session.messages.length;\n allSessions.push(session);\n }\n summary[sourceName] = stats;\n }\n\n if (allSessions.length === 0) {\n log.err(\n \"no sessions found in --since window. Try --since=365d to widen.\"\n );\n process.exit(EXIT.noWork);\n }\n\n log.step(`mining ${allSessions.length} sessions (top ${opts.top})...`);\n const result = mineSessions(allSessions, {\n render: { top: opts.top },\n });\n\n // Cross-reference candidates against peer repos' .claude/skills/.\n // A peer-recurring slug means a teammate already shipped this\n // skill — that's the team-thesis evidence we want to surface.\n const peers =\n opts.peer.length > 0 ? await discoverPeerSkills(opts.peer) : [];\n const candidatesWithPeers = annotateWithPeers(result.candidates, peers);\n const teamCount = candidatesWithPeers.filter(\n (c) => c.peerRepos.length > 0\n ).length;\n\n // Persist each candidate to ~/.operon/candidates/<slug>/.\n const sessionsById = new Map(allSessions.map((s) => [s.id, s]));\n for (const c of result.candidates) {\n const exemplars = c.exemplarSessionIds\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n await writeCandidate(c, exemplars);\n }\n\n if (getGlobals().json) {\n log.json({\n summary,\n input: result.sessionCountInput,\n kept: result.sessionCountKept,\n clusters: result.clusterCount,\n candidates: candidatesWithPeers,\n });\n } else {\n for (const [src, s] of Object.entries(summary)) {\n log.info(` ${src}: ${s.sessions} sessions, ${s.messages} messages`);\n }\n log.info(\n `kept ${result.sessionCountKept}/${result.sessionCountInput} sessions, ` +\n `${result.clusterCount} clusters, ${result.candidates.length} candidates` +\n (teamCount > 0 ? `, ${teamCount} team-recurring` : \"\")\n );\n if (result.candidates.length > 0) {\n log.info(\"\");\n log.info(renderCandidateTable(result.candidates));\n for (const c of candidatesWithPeers) {\n if (c.peerRepos.length > 0) {\n log.info(\n ` ★ ${c.slug} also lives at ${c.peerRepos.join(\", \")} — team-recurring`\n );\n }\n }\n }\n }\n process.exit(result.candidates.length > 0 ? EXIT.ok : EXIT.noWork);\n });\n}\n","// Peer-skill discovery. Given a list of peer repo paths, walk\n// `<repo>/.claude/skills/*/SKILL.md` and pull the `name:` from\n// each frontmatter. Returns a Map<skillName, repos[]> so scan\n// can cross-reference local candidates with team usage.\n\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\n\nexport type PeerSkill = {\n name: string;\n repo: string;\n path: string;\n};\n\nexport async function discoverPeerSkills(\n repoPaths: string[]\n): Promise<PeerSkill[]> {\n const out: PeerSkill[] = [];\n for (const repo of repoPaths) {\n const skillsDir = join(repo, \".claude\", \"skills\");\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(skillsDir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const path = join(skillsDir, entry.name, \"SKILL.md\");\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n continue;\n }\n const name = parseFrontmatterName(raw) ?? basename(entry.name);\n out.push({ name, repo, path });\n }\n }\n return out;\n}\n\nconst FM_NAME_RE = /^---[\\r\\n]+([\\s\\S]*?)[\\r\\n]+---/;\n\nfunction parseFrontmatterName(raw: string): string | undefined {\n const fm = FM_NAME_RE.exec(raw);\n if (fm?.[1] === undefined) return undefined;\n for (const line of fm[1].split(/\\r?\\n/)) {\n const m = /^name:\\s*(.+?)\\s*$/.exec(line);\n if (m?.[1] !== undefined) return m[1];\n }\n return undefined;\n}\n\n// Annotate candidates with a \"team-recurring\" flag if a peer repo\n// already has a SKILL.md by the same slug. Pure function over the\n// discovery result.\nexport function annotateWithPeers<C extends { slug: string }>(\n candidates: C[],\n peers: PeerSkill[]\n): (C & { peerRepos: string[] })[] {\n const bySlug = new Map<string, string[]>();\n for (const p of peers) {\n const arr = bySlug.get(p.name) ?? [];\n arr.push(p.repo);\n bySlug.set(p.name, arr);\n }\n return candidates.map((c) => ({\n ...c,\n peerRepos: bySlug.get(c.slug) ?? [],\n }));\n}\n","// `operon show <slug>` — pretty-print a candidate.\n\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { renderCandidateDetail } from \"../render/show-detail.js\";\nimport { readCandidate } from \"../store/candidates.js\";\n\nconst slugSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/, \"lowercase letters, digits, hyphens only\");\n\nexport function showCommand(): Command {\n return new Command(\"show\")\n .argument(\"<slug>\", \"Candidate or operon slug\")\n .description(\"Pretty-print a candidate or operon.\")\n .option(\"--exemplars <N>\", \"Show N exemplar sessions\", \"3\")\n .option(\"--full\", \"Show full prompt and tool details\", false)\n .action(async (slugArg: string) => {\n const slug = slugSchema.parse(slugArg);\n const candidate = await readCandidate(slug);\n if (candidate === undefined) {\n log.err(`no candidate found at ~/.operon/candidates/${slug}/`);\n process.exit(EXIT.noWork);\n }\n if (getGlobals().json) {\n log.json(candidate);\n process.exit(EXIT.ok);\n }\n log.info(renderCandidateDetail(candidate));\n process.exit(EXIT.ok);\n });\n}\n","// Pretty-print a single candidate or operon with all the context\n// the user needs to decide whether to promote.\n\nimport chalk from \"chalk\";\nimport type { Candidate } from \"@operon/mining\";\nimport { getGlobals } from \"../lib/globals.js\";\n\nexport function renderCandidateDetail(c: Candidate): string {\n const colored = !getGlobals().noColor;\n const bold = (s: string): string => (colored ? chalk.bold(s) : s);\n const dim = (s: string): string => (colored ? chalk.dim(s) : s);\n\n const breakdown = Object.entries(c.scoreBreakdown)\n .map(([k, v]) => `${k}=${v.toFixed(3)}`)\n .join(\" \");\n\n return [\n `${bold(\"slug\")} ${c.slug}`,\n `${bold(\"score\")} ${c.score.toFixed(3)} ${dim(`(${breakdown})`)}`,\n `${bold(\"uses\")} ${c.uses} across ${c.spanDays} day(s)`,\n `${bold(\"tools\")} ${c.suggestedTools.join(\", \") || \"(none)\"}`,\n `${bold(\"exemplars\")} ${c.exemplarSessionIds.join(\", \")}`,\n \"\",\n bold(\"draft prompt\"),\n indent(c.draftPrompt),\n \"\",\n bold(\"summary\"),\n indent(c.summary),\n \"\",\n bold(\"draft eval\"),\n indent(JSON.stringify(c.draftEval, null, 2)),\n ].join(\"\\n\");\n}\n\nfunction indent(s: string): string {\n return s\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","// `operon suggest` — the \"do something useful right now\" command.\n// One shot: scan recent sessions, polish the top candidates if a\n// key is set, render an actionable summary like:\n//\n// You've done these N times. Want to save them as skills?\n//\n// 1. audit-website (4 uses, 3 days) ★ ready\n// 2. clone-website (2 uses, 1 day)\n// 3. setup-claude (2 uses, 7 days)\n//\n// Next: operon publish audit-website --workspace <slug>\n//\n// Non-interactive (no prompt). Designed to be run on a cron or as\n// `npx @withoperon/cli suggest --polish` in a fresh shell.\n\nimport { Command, Option } from \"commander\";\nimport { z } from \"zod\";\nimport type { NormalizedSession } from \"@operon/mining\";\nimport { mineSessions } from \"@operon/mining\";\nimport { ADAPTERS, redactSession } from \"../ingestion/index.js\";\nimport type { SourceName } from \"../ingestion/index.js\";\nimport { polishCandidate } from \"../llm/polish.js\";\nimport { parseDuration } from \"../lib/duration.js\";\nimport {\n createPlatformEventClient,\n PlatformEventError,\n type PlatformEventClient,\n} from \"../lib/events.js\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport {\n submitMiningSuggestion,\n SubmitSuggestionError,\n} from \"../lib/suggestions.js\";\nimport { writeCandidate } from \"../store/candidates.js\";\nimport { candidateDir } from \"../store/paths.js\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SOURCES = [\"claude-code\", \"codex\", \"cursor\", \"chatgpt\"] as const;\n\nconst optsSchema = z.object({\n source: z.array(z.enum(SOURCES)).default([...SOURCES]),\n since: z.string().default(\"30d\"),\n top: z.coerce.number().int().positive().default(5),\n polish: z.boolean().default(false),\n minUses: z.coerce.number().int().positive().default(2),\n submit: z.boolean().default(false),\n workspace: z.string().min(1).max(64).optional(),\n apiBase: z.string().url().optional(),\n});\n\nexport function suggestCommand(): Command {\n return new Command(\"suggest\")\n .description(\n \"Scan + rank + (optionally) polish — surface what's actually worth saving.\"\n )\n .addOption(\n new Option(\"--source <src...>\", \"Limit to one or more sources\").choices([\n ...SOURCES,\n ])\n )\n .option(\"--since <duration>\", \"Window to scan (e.g. 7d, 30d)\", \"30d\")\n .option(\"--top <N>\", \"Show the top N suggestions\", \"5\")\n .option(\n \"--polish\",\n \"Also call Claude to draft a clean SKILL.md per suggestion (needs ANTHROPIC_API_KEY)\",\n false\n )\n .option(\n \"--min-uses <n>\",\n \"Only suggest patterns with at least this many sessions\",\n \"2\"\n )\n .option(\n \"--submit\",\n \"Submit mining telemetry to the Operon platform (requires operon login)\",\n false\n )\n .option(\"--workspace <slug>\", \"Workspace slug for submitted telemetry\")\n .option(\"--api-base <url>\", \"Override platform base URL\")\n .action(async (rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n let since: Date;\n try {\n since = new Date(Date.now() - parseDuration(opts.since));\n } catch (e) {\n log.err((e as Error).message);\n process.exit(EXIT.config);\n return;\n }\n\n let eventClient: PlatformEventClient | undefined;\n if (opts.submit) {\n try {\n eventClient = await createPlatformEventClient({\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n ...(opts.workspace !== undefined\n ? { workspaceSlug: opts.workspace }\n : {}),\n });\n } catch (e) {\n if (e instanceof PlatformEventError) {\n log.err(e.message);\n process.exit(e.exitCode);\n return;\n }\n throw e;\n }\n }\n\n const sources = (opts.source as SourceName[]).filter(\n (s) => ADAPTERS[s] !== undefined\n );\n const startedAt = Date.now();\n await sendMiningEvent(eventClient, \"mining_scan_started\", {\n since: opts.since,\n sources,\n });\n\n const allSessions: NormalizedSession[] = [];\n for (const sourceName of sources) {\n const adapter = ADAPTERS[sourceName];\n if (adapter === undefined) continue;\n const detect = await adapter.detect();\n if (!detect.present) continue;\n for await (const raw of adapter.enumerate({ since })) {\n let session = await adapter.normalize(raw);\n session = redactSession(session);\n allSessions.push(session);\n }\n }\n\n if (allSessions.length === 0) {\n await sendMiningEvent(eventClient, \"mining_scan_completed\", {\n sessionCount: 0,\n durationMs: Date.now() - startedAt,\n });\n log.err(\n `no sessions in last ${opts.since}. Try --since=90d or --since=365d.`\n );\n process.exit(EXIT.noWork);\n return;\n }\n\n log.step(\n `mining ${allSessions.length} sessions from last ${opts.since}...`\n );\n const result = mineSessions(allSessions, { render: { top: opts.top } });\n const top = result.candidates.filter((c) => c.uses >= opts.minUses);\n await sendMiningEvent(eventClient, \"mining_scan_completed\", {\n sessionCount: result.sessionCountKept,\n durationMs: Date.now() - startedAt,\n });\n\n if (top.length === 0) {\n log.info(\n `no patterns with >= ${opts.minUses} uses found. Either widen --since or work some more :)`\n );\n process.exit(EXIT.noWork);\n return;\n }\n\n for (const c of top) {\n await sendMiningEvent(eventClient, \"pattern_detected\", {\n clusterId: c.promptShape,\n clusterSize: c.uses,\n score: c.score,\n keywords: c.suggestedTools,\n });\n }\n\n // Persist so the user can share/promote afterwards.\n const sessionsById = new Map(allSessions.map((s) => [s.id, s]));\n for (const c of top) {\n const exemplars = c.exemplarSessionIds\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n await writeCandidate(c, exemplars);\n }\n\n // Optional polish pass.\n const polished = new Set<string>();\n if (opts.polish) {\n log.step(`polishing ${top.length} via Claude...`);\n for (const c of top) {\n const exemplars = c.exemplarSessionIds\n .map((id) => sessionsById.get(id))\n .filter((s): s is NormalizedSession => s !== undefined);\n const r = await polishCandidate(c, exemplars);\n if (\"error\" in r) {\n if (r.error.kind === \"no-api-key\") {\n log.warn(\n \"ANTHROPIC_API_KEY not set — skipping --polish for the rest.\"\n );\n break;\n }\n log.warn(` ${c.slug}: polish failed (${r.error.kind})`);\n continue;\n }\n await writeFile(\n join(candidateDir(c.slug), \"polished.md\"),\n `${r.markdown}\\n`,\n \"utf8\"\n );\n polished.add(c.slug);\n }\n }\n\n if (opts.submit) {\n let submitted = 0;\n for (const c of top) {\n try {\n await submitMiningSuggestion(c, {\n ...(opts.apiBase !== undefined ? { apiBase: opts.apiBase } : {}),\n ...(opts.workspace !== undefined\n ? { workspaceSlug: opts.workspace }\n : {}),\n });\n submitted += 1;\n } catch (e) {\n if (e instanceof SubmitSuggestionError) {\n log.warn(` ${c.slug}: submit failed (${e.message})`);\n continue;\n }\n throw e;\n }\n }\n log.step(\n `${submitted} suggestion${submitted === 1 ? \"\" : \"s\"} submitted`\n );\n }\n\n if (getGlobals().json) {\n log.json({\n suggestions: top.map((c) => ({\n slug: c.slug,\n uses: c.uses,\n spanDays: c.spanDays,\n score: c.score,\n firstSeenAt: c.firstSeenAt,\n lastSeenAt: c.lastSeenAt,\n polished: polished.has(c.slug),\n })),\n });\n process.exit(EXIT.ok);\n }\n\n log.info(\"\");\n log.info(\"You've done these recently:\");\n log.info(\"\");\n for (const [i, c] of top.entries()) {\n const days = c.spanDays === 0 ? \"today\" : `${c.spanDays}d span`;\n const ready = polished.has(c.slug) ? \" ★ polished\" : \"\";\n log.info(\n ` ${i + 1}. ${c.slug.padEnd(28)} (${c.uses} uses, ${days})${ready}`\n );\n }\n log.info(\"\");\n log.info(\"Save the most useful ones as team skills:\");\n const example = top[0]!;\n if (!polished.has(example.slug) && !opts.polish) {\n log.info(\n ` operon polish ${example.slug} # draft a clean SKILL.md`\n );\n }\n log.info(\n ` operon publish ${example.slug} --workspace <slug> # upload to your team`\n );\n log.info(\n ` operon install <workspace>/${example.slug} # install after publish`\n );\n process.exit(EXIT.ok);\n });\n}\n\nasync function sendMiningEvent(\n client: PlatformEventClient | undefined,\n event: Parameters<PlatformEventClient[\"send\"]>[0],\n properties: Parameters<PlatformEventClient[\"send\"]>[1]\n): Promise<void> {\n if (client === undefined) return;\n try {\n await client.send(event, properties);\n } catch (e) {\n if (e instanceof PlatformEventError) {\n log.warn(`telemetry skipped: ${e.message}`);\n return;\n }\n throw e;\n }\n}\n","import type { Candidate } from \"@operon/mining\";\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\nimport { readSkillMarkdown, titleCase } from \"./push.js\";\nimport { readConfig } from \"../store/config.js\";\n\nexport type SubmitSuggestionOptions = {\n apiBase?: string;\n workspaceSlug?: string;\n token?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class SubmitSuggestionError extends Error {\n exitCode: ExitCode;\n\n constructor(message: string, exitCode: ExitCode) {\n super(message);\n this.name = \"SubmitSuggestionError\";\n this.exitCode = exitCode;\n }\n}\n\nexport async function submitMiningSuggestion(\n candidate: Candidate,\n options: SubmitSuggestionOptions = {}\n): Promise<{ id: string }> {\n const config = await readConfig();\n const apiBase = (\n options.apiBase ??\n config.platform.apiBase ??\n \"https://app.withoperon.com\"\n ).replace(/\\/+$/, \"\");\n const token = options.token ?? config.platform.accessToken;\n if (token === undefined || token.length === 0) {\n throw new SubmitSuggestionError(\n \"not signed in. Run: operon login\",\n EXIT.auth\n );\n }\n const workspaceSlug = options.workspaceSlug ?? config.platform.workspaceSlug;\n if (workspaceSlug === undefined || workspaceSlug.length === 0) {\n throw new SubmitSuggestionError(\n \"missing workspace. Pass --workspace or run: operon login --workspace <slug>\",\n EXIT.config\n );\n }\n\n const skill = await readSkillMarkdown(candidate);\n const fetchImpl = options.fetchImpl ?? fetch;\n let res: Response;\n try {\n res = await fetchImpl(\n `${apiBase}/api/v1/workspaces/${workspaceSlug}/suggestions`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-operon-source\": \"cli\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n clusterId: candidate.promptShape,\n suggestedSlug: candidate.slug,\n suggestedName: titleCase(candidate.slug),\n skillMarkdown: skill.markdown,\n keywords: candidate.suggestedTools.slice(0, 8),\n clusterSize: candidate.uses,\n firstSeenAt: candidate.firstSeenAt,\n lastSeenAt: candidate.lastSeenAt,\n score: candidate.score,\n }),\n }\n );\n } catch (e) {\n throw new SubmitSuggestionError(\n `network error: ${(e as Error).message}`,\n EXIT.network\n );\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"<unreadable>\");\n throw new SubmitSuggestionError(\n `server returned ${res.status}: ${body.slice(0, 400)}`,\n res.status === 401 ? EXIT.auth : EXIT.err\n );\n }\n\n return (await res.json()) as { id: string };\n}\n","// `operon undo` — reverse the most recent destructive action.\n// v0 supports undoing the last `promote` by moving the operon\n// directory to ~/.operon/.trash/<undo-id>/.\n\nimport { readdir } from \"node:fs/promises\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { EXIT } from \"../lib/exit-codes.js\";\nimport { getGlobals } from \"../lib/globals.js\";\nimport { log } from \"../lib/logger.js\";\nimport { trashOperon } from \"../store/operons.js\";\nimport { TRASH_DIR } from \"../store/paths.js\";\n\nconst optsSchema = z.object({\n list: z.boolean().default(false),\n id: z.string().min(1).max(64).optional(),\n});\n\nexport function undoCommand(): Command {\n return new Command(\"undo\")\n .description(\"Reverse the most recent destructive action.\")\n .argument(\"[slug]\", \"Operon slug whose promotion to undo\")\n .option(\"--list\", \"List recent undoable actions\", false)\n .option(\"--id <undo-id>\", \"Undo a specific action by id\")\n .action(async (slugArg: string | undefined, rawOpts: unknown) => {\n const opts = optsSchema.parse(rawOpts);\n\n if (opts.list) {\n let entries: string[];\n try {\n entries = await readdir(TRASH_DIR);\n } catch {\n entries = [];\n }\n if (getGlobals().json) {\n log.json({ trashed: entries });\n } else if (entries.length === 0) {\n log.info(\"nothing in trash\");\n } else {\n for (const e of entries) log.info(` ${e}`);\n }\n process.exit(EXIT.ok);\n }\n\n if (slugArg === undefined) {\n log.err(\"undo: pass a slug or --list to inspect the trash bin\");\n process.exit(EXIT.config);\n }\n try {\n const undoId = await trashOperon(slugArg);\n log.step(\n `moved operons/${slugArg} → .trash/${undoId}/ — restore with mv`\n );\n process.exit(EXIT.ok);\n } catch (e) {\n log.err((e as Error).message);\n process.exit(EXIT.err);\n }\n });\n}\n"],"mappings":"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","names":["Command","Option","process","stat","Command","z","homedir","join","ROOT","join","homedir","input","readdir","stat","homedir","basename","join","ROOT","join","homedir","stat","basename","extractFilePath","readdir","input","readdir","readFile","stat","homedir","basename","join","require","stat","readdir","join","basename","homedir","readFile","chalk","chalk","dim","z","Command","stat","mkdir","readFile","writeFile","homedir","join","Command","z","z","z","input","z","optsSchema","Command","mkdir","writeFile","input","join","homedir","readFile","Command","z","chalk","chalk","readFile","readdir","writeFile","join","join","writeFile","readFile","readdir","join","readFile","readdir","rename","writeFile","rm","join","readFile","join","readdir","rename","optsSchema","z","Command","createInterface","Command","z","optsSchema","z","Command","createInterface","createInterface","Command","Option","createHash","input","DEFAULTS","DEFAULTS","extractVerbObject","z","input","z","z","input","readFile","join","readFile","join","slugRe","optsSchema","z","Command","Option","createInterface","input","Command","createHash","z","slugRe","semverRe","sha256HexRe","maxInt","workspaceSchema","slugSchema","recordRunResponseSchema","input","Command","writeFile","join","Command","z","slugSchema","z","optsSchema","Command","join","writeFile","Command","z","slugSchema","z","optsSchema","Command","Command","z","optsSchema","z","Command","Command","Option","z","readdir","readFile","basename","join","SOURCES","optsSchema","z","Command","Option","Command","z","chalk","bold","chalk","dim","slugSchema","z","Command","Command","Option","z","writeFile","join","SOURCES","optsSchema","z","Command","Option","sendMiningEvent","readdir","Command","z","optsSchema","z","Command","readdir","Command","Option"]}
|