@4mica/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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/index.js +628 -0
  4. package/dist/index.js.map +1 -0
  5. package/package.json +68 -0
  6. package/snapshot.json +100 -0
  7. package/templates/agent-buyer-node/.env.example +16 -0
  8. package/templates/agent-buyer-node/README.md +26 -0
  9. package/templates/agent-buyer-node/_gitignore +6 -0
  10. package/templates/agent-buyer-node/package.json +19 -0
  11. package/templates/agent-buyer-node/src/brain.ts +133 -0
  12. package/templates/agent-buyer-node/src/critic.ts +195 -0
  13. package/templates/agent-buyer-node/src/pay.ts +54 -0
  14. package/templates/agent-buyer-node/tsconfig.json +21 -0
  15. package/templates/agent-seller-express/.env.example +16 -0
  16. package/templates/agent-seller-express/README.md +26 -0
  17. package/templates/agent-seller-express/_gitignore +6 -0
  18. package/templates/agent-seller-express/package.json +22 -0
  19. package/templates/agent-seller-express/src/brain.ts +121 -0
  20. package/templates/agent-seller-express/src/comedian.ts +153 -0
  21. package/templates/agent-seller-express/tsconfig.json +21 -0
  22. package/templates/buyer-express/.env.example +12 -0
  23. package/templates/buyer-express/README.md +26 -0
  24. package/templates/buyer-express/_gitignore +6 -0
  25. package/templates/buyer-express/package.json +18 -0
  26. package/templates/buyer-express/src/buyer.ts +82 -0
  27. package/templates/buyer-express/tsconfig.json +21 -0
  28. package/templates/buyer-hono/.env.example +12 -0
  29. package/templates/buyer-hono/README.md +26 -0
  30. package/templates/buyer-hono/_gitignore +6 -0
  31. package/templates/buyer-hono/package.json +18 -0
  32. package/templates/buyer-hono/src/buyer.ts +82 -0
  33. package/templates/buyer-hono/tsconfig.json +21 -0
  34. package/templates/buyer-next/.env.example +12 -0
  35. package/templates/buyer-next/README.md +26 -0
  36. package/templates/buyer-next/_gitignore +6 -0
  37. package/templates/buyer-next/package.json +18 -0
  38. package/templates/buyer-next/src/buyer.ts +82 -0
  39. package/templates/buyer-next/tsconfig.json +21 -0
  40. package/templates/seller-express/.env.example +12 -0
  41. package/templates/seller-express/README.md +26 -0
  42. package/templates/seller-express/_gitignore +6 -0
  43. package/templates/seller-express/package.json +22 -0
  44. package/templates/seller-express/src/server.ts +64 -0
  45. package/templates/seller-express/tsconfig.json +21 -0
  46. package/templates/seller-hono/.env.example +12 -0
  47. package/templates/seller-hono/README.md +26 -0
  48. package/templates/seller-hono/_gitignore +6 -0
  49. package/templates/seller-hono/package.json +22 -0
  50. package/templates/seller-hono/src/server.ts +69 -0
  51. package/templates/seller-hono/tsconfig.json +21 -0
  52. package/templates/seller-next/.env.example +12 -0
  53. package/templates/seller-next/README.md +26 -0
  54. package/templates/seller-next/_gitignore +6 -0
  55. package/templates/seller-next/app/api/protected/route.ts +27 -0
  56. package/templates/seller-next/app/api/session/route.ts +8 -0
  57. package/templates/seller-next/app/globals.css +556 -0
  58. package/templates/seller-next/app/icon.svg +5 -0
  59. package/templates/seller-next/app/layout.tsx +22 -0
  60. package/templates/seller-next/app/page.tsx +189 -0
  61. package/templates/seller-next/next.config.mjs +3 -0
  62. package/templates/seller-next/package.json +25 -0
  63. package/templates/seller-next/public/logo-light.svg +19 -0
  64. package/templates/seller-next/public/logo.svg +19 -0
  65. package/templates/seller-next/scripts/serve.mjs +46 -0
  66. package/templates/seller-next/tsconfig.json +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/context.ts","../src/core/package-manager.ts","../src/core/runner.ts","../src/ui/log.ts","../src/commands/dashboard.ts","../src/commands/dev.ts","../src/core/rewrite-deps.ts","../src/core/substitute.ts","../src/core/copy-engine.ts","../src/core/template-registry.ts","../src/prompts/flow.ts","../src/commands/init.ts","../src/cli.ts","../src/index.ts"],"names":["findUp","text","join","child","execa","dirname","fileURLToPath","readFile","exists","access","relative"],"mappings":"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","file":"index.js","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { findUp } from \"find-up\";\n\nexport interface RunContext {\n /** True when running inside the 4Mica monorepo (dev), false when published. */\n inMonorepo: boolean;\n /** Absolute path to the monorepo root, when inMonorepo. */\n monorepoRoot?: string;\n /** Absolute path to the bundled templates directory. */\n templatesDir: string;\n}\n\n/** dist/index.js → packages/cli → templates live one level up from dist/. */\nfunction bundledTemplatesDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"..\", \"templates\");\n}\n\n/**\n * Detect whether we are running from the monorepo checkout (so scaffolds can\n * link workspace packages) or from a published install (standalone output).\n */\nexport async function resolveRunContext(\n cwd = process.cwd(),\n): Promise<RunContext> {\n const workspaceFile = await findUp(\"pnpm-workspace.yaml\", { cwd });\n if (workspaceFile) {\n const root = dirname(workspaceFile);\n try {\n const pkg = JSON.parse(\n await readFile(join(root, \"package.json\"), \"utf8\"),\n ) as { name?: string };\n if (pkg.name === \"4mica\") {\n return {\n inMonorepo: true,\n monorepoRoot: root,\n templatesDir: bundledTemplatesDir(),\n };\n }\n } catch {\n // fall through to published mode\n }\n }\n return { inMonorepo: false, templatesDir: bundledTemplatesDir() };\n}\n","import { findUp } from \"find-up\";\nimport type { PackageManager } from \"../types.js\";\n\nconst LOCKFILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n \"bun.lock\": \"bun\",\n};\n\n/** Read the PM that invoked us (set by npx / pnpm dlx / yarn dlx). */\nfunction fromUserAgent(): PackageManager | undefined {\n const ua = process.env.npm_config_user_agent;\n if (!ua) return undefined;\n const name = ua.split(\"/\")[0];\n if (name === \"pnpm\" || name === \"npm\" || name === \"yarn\" || name === \"bun\") {\n return name;\n }\n return undefined;\n}\n\nasync function fromLockfile(cwd: string): Promise<PackageManager | undefined> {\n const found = await findUp(Object.keys(LOCKFILES), { cwd });\n if (!found) return undefined;\n const file = found.slice(found.lastIndexOf(\"/\") + 1);\n return LOCKFILES[file];\n}\n\n/**\n * Resolve the package manager: explicit override → invoking agent →\n * nearest lockfile → pnpm (repo default).\n */\nexport async function detectPackageManager(\n cwd: string,\n override?: PackageManager,\n): Promise<PackageManager> {\n return override ?? fromUserAgent() ?? (await fromLockfile(cwd)) ?? \"pnpm\";\n}\n\nexport function installArgs(_pm: PackageManager): string[] {\n return [\"install\"];\n}\n\nexport function runArgs(pm: PackageManager, script: string): string[] {\n // yarn runs scripts without the `run` keyword.\n return pm === \"yarn\" ? [script] : [\"run\", script];\n}\n","import { execa } from \"execa\";\nimport type { PackageManager } from \"../types.js\";\nimport { installArgs, runArgs } from \"./package-manager.js\";\n\n/** Install dependencies in cwd with the given package manager. */\nexport async function install(pm: PackageManager, cwd: string): Promise<void> {\n await execa(pm, installArgs(pm), { cwd, stdio: \"pipe\" });\n}\n\n/**\n * Spawn a project script inheriting stdio. This blocks until the child exits,\n * so it must be the final foreground action of a command.\n */\nexport async function runScript(\n pm: PackageManager,\n script: string,\n cwd: string,\n): Promise<void> {\n await execa(pm, runArgs(pm, script), { cwd, stdio: \"inherit\" });\n}\n\n/** Best-effort `git init` for a fresh scaffold; never fatal. */\nexport async function gitInit(cwd: string): Promise<void> {\n try {\n await execa(\"git\", [\"init\", \"-q\"], { cwd });\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n } catch {\n // git not installed or already a repo — ignore.\n }\n}\n\n/** Open a URL in the default browser (best-effort, cross-platform). */\nexport async function openBrowser(url: string): Promise<void> {\n const cmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n try {\n await execa(cmd, [url], { stdio: \"ignore\", detached: true });\n } catch {\n // headless / no browser — ignore.\n }\n}\n","import ora, { type Ora } from \"ora\";\nimport pc from \"picocolors\";\n\n/**\n * House terminal style — mirrors scripts/clean.ts: ora spinners with\n * picocolors success/failure text. Kept in one place so every command reads\n * the same.\n */\n\nexport const brand = (s: string) => pc.cyan(pc.bold(s));\nexport const dim = (s: string) => pc.dim(s);\nexport const ok = (s: string) => pc.green(s);\nexport const warn = (s: string) => pc.yellow(s);\nexport const err = (s: string) => pc.red(s);\n\nexport function spinner(text: string): Ora {\n return ora({ text, color: \"cyan\" }).start();\n}\n\n/** Run an async step under a spinner, succeeding/failing with house colors. */\nexport async function step<T>(\n text: string,\n fn: () => Promise<T>,\n doneText?: string,\n): Promise<T> {\n const s = spinner(text);\n try {\n const result = await fn();\n s.succeed(ok(doneText ?? text));\n return result;\n } catch (error) {\n s.fail(err(`${text} — ${(error as Error).message}`));\n throw error;\n }\n}\n\nexport { pc };\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { resolveRunContext } from \"../core/context.js\";\nimport { detectPackageManager } from \"../core/package-manager.js\";\nimport { openBrowser } from \"../core/runner.js\";\nimport { dim, ok, pc, warn } from \"../ui/log.js\";\n\nexport interface DashboardOptions {\n /** Open a browser once the dev server is up. */\n open?: boolean;\n /** Run detached so the caller can continue (used by `init`). */\n background?: boolean;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Launch the 4Mica dashboard.\n *\n * In the monorepo we start the real `apps/dashboard` Vite dev server (hot\n * reload). When published outside the repo there is no dashboard to run yet —\n * v1 points the developer at the hosted/monorepo dashboard rather than\n * shipping a bundle.\n */\nexport async function launchDashboard(\n opts: DashboardOptions = {},\n): Promise<void> {\n const context = await resolveRunContext();\n\n if (!context.inMonorepo || !context.monorepoRoot) {\n process.stdout.write(\n `\\n ${warn(\"Dashboard\")} runs from the 4Mica monorepo in this release.\\n` +\n ` Clone ${pc.cyan(\"github.com/4mica-Network/homepage\")} and run ` +\n `${pc.bold(\"pnpm --filter @4mica/dashboard dev\")},\\n` +\n ` or use the hosted dashboard (coming soon). ${dim(\"More: 4mica.io/docs\")}\\n\\n`,\n );\n return;\n }\n\n const dashboardDir = join(context.monorepoRoot, \"apps\", \"dashboard\");\n if (!(await exists(dashboardDir))) {\n process.stdout.write(\n `\\n ${warn(\"apps/dashboard not found in this checkout.\")}\\n\\n`,\n );\n return;\n }\n\n const pm = await detectPackageManager(context.monorepoRoot);\n const args =\n pm === \"yarn\"\n ? [\"workspace\", \"@4mica/dashboard\", \"dev\"]\n : [\"--filter\", \"@4mica/dashboard\", \"dev\"];\n\n process.stdout.write(`\\n ${ok(\"Starting the 4Mica dashboard…\")}\\n\\n`);\n\n if (opts.background) {\n const child = execa(pm, args, {\n cwd: context.monorepoRoot,\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n if (opts.open) {\n // Vite's default dashboard port (see apps/dashboard/vite.config.ts).\n setTimeout(() => void openBrowser(\"http://localhost:4173\"), 2500);\n }\n return;\n }\n\n const child = execa(pm, args, {\n cwd: context.monorepoRoot,\n stdio: \"inherit\",\n });\n if (opts.open) {\n setTimeout(() => void openBrowser(\"http://localhost:4173\"), 2500);\n }\n await child;\n}\n","import { detectPackageManager } from \"../core/package-manager.js\";\nimport { runScript } from \"../core/runner.js\";\n\n/**\n * Run the current project's dev server with the detected package manager.\n * A thin convenience wrapper around `<pm> run dev`.\n */\nexport async function devCommand(script = \"dev\"): Promise<void> {\n const cwd = process.cwd();\n const pm = await detectPackageManager(cwd);\n await runScript(pm, script, cwd);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface Snapshot {\n catalog: Record<string, string>;\n catalogs: Record<string, Record<string, string>>;\n fourMica: Record<string, string>;\n}\n\nlet cache: Snapshot | null = null;\n\nasync function loadSnapshot(): Promise<Snapshot> {\n if (cache) return cache;\n const here = dirname(fileURLToPath(import.meta.url));\n // dist/index.js → package root holds snapshot.json (shipped in \"files\").\n const path = join(here, \"..\", \"snapshot.json\");\n try {\n cache = JSON.parse(await readFile(path, \"utf8\")) as Snapshot;\n } catch {\n cache = { catalog: {}, catalogs: {}, fourMica: {} };\n }\n return cache;\n}\n\nfunction resolveCatalog(snap: Snapshot, spec: string, name: string): string {\n // \"catalog:\" → default catalog; \"catalog:node24\" → named catalog.\n const named = spec.slice(\"catalog:\".length).trim();\n const table = named ? (snap.catalogs[named] ?? {}) : snap.catalog;\n return table[name] ?? \"latest\";\n}\n\nfunction resolveWorkspace(snap: Snapshot, name: string): string {\n const version = snap.fourMica[name];\n return version ? `^${version}` : \"latest\";\n}\n\nfunction rewriteBlock(\n block: Record<string, string> | undefined,\n snap: Snapshot,\n keepWorkspace: boolean,\n): void {\n if (!block) return;\n for (const [name, spec] of Object.entries(block)) {\n if (spec.startsWith(\"workspace:\")) {\n block[name] = keepWorkspace ? spec : resolveWorkspace(snap, name);\n } else if (spec.startsWith(\"catalog:\")) {\n block[name] = resolveCatalog(snap, spec, name);\n }\n }\n}\n\n/**\n * Rewrite a scaffolded package.json in place: `catalog:` → pinned version,\n * `workspace:*` → published `@4mica/*` semver (unless keepWorkspace, i.e. an\n * in-repo dev scaffold that should link the local packages). Also drops\n * `private` and stamps a fresh version.\n */\nexport async function rewritePackageJson(\n pkg: Record<string, unknown>,\n opts: { keepWorkspace: boolean },\n): Promise<Record<string, unknown>> {\n const snap = await loadSnapshot();\n rewriteBlock(\n pkg.dependencies as Record<string, string> | undefined,\n snap,\n opts.keepWorkspace,\n );\n rewriteBlock(\n pkg.devDependencies as Record<string, string> | undefined,\n snap,\n opts.keepWorkspace,\n );\n if (!opts.keepWorkspace) {\n pkg.private = undefined;\n }\n return pkg;\n}\n","export interface Tokens {\n PROJECT_NAME: string;\n DESCRIPTION: string;\n PORT: string;\n TMPFILE: string;\n}\n\n/** Replace every __TOKEN__ placeholder in a text file body. */\nexport function substitute(body: string, tokens: Tokens): string {\n const table = tokens as unknown as Record<string, string>;\n return body.replace(/__([A-Z_]+)__/g, (match, key: string) => {\n const value = table[key];\n return value === undefined ? match : value;\n });\n}\n\n/** Turn an arbitrary string into a safe npm package name. */\nexport function toPackageName(input: string): string {\n const cleaned = input\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9-~._]+/g, \"-\")\n .replace(/^[-_.]+|[-_.]+$/g, \"\");\n return cleaned || \"my-4mica-app\";\n}\n","import { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { rewritePackageJson } from \"./rewrite-deps.js\";\nimport { substitute, type Tokens } from \"./substitute.js\";\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"dist\", \".next\", \".turbo\", \".git\"]);\n\n/** Extensions treated as text for token substitution. Others copy verbatim. */\nconst TEXT_EXT = new Set([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".json\",\n \".md\",\n \".css\",\n \".html\",\n \".svg\",\n \".txt\",\n \".yaml\",\n \".yml\",\n \"\",\n]);\n\n/** Templates ship dotfiles under an underscore so npm keeps them in the tarball. */\nfunction targetName(name: string): string {\n if (name === \"_gitignore\") return \".gitignore\";\n if (name === \"_npmrc\") return \".npmrc\";\n return name;\n}\n\nfunction extOf(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot === -1 ? \"\" : name.slice(dot);\n}\n\nexport interface CopyOptions {\n templateDir: string;\n targetDir: string;\n tokens: Tokens;\n keepWorkspace: boolean;\n}\n\n/** Recursively scaffold templateDir → targetDir, substituting tokens. */\nexport async function copyTemplate(opts: CopyOptions): Promise<void> {\n await walk(opts.templateDir, opts);\n}\n\nasync function walk(dir: string, opts: CopyOptions): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await walk(join(dir, entry.name), opts);\n continue;\n }\n await copyFile(join(dir, entry.name), opts);\n }\n}\n\nasync function copyFile(srcPath: string, opts: CopyOptions): Promise<void> {\n const rel = relative(opts.templateDir, srcPath);\n const parts = rel.split(\"/\");\n parts[parts.length - 1] = targetName(parts[parts.length - 1]);\n const destPath = join(opts.targetDir, ...parts);\n await mkdir(join(destPath, \"..\"), { recursive: true });\n\n const base = parts[parts.length - 1];\n\n if (base === \"package.json\") {\n await writePackageJson(srcPath, destPath, opts);\n return;\n }\n\n if (TEXT_EXT.has(extOf(base))) {\n const body = await readFile(srcPath, \"utf8\");\n await writeFile(destPath, substitute(body, opts.tokens));\n return;\n }\n\n const raw = await readFile(srcPath);\n await writeFile(destPath, raw);\n}\n\nasync function writePackageJson(\n srcPath: string,\n destPath: string,\n opts: CopyOptions,\n): Promise<void> {\n const body = substitute(await readFile(srcPath, \"utf8\"), opts.tokens);\n const pkg = JSON.parse(body) as Record<string, unknown>;\n const rewritten = await rewritePackageJson(pkg, {\n keepWorkspace: opts.keepWorkspace,\n });\n // JSON.stringify drops keys set to undefined (e.g. private).\n await writeFile(destPath, `${JSON.stringify(rewritten, null, 2)}\\n`);\n}\n","import type { InitOptions, TemplateMeta } from \"../types.js\";\n\n/**\n * Resolve the concrete template directory + metadata for a scaffold request.\n *\n * - agent → seller-agent (Express) or buyer-agent (Node), by trading role\n * - seller → paywalled API by framework (express | hono | next)\n * - buyer → x402 client targeting a seller of the chosen framework\n */\nexport function resolveTemplate(opts: InitOptions): TemplateMeta {\n if (opts.type === \"agent\") {\n // Fixed handshake file so a scaffolded seller-agent + buyer-agent pair\n // discover each other on the same machine without extra config.\n return opts.agentRole === \"seller\"\n ? {\n dir: \"agent-seller-express\",\n port: 4100,\n tmpfile: \"4mica-agent.url\",\n runScript: \"dev\",\n description:\n \"Trading seller agent: sells information, paywalls the \" +\n \"premium result with dynamic per-request pricing\",\n }\n : {\n dir: \"agent-buyer-node\",\n port: 4100,\n tmpfile: \"4mica-agent.url\",\n runScript: \"start\",\n description:\n \"Trading buyer agent: pursues a goal under a budget, pays \" +\n \"sellers over x402, and adapts its strategy\",\n };\n }\n\n const ports: Record<string, number> = {\n express: 3000,\n hono: 3001,\n next: 3002,\n };\n\n // seller and buyer of the same framework share a handshake file + port so a\n // scaffolded pair interoperate in demo mode out of the box.\n const tmpfile = `4mica-${opts.framework}.url`;\n\n if (opts.type === \"seller\") {\n return {\n dir: `seller-${opts.framework}`,\n port: ports[opts.framework],\n tmpfile,\n runScript: \"dev\",\n description: `Seller (recipient): gate a ${opts.framework} route behind a 4Mica x402 paywall`,\n };\n }\n\n return {\n dir: `buyer-${opts.framework}`,\n port: ports[opts.framework],\n tmpfile,\n runScript: \"start\",\n description: `Buyer (payer): perform the x402 handshake against a ${opts.framework} seller`,\n };\n}\n","import { cancel, confirm, isCancel, select, text } from \"@clack/prompts\";\nimport { toPackageName } from \"../core/substitute.js\";\nimport type {\n AgentRole,\n BuildType,\n Framework,\n InitOptions,\n PackageManager,\n} from \"../types.js\";\n\n/** Flags already supplied on the command line (any subset of InitOptions). */\nexport type PartialInit = Partial<InitOptions>;\n\nfunction bail(): never {\n cancel(\"Scaffolding cancelled.\");\n process.exit(0);\n}\n\nfunction unwrap<T>(value: T | symbol): T {\n if (isCancel(value)) bail();\n return value as T;\n}\n\n/**\n * Fill any missing InitOptions interactively. Every prompt is skipped when the\n * corresponding flag was already provided, so flag mode and interactive mode\n * converge on the same resolved options.\n */\nexport async function runInitFlow(\n flags: PartialInit,\n defaultPm: PackageManager,\n): Promise<InitOptions> {\n if (flags.type === undefined) {\n const fromScratch = unwrap(\n await confirm({\n message: \"Generate a new 4Mica project from scratch?\",\n initialValue: true,\n }),\n );\n if (!fromScratch) {\n cancel(\n \"No problem — add 4Mica to an existing app with \" +\n \"`npm i @4mica/sdk @4mica/sdk-node`, then wrap a route with a \" +\n \"paywall. Docs: https://4mica.io/docs\",\n );\n process.exit(0);\n }\n }\n\n const type: BuildType =\n flags.type ??\n unwrap(\n await select({\n message: \"What are you building?\",\n options: [\n {\n value: \"agent\",\n label: \"Trading agent\",\n hint: \"buys/sells over x402\",\n },\n { value: \"seller\", label: \"Paywalled API (seller)\" },\n { value: \"buyer\", label: \"Buyer client\" },\n ],\n }),\n );\n\n let agentRole: AgentRole = flags.agentRole ?? \"seller\";\n let framework: Framework = flags.framework ?? \"express\";\n\n if (type === \"agent\") {\n if (flags.agentRole === undefined) {\n agentRole = unwrap(\n await select({\n message: \"Which side does your agent play?\",\n options: [\n {\n value: \"seller\",\n label: \"Seller agent\",\n hint: \"earns by selling info\",\n },\n {\n value: \"buyer\",\n label: \"Buyer agent\",\n hint: \"spends to reach a goal\",\n },\n ],\n }),\n );\n }\n } else if (flags.framework === undefined) {\n framework = unwrap(\n await select({\n message: \"Which framework?\",\n options: [\n { value: \"express\", label: \"Express\" },\n { value: \"hono\", label: \"Hono\" },\n { value: \"next\", label: \"Next.js\" },\n ],\n }),\n );\n }\n\n const defaultName =\n type === \"agent\" ? `my-${agentRole}-agent` : `my-${type}-${framework}`;\n const name =\n flags.name ??\n toPackageName(\n unwrap(\n await text({\n message: \"Project name?\",\n placeholder: defaultName,\n defaultValue: defaultName,\n }),\n ),\n );\n\n const packageManager: PackageManager =\n flags.packageManager ??\n unwrap(\n await select({\n message: \"Install with which package manager?\",\n initialValue: defaultPm,\n options: [\n { value: \"pnpm\", label: \"pnpm\" },\n { value: \"npm\", label: \"npm\" },\n { value: \"yarn\", label: \"yarn\" },\n { value: \"bun\", label: \"bun\" },\n ],\n }),\n );\n\n const openDashboard =\n flags.openDashboard ??\n unwrap(\n await confirm({\n message: \"Open the 4Mica dashboard to manage agents & transactions?\",\n initialValue: true,\n }),\n );\n\n return {\n dir: flags.dir ?? name,\n name,\n type,\n framework,\n agentRole,\n packageManager,\n install: flags.install ?? true,\n run: flags.run ?? true,\n openDashboard,\n };\n}\n","import { access } from \"node:fs/promises\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\nimport { intro, note, outro } from \"@clack/prompts\";\nimport terminalLink from \"terminal-link\";\nimport { resolveRunContext } from \"../core/context.js\";\nimport { copyTemplate } from \"../core/copy-engine.js\";\nimport { detectPackageManager } from \"../core/package-manager.js\";\nimport { gitInit, install, runScript } from \"../core/runner.js\";\nimport { resolveTemplate } from \"../core/template-registry.js\";\nimport { type PartialInit, runInitFlow } from \"../prompts/flow.js\";\nimport { brand, dim, ok, pc, step, warn } from \"../ui/log.js\";\nimport { launchDashboard } from \"./dashboard.js\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const rel = relative(parent, child);\n return !rel.startsWith(\"..\") && !isAbsolute(rel);\n}\n\nexport async function initCommand(flags: PartialInit): Promise<void> {\n intro(brand(\"4mica\"));\n\n const context = await resolveRunContext();\n const defaultPm = await detectPackageManager(\n process.cwd(),\n flags.packageManager,\n );\n const opts = await runInitFlow(flags, defaultPm);\n\n const template = resolveTemplate(opts);\n const templateDir = join(context.templatesDir, template.dir);\n const targetDir = resolve(process.cwd(), opts.dir);\n\n if (!(await exists(templateDir))) {\n throw new Error(`Template not found: ${template.dir}`);\n }\n if (await exists(targetDir)) {\n throw new Error(\n `Directory already exists: ${opts.dir} — choose another name.`,\n );\n }\n\n const keepWorkspace =\n context.inMonorepo &&\n context.monorepoRoot !== undefined &&\n isInside(targetDir, context.monorepoRoot);\n\n await step(`Scaffolding ${pc.bold(opts.name)}`, () =>\n copyTemplate({\n templateDir,\n targetDir,\n tokens: {\n PROJECT_NAME: opts.name,\n DESCRIPTION: template.description,\n PORT: String(template.port),\n TMPFILE: template.tmpfile,\n },\n keepWorkspace,\n }),\n );\n\n await gitInit(targetDir);\n\n if (opts.install) {\n await step(\n `Installing dependencies with ${opts.packageManager}`,\n () => install(opts.packageManager, targetDir),\n \"Dependencies installed\",\n );\n }\n\n printNextSteps(opts, template.runScript);\n outro(ok(\"Done — happy building!\"));\n\n // Launch the dashboard detached BEFORE the (blocking) dev server.\n if (opts.openDashboard) {\n await launchDashboard({ open: true, background: true });\n }\n\n if (opts.install && opts.run) {\n await runScript(opts.packageManager, template.runScript, targetDir);\n }\n}\n\nfunction printNextSteps(\n opts: { dir: string; packageManager: string; install: boolean },\n script: string,\n): void {\n const docs = terminalLink(\"4mica.io/docs\", \"https://4mica.io/docs\");\n const lines = [`cd ${opts.dir}`];\n if (!opts.install) lines.push(`${opts.packageManager} install`);\n lines.push(`${opts.packageManager} run ${script}`);\n lines.push(\"\");\n lines.push(`${dim(\"Demo mode needs no config. Going live?\")} ${docs}`);\n lines.push(`${dim(\"Env template:\")} ${warn(join(opts.dir, \".env.example\"))}`);\n note(lines.join(\"\\n\"), \"Next steps\");\n}\n","import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { launchDashboard } from \"./commands/dashboard.js\";\nimport { devCommand } from \"./commands/dev.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport type { PartialInit } from \"./prompts/flow.js\";\nimport type {\n AgentRole,\n BuildType,\n Framework,\n PackageManager,\n} from \"./types.js\";\nimport { err } from \"./ui/log.js\";\n\nconst BUILD_TYPES: BuildType[] = [\"agent\", \"seller\", \"buyer\"];\nconst FRAMEWORKS: Framework[] = [\"express\", \"hono\", \"next\"];\nconst AGENT_ROLES: AgentRole[] = [\"seller\", \"buyer\"];\nconst PMS: PackageManager[] = [\"pnpm\", \"npm\", \"yarn\", \"bun\"];\n\n/** Map yargs argv → the partial InitOptions the flow expects. */\nfunction flagsFromArgv(argv: Record<string, unknown>): PartialInit {\n const flags: PartialInit = {};\n if (argv.dir) flags.dir = String(argv.dir);\n if (argv.name) flags.name = String(argv.name);\n if (argv.type) flags.type = argv.type as BuildType;\n if (argv.framework) flags.framework = argv.framework as Framework;\n if (argv.role) flags.agentRole = argv.role as AgentRole;\n if (argv.pm) flags.packageManager = argv.pm as PackageManager;\n if (argv.install === false) flags.install = false;\n if (argv.run === false) flags.run = false;\n if (argv.dashboard !== undefined)\n flags.openDashboard = Boolean(argv.dashboard);\n\n // Non-interactive mode: fill defaults so no prompt is reached.\n if (argv.yes) {\n flags.type ??= \"agent\";\n if (flags.type === \"agent\") flags.agentRole ??= \"seller\";\n else flags.framework ??= \"express\";\n flags.packageManager ??= \"pnpm\";\n flags.install ??= true;\n flags.run ??= false; // scriptable: don't block on a dev server\n flags.openDashboard ??= false;\n flags.name ??=\n flags.type === \"agent\"\n ? `my-${flags.agentRole}-agent`\n : `my-${flags.type}-${flags.framework}`;\n }\n return flags;\n}\n\nexport async function run(): Promise<void> {\n const cli = yargs(hideBin(process.argv))\n .scriptName(\"4mica\")\n .usage(\"$0 <command> [options]\")\n .command(\n [\"init [dir]\", \"$0 [dir]\"],\n \"Scaffold a new 4Mica agent or payment app\",\n (y) =>\n y\n .positional(\"dir\", { type: \"string\", describe: \"Target directory\" })\n .option(\"type\", { choices: BUILD_TYPES, describe: \"What to build\" })\n .option(\"framework\", {\n choices: FRAMEWORKS,\n describe: \"Framework (seller/buyer)\",\n })\n .option(\"role\", {\n choices: AGENT_ROLES,\n describe: \"Trading role (agent)\",\n })\n .option(\"name\", { type: \"string\", describe: \"Project name\" })\n .option(\"pm\", { choices: PMS, describe: \"Package manager\" })\n .option(\"install\", {\n type: \"boolean\",\n default: true,\n describe: \"Install dependencies\",\n })\n .option(\"run\", {\n type: \"boolean\",\n default: true,\n describe: \"Start the dev server after scaffolding\",\n })\n .option(\"dashboard\", {\n type: \"boolean\",\n describe: \"Open the dashboard after scaffolding\",\n })\n .option(\"yes\", {\n alias: \"y\",\n type: \"boolean\",\n describe: \"Accept defaults; no prompts (CI)\",\n }),\n async (argv) => {\n await initCommand(flagsFromArgv(argv as Record<string, unknown>));\n },\n )\n .command(\n \"dashboard\",\n \"Launch the 4Mica dashboard (manage agents, transactions, whitelist)\",\n (y) =>\n y.option(\"open\", {\n type: \"boolean\",\n default: true,\n describe: \"Open a browser\",\n }),\n async (argv) => {\n await launchDashboard({ open: Boolean(argv.open) });\n },\n )\n .command(\n \"dev\",\n \"Run the current project's dev server\",\n (y) => y,\n async () => {\n await devCommand();\n },\n )\n .demandCommand(0)\n .strict()\n .help()\n .alias(\"help\", \"h\")\n .version()\n .alias(\"version\", \"v\")\n .fail((msg, error) => {\n process.stderr.write(err(`\\n${msg || error?.message || \"Error\"}\\n`));\n process.exit(1);\n });\n\n await cli.parse();\n}\n","import { run } from \"./cli.js\";\nimport { err } from \"./ui/log.js\";\n\nrun().catch((error: unknown) => {\n process.stderr.write(err(`\\n${(error as Error).message}\\n`));\n process.exitCode = 1;\n});\n"]}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@4mica/cli",
3
+ "version": "0.2.0",
4
+ "description": "Scaffold, run, and manage 4Mica agents and payment apps from the command line",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/4mica-Network/homepage.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://github.com/4mica-Network/homepage/tree/main/packages/cli#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/4mica-Network/homepage/issues"
15
+ },
16
+ "keywords": [
17
+ "4mica",
18
+ "cli",
19
+ "create",
20
+ "scaffold",
21
+ "x402",
22
+ "payments",
23
+ "agents"
24
+ ],
25
+ "bin": {
26
+ "4mica": "./dist/index.js"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "templates",
31
+ "snapshot.json"
32
+ ],
33
+ "engines": {
34
+ "node": ">=22.0.0"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@clack/prompts": "^1.7.0",
41
+ "execa": "^9.6.1",
42
+ "find-up": "^8.0.0",
43
+ "ora": "^9.4.0",
44
+ "picocolors": "^1.1.1",
45
+ "read-pkg": "^10.1.0",
46
+ "terminal-link": "^5.0.0",
47
+ "yargs": "^18.0.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^24.10.1",
51
+ "@types/yargs": "^17.0.35",
52
+ "publint": "^0.3.14",
53
+ "tsup": "^8.5.1",
54
+ "typescript": "^5.9.0",
55
+ "vitest": "^4.1.8",
56
+ "@4mica/tsconfig": "0.0.0"
57
+ },
58
+ "scripts": {
59
+ "prebuild": "node scripts/gen-snapshot.mjs",
60
+ "build": "tsup",
61
+ "gen:snapshot": "node scripts/gen-snapshot.mjs",
62
+ "dev": "tsup --watch",
63
+ "clean": "rm -rf dist",
64
+ "typecheck": "tsc --noEmit",
65
+ "test": "vitest run --passWithNoTests",
66
+ "check:exports": "publint --strict"
67
+ }
68
+ }
package/snapshot.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "catalog": {
3
+ "@arethetypeswrong/cli": "^0.18.2",
4
+ "@biomejs/biome": "^2.4.16",
5
+ "@changesets/cli": "^2.29.7",
6
+ "@clack/prompts": "^1.7.0",
7
+ "@coinbase/cdp-sdk": "^1.49.2",
8
+ "@noble/curves": "^2.2.0",
9
+ "@quillai-network/wachai-validation-sdk": "^0.1.0",
10
+ "@radix-ui/react-scroll-area": "^1.2.10",
11
+ "@radix-ui/react-slot": "^1.2.4",
12
+ "@react-google-maps/api": "^2.20.8",
13
+ "@reown/appkit": "^1.8.20",
14
+ "@reown/appkit-adapter-wagmi": "^1.8.20",
15
+ "@tailwindcss/postcss": "^4.3.0",
16
+ "@tailwindcss/vite": "^4.3.0",
17
+ "@tanstack/react-query": "^5.100.14",
18
+ "@testing-library/jest-dom": "^6.9.1",
19
+ "@testing-library/react": "^16.3.2",
20
+ "@testing-library/user-event": "^14.6.1",
21
+ "@types/express": "^5.0.0",
22
+ "@types/node": "^25.9.1",
23
+ "@types/npm-registry-fetch": "^8.0.9",
24
+ "@types/react": "^19.2.16",
25
+ "@types/react-dom": "^19.2.3",
26
+ "@types/yargs": "^17.0.35",
27
+ "@vitejs/plugin-react": "^6.0.3",
28
+ "@vitest/coverage-v8": "^4.1.8",
29
+ "@vitest/ui": "^4.1.8",
30
+ "@wagmi/connectors": "^8.0.15",
31
+ "@wagmi/core": "^3.5.0",
32
+ "@walletconnect/ethereum-provider": "2.23.4",
33
+ "accounts": "^0.14.6",
34
+ "ahooks": "^3.9.7",
35
+ "autoprefixer": "^10.5.0",
36
+ "changelogen": "^0.6.2",
37
+ "class-variance-authority": "^0.7.1",
38
+ "clsx": "^2.1.1",
39
+ "cross-env": "10.1.0",
40
+ "esbuild": "^0.28.0",
41
+ "execa": "^9.6.1",
42
+ "express": "^5.1.0",
43
+ "find-up": "^8.0.0",
44
+ "framer-motion": "^12.40.0",
45
+ "hono": "^4.6.0",
46
+ "husky": "^9.1.7",
47
+ "i18next": "^26.3.6",
48
+ "jsdom": "^29.1.1",
49
+ "knip": "^6.15.0",
50
+ "ky": "^2.0.2",
51
+ "lint-staged": "^17.0.7",
52
+ "lucide-react": "^1.17.0",
53
+ "next": "^16.2.7",
54
+ "npm-registry-fetch": "^20.0.0",
55
+ "ora": "^9.4.0",
56
+ "picocolors": "^1.1.1",
57
+ "postcss": "^8.5.15",
58
+ "publint": "^0.3.14",
59
+ "react": "^19.2.7",
60
+ "react-dom": "^19.2.7",
61
+ "react-i18next": "^17.0.9",
62
+ "react-router-dom": "^7.18.1",
63
+ "read-pkg": "^10.1.0",
64
+ "recharts": "^3.8.1",
65
+ "rimraf": "^6.1.3",
66
+ "shiki": "^3.0.0",
67
+ "tailwind-merge": "^3.6.0",
68
+ "tailwindcss": "^4.3.0",
69
+ "tailwindcss-animate": "^1.0.7",
70
+ "taze": "^19.14.1",
71
+ "terminal-link": "^5.0.0",
72
+ "tsup": "^8.5.1",
73
+ "tsx": "^4.22.4",
74
+ "turbo": "latest",
75
+ "typescript": "^5.9.0",
76
+ "viem": "2.x",
77
+ "vite": "^8.1.4",
78
+ "vitest": "^4.1.8",
79
+ "wagmi": "^3.6.16",
80
+ "yargs": "^18.0.0"
81
+ },
82
+ "catalogs": {
83
+ "node24": {
84
+ "@types/node": "^24.10.1"
85
+ },
86
+ "typescript-latest": {
87
+ "typescript": "^5.9.0"
88
+ }
89
+ },
90
+ "fourMica": {
91
+ "@4mica/cli": "0.2.0",
92
+ "@4mica/sdk": "1.3.1",
93
+ "@4mica/sdk-bun": "1.3.1",
94
+ "@4mica/sdk-deno": "1.3.1",
95
+ "@4mica/sdk-express": "1.3.1",
96
+ "@4mica/sdk-hono": "1.3.1",
97
+ "@4mica/sdk-next": "1.3.1",
98
+ "@4mica/sdk-node": "1.3.1"
99
+ }
100
+ }
@@ -0,0 +1,16 @@
1
+ # 4Mica runs in DEMO MODE with zero config (mock verifier / demo payment).
2
+ # To go live, swap the mock verifier for createClient() from @4mica/sdk-node
3
+ # and fill these in. Docs: https://4mica.io/docs
4
+
5
+ # 4MICA_WALLET_PRIVATE_KEY=0x...
6
+ # 4MICA_NETWORK=base-sepolia
7
+ # 4MICA_RPC_URL=
8
+ # 4MICA_ETHEREUM_HTTP_RPC_URL=
9
+ # 4MICA_CONTRACT_ADDRESS=
10
+ # 4MICA_ADMIN_API_KEY=
11
+ # 4MICA_BEARER_TOKEN=
12
+ # 4MICA_AUTH_URL=
13
+
14
+ # Agent brain: set to have Claude generate/judge for real (offline fallback otherwise).
15
+ # ANTHROPIC_API_KEY=sk-ant-...
16
+ # AGENT_MODEL=claude-opus-4-8
@@ -0,0 +1,26 @@
1
+ # __PROJECT_NAME__
2
+
3
+ __DESCRIPTION__
4
+
5
+ Generated with `4mica init` — part of the [4Mica](https://4mica.io) x402 payment network.
6
+
7
+ ## Run (demo mode — no config)
8
+
9
+ ```bash
10
+ npm install
11
+ npm run start
12
+ ```
13
+
14
+ Demo mode uses a mock verifier and a locally-built payment header, so it runs
15
+ with **zero credentials**.
16
+
17
+ ## Go live
18
+
19
+ Copy `.env.example` → `.env`, fill in your `4MICA_*` credentials, and swap the
20
+ mock verifier for `createClient()` from `@4mica/sdk-node`. Set `ANTHROPIC_API_KEY` to power the agent with Claude.
21
+
22
+ ## Manage agents & transactions
23
+
24
+ ```bash
25
+ 4mica dashboard
26
+ ```
@@ -0,0 +1,6 @@
1
+ node_modules
2
+ dist
3
+ .env
4
+ .env.local
5
+ .next
6
+ *.log
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "__PROJECT_NAME__",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "description": "__DESCRIPTION__",
6
+ "scripts": {
7
+ "start": "tsx src/critic.ts"
8
+ },
9
+ "dependencies": {
10
+ "@4mica/sdk": "workspace:*",
11
+ "@4mica/sdk-node": "workspace:*",
12
+ "@anthropic-ai/sdk": "^0.110.0"
13
+ },
14
+ "devDependencies": {
15
+ "@types/node": "catalog:node24",
16
+ "tsx": "catalog:",
17
+ "typescript": "catalog:typescript-latest"
18
+ }
19
+ }
@@ -0,0 +1,133 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+
3
+ const MODEL = process.env.AGENT_MODEL ?? "claude-opus-4-8";
4
+ const client = process.env.ANTHROPIC_API_KEY ? new Anthropic() : null;
5
+
6
+ export const brainMode = client ? `Claude (${MODEL})` : "offline heuristics";
7
+
8
+ export type Verdict = { predicted: number; buy: boolean; reason: string };
9
+ export type Score = { score: number; critique: string };
10
+
11
+ const CURATOR =
12
+ "You are a discerning comedy curator assembling a tight set on a theme, with a limited budget. " +
13
+ "You are shown a joke's SETUP only; the punchline costs money. " +
14
+ "Judge how promising the setup is and whether it's worth paying for. Be selective — money is finite. " +
15
+ 'Respond with ONLY minified JSON: {"predicted":<1-10>,"buy":<true|false>,"reason":"<short>"}.';
16
+
17
+ const JUDGE =
18
+ "You are a comedy critic. Rate the full joke on how funny it is, 1-10. Be honest and a little harsh. " +
19
+ 'Respond with ONLY minified JSON: {"score":<1-10>,"critique":"<short>"}.';
20
+
21
+ function extractJson<T>(text: string): T {
22
+ const start = text.indexOf("{");
23
+ const end = text.lastIndexOf("}");
24
+ return JSON.parse(text.slice(start, end + 1)) as T;
25
+ }
26
+
27
+ async function ask(system: string, user: string): Promise<string> {
28
+ if (!client) throw new Error("no ANTHROPIC_API_KEY");
29
+ const res = await client.messages.create({
30
+ model: MODEL,
31
+ max_tokens: 300,
32
+ system,
33
+ messages: [{ role: "user", content: user }],
34
+ });
35
+ return res.content
36
+ .filter((b) => b.type === "text")
37
+ .map((b) => b.text)
38
+ .join("");
39
+ }
40
+
41
+ export async function judgeSetup(args: {
42
+ theme: string;
43
+ category: string;
44
+ setup: string;
45
+ price: number;
46
+ budgetLeft: number;
47
+ slotsLeft: number;
48
+ }): Promise<Verdict> {
49
+ if (price_unaffordable(args)) {
50
+ return { predicted: 0, buy: false, reason: "can't afford the punchline" };
51
+ }
52
+ if (!client) return heuristicJudge(args);
53
+ try {
54
+ const text = await ask(
55
+ CURATOR,
56
+ `Theme: "${args.theme}". Style: ${args.category}. Budget left: ${args.budgetLeft} credits, ${args.slotsLeft} slots to fill.\n` +
57
+ `Punchline price: ${args.price} credits.\nSetup: "${args.setup}"`,
58
+ );
59
+ const v = extractJson<Verdict>(text);
60
+ return {
61
+ predicted: clamp(v.predicted),
62
+ buy: Boolean(v.buy) && args.price <= args.budgetLeft,
63
+ reason: v.reason ?? "",
64
+ };
65
+ } catch {
66
+ return heuristicJudge(args);
67
+ }
68
+ }
69
+
70
+ export async function rateJoke(args: {
71
+ theme: string;
72
+ setup: string;
73
+ punchline: string;
74
+ }): Promise<Score> {
75
+ if (!client) return heuristicRate(args);
76
+ try {
77
+ const text = await ask(
78
+ JUDGE,
79
+ `Theme: "${args.theme}".\nSetup: "${args.setup}"\nPunchline: "${args.punchline}"`,
80
+ );
81
+ const s = extractJson<Score>(text);
82
+ return { score: clamp(s.score), critique: s.critique ?? "" };
83
+ } catch {
84
+ return heuristicRate(args);
85
+ }
86
+ }
87
+
88
+ function clamp(n: number): number {
89
+ return Math.max(1, Math.min(10, Math.round(Number(n) || 5)));
90
+ }
91
+
92
+ function price_unaffordable(a: { price: number; budgetLeft: number }): boolean {
93
+ return a.price > a.budgetLeft;
94
+ }
95
+
96
+ function hash(text: string): number {
97
+ let h = 0;
98
+ for (let i = 0; i < text.length; i++) h = (h * 31 + text.charCodeAt(i)) | 0;
99
+ return Math.abs(h);
100
+ }
101
+
102
+ function heuristicJudge(a: {
103
+ category: string;
104
+ setup: string;
105
+ price: number;
106
+ budgetLeft: number;
107
+ }): Verdict {
108
+ const promise = 4 + ((hash(a.setup) % 6) + (a.setup.includes("?") ? 1 : 0));
109
+ const predicted = clamp(promise);
110
+ const buy = predicted >= 6 && a.price <= a.budgetLeft;
111
+ return {
112
+ predicted,
113
+ buy,
114
+ reason: buy
115
+ ? `setup looks promising (${predicted}/10) and ${a.price} fits the budget`
116
+ : `setup too weak (${predicted}/10) to spend ${a.price} credits`,
117
+ };
118
+ }
119
+
120
+ function heuristicRate(a: { setup: string; punchline: string }): Score {
121
+ const setupWords = new Set(a.setup.toLowerCase().split(/\W+/));
122
+ const surprise = a.punchline
123
+ .toLowerCase()
124
+ .split(/\W+/)
125
+ .filter((w) => w.length > 3 && !setupWords.has(w)).length;
126
+ const twist = /\b(but|actually|turns out|because|now)\b/i.test(a.punchline);
127
+ const base = 4 + Math.min(4, surprise) + (twist ? 1 : 0);
128
+ const jitter = (hash(a.punchline) % 3) - 1;
129
+ return {
130
+ score: clamp(base + jitter),
131
+ critique: surprise >= 2 ? "decent twist" : "predictable",
132
+ };
133
+ }