opencode-plugin-mimic 0.1.3 โ†’ 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -600,11 +600,14 @@ function getGitHistory(directory, limit = 50) {
600
600
  }
601
601
  function getRecentlyModifiedFiles(directory) {
602
602
  try {
603
- const result = execSync("git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only", {
604
- cwd: directory,
605
- encoding: "utf-8",
606
- stdio: ["pipe", "pipe", "pipe"]
607
- });
603
+ const result = execSync(
604
+ "git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only",
605
+ {
606
+ cwd: directory,
607
+ encoding: "utf-8",
608
+ stdio: ["pipe", "pipe", "pipe"]
609
+ }
610
+ );
608
611
  return result.trim().split("\n").filter(Boolean);
609
612
  } catch {
610
613
  return [];
@@ -947,11 +950,7 @@ async function buildMcpEvolution(ctx, suggestion) {
947
950
  }
948
951
  const configPath = join3(ctx.directory, "opencode.json");
949
952
  const config = await readOpencodeConfig(configPath);
950
- const mcpConfig = generateMcpConfig(
951
- suggestion.name,
952
- suggestion.description,
953
- suggestion.pattern
954
- );
953
+ const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);
955
954
  const mcp = { ...config.mcp || {}, ...mcpConfig };
956
955
  const content = JSON.stringify({ ...config, mcp }, null, 2);
957
956
  return { filePath: configPath, content };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/format.ts","../src/i18n.ts","../src/git.ts","../src/patterns.ts","../src/state.ts","../src/tools.ts","../src/evolution.ts","../src/level.ts","../src/index.ts"],"sourcesContent":["import { differenceInHours, format, formatDistanceToNow } from \"date-fns\";\nimport { enUS, ko } from \"date-fns/locale\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { State } from \"@/types\";\n\nexport type SessionStatus =\n | \"first-time\"\n | \"continuing\"\n | \"same-day\"\n | \"short-break\"\n | \"week-break\"\n | \"long-break\";\n\nexport function analyzeTimeSinceLastSession(lastSession: string | null): SessionStatus {\n if (!lastSession) return \"first-time\";\n const hours = differenceInHours(new Date(), new Date(lastSession));\n if (hours < 1) return \"continuing\";\n if (hours < 24) return \"same-day\";\n if (hours < 72) return \"short-break\";\n if (hours < 168) return \"week-break\";\n return \"long-break\";\n}\n\nexport function formatJourney(\n ctx: MimicContext,\n state: State,\n gitHistory: string[],\n): string {\n const milestones = state.journey.milestones.slice(-10);\n const observations = state.journey.observations.slice(-5);\n const locale = ctx.i18n.language === \"ko-KR\" ? ko : enUS;\n\n let output = `${ctx.i18n.t(\"journey.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.subtitle\")}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.sessions_survived\", {\n count: state.journey.sessionCount,\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.first_encounter\", {\n date: format(state.project.firstSession, \"yyyy-MM-dd\"),\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.abilities_gained\", {\n count: state.evolution.capabilities.length,\n })}\\n\\n`;\n\n if (state.project.stack && state.project.stack.length > 0) {\n output += `${ctx.i18n.t(\"journey.treasures\", {\n stack: state.project.stack.join(\", \"),\n })}\\n`;\n }\n if (state.project.focus) {\n output += `${ctx.i18n.t(\"journey.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n output += \"\\n\";\n\n if (milestones.length > 0) {\n output += `${ctx.i18n.t(\"journey.victories\")}\\n`;\n for (const m of milestones) {\n const timeAgo = formatDistanceToNow(new Date(m.timestamp), { addSuffix: true, locale });\n output += `- ${m.milestone} (${timeAgo})\\n`;\n }\n output += \"\\n\";\n }\n\n if (observations.length > 0) {\n output += `${ctx.i18n.t(\"journey.witnessed\")}\\n`;\n for (const o of observations) {\n output += `- ${o.observation}\\n`;\n }\n output += \"\\n\";\n }\n\n if (state.evolution.capabilities.length > 0) {\n output += `${ctx.i18n.t(\"journey.powers\")}\\n`;\n for (const cap of state.evolution.capabilities.slice(-5)) {\n output += `- **${cap.name}** (${formatCapabilityType(\n ctx.i18n,\n cap.type,\n )}): ${cap.description}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${ctx.i18n.t(\"journey.scrolls\")}\\n`;\n for (const commit of gitHistory.slice(0, 5)) {\n output += `- ${commit}\\n`;\n }\n }\n\n return output;\n}\n\nexport function formatDuration(ms: number): string {\n const minutes = Math.round(ms / 1000 / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}min`;\n}\n\nexport function formatGrowAnalysis(\n ctx: MimicContext,\n state: State,\n _gitHistory: string[],\n recentFiles: string[],\n): string {\n let output = `${ctx.i18n.t(\"grow.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"grow.subtitle\")}\\n\\n`;\n\n const fileFrequency = Object.entries(state.statistics.filesModified)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10);\n\n if (fileFrequency.length > 0) {\n output += `${ctx.i18n.t(\"grow.feeding_grounds\")}\\n`;\n for (const [file, count] of fileFrequency) {\n output += `- \\`${file}\\` ${ctx.i18n.t(\"grow.files_modified\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n const toolPatterns = state.patterns\n .filter((p) => p.type === \"tool\")\n .sort((a, b) => b.count - a.count);\n if (toolPatterns.length > 0) {\n output += `${ctx.i18n.t(\"grow.favorite_prey\")}\\n`;\n for (const p of toolPatterns.slice(0, 5)) {\n output += `- ${p.description}: ${p.count}\\n`;\n }\n output += \"\\n\";\n }\n\n if (recentFiles.length > 0) {\n const dirCount = new Map<string, number>();\n for (const file of recentFiles) {\n const dir = file.split(\"/\").slice(0, -1).join(\"/\") || \".\";\n dirCount.set(dir, (dirCount.get(dir) || 0) + 1);\n }\n const sortedDirs = [...dirCount.entries()].sort((a, b) => b[1] - a[1]);\n\n output += `${ctx.i18n.t(\"grow.hunting_grounds\")}\\n`;\n for (const [dir, count] of sortedDirs.slice(0, 5)) {\n output += `- \\`${dir}/\\` ${ctx.i18n.t(\"grow.prey\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n output += `${ctx.i18n.t(\"grow.questions\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question1\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question2\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question3\")}\\n`;\n\n if (state.project.focus) {\n output += `\\n${ctx.i18n.t(\"grow.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n\n return output;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type Language = \"en-US\" | \"ko-KR\";\n\nexport interface MimicUserConfig {\n language?: string;\n}\n\nconst DEFAULT_LANGUAGE: Language = \"en-US\";\n\nconst MESSAGES: Record<Language, Record<string, string>> = {\n \"en-US\": {\n \"log.session_started\": \"[Mimic] Session started. Sessions: {sessions}, Patterns: {patterns}\",\n \"log.session_ended\": \"[Mimic] Session ended. Duration: {duration}, Tools: {tools}, Files: {files}\",\n \"obs.returned_after_long_break\": \"Returned after a long break\",\n \"obs.intensive_session\": \"Intensive session with {tools} tool calls\",\n \"milestone.major_refactor\": \"Major refactoring session: {files} files edited\",\n \"milestone.evolved\": \"Evolved: {name} ({type})\",\n \"obs.focus_changed\": \"Focus changed to: {focus}\",\n \"milestone.mcp_added\": \"Added MCP: {name}\",\n\n \"init.first_time\": \"# ๐Ÿ“ฆ *creak...*\\n\\nA treasure chest? In {project}?\\n\\n*The lid opens slowly, revealing rows of gleaming teeth...*\\n\\nI'm **Mimic**. I look like a chest, but I'm always watching. Always learning.\\n\\n**What I devour... I mean, do:**\\n- ๐Ÿ‘๏ธ Watch your patterns (tools, files, commits)\\n- ๐Ÿง  Remember everything across sessions\\n- ๐Ÿ“œ Track your project's journey\\n- โœจ Suggest shortcuts when I spot repetition\\n\\nUse `mimic:status` to check in, `mimic:journey` to see your story.\\n\\n*...the teeth retract. For now.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *creak...*\",\n \"init.returning.welcome\": \"*The chest's eye opens* Ah, you're back to **{project}**.\",\n \"init.returning.stats\": \"**Sessions**: {sessions} | **Patterns digested**: {patterns}\",\n \"init.returning.long_break\": \"*dust falls from the lid* It's been a while... but I remember everything:\",\n \"init.returning.recent_obs_title\": \"**What I've been chewing on:**\",\n\n \"status.title\": \"## {project} Status\",\n \"status.session\": \"**Session**: {count}\",\n \"status.patterns\": \"**Patterns**: {total} detected, {surfaced} surfaced\",\n \"status.tool_calls\": \"**Tool calls this session**: {count}\",\n \"status.recent_files\": \"**Recently modified files:**\",\n \"status.recent_commits\": \"**Recent commits:**\",\n \"status.suggestions\": \"**Suggestions:**\",\n\n \"patterns.none\": \"No patterns detected yet. Keep working, and I'll learn your patterns.\",\n \"patterns.title\": \"## Detected Patterns\",\n \"patterns.total\": \"Total: {count}\",\n \"patterns.section\": \"### {type} Patterns\",\n \"patterns.type.tool\": \"Tool\",\n \"patterns.type.file\": \"File\",\n \"patterns.type.commit\": \"Commit\",\n \"patterns.type.sequence\": \"Sequence\",\n\n \"observe.recorded\": \"Observation recorded: \\\"{observation}\\\"\",\n \"milestone.recorded\": \"Milestone recorded: \\\"{milestone}\\\"\",\n\n \"stats.title\": \"Mimic Statistics\",\n \"stats.version\": \"Version\",\n \"stats.total_sessions\": \"Total Sessions\",\n \"stats.total_tool_calls\": \"Total Tool Calls\",\n \"stats.patterns_detected\": \"Patterns Detected\",\n \"stats.milestones\": \"Milestones\",\n \"stats.observations\": \"Observations\",\n \"stats.session_records\": \"Session Records\",\n \"stats.first_session\": \"First Session\",\n \"stats.learning_enabled\": \"Learning Enabled\",\n \"stats.suggestions_enabled\": \"Suggestions Enabled\",\n\n \"configure.updated\": \"Preferences updated:\",\n\n \"surface.not_found\": \"Pattern not found: {id}\",\n \"surface.marked\": \"Pattern \\\"{description}\\\" marked as surfaced.\",\n\n \"reset.cancelled\": \"Reset cancelled. Set confirm=true to reset all data.\",\n \"reset.done\": \"Mimic reset complete. All patterns, observations, and statistics cleared.\",\n\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *confused clicking* No such pattern in my belly: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *CRUNCH* I've absorbed a new power and spit out a file!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *yawns* Nothing ripe for evolution yet. Feed me more patterns...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ Evolution Menu\",\n \"evolve.menu_intro\": \"*The mimic's teeth rearrange into a grin* I can digest these patterns into powers:\",\n \"evolve.menu_type\": \"Type\",\n \"evolve.menu_reason\": \"Reason\",\n \"evolve.menu_pattern_id\": \"Pattern ID\",\n \"evolve.menu_footer\": \"*Feed me a pattern ID:* `mimic:evolve({ accept: \\\"pattern-id\\\" })`\",\n\n \"evolution.type.command\": \"command\",\n \"evolution.type.shortcut\": \"shortcut\",\n \"evolution.type.hook\": \"hook\",\n \"evolution.type.skill\": \"skill\",\n \"evolution.type.agent\": \"agent\",\n \"evolution.type.mcp\": \"mcp\",\n\n \"evolution.result.type\": \"Type\",\n \"evolution.result.description\": \"Description\",\n \"evolution.result.file\": \"File created\",\n \"evolution.result.restart\": \"Restart OpenCode to load the new {type}.\",\n \"evolution.result.command\": \"The tool `{name}` will be available after restart.\\nEdit the file to customize its behavior.\",\n \"evolution.result.hook\": \"The hook will automatically watch for file changes after restart.\\nEdit the file to customize the trigger conditions.\",\n \"evolution.result.skill\": \"The skill will activate on session start after restart.\\nEdit the file to customize when and how it triggers.\",\n \"evolution.result.agent\": \"The agent `@{name}` will be available after restart.\\nYou can invoke it with `@{name}` or let other agents delegate to it.\\nEdit the markdown file to customize its prompt, tools, and permissions.\",\n \"evolution.result.mcp\": \"MCP server `{name}` has been added to `opencode.json`.\\nIt's currently disabled. Edit the config to enable it and configure the command.\\nSee https://opencode.ai/docs/mcp-servers/ for MCP configuration options.\",\n\n \"evolution.suggest.tool.description\": \"Shortcut for frequent {pattern} usage\",\n \"evolution.suggest.tool.reason\": \"Used {count} times\",\n \"evolution.suggest.file.description\": \"Auto-track changes to {pattern}\",\n \"evolution.suggest.file.reason\": \"Modified {count} times\",\n \"evolution.suggest.commit.description\": \"Quick commit: \\\"{pattern}\\\"\",\n \"evolution.suggest.commit.reason\": \"Committed {count} times with same message\",\n \"evolution.suggest.sequence.agent.description\": \"Specialist agent for: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\": \"Complex sequence repeated {count} times - needs dedicated agent\",\n \"evolution.suggest.sequence.skill.description\": \"Automate: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"Repeated sequence {count} times\",\n\n \"level.set\": \"Level set to \\\"{level}\\\". Responses will be {style} style with {detail} detail.\",\n \"level.label.technical\": \"technical\",\n \"level.label.semi-technical\": \"semi-technical\",\n \"level.label.non-technical\": \"non-technical\",\n \"level.label.chaotic\": \"chaotic\",\n \"level.style.minimal\": \"minimal\",\n \"level.style.casual\": \"casual\",\n \"level.style.formal\": \"formal\",\n \"level.style.chaotic\": \"chaotic\",\n \"level.detail.high\": \"high\",\n \"level.detail.medium\": \"medium\",\n \"level.detail.low\": \"low\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\": \"๐Ÿ“ฆ *creak* Back to {project}. I've been watching... Session {sessions}.\",\n \"level.greeting.formal\": \"๐Ÿ“ฆ The chest opens... Welcome back to {project}. Session {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*CHOMP*\",\n \"level.greeting.chaotic.lid_creaks\": \"*lid creaks*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*teeth gleam*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*tongue flicks*\",\n \"level.term.tool\": \"tool\",\n \"level.term.pattern\": \"pattern\",\n \"level.term.hook\": \"hook\",\n \"level.term.shortcut\": \"shortcut\",\n \"level.term.habit\": \"habit\",\n \"level.term.automation\": \"automation\",\n\n \"focus.updated\": \"Project updated:\",\n \"focus.focus_label\": \"Focus\",\n \"focus.stack_label\": \"Stack\",\n\n \"mcp_search.header\": \"๐Ÿ“ฆ *sniffs the air* Search for \\\"{query}\\\" MCP servers:\\n\\n๐Ÿ”— {url}\",\n \"mcp_search.popular\": \"**Popular MCP servers:**\",\n \"mcp_search.add\": \"Use `mimic:mcp` to add one: `mimic:mcp({ name: \\\"context7\\\", url: \\\"https://mcp.context7.com/mcp\\\" })`\",\n \"mcp_search.desc.context7\": \"Up-to-date docs\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"Database\",\n \"mcp_search.desc.playwright\": \"Browser automation\",\n \"mcp_search.desc.firecrawl\": \"Web scraping\",\n\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *confused* Need either url or command!\",\n \"mcp.added\": \"๐Ÿ“ฆ *tongue flicks* MCP server \\\"{name}\\\" added to opencode.json!\\n\\nRestart OpenCode to load the new MCP server.\",\n\n \"capabilities.empty\": \"๐Ÿ“ฆ *empty rattling* No powers absorbed yet. Use `mimic:evolve` to consume some patterns!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ Absorbed Powers\",\n \"capabilities.intro\": \"*The mimic proudly displays its collection...*\",\n \"capabilities.type\": \"Type\",\n \"capabilities.description\": \"Description\",\n \"capabilities.consumed\": \"Consumed\",\n\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - Territory Analysis\",\n \"grow.subtitle\": \"*The mimic surveys the dungeon, noting paths most traveled...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ Feeding Grounds (Most Modified)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท Favorite Prey (Tool Patterns)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ Hunting Grounds\",\n \"grow.questions\": \"### ๐Ÿค” The Chest Wonders...\",\n \"grow.question1\": \"- What treasure shall we hunt next?\",\n \"grow.question2\": \"- Are there forgotten corners of the dungeon?\",\n \"grow.question3\": \"- Does the current path lead to glory?\",\n \"grow.current_hunt\": \"**Current hunt**: {focus}\",\n \"grow.files_modified\": \"({count}x)\",\n \"grow.prey\": \"({count} prey)\",\n\n \"journey.title\": \"## ๐Ÿ“ฆ {project}'s Journey\",\n \"journey.subtitle\": \"*The mimic opens its lid, revealing ancient scrolls within...*\",\n \"journey.sessions_survived\": \"**Sessions survived**: {count}\",\n \"journey.first_encounter\": \"**First encounter**: {date}\",\n \"journey.abilities_gained\": \"**Abilities gained**: {count}\",\n \"journey.treasures\": \"**Treasures inside**: {stack}\",\n \"journey.current_hunt\": \"**Current hunt**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† Victories\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ What I've Witnessed\",\n \"journey.powers\": \"### โœจ Powers Absorbed\",\n \"journey.scrolls\": \"### ๐Ÿ“œ Recent Scrolls\",\n\n \"suggest.commit\": \"๐Ÿ“ฆ *munch munch* I've digested \\\"{pattern}\\\" {count}+ times. Want me to spit out a shortcut?\",\n \"suggest.file\": \"๐Ÿ“ฆ *peers at file* You keep poking \\\"{pattern}\\\" ({count}x). Should I keep an eye on it?\",\n \"suggest.tool\": \"๐Ÿ“ฆ *teeth click* \\\"{pattern}\\\" is tasty... you use it often. Custom tool, perhaps?\",\n \"suggest.sequence\": \"๐Ÿ“ฆ *lid rattles* I sense a pattern in your movements ({pattern})... Let me automate this for you?\",\n \"tool.init.description\": \"Initialize or wake up Mimic for this project\",\n \"tool.status.description\": \"Check current status and recent activity\",\n \"tool.journey.description\": \"View the narrative story of your project's evolution\",\n \"tool.patterns.description\": \"Show all detected patterns\",\n \"tool.observe.description\": \"Manually add an observation to the journey\",\n \"tool.observe.args.observation\": \"The observation to record\",\n \"tool.milestone.description\": \"Record a project milestone\",\n \"tool.milestone.args.milestone\": \"The milestone to record\",\n \"tool.stats.description\": \"Show detailed Mimic statistics\",\n \"tool.configure.description\": \"Configure Mimic preferences\",\n \"tool.configure.args.learningEnabled\": \"Enable/disable pattern learning\",\n \"tool.configure.args.suggestionEnabled\": \"Enable/disable suggestions\",\n \"tool.configure.args.minPatternCount\": \"Minimum occurrences before suggesting\",\n \"tool.surface.description\": \"Mark a pattern as surfaced (acknowledged)\",\n \"tool.surface.args.patternId\": \"The pattern ID to mark as surfaced\",\n \"tool.reset.description\": \"Reset all learned patterns and statistics\",\n \"tool.reset.args.confirm\": \"Must be true to confirm reset\",\n \"tool.grow.description\": \"Analyze project direction and growth opportunities\",\n \"tool.evolve.description\": \"Suggest and create new capabilities based on detected patterns\",\n \"tool.evolve.args.accept\": \"Pattern ID to evolve into a capability\",\n \"tool.level.description\": \"Set your technical level for personalized responses\",\n \"tool.level.args.level\": \"Your technical level\",\n \"tool.focus.description\": \"Set current project focus or priorities\",\n \"tool.focus.args.focus\": \"Current focus area\",\n \"tool.focus.args.stack\": \"Comma-separated tech stack\",\n \"tool.mcp_search.description\": \"Search for MCP servers from mcpmarket.com\",\n \"tool.mcp_search.args.query\": \"Search query for MCP servers\",\n \"tool.mcp.description\": \"Add an MCP server configuration to opencode.json\",\n \"tool.mcp.args.name\": \"Name for the MCP server\",\n \"tool.mcp.args.url\": \"Remote MCP server URL\",\n \"tool.mcp.args.command\": \"Local MCP command (comma-separated)\",\n \"tool.capabilities.description\": \"List all evolved capabilities\",\n },\n \"ko-KR\": {\n \"log.session_started\": \"[Mimic] ์„ธ์…˜ ์‹œ์ž‘. ์„ธ์…˜ {sessions}ํšŒ, ํŒจํ„ด {patterns}๊ฐœ\",\n \"log.session_ended\": \"[Mimic] ์„ธ์…˜ ์ข…๋ฃŒ. ์†Œ์š”: {duration}, ๋„๊ตฌ {tools}ํšŒ, ํŒŒ์ผ {files}๊ฐœ\",\n \"obs.returned_after_long_break\": \"์˜ค๋žœ ๊ณต๋ฐฑ ํ›„ ๋ณต๊ท€\",\n \"obs.intensive_session\": \"๋„๊ตฌ ํ˜ธ์ถœ {tools}ํšŒ โ€” ์ง‘์ค‘ ์„ธ์…˜\",\n \"milestone.major_refactor\": \"๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ„ฐ๋ง ์„ธ์…˜: ํŒŒ์ผ {files}๊ฐœ ์ˆ˜์ •\",\n \"milestone.evolved\": \"์ง„ํ™”: {name} ({type})\",\n \"obs.focus_changed\": \"ํฌ์ปค์Šค ๋ณ€๊ฒฝ: {focus}\",\n \"milestone.mcp_added\": \"MCP ์ถ”๊ฐ€: {name}\",\n \"init.first_time\": \"# ๐Ÿ“ฆ *๋ผ์ต...*\\n\\n{project}์— ๋ณด๋ฌผ์ƒ์ž๋ผ๋‹ˆ?\\n\\n*๋šœ๊ป‘์ด ์ฒœ์ฒœํžˆ ์—ด๋ฆฌ๋ฉฐ ๋ฐ˜์ง์ด๋Š” ์ด๋นจ์ด ๋ณด์ธ๋‹ค...*\\n\\n๋‚˜๋Š” **Mimic**. ์ƒ์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋Š˜ ์ง€์ผœ๋ณด๊ณ , ๋Š˜ ๋ฐฐ์šฐ์ง€.\\n\\n**๋‚ด๊ฐ€ ๋จน๋Š”... ์•„๋‹ˆ, ํ•˜๋Š” ์ผ:**\\n- ๐Ÿ‘๏ธ ํŒจํ„ด ๊ด€์ฐฐ (ํˆด, ํŒŒ์ผ, ์ปค๋ฐ‹)\\n- ๐Ÿง  ์„ธ์…˜ ๊ฐ„ ๊ธฐ์–ต\\n- ๐Ÿ“œ ํ”„๋กœ์ ํŠธ ์—ฌ์ • ๊ธฐ๋ก\\n- โœจ ๋ฐ˜๋ณต์„ ๋ณด๋ฉด ์ง€๋ฆ„๊ธธ ์ œ์•ˆ\\n\\n`mimic:status`๋กœ ์ƒํƒœ ํ™•์ธ, `mimic:journey`๋กœ ์ด์•ผ๊ธฐ ๋ณด๊ธฐ.\\n\\n*...์ด๋Š” ์ž ๊น ์ˆจ๊ฒจ๋‘”๋‹ค.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *๋ผ์ต...*\",\n \"init.returning.welcome\": \"*์ƒ์ž์˜ ๋ˆˆ์ด ๋œฌ๋‹ค* **{project}**๋กœ ๋Œ์•„์™”๋„ค.\",\n \"init.returning.stats\": \"**์„ธ์…˜**: {sessions} | **์†Œํ™”ํ•œ ํŒจํ„ด**: {patterns}\",\n \"init.returning.long_break\": \"*๋šœ๊ป‘์— ๋จผ์ง€๊ฐ€ ๋‚ด๋ ค์•‰๋Š”๋‹ค* ์˜ค๋žœ๋งŒ์ด์•ผ... ๊ทธ๋ž˜๋„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด:\",\n \"init.returning.recent_obs_title\": \"**๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ๋“ค:**\",\n \"status.title\": \"## {project} ์ƒํƒœ\",\n \"status.session\": \"**์„ธ์…˜**: {count}\",\n \"status.patterns\": \"**ํŒจํ„ด**: {total}๊ฐœ ๊ฐ์ง€, {surfaced}๊ฐœ ํ™•์ธ\",\n \"status.tool_calls\": \"**์ด๋ฒˆ ์„ธ์…˜ ๋„๊ตฌ ํ˜ธ์ถœ**: {count}\",\n \"status.recent_files\": \"**์ตœ๊ทผ ์ˆ˜์ • ํŒŒ์ผ:**\",\n \"status.recent_commits\": \"**์ตœ๊ทผ ์ปค๋ฐ‹:**\",\n \"status.suggestions\": \"**์ œ์•ˆ:**\",\n \"patterns.none\": \"์•„์ง ๊ฐ์ง€๋œ ํŒจํ„ด์ด ์—†์–ด์š”. ๊ณ„์† ์ž‘์—…ํ•˜๋ฉด ๋ฐฐ์›Œ๋‘˜๊ฒŒ์š”.\",\n \"patterns.title\": \"## ๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"patterns.total\": \"์ด {count}๊ฐœ\",\n \"patterns.section\": \"### {type} ํŒจํ„ด\",\n \"patterns.type.tool\": \"๋„๊ตฌ\",\n \"patterns.type.file\": \"ํŒŒ์ผ\",\n \"patterns.type.commit\": \"์ปค๋ฐ‹\",\n \"patterns.type.sequence\": \"์‹œํ€€์Šค\",\n \"observe.recorded\": \"๊ด€์ฐฐ ๊ธฐ๋ก: \\\"{observation}\\\"\",\n \"milestone.recorded\": \"๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก: \\\"{milestone}\\\"\",\n \"stats.title\": \"Mimic ํ†ต๊ณ„\",\n \"stats.version\": \"๋ฒ„์ „\",\n \"stats.total_sessions\": \"์ด ์„ธ์…˜\",\n \"stats.total_tool_calls\": \"์ด ๋„๊ตฌ ํ˜ธ์ถœ\",\n \"stats.patterns_detected\": \"๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"stats.milestones\": \"๋งˆ์ผ์Šคํ†ค\",\n \"stats.observations\": \"๊ด€์ฐฐ\",\n \"stats.session_records\": \"์„ธ์…˜ ๊ธฐ๋ก\",\n \"stats.first_session\": \"์ฒซ ์„ธ์…˜\",\n \"stats.learning_enabled\": \"ํ•™์Šต ํ™œ์„ฑํ™”\",\n \"stats.suggestions_enabled\": \"์ œ์•ˆ ํ™œ์„ฑํ™”\",\n \"configure.updated\": \"์„ค์ • ์—…๋ฐ์ดํŠธ:\",\n \"surface.not_found\": \"ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {id}\",\n \"surface.marked\": \"ํŒจํ„ด \\\"{description}\\\"์„(๋ฅผ) ํ™•์ธ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.\",\n \"reset.cancelled\": \"๋ฆฌ์…‹ ์ทจ์†Œ๋จ. ์ „์ฒด ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด confirm=true๋กœ ์„ค์ •ํ•˜์„ธ์š”.\",\n \"reset.done\": \"Mimic ๋ฆฌ์…‹ ์™„๋ฃŒ. ํŒจํ„ด/๊ด€์ฐฐ/ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.\",\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ๋‚ด ์†์— ๊ทธ๋Ÿฐ ํŒจํ„ด์€ ์—†์–ด: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *์™€์ž‘* ์ƒˆ ํž˜์„ ํก์ˆ˜ํ•˜๊ณ  ํŒŒ์ผ์„ ๋ฑ‰์–ด๋ƒˆ๋‹ค!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ์•„์ง ์ง„ํ™”ํ•  ํŒจํ„ด์ด ์—†์–ด. ๋” ๋จน์—ฌ์ค˜...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ ์ง„ํ™” ๋ฉ”๋‰ด\",\n \"evolve.menu_intro\": \"*์ด๋นจ์ด ๋ฏธ์†Œ ๋ชจ์–‘์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค* ์ด ํŒจํ„ด๋“ค์„ ํž˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด:\",\n \"evolve.menu_type\": \"์œ ํ˜•\",\n \"evolve.menu_reason\": \"์ด์œ \",\n \"evolve.menu_pattern_id\": \"ํŒจํ„ด ID\",\n \"evolve.menu_footer\": \"*ํŒจํ„ด ID๋ฅผ ๋จน์—ฌ์ค˜:* `mimic:evolve({ accept: \\\"pattern-id\\\" })`\",\n \"evolution.type.command\": \"๋ช…๋ น\",\n \"evolution.type.shortcut\": \"๋‹จ์ถ•ํ‚ค\",\n \"evolution.type.hook\": \"ํ›…\",\n \"evolution.type.skill\": \"์Šคํ‚ฌ\",\n \"evolution.type.agent\": \"์—์ด์ „ํŠธ\",\n \"evolution.type.mcp\": \"MCP\",\n \"evolution.result.type\": \"์œ ํ˜•\",\n \"evolution.result.description\": \"์„ค๋ช…\",\n \"evolution.result.file\": \"์ƒ์„ฑ๋œ ํŒŒ์ผ\",\n \"evolution.result.restart\": \"์ƒˆ {type}๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.\",\n \"evolution.result.command\": \"`{name}` ๋„๊ตฌ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\nํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” ๋™์ž‘์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.\",\n \"evolution.result.hook\": \"ํ›…์ด ์žฌ์‹œ์ž‘ ํ›„ ์ž๋™์œผ๋กœ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.\\nํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•ด ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.skill\": \"์Šคํ‚ฌ์€ ์žฌ์‹œ์ž‘ ํ›„ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.\\n์–ธ์ œ/์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ˆ˜์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.agent\": \"`@{name}` ์—์ด์ „ํŠธ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\n`@{name}`์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๊ฐ€ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\\n๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ํ”„๋กฌํ”„ํŠธ/๋„๊ตฌ/๊ถŒํ•œ์„ ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.mcp\": \"MCP ์„œ๋ฒ„ `{name}`๊ฐ€ `opencode.json`์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\nํ˜„์žฌ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ์ˆ˜์ •ํ•ด ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ช…๋ น์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.\\nMCP ์˜ต์…˜์€ https://opencode.ai/docs/mcp-servers/ ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.\",\n \"evolution.suggest.tool.description\": \"์ž์ฃผ ์“ฐ๋Š” {pattern}์˜ ๋‹จ์ถ•ํ‚ค\",\n \"evolution.suggest.tool.reason\": \"{count}ํšŒ ์‚ฌ์šฉ\",\n \"evolution.suggest.file.description\": \"{pattern} ๋ณ€๊ฒฝ ์ž๋™ ์ถ”์ \",\n \"evolution.suggest.file.reason\": \"{count}ํšŒ ์ˆ˜์ •\",\n \"evolution.suggest.commit.description\": \"๋น ๋ฅธ ์ปค๋ฐ‹: \\\"{pattern}\\\"\",\n \"evolution.suggest.commit.reason\": \"๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ {count}ํšŒ ์ปค๋ฐ‹\",\n \"evolution.suggest.sequence.agent.description\": \"์ „๋‹ด ์—์ด์ „ํŠธ: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\": \"๋ณต์žกํ•œ ์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต โ€” ์ „๋‹ด ์—์ด์ „ํŠธ ํ•„์š”\",\n \"evolution.suggest.sequence.skill.description\": \"์ž๋™ํ™”: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต\",\n \"level.set\": \"๋ ˆ๋ฒจ์„ \\\"{level}\\\"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ {style} ํ†ค, {detail} ์ƒ์„ธ๋„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.\",\n \"level.label.technical\": \"๊ธฐ์ˆ ์ \",\n \"level.label.semi-technical\": \"์ค€๊ธฐ์ˆ \",\n \"level.label.non-technical\": \"๋น„๊ธฐ์ˆ \",\n \"level.label.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.style.minimal\": \"๊ฐ„๊ฒฐํ•œ\",\n \"level.style.casual\": \"์บ์ฃผ์–ผ\",\n \"level.style.formal\": \"์ •์ค‘ํ•œ\",\n \"level.style.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.detail.high\": \"๋†’์Œ\",\n \"level.detail.medium\": \"์ค‘๊ฐ„\",\n \"level.detail.low\": \"๋‚ฎ์Œ\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\": \"๐Ÿ“ฆ *๋ผ์ต* {project}๋กœ ๋Œ์•„์™”๋„ค. ๊ณ„์† ์ง€์ผœ๋ณด๊ณ  ์žˆ์—ˆ์–ด... ์„ธ์…˜ {sessions}.\",\n \"level.greeting.formal\": \"๐Ÿ“ฆ ์ƒ์ž๊ฐ€ ์—ด๋ฆฐ๋‹ค... {project}์— ๋‹ค์‹œ ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*์™€๊ทธ์ž‘*\",\n \"level.greeting.chaotic.lid_creaks\": \"*๋šœ๊ป‘ ์‚๊ฑฑ*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*์ด๋นจ ๋ฒˆ๋œฉ*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*ํ˜€ ํ•ฅ์ง*\",\n \"level.term.tool\": \"๋„๊ตฌ\",\n \"level.term.pattern\": \"ํŒจํ„ด\",\n \"level.term.hook\": \"ํ›…\",\n \"level.term.shortcut\": \"์ง€๋ฆ„๊ธธ\",\n \"level.term.habit\": \"์Šต๊ด€\",\n \"level.term.automation\": \"์ž๋™ํ™”\",\n \"focus.updated\": \"ํ”„๋กœ์ ํŠธ ์ •๋ณด ์—…๋ฐ์ดํŠธ:\",\n \"focus.focus_label\": \"ํ˜„์žฌ ํฌ์ปค์Šค\",\n \"focus.stack_label\": \"์Šคํƒ\",\n \"mcp_search.header\": \"๐Ÿ“ฆ *ํ‚ํ‚* \\\"{query}\\\" MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰:\\n\\n๐Ÿ”— {url}\",\n \"mcp_search.popular\": \"**์ธ๊ธฐ MCP ์„œ๋ฒ„:**\",\n \"mcp_search.add\": \"`mimic:mcp`๋กœ ์ถ”๊ฐ€: `mimic:mcp({ name: \\\"context7\\\", url: \\\"https://mcp.context7.com/mcp\\\" })`\",\n \"mcp_search.desc.context7\": \"์ตœ์‹  ๋ฌธ์„œ\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค\",\n \"mcp_search.desc.playwright\": \"๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”\",\n \"mcp_search.desc.firecrawl\": \"์›น ์Šคํฌ๋ž˜ํ•‘\",\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* url ๋˜๋Š” command ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ด!\",\n \"mcp.added\": \"๐Ÿ“ฆ *ํ˜€๋ฅผ ๋‚ผ๋ฆ„* MCP ์„œ๋ฒ„ \\\"{name}\\\"๊ฐ€ opencode.json์— ์ถ”๊ฐ€๋์–ด!\\n\\n์ƒˆ MCP ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•ด.\",\n \"capabilities.empty\": \"๐Ÿ“ฆ *ํ…… ๋นˆ ๋œ์ปน* ์•„์ง ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ์ด ์—†์–ด. `mimic:evolve`๋กœ ํŒจํ„ด์„ ๋จน์—ฌ์ค˜!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"capabilities.intro\": \"*๋ฏธ๋ฏน์ด ์ˆ˜์ง‘ํ’ˆ์„ ์ž๋ž‘ํ•œ๋‹ค...*\",\n \"capabilities.type\": \"์œ ํ˜•\",\n \"capabilities.description\": \"์„ค๋ช…\",\n \"capabilities.consumed\": \"ํก์ˆ˜์ผ\",\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - ์˜์—ญ ๋ถ„์„\",\n \"grow.subtitle\": \"*๋ฏธ๋ฏน์ด ๋˜์ „์„ ํ›‘์œผ๋ฉฐ ์ž์ฃผ ๋‹ค๋‹Œ ๊ธธ์„ ๊ธฐ๋กํ•œ๋‹ค...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ ๋จน์ด ํ„ฐ (๊ฐ€์žฅ ๋งŽ์ด ์ˆ˜์ •)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท ์ข‹์•„ํ•˜๋Š” ๋จน์ด (๋„๊ตฌ ํŒจํ„ด)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ ์‚ฌ๋ƒฅํ„ฐ\",\n \"grow.questions\": \"### ๐Ÿค” ์ƒ์ž์˜ ์งˆ๋ฌธ\",\n \"grow.question1\": \"- ๋‹ค์Œ ๋ณด๋ฌผ์€ ๋ฌด์—‡์ผ๊นŒ?\",\n \"grow.question2\": \"- ์žŠํžŒ ๊ตฌ์„์€ ์—†์„๊นŒ?\",\n \"grow.question3\": \"- ์ง€๊ธˆ ๊ธธ์ด ์˜๊ด‘์œผ๋กœ ์ด์–ด์งˆ๊นŒ?\",\n \"grow.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"grow.files_modified\": \"({count}ํšŒ)\",\n \"grow.prey\": \"({count}๊ฑด)\",\n \"journey.title\": \"## ๐Ÿ“ฆ {project}์˜ ์—ฌ์ •\",\n \"journey.subtitle\": \"*๋ฏธ๋ฏน์ด ๋šœ๊ป‘์„ ์—ด์–ด ์˜ค๋ž˜๋œ ๋‘๋ฃจ๋งˆ๋ฆฌ๋ฅผ ํŽผ์นœ๋‹ค...*\",\n \"journey.sessions_survived\": \"**๋ˆ„์  ์„ธ์…˜**: {count}\",\n \"journey.first_encounter\": \"**์ฒซ ๋งŒ๋‚จ**: {date}\",\n \"journey.abilities_gained\": \"**์–ป์€ ๋Šฅ๋ ฅ**: {count}\",\n \"journey.treasures\": \"**๋‹ด๊ธด ๋ณด๋ฌผ**: {stack}\",\n \"journey.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† ์„ฑ๊ณผ\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ\",\n \"journey.powers\": \"### โœจ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"journey.scrolls\": \"### ๐Ÿ“œ ์ตœ๊ทผ ๊ธฐ๋ก\",\n \"suggest.commit\": \"๐Ÿ“ฆ *๋ƒ ๋ƒ * \\\"{pattern}\\\"์„ {count}+๋ฒˆ ์†Œํ™”ํ–ˆ์–ด. ์ง€๋ฆ„๊ธธ๋กœ ๋งŒ๋“ค๊นŒ?\",\n \"suggest.file\": \"๐Ÿ“ฆ *ํŒŒ์ผ์„ ์‘์‹œ* \\\"{pattern}\\\"์„ {count}๋ฒˆ ๊ฑด๋“œ๋ ธ๋„ค. ์ง€์ผœ๋ณผ๊นŒ?\",\n \"suggest.tool\": \"๐Ÿ“ฆ *์ด๋นจ ์ฐฐ์นต* \\\"{pattern}\\\" ์ •๋ง ์ž์ฃผ ์“ฐ๋„ค. ์ปค์Šคํ…€ ๋„๊ตฌ ์–ด๋•Œ?\",\n \"suggest.sequence\": \"๐Ÿ“ฆ *๋šœ๊ป‘ ๋‹ฌ๊ทธ๋ฝ* ์›€์ง์ž„์—์„œ ํŒจํ„ด์ด ๋ณด์—ฌ ({pattern})... ์ž๋™ํ™”ํ•ด์ค„๊นŒ?\",\n \"tool.init.description\": \"์ด ํ”„๋กœ์ ํŠธ์—์„œ Mimic ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊นจ์šฐ๊ธฐ\",\n \"tool.status.description\": \"ํ˜„์žฌ ์ƒํƒœ์™€ ์ตœ๊ทผ ํ™œ๋™ ํ™•์ธ\",\n \"tool.journey.description\": \"ํ”„๋กœ์ ํŠธ ์ง„ํ™” ์„œ์‚ฌ ๋ณด๊ธฐ\",\n \"tool.patterns.description\": \"๊ฐ์ง€๋œ ๋ชจ๋“  ํŒจํ„ด ๋ณด๊ธฐ\",\n \"tool.observe.description\": \"์—ฌ์ •์— ๊ด€์ฐฐ ๋‚ด์šฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€\",\n \"tool.observe.args.observation\": \"๊ธฐ๋กํ•  ๊ด€์ฐฐ ๋‚ด์šฉ\",\n \"tool.milestone.description\": \"ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก\",\n \"tool.milestone.args.milestone\": \"๊ธฐ๋กํ•  ๋งˆ์ผ์Šคํ†ค\",\n \"tool.stats.description\": \"Mimic ์ƒ์„ธ ํ†ต๊ณ„ ๋ณด๊ธฐ\",\n \"tool.configure.description\": \"Mimic ํ™˜๊ฒฝ์„ค์ • ๋ณ€๊ฒฝ\",\n \"tool.configure.args.learningEnabled\": \"ํŒจํ„ด ํ•™์Šต ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.suggestionEnabled\": \"์ œ์•ˆ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.minPatternCount\": \"์ œ์•ˆ ์ „ ์ตœ์†Œ ๋ฐœ์ƒ ํšŸ์ˆ˜\",\n \"tool.surface.description\": \"ํŒจํ„ด์„ surfaced(ํ™•์ธ๋จ)๋กœ ํ‘œ์‹œ\",\n \"tool.surface.args.patternId\": \"surfaced๋กœ ํ‘œ์‹œํ•  ํŒจํ„ด ID\",\n \"tool.reset.description\": \"ํ•™์Šต๋œ ํŒจํ„ด๊ณผ ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”\",\n \"tool.reset.args.confirm\": \"์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด true๋กœ ์„ค์ •\",\n \"tool.grow.description\": \"ํ”„๋กœ์ ํŠธ ๋ฐฉํ–ฅ๊ณผ ์„ฑ์žฅ ๊ธฐํšŒ ๋ถ„์„\",\n \"tool.evolve.description\": \"๊ฐ์ง€๋œ ํŒจํ„ด์œผ๋กœ ์ƒˆ ๋Šฅ๋ ฅ์„ ์ œ์•ˆ/์ƒ์„ฑ\",\n \"tool.evolve.args.accept\": \"๋Šฅ๋ ฅ์œผ๋กœ ์ง„ํ™”์‹œํ‚ฌ ํŒจํ„ด ID\",\n \"tool.level.description\": \"๊ฐœ์ธํ™”๋œ ์‘๋‹ต์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์ˆ˜์ค€ ์„ค์ •\",\n \"tool.level.args.level\": \"๊ธฐ์ˆ  ์ˆ˜์ค€\",\n \"tool.focus.description\": \"ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ํฌ์ปค์Šค/์šฐ์„ ์ˆœ์œ„ ์„ค์ •\",\n \"tool.focus.args.focus\": \"ํ˜„์žฌ ํฌ์ปค์Šค ์˜์—ญ\",\n \"tool.focus.args.stack\": \"์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ธฐ์ˆ  ์Šคํƒ\",\n \"tool.mcp_search.description\": \"mcpmarket.com์—์„œ MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰\",\n \"tool.mcp_search.args.query\": \"MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰์–ด\",\n \"tool.mcp.description\": \"opencode.json์— MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€\",\n \"tool.mcp.args.name\": \"MCP ์„œ๋ฒ„ ์ด๋ฆ„\",\n \"tool.mcp.args.url\": \"์›๊ฒฉ MCP ์„œ๋ฒ„ URL\",\n \"tool.mcp.args.command\": \"๋กœ์ปฌ MCP ๋ช…๋ น(์‰ผํ‘œ ๊ตฌ๋ถ„)\",\n \"tool.capabilities.description\": \"์ง„ํ™”ํ•œ ๋Šฅ๋ ฅ ๋ชฉ๋ก\"\n },\n};\n\nexport async function loadMimicConfig(): Promise<MimicUserConfig> {\n const configPath = join(homedir(), \".config\", \"opencode\", \"mimic.json\");\n if (!existsSync(configPath)) return {};\n\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n return parsed as MimicUserConfig;\n } catch {\n return {};\n }\n}\n\nexport function resolveLanguage(config?: MimicUserConfig | null): Language {\n if (config?.language === \"ko-KR\") return \"ko-KR\";\n return DEFAULT_LANGUAGE;\n}\n\nexport interface I18n {\n language: Language;\n t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, key) => {\n const value = vars[key];\n return value === undefined ? \"\" : String(value);\n });\n}\n\nexport function createI18n(language: Language): I18n {\n return {\n language,\n t: (key, vars) => {\n const dict = MESSAGES[language] ?? MESSAGES[DEFAULT_LANGUAGE];\n const fallback = MESSAGES[DEFAULT_LANGUAGE];\n const template = dict[key] ?? fallback[key] ?? key;\n return interpolate(template, vars);\n },\n };\n}\n\nexport function formatCapabilityType(i18n: I18n, type: string): string {\n return i18n.t(`evolution.type.${type}`);\n}\n\nexport function formatLevelLabel(i18n: I18n, level: string): string {\n return i18n.t(`level.label.${level}`);\n}\n\nexport function formatGreetingStyle(i18n: I18n, style: string): string {\n return i18n.t(`level.style.${style}`);\n}\n\nexport function formatDetailLevel(i18n: I18n, detail: string): string {\n return i18n.t(`level.detail.${detail}`);\n}\n\nexport function formatPatternType(i18n: I18n, type: string): string {\n return i18n.t(`patterns.type.${type}`);\n}\n","import { execSync } from \"node:child_process\";\n\nexport function getGitHistory(directory: string, limit = 50): string[] {\n try {\n const result = execSync(`git log --oneline -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getRecentlyModifiedFiles(directory: string): string[] {\n try {\n const result = execSync(\"git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only\", {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getCommitMessages(directory: string, limit = 20): string[] {\n try {\n const result = execSync(`git log --format=%s -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function detectCommitPatterns(messages: string[]): Map<string, number> {\n const patterns = new Map<string, number>();\n for (const msg of messages) {\n const normalized = msg.toLowerCase().replace(/\\s+/g, \" \").trim();\n patterns.set(normalized, (patterns.get(normalized) || 0) + 1);\n }\n return patterns;\n}\n","import type { MimicContext } from \"@/context\";\nimport { detectCommitPatterns, getCommitMessages } from \"@/git\";\nimport type { Pattern } from \"@/types\";\n\nexport async function detectPatterns(ctx: MimicContext): Promise<Pattern[]> {\n const state = await ctx.stateManager.read();\n const newPatterns: Pattern[] = [];\n\n const commitMessages = getCommitMessages(ctx.directory);\n const commitPatterns = detectCommitPatterns(commitMessages);\n for (const [msg, count] of commitPatterns) {\n if (count >= 3) {\n const existing = state.patterns.find((p) => p.type === \"commit\" && p.description === msg);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"commit\",\n description: msg,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n const fileStats = state.statistics.filesModified;\n for (const [file, count] of Object.entries(fileStats)) {\n if (count >= 5) {\n const existing = state.patterns.find((p) => p.type === \"file\" && p.description === file);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"file\",\n description: file,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n return newPatterns;\n}\n\nexport async function surfacePatterns(ctx: MimicContext): Promise<string[]> {\n const state = await ctx.stateManager.read();\n const suggestions: string[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n if (pattern.count < state.preferences.minPatternCount) continue;\n\n let suggestion = \"\";\n switch (pattern.type) {\n case \"commit\":\n suggestion = ctx.i18n.t(\"suggest.commit\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"file\":\n suggestion = ctx.i18n.t(\"suggest.file\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"tool\":\n suggestion = ctx.i18n.t(\"suggest.tool\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"sequence\":\n suggestion = ctx.i18n.t(\"suggest.sequence\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n }\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { State } from \"@/types\";\n\nexport const createDefaultState = (projectName: string): State => ({\n version: \"0.1.0\",\n project: {\n name: projectName,\n creatorLevel: null,\n firstSession: Date.now(),\n stack: [],\n focus: undefined,\n },\n journey: {\n observations: [],\n milestones: [],\n sessionCount: 0,\n lastSession: null,\n },\n patterns: [],\n evolution: {\n capabilities: [],\n lastEvolution: null,\n pendingSuggestions: [],\n },\n preferences: {\n suggestionEnabled: true,\n learningEnabled: true,\n minPatternCount: 3,\n },\n statistics: {\n totalSessions: 0,\n totalToolCalls: 0,\n filesModified: {},\n lastSessionId: null,\n },\n});\n\nexport class StateManager {\n private readonly mimicDir: string;\n private readonly statePath: string;\n private readonly sessionsDir: string;\n private readonly projectName: string;\n\n constructor(directory: string) {\n this.mimicDir = join(directory, \".opencode\", \"mimic\");\n this.statePath = join(this.mimicDir, \"state.json\");\n this.sessionsDir = join(this.mimicDir, \"sessions\");\n this.projectName = directory.split(\"/\").pop() || \"unknown\";\n }\n\n async initialize(): Promise<void> {\n if (!existsSync(this.mimicDir)) {\n await mkdir(this.mimicDir, { recursive: true });\n }\n if (!existsSync(this.sessionsDir)) {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n if (!existsSync(this.statePath)) {\n await this.save(createDefaultState(this.projectName));\n }\n }\n\n async read(): Promise<State> {\n return JSON.parse(await readFile(this.statePath, \"utf-8\"));\n }\n\n async save(state: State): Promise<void> {\n await writeFile(this.statePath, JSON.stringify(state, null, 2));\n }\n\n async addObservation(observation: string): Promise<void> {\n const state = await this.read();\n state.journey.observations.push({\n observation,\n timestamp: new Date().toISOString(),\n });\n if (state.journey.observations.length > 100) {\n state.journey.observations = state.journey.observations.slice(-100);\n }\n await this.save(state);\n }\n\n async addMilestone(milestone: string): Promise<void> {\n const state = await this.read();\n state.journey.milestones.push({\n milestone,\n timestamp: new Date().toISOString(),\n });\n await this.save(state);\n }\n\n async saveSession(sessionId: string, data: Record<string, unknown>): Promise<void> {\n await writeFile(join(this.sessionsDir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n }\n\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n getProjectName(): string {\n return this.projectName;\n }\n\n getStatePath(): string {\n return this.statePath;\n }\n}\n","import { readdir, writeFile } from \"node:fs/promises\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { evolveCapability, formatEvolutionResult, getEvolutionSuggestions } from \"@/evolution\";\nimport { analyzeTimeSinceLastSession, formatGrowAnalysis, formatJourney } from \"@/format\";\nimport { getGitHistory, getRecentlyModifiedFiles } from \"@/git\";\nimport {\n createI18n,\n formatCapabilityType,\n formatDetailLevel,\n formatGreetingStyle,\n formatLevelLabel,\n formatPatternType,\n type I18n,\n loadMimicConfig,\n resolveLanguage,\n} from \"@/i18n\";\nimport { getLevelConfig } from \"@/level\";\nimport { surfacePatterns } from \"@/patterns\";\nimport { createDefaultState, type StateManager } from \"@/state\";\nimport type { CreatorLevel, Pattern, ToolCall } from \"@/types\";\n\nexport function createTools(\n stateManager: StateManager,\n directory: string,\n toolCalls: ToolCall[],\n i18n?: I18n,\n): Record<string, ToolDefinition> {\n const baseI18n = i18n ?? createI18n(resolveLanguage(null));\n const i18nPromise = i18n\n ? Promise.resolve(i18n)\n : loadMimicConfig()\n .then((config) => createI18n(resolveLanguage(config)))\n .catch(() => createI18n(resolveLanguage(null)));\n\n return {\n \"mimic:init\": tool({\n description: baseI18n.t(\"tool.init.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const isFirstTime = state.journey.sessionCount <= 1;\n\n if (isFirstTime) {\n return i18n.t(\"init.first_time\", { project: state.project.name });\n }\n\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n const recentObs = state.journey.observations.slice(-3);\n\n let greeting = `${i18n.t(\"init.returning.header\")}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.welcome\", { project: state.project.name })}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.stats\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n })}\\n\\n`;\n\n if (timeSince === \"long-break\") {\n greeting += `${i18n.t(\"init.returning.long_break\")}\\n\\n`;\n }\n\n if (recentObs.length > 0) {\n greeting += `${i18n.t(\"init.returning.recent_obs_title\")}\\n`;\n for (const o of recentObs) {\n greeting += `- ${o.observation}\\n`;\n }\n }\n\n return greeting;\n },\n }),\n\n \"mimic:status\": tool({\n description: baseI18n.t(\"tool.status.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const recentFiles = getRecentlyModifiedFiles(directory);\n const gitHistory = getGitHistory(directory, 5);\n\n let output = `${i18n.t(\"status.title\", { project: state.project.name })}\\n\\n`;\n output += `${i18n.t(\"status.session\", { count: state.journey.sessionCount })}\\n`;\n output += `${i18n.t(\"status.patterns\", {\n total: state.patterns.length,\n surfaced: state.patterns.filter((p) => p.surfaced).length,\n })}\\n`;\n output += `${i18n.t(\"status.tool_calls\", { count: toolCalls.length })}\\n\\n`;\n\n if (recentFiles.length > 0) {\n output += `${i18n.t(\"status.recent_files\")}\\n`;\n for (const f of recentFiles.slice(0, 5)) {\n output += `- ${f}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${i18n.t(\"status.recent_commits\")}\\n`;\n for (const c of gitHistory) {\n output += `- ${c}\\n`;\n }\n }\n\n const suggestions = await surfacePatterns(ctx);\n if (suggestions.length > 0) {\n output += `\\n${i18n.t(\"status.suggestions\")}\\n`;\n for (const s of suggestions) {\n output += `- ${s}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:journey\": tool({\n description: baseI18n.t(\"tool.journey.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 10);\n return formatJourney(ctx, state, gitHistory);\n },\n }),\n\n \"mimic:patterns\": tool({\n description: baseI18n.t(\"tool.patterns.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.patterns.length === 0) {\n return i18n.t(\"patterns.none\");\n }\n\n let output = `${i18n.t(\"patterns.title\")}\\n\\n`;\n output += `${i18n.t(\"patterns.total\", { count: state.patterns.length })}\\n\\n`;\n\n const byType = new Map<string, Pattern[]>();\n for (const p of state.patterns) {\n const list = byType.get(p.type) || [];\n list.push(p);\n byType.set(p.type, list);\n }\n\n for (const [type, patterns] of byType) {\n output += `${i18n.t(\"patterns.section\", {\n type: formatPatternType(i18n, type),\n })}\\n`;\n for (const p of patterns.slice(0, 10)) {\n const status = p.surfaced ? \"โœ“\" : \"โ—‹\";\n output += `${status} **${p.description}** (${p.count}x)\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:observe\": tool({\n description: baseI18n.t(\"tool.observe.description\"),\n args: {\n observation: tool.schema.string().describe(baseI18n.t(\"tool.observe.args.observation\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addObservation(args.observation);\n return i18n.t(\"observe.recorded\", { observation: args.observation });\n },\n }),\n\n \"mimic:milestone\": tool({\n description: baseI18n.t(\"tool.milestone.description\"),\n args: {\n milestone: tool.schema.string().describe(baseI18n.t(\"tool.milestone.args.milestone\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addMilestone(args.milestone);\n return i18n.t(\"milestone.recorded\", { milestone: args.milestone });\n },\n }),\n\n \"mimic:stats\": tool({\n description: baseI18n.t(\"tool.stats.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sessionFiles = await readdir(stateManager.getSessionsDir()).catch(() => []);\n\n return `## ${i18n.t(\"stats.title\")}\n\n- **${i18n.t(\"stats.version\")}**: ${state.version}\n- **${i18n.t(\"stats.total_sessions\")}**: ${state.statistics.totalSessions}\n- **${i18n.t(\"stats.total_tool_calls\")}**: ${state.statistics.totalToolCalls}\n- **${i18n.t(\"stats.patterns_detected\")}**: ${state.patterns.length}\n- **${i18n.t(\"stats.milestones\")}**: ${state.journey.milestones.length}\n- **${i18n.t(\"stats.observations\")}**: ${state.journey.observations.length}\n- **${i18n.t(\"stats.session_records\")}**: ${sessionFiles.length}\n- **${i18n.t(\"stats.first_session\")}**: ${format(state.project.firstSession, \"yyyy-MM-dd HH:mm:ss\")}\n- **${i18n.t(\"stats.learning_enabled\")}**: ${state.preferences.learningEnabled}\n- **${i18n.t(\"stats.suggestions_enabled\")}**: ${state.preferences.suggestionEnabled}`;\n },\n }),\n\n \"mimic:configure\": tool({\n description: baseI18n.t(\"tool.configure.description\"),\n args: {\n learningEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.learningEnabled\")),\n suggestionEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.suggestionEnabled\")),\n minPatternCount: tool.schema\n .number()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.minPatternCount\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.learningEnabled !== undefined) {\n state.preferences.learningEnabled = args.learningEnabled;\n }\n if (args.suggestionEnabled !== undefined) {\n state.preferences.suggestionEnabled = args.suggestionEnabled;\n }\n if (args.minPatternCount !== undefined) {\n state.preferences.minPatternCount = args.minPatternCount;\n }\n\n await stateManager.save(state);\n return `${i18n.t(\"configure.updated\")}\\n${JSON.stringify(state.preferences, null, 2)}`;\n },\n }),\n\n \"mimic:surface\": tool({\n description: baseI18n.t(\"tool.surface.description\"),\n args: {\n patternId: tool.schema.string().describe(baseI18n.t(\"tool.surface.args.patternId\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const pattern = state.patterns.find((p) => p.id === args.patternId);\n if (!pattern) {\n return i18n.t(\"surface.not_found\", { id: args.patternId });\n }\n pattern.surfaced = true;\n await stateManager.save(state);\n return i18n.t(\"surface.marked\", { description: pattern.description });\n },\n }),\n\n \"mimic:reset\": tool({\n description: baseI18n.t(\"tool.reset.description\"),\n args: {\n confirm: tool.schema.boolean().describe(baseI18n.t(\"tool.reset.args.confirm\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n if (!args.confirm) {\n return i18n.t(\"reset.cancelled\");\n }\n\n await writeFile(\n stateManager.getStatePath(),\n JSON.stringify(createDefaultState(stateManager.getProjectName()), null, 2),\n );\n return i18n.t(\"reset.done\");\n },\n }),\n\n \"mimic:grow\": tool({\n description: baseI18n.t(\"tool.grow.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 20);\n const recentFiles = getRecentlyModifiedFiles(directory);\n return formatGrowAnalysis(ctx, state, gitHistory, recentFiles);\n },\n }),\n\n \"mimic:evolve\": tool({\n description: baseI18n.t(\"tool.evolve.description\"),\n args: {\n accept: tool.schema.string().optional().describe(baseI18n.t(\"tool.evolve.args.accept\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n if (args.accept) {\n const suggestions = await getEvolutionSuggestions(ctx);\n const suggestion = suggestions.find((s) => s.pattern.id === args.accept);\n if (!suggestion) {\n return i18n.t(\"evolve.no_pattern\", { id: args.accept });\n }\n const { capability, filePath } = await evolveCapability(ctx, suggestion);\n return `${i18n.t(\"evolve.absorbed_header\")}\\n\\n${formatEvolutionResult(\n ctx,\n capability,\n filePath,\n )}`;\n }\n\n const suggestions = await getEvolutionSuggestions(ctx);\n if (suggestions.length === 0) {\n return i18n.t(\"evolve.empty\");\n }\n\n let output = `${i18n.t(\"evolve.menu_title\")}\\n\\n`;\n output += `${i18n.t(\"evolve.menu_intro\")}\\n\\n`;\n\n for (const s of suggestions) {\n output += `### โœจ ${s.name}\\n`;\n output += `- **${i18n.t(\"evolve.menu_type\")}**: ${formatCapabilityType(i18n, s.type)}\\n`;\n output += `- **${i18n.t(\"evolve.menu_reason\")}**: ${s.reason}\\n`;\n output += `- **${i18n.t(\"evolve.menu_pattern_id\")}**: \\`${s.pattern.id}\\`\\n\\n`;\n }\n\n output += `\\n${i18n.t(\"evolve.menu_footer\")}`;\n return output;\n },\n }),\n\n \"mimic:level\": tool({\n description: baseI18n.t(\"tool.level.description\"),\n args: {\n level: tool.schema\n .enum([\"technical\", \"semi-technical\", \"non-technical\", \"chaotic\"])\n .describe(baseI18n.t(\"tool.level.args.level\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n state.project.creatorLevel = args.level as CreatorLevel;\n await stateManager.save(state);\n\n const config = getLevelConfig(args.level as CreatorLevel);\n return i18n.t(\"level.set\", {\n level: formatLevelLabel(i18n, args.level),\n style: formatGreetingStyle(i18n, config.greetingStyle),\n detail: formatDetailLevel(i18n, config.detailLevel),\n });\n },\n }),\n\n \"mimic:focus\": tool({\n description: baseI18n.t(\"tool.focus.description\"),\n args: {\n focus: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.focus\")),\n stack: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.stack\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.focus) {\n state.project.focus = args.focus;\n await stateManager.addObservation(i18n.t(\"obs.focus_changed\", { focus: args.focus }));\n }\n if (args.stack) {\n state.project.stack = args.stack.split(\",\").map((s) => s.trim());\n }\n\n await stateManager.save(state);\n\n let output = `${i18n.t(\"focus.updated\")}\\n`;\n if (state.project.focus)\n output += `- **${i18n.t(\"focus.focus_label\")}**: ${state.project.focus}\\n`;\n if (state.project.stack?.length)\n output += `- **${i18n.t(\"focus.stack_label\")}**: ${state.project.stack.join(\", \")}\\n`;\n return output;\n },\n }),\n\n \"mimic:mcp-search\": tool({\n description: baseI18n.t(\"tool.mcp_search.description\"),\n args: {\n query: tool.schema.string().describe(baseI18n.t(\"tool.mcp_search.args.query\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const searchUrl = `https://mcpmarket.com/search?q=${encodeURIComponent(args.query)}`;\n const popular = [\n {\n name: \"context7\",\n desc: i18n.t(\"mcp_search.desc.context7\"),\n url: \"https://mcp.context7.com/mcp\",\n },\n {\n name: \"github\",\n desc: i18n.t(\"mcp_search.desc.github\"),\n url: \"https://mcp.github.com\",\n },\n {\n name: \"supabase\",\n desc: i18n.t(\"mcp_search.desc.supabase\"),\n url: \"https://mcp.supabase.com\",\n },\n { name: \"playwright\", desc: i18n.t(\"mcp_search.desc.playwright\") },\n { name: \"firecrawl\", desc: i18n.t(\"mcp_search.desc.firecrawl\") },\n ];\n const popularLines = popular\n .map((server) =>\n server.url\n ? `- **${server.name}** - ${server.desc}: \\`${server.url}\\``\n : `- **${server.name}** - ${server.desc}`,\n )\n .join(\"\\n\");\n return `${i18n.t(\"mcp_search.header\", {\n query: args.query,\n url: searchUrl,\n })}\\n\\n${i18n.t(\"mcp_search.popular\")}\\n${popularLines}\\n\\n${i18n.t(\"mcp_search.add\")}`;\n },\n }),\n\n \"mimic:mcp\": tool({\n description: baseI18n.t(\"tool.mcp.description\"),\n args: {\n name: tool.schema.string().describe(baseI18n.t(\"tool.mcp.args.name\")),\n url: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.url\")),\n command: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.command\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const { existsSync } = await import(\"node:fs\");\n const { readFile, writeFile: fsWriteFile, mkdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n const opencodeDir = join(directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(directory, \"opencode.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(await readFile(configPath, \"utf-8\"));\n } catch {\n config = {};\n }\n }\n\n const mcpEntry: Record<string, unknown> = {};\n if (args.url) {\n mcpEntry.type = \"remote\";\n mcpEntry.url = args.url;\n } else if (args.command) {\n mcpEntry.type = \"local\";\n mcpEntry.command = args.command.split(\",\").map((s) => s.trim());\n } else {\n return i18n.t(\"mcp.need_url_or_command\");\n }\n mcpEntry.enabled = true;\n\n config.mcp = { ...((config.mcp as Record<string, unknown>) || {}), [args.name]: mcpEntry };\n await fsWriteFile(configPath, JSON.stringify(config, null, 2));\n\n await stateManager.addMilestone(i18n.t(\"milestone.mcp_added\", { name: args.name }));\n\n return i18n.t(\"mcp.added\", { name: args.name });\n },\n }),\n\n \"mimic:capabilities\": tool({\n description: baseI18n.t(\"tool.capabilities.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.evolution.capabilities.length === 0) {\n return i18n.t(\"capabilities.empty\");\n }\n\n let output = `${i18n.t(\"capabilities.title\")}\\n\\n`;\n output += `${i18n.t(\"capabilities.intro\")}\\n\\n`;\n for (const cap of state.evolution.capabilities) {\n output += `### โœจ ${cap.name}\\n`;\n output += `- **${i18n.t(\"capabilities.type\")}**: ${formatCapabilityType(\n i18n,\n cap.type,\n )}\\n`;\n output += `- **${i18n.t(\"capabilities.description\")}**: ${cap.description}\\n`;\n output += `- **${i18n.t(\"capabilities.consumed\")}**: ${format(\n new Date(cap.createdAt),\n \"yyyy-MM-dd\",\n )}\\n\\n`;\n }\n return output;\n },\n }),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { StateManager } from \"@/state\";\nimport type { CapabilityType, EvolvedCapability, Pattern } from \"@/types\";\n\ninterface EvolutionSuggestion {\n type: CapabilityType;\n name: string;\n description: string;\n reason: string;\n pattern: Pattern;\n}\n\nfunction generateToolCode(name: string, description: string, pattern: Pattern): string {\n const funcName = name.replace(/-/g, \"_\");\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${funcName} = (plugin) => ({\n tool: {\n \"${name}\": {\n description: \"${description}\",\n args: {},\n async execute() {\n // TODO: Implement your logic here\n // This was generated from pattern: ${pattern.description}\n return \"๐Ÿ“ฆ ${name} executed!\";\n },\n },\n },\n});\n\nexport default ${funcName};\n`;\n}\n\nfunction generateHookCode(name: string, _description: string, pattern: Pattern): string {\n const filename = pattern.description;\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n if (event.type === \"file.edited\") {\n const filename = event.properties?.filename;\n if (filename?.includes(\"${filename}\")) {\n console.log(\"๐Ÿ“ฆ [Mimic] Detected change in watched file: ${filename}\");\n // TODO: Add your custom logic here\n }\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateSkillCode(name: string, description: string, pattern: Pattern): string {\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n // Auto-triggered skill: ${description}\n if (event.type === \"session.created\") {\n console.log(\"๐Ÿ“ฆ [Mimic] Skill ${name} activated\");\n // TODO: Implement automated behavior\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateMcpConfig(name: string, _description: string, pattern: Pattern): object {\n return {\n [name]: {\n type: \"local\",\n command: [\"echo\", `MCP server for ${pattern.description}`],\n enabled: false,\n },\n };\n}\n\nfunction generateAgentMarkdown(name: string, description: string, pattern: Pattern): string {\n return `---\ndescription: ${description}\nmode: subagent\ntools:\n read: true\n glob: true\n grep: true\n bash: false\n edit: false\n---\n\n# ๐Ÿ“ฆ ${name}\n\nAuto-generated by Mimic from pattern: ${pattern.description} (${pattern.count}x)\n\n## Focus Area\n\nThis agent specializes in tasks related to: ${pattern.description}\n\n## Context\n\n- Pattern detected: ${pattern.type}\n- Usage count: ${pattern.count}\n- First seen: ${new Date(pattern.firstSeen).toISOString()}\n\n## How To Help\n\nAnalyze and assist with tasks matching this pattern.\nProvide focused, expert guidance in this specific area.\n\n## Remember\n\n- Stay focused on the pattern's domain\n- Leverage the observed usage patterns\n- Adapt to the user's workflow\n`;\n}\n\ntype EvolutionOutput = { filePath: string; content: string };\n\nasync function readOpencodeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(configPath)) return {};\n\n try {\n const parsed = JSON.parse(await readFile(configPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nasync function buildMcpEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const opencodeDir = join(ctx.directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(ctx.directory, \"opencode.json\");\n const config = await readOpencodeConfig(configPath);\n const mcpConfig = generateMcpConfig(\n suggestion.name,\n suggestion.description,\n suggestion.pattern,\n );\n\n const mcp = { ...((config.mcp as Record<string, unknown>) || {}), ...mcpConfig };\n const content = JSON.stringify({ ...config, mcp }, null, 2);\n\n return { filePath: configPath, content };\n}\n\nasync function buildAgentEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const agentsDir = join(ctx.directory, \".opencode\", \"agents\");\n if (!existsSync(agentsDir)) {\n await mkdir(agentsDir, { recursive: true });\n }\n\n return {\n content: generateAgentMarkdown(suggestion.name, suggestion.description, suggestion.pattern),\n filePath: join(agentsDir, `${suggestion.name}.md`),\n };\n}\n\nfunction buildPluginContent(suggestion: EvolutionSuggestion): string {\n switch (suggestion.type) {\n case \"command\":\n case \"shortcut\":\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"hook\":\n return generateHookCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"skill\":\n return generateSkillCode(suggestion.name, suggestion.description, suggestion.pattern);\n default:\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n }\n}\n\nasync function buildPluginEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const pluginsDir = join(ctx.directory, \".opencode\", \"plugins\");\n if (!existsSync(pluginsDir)) {\n await mkdir(pluginsDir, { recursive: true });\n }\n\n return {\n content: buildPluginContent(suggestion),\n filePath: join(pluginsDir, `${suggestion.name}.js`),\n };\n}\n\nasync function buildEvolutionOutput(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n if (suggestion.type === \"mcp\") {\n return buildMcpEvolution(ctx, suggestion);\n }\n\n if (suggestion.type === \"agent\") {\n return buildAgentEvolution(ctx, suggestion);\n }\n\n return buildPluginEvolution(ctx, suggestion);\n}\n\nfunction createCapabilityFromSuggestion(suggestion: EvolutionSuggestion): EvolvedCapability {\n return {\n id: crypto.randomUUID(),\n type: suggestion.type,\n name: suggestion.name,\n description: suggestion.description,\n createdAt: new Date().toISOString(),\n fromPattern: suggestion.pattern.id,\n };\n}\n\nfunction updateEvolutionState(\n state: Awaited<ReturnType<StateManager[\"read\"]>>,\n capability: EvolvedCapability,\n suggestion: EvolutionSuggestion,\n): void {\n state.evolution.capabilities.push(capability);\n state.evolution.lastEvolution = new Date().toISOString();\n\n const pattern = state.patterns.find((p) => p.id === suggestion.pattern.id);\n if (pattern) {\n pattern.surfaced = true;\n }\n}\n\nexport function suggestEvolution(pattern: Pattern, ctx: MimicContext): EvolutionSuggestion | null {\n switch (pattern.type) {\n case \"tool\":\n if (pattern.count >= 10) {\n return {\n type: \"shortcut\",\n name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`,\n description: ctx.i18n.t(\"evolution.suggest.tool.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.tool.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"file\":\n if (pattern.count >= 5) {\n return {\n type: \"hook\",\n name: `watch-${pattern.description.split(\"/\").pop()?.replace(/\\./g, \"-\") || \"file\"}`,\n description: ctx.i18n.t(\"evolution.suggest.file.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.file.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"commit\":\n if (pattern.count >= 3) {\n return {\n type: \"command\",\n name: `commit-${pattern.description.slice(0, 20).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.commit.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.commit.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"sequence\":\n if (pattern.count >= 5) {\n return {\n type: \"agent\",\n name: `${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}-specialist`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.agent.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.agent.reason\", { count: pattern.count }),\n pattern,\n };\n }\n if (pattern.count >= 3) {\n return {\n type: \"skill\",\n name: `auto-${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.skill.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.skill.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n }\n\n return null;\n}\n\nexport async function getEvolutionSuggestions(\n ctx: MimicContext,\n): Promise<EvolutionSuggestion[]> {\n const state = await ctx.stateManager.read();\n const suggestions: EvolutionSuggestion[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n\n const suggestion = suggestEvolution(pattern, ctx);\n if (suggestion) {\n suggestions.push(suggestion);\n }\n }\n\n return suggestions;\n}\n\nexport async function evolveCapability(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<{ capability: EvolvedCapability; filePath: string }> {\n const state = await ctx.stateManager.read();\n const { filePath, content } = await buildEvolutionOutput(ctx, suggestion);\n await writeFile(filePath, content, \"utf-8\");\n\n const capability = createCapabilityFromSuggestion(suggestion);\n updateEvolutionState(state, capability, suggestion);\n\n await ctx.stateManager.save(state);\n await ctx.stateManager.addMilestone(\n ctx.i18n.t(\"milestone.evolved\", {\n name: capability.name,\n type: formatCapabilityType(ctx.i18n, capability.type),\n }),\n );\n\n return { capability, filePath };\n}\n\nexport function formatEvolutionResult(\n ctx: MimicContext,\n capability: EvolvedCapability,\n filePath: string,\n): string {\n const typeLabel = formatCapabilityType(ctx.i18n, capability.type);\n let result = `### โœจ ${capability.name}\\n\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.type\")}**: ${typeLabel}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.description\")}**: ${capability.description}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.file\")}**: \\`${filePath}\\`\\n\\n`;\n result += `*${ctx.i18n.t(\"evolution.result.restart\", { type: typeLabel })}*\\n\\n`;\n\n switch (capability.type) {\n case \"command\":\n case \"shortcut\":\n result += `${ctx.i18n.t(\"evolution.result.command\", { name: capability.name })}\\n`;\n break;\n\n case \"hook\":\n result += `${ctx.i18n.t(\"evolution.result.hook\")}\\n`;\n break;\n\n case \"skill\":\n result += `${ctx.i18n.t(\"evolution.result.skill\")}\\n`;\n break;\n\n case \"agent\":\n result += `${ctx.i18n.t(\"evolution.result.agent\", { name: capability.name })}\\n`;\n break;\n\n case \"mcp\":\n result += `${ctx.i18n.t(\"evolution.result.mcp\", { name: capability.name })}\\n`;\n break;\n }\n\n return result;\n}\n","import type { I18n } from \"@/i18n\";\nimport type { CreatorLevel, State } from \"@/types\";\n\ninterface LevelConfig {\n greetingStyle: \"formal\" | \"casual\" | \"minimal\" | \"chaotic\";\n detailLevel: \"high\" | \"medium\" | \"low\";\n useEmoji: boolean;\n technicalTerms: boolean;\n}\n\nconst LEVEL_CONFIGS: Record<CreatorLevel, LevelConfig> = {\n technical: {\n greetingStyle: \"minimal\",\n detailLevel: \"high\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"semi-technical\": {\n greetingStyle: \"casual\",\n detailLevel: \"medium\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"non-technical\": {\n greetingStyle: \"formal\",\n detailLevel: \"low\",\n useEmoji: true,\n technicalTerms: false,\n },\n chaotic: {\n greetingStyle: \"chaotic\",\n detailLevel: \"medium\",\n useEmoji: true,\n technicalTerms: true,\n },\n};\n\nexport function getLevelConfig(level: CreatorLevel | null): LevelConfig {\n return LEVEL_CONFIGS[level ?? \"technical\"];\n}\n\nexport function adaptMessage(message: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (config.greetingStyle === \"minimal\") {\n return message.replace(/^#+\\s*/gm, \"\").trim();\n }\n\n if (config.greetingStyle === \"chaotic\") {\n const chaosEmojis = [\"๐Ÿ”ฅ\", \"โšก\", \"๐Ÿš€\", \"๐Ÿ’ฅ\", \"โœจ\"];\n const emoji = chaosEmojis[Math.floor(Math.random() * chaosEmojis.length)];\n return `${emoji} ${message}`;\n }\n\n return message;\n}\n\nexport function formatGreeting(i18n: I18n, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n const name = state.project.name;\n\n switch (config.greetingStyle) {\n case \"minimal\":\n return i18n.t(\"level.greeting.minimal\", {\n project: name,\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n });\n case \"casual\":\n return i18n.t(\"level.greeting.casual\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"formal\":\n return i18n.t(\"level.greeting.formal\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"chaotic\": {\n const greetings = [\n i18n.t(\"level.greeting.chaotic.chomp\"),\n i18n.t(\"level.greeting.chaotic.lid_creaks\"),\n i18n.t(\"level.greeting.chaotic.teeth_gleam\"),\n i18n.t(\"level.greeting.chaotic.tongue_flicks\"),\n ];\n const g = greetings[Math.floor(Math.random() * greetings.length)];\n return i18n.t(\"level.greeting.chaotic.template\", {\n tag: g,\n project: name,\n sessions: state.journey.sessionCount,\n });\n }\n }\n}\n\nexport function formatSuggestion(i18n: I18n, suggestion: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (!config.technicalTerms) {\n const replacements: Array<[string, string]> = [\n [i18n.t(\"level.term.tool\"), i18n.t(\"level.term.shortcut\")],\n [i18n.t(\"level.term.pattern\"), i18n.t(\"level.term.habit\")],\n [i18n.t(\"level.term.hook\"), i18n.t(\"level.term.automation\")],\n ];\n let result = suggestion;\n for (const [from, to] of replacements) {\n if (!from || from === to) continue;\n const escaped = from.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(escaped, \"gi\"), to);\n }\n return result;\n }\n\n return suggestion;\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport type { Event } from \"@opencode-ai/sdk\";\nimport type { MimicContext } from \"@/context\";\nimport { analyzeTimeSinceLastSession, formatDuration } from \"@/format\";\nimport { createI18n, loadMimicConfig, resolveLanguage } from \"@/i18n\";\nimport { detectPatterns, surfacePatterns } from \"@/patterns\";\nimport { StateManager } from \"@/state\";\nimport { createTools } from \"@/tools\";\nimport type { ToolCall } from \"@/types\";\n\nexport const mimic: Plugin = async ({ directory, client }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const ctx: MimicContext = { stateManager, directory, i18n, client };\n\n const sessionId = crypto.randomUUID();\n const sessionStartTime = Date.now();\n const toolCalls: ToolCall[] = [];\n const filesEdited: Set<string> = new Set();\n\n const handleSessionCreated = async () => {\n const state = await stateManager.read();\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n\n state.statistics.totalSessions += 1;\n state.statistics.lastSessionId = sessionId;\n state.journey.sessionCount += 1;\n state.journey.lastSession = new Date().toISOString();\n\n await stateManager.save(state);\n\n if (timeSince === \"long-break\") {\n await stateManager.addObservation(i18n.t(\"obs.returned_after_long_break\"));\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n }),\n variant: \"info\",\n },\n });\n };\n\n const handleSessionIdle = async () => {\n const newPatterns = await detectPatterns(ctx);\n if (newPatterns.length > 0) {\n const state = await stateManager.read();\n state.patterns.push(...newPatterns);\n await stateManager.save(state);\n }\n\n const suggestions = await surfacePatterns(ctx);\n for (const suggestion of suggestions) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: suggestion,\n variant: \"info\",\n },\n });\n }\n };\n\n const handleFileEdited = async (event: Event) => {\n if (!(\"properties\" in event)) return;\n\n const filename = (event.properties as { filename?: string })?.filename;\n if (!filename) return;\n\n filesEdited.add(filename);\n const state = await stateManager.read();\n state.statistics.filesModified[filename] = (state.statistics.filesModified[filename] || 0) + 1;\n await stateManager.save(state);\n };\n\n return {\n async event({ event }: { event: Event }) {\n switch (event.type) {\n case \"session.created\":\n await handleSessionCreated();\n return;\n case \"session.idle\":\n await handleSessionIdle();\n return;\n case \"file.edited\":\n await handleFileEdited(event);\n }\n },\n\n async \"tool.execute.after\"(\n input: { tool: string; sessionID: string; callID: string },\n _output: { title: string; output: string; metadata: unknown },\n ) {\n const state = await stateManager.read();\n if (!state.preferences.learningEnabled) return;\n\n const toolCall: ToolCall = {\n tool: input.tool,\n callID: input.callID,\n timestamp: Date.now(),\n };\n\n toolCalls.push(toolCall);\n state.statistics.totalToolCalls += 1;\n\n const toolPattern = input.tool;\n const existing = state.patterns.find(\n (p) => p.type === \"tool\" && p.description === toolPattern,\n );\n if (existing) {\n existing.count += 1;\n existing.lastSeen = Date.now();\n } else {\n state.patterns.push({\n id: crypto.randomUUID(),\n type: \"tool\",\n description: toolPattern,\n count: 1,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [toolCall],\n });\n }\n\n await stateManager.save(state);\n },\n\n async stop() {\n const sessionDuration = Date.now() - sessionStartTime;\n\n const sessionData = {\n sessionId,\n startTime: new Date(sessionStartTime).toISOString(),\n endTime: new Date().toISOString(),\n durationMs: sessionDuration,\n toolCalls: toolCalls.length,\n filesEdited: Array.from(filesEdited),\n };\n\n await stateManager.saveSession(sessionId, sessionData);\n\n if (toolCalls.length > 20) {\n await stateManager.addObservation(\n i18n.t(\"obs.intensive_session\", { tools: toolCalls.length }),\n );\n }\n if (filesEdited.size > 10) {\n await stateManager.addMilestone(\n i18n.t(\"milestone.major_refactor\", { files: filesEdited.size }),\n );\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\n }),\n variant: \"info\",\n },\n });\n },\n\n tool: createTools(stateManager, directory, toolCalls, i18n),\n };\n};\n\nexport default mimic;\n"],"mappings":";AAAA,SAAS,mBAAmB,QAAQ,2BAA2B;AAC/D,SAAS,MAAM,UAAU;;;ACDzB,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,YAAY;AAQrB,IAAM,mBAA6B;AAEnC,IAAM,WAAqD;AAAA,EACzD,SAAS;AAAA,IACP,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IAEvB,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,6BAA6B;AAAA,IAC7B,mCAAmC;AAAA,IAEnC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IAEtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAE1B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IAEtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAE7B,qBAAqB;AAAA,IAErB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAElB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IAEd,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,sBAAsB;AAAA,IAEtB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IAEtB,yBAAyB;AAAA,IACzB,gCAAgC;AAAA,IAChC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IAExB,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,wCAAwC;AAAA,IACxC,mCAAmC;AAAA,IACnC,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAC3C,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAE3C,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gCAAgC;AAAA,IAChC,qCAAqC;AAAA,IACrC,sCAAsC;AAAA,IACtC,wCAAwC;AAAA,IACxC,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IAEzB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IAErB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAE7B,2BAA2B;AAAA,IAC3B,aAAa;AAAA,IAEb,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IAEzB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IAEb,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IAEnB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,6BAA6B;AAAA,IAC7B,4BAA4B;AAAA,IAC5B,iCAAiC;AAAA,IACjC,8BAA8B;AAAA,IAC9B,iCAAiC;AAAA,IACjC,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,yCAAyC;AAAA,IACzC,uCAAuC;AAAA,IACvC,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,EACnC;AAAA,EACA,SAAS;AAAA,IACP,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,6BAA6B;AAAA,IAC7B,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAC7B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,gCAAgC;AAAA,IAChC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,wCAAwC;AAAA,IACxC,mCAAmC;AAAA,IACnC,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAC3C,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAC3C,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gCAAgC;AAAA,IAChC,qCAAqC;AAAA,IACrC,sCAAsC;AAAA,IACtC,wCAAwC;AAAA,IACxC,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IACzB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,6BAA6B;AAAA,IAC7B,4BAA4B;AAAA,IAC5B,iCAAiC;AAAA,IACjC,8BAA8B;AAAA,IAC9B,iCAAiC;AAAA,IACjC,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,yCAAyC;AAAA,IACzC,uCAAuC;AAAA,IACvC,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,EACnC;AACF;AAEA,eAAsB,kBAA4C;AAChE,QAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,YAAY,YAAY;AACtE,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO,CAAC;AAErC,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,YAAY,OAAO;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AAC5E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,gBAAgB,QAA2C;AACzE,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,SAAO;AACT;AAOA,SAAS,YAAY,UAAkB,MAAgD;AACrF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,QAAQ,cAAc,CAAC,QAAQ,QAAQ;AACrD,UAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,UAAU,SAAY,KAAK,OAAO,KAAK;AAAA,EAChD,CAAC;AACH;AAEO,SAAS,WAAW,UAA0B;AACnD,SAAO;AAAA,IACL;AAAA,IACA,GAAG,CAAC,KAAK,SAAS;AAChB,YAAM,OAAO,SAAS,QAAQ,KAAK,SAAS,gBAAgB;AAC5D,YAAM,WAAW,SAAS,gBAAgB;AAC1C,YAAM,WAAW,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK;AAC/C,aAAO,YAAY,UAAU,IAAI;AAAA,IACnC;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,MAAY,MAAsB;AACrE,SAAO,KAAK,EAAE,kBAAkB,IAAI,EAAE;AACxC;AAEO,SAAS,iBAAiB,MAAY,OAAuB;AAClE,SAAO,KAAK,EAAE,eAAe,KAAK,EAAE;AACtC;AAEO,SAAS,oBAAoB,MAAY,OAAuB;AACrE,SAAO,KAAK,EAAE,eAAe,KAAK,EAAE;AACtC;AAEO,SAAS,kBAAkB,MAAY,QAAwB;AACpE,SAAO,KAAK,EAAE,gBAAgB,MAAM,EAAE;AACxC;AAEO,SAAS,kBAAkB,MAAY,MAAsB;AAClE,SAAO,KAAK,EAAE,iBAAiB,IAAI,EAAE;AACvC;;;AD1cO,SAAS,4BAA4B,aAA2C;AACrF,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,kBAAkB,oBAAI,KAAK,GAAG,IAAI,KAAK,WAAW,CAAC;AACjE,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,IAAK,QAAO;AACxB,SAAO;AACT;AAEO,SAAS,cACd,KACA,OACA,YACQ;AACR,QAAM,aAAa,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrD,QAAM,eAAe,MAAM,QAAQ,aAAa,MAAM,EAAE;AACxD,QAAM,SAAS,IAAI,KAAK,aAAa,UAAU,KAAK;AAEpD,MAAI,SAAS,GAAG,IAAI,KAAK,EAAE,iBAAiB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AAC5E,YAAU,GAAG,IAAI,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAC3C,YAAU,GAAG,IAAI,KAAK,EAAE,6BAA6B;AAAA,IACnD,OAAO,MAAM,QAAQ;AAAA,EACvB,CAAC,CAAC;AAAA;AACF,YAAU,GAAG,IAAI,KAAK,EAAE,2BAA2B;AAAA,IACjD,MAAM,OAAO,MAAM,QAAQ,cAAc,YAAY;AAAA,EACvD,CAAC,CAAC;AAAA;AACF,YAAU,GAAG,IAAI,KAAK,EAAE,4BAA4B;AAAA,IAClD,OAAO,MAAM,UAAU,aAAa;AAAA,EACtC,CAAC,CAAC;AAAA;AAAA;AAEF,MAAI,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,SAAS,GAAG;AACzD,cAAU,GAAG,IAAI,KAAK,EAAE,qBAAqB;AAAA,MAC3C,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,IACtC,CAAC,CAAC;AAAA;AAAA,EACJ;AACA,MAAI,MAAM,QAAQ,OAAO;AACvB,cAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EACjF;AACA,YAAU;AAEV,MAAI,WAAW,SAAS,GAAG;AACzB,cAAU,GAAG,IAAI,KAAK,EAAE,mBAAmB,CAAC;AAAA;AAC5C,eAAW,KAAK,YAAY;AAC1B,YAAM,UAAU,oBAAoB,IAAI,KAAK,EAAE,SAAS,GAAG,EAAE,WAAW,MAAM,OAAO,CAAC;AACtF,gBAAU,KAAK,EAAE,SAAS,KAAK,OAAO;AAAA;AAAA,IACxC;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,cAAU,GAAG,IAAI,KAAK,EAAE,mBAAmB,CAAC;AAAA;AAC5C,eAAW,KAAK,cAAc;AAC5B,gBAAU,KAAK,EAAE,WAAW;AAAA;AAAA,IAC9B;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,MAAM,UAAU,aAAa,SAAS,GAAG;AAC3C,cAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,eAAW,OAAO,MAAM,UAAU,aAAa,MAAM,EAAE,GAAG;AACxD,gBAAU,OAAO,IAAI,IAAI,OAAO;AAAA,QAC9B,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC,MAAM,IAAI,WAAW;AAAA;AAAA,IACxB;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,cAAU,GAAG,IAAI,KAAK,EAAE,iBAAiB,CAAC;AAAA;AAC1C,eAAW,UAAU,WAAW,MAAM,GAAG,CAAC,GAAG;AAC3C,gBAAU,KAAK,MAAM;AAAA;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,QAAM,UAAU,KAAK,MAAM,KAAK,MAAO,EAAE;AACzC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,mBAAmB,UAAU;AACnC,SAAO,GAAG,KAAK,KAAK,gBAAgB;AACtC;AAEO,SAAS,mBACd,KACA,OACA,aACA,aACQ;AACR,MAAI,SAAS,GAAG,IAAI,KAAK,EAAE,cAAc,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AACzE,YAAU,GAAG,IAAI,KAAK,EAAE,eAAe,CAAC;AAAA;AAAA;AAExC,QAAM,gBAAgB,OAAO,QAAQ,MAAM,WAAW,aAAa,EAChE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,MAAM,GAAG,EAAE;AAEd,MAAI,cAAc,SAAS,GAAG;AAC5B,cAAU,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAC/C,eAAW,CAAC,MAAM,KAAK,KAAK,eAAe;AACzC,gBAAU,OAAO,IAAI,MAAM,IAAI,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAAA;AAAA,IACzE;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,eAAe,MAAM,SACxB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,MAAI,aAAa,SAAS,GAAG;AAC3B,cAAU,GAAG,IAAI,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAC7C,eAAW,KAAK,aAAa,MAAM,GAAG,CAAC,GAAG;AACxC,gBAAU,KAAK,EAAE,WAAW,KAAK,EAAE,KAAK;AAAA;AAAA,IAC1C;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,WAAW,oBAAI,IAAoB;AACzC,eAAW,QAAQ,aAAa;AAC9B,YAAM,MAAM,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK;AACtD,eAAS,IAAI,MAAM,SAAS,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAChD;AACA,UAAM,aAAa,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAErE,cAAU,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAC/C,eAAW,CAAC,KAAK,KAAK,KAAK,WAAW,MAAM,GAAG,CAAC,GAAG;AACjD,gBAAU,OAAO,GAAG,OAAO,IAAI,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAAA;AAAA,IAC/D;AACA,cAAU;AAAA,EACZ;AAEA,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AAEzC,MAAI,MAAM,QAAQ,OAAO;AACvB,cAAU;AAAA,EAAK,IAAI,KAAK,EAAE,qBAAqB,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EAChF;AAEA,SAAO;AACT;;;AE9JA,SAAS,gBAAgB;AAElB,SAAS,cAAc,WAAmB,QAAQ,IAAc;AACrE,MAAI;AACF,UAAM,SAAS,SAAS,wBAAwB,KAAK,IAAI;AAAA,MACvD,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,yBAAyB,WAA6B;AACpE,MAAI;AACF,UAAM,SAAS,SAAS,yEAAyE;AAAA,MAC/F,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAkB,WAAmB,QAAQ,IAAc;AACzE,MAAI;AACF,UAAM,SAAS,SAAS,0BAA0B,KAAK,IAAI;AAAA,MACzD,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,qBAAqB,UAAyC;AAC5E,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,OAAO,UAAU;AAC1B,UAAM,aAAa,IAAI,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/D,aAAS,IAAI,aAAa,SAAS,IAAI,UAAU,KAAK,KAAK,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;;;AC5CA,eAAsB,eAAe,KAAuC;AAC1E,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAyB,CAAC;AAEhC,QAAM,iBAAiB,kBAAkB,IAAI,SAAS;AACtD,QAAM,iBAAiB,qBAAqB,cAAc;AAC1D,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,QAAI,SAAS,GAAG;AACd,YAAM,WAAW,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,gBAAgB,GAAG;AACxF,UAAI,CAAC,UAAU;AACb,oBAAY,KAAK;AAAA,UACf,IAAI,OAAO,WAAW;AAAA,UACtB,MAAM;AAAA,UACN,aAAa;AAAA,UACb;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,WAAW;AACnC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,SAAS,GAAG;AACd,YAAM,WAAW,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,gBAAgB,IAAI;AACvF,UAAI,CAAC,UAAU;AACb,oBAAY,KAAK;AAAA,UACf,IAAI,OAAO,WAAW;AAAA,UACtB,MAAM;AAAA,UACN,aAAa;AAAA,UACb;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,gBAAgB,KAAsC;AAC1E,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAwB,CAAC;AAE/B,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,QAAQ,SAAU;AACtB,QAAI,QAAQ,QAAQ,MAAM,YAAY,gBAAiB;AAEvD,QAAI,aAAa;AACjB,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,kBAAkB;AAAA,UACxC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,gBAAgB;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,gBAAgB;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,oBAAoB;AAAA,UAC1C,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,IACJ;AACA,gBAAY,KAAK,UAAU;AAAA,EAC7B;AAEA,SAAO;AACT;;;ACzFA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,OAAO,YAAAC,WAAU,iBAAiB;AAC3C,SAAS,QAAAC,aAAY;AAGd,IAAM,qBAAqB,CAAC,iBAAgC;AAAA,EACjE,SAAS;AAAA,EACT,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc,KAAK,IAAI;AAAA,IACvB,OAAO,CAAC;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,UAAU,CAAC;AAAA,EACX,WAAW;AAAA,IACT,cAAc,CAAC;AAAA,IACf,eAAe;AAAA,IACf,oBAAoB,CAAC;AAAA,EACvB;AAAA,EACA,aAAa;AAAA,IACX,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,eAAe;AAAA,EACjB;AACF;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,WAAmB;AAC7B,SAAK,WAAWA,MAAK,WAAW,aAAa,OAAO;AACpD,SAAK,YAAYA,MAAK,KAAK,UAAU,YAAY;AACjD,SAAK,cAAcA,MAAK,KAAK,UAAU,UAAU;AACjD,SAAK,cAAc,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,CAACF,YAAW,KAAK,QAAQ,GAAG;AAC9B,YAAM,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD;AACA,QAAI,CAACA,YAAW,KAAK,WAAW,GAAG;AACjC,YAAM,MAAM,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,IACnD;AACA,QAAI,CAACA,YAAW,KAAK,SAAS,GAAG;AAC/B,YAAM,KAAK,KAAK,mBAAmB,KAAK,WAAW,CAAC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,OAAuB;AAC3B,WAAO,KAAK,MAAM,MAAMC,UAAS,KAAK,WAAW,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,KAAK,OAA6B;AACtC,UAAM,UAAU,KAAK,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,eAAe,aAAoC;AACvD,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,QAAQ,aAAa,KAAK;AAAA,MAC9B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,QAAI,MAAM,QAAQ,aAAa,SAAS,KAAK;AAC3C,YAAM,QAAQ,eAAe,MAAM,QAAQ,aAAa,MAAM,IAAI;AAAA,IACpE;AACA,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,aAAa,WAAkC;AACnD,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,QAAQ,WAAW,KAAK;AAAA,MAC5B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,YAAY,WAAmB,MAA8C;AACjF,UAAM,UAAUC,MAAK,KAAK,aAAa,GAAG,SAAS,OAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC5F;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AACF;;;AC5GA,SAAS,SAAS,aAAAC,kBAAiB;AACnC,SAA8B,YAAY;AAC1C,SAAS,UAAAC,eAAc;;;ACFvB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;AAcrB,SAAS,iBAAiB,MAAc,aAAqB,SAA0B;AACrF,QAAM,WAAW,KAAK,QAAQ,MAAM,GAAG;AACvC,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,QAAQ;AAAA;AAAA,OAEhB,IAAI;AAAA,sBACW,WAAW;AAAA;AAAA;AAAA;AAAA,8CAIa,QAAQ,WAAW;AAAA,4BAC5C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMR,QAAQ;AAAA;AAEzB;AAEA,SAAS,iBAAiB,MAAc,cAAsB,SAA0B;AACtF,QAAM,WAAW,QAAQ;AACzB,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,gCAIN,QAAQ;AAAA,0EAC2B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAO1D,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAExC;AAEA,SAAS,kBAAkB,MAAc,aAAqB,SAA0B;AACtF,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA,+BAEP,WAAW;AAAA;AAAA,6CAEJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAExC;AAEA,SAAS,kBAAkB,MAAc,cAAsB,SAA0B;AACvF,SAAO;AAAA,IACL,CAAC,IAAI,GAAG;AAAA,MACN,MAAM;AAAA,MACN,SAAS,CAAC,QAAQ,kBAAkB,QAAQ,WAAW,EAAE;AAAA,MACzD,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAAc,aAAqB,SAA0B;AAC1F,SAAO;AAAA,eACM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAUnB,IAAI;AAAA;AAAA,wCAE6B,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,8CAI/B,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA,sBAI3C,QAAQ,IAAI;AAAA,iBACjB,QAAQ,KAAK;AAAA,gBACd,IAAI,KAAK,QAAQ,SAAS,EAAE,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazD;AAIA,eAAe,mBAAmB,YAAsD;AACtF,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO,CAAC;AAErC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAMC,UAAS,YAAY,OAAO,CAAC;AAC7D,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,kBACb,KACA,YAC0B;AAC1B,QAAM,cAAcC,MAAK,IAAI,WAAW,WAAW;AACnD,MAAI,CAACF,YAAW,WAAW,GAAG;AAC5B,UAAMG,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,aAAaD,MAAK,IAAI,WAAW,eAAe;AACtD,QAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,QAAM,YAAY;AAAA,IAChB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAEA,QAAM,MAAM,EAAE,GAAK,OAAO,OAAmC,CAAC,GAAI,GAAG,UAAU;AAC/E,QAAM,UAAU,KAAK,UAAU,EAAE,GAAG,QAAQ,IAAI,GAAG,MAAM,CAAC;AAE1D,SAAO,EAAE,UAAU,YAAY,QAAQ;AACzC;AAEA,eAAe,oBACb,KACA,YAC0B;AAC1B,QAAM,YAAYA,MAAK,IAAI,WAAW,aAAa,QAAQ;AAC3D,MAAI,CAACF,YAAW,SAAS,GAAG;AAC1B,UAAMG,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,SAAS,sBAAsB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IAC1F,UAAUD,MAAK,WAAW,GAAG,WAAW,IAAI,KAAK;AAAA,EACnD;AACF;AAEA,SAAS,mBAAmB,YAAyC;AACnE,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACrF,KAAK;AACH,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACrF,KAAK;AACH,aAAO,kBAAkB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACtF;AACE,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,EACvF;AACF;AAEA,eAAe,qBACb,KACA,YAC0B;AAC1B,QAAM,aAAaA,MAAK,IAAI,WAAW,aAAa,SAAS;AAC7D,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,UAAMG,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB,UAAU;AAAA,IACtC,UAAUD,MAAK,YAAY,GAAG,WAAW,IAAI,KAAK;AAAA,EACpD;AACF;AAEA,eAAe,qBACb,KACA,YAC0B;AAC1B,MAAI,WAAW,SAAS,OAAO;AAC7B,WAAO,kBAAkB,KAAK,UAAU;AAAA,EAC1C;AAEA,MAAI,WAAW,SAAS,SAAS;AAC/B,WAAO,oBAAoB,KAAK,UAAU;AAAA,EAC5C;AAEA,SAAO,qBAAqB,KAAK,UAAU;AAC7C;AAEA,SAAS,+BAA+B,YAAoD;AAC1F,SAAO;AAAA,IACL,IAAI,OAAO,WAAW;AAAA,IACtB,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,IACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa,WAAW,QAAQ;AAAA,EAClC;AACF;AAEA,SAAS,qBACP,OACA,YACA,YACM;AACN,QAAM,UAAU,aAAa,KAAK,UAAU;AAC5C,QAAM,UAAU,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAEvD,QAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,QAAQ,EAAE;AACzE,MAAI,SAAS;AACX,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,iBAAiB,SAAkB,KAA+C;AAChG,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,UAAI,QAAQ,SAAS,IAAI;AACvB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,SAAS,QAAQ,YAAY,YAAY,EAAE,QAAQ,cAAc,GAAG,CAAC;AAAA,UAC3E,aAAa,IAAI,KAAK,EAAE,sCAAsC;AAAA,YAC5D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,iCAAiC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,SAAS,QAAQ,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,OAAO,GAAG,KAAK,MAAM;AAAA,UAClF,aAAa,IAAI,KAAK,EAAE,sCAAsC;AAAA,YAC5D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,iCAAiC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,UAAU,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UACnF,aAAa,IAAI,KAAK,EAAE,wCAAwC;AAAA,YAC9D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,mCAAmC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,GAAG,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UAC5E,aAAa,IAAI,KAAK,EAAE,gDAAgD;AAAA,YACtE,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,2CAA2C,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,QAAQ,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UACjF,aAAa,IAAI,KAAK,EAAE,gDAAgD;AAAA,YACtE,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,2CAA2C,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,eAAsB,wBACpB,KACgC;AAChC,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAqC,CAAC;AAE5C,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,QAAQ,SAAU;AAEtB,UAAM,aAAa,iBAAiB,SAAS,GAAG;AAChD,QAAI,YAAY;AACd,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iBACpB,KACA,YAC8D;AAC9D,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,EAAE,UAAU,QAAQ,IAAI,MAAM,qBAAqB,KAAK,UAAU;AACxE,QAAME,WAAU,UAAU,SAAS,OAAO;AAE1C,QAAM,aAAa,+BAA+B,UAAU;AAC5D,uBAAqB,OAAO,YAAY,UAAU;AAElD,QAAM,IAAI,aAAa,KAAK,KAAK;AACjC,QAAM,IAAI,aAAa;AAAA,IACrB,IAAI,KAAK,EAAE,qBAAqB;AAAA,MAC9B,MAAM,WAAW;AAAA,MACjB,MAAM,qBAAqB,IAAI,MAAM,WAAW,IAAI;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,YAAY,SAAS;AAChC;AAEO,SAAS,sBACd,KACA,YACA,UACQ;AACR,QAAM,YAAY,qBAAqB,IAAI,MAAM,WAAW,IAAI;AAChE,MAAI,SAAS,cAAS,WAAW,IAAI;AAAA;AAAA;AACrC,YAAU,KAAK,IAAI,KAAK,EAAE,uBAAuB,CAAC,OAAO,SAAS;AAAA;AAClE,YAAU,KAAK,IAAI,KAAK,EAAE,8BAA8B,CAAC,OAAO,WAAW,WAAW;AAAA;AACtF,YAAU,KAAK,IAAI,KAAK,EAAE,uBAAuB,CAAC,SAAS,QAAQ;AAAA;AAAA;AACnE,YAAU,IAAI,IAAI,KAAK,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC,CAAC;AAAA;AAAA;AAEzE,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,4BAA4B,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC9E;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,uBAAuB,CAAC;AAAA;AAChD;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,CAAC;AAAA;AACjD;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,0BAA0B,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC5E;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC1E;AAAA,EACJ;AAEA,SAAO;AACT;;;ACxYA,IAAM,gBAAmD;AAAA,EACvD,WAAW;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,kBAAkB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,iBAAiB;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,eAAe,OAAyC;AACtE,SAAO,cAAc,SAAS,WAAW;AAC3C;;;AFjBO,SAAS,YACd,cACA,WACA,WACA,MACgC;AAChC,QAAM,WAAW,QAAQ,WAAW,gBAAgB,IAAI,CAAC;AACzD,QAAM,cAAc,OAChB,QAAQ,QAAQ,IAAI,IACpB,gBAAgB,EACb,KAAK,CAAC,WAAW,WAAW,gBAAgB,MAAM,CAAC,CAAC,EACpD,MAAM,MAAM,WAAW,gBAAgB,IAAI,CAAC,CAAC;AAEpD,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,MACjB,aAAa,SAAS,EAAE,uBAAuB;AAAA,MAC/C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,cAAc,MAAM,QAAQ,gBAAgB;AAElD,YAAI,aAAa;AACf,iBAAOA,MAAK,EAAE,mBAAmB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,QAClE;AAEA,cAAM,YAAY,4BAA4B,MAAM,QAAQ,WAAW;AACvE,cAAM,YAAY,MAAM,QAAQ,aAAa,MAAM,EAAE;AAErD,YAAI,WAAW,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA;AACjD,oBAAY,GAAGA,MAAK,EAAE,0BAA0B,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AAChF,oBAAY,GAAGA,MAAK,EAAE,wBAAwB;AAAA,UAC5C,UAAU,MAAM,QAAQ;AAAA,UACxB,UAAU,MAAM,SAAS;AAAA,QAC3B,CAAC,CAAC;AAAA;AAAA;AAEF,YAAI,cAAc,cAAc;AAC9B,sBAAY,GAAGA,MAAK,EAAE,2BAA2B,CAAC;AAAA;AAAA;AAAA,QACpD;AAEA,YAAI,UAAU,SAAS,GAAG;AACxB,sBAAY,GAAGA,MAAK,EAAE,iCAAiC,CAAC;AAAA;AACxD,qBAAW,KAAK,WAAW;AACzB,wBAAY,KAAK,EAAE,WAAW;AAAA;AAAA,UAChC;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,gBAAgB,KAAK;AAAA,MACnB,aAAa,SAAS,EAAE,yBAAyB;AAAA,MACjD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,MAAM,EAAE,cAAc,WAAW,MAAAA,MAAK;AAC5C,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,cAAc,yBAAyB,SAAS;AACtD,cAAM,aAAa,cAAc,WAAW,CAAC;AAE7C,YAAI,SAAS,GAAGA,MAAK,EAAE,gBAAgB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AACvE,kBAAU,GAAGA,MAAK,EAAE,kBAAkB,EAAE,OAAO,MAAM,QAAQ,aAAa,CAAC,CAAC;AAAA;AAC5E,kBAAU,GAAGA,MAAK,EAAE,mBAAmB;AAAA,UACrC,OAAO,MAAM,SAAS;AAAA,UACtB,UAAU,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;AAAA,QACrD,CAAC,CAAC;AAAA;AACF,kBAAU,GAAGA,MAAK,EAAE,qBAAqB,EAAE,OAAO,UAAU,OAAO,CAAC,CAAC;AAAA;AAAA;AAErE,YAAI,YAAY,SAAS,GAAG;AAC1B,oBAAU,GAAGA,MAAK,EAAE,qBAAqB,CAAC;AAAA;AAC1C,qBAAW,KAAK,YAAY,MAAM,GAAG,CAAC,GAAG;AACvC,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AACA,oBAAU;AAAA,QACZ;AAEA,YAAI,WAAW,SAAS,GAAG;AACzB,oBAAU,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAC5C,qBAAW,KAAK,YAAY;AAC1B,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AAAA,QACF;AAEA,cAAM,cAAc,MAAM,gBAAgB,GAAG;AAC7C,YAAI,YAAY,SAAS,GAAG;AAC1B,oBAAU;AAAA,EAAKA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAC3C,qBAAW,KAAK,aAAa;AAC3B,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,iBAAiB,KAAK;AAAA,MACpB,aAAa,SAAS,EAAE,0BAA0B;AAAA,MAClD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,MAAM,EAAE,cAAc,WAAW,MAAAA,MAAK;AAC5C,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,aAAa,cAAc,WAAW,EAAE;AAC9C,eAAO,cAAc,KAAK,OAAO,UAAU;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,IAED,kBAAkB,KAAK;AAAA,MACrB,aAAa,SAAS,EAAE,2BAA2B;AAAA,MACnD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,iBAAOA,MAAK,EAAE,eAAe;AAAA,QAC/B;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,gBAAgB,CAAC;AAAA;AAAA;AACxC,kBAAU,GAAGA,MAAK,EAAE,kBAAkB,EAAE,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC;AAAA;AAAA;AAEvE,cAAM,SAAS,oBAAI,IAAuB;AAC1C,mBAAW,KAAK,MAAM,UAAU;AAC9B,gBAAM,OAAO,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC;AACpC,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,EAAE,MAAM,IAAI;AAAA,QACzB;AAEA,mBAAW,CAAC,MAAM,QAAQ,KAAK,QAAQ;AACrC,oBAAU,GAAGA,MAAK,EAAE,oBAAoB;AAAA,YACtC,MAAM,kBAAkBA,OAAM,IAAI;AAAA,UACpC,CAAC,CAAC;AAAA;AACF,qBAAW,KAAK,SAAS,MAAM,GAAG,EAAE,GAAG;AACrC,kBAAM,SAAS,EAAE,WAAW,WAAM;AAClC,sBAAU,GAAG,MAAM,MAAM,EAAE,WAAW,OAAO,EAAE,KAAK;AAAA;AAAA,UACtD;AACA,oBAAU;AAAA,QACZ;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,iBAAiB,KAAK;AAAA,MACpB,aAAa,SAAS,EAAE,0BAA0B;AAAA,MAClD,MAAM;AAAA,QACJ,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,SAAS,EAAE,+BAA+B,CAAC;AAAA,MACxF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,aAAa,eAAe,KAAK,WAAW;AAClD,eAAOA,MAAK,EAAE,oBAAoB,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,MACrE;AAAA,IACF,CAAC;AAAA,IAED,mBAAmB,KAAK;AAAA,MACtB,aAAa,SAAS,EAAE,4BAA4B;AAAA,MACpD,MAAM;AAAA,QACJ,WAAW,KAAK,OAAO,OAAO,EAAE,SAAS,SAAS,EAAE,+BAA+B,CAAC;AAAA,MACtF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,aAAa,aAAa,KAAK,SAAS;AAC9C,eAAOA,MAAK,EAAE,sBAAsB,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,IAED,eAAe,KAAK;AAAA,MAClB,aAAa,SAAS,EAAE,wBAAwB;AAAA,MAChD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,eAAe,MAAM,QAAQ,aAAa,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAEhF,eAAO,MAAMA,MAAK,EAAE,aAAa,CAAC;AAAA;AAAA,MAEpCA,MAAK,EAAE,eAAe,CAAC,OAAO,MAAM,OAAO;AAAA,MAC3CA,MAAK,EAAE,sBAAsB,CAAC,OAAO,MAAM,WAAW,aAAa;AAAA,MACnEA,MAAK,EAAE,wBAAwB,CAAC,OAAO,MAAM,WAAW,cAAc;AAAA,MACtEA,MAAK,EAAE,yBAAyB,CAAC,OAAO,MAAM,SAAS,MAAM;AAAA,MAC7DA,MAAK,EAAE,kBAAkB,CAAC,OAAO,MAAM,QAAQ,WAAW,MAAM;AAAA,MAChEA,MAAK,EAAE,oBAAoB,CAAC,OAAO,MAAM,QAAQ,aAAa,MAAM;AAAA,MACpEA,MAAK,EAAE,uBAAuB,CAAC,OAAO,aAAa,MAAM;AAAA,MACzDA,MAAK,EAAE,qBAAqB,CAAC,OAAOC,QAAO,MAAM,QAAQ,cAAc,qBAAqB,CAAC;AAAA,MAC7FD,MAAK,EAAE,wBAAwB,CAAC,OAAO,MAAM,YAAY,eAAe;AAAA,MACxEA,MAAK,EAAE,2BAA2B,CAAC,OAAO,MAAM,YAAY,iBAAiB;AAAA,MAC7E;AAAA,IACF,CAAC;AAAA,IAED,mBAAmB,KAAK;AAAA,MACtB,aAAa,SAAS,EAAE,4BAA4B;AAAA,MACpD,MAAM;AAAA,QACJ,iBAAiB,KAAK,OACnB,QAAQ,EACR,SAAS,EACT,SAAS,SAAS,EAAE,qCAAqC,CAAC;AAAA,QAC7D,mBAAmB,KAAK,OACrB,QAAQ,EACR,SAAS,EACT,SAAS,SAAS,EAAE,uCAAuC,CAAC;AAAA,QAC/D,iBAAiB,KAAK,OACnB,OAAO,EACP,SAAS,EACT,SAAS,SAAS,EAAE,qCAAqC,CAAC;AAAA,MAC/D;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,KAAK,oBAAoB,QAAW;AACtC,gBAAM,YAAY,kBAAkB,KAAK;AAAA,QAC3C;AACA,YAAI,KAAK,sBAAsB,QAAW;AACxC,gBAAM,YAAY,oBAAoB,KAAK;AAAA,QAC7C;AACA,YAAI,KAAK,oBAAoB,QAAW;AACtC,gBAAM,YAAY,kBAAkB,KAAK;AAAA,QAC3C;AAEA,cAAM,aAAa,KAAK,KAAK;AAC7B,eAAO,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA,EAAK,KAAK,UAAU,MAAM,aAAa,MAAM,CAAC,CAAC;AAAA,MACtF;AAAA,IACF,CAAC;AAAA,IAED,iBAAiB,KAAK;AAAA,MACpB,aAAa,SAAS,EAAE,0BAA0B;AAAA,MAClD,MAAM;AAAA,QACJ,WAAW,KAAK,OAAO,OAAO,EAAE,SAAS,SAAS,EAAE,6BAA6B,CAAC;AAAA,MACpF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS;AAClE,YAAI,CAAC,SAAS;AACZ,iBAAOA,MAAK,EAAE,qBAAqB,EAAE,IAAI,KAAK,UAAU,CAAC;AAAA,QAC3D;AACA,gBAAQ,WAAW;AACnB,cAAM,aAAa,KAAK,KAAK;AAC7B,eAAOA,MAAK,EAAE,kBAAkB,EAAE,aAAa,QAAQ,YAAY,CAAC;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,IAED,eAAe,KAAK;AAAA,MAClB,aAAa,SAAS,EAAE,wBAAwB;AAAA,MAChD,MAAM;AAAA,QACJ,SAAS,KAAK,OAAO,QAAQ,EAAE,SAAS,SAAS,EAAE,yBAAyB,CAAC;AAAA,MAC/E;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,YAAI,CAAC,KAAK,SAAS;AACjB,iBAAOA,MAAK,EAAE,iBAAiB;AAAA,QACjC;AAEA,cAAME;AAAA,UACJ,aAAa,aAAa;AAAA,UAC1B,KAAK,UAAU,mBAAmB,aAAa,eAAe,CAAC,GAAG,MAAM,CAAC;AAAA,QAC3E;AACA,eAAOF,MAAK,EAAE,YAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,IAED,cAAc,KAAK;AAAA,MACjB,aAAa,SAAS,EAAE,uBAAuB;AAAA,MAC/C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,MAAM,EAAE,cAAc,WAAW,MAAAA,MAAK;AAC5C,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,aAAa,cAAc,WAAW,EAAE;AAC9C,cAAM,cAAc,yBAAyB,SAAS;AACtD,eAAO,mBAAmB,KAAK,OAAO,YAAY,WAAW;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,IAED,gBAAgB,KAAK;AAAA,MACnB,aAAa,SAAS,EAAE,yBAAyB;AAAA,MACjD,MAAM;AAAA,QACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,yBAAyB,CAAC;AAAA,MACxF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,MAAM,EAAE,cAAc,WAAW,MAAAA,MAAK;AAC5C,YAAI,KAAK,QAAQ;AACf,gBAAMG,eAAc,MAAM,wBAAwB,GAAG;AACrD,gBAAM,aAAaA,aAAY,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,KAAK,MAAM;AACvE,cAAI,CAAC,YAAY;AACf,mBAAOH,MAAK,EAAE,qBAAqB,EAAE,IAAI,KAAK,OAAO,CAAC;AAAA,UACxD;AACA,gBAAM,EAAE,YAAY,SAAS,IAAI,MAAM,iBAAiB,KAAK,UAAU;AACvE,iBAAO,GAAGA,MAAK,EAAE,wBAAwB,CAAC;AAAA;AAAA,EAAO;AAAA,YAC/C;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,cAAc,MAAM,wBAAwB,GAAG;AACrD,YAAI,YAAY,WAAW,GAAG;AAC5B,iBAAOA,MAAK,EAAE,cAAc;AAAA,QAC9B;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA;AAAA;AAC3C,kBAAU,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA;AAAA;AAExC,mBAAW,KAAK,aAAa;AAC3B,oBAAU,cAAS,EAAE,IAAI;AAAA;AACzB,oBAAU,OAAOA,MAAK,EAAE,kBAAkB,CAAC,OAAO,qBAAqBA,OAAM,EAAE,IAAI,CAAC;AAAA;AACpF,oBAAU,OAAOA,MAAK,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM;AAAA;AAC5D,oBAAU,OAAOA,MAAK,EAAE,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE;AAAA;AAAA;AAAA,QACxE;AAEA,kBAAU;AAAA,EAAKA,MAAK,EAAE,oBAAoB,CAAC;AAC3C,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,eAAe,KAAK;AAAA,MAClB,aAAa,SAAS,EAAE,wBAAwB;AAAA,MAChD,MAAM;AAAA,QACJ,OAAO,KAAK,OACT,KAAK,CAAC,aAAa,kBAAkB,iBAAiB,SAAS,CAAC,EAChE,SAAS,SAAS,EAAE,uBAAuB,CAAC;AAAA,MACjD;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,QAAQ,eAAe,KAAK;AAClC,cAAM,aAAa,KAAK,KAAK;AAE7B,cAAM,SAAS,eAAe,KAAK,KAAqB;AACxD,eAAOA,MAAK,EAAE,aAAa;AAAA,UACzB,OAAO,iBAAiBA,OAAM,KAAK,KAAK;AAAA,UACxC,OAAO,oBAAoBA,OAAM,OAAO,aAAa;AAAA,UACrD,QAAQ,kBAAkBA,OAAM,OAAO,WAAW;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,eAAe,KAAK;AAAA,MAClB,aAAa,SAAS,EAAE,wBAAwB;AAAA,MAChD,MAAM;AAAA,QACJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,uBAAuB,CAAC;AAAA,QACnF,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,uBAAuB,CAAC;AAAA,MACrF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,KAAK,OAAO;AACd,gBAAM,QAAQ,QAAQ,KAAK;AAC3B,gBAAM,aAAa,eAAeA,MAAK,EAAE,qBAAqB,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;AAAA,QACtF;AACA,YAAI,KAAK,OAAO;AACd,gBAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QACjE;AAEA,cAAM,aAAa,KAAK,KAAK;AAE7B,YAAI,SAAS,GAAGA,MAAK,EAAE,eAAe,CAAC;AAAA;AACvC,YAAI,MAAM,QAAQ;AAChB,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO,MAAM,QAAQ,KAAK;AAAA;AACxE,YAAI,MAAM,QAAQ,OAAO;AACvB,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA;AACnF,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,oBAAoB,KAAK;AAAA,MACvB,aAAa,SAAS,EAAE,6BAA6B;AAAA,MACrD,MAAM;AAAA,QACJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,SAAS,EAAE,4BAA4B,CAAC;AAAA,MAC/E;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,YAAY,kCAAkC,mBAAmB,KAAK,KAAK,CAAC;AAClF,cAAM,UAAU;AAAA,UACd;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,0BAA0B;AAAA,YACvC,KAAK;AAAA,UACP;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,wBAAwB;AAAA,YACrC,KAAK;AAAA,UACP;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,0BAA0B;AAAA,YACvC,KAAK;AAAA,UACP;AAAA,UACA,EAAE,MAAM,cAAc,MAAMA,MAAK,EAAE,4BAA4B,EAAE;AAAA,UACjE,EAAE,MAAM,aAAa,MAAMA,MAAK,EAAE,2BAA2B,EAAE;AAAA,QACjE;AACA,cAAM,eAAe,QAClB;AAAA,UAAI,CAAC,WACJ,OAAO,MACH,OAAO,OAAO,IAAI,QAAQ,OAAO,IAAI,OAAO,OAAO,GAAG,OACtD,OAAO,OAAO,IAAI,QAAQ,OAAO,IAAI;AAAA,QAC3C,EACC,KAAK,IAAI;AACZ,eAAO,GAAGA,MAAK,EAAE,qBAAqB;AAAA,UACpC,OAAO,KAAK;AAAA,UACZ,KAAK;AAAA,QACP,CAAC,CAAC;AAAA;AAAA,EAAOA,MAAK,EAAE,oBAAoB,CAAC;AAAA,EAAK,YAAY;AAAA;AAAA,EAAOA,MAAK,EAAE,gBAAgB,CAAC;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,IAED,aAAa,KAAK;AAAA,MAChB,aAAa,SAAS,EAAE,sBAAsB;AAAA,MAC9C,MAAM;AAAA,QACJ,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,SAAS,EAAE,oBAAoB,CAAC;AAAA,QACpE,KAAK,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,mBAAmB,CAAC;AAAA,QAC7E,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,uBAAuB,CAAC;AAAA,MACvF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMA,QAAO,MAAM;AACnB,cAAM,EAAE,YAAAI,YAAW,IAAI,MAAM,OAAO,IAAS;AAC7C,cAAM,EAAE,UAAAC,WAAU,WAAW,aAAa,OAAAC,OAAM,IAAI,MAAM,OAAO,aAAkB;AACnF,cAAM,EAAE,MAAAC,MAAK,IAAI,MAAM,OAAO,MAAW;AAEzC,cAAM,cAAcA,MAAK,WAAW,WAAW;AAC/C,YAAI,CAACH,YAAW,WAAW,GAAG;AAC5B,gBAAME,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9C;AAEA,cAAM,aAAaC,MAAK,WAAW,eAAe;AAClD,YAAI,SAAkC,CAAC;AACvC,YAAIH,YAAW,UAAU,GAAG;AAC1B,cAAI;AACF,qBAAS,KAAK,MAAM,MAAMC,UAAS,YAAY,OAAO,CAAC;AAAA,UACzD,QAAQ;AACN,qBAAS,CAAC;AAAA,UACZ;AAAA,QACF;AAEA,cAAM,WAAoC,CAAC;AAC3C,YAAI,KAAK,KAAK;AACZ,mBAAS,OAAO;AAChB,mBAAS,MAAM,KAAK;AAAA,QACtB,WAAW,KAAK,SAAS;AACvB,mBAAS,OAAO;AAChB,mBAAS,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QAChE,OAAO;AACL,iBAAOL,MAAK,EAAE,yBAAyB;AAAA,QACzC;AACA,iBAAS,UAAU;AAEnB,eAAO,MAAM,EAAE,GAAK,OAAO,OAAmC,CAAC,GAAI,CAAC,KAAK,IAAI,GAAG,SAAS;AACzF,cAAM,YAAY,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE7D,cAAM,aAAa,aAAaA,MAAK,EAAE,uBAAuB,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC;AAElF,eAAOA,MAAK,EAAE,aAAa,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,IAED,sBAAsB,KAAK;AAAA,MACzB,aAAa,SAAS,EAAE,+BAA+B;AAAA,MACvD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,MAAM,UAAU,aAAa,WAAW,GAAG;AAC7C,iBAAOA,MAAK,EAAE,oBAAoB;AAAA,QACpC;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAC5C,kBAAU,GAAGA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AACzC,mBAAW,OAAO,MAAM,UAAU,cAAc;AAC9C,oBAAU,cAAS,IAAI,IAAI;AAAA;AAC3B,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO;AAAA,YACjDA;AAAA,YACA,IAAI;AAAA,UACN,CAAC;AAAA;AACD,oBAAU,OAAOA,MAAK,EAAE,0BAA0B,CAAC,OAAO,IAAI,WAAW;AAAA;AACzE,oBAAU,OAAOA,MAAK,EAAE,uBAAuB,CAAC,OAAOC;AAAA,YACrD,IAAI,KAAK,IAAI,SAAS;AAAA,YACtB;AAAA,UACF,CAAC;AAAA;AAAA;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AGpfO,IAAM,QAAgB,OAAO,EAAE,WAAW,OAAO,MAAM;AAC5D,QAAM,eAAe,IAAI,aAAa,SAAS;AAC/C,QAAM,aAAa,WAAW;AAC9B,QAAM,OAAO,WAAW,gBAAgB,MAAM,gBAAgB,CAAC,CAAC;AAChE,QAAM,MAAoB,EAAE,cAAc,WAAW,MAAM,OAAO;AAElE,QAAM,YAAY,OAAO,WAAW;AACpC,QAAM,mBAAmB,KAAK,IAAI;AAClC,QAAM,YAAwB,CAAC;AAC/B,QAAM,cAA2B,oBAAI,IAAI;AAEzC,QAAM,uBAAuB,YAAY;AACvC,UAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAM,YAAY,4BAA4B,MAAM,QAAQ,WAAW;AAEvE,UAAM,WAAW,iBAAiB;AAClC,UAAM,WAAW,gBAAgB;AACjC,UAAM,QAAQ,gBAAgB;AAC9B,UAAM,QAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAEnD,UAAM,aAAa,KAAK,KAAK;AAE7B,QAAI,cAAc,cAAc;AAC9B,YAAM,aAAa,eAAe,KAAK,EAAE,+BAA+B,CAAC;AAAA,IAC3E;AAEA,UAAM,OAAO,IAAI,UAAU;AAAA,MACzB,MAAM;AAAA,QACJ,SAAS,KAAK,EAAE,uBAAuB;AAAA,UACrC,UAAU,MAAM,QAAQ;AAAA,UACxB,UAAU,MAAM,SAAS;AAAA,QAC3B,CAAC;AAAA,QACD,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,oBAAoB,YAAY;AACpC,UAAM,cAAc,MAAM,eAAe,GAAG;AAC5C,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,YAAM,SAAS,KAAK,GAAG,WAAW;AAClC,YAAM,aAAa,KAAK,KAAK;AAAA,IAC/B;AAEA,UAAM,cAAc,MAAM,gBAAgB,GAAG;AAC7C,eAAW,cAAc,aAAa;AACpC,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,UAAiB;AAC/C,QAAI,EAAE,gBAAgB,OAAQ;AAE9B,UAAM,WAAY,MAAM,YAAsC;AAC9D,QAAI,CAAC,SAAU;AAEf,gBAAY,IAAI,QAAQ;AACxB,UAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAM,WAAW,cAAc,QAAQ,KAAK,MAAM,WAAW,cAAc,QAAQ,KAAK,KAAK;AAC7F,UAAM,aAAa,KAAK,KAAK;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,MAAM,GAAqB;AACvC,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,gBAAM,qBAAqB;AAC3B;AAAA,QACF,KAAK;AACH,gBAAM,kBAAkB;AACxB;AAAA,QACF,KAAK;AACH,gBAAM,iBAAiB,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,MAAM,qBACJ,OACA,SACA;AACA,YAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAI,CAAC,MAAM,YAAY,gBAAiB;AAExC,YAAM,WAAqB;AAAA,QACzB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,MACtB;AAEA,gBAAU,KAAK,QAAQ;AACvB,YAAM,WAAW,kBAAkB;AAEnC,YAAM,cAAc,MAAM;AAC1B,YAAM,WAAW,MAAM,SAAS;AAAA,QAC9B,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,gBAAgB;AAAA,MAChD;AACA,UAAI,UAAU;AACZ,iBAAS,SAAS;AAClB,iBAAS,WAAW,KAAK,IAAI;AAAA,MAC/B,OAAO;AACL,cAAM,SAAS,KAAK;AAAA,UAClB,IAAI,OAAO,WAAW;AAAA,UACtB,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAEA,YAAM,aAAa,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,MAAM,OAAO;AACX,YAAM,kBAAkB,KAAK,IAAI,IAAI;AAErC,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,WAAW,IAAI,KAAK,gBAAgB,EAAE,YAAY;AAAA,QAClD,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC,YAAY;AAAA,QACZ,WAAW,UAAU;AAAA,QACrB,aAAa,MAAM,KAAK,WAAW;AAAA,MACrC;AAEA,YAAM,aAAa,YAAY,WAAW,WAAW;AAErD,UAAI,UAAU,SAAS,IAAI;AACzB,cAAM,aAAa;AAAA,UACjB,KAAK,EAAE,yBAAyB,EAAE,OAAO,UAAU,OAAO,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,UAAI,YAAY,OAAO,IAAI;AACzB,cAAM,aAAa;AAAA,UACjB,KAAK,EAAE,4BAA4B,EAAE,OAAO,YAAY,KAAK,CAAC;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,SAAS,KAAK,EAAE,qBAAqB;AAAA,YACnC,UAAU,eAAe,eAAe;AAAA,YACxC,OAAO,UAAU;AAAA,YACjB,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,UACD,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,YAAY,cAAc,WAAW,WAAW,IAAI;AAAA,EAC5D;AACF;AAEA,IAAO,gBAAQ;","names":["existsSync","readFile","join","writeFile","format","existsSync","mkdir","readFile","writeFile","join","existsSync","readFile","join","mkdir","writeFile","i18n","format","writeFile","suggestions","existsSync","readFile","mkdir","join"]}
1
+ {"version":3,"sources":["../src/format.ts","../src/i18n.ts","../src/git.ts","../src/patterns.ts","../src/state.ts","../src/tools.ts","../src/evolution.ts","../src/level.ts","../src/index.ts"],"sourcesContent":["import { differenceInHours, format, formatDistanceToNow } from \"date-fns\";\nimport { enUS, ko } from \"date-fns/locale\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { State } from \"@/types\";\n\nexport type SessionStatus =\n | \"first-time\"\n | \"continuing\"\n | \"same-day\"\n | \"short-break\"\n | \"week-break\"\n | \"long-break\";\n\nexport function analyzeTimeSinceLastSession(lastSession: string | null): SessionStatus {\n if (!lastSession) return \"first-time\";\n const hours = differenceInHours(new Date(), new Date(lastSession));\n if (hours < 1) return \"continuing\";\n if (hours < 24) return \"same-day\";\n if (hours < 72) return \"short-break\";\n if (hours < 168) return \"week-break\";\n return \"long-break\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex narrative formatting for Mimic's journey display\nexport function formatJourney(ctx: MimicContext, state: State, gitHistory: string[]): string {\n const milestones = state.journey.milestones.slice(-10);\n const observations = state.journey.observations.slice(-5);\n const locale = ctx.i18n.language === \"ko-KR\" ? ko : enUS;\n\n let output = `${ctx.i18n.t(\"journey.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.subtitle\")}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.sessions_survived\", {\n count: state.journey.sessionCount,\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.first_encounter\", {\n date: format(state.project.firstSession, \"yyyy-MM-dd\"),\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.abilities_gained\", {\n count: state.evolution.capabilities.length,\n })}\\n\\n`;\n\n if (state.project.stack && state.project.stack.length > 0) {\n output += `${ctx.i18n.t(\"journey.treasures\", {\n stack: state.project.stack.join(\", \"),\n })}\\n`;\n }\n if (state.project.focus) {\n output += `${ctx.i18n.t(\"journey.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n output += \"\\n\";\n\n if (milestones.length > 0) {\n output += `${ctx.i18n.t(\"journey.victories\")}\\n`;\n for (const m of milestones) {\n const timeAgo = formatDistanceToNow(new Date(m.timestamp), { addSuffix: true, locale });\n output += `- ${m.milestone} (${timeAgo})\\n`;\n }\n output += \"\\n\";\n }\n\n if (observations.length > 0) {\n output += `${ctx.i18n.t(\"journey.witnessed\")}\\n`;\n for (const o of observations) {\n output += `- ${o.observation}\\n`;\n }\n output += \"\\n\";\n }\n\n if (state.evolution.capabilities.length > 0) {\n output += `${ctx.i18n.t(\"journey.powers\")}\\n`;\n for (const cap of state.evolution.capabilities.slice(-5)) {\n output += `- **${cap.name}** (${formatCapabilityType(\n ctx.i18n,\n cap.type,\n )}): ${cap.description}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${ctx.i18n.t(\"journey.scrolls\")}\\n`;\n for (const commit of gitHistory.slice(0, 5)) {\n output += `- ${commit}\\n`;\n }\n }\n\n return output;\n}\n\nexport function formatDuration(ms: number): string {\n const minutes = Math.round(ms / 1000 / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}min`;\n}\n\nexport function formatGrowAnalysis(\n ctx: MimicContext,\n state: State,\n _gitHistory: string[],\n recentFiles: string[],\n): string {\n let output = `${ctx.i18n.t(\"grow.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"grow.subtitle\")}\\n\\n`;\n\n const fileFrequency = Object.entries(state.statistics.filesModified)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10);\n\n if (fileFrequency.length > 0) {\n output += `${ctx.i18n.t(\"grow.feeding_grounds\")}\\n`;\n for (const [file, count] of fileFrequency) {\n output += `- \\`${file}\\` ${ctx.i18n.t(\"grow.files_modified\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n const toolPatterns = state.patterns\n .filter((p) => p.type === \"tool\")\n .sort((a, b) => b.count - a.count);\n if (toolPatterns.length > 0) {\n output += `${ctx.i18n.t(\"grow.favorite_prey\")}\\n`;\n for (const p of toolPatterns.slice(0, 5)) {\n output += `- ${p.description}: ${p.count}\\n`;\n }\n output += \"\\n\";\n }\n\n if (recentFiles.length > 0) {\n const dirCount = new Map<string, number>();\n for (const file of recentFiles) {\n const dir = file.split(\"/\").slice(0, -1).join(\"/\") || \".\";\n dirCount.set(dir, (dirCount.get(dir) || 0) + 1);\n }\n const sortedDirs = [...dirCount.entries()].sort((a, b) => b[1] - a[1]);\n\n output += `${ctx.i18n.t(\"grow.hunting_grounds\")}\\n`;\n for (const [dir, count] of sortedDirs.slice(0, 5)) {\n output += `- \\`${dir}/\\` ${ctx.i18n.t(\"grow.prey\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n output += `${ctx.i18n.t(\"grow.questions\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question1\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question2\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question3\")}\\n`;\n\n if (state.project.focus) {\n output += `\\n${ctx.i18n.t(\"grow.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n\n return output;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type Language = \"en-US\" | \"ko-KR\";\n\nexport interface MimicUserConfig {\n language?: string;\n}\n\nconst DEFAULT_LANGUAGE: Language = \"en-US\";\n\nconst MESSAGES: Record<Language, Record<string, string>> = {\n \"en-US\": {\n \"log.session_started\": \"[Mimic] Session started. Sessions: {sessions}, Patterns: {patterns}\",\n \"log.session_ended\":\n \"[Mimic] Session ended. Duration: {duration}, Tools: {tools}, Files: {files}\",\n \"obs.returned_after_long_break\": \"Returned after a long break\",\n \"obs.intensive_session\": \"Intensive session with {tools} tool calls\",\n \"milestone.major_refactor\": \"Major refactoring session: {files} files edited\",\n \"milestone.evolved\": \"Evolved: {name} ({type})\",\n \"obs.focus_changed\": \"Focus changed to: {focus}\",\n \"milestone.mcp_added\": \"Added MCP: {name}\",\n\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *creak...*\\n\\nA treasure chest? In {project}?\\n\\n*The lid opens slowly, revealing rows of gleaming teeth...*\\n\\nI'm **Mimic**. I look like a chest, but I'm always watching. Always learning.\\n\\n**What I devour... I mean, do:**\\n- ๐Ÿ‘๏ธ Watch your patterns (tools, files, commits)\\n- ๐Ÿง  Remember everything across sessions\\n- ๐Ÿ“œ Track your project's journey\\n- โœจ Suggest shortcuts when I spot repetition\\n\\nUse `mimic:status` to check in, `mimic:journey` to see your story.\\n\\n*...the teeth retract. For now.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *creak...*\",\n \"init.returning.welcome\": \"*The chest's eye opens* Ah, you're back to **{project}**.\",\n \"init.returning.stats\": \"**Sessions**: {sessions} | **Patterns digested**: {patterns}\",\n \"init.returning.long_break\":\n \"*dust falls from the lid* It's been a while... but I remember everything:\",\n \"init.returning.recent_obs_title\": \"**What I've been chewing on:**\",\n\n \"status.title\": \"## {project} Status\",\n \"status.session\": \"**Session**: {count}\",\n \"status.patterns\": \"**Patterns**: {total} detected, {surfaced} surfaced\",\n \"status.tool_calls\": \"**Tool calls this session**: {count}\",\n \"status.recent_files\": \"**Recently modified files:**\",\n \"status.recent_commits\": \"**Recent commits:**\",\n \"status.suggestions\": \"**Suggestions:**\",\n\n \"patterns.none\": \"No patterns detected yet. Keep working, and I'll learn your patterns.\",\n \"patterns.title\": \"## Detected Patterns\",\n \"patterns.total\": \"Total: {count}\",\n \"patterns.section\": \"### {type} Patterns\",\n \"patterns.type.tool\": \"Tool\",\n \"patterns.type.file\": \"File\",\n \"patterns.type.commit\": \"Commit\",\n \"patterns.type.sequence\": \"Sequence\",\n\n \"observe.recorded\": 'Observation recorded: \"{observation}\"',\n \"milestone.recorded\": 'Milestone recorded: \"{milestone}\"',\n\n \"stats.title\": \"Mimic Statistics\",\n \"stats.version\": \"Version\",\n \"stats.total_sessions\": \"Total Sessions\",\n \"stats.total_tool_calls\": \"Total Tool Calls\",\n \"stats.patterns_detected\": \"Patterns Detected\",\n \"stats.milestones\": \"Milestones\",\n \"stats.observations\": \"Observations\",\n \"stats.session_records\": \"Session Records\",\n \"stats.first_session\": \"First Session\",\n \"stats.learning_enabled\": \"Learning Enabled\",\n \"stats.suggestions_enabled\": \"Suggestions Enabled\",\n\n \"configure.updated\": \"Preferences updated:\",\n\n \"surface.not_found\": \"Pattern not found: {id}\",\n \"surface.marked\": 'Pattern \"{description}\" marked as surfaced.',\n\n \"reset.cancelled\": \"Reset cancelled. Set confirm=true to reset all data.\",\n \"reset.done\": \"Mimic reset complete. All patterns, observations, and statistics cleared.\",\n\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *confused clicking* No such pattern in my belly: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *CRUNCH* I've absorbed a new power and spit out a file!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *yawns* Nothing ripe for evolution yet. Feed me more patterns...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ Evolution Menu\",\n \"evolve.menu_intro\":\n \"*The mimic's teeth rearrange into a grin* I can digest these patterns into powers:\",\n \"evolve.menu_type\": \"Type\",\n \"evolve.menu_reason\": \"Reason\",\n \"evolve.menu_pattern_id\": \"Pattern ID\",\n \"evolve.menu_footer\": '*Feed me a pattern ID:* `mimic:evolve({ accept: \"pattern-id\" })`',\n\n \"evolution.type.command\": \"command\",\n \"evolution.type.shortcut\": \"shortcut\",\n \"evolution.type.hook\": \"hook\",\n \"evolution.type.skill\": \"skill\",\n \"evolution.type.agent\": \"agent\",\n \"evolution.type.mcp\": \"mcp\",\n\n \"evolution.result.type\": \"Type\",\n \"evolution.result.description\": \"Description\",\n \"evolution.result.file\": \"File created\",\n \"evolution.result.restart\": \"Restart OpenCode to load the new {type}.\",\n \"evolution.result.command\":\n \"The tool `{name}` will be available after restart.\\nEdit the file to customize its behavior.\",\n \"evolution.result.hook\":\n \"The hook will automatically watch for file changes after restart.\\nEdit the file to customize the trigger conditions.\",\n \"evolution.result.skill\":\n \"The skill will activate on session start after restart.\\nEdit the file to customize when and how it triggers.\",\n \"evolution.result.agent\":\n \"The agent `@{name}` will be available after restart.\\nYou can invoke it with `@{name}` or let other agents delegate to it.\\nEdit the markdown file to customize its prompt, tools, and permissions.\",\n \"evolution.result.mcp\":\n \"MCP server `{name}` has been added to `opencode.json`.\\nIt's currently disabled. Edit the config to enable it and configure the command.\\nSee https://opencode.ai/docs/mcp-servers/ for MCP configuration options.\",\n\n \"evolution.suggest.tool.description\": \"Shortcut for frequent {pattern} usage\",\n \"evolution.suggest.tool.reason\": \"Used {count} times\",\n \"evolution.suggest.file.description\": \"Auto-track changes to {pattern}\",\n \"evolution.suggest.file.reason\": \"Modified {count} times\",\n \"evolution.suggest.commit.description\": 'Quick commit: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"Committed {count} times with same message\",\n \"evolution.suggest.sequence.agent.description\": \"Specialist agent for: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\":\n \"Complex sequence repeated {count} times - needs dedicated agent\",\n \"evolution.suggest.sequence.skill.description\": \"Automate: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"Repeated sequence {count} times\",\n\n \"level.set\": 'Level set to \"{level}\". Responses will be {style} style with {detail} detail.',\n \"level.label.technical\": \"technical\",\n \"level.label.semi-technical\": \"semi-technical\",\n \"level.label.non-technical\": \"non-technical\",\n \"level.label.chaotic\": \"chaotic\",\n \"level.style.minimal\": \"minimal\",\n \"level.style.casual\": \"casual\",\n \"level.style.formal\": \"formal\",\n \"level.style.chaotic\": \"chaotic\",\n \"level.detail.high\": \"high\",\n \"level.detail.medium\": \"medium\",\n \"level.detail.low\": \"low\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *creak* Back to {project}. I've been watching... Session {sessions}.\",\n \"level.greeting.formal\": \"๐Ÿ“ฆ The chest opens... Welcome back to {project}. Session {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*CHOMP*\",\n \"level.greeting.chaotic.lid_creaks\": \"*lid creaks*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*teeth gleam*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*tongue flicks*\",\n \"level.term.tool\": \"tool\",\n \"level.term.pattern\": \"pattern\",\n \"level.term.hook\": \"hook\",\n \"level.term.shortcut\": \"shortcut\",\n \"level.term.habit\": \"habit\",\n \"level.term.automation\": \"automation\",\n\n \"focus.updated\": \"Project updated:\",\n \"focus.focus_label\": \"Focus\",\n \"focus.stack_label\": \"Stack\",\n\n \"mcp_search.header\": '๐Ÿ“ฆ *sniffs the air* Search for \"{query}\" MCP servers:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**Popular MCP servers:**\",\n \"mcp_search.add\":\n 'Use `mimic:mcp` to add one: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"Up-to-date docs\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"Database\",\n \"mcp_search.desc.playwright\": \"Browser automation\",\n \"mcp_search.desc.firecrawl\": \"Web scraping\",\n\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *confused* Need either url or command!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *tongue flicks* MCP server \"{name}\" added to opencode.json!\\n\\nRestart OpenCode to load the new MCP server.',\n\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *empty rattling* No powers absorbed yet. Use `mimic:evolve` to consume some patterns!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ Absorbed Powers\",\n \"capabilities.intro\": \"*The mimic proudly displays its collection...*\",\n \"capabilities.type\": \"Type\",\n \"capabilities.description\": \"Description\",\n \"capabilities.consumed\": \"Consumed\",\n\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - Territory Analysis\",\n \"grow.subtitle\": \"*The mimic surveys the dungeon, noting paths most traveled...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ Feeding Grounds (Most Modified)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท Favorite Prey (Tool Patterns)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ Hunting Grounds\",\n \"grow.questions\": \"### ๐Ÿค” The Chest Wonders...\",\n \"grow.question1\": \"- What treasure shall we hunt next?\",\n \"grow.question2\": \"- Are there forgotten corners of the dungeon?\",\n \"grow.question3\": \"- Does the current path lead to glory?\",\n \"grow.current_hunt\": \"**Current hunt**: {focus}\",\n \"grow.files_modified\": \"({count}x)\",\n \"grow.prey\": \"({count} prey)\",\n\n \"journey.title\": \"## ๐Ÿ“ฆ {project}'s Journey\",\n \"journey.subtitle\": \"*The mimic opens its lid, revealing ancient scrolls within...*\",\n \"journey.sessions_survived\": \"**Sessions survived**: {count}\",\n \"journey.first_encounter\": \"**First encounter**: {date}\",\n \"journey.abilities_gained\": \"**Abilities gained**: {count}\",\n \"journey.treasures\": \"**Treasures inside**: {stack}\",\n \"journey.current_hunt\": \"**Current hunt**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† Victories\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ What I've Witnessed\",\n \"journey.powers\": \"### โœจ Powers Absorbed\",\n \"journey.scrolls\": \"### ๐Ÿ“œ Recent Scrolls\",\n\n \"suggest.commit\":\n '๐Ÿ“ฆ *munch munch* I\\'ve digested \"{pattern}\" {count}+ times. Want me to spit out a shortcut?',\n \"suggest.file\":\n '๐Ÿ“ฆ *peers at file* You keep poking \"{pattern}\" ({count}x). Should I keep an eye on it?',\n \"suggest.tool\":\n '๐Ÿ“ฆ *teeth click* \"{pattern}\" is tasty... you use it often. Custom tool, perhaps?',\n \"suggest.sequence\":\n \"๐Ÿ“ฆ *lid rattles* I sense a pattern in your movements ({pattern})... Let me automate this for you?\",\n \"tool.init.description\": \"Initialize or wake up Mimic for this project\",\n \"tool.status.description\": \"Check current status and recent activity\",\n \"tool.journey.description\": \"View the narrative story of your project's evolution\",\n \"tool.patterns.description\": \"Show all detected patterns\",\n \"tool.observe.description\": \"Manually add an observation to the journey\",\n \"tool.observe.args.observation\": \"The observation to record\",\n \"tool.milestone.description\": \"Record a project milestone\",\n \"tool.milestone.args.milestone\": \"The milestone to record\",\n \"tool.stats.description\": \"Show detailed Mimic statistics\",\n \"tool.configure.description\": \"Configure Mimic preferences\",\n \"tool.configure.args.learningEnabled\": \"Enable/disable pattern learning\",\n \"tool.configure.args.suggestionEnabled\": \"Enable/disable suggestions\",\n \"tool.configure.args.minPatternCount\": \"Minimum occurrences before suggesting\",\n \"tool.surface.description\": \"Mark a pattern as surfaced (acknowledged)\",\n \"tool.surface.args.patternId\": \"The pattern ID to mark as surfaced\",\n \"tool.reset.description\": \"Reset all learned patterns and statistics\",\n \"tool.reset.args.confirm\": \"Must be true to confirm reset\",\n \"tool.grow.description\": \"Analyze project direction and growth opportunities\",\n \"tool.evolve.description\": \"Suggest and create new capabilities based on detected patterns\",\n \"tool.evolve.args.accept\": \"Pattern ID to evolve into a capability\",\n \"tool.level.description\": \"Set your technical level for personalized responses\",\n \"tool.level.args.level\": \"Your technical level\",\n \"tool.focus.description\": \"Set current project focus or priorities\",\n \"tool.focus.args.focus\": \"Current focus area\",\n \"tool.focus.args.stack\": \"Comma-separated tech stack\",\n \"tool.mcp_search.description\": \"Search for MCP servers from mcpmarket.com\",\n \"tool.mcp_search.args.query\": \"Search query for MCP servers\",\n \"tool.mcp.description\": \"Add an MCP server configuration to opencode.json\",\n \"tool.mcp.args.name\": \"Name for the MCP server\",\n \"tool.mcp.args.url\": \"Remote MCP server URL\",\n \"tool.mcp.args.command\": \"Local MCP command (comma-separated)\",\n \"tool.capabilities.description\": \"List all evolved capabilities\",\n },\n \"ko-KR\": {\n \"log.session_started\": \"[Mimic] ์„ธ์…˜ ์‹œ์ž‘. ์„ธ์…˜ {sessions}ํšŒ, ํŒจํ„ด {patterns}๊ฐœ\",\n \"log.session_ended\": \"[Mimic] ์„ธ์…˜ ์ข…๋ฃŒ. ์†Œ์š”: {duration}, ๋„๊ตฌ {tools}ํšŒ, ํŒŒ์ผ {files}๊ฐœ\",\n \"obs.returned_after_long_break\": \"์˜ค๋žœ ๊ณต๋ฐฑ ํ›„ ๋ณต๊ท€\",\n \"obs.intensive_session\": \"๋„๊ตฌ ํ˜ธ์ถœ {tools}ํšŒ โ€” ์ง‘์ค‘ ์„ธ์…˜\",\n \"milestone.major_refactor\": \"๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ„ฐ๋ง ์„ธ์…˜: ํŒŒ์ผ {files}๊ฐœ ์ˆ˜์ •\",\n \"milestone.evolved\": \"์ง„ํ™”: {name} ({type})\",\n \"obs.focus_changed\": \"ํฌ์ปค์Šค ๋ณ€๊ฒฝ: {focus}\",\n \"milestone.mcp_added\": \"MCP ์ถ”๊ฐ€: {name}\",\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *๋ผ์ต...*\\n\\n{project}์— ๋ณด๋ฌผ์ƒ์ž๋ผ๋‹ˆ?\\n\\n*๋šœ๊ป‘์ด ์ฒœ์ฒœํžˆ ์—ด๋ฆฌ๋ฉฐ ๋ฐ˜์ง์ด๋Š” ์ด๋นจ์ด ๋ณด์ธ๋‹ค...*\\n\\n๋‚˜๋Š” **Mimic**. ์ƒ์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋Š˜ ์ง€์ผœ๋ณด๊ณ , ๋Š˜ ๋ฐฐ์šฐ์ง€.\\n\\n**๋‚ด๊ฐ€ ๋จน๋Š”... ์•„๋‹ˆ, ํ•˜๋Š” ์ผ:**\\n- ๐Ÿ‘๏ธ ํŒจํ„ด ๊ด€์ฐฐ (ํˆด, ํŒŒ์ผ, ์ปค๋ฐ‹)\\n- ๐Ÿง  ์„ธ์…˜ ๊ฐ„ ๊ธฐ์–ต\\n- ๐Ÿ“œ ํ”„๋กœ์ ํŠธ ์—ฌ์ • ๊ธฐ๋ก\\n- โœจ ๋ฐ˜๋ณต์„ ๋ณด๋ฉด ์ง€๋ฆ„๊ธธ ์ œ์•ˆ\\n\\n`mimic:status`๋กœ ์ƒํƒœ ํ™•์ธ, `mimic:journey`๋กœ ์ด์•ผ๊ธฐ ๋ณด๊ธฐ.\\n\\n*...์ด๋Š” ์ž ๊น ์ˆจ๊ฒจ๋‘”๋‹ค.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *๋ผ์ต...*\",\n \"init.returning.welcome\": \"*์ƒ์ž์˜ ๋ˆˆ์ด ๋œฌ๋‹ค* **{project}**๋กœ ๋Œ์•„์™”๋„ค.\",\n \"init.returning.stats\": \"**์„ธ์…˜**: {sessions} | **์†Œํ™”ํ•œ ํŒจํ„ด**: {patterns}\",\n \"init.returning.long_break\": \"*๋šœ๊ป‘์— ๋จผ์ง€๊ฐ€ ๋‚ด๋ ค์•‰๋Š”๋‹ค* ์˜ค๋žœ๋งŒ์ด์•ผ... ๊ทธ๋ž˜๋„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด:\",\n \"init.returning.recent_obs_title\": \"**๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ๋“ค:**\",\n \"status.title\": \"## {project} ์ƒํƒœ\",\n \"status.session\": \"**์„ธ์…˜**: {count}\",\n \"status.patterns\": \"**ํŒจํ„ด**: {total}๊ฐœ ๊ฐ์ง€, {surfaced}๊ฐœ ํ™•์ธ\",\n \"status.tool_calls\": \"**์ด๋ฒˆ ์„ธ์…˜ ๋„๊ตฌ ํ˜ธ์ถœ**: {count}\",\n \"status.recent_files\": \"**์ตœ๊ทผ ์ˆ˜์ • ํŒŒ์ผ:**\",\n \"status.recent_commits\": \"**์ตœ๊ทผ ์ปค๋ฐ‹:**\",\n \"status.suggestions\": \"**์ œ์•ˆ:**\",\n \"patterns.none\": \"์•„์ง ๊ฐ์ง€๋œ ํŒจํ„ด์ด ์—†์–ด์š”. ๊ณ„์† ์ž‘์—…ํ•˜๋ฉด ๋ฐฐ์›Œ๋‘˜๊ฒŒ์š”.\",\n \"patterns.title\": \"## ๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"patterns.total\": \"์ด {count}๊ฐœ\",\n \"patterns.section\": \"### {type} ํŒจํ„ด\",\n \"patterns.type.tool\": \"๋„๊ตฌ\",\n \"patterns.type.file\": \"ํŒŒ์ผ\",\n \"patterns.type.commit\": \"์ปค๋ฐ‹\",\n \"patterns.type.sequence\": \"์‹œํ€€์Šค\",\n \"observe.recorded\": '๊ด€์ฐฐ ๊ธฐ๋ก: \"{observation}\"',\n \"milestone.recorded\": '๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก: \"{milestone}\"',\n \"stats.title\": \"Mimic ํ†ต๊ณ„\",\n \"stats.version\": \"๋ฒ„์ „\",\n \"stats.total_sessions\": \"์ด ์„ธ์…˜\",\n \"stats.total_tool_calls\": \"์ด ๋„๊ตฌ ํ˜ธ์ถœ\",\n \"stats.patterns_detected\": \"๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"stats.milestones\": \"๋งˆ์ผ์Šคํ†ค\",\n \"stats.observations\": \"๊ด€์ฐฐ\",\n \"stats.session_records\": \"์„ธ์…˜ ๊ธฐ๋ก\",\n \"stats.first_session\": \"์ฒซ ์„ธ์…˜\",\n \"stats.learning_enabled\": \"ํ•™์Šต ํ™œ์„ฑํ™”\",\n \"stats.suggestions_enabled\": \"์ œ์•ˆ ํ™œ์„ฑํ™”\",\n \"configure.updated\": \"์„ค์ • ์—…๋ฐ์ดํŠธ:\",\n \"surface.not_found\": \"ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {id}\",\n \"surface.marked\": 'ํŒจํ„ด \"{description}\"์„(๋ฅผ) ํ™•์ธ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.',\n \"reset.cancelled\": \"๋ฆฌ์…‹ ์ทจ์†Œ๋จ. ์ „์ฒด ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด confirm=true๋กœ ์„ค์ •ํ•˜์„ธ์š”.\",\n \"reset.done\": \"Mimic ๋ฆฌ์…‹ ์™„๋ฃŒ. ํŒจํ„ด/๊ด€์ฐฐ/ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.\",\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ๋‚ด ์†์— ๊ทธ๋Ÿฐ ํŒจํ„ด์€ ์—†์–ด: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *์™€์ž‘* ์ƒˆ ํž˜์„ ํก์ˆ˜ํ•˜๊ณ  ํŒŒ์ผ์„ ๋ฑ‰์–ด๋ƒˆ๋‹ค!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ์•„์ง ์ง„ํ™”ํ•  ํŒจํ„ด์ด ์—†์–ด. ๋” ๋จน์—ฌ์ค˜...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ ์ง„ํ™” ๋ฉ”๋‰ด\",\n \"evolve.menu_intro\": \"*์ด๋นจ์ด ๋ฏธ์†Œ ๋ชจ์–‘์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค* ์ด ํŒจํ„ด๋“ค์„ ํž˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด:\",\n \"evolve.menu_type\": \"์œ ํ˜•\",\n \"evolve.menu_reason\": \"์ด์œ \",\n \"evolve.menu_pattern_id\": \"ํŒจํ„ด ID\",\n \"evolve.menu_footer\": '*ํŒจํ„ด ID๋ฅผ ๋จน์—ฌ์ค˜:* `mimic:evolve({ accept: \"pattern-id\" })`',\n \"evolution.type.command\": \"๋ช…๋ น\",\n \"evolution.type.shortcut\": \"๋‹จ์ถ•ํ‚ค\",\n \"evolution.type.hook\": \"ํ›…\",\n \"evolution.type.skill\": \"์Šคํ‚ฌ\",\n \"evolution.type.agent\": \"์—์ด์ „ํŠธ\",\n \"evolution.type.mcp\": \"MCP\",\n \"evolution.result.type\": \"์œ ํ˜•\",\n \"evolution.result.description\": \"์„ค๋ช…\",\n \"evolution.result.file\": \"์ƒ์„ฑ๋œ ํŒŒ์ผ\",\n \"evolution.result.restart\": \"์ƒˆ {type}๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.\",\n \"evolution.result.command\":\n \"`{name}` ๋„๊ตฌ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\nํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” ๋™์ž‘์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.\",\n \"evolution.result.hook\":\n \"ํ›…์ด ์žฌ์‹œ์ž‘ ํ›„ ์ž๋™์œผ๋กœ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.\\nํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•ด ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.skill\":\n \"์Šคํ‚ฌ์€ ์žฌ์‹œ์ž‘ ํ›„ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.\\n์–ธ์ œ/์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ˆ˜์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.agent\":\n \"`@{name}` ์—์ด์ „ํŠธ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\n`@{name}`์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๊ฐ€ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\\n๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ํ”„๋กฌํ”„ํŠธ/๋„๊ตฌ/๊ถŒํ•œ์„ ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.mcp\":\n \"MCP ์„œ๋ฒ„ `{name}`๊ฐ€ `opencode.json`์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\nํ˜„์žฌ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ์ˆ˜์ •ํ•ด ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ช…๋ น์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.\\nMCP ์˜ต์…˜์€ https://opencode.ai/docs/mcp-servers/ ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.\",\n \"evolution.suggest.tool.description\": \"์ž์ฃผ ์“ฐ๋Š” {pattern}์˜ ๋‹จ์ถ•ํ‚ค\",\n \"evolution.suggest.tool.reason\": \"{count}ํšŒ ์‚ฌ์šฉ\",\n \"evolution.suggest.file.description\": \"{pattern} ๋ณ€๊ฒฝ ์ž๋™ ์ถ”์ \",\n \"evolution.suggest.file.reason\": \"{count}ํšŒ ์ˆ˜์ •\",\n \"evolution.suggest.commit.description\": '๋น ๋ฅธ ์ปค๋ฐ‹: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ {count}ํšŒ ์ปค๋ฐ‹\",\n \"evolution.suggest.sequence.agent.description\": \"์ „๋‹ด ์—์ด์ „ํŠธ: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\": \"๋ณต์žกํ•œ ์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต โ€” ์ „๋‹ด ์—์ด์ „ํŠธ ํ•„์š”\",\n \"evolution.suggest.sequence.skill.description\": \"์ž๋™ํ™”: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต\",\n \"level.set\":\n '๋ ˆ๋ฒจ์„ \"{level}\"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ {style} ํ†ค, {detail} ์ƒ์„ธ๋„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.',\n \"level.label.technical\": \"๊ธฐ์ˆ ์ \",\n \"level.label.semi-technical\": \"์ค€๊ธฐ์ˆ \",\n \"level.label.non-technical\": \"๋น„๊ธฐ์ˆ \",\n \"level.label.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.style.minimal\": \"๊ฐ„๊ฒฐํ•œ\",\n \"level.style.casual\": \"์บ์ฃผ์–ผ\",\n \"level.style.formal\": \"์ •์ค‘ํ•œ\",\n \"level.style.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.detail.high\": \"๋†’์Œ\",\n \"level.detail.medium\": \"์ค‘๊ฐ„\",\n \"level.detail.low\": \"๋‚ฎ์Œ\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *๋ผ์ต* {project}๋กœ ๋Œ์•„์™”๋„ค. ๊ณ„์† ์ง€์ผœ๋ณด๊ณ  ์žˆ์—ˆ์–ด... ์„ธ์…˜ {sessions}.\",\n \"level.greeting.formal\":\n \"๐Ÿ“ฆ ์ƒ์ž๊ฐ€ ์—ด๋ฆฐ๋‹ค... {project}์— ๋‹ค์‹œ ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*์™€๊ทธ์ž‘*\",\n \"level.greeting.chaotic.lid_creaks\": \"*๋šœ๊ป‘ ์‚๊ฑฑ*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*์ด๋นจ ๋ฒˆ๋œฉ*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*ํ˜€ ํ•ฅ์ง*\",\n \"level.term.tool\": \"๋„๊ตฌ\",\n \"level.term.pattern\": \"ํŒจํ„ด\",\n \"level.term.hook\": \"ํ›…\",\n \"level.term.shortcut\": \"์ง€๋ฆ„๊ธธ\",\n \"level.term.habit\": \"์Šต๊ด€\",\n \"level.term.automation\": \"์ž๋™ํ™”\",\n \"focus.updated\": \"ํ”„๋กœ์ ํŠธ ์ •๋ณด ์—…๋ฐ์ดํŠธ:\",\n \"focus.focus_label\": \"ํ˜„์žฌ ํฌ์ปค์Šค\",\n \"focus.stack_label\": \"์Šคํƒ\",\n \"mcp_search.header\": '๐Ÿ“ฆ *ํ‚ํ‚* \"{query}\" MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**์ธ๊ธฐ MCP ์„œ๋ฒ„:**\",\n \"mcp_search.add\":\n '`mimic:mcp`๋กœ ์ถ”๊ฐ€: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"์ตœ์‹  ๋ฌธ์„œ\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค\",\n \"mcp_search.desc.playwright\": \"๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”\",\n \"mcp_search.desc.firecrawl\": \"์›น ์Šคํฌ๋ž˜ํ•‘\",\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* url ๋˜๋Š” command ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ด!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *ํ˜€๋ฅผ ๋‚ผ๋ฆ„* MCP ์„œ๋ฒ„ \"{name}\"๊ฐ€ opencode.json์— ์ถ”๊ฐ€๋์–ด!\\n\\n์ƒˆ MCP ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•ด.',\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *ํ…… ๋นˆ ๋œ์ปน* ์•„์ง ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ์ด ์—†์–ด. `mimic:evolve`๋กœ ํŒจํ„ด์„ ๋จน์—ฌ์ค˜!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"capabilities.intro\": \"*๋ฏธ๋ฏน์ด ์ˆ˜์ง‘ํ’ˆ์„ ์ž๋ž‘ํ•œ๋‹ค...*\",\n \"capabilities.type\": \"์œ ํ˜•\",\n \"capabilities.description\": \"์„ค๋ช…\",\n \"capabilities.consumed\": \"ํก์ˆ˜์ผ\",\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - ์˜์—ญ ๋ถ„์„\",\n \"grow.subtitle\": \"*๋ฏธ๋ฏน์ด ๋˜์ „์„ ํ›‘์œผ๋ฉฐ ์ž์ฃผ ๋‹ค๋‹Œ ๊ธธ์„ ๊ธฐ๋กํ•œ๋‹ค...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ ๋จน์ด ํ„ฐ (๊ฐ€์žฅ ๋งŽ์ด ์ˆ˜์ •)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท ์ข‹์•„ํ•˜๋Š” ๋จน์ด (๋„๊ตฌ ํŒจํ„ด)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ ์‚ฌ๋ƒฅํ„ฐ\",\n \"grow.questions\": \"### ๐Ÿค” ์ƒ์ž์˜ ์งˆ๋ฌธ\",\n \"grow.question1\": \"- ๋‹ค์Œ ๋ณด๋ฌผ์€ ๋ฌด์—‡์ผ๊นŒ?\",\n \"grow.question2\": \"- ์žŠํžŒ ๊ตฌ์„์€ ์—†์„๊นŒ?\",\n \"grow.question3\": \"- ์ง€๊ธˆ ๊ธธ์ด ์˜๊ด‘์œผ๋กœ ์ด์–ด์งˆ๊นŒ?\",\n \"grow.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"grow.files_modified\": \"({count}ํšŒ)\",\n \"grow.prey\": \"({count}๊ฑด)\",\n \"journey.title\": \"## ๐Ÿ“ฆ {project}์˜ ์—ฌ์ •\",\n \"journey.subtitle\": \"*๋ฏธ๋ฏน์ด ๋šœ๊ป‘์„ ์—ด์–ด ์˜ค๋ž˜๋œ ๋‘๋ฃจ๋งˆ๋ฆฌ๋ฅผ ํŽผ์นœ๋‹ค...*\",\n \"journey.sessions_survived\": \"**๋ˆ„์  ์„ธ์…˜**: {count}\",\n \"journey.first_encounter\": \"**์ฒซ ๋งŒ๋‚จ**: {date}\",\n \"journey.abilities_gained\": \"**์–ป์€ ๋Šฅ๋ ฅ**: {count}\",\n \"journey.treasures\": \"**๋‹ด๊ธด ๋ณด๋ฌผ**: {stack}\",\n \"journey.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† ์„ฑ๊ณผ\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ\",\n \"journey.powers\": \"### โœจ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"journey.scrolls\": \"### ๐Ÿ“œ ์ตœ๊ทผ ๊ธฐ๋ก\",\n \"suggest.commit\": '๐Ÿ“ฆ *๋ƒ ๋ƒ * \"{pattern}\"์„ {count}+๋ฒˆ ์†Œํ™”ํ–ˆ์–ด. ์ง€๋ฆ„๊ธธ๋กœ ๋งŒ๋“ค๊นŒ?',\n \"suggest.file\": '๐Ÿ“ฆ *ํŒŒ์ผ์„ ์‘์‹œ* \"{pattern}\"์„ {count}๋ฒˆ ๊ฑด๋“œ๋ ธ๋„ค. ์ง€์ผœ๋ณผ๊นŒ?',\n \"suggest.tool\": '๐Ÿ“ฆ *์ด๋นจ ์ฐฐ์นต* \"{pattern}\" ์ •๋ง ์ž์ฃผ ์“ฐ๋„ค. ์ปค์Šคํ…€ ๋„๊ตฌ ์–ด๋•Œ?',\n \"suggest.sequence\": \"๐Ÿ“ฆ *๋šœ๊ป‘ ๋‹ฌ๊ทธ๋ฝ* ์›€์ง์ž„์—์„œ ํŒจํ„ด์ด ๋ณด์—ฌ ({pattern})... ์ž๋™ํ™”ํ•ด์ค„๊นŒ?\",\n \"tool.init.description\": \"์ด ํ”„๋กœ์ ํŠธ์—์„œ Mimic ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊นจ์šฐ๊ธฐ\",\n \"tool.status.description\": \"ํ˜„์žฌ ์ƒํƒœ์™€ ์ตœ๊ทผ ํ™œ๋™ ํ™•์ธ\",\n \"tool.journey.description\": \"ํ”„๋กœ์ ํŠธ ์ง„ํ™” ์„œ์‚ฌ ๋ณด๊ธฐ\",\n \"tool.patterns.description\": \"๊ฐ์ง€๋œ ๋ชจ๋“  ํŒจํ„ด ๋ณด๊ธฐ\",\n \"tool.observe.description\": \"์—ฌ์ •์— ๊ด€์ฐฐ ๋‚ด์šฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€\",\n \"tool.observe.args.observation\": \"๊ธฐ๋กํ•  ๊ด€์ฐฐ ๋‚ด์šฉ\",\n \"tool.milestone.description\": \"ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก\",\n \"tool.milestone.args.milestone\": \"๊ธฐ๋กํ•  ๋งˆ์ผ์Šคํ†ค\",\n \"tool.stats.description\": \"Mimic ์ƒ์„ธ ํ†ต๊ณ„ ๋ณด๊ธฐ\",\n \"tool.configure.description\": \"Mimic ํ™˜๊ฒฝ์„ค์ • ๋ณ€๊ฒฝ\",\n \"tool.configure.args.learningEnabled\": \"ํŒจํ„ด ํ•™์Šต ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.suggestionEnabled\": \"์ œ์•ˆ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.minPatternCount\": \"์ œ์•ˆ ์ „ ์ตœ์†Œ ๋ฐœ์ƒ ํšŸ์ˆ˜\",\n \"tool.surface.description\": \"ํŒจํ„ด์„ surfaced(ํ™•์ธ๋จ)๋กœ ํ‘œ์‹œ\",\n \"tool.surface.args.patternId\": \"surfaced๋กœ ํ‘œ์‹œํ•  ํŒจํ„ด ID\",\n \"tool.reset.description\": \"ํ•™์Šต๋œ ํŒจํ„ด๊ณผ ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”\",\n \"tool.reset.args.confirm\": \"์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด true๋กœ ์„ค์ •\",\n \"tool.grow.description\": \"ํ”„๋กœ์ ํŠธ ๋ฐฉํ–ฅ๊ณผ ์„ฑ์žฅ ๊ธฐํšŒ ๋ถ„์„\",\n \"tool.evolve.description\": \"๊ฐ์ง€๋œ ํŒจํ„ด์œผ๋กœ ์ƒˆ ๋Šฅ๋ ฅ์„ ์ œ์•ˆ/์ƒ์„ฑ\",\n \"tool.evolve.args.accept\": \"๋Šฅ๋ ฅ์œผ๋กœ ์ง„ํ™”์‹œํ‚ฌ ํŒจํ„ด ID\",\n \"tool.level.description\": \"๊ฐœ์ธํ™”๋œ ์‘๋‹ต์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์ˆ˜์ค€ ์„ค์ •\",\n \"tool.level.args.level\": \"๊ธฐ์ˆ  ์ˆ˜์ค€\",\n \"tool.focus.description\": \"ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ํฌ์ปค์Šค/์šฐ์„ ์ˆœ์œ„ ์„ค์ •\",\n \"tool.focus.args.focus\": \"ํ˜„์žฌ ํฌ์ปค์Šค ์˜์—ญ\",\n \"tool.focus.args.stack\": \"์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ธฐ์ˆ  ์Šคํƒ\",\n \"tool.mcp_search.description\": \"mcpmarket.com์—์„œ MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰\",\n \"tool.mcp_search.args.query\": \"MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰์–ด\",\n \"tool.mcp.description\": \"opencode.json์— MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€\",\n \"tool.mcp.args.name\": \"MCP ์„œ๋ฒ„ ์ด๋ฆ„\",\n \"tool.mcp.args.url\": \"์›๊ฒฉ MCP ์„œ๋ฒ„ URL\",\n \"tool.mcp.args.command\": \"๋กœ์ปฌ MCP ๋ช…๋ น(์‰ผํ‘œ ๊ตฌ๋ถ„)\",\n \"tool.capabilities.description\": \"์ง„ํ™”ํ•œ ๋Šฅ๋ ฅ ๋ชฉ๋ก\",\n },\n};\n\nexport async function loadMimicConfig(): Promise<MimicUserConfig> {\n const configPath = join(homedir(), \".config\", \"opencode\", \"mimic.json\");\n if (!existsSync(configPath)) return {};\n\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n return parsed as MimicUserConfig;\n } catch {\n return {};\n }\n}\n\nexport function resolveLanguage(config?: MimicUserConfig | null): Language {\n if (config?.language === \"ko-KR\") return \"ko-KR\";\n return DEFAULT_LANGUAGE;\n}\n\nexport interface I18n {\n language: Language;\n t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, key) => {\n const value = vars[key];\n return value === undefined ? \"\" : String(value);\n });\n}\n\nexport function createI18n(language: Language): I18n {\n return {\n language,\n t: (key, vars) => {\n const dict = MESSAGES[language] ?? MESSAGES[DEFAULT_LANGUAGE];\n const fallback = MESSAGES[DEFAULT_LANGUAGE];\n const template = dict[key] ?? fallback[key] ?? key;\n return interpolate(template, vars);\n },\n };\n}\n\nexport function formatCapabilityType(i18n: I18n, type: string): string {\n return i18n.t(`evolution.type.${type}`);\n}\n\nexport function formatLevelLabel(i18n: I18n, level: string): string {\n return i18n.t(`level.label.${level}`);\n}\n\nexport function formatGreetingStyle(i18n: I18n, style: string): string {\n return i18n.t(`level.style.${style}`);\n}\n\nexport function formatDetailLevel(i18n: I18n, detail: string): string {\n return i18n.t(`level.detail.${detail}`);\n}\n\nexport function formatPatternType(i18n: I18n, type: string): string {\n return i18n.t(`patterns.type.${type}`);\n}\n","import { execSync } from \"node:child_process\";\n\nexport function getGitHistory(directory: string, limit = 50): string[] {\n try {\n const result = execSync(`git log --oneline -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getRecentlyModifiedFiles(directory: string): string[] {\n try {\n const result = execSync(\n \"git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only\",\n {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getCommitMessages(directory: string, limit = 20): string[] {\n try {\n const result = execSync(`git log --format=%s -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function detectCommitPatterns(messages: string[]): Map<string, number> {\n const patterns = new Map<string, number>();\n for (const msg of messages) {\n const normalized = msg.toLowerCase().replace(/\\s+/g, \" \").trim();\n patterns.set(normalized, (patterns.get(normalized) || 0) + 1);\n }\n return patterns;\n}\n","import type { MimicContext } from \"@/context\";\nimport { detectCommitPatterns, getCommitMessages } from \"@/git\";\nimport type { Pattern } from \"@/types\";\n\nexport async function detectPatterns(ctx: MimicContext): Promise<Pattern[]> {\n const state = await ctx.stateManager.read();\n const newPatterns: Pattern[] = [];\n\n const commitMessages = getCommitMessages(ctx.directory);\n const commitPatterns = detectCommitPatterns(commitMessages);\n for (const [msg, count] of commitPatterns) {\n if (count >= 3) {\n const existing = state.patterns.find((p) => p.type === \"commit\" && p.description === msg);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"commit\",\n description: msg,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n const fileStats = state.statistics.filesModified;\n for (const [file, count] of Object.entries(fileStats)) {\n if (count >= 5) {\n const existing = state.patterns.find((p) => p.type === \"file\" && p.description === file);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"file\",\n description: file,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n return newPatterns;\n}\n\nexport async function surfacePatterns(ctx: MimicContext): Promise<string[]> {\n const state = await ctx.stateManager.read();\n const suggestions: string[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n if (pattern.count < state.preferences.minPatternCount) continue;\n\n let suggestion = \"\";\n switch (pattern.type) {\n case \"commit\":\n suggestion = ctx.i18n.t(\"suggest.commit\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"file\":\n suggestion = ctx.i18n.t(\"suggest.file\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"tool\":\n suggestion = ctx.i18n.t(\"suggest.tool\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"sequence\":\n suggestion = ctx.i18n.t(\"suggest.sequence\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n }\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { State } from \"@/types\";\n\nexport const createDefaultState = (projectName: string): State => ({\n version: \"0.1.0\",\n project: {\n name: projectName,\n creatorLevel: null,\n firstSession: Date.now(),\n stack: [],\n focus: undefined,\n },\n journey: {\n observations: [],\n milestones: [],\n sessionCount: 0,\n lastSession: null,\n },\n patterns: [],\n evolution: {\n capabilities: [],\n lastEvolution: null,\n pendingSuggestions: [],\n },\n preferences: {\n suggestionEnabled: true,\n learningEnabled: true,\n minPatternCount: 3,\n },\n statistics: {\n totalSessions: 0,\n totalToolCalls: 0,\n filesModified: {},\n lastSessionId: null,\n },\n});\n\nexport class StateManager {\n private readonly mimicDir: string;\n private readonly statePath: string;\n private readonly sessionsDir: string;\n private readonly projectName: string;\n\n constructor(directory: string) {\n this.mimicDir = join(directory, \".opencode\", \"mimic\");\n this.statePath = join(this.mimicDir, \"state.json\");\n this.sessionsDir = join(this.mimicDir, \"sessions\");\n this.projectName = directory.split(\"/\").pop() || \"unknown\";\n }\n\n async initialize(): Promise<void> {\n if (!existsSync(this.mimicDir)) {\n await mkdir(this.mimicDir, { recursive: true });\n }\n if (!existsSync(this.sessionsDir)) {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n if (!existsSync(this.statePath)) {\n await this.save(createDefaultState(this.projectName));\n }\n }\n\n async read(): Promise<State> {\n return JSON.parse(await readFile(this.statePath, \"utf-8\"));\n }\n\n async save(state: State): Promise<void> {\n await writeFile(this.statePath, JSON.stringify(state, null, 2));\n }\n\n async addObservation(observation: string): Promise<void> {\n const state = await this.read();\n state.journey.observations.push({\n observation,\n timestamp: new Date().toISOString(),\n });\n if (state.journey.observations.length > 100) {\n state.journey.observations = state.journey.observations.slice(-100);\n }\n await this.save(state);\n }\n\n async addMilestone(milestone: string): Promise<void> {\n const state = await this.read();\n state.journey.milestones.push({\n milestone,\n timestamp: new Date().toISOString(),\n });\n await this.save(state);\n }\n\n async saveSession(sessionId: string, data: Record<string, unknown>): Promise<void> {\n await writeFile(join(this.sessionsDir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n }\n\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n getProjectName(): string {\n return this.projectName;\n }\n\n getStatePath(): string {\n return this.statePath;\n }\n}\n","import { readdir, writeFile } from \"node:fs/promises\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { evolveCapability, formatEvolutionResult, getEvolutionSuggestions } from \"@/evolution\";\nimport { analyzeTimeSinceLastSession, formatGrowAnalysis, formatJourney } from \"@/format\";\nimport { getGitHistory, getRecentlyModifiedFiles } from \"@/git\";\nimport {\n createI18n,\n formatCapabilityType,\n formatDetailLevel,\n formatGreetingStyle,\n formatLevelLabel,\n formatPatternType,\n type I18n,\n loadMimicConfig,\n resolveLanguage,\n} from \"@/i18n\";\nimport { getLevelConfig } from \"@/level\";\nimport { surfacePatterns } from \"@/patterns\";\nimport { createDefaultState, type StateManager } from \"@/state\";\nimport type { CreatorLevel, Pattern, ToolCall } from \"@/types\";\n\nexport function createTools(\n stateManager: StateManager,\n directory: string,\n toolCalls: ToolCall[],\n i18n?: I18n,\n): Record<string, ToolDefinition> {\n const baseI18n = i18n ?? createI18n(resolveLanguage(null));\n const i18nPromise = i18n\n ? Promise.resolve(i18n)\n : loadMimicConfig()\n .then((config) => createI18n(resolveLanguage(config)))\n .catch(() => createI18n(resolveLanguage(null)));\n\n return {\n \"mimic:init\": tool({\n description: baseI18n.t(\"tool.init.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const isFirstTime = state.journey.sessionCount <= 1;\n\n if (isFirstTime) {\n return i18n.t(\"init.first_time\", { project: state.project.name });\n }\n\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n const recentObs = state.journey.observations.slice(-3);\n\n let greeting = `${i18n.t(\"init.returning.header\")}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.welcome\", { project: state.project.name })}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.stats\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n })}\\n\\n`;\n\n if (timeSince === \"long-break\") {\n greeting += `${i18n.t(\"init.returning.long_break\")}\\n\\n`;\n }\n\n if (recentObs.length > 0) {\n greeting += `${i18n.t(\"init.returning.recent_obs_title\")}\\n`;\n for (const o of recentObs) {\n greeting += `- ${o.observation}\\n`;\n }\n }\n\n return greeting;\n },\n }),\n\n \"mimic:status\": tool({\n description: baseI18n.t(\"tool.status.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const recentFiles = getRecentlyModifiedFiles(directory);\n const gitHistory = getGitHistory(directory, 5);\n\n let output = `${i18n.t(\"status.title\", { project: state.project.name })}\\n\\n`;\n output += `${i18n.t(\"status.session\", { count: state.journey.sessionCount })}\\n`;\n output += `${i18n.t(\"status.patterns\", {\n total: state.patterns.length,\n surfaced: state.patterns.filter((p) => p.surfaced).length,\n })}\\n`;\n output += `${i18n.t(\"status.tool_calls\", { count: toolCalls.length })}\\n\\n`;\n\n if (recentFiles.length > 0) {\n output += `${i18n.t(\"status.recent_files\")}\\n`;\n for (const f of recentFiles.slice(0, 5)) {\n output += `- ${f}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${i18n.t(\"status.recent_commits\")}\\n`;\n for (const c of gitHistory) {\n output += `- ${c}\\n`;\n }\n }\n\n const suggestions = await surfacePatterns(ctx);\n if (suggestions.length > 0) {\n output += `\\n${i18n.t(\"status.suggestions\")}\\n`;\n for (const s of suggestions) {\n output += `- ${s}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:journey\": tool({\n description: baseI18n.t(\"tool.journey.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 10);\n return formatJourney(ctx, state, gitHistory);\n },\n }),\n\n \"mimic:patterns\": tool({\n description: baseI18n.t(\"tool.patterns.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.patterns.length === 0) {\n return i18n.t(\"patterns.none\");\n }\n\n let output = `${i18n.t(\"patterns.title\")}\\n\\n`;\n output += `${i18n.t(\"patterns.total\", { count: state.patterns.length })}\\n\\n`;\n\n const byType = new Map<string, Pattern[]>();\n for (const p of state.patterns) {\n const list = byType.get(p.type) || [];\n list.push(p);\n byType.set(p.type, list);\n }\n\n for (const [type, patterns] of byType) {\n output += `${i18n.t(\"patterns.section\", {\n type: formatPatternType(i18n, type),\n })}\\n`;\n for (const p of patterns.slice(0, 10)) {\n const status = p.surfaced ? \"โœ“\" : \"โ—‹\";\n output += `${status} **${p.description}** (${p.count}x)\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:observe\": tool({\n description: baseI18n.t(\"tool.observe.description\"),\n args: {\n observation: tool.schema.string().describe(baseI18n.t(\"tool.observe.args.observation\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addObservation(args.observation);\n return i18n.t(\"observe.recorded\", { observation: args.observation });\n },\n }),\n\n \"mimic:milestone\": tool({\n description: baseI18n.t(\"tool.milestone.description\"),\n args: {\n milestone: tool.schema.string().describe(baseI18n.t(\"tool.milestone.args.milestone\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addMilestone(args.milestone);\n return i18n.t(\"milestone.recorded\", { milestone: args.milestone });\n },\n }),\n\n \"mimic:stats\": tool({\n description: baseI18n.t(\"tool.stats.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sessionFiles = await readdir(stateManager.getSessionsDir()).catch(() => []);\n\n return `## ${i18n.t(\"stats.title\")}\n\n- **${i18n.t(\"stats.version\")}**: ${state.version}\n- **${i18n.t(\"stats.total_sessions\")}**: ${state.statistics.totalSessions}\n- **${i18n.t(\"stats.total_tool_calls\")}**: ${state.statistics.totalToolCalls}\n- **${i18n.t(\"stats.patterns_detected\")}**: ${state.patterns.length}\n- **${i18n.t(\"stats.milestones\")}**: ${state.journey.milestones.length}\n- **${i18n.t(\"stats.observations\")}**: ${state.journey.observations.length}\n- **${i18n.t(\"stats.session_records\")}**: ${sessionFiles.length}\n- **${i18n.t(\"stats.first_session\")}**: ${format(state.project.firstSession, \"yyyy-MM-dd HH:mm:ss\")}\n- **${i18n.t(\"stats.learning_enabled\")}**: ${state.preferences.learningEnabled}\n- **${i18n.t(\"stats.suggestions_enabled\")}**: ${state.preferences.suggestionEnabled}`;\n },\n }),\n\n \"mimic:configure\": tool({\n description: baseI18n.t(\"tool.configure.description\"),\n args: {\n learningEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.learningEnabled\")),\n suggestionEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.suggestionEnabled\")),\n minPatternCount: tool.schema\n .number()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.minPatternCount\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.learningEnabled !== undefined) {\n state.preferences.learningEnabled = args.learningEnabled;\n }\n if (args.suggestionEnabled !== undefined) {\n state.preferences.suggestionEnabled = args.suggestionEnabled;\n }\n if (args.minPatternCount !== undefined) {\n state.preferences.minPatternCount = args.minPatternCount;\n }\n\n await stateManager.save(state);\n return `${i18n.t(\"configure.updated\")}\\n${JSON.stringify(state.preferences, null, 2)}`;\n },\n }),\n\n \"mimic:surface\": tool({\n description: baseI18n.t(\"tool.surface.description\"),\n args: {\n patternId: tool.schema.string().describe(baseI18n.t(\"tool.surface.args.patternId\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const pattern = state.patterns.find((p) => p.id === args.patternId);\n if (!pattern) {\n return i18n.t(\"surface.not_found\", { id: args.patternId });\n }\n pattern.surfaced = true;\n await stateManager.save(state);\n return i18n.t(\"surface.marked\", { description: pattern.description });\n },\n }),\n\n \"mimic:reset\": tool({\n description: baseI18n.t(\"tool.reset.description\"),\n args: {\n confirm: tool.schema.boolean().describe(baseI18n.t(\"tool.reset.args.confirm\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n if (!args.confirm) {\n return i18n.t(\"reset.cancelled\");\n }\n\n await writeFile(\n stateManager.getStatePath(),\n JSON.stringify(createDefaultState(stateManager.getProjectName()), null, 2),\n );\n return i18n.t(\"reset.done\");\n },\n }),\n\n \"mimic:grow\": tool({\n description: baseI18n.t(\"tool.grow.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 20);\n const recentFiles = getRecentlyModifiedFiles(directory);\n return formatGrowAnalysis(ctx, state, gitHistory, recentFiles);\n },\n }),\n\n \"mimic:evolve\": tool({\n description: baseI18n.t(\"tool.evolve.description\"),\n args: {\n accept: tool.schema.string().optional().describe(baseI18n.t(\"tool.evolve.args.accept\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n if (args.accept) {\n const suggestions = await getEvolutionSuggestions(ctx);\n const suggestion = suggestions.find((s) => s.pattern.id === args.accept);\n if (!suggestion) {\n return i18n.t(\"evolve.no_pattern\", { id: args.accept });\n }\n const { capability, filePath } = await evolveCapability(ctx, suggestion);\n return `${i18n.t(\"evolve.absorbed_header\")}\\n\\n${formatEvolutionResult(\n ctx,\n capability,\n filePath,\n )}`;\n }\n\n const suggestions = await getEvolutionSuggestions(ctx);\n if (suggestions.length === 0) {\n return i18n.t(\"evolve.empty\");\n }\n\n let output = `${i18n.t(\"evolve.menu_title\")}\\n\\n`;\n output += `${i18n.t(\"evolve.menu_intro\")}\\n\\n`;\n\n for (const s of suggestions) {\n output += `### โœจ ${s.name}\\n`;\n output += `- **${i18n.t(\"evolve.menu_type\")}**: ${formatCapabilityType(i18n, s.type)}\\n`;\n output += `- **${i18n.t(\"evolve.menu_reason\")}**: ${s.reason}\\n`;\n output += `- **${i18n.t(\"evolve.menu_pattern_id\")}**: \\`${s.pattern.id}\\`\\n\\n`;\n }\n\n output += `\\n${i18n.t(\"evolve.menu_footer\")}`;\n return output;\n },\n }),\n\n \"mimic:level\": tool({\n description: baseI18n.t(\"tool.level.description\"),\n args: {\n level: tool.schema\n .enum([\"technical\", \"semi-technical\", \"non-technical\", \"chaotic\"])\n .describe(baseI18n.t(\"tool.level.args.level\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n state.project.creatorLevel = args.level as CreatorLevel;\n await stateManager.save(state);\n\n const config = getLevelConfig(args.level as CreatorLevel);\n return i18n.t(\"level.set\", {\n level: formatLevelLabel(i18n, args.level),\n style: formatGreetingStyle(i18n, config.greetingStyle),\n detail: formatDetailLevel(i18n, config.detailLevel),\n });\n },\n }),\n\n \"mimic:focus\": tool({\n description: baseI18n.t(\"tool.focus.description\"),\n args: {\n focus: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.focus\")),\n stack: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.stack\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.focus) {\n state.project.focus = args.focus;\n await stateManager.addObservation(i18n.t(\"obs.focus_changed\", { focus: args.focus }));\n }\n if (args.stack) {\n state.project.stack = args.stack.split(\",\").map((s) => s.trim());\n }\n\n await stateManager.save(state);\n\n let output = `${i18n.t(\"focus.updated\")}\\n`;\n if (state.project.focus)\n output += `- **${i18n.t(\"focus.focus_label\")}**: ${state.project.focus}\\n`;\n if (state.project.stack?.length)\n output += `- **${i18n.t(\"focus.stack_label\")}**: ${state.project.stack.join(\", \")}\\n`;\n return output;\n },\n }),\n\n \"mimic:mcp-search\": tool({\n description: baseI18n.t(\"tool.mcp_search.description\"),\n args: {\n query: tool.schema.string().describe(baseI18n.t(\"tool.mcp_search.args.query\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const searchUrl = `https://mcpmarket.com/search?q=${encodeURIComponent(args.query)}`;\n const popular = [\n {\n name: \"context7\",\n desc: i18n.t(\"mcp_search.desc.context7\"),\n url: \"https://mcp.context7.com/mcp\",\n },\n {\n name: \"github\",\n desc: i18n.t(\"mcp_search.desc.github\"),\n url: \"https://mcp.github.com\",\n },\n {\n name: \"supabase\",\n desc: i18n.t(\"mcp_search.desc.supabase\"),\n url: \"https://mcp.supabase.com\",\n },\n { name: \"playwright\", desc: i18n.t(\"mcp_search.desc.playwright\") },\n { name: \"firecrawl\", desc: i18n.t(\"mcp_search.desc.firecrawl\") },\n ];\n const popularLines = popular\n .map((server) =>\n server.url\n ? `- **${server.name}** - ${server.desc}: \\`${server.url}\\``\n : `- **${server.name}** - ${server.desc}`,\n )\n .join(\"\\n\");\n return `${i18n.t(\"mcp_search.header\", {\n query: args.query,\n url: searchUrl,\n })}\\n\\n${i18n.t(\"mcp_search.popular\")}\\n${popularLines}\\n\\n${i18n.t(\"mcp_search.add\")}`;\n },\n }),\n\n \"mimic:mcp\": tool({\n description: baseI18n.t(\"tool.mcp.description\"),\n args: {\n name: tool.schema.string().describe(baseI18n.t(\"tool.mcp.args.name\")),\n url: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.url\")),\n command: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.command\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const { existsSync } = await import(\"node:fs\");\n const { readFile, writeFile: fsWriteFile, mkdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n const opencodeDir = join(directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(directory, \"opencode.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(await readFile(configPath, \"utf-8\"));\n } catch {\n config = {};\n }\n }\n\n const mcpEntry: Record<string, unknown> = {};\n if (args.url) {\n mcpEntry.type = \"remote\";\n mcpEntry.url = args.url;\n } else if (args.command) {\n mcpEntry.type = \"local\";\n mcpEntry.command = args.command.split(\",\").map((s) => s.trim());\n } else {\n return i18n.t(\"mcp.need_url_or_command\");\n }\n mcpEntry.enabled = true;\n\n config.mcp = { ...((config.mcp as Record<string, unknown>) || {}), [args.name]: mcpEntry };\n await fsWriteFile(configPath, JSON.stringify(config, null, 2));\n\n await stateManager.addMilestone(i18n.t(\"milestone.mcp_added\", { name: args.name }));\n\n return i18n.t(\"mcp.added\", { name: args.name });\n },\n }),\n\n \"mimic:capabilities\": tool({\n description: baseI18n.t(\"tool.capabilities.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.evolution.capabilities.length === 0) {\n return i18n.t(\"capabilities.empty\");\n }\n\n let output = `${i18n.t(\"capabilities.title\")}\\n\\n`;\n output += `${i18n.t(\"capabilities.intro\")}\\n\\n`;\n for (const cap of state.evolution.capabilities) {\n output += `### โœจ ${cap.name}\\n`;\n output += `- **${i18n.t(\"capabilities.type\")}**: ${formatCapabilityType(\n i18n,\n cap.type,\n )}\\n`;\n output += `- **${i18n.t(\"capabilities.description\")}**: ${cap.description}\\n`;\n output += `- **${i18n.t(\"capabilities.consumed\")}**: ${format(\n new Date(cap.createdAt),\n \"yyyy-MM-dd\",\n )}\\n\\n`;\n }\n return output;\n },\n }),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { StateManager } from \"@/state\";\nimport type { CapabilityType, EvolvedCapability, Pattern } from \"@/types\";\n\ninterface EvolutionSuggestion {\n type: CapabilityType;\n name: string;\n description: string;\n reason: string;\n pattern: Pattern;\n}\n\nfunction generateToolCode(name: string, description: string, pattern: Pattern): string {\n const funcName = name.replace(/-/g, \"_\");\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${funcName} = (plugin) => ({\n tool: {\n \"${name}\": {\n description: \"${description}\",\n args: {},\n async execute() {\n // TODO: Implement your logic here\n // This was generated from pattern: ${pattern.description}\n return \"๐Ÿ“ฆ ${name} executed!\";\n },\n },\n },\n});\n\nexport default ${funcName};\n`;\n}\n\nfunction generateHookCode(name: string, _description: string, pattern: Pattern): string {\n const filename = pattern.description;\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n if (event.type === \"file.edited\") {\n const filename = event.properties?.filename;\n if (filename?.includes(\"${filename}\")) {\n console.log(\"๐Ÿ“ฆ [Mimic] Detected change in watched file: ${filename}\");\n // TODO: Add your custom logic here\n }\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateSkillCode(name: string, description: string, pattern: Pattern): string {\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n // Auto-triggered skill: ${description}\n if (event.type === \"session.created\") {\n console.log(\"๐Ÿ“ฆ [Mimic] Skill ${name} activated\");\n // TODO: Implement automated behavior\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateMcpConfig(name: string, _description: string, pattern: Pattern): object {\n return {\n [name]: {\n type: \"local\",\n command: [\"echo\", `MCP server for ${pattern.description}`],\n enabled: false,\n },\n };\n}\n\nfunction generateAgentMarkdown(name: string, description: string, pattern: Pattern): string {\n return `---\ndescription: ${description}\nmode: subagent\ntools:\n read: true\n glob: true\n grep: true\n bash: false\n edit: false\n---\n\n# ๐Ÿ“ฆ ${name}\n\nAuto-generated by Mimic from pattern: ${pattern.description} (${pattern.count}x)\n\n## Focus Area\n\nThis agent specializes in tasks related to: ${pattern.description}\n\n## Context\n\n- Pattern detected: ${pattern.type}\n- Usage count: ${pattern.count}\n- First seen: ${new Date(pattern.firstSeen).toISOString()}\n\n## How To Help\n\nAnalyze and assist with tasks matching this pattern.\nProvide focused, expert guidance in this specific area.\n\n## Remember\n\n- Stay focused on the pattern's domain\n- Leverage the observed usage patterns\n- Adapt to the user's workflow\n`;\n}\n\ntype EvolutionOutput = { filePath: string; content: string };\n\nasync function readOpencodeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(configPath)) return {};\n\n try {\n const parsed = JSON.parse(await readFile(configPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nasync function buildMcpEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const opencodeDir = join(ctx.directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(ctx.directory, \"opencode.json\");\n const config = await readOpencodeConfig(configPath);\n const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);\n\n const mcp = { ...((config.mcp as Record<string, unknown>) || {}), ...mcpConfig };\n const content = JSON.stringify({ ...config, mcp }, null, 2);\n\n return { filePath: configPath, content };\n}\n\nasync function buildAgentEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const agentsDir = join(ctx.directory, \".opencode\", \"agents\");\n if (!existsSync(agentsDir)) {\n await mkdir(agentsDir, { recursive: true });\n }\n\n return {\n content: generateAgentMarkdown(suggestion.name, suggestion.description, suggestion.pattern),\n filePath: join(agentsDir, `${suggestion.name}.md`),\n };\n}\n\nfunction buildPluginContent(suggestion: EvolutionSuggestion): string {\n switch (suggestion.type) {\n case \"command\":\n case \"shortcut\":\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"hook\":\n return generateHookCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"skill\":\n return generateSkillCode(suggestion.name, suggestion.description, suggestion.pattern);\n default:\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n }\n}\n\nasync function buildPluginEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const pluginsDir = join(ctx.directory, \".opencode\", \"plugins\");\n if (!existsSync(pluginsDir)) {\n await mkdir(pluginsDir, { recursive: true });\n }\n\n return {\n content: buildPluginContent(suggestion),\n filePath: join(pluginsDir, `${suggestion.name}.js`),\n };\n}\n\nasync function buildEvolutionOutput(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n if (suggestion.type === \"mcp\") {\n return buildMcpEvolution(ctx, suggestion);\n }\n\n if (suggestion.type === \"agent\") {\n return buildAgentEvolution(ctx, suggestion);\n }\n\n return buildPluginEvolution(ctx, suggestion);\n}\n\nfunction createCapabilityFromSuggestion(suggestion: EvolutionSuggestion): EvolvedCapability {\n return {\n id: crypto.randomUUID(),\n type: suggestion.type,\n name: suggestion.name,\n description: suggestion.description,\n createdAt: new Date().toISOString(),\n fromPattern: suggestion.pattern.id,\n };\n}\n\nfunction updateEvolutionState(\n state: Awaited<ReturnType<StateManager[\"read\"]>>,\n capability: EvolvedCapability,\n suggestion: EvolutionSuggestion,\n): void {\n state.evolution.capabilities.push(capability);\n state.evolution.lastEvolution = new Date().toISOString();\n\n const pattern = state.patterns.find((p) => p.id === suggestion.pattern.id);\n if (pattern) {\n pattern.surfaced = true;\n }\n}\n\nexport function suggestEvolution(pattern: Pattern, ctx: MimicContext): EvolutionSuggestion | null {\n switch (pattern.type) {\n case \"tool\":\n if (pattern.count >= 10) {\n return {\n type: \"shortcut\",\n name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`,\n description: ctx.i18n.t(\"evolution.suggest.tool.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.tool.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"file\":\n if (pattern.count >= 5) {\n return {\n type: \"hook\",\n name: `watch-${pattern.description.split(\"/\").pop()?.replace(/\\./g, \"-\") || \"file\"}`,\n description: ctx.i18n.t(\"evolution.suggest.file.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.file.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"commit\":\n if (pattern.count >= 3) {\n return {\n type: \"command\",\n name: `commit-${pattern.description.slice(0, 20).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.commit.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.commit.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"sequence\":\n if (pattern.count >= 5) {\n return {\n type: \"agent\",\n name: `${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}-specialist`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.agent.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.agent.reason\", { count: pattern.count }),\n pattern,\n };\n }\n if (pattern.count >= 3) {\n return {\n type: \"skill\",\n name: `auto-${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.skill.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.skill.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n }\n\n return null;\n}\n\nexport async function getEvolutionSuggestions(ctx: MimicContext): Promise<EvolutionSuggestion[]> {\n const state = await ctx.stateManager.read();\n const suggestions: EvolutionSuggestion[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n\n const suggestion = suggestEvolution(pattern, ctx);\n if (suggestion) {\n suggestions.push(suggestion);\n }\n }\n\n return suggestions;\n}\n\nexport async function evolveCapability(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<{ capability: EvolvedCapability; filePath: string }> {\n const state = await ctx.stateManager.read();\n const { filePath, content } = await buildEvolutionOutput(ctx, suggestion);\n await writeFile(filePath, content, \"utf-8\");\n\n const capability = createCapabilityFromSuggestion(suggestion);\n updateEvolutionState(state, capability, suggestion);\n\n await ctx.stateManager.save(state);\n await ctx.stateManager.addMilestone(\n ctx.i18n.t(\"milestone.evolved\", {\n name: capability.name,\n type: formatCapabilityType(ctx.i18n, capability.type),\n }),\n );\n\n return { capability, filePath };\n}\n\nexport function formatEvolutionResult(\n ctx: MimicContext,\n capability: EvolvedCapability,\n filePath: string,\n): string {\n const typeLabel = formatCapabilityType(ctx.i18n, capability.type);\n let result = `### โœจ ${capability.name}\\n\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.type\")}**: ${typeLabel}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.description\")}**: ${capability.description}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.file\")}**: \\`${filePath}\\`\\n\\n`;\n result += `*${ctx.i18n.t(\"evolution.result.restart\", { type: typeLabel })}*\\n\\n`;\n\n switch (capability.type) {\n case \"command\":\n case \"shortcut\":\n result += `${ctx.i18n.t(\"evolution.result.command\", { name: capability.name })}\\n`;\n break;\n\n case \"hook\":\n result += `${ctx.i18n.t(\"evolution.result.hook\")}\\n`;\n break;\n\n case \"skill\":\n result += `${ctx.i18n.t(\"evolution.result.skill\")}\\n`;\n break;\n\n case \"agent\":\n result += `${ctx.i18n.t(\"evolution.result.agent\", { name: capability.name })}\\n`;\n break;\n\n case \"mcp\":\n result += `${ctx.i18n.t(\"evolution.result.mcp\", { name: capability.name })}\\n`;\n break;\n }\n\n return result;\n}\n","import type { I18n } from \"@/i18n\";\nimport type { CreatorLevel, State } from \"@/types\";\n\ninterface LevelConfig {\n greetingStyle: \"formal\" | \"casual\" | \"minimal\" | \"chaotic\";\n detailLevel: \"high\" | \"medium\" | \"low\";\n useEmoji: boolean;\n technicalTerms: boolean;\n}\n\nconst LEVEL_CONFIGS: Record<CreatorLevel, LevelConfig> = {\n technical: {\n greetingStyle: \"minimal\",\n detailLevel: \"high\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"semi-technical\": {\n greetingStyle: \"casual\",\n detailLevel: \"medium\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"non-technical\": {\n greetingStyle: \"formal\",\n detailLevel: \"low\",\n useEmoji: true,\n technicalTerms: false,\n },\n chaotic: {\n greetingStyle: \"chaotic\",\n detailLevel: \"medium\",\n useEmoji: true,\n technicalTerms: true,\n },\n};\n\nexport function getLevelConfig(level: CreatorLevel | null): LevelConfig {\n return LEVEL_CONFIGS[level ?? \"technical\"];\n}\n\nexport function adaptMessage(message: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (config.greetingStyle === \"minimal\") {\n return message.replace(/^#+\\s*/gm, \"\").trim();\n }\n\n if (config.greetingStyle === \"chaotic\") {\n const chaosEmojis = [\"๐Ÿ”ฅ\", \"โšก\", \"๐Ÿš€\", \"๐Ÿ’ฅ\", \"โœจ\"];\n const emoji = chaosEmojis[Math.floor(Math.random() * chaosEmojis.length)];\n return `${emoji} ${message}`;\n }\n\n return message;\n}\n\nexport function formatGreeting(i18n: I18n, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n const name = state.project.name;\n\n switch (config.greetingStyle) {\n case \"minimal\":\n return i18n.t(\"level.greeting.minimal\", {\n project: name,\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n });\n case \"casual\":\n return i18n.t(\"level.greeting.casual\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"formal\":\n return i18n.t(\"level.greeting.formal\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"chaotic\": {\n const greetings = [\n i18n.t(\"level.greeting.chaotic.chomp\"),\n i18n.t(\"level.greeting.chaotic.lid_creaks\"),\n i18n.t(\"level.greeting.chaotic.teeth_gleam\"),\n i18n.t(\"level.greeting.chaotic.tongue_flicks\"),\n ];\n const g = greetings[Math.floor(Math.random() * greetings.length)];\n return i18n.t(\"level.greeting.chaotic.template\", {\n tag: g,\n project: name,\n sessions: state.journey.sessionCount,\n });\n }\n }\n}\n\nexport function formatSuggestion(i18n: I18n, suggestion: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (!config.technicalTerms) {\n const replacements: Array<[string, string]> = [\n [i18n.t(\"level.term.tool\"), i18n.t(\"level.term.shortcut\")],\n [i18n.t(\"level.term.pattern\"), i18n.t(\"level.term.habit\")],\n [i18n.t(\"level.term.hook\"), i18n.t(\"level.term.automation\")],\n ];\n let result = suggestion;\n for (const [from, to] of replacements) {\n if (!from || from === to) continue;\n const escaped = from.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(escaped, \"gi\"), to);\n }\n return result;\n }\n\n return suggestion;\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport type { Event } from \"@opencode-ai/sdk\";\nimport type { MimicContext } from \"@/context\";\nimport { analyzeTimeSinceLastSession, formatDuration } from \"@/format\";\nimport { createI18n, loadMimicConfig, resolveLanguage } from \"@/i18n\";\nimport { detectPatterns, surfacePatterns } from \"@/patterns\";\nimport { StateManager } from \"@/state\";\nimport { createTools } from \"@/tools\";\nimport type { ToolCall } from \"@/types\";\n\nexport const mimic: Plugin = async ({ directory, client }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const ctx: MimicContext = { stateManager, directory, i18n, client };\n\n const sessionId = crypto.randomUUID();\n const sessionStartTime = Date.now();\n const toolCalls: ToolCall[] = [];\n const filesEdited: Set<string> = new Set();\n\n const handleSessionCreated = async () => {\n const state = await stateManager.read();\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n\n state.statistics.totalSessions += 1;\n state.statistics.lastSessionId = sessionId;\n state.journey.sessionCount += 1;\n state.journey.lastSession = new Date().toISOString();\n\n await stateManager.save(state);\n\n if (timeSince === \"long-break\") {\n await stateManager.addObservation(i18n.t(\"obs.returned_after_long_break\"));\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n }),\n variant: \"info\",\n },\n });\n };\n\n const handleSessionIdle = async () => {\n const newPatterns = await detectPatterns(ctx);\n if (newPatterns.length > 0) {\n const state = await stateManager.read();\n state.patterns.push(...newPatterns);\n await stateManager.save(state);\n }\n\n const suggestions = await surfacePatterns(ctx);\n for (const suggestion of suggestions) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: suggestion,\n variant: \"info\",\n },\n });\n }\n };\n\n const handleFileEdited = async (event: Event) => {\n if (!(\"properties\" in event)) return;\n\n const filename = (event.properties as { filename?: string })?.filename;\n if (!filename) return;\n\n filesEdited.add(filename);\n const state = await stateManager.read();\n state.statistics.filesModified[filename] = (state.statistics.filesModified[filename] || 0) + 1;\n await stateManager.save(state);\n };\n\n return {\n async event({ event }: { event: Event }) {\n switch (event.type) {\n case \"session.created\":\n await handleSessionCreated();\n return;\n case \"session.idle\":\n await handleSessionIdle();\n return;\n case \"file.edited\":\n await handleFileEdited(event);\n }\n },\n\n async \"tool.execute.after\"(\n input: { tool: string; sessionID: string; callID: string },\n _output: { title: string; output: string; metadata: unknown },\n ) {\n const state = await stateManager.read();\n if (!state.preferences.learningEnabled) return;\n\n const toolCall: ToolCall = {\n tool: input.tool,\n callID: input.callID,\n timestamp: Date.now(),\n };\n\n toolCalls.push(toolCall);\n state.statistics.totalToolCalls += 1;\n\n const toolPattern = input.tool;\n const existing = state.patterns.find(\n (p) => p.type === \"tool\" && p.description === toolPattern,\n );\n if (existing) {\n existing.count += 1;\n existing.lastSeen = Date.now();\n } else {\n state.patterns.push({\n id: crypto.randomUUID(),\n type: \"tool\",\n description: toolPattern,\n count: 1,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [toolCall],\n });\n }\n\n await stateManager.save(state);\n },\n\n async stop() {\n const sessionDuration = Date.now() - sessionStartTime;\n\n const sessionData = {\n sessionId,\n startTime: new Date(sessionStartTime).toISOString(),\n endTime: new Date().toISOString(),\n durationMs: sessionDuration,\n toolCalls: toolCalls.length,\n filesEdited: Array.from(filesEdited),\n };\n\n await stateManager.saveSession(sessionId, sessionData);\n\n if (toolCalls.length > 20) {\n await stateManager.addObservation(\n i18n.t(\"obs.intensive_session\", { tools: toolCalls.length }),\n );\n }\n if (filesEdited.size > 10) {\n await stateManager.addMilestone(\n i18n.t(\"milestone.major_refactor\", { files: filesEdited.size }),\n );\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\n }),\n variant: \"info\",\n },\n });\n },\n\n tool: createTools(stateManager, directory, toolCalls, i18n),\n };\n};\n\nexport default mimic;\n"],"mappings":"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","names":["existsSync","readFile","join","writeFile","format","existsSync","mkdir","readFile","writeFile","join","existsSync","readFile","join","mkdir","writeFile","i18n","format","writeFile","suggestions","existsSync","readFile","mkdir","join"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-plugin-mimic",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "An OpenCode plugin that learns from your patterns and adapts to your workflow. Mimic watches how you work, remembers across sessions, and suggests actions based on what you do repeatedly.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -64,7 +64,6 @@
64
64
  "build": "tsup",
65
65
  "dev": "tsup --watch",
66
66
  "test": "vitest",
67
- "test:coverage": "vitest run --coverage",
68
- "prepublishOnly": "pnpm run build"
67
+ "test:coverage": "vitest run --coverage"
69
68
  }
70
- }
69
+ }