opencode-plugin-mimic 0.1.3 → 0.1.5
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 +67 -10
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
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(
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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 [];
|
|
@@ -716,6 +719,7 @@ async function surfacePatterns(ctx) {
|
|
|
716
719
|
import { existsSync as existsSync2 } from "fs";
|
|
717
720
|
import { mkdir, readFile as readFile2, writeFile } from "fs/promises";
|
|
718
721
|
import { join as join2 } from "path";
|
|
722
|
+
var STATE_JSON_GITIGNORE_LINE = ".opencode/mimic/state.json";
|
|
719
723
|
var createDefaultState = (projectName) => ({
|
|
720
724
|
version: "0.1.0",
|
|
721
725
|
project: {
|
|
@@ -760,7 +764,21 @@ var StateManager = class {
|
|
|
760
764
|
this.sessionsDir = join2(this.mimicDir, "sessions");
|
|
761
765
|
this.projectName = directory.split("/").pop() || "unknown";
|
|
762
766
|
}
|
|
767
|
+
async ensureGitIgnore() {
|
|
768
|
+
const gitIgnorePath = join2(this.mimicDir, "..", "..", ".gitignore");
|
|
769
|
+
if (!existsSync2(gitIgnorePath)) {
|
|
770
|
+
await writeFile(gitIgnorePath, STATE_JSON_GITIGNORE_LINE + "\n", "utf-8");
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
const content = await readFile2(gitIgnorePath, "utf-8");
|
|
774
|
+
const lines = content.split(/\r?\n/);
|
|
775
|
+
const alreadyExists = lines.some((line) => line.trim() === STATE_JSON_GITIGNORE_LINE);
|
|
776
|
+
if (!alreadyExists) {
|
|
777
|
+
await writeFile(gitIgnorePath, content + "\n" + STATE_JSON_GITIGNORE_LINE + "\n", "utf-8");
|
|
778
|
+
}
|
|
779
|
+
}
|
|
763
780
|
async initialize() {
|
|
781
|
+
await this.ensureGitIgnore();
|
|
764
782
|
if (!existsSync2(this.mimicDir)) {
|
|
765
783
|
await mkdir(this.mimicDir, { recursive: true });
|
|
766
784
|
}
|
|
@@ -819,6 +837,45 @@ import { format as format2 } from "date-fns";
|
|
|
819
837
|
import { existsSync as existsSync3 } from "fs";
|
|
820
838
|
import { mkdir as mkdir2, readFile as readFile3, writeFile as writeFile2 } from "fs/promises";
|
|
821
839
|
import { join as join3 } from "path";
|
|
840
|
+
var BUILTIN_TOOLS = /* @__PURE__ */ new Set([
|
|
841
|
+
"read",
|
|
842
|
+
"write",
|
|
843
|
+
"edit",
|
|
844
|
+
"bash",
|
|
845
|
+
"grep",
|
|
846
|
+
"glob",
|
|
847
|
+
"serena_list_dir",
|
|
848
|
+
"serena_find_file",
|
|
849
|
+
"serena_search_for_pattern",
|
|
850
|
+
"serena_get_symbols_overview",
|
|
851
|
+
"serena_find_symbol",
|
|
852
|
+
"serena_find_referencing_symbols",
|
|
853
|
+
"serena_replace_symbol_body",
|
|
854
|
+
"serena_insert_after_symbol",
|
|
855
|
+
"serena_insert_before_symbol",
|
|
856
|
+
"serena_replace_content",
|
|
857
|
+
"serena_rename_symbol",
|
|
858
|
+
"lsp_diagnostics",
|
|
859
|
+
"lsp_goto_definition",
|
|
860
|
+
"lsp_find_references",
|
|
861
|
+
"lsp_prepare_rename",
|
|
862
|
+
"lsp_rename",
|
|
863
|
+
"lsp_symbols",
|
|
864
|
+
"delegate_task",
|
|
865
|
+
"task",
|
|
866
|
+
"question",
|
|
867
|
+
"background_cancel",
|
|
868
|
+
"background_output",
|
|
869
|
+
"skill",
|
|
870
|
+
"slashcommand",
|
|
871
|
+
"use_skill",
|
|
872
|
+
"find_skills",
|
|
873
|
+
"session_list",
|
|
874
|
+
"session_read",
|
|
875
|
+
"session_search",
|
|
876
|
+
"session_info",
|
|
877
|
+
"mimic:"
|
|
878
|
+
]);
|
|
822
879
|
function generateToolCode(name, description, pattern) {
|
|
823
880
|
const funcName = name.replace(/-/g, "_");
|
|
824
881
|
return `// \u{1F4E6} Auto-generated by Mimic
|
|
@@ -947,11 +1004,7 @@ async function buildMcpEvolution(ctx, suggestion) {
|
|
|
947
1004
|
}
|
|
948
1005
|
const configPath = join3(ctx.directory, "opencode.json");
|
|
949
1006
|
const config = await readOpencodeConfig(configPath);
|
|
950
|
-
const mcpConfig = generateMcpConfig(
|
|
951
|
-
suggestion.name,
|
|
952
|
-
suggestion.description,
|
|
953
|
-
suggestion.pattern
|
|
954
|
-
);
|
|
1007
|
+
const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);
|
|
955
1008
|
const mcp = { ...config.mcp || {}, ...mcpConfig };
|
|
956
1009
|
const content = JSON.stringify({ ...config, mcp }, null, 2);
|
|
957
1010
|
return { filePath: configPath, content };
|
|
@@ -1020,6 +1073,10 @@ function suggestEvolution(pattern, ctx) {
|
|
|
1020
1073
|
switch (pattern.type) {
|
|
1021
1074
|
case "tool":
|
|
1022
1075
|
if (pattern.count >= 10) {
|
|
1076
|
+
const toolName = pattern.description;
|
|
1077
|
+
if (BUILTIN_TOOLS.has(toolName)) {
|
|
1078
|
+
return null;
|
|
1079
|
+
}
|
|
1023
1080
|
return {
|
|
1024
1081
|
type: "shortcut",
|
|
1025
1082
|
name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, "-")}`,
|
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":"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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"]}
|
|
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\nconst STATE_JSON_GITIGNORE_LINE = \".opencode/mimic/state.json\";\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 private async ensureGitIgnore(): Promise<void> {\n const gitIgnorePath = join(this.mimicDir, \"..\", \"..\", \".gitignore\");\n\n if (!existsSync(gitIgnorePath)) {\n await writeFile(gitIgnorePath, STATE_JSON_GITIGNORE_LINE + \"\\n\", \"utf-8\");\n return;\n }\n\n const content = await readFile(gitIgnorePath, \"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const alreadyExists = lines.some((line) => line.trim() === STATE_JSON_GITIGNORE_LINE);\n\n if (!alreadyExists) {\n await writeFile(gitIgnorePath, content + \"\\n\" + STATE_JSON_GITIGNORE_LINE + \"\\n\", \"utf-8\");\n }\n }\n\n async initialize(): Promise<void> {\n await this.ensureGitIgnore();\n\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\nconst BUILTIN_TOOLS = new Set([\n \"read\",\n \"write\",\n \"edit\",\n \"bash\",\n \"grep\",\n \"glob\",\n \"serena_list_dir\",\n \"serena_find_file\",\n \"serena_search_for_pattern\",\n \"serena_get_symbols_overview\",\n \"serena_find_symbol\",\n \"serena_find_referencing_symbols\",\n \"serena_replace_symbol_body\",\n \"serena_insert_after_symbol\",\n \"serena_insert_before_symbol\",\n \"serena_replace_content\",\n \"serena_rename_symbol\",\n \"lsp_diagnostics\",\n \"lsp_goto_definition\",\n \"lsp_find_references\",\n \"lsp_prepare_rename\",\n \"lsp_rename\",\n \"lsp_symbols\",\n \"delegate_task\",\n \"task\",\n \"question\",\n \"background_cancel\",\n \"background_output\",\n \"skill\",\n \"slashcommand\",\n \"use_skill\",\n \"find_skills\",\n \"session_list\",\n \"session_read\",\n \"session_search\",\n \"session_info\",\n \"mimic:\",\n]);\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 const toolName = pattern.description;\n if (BUILTIN_TOOLS.has(toolName)) {\n return null;\n }\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
|
+
"version": "0.1.5",
|
|
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
|
+
}
|