opencode-plugin-mimic 0.1.0 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -98,71 +98,6 @@ Mimic은 다음 도구들을 제공합니다:
98
98
  > - `mimic:mcp`는 **프로젝트 루트**의 `opencode.json`에 MCP 설정을 추가합니다.
99
99
  > - `mimic:level`은 상태에 저장되어 개인화에 사용됩니다.
100
100
 
101
- ## 상태 구조
102
-
103
- ```
104
- your-project/
105
- ├── .opencode/
106
- │ └── mimic/
107
- │ ├── state.json # 메인 상태 파일
108
- │ └── sessions/ # 세션별 기록
109
- │ └── {session-id}.json
110
- └── opencode.json
111
- ```
112
-
113
- ### state.json 예시
114
-
115
- ```json
116
- {
117
- "version": "0.3.0",
118
- "project": {
119
- "name": "your-project",
120
- "creatorLevel": null,
121
- "firstSession": 1705940400000,
122
- "stack": ["node", "typescript"],
123
- "focus": "auth refactor"
124
- },
125
- "journey": {
126
- "observations": [
127
- { "observation": "Intensive session with 25 tool calls", "timestamp": "..." }
128
- ],
129
- "milestones": [
130
- { "milestone": "Major refactoring session: 15 files edited", "timestamp": "..." }
131
- ],
132
- "sessionCount": 10,
133
- "lastSession": "2026-01-22T12:00:00.000Z"
134
- },
135
- "patterns": [
136
- {
137
- "id": "uuid",
138
- "type": "tool",
139
- "description": "Read",
140
- "count": 50,
141
- "firstSeen": 1705940400000,
142
- "lastSeen": 1706026800000,
143
- "surfaced": false,
144
- "examples": [{ "tool": "read", "callID": "abc", "timestamp": 1706026800000 }]
145
- }
146
- ],
147
- "evolution": {
148
- "capabilities": [],
149
- "lastEvolution": null,
150
- "pendingSuggestions": []
151
- },
152
- "preferences": {
153
- "learningEnabled": true,
154
- "suggestionEnabled": true,
155
- "minPatternCount": 3
156
- },
157
- "statistics": {
158
- "totalSessions": 10,
159
- "totalToolCalls": 250,
160
- "filesModified": { "src/index.ts": 15 },
161
- "lastSessionId": null
162
- }
163
- }
164
- ```
165
-
166
101
  ## 패턴 임계치
167
102
 
168
103
  | 패턴 유형 | 임계치 | 결과 |
package/README.md CHANGED
@@ -190,71 +190,6 @@ Add an MCP server configuration to the **project-level** `opencode.json`.
190
190
 
191
191
  List all evolved capabilities.
192
192
 
193
- ## State Structure
194
-
195
- ```
196
- your-project/
197
- ├── .opencode/
198
- │ └── mimic/
199
- │ ├── state.json # Main state file
200
- │ └── sessions/ # Individual session records
201
- │ └── {session-id}.json
202
- └── opencode.json
203
- ```
204
-
205
- ### state.json
206
-
207
- ```json
208
- {
209
- "version": "0.3.0",
210
- "project": {
211
- "name": "your-project",
212
- "creatorLevel": null,
213
- "firstSession": 1705940400000,
214
- "stack": ["node", "typescript"],
215
- "focus": "auth refactor"
216
- },
217
- "journey": {
218
- "observations": [
219
- { "observation": "Intensive session with 25 tool calls", "timestamp": "..." }
220
- ],
221
- "milestones": [
222
- { "milestone": "Major refactoring session: 15 files edited", "timestamp": "..." }
223
- ],
224
- "sessionCount": 10,
225
- "lastSession": "2026-01-22T12:00:00.000Z"
226
- },
227
- "patterns": [
228
- {
229
- "id": "uuid",
230
- "type": "tool",
231
- "description": "Read",
232
- "count": 50,
233
- "firstSeen": 1705940400000,
234
- "lastSeen": 1706026800000,
235
- "surfaced": false,
236
- "examples": [{ "tool": "read", "callID": "abc", "timestamp": 1706026800000 }]
237
- }
238
- ],
239
- "evolution": {
240
- "capabilities": [],
241
- "lastEvolution": null,
242
- "pendingSuggestions": []
243
- },
244
- "preferences": {
245
- "learningEnabled": true,
246
- "suggestionEnabled": true,
247
- "minPatternCount": 3
248
- },
249
- "statistics": {
250
- "totalSessions": 10,
251
- "totalToolCalls": 250,
252
- "filesModified": { "src/index.ts": 15 },
253
- "lastSessionId": null
254
- }
255
- }
256
- ```
257
-
258
193
  ## Pattern Thresholds
259
194
 
260
195
  | Pattern Type | Threshold | Result |
package/dist/index.js CHANGED
@@ -600,11 +600,14 @@ function getGitHistory(directory, limit = 50) {
600
600
  }
601
601
  function getRecentlyModifiedFiles(directory) {
602
602
  try {
603
- const result = execSync("git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only", {
604
- cwd: directory,
605
- encoding: "utf-8",
606
- stdio: ["pipe", "pipe", "pipe"]
607
- });
603
+ const result = execSync(
604
+ "git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only",
605
+ {
606
+ cwd: directory,
607
+ encoding: "utf-8",
608
+ stdio: ["pipe", "pipe", "pipe"]
609
+ }
610
+ );
608
611
  return result.trim().split("\n").filter(Boolean);
609
612
  } catch {
610
613
  return [];
@@ -947,11 +950,7 @@ async function buildMcpEvolution(ctx, suggestion) {
947
950
  }
948
951
  const configPath = join3(ctx.directory, "opencode.json");
949
952
  const config = await readOpencodeConfig(configPath);
950
- const mcpConfig = generateMcpConfig(
951
- suggestion.name,
952
- suggestion.description,
953
- suggestion.pattern
954
- );
953
+ const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);
955
954
  const mcp = { ...config.mcp || {}, ...mcpConfig };
956
955
  const content = JSON.stringify({ ...config, mcp }, null, 2);
957
956
  return { filePath: configPath, content };
@@ -1657,11 +1656,11 @@ ${i18n2.t("mcp_search.add")}`;
1657
1656
  }
1658
1657
 
1659
1658
  // src/index.ts
1660
- var mimic = async ({ directory }) => {
1659
+ var mimic = async ({ directory, client }) => {
1661
1660
  const stateManager = new StateManager(directory);
1662
1661
  await stateManager.initialize();
1663
1662
  const i18n = createI18n(resolveLanguage(await loadMimicConfig()));
1664
- const ctx = { stateManager, directory, i18n };
1663
+ const ctx = { stateManager, directory, i18n, client };
1665
1664
  const sessionId = crypto.randomUUID();
1666
1665
  const sessionStartTime = Date.now();
1667
1666
  const toolCalls = [];
@@ -1677,12 +1676,15 @@ var mimic = async ({ directory }) => {
1677
1676
  if (timeSince === "long-break") {
1678
1677
  await stateManager.addObservation(i18n.t("obs.returned_after_long_break"));
1679
1678
  }
1680
- console.log(
1681
- i18n.t("log.session_started", {
1682
- sessions: state.journey.sessionCount,
1683
- patterns: state.patterns.length
1684
- })
1685
- );
1679
+ await client.tui.showToast({
1680
+ body: {
1681
+ message: i18n.t("log.session_started", {
1682
+ sessions: state.journey.sessionCount,
1683
+ patterns: state.patterns.length
1684
+ }),
1685
+ variant: "info"
1686
+ }
1687
+ });
1686
1688
  };
1687
1689
  const handleSessionIdle = async () => {
1688
1690
  const newPatterns = await detectPatterns(ctx);
@@ -1693,7 +1695,13 @@ var mimic = async ({ directory }) => {
1693
1695
  }
1694
1696
  const suggestions = await surfacePatterns(ctx);
1695
1697
  for (const suggestion of suggestions) {
1696
- console.log(`[Mimic] ${suggestion}`);
1698
+ await client.tui.showToast({
1699
+ body: {
1700
+ title: "[Mimic]",
1701
+ message: suggestion,
1702
+ variant: "info"
1703
+ }
1704
+ });
1697
1705
  }
1698
1706
  };
1699
1707
  const handleFileEdited = async (event) => {
@@ -1770,13 +1778,16 @@ var mimic = async ({ directory }) => {
1770
1778
  i18n.t("milestone.major_refactor", { files: filesEdited.size })
1771
1779
  );
1772
1780
  }
1773
- console.log(
1774
- i18n.t("log.session_ended", {
1775
- duration: formatDuration(sessionDuration),
1776
- tools: toolCalls.length,
1777
- files: filesEdited.size
1778
- })
1779
- );
1781
+ await client.tui.showToast({
1782
+ body: {
1783
+ message: i18n.t("log.session_ended", {
1784
+ duration: formatDuration(sessionDuration),
1785
+ tools: toolCalls.length,
1786
+ files: filesEdited.size
1787
+ }),
1788
+ variant: "info"
1789
+ }
1790
+ });
1780
1791
  },
1781
1792
  tool: createTools(stateManager, directory, toolCalls, i18n)
1782
1793
  };
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 }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const ctx: MimicContext = { stateManager, directory, i18n };\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 console.log(\n i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\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 console.log(`[Mimic] ${suggestion}`);\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 console.log(\n i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\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\nexport const createDefaultState = (projectName: string): State => ({\n version: \"0.1.0\",\n project: {\n name: projectName,\n creatorLevel: null,\n firstSession: Date.now(),\n stack: [],\n focus: undefined,\n },\n journey: {\n observations: [],\n milestones: [],\n sessionCount: 0,\n lastSession: null,\n },\n patterns: [],\n evolution: {\n capabilities: [],\n lastEvolution: null,\n pendingSuggestions: [],\n },\n preferences: {\n suggestionEnabled: true,\n learningEnabled: true,\n minPatternCount: 3,\n },\n statistics: {\n totalSessions: 0,\n totalToolCalls: 0,\n filesModified: {},\n lastSessionId: null,\n },\n});\n\nexport class StateManager {\n private readonly mimicDir: string;\n private readonly statePath: string;\n private readonly sessionsDir: string;\n private readonly projectName: string;\n\n constructor(directory: string) {\n this.mimicDir = join(directory, \".opencode\", \"mimic\");\n this.statePath = join(this.mimicDir, \"state.json\");\n this.sessionsDir = join(this.mimicDir, \"sessions\");\n this.projectName = directory.split(\"/\").pop() || \"unknown\";\n }\n\n async initialize(): Promise<void> {\n if (!existsSync(this.mimicDir)) {\n await mkdir(this.mimicDir, { recursive: true });\n }\n if (!existsSync(this.sessionsDir)) {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n if (!existsSync(this.statePath)) {\n await this.save(createDefaultState(this.projectName));\n }\n }\n\n async read(): Promise<State> {\n return JSON.parse(await readFile(this.statePath, \"utf-8\"));\n }\n\n async save(state: State): Promise<void> {\n await writeFile(this.statePath, JSON.stringify(state, null, 2));\n }\n\n async addObservation(observation: string): Promise<void> {\n const state = await this.read();\n state.journey.observations.push({\n observation,\n timestamp: new Date().toISOString(),\n });\n if (state.journey.observations.length > 100) {\n state.journey.observations = state.journey.observations.slice(-100);\n }\n await this.save(state);\n }\n\n async addMilestone(milestone: string): Promise<void> {\n const state = await this.read();\n state.journey.milestones.push({\n milestone,\n timestamp: new Date().toISOString(),\n });\n await this.save(state);\n }\n\n async saveSession(sessionId: string, data: Record<string, unknown>): Promise<void> {\n await writeFile(join(this.sessionsDir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n }\n\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n getProjectName(): string {\n return this.projectName;\n }\n\n getStatePath(): string {\n return this.statePath;\n }\n}\n","import { readdir, writeFile } from \"node:fs/promises\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { evolveCapability, formatEvolutionResult, getEvolutionSuggestions } from \"@/evolution\";\nimport { analyzeTimeSinceLastSession, formatGrowAnalysis, formatJourney } from \"@/format\";\nimport { getGitHistory, getRecentlyModifiedFiles } from \"@/git\";\nimport {\n createI18n,\n formatCapabilityType,\n formatDetailLevel,\n formatGreetingStyle,\n formatLevelLabel,\n formatPatternType,\n type I18n,\n loadMimicConfig,\n resolveLanguage,\n} from \"@/i18n\";\nimport { getLevelConfig } from \"@/level\";\nimport { surfacePatterns } from \"@/patterns\";\nimport { createDefaultState, type StateManager } from \"@/state\";\nimport type { CreatorLevel, Pattern, ToolCall } from \"@/types\";\n\nexport function createTools(\n stateManager: StateManager,\n directory: string,\n toolCalls: ToolCall[],\n i18n?: I18n,\n): Record<string, ToolDefinition> {\n const baseI18n = i18n ?? createI18n(resolveLanguage(null));\n const i18nPromise = i18n\n ? Promise.resolve(i18n)\n : loadMimicConfig()\n .then((config) => createI18n(resolveLanguage(config)))\n .catch(() => createI18n(resolveLanguage(null)));\n\n return {\n \"mimic:init\": tool({\n description: baseI18n.t(\"tool.init.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const isFirstTime = state.journey.sessionCount <= 1;\n\n if (isFirstTime) {\n return i18n.t(\"init.first_time\", { project: state.project.name });\n }\n\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n const recentObs = state.journey.observations.slice(-3);\n\n let greeting = `${i18n.t(\"init.returning.header\")}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.welcome\", { project: state.project.name })}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.stats\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n })}\\n\\n`;\n\n if (timeSince === \"long-break\") {\n greeting += `${i18n.t(\"init.returning.long_break\")}\\n\\n`;\n }\n\n if (recentObs.length > 0) {\n greeting += `${i18n.t(\"init.returning.recent_obs_title\")}\\n`;\n for (const o of recentObs) {\n greeting += `- ${o.observation}\\n`;\n }\n }\n\n return greeting;\n },\n }),\n\n \"mimic:status\": tool({\n description: baseI18n.t(\"tool.status.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const recentFiles = getRecentlyModifiedFiles(directory);\n const gitHistory = getGitHistory(directory, 5);\n\n let output = `${i18n.t(\"status.title\", { project: state.project.name })}\\n\\n`;\n output += `${i18n.t(\"status.session\", { count: state.journey.sessionCount })}\\n`;\n output += `${i18n.t(\"status.patterns\", {\n total: state.patterns.length,\n surfaced: state.patterns.filter((p) => p.surfaced).length,\n })}\\n`;\n output += `${i18n.t(\"status.tool_calls\", { count: toolCalls.length })}\\n\\n`;\n\n if (recentFiles.length > 0) {\n output += `${i18n.t(\"status.recent_files\")}\\n`;\n for (const f of recentFiles.slice(0, 5)) {\n output += `- ${f}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${i18n.t(\"status.recent_commits\")}\\n`;\n for (const c of gitHistory) {\n output += `- ${c}\\n`;\n }\n }\n\n const suggestions = await surfacePatterns(ctx);\n if (suggestions.length > 0) {\n output += `\\n${i18n.t(\"status.suggestions\")}\\n`;\n for (const s of suggestions) {\n output += `- ${s}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:journey\": tool({\n description: baseI18n.t(\"tool.journey.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 10);\n return formatJourney(ctx, state, gitHistory);\n },\n }),\n\n \"mimic:patterns\": tool({\n description: baseI18n.t(\"tool.patterns.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.patterns.length === 0) {\n return i18n.t(\"patterns.none\");\n }\n\n let output = `${i18n.t(\"patterns.title\")}\\n\\n`;\n output += `${i18n.t(\"patterns.total\", { count: state.patterns.length })}\\n\\n`;\n\n const byType = new Map<string, Pattern[]>();\n for (const p of state.patterns) {\n const list = byType.get(p.type) || [];\n list.push(p);\n byType.set(p.type, list);\n }\n\n for (const [type, patterns] of byType) {\n output += `${i18n.t(\"patterns.section\", {\n type: formatPatternType(i18n, type),\n })}\\n`;\n for (const p of patterns.slice(0, 10)) {\n const status = p.surfaced ? \"✓\" : \"○\";\n output += `${status} **${p.description}** (${p.count}x)\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:observe\": tool({\n description: baseI18n.t(\"tool.observe.description\"),\n args: {\n observation: tool.schema.string().describe(baseI18n.t(\"tool.observe.args.observation\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addObservation(args.observation);\n return i18n.t(\"observe.recorded\", { observation: args.observation });\n },\n }),\n\n \"mimic:milestone\": tool({\n description: baseI18n.t(\"tool.milestone.description\"),\n args: {\n milestone: tool.schema.string().describe(baseI18n.t(\"tool.milestone.args.milestone\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addMilestone(args.milestone);\n return i18n.t(\"milestone.recorded\", { milestone: args.milestone });\n },\n }),\n\n \"mimic:stats\": tool({\n description: baseI18n.t(\"tool.stats.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sessionFiles = await readdir(stateManager.getSessionsDir()).catch(() => []);\n\n return `## ${i18n.t(\"stats.title\")}\n\n- **${i18n.t(\"stats.version\")}**: ${state.version}\n- **${i18n.t(\"stats.total_sessions\")}**: ${state.statistics.totalSessions}\n- **${i18n.t(\"stats.total_tool_calls\")}**: ${state.statistics.totalToolCalls}\n- **${i18n.t(\"stats.patterns_detected\")}**: ${state.patterns.length}\n- **${i18n.t(\"stats.milestones\")}**: ${state.journey.milestones.length}\n- **${i18n.t(\"stats.observations\")}**: ${state.journey.observations.length}\n- **${i18n.t(\"stats.session_records\")}**: ${sessionFiles.length}\n- **${i18n.t(\"stats.first_session\")}**: ${format(state.project.firstSession, \"yyyy-MM-dd HH:mm:ss\")}\n- **${i18n.t(\"stats.learning_enabled\")}**: ${state.preferences.learningEnabled}\n- **${i18n.t(\"stats.suggestions_enabled\")}**: ${state.preferences.suggestionEnabled}`;\n },\n }),\n\n \"mimic:configure\": tool({\n description: baseI18n.t(\"tool.configure.description\"),\n args: {\n learningEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.learningEnabled\")),\n suggestionEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.suggestionEnabled\")),\n minPatternCount: tool.schema\n .number()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.minPatternCount\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.learningEnabled !== undefined) {\n state.preferences.learningEnabled = args.learningEnabled;\n }\n if (args.suggestionEnabled !== undefined) {\n state.preferences.suggestionEnabled = args.suggestionEnabled;\n }\n if (args.minPatternCount !== undefined) {\n state.preferences.minPatternCount = args.minPatternCount;\n }\n\n await stateManager.save(state);\n return `${i18n.t(\"configure.updated\")}\\n${JSON.stringify(state.preferences, null, 2)}`;\n },\n }),\n\n \"mimic:surface\": tool({\n description: baseI18n.t(\"tool.surface.description\"),\n args: {\n patternId: tool.schema.string().describe(baseI18n.t(\"tool.surface.args.patternId\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const pattern = state.patterns.find((p) => p.id === args.patternId);\n if (!pattern) {\n return i18n.t(\"surface.not_found\", { id: args.patternId });\n }\n pattern.surfaced = true;\n await stateManager.save(state);\n return i18n.t(\"surface.marked\", { description: pattern.description });\n },\n }),\n\n \"mimic:reset\": tool({\n description: baseI18n.t(\"tool.reset.description\"),\n args: {\n confirm: tool.schema.boolean().describe(baseI18n.t(\"tool.reset.args.confirm\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n if (!args.confirm) {\n return i18n.t(\"reset.cancelled\");\n }\n\n await writeFile(\n stateManager.getStatePath(),\n JSON.stringify(createDefaultState(stateManager.getProjectName()), null, 2),\n );\n return i18n.t(\"reset.done\");\n },\n }),\n\n \"mimic:grow\": tool({\n description: baseI18n.t(\"tool.grow.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 20);\n const recentFiles = getRecentlyModifiedFiles(directory);\n return formatGrowAnalysis(ctx, state, gitHistory, recentFiles);\n },\n }),\n\n \"mimic:evolve\": tool({\n description: baseI18n.t(\"tool.evolve.description\"),\n args: {\n accept: tool.schema.string().optional().describe(baseI18n.t(\"tool.evolve.args.accept\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n if (args.accept) {\n const suggestions = await getEvolutionSuggestions(ctx);\n const suggestion = suggestions.find((s) => s.pattern.id === args.accept);\n if (!suggestion) {\n return i18n.t(\"evolve.no_pattern\", { id: args.accept });\n }\n const { capability, filePath } = await evolveCapability(ctx, suggestion);\n return `${i18n.t(\"evolve.absorbed_header\")}\\n\\n${formatEvolutionResult(\n ctx,\n capability,\n filePath,\n )}`;\n }\n\n const suggestions = await getEvolutionSuggestions(ctx);\n if (suggestions.length === 0) {\n return i18n.t(\"evolve.empty\");\n }\n\n let output = `${i18n.t(\"evolve.menu_title\")}\\n\\n`;\n output += `${i18n.t(\"evolve.menu_intro\")}\\n\\n`;\n\n for (const s of suggestions) {\n output += `### ✨ ${s.name}\\n`;\n output += `- **${i18n.t(\"evolve.menu_type\")}**: ${formatCapabilityType(i18n, s.type)}\\n`;\n output += `- **${i18n.t(\"evolve.menu_reason\")}**: ${s.reason}\\n`;\n output += `- **${i18n.t(\"evolve.menu_pattern_id\")}**: \\`${s.pattern.id}\\`\\n\\n`;\n }\n\n output += `\\n${i18n.t(\"evolve.menu_footer\")}`;\n return output;\n },\n }),\n\n \"mimic:level\": tool({\n description: baseI18n.t(\"tool.level.description\"),\n args: {\n level: tool.schema\n .enum([\"technical\", \"semi-technical\", \"non-technical\", \"chaotic\"])\n .describe(baseI18n.t(\"tool.level.args.level\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n state.project.creatorLevel = args.level as CreatorLevel;\n await stateManager.save(state);\n\n const config = getLevelConfig(args.level as CreatorLevel);\n return i18n.t(\"level.set\", {\n level: formatLevelLabel(i18n, args.level),\n style: formatGreetingStyle(i18n, config.greetingStyle),\n detail: formatDetailLevel(i18n, config.detailLevel),\n });\n },\n }),\n\n \"mimic:focus\": tool({\n description: baseI18n.t(\"tool.focus.description\"),\n args: {\n focus: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.focus\")),\n stack: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.stack\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.focus) {\n state.project.focus = args.focus;\n await stateManager.addObservation(i18n.t(\"obs.focus_changed\", { focus: args.focus }));\n }\n if (args.stack) {\n state.project.stack = args.stack.split(\",\").map((s) => s.trim());\n }\n\n await stateManager.save(state);\n\n let output = `${i18n.t(\"focus.updated\")}\\n`;\n if (state.project.focus)\n output += `- **${i18n.t(\"focus.focus_label\")}**: ${state.project.focus}\\n`;\n if (state.project.stack?.length)\n output += `- **${i18n.t(\"focus.stack_label\")}**: ${state.project.stack.join(\", \")}\\n`;\n return output;\n },\n }),\n\n \"mimic:mcp-search\": tool({\n description: baseI18n.t(\"tool.mcp_search.description\"),\n args: {\n query: tool.schema.string().describe(baseI18n.t(\"tool.mcp_search.args.query\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const searchUrl = `https://mcpmarket.com/search?q=${encodeURIComponent(args.query)}`;\n const popular = [\n {\n name: \"context7\",\n desc: i18n.t(\"mcp_search.desc.context7\"),\n url: \"https://mcp.context7.com/mcp\",\n },\n {\n name: \"github\",\n desc: i18n.t(\"mcp_search.desc.github\"),\n url: \"https://mcp.github.com\",\n },\n {\n name: \"supabase\",\n desc: i18n.t(\"mcp_search.desc.supabase\"),\n url: \"https://mcp.supabase.com\",\n },\n { name: \"playwright\", desc: i18n.t(\"mcp_search.desc.playwright\") },\n { name: \"firecrawl\", desc: i18n.t(\"mcp_search.desc.firecrawl\") },\n ];\n const popularLines = popular\n .map((server) =>\n server.url\n ? `- **${server.name}** - ${server.desc}: \\`${server.url}\\``\n : `- **${server.name}** - ${server.desc}`,\n )\n .join(\"\\n\");\n return `${i18n.t(\"mcp_search.header\", {\n query: args.query,\n url: searchUrl,\n })}\\n\\n${i18n.t(\"mcp_search.popular\")}\\n${popularLines}\\n\\n${i18n.t(\"mcp_search.add\")}`;\n },\n }),\n\n \"mimic:mcp\": tool({\n description: baseI18n.t(\"tool.mcp.description\"),\n args: {\n name: tool.schema.string().describe(baseI18n.t(\"tool.mcp.args.name\")),\n url: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.url\")),\n command: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.command\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const { existsSync } = await import(\"node:fs\");\n const { readFile, writeFile: fsWriteFile, mkdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n const opencodeDir = join(directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(directory, \"opencode.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(await readFile(configPath, \"utf-8\"));\n } catch {\n config = {};\n }\n }\n\n const mcpEntry: Record<string, unknown> = {};\n if (args.url) {\n mcpEntry.type = \"remote\";\n mcpEntry.url = args.url;\n } else if (args.command) {\n mcpEntry.type = \"local\";\n mcpEntry.command = args.command.split(\",\").map((s) => s.trim());\n } else {\n return i18n.t(\"mcp.need_url_or_command\");\n }\n mcpEntry.enabled = true;\n\n config.mcp = { ...((config.mcp as Record<string, unknown>) || {}), [args.name]: mcpEntry };\n await fsWriteFile(configPath, JSON.stringify(config, null, 2));\n\n await stateManager.addMilestone(i18n.t(\"milestone.mcp_added\", { name: args.name }));\n\n return i18n.t(\"mcp.added\", { name: args.name });\n },\n }),\n\n \"mimic:capabilities\": tool({\n description: baseI18n.t(\"tool.capabilities.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.evolution.capabilities.length === 0) {\n return i18n.t(\"capabilities.empty\");\n }\n\n let output = `${i18n.t(\"capabilities.title\")}\\n\\n`;\n output += `${i18n.t(\"capabilities.intro\")}\\n\\n`;\n for (const cap of state.evolution.capabilities) {\n output += `### ✨ ${cap.name}\\n`;\n output += `- **${i18n.t(\"capabilities.type\")}**: ${formatCapabilityType(\n i18n,\n cap.type,\n )}\\n`;\n output += `- **${i18n.t(\"capabilities.description\")}**: ${cap.description}\\n`;\n output += `- **${i18n.t(\"capabilities.consumed\")}**: ${format(\n new Date(cap.createdAt),\n \"yyyy-MM-dd\",\n )}\\n\\n`;\n }\n return output;\n },\n }),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { StateManager } from \"@/state\";\nimport type { CapabilityType, EvolvedCapability, Pattern } from \"@/types\";\n\ninterface EvolutionSuggestion {\n type: CapabilityType;\n name: string;\n description: string;\n reason: string;\n pattern: Pattern;\n}\n\nfunction generateToolCode(name: string, description: string, pattern: Pattern): string {\n const funcName = name.replace(/-/g, \"_\");\n return `// 📦 Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${funcName} = (plugin) => ({\n tool: {\n \"${name}\": {\n description: \"${description}\",\n args: {},\n async execute() {\n // TODO: Implement your logic here\n // This was generated from pattern: ${pattern.description}\n return \"📦 ${name} executed!\";\n },\n },\n },\n});\n\nexport default ${funcName};\n`;\n}\n\nfunction generateHookCode(name: string, _description: string, pattern: Pattern): string {\n const filename = pattern.description;\n return `// 📦 Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n if (event.type === \"file.edited\") {\n const filename = event.properties?.filename;\n if (filename?.includes(\"${filename}\")) {\n console.log(\"📦 [Mimic] Detected change in watched file: ${filename}\");\n // TODO: Add your custom logic here\n }\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateSkillCode(name: string, description: string, pattern: Pattern): string {\n return `// 📦 Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n // Auto-triggered skill: ${description}\n if (event.type === \"session.created\") {\n console.log(\"📦 [Mimic] Skill ${name} activated\");\n // TODO: Implement automated behavior\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateMcpConfig(name: string, _description: string, pattern: Pattern): object {\n return {\n [name]: {\n type: \"local\",\n command: [\"echo\", `MCP server for ${pattern.description}`],\n enabled: false,\n },\n };\n}\n\nfunction generateAgentMarkdown(name: string, description: string, pattern: Pattern): string {\n return `---\ndescription: ${description}\nmode: subagent\ntools:\n read: true\n glob: true\n grep: true\n bash: false\n edit: false\n---\n\n# 📦 ${name}\n\nAuto-generated by Mimic from pattern: ${pattern.description} (${pattern.count}x)\n\n## Focus Area\n\nThis agent specializes in tasks related to: ${pattern.description}\n\n## Context\n\n- Pattern detected: ${pattern.type}\n- Usage count: ${pattern.count}\n- First seen: ${new Date(pattern.firstSeen).toISOString()}\n\n## How To Help\n\nAnalyze and assist with tasks matching this pattern.\nProvide focused, expert guidance in this specific area.\n\n## Remember\n\n- Stay focused on the pattern's domain\n- Leverage the observed usage patterns\n- Adapt to the user's workflow\n`;\n}\n\ntype EvolutionOutput = { filePath: string; content: string };\n\nasync function readOpencodeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(configPath)) return {};\n\n try {\n const parsed = JSON.parse(await readFile(configPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nasync function buildMcpEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const opencodeDir = join(ctx.directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(ctx.directory, \"opencode.json\");\n const config = await readOpencodeConfig(configPath);\n const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);\n\n const mcp = { ...((config.mcp as Record<string, unknown>) || {}), ...mcpConfig };\n const content = JSON.stringify({ ...config, mcp }, null, 2);\n\n return { filePath: configPath, content };\n}\n\nasync function buildAgentEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const agentsDir = join(ctx.directory, \".opencode\", \"agents\");\n if (!existsSync(agentsDir)) {\n await mkdir(agentsDir, { recursive: true });\n }\n\n return {\n content: generateAgentMarkdown(suggestion.name, suggestion.description, suggestion.pattern),\n filePath: join(agentsDir, `${suggestion.name}.md`),\n };\n}\n\nfunction buildPluginContent(suggestion: EvolutionSuggestion): string {\n switch (suggestion.type) {\n case \"command\":\n case \"shortcut\":\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"hook\":\n return generateHookCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"skill\":\n return generateSkillCode(suggestion.name, suggestion.description, suggestion.pattern);\n default:\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n }\n}\n\nasync function buildPluginEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const pluginsDir = join(ctx.directory, \".opencode\", \"plugins\");\n if (!existsSync(pluginsDir)) {\n await mkdir(pluginsDir, { recursive: true });\n }\n\n return {\n content: buildPluginContent(suggestion),\n filePath: join(pluginsDir, `${suggestion.name}.js`),\n };\n}\n\nasync function buildEvolutionOutput(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n if (suggestion.type === \"mcp\") {\n return buildMcpEvolution(ctx, suggestion);\n }\n\n if (suggestion.type === \"agent\") {\n return buildAgentEvolution(ctx, suggestion);\n }\n\n return buildPluginEvolution(ctx, suggestion);\n}\n\nfunction createCapabilityFromSuggestion(suggestion: EvolutionSuggestion): EvolvedCapability {\n return {\n id: crypto.randomUUID(),\n type: suggestion.type,\n name: suggestion.name,\n description: suggestion.description,\n createdAt: new Date().toISOString(),\n fromPattern: suggestion.pattern.id,\n };\n}\n\nfunction updateEvolutionState(\n state: Awaited<ReturnType<StateManager[\"read\"]>>,\n capability: EvolvedCapability,\n suggestion: EvolutionSuggestion,\n): void {\n state.evolution.capabilities.push(capability);\n state.evolution.lastEvolution = new Date().toISOString();\n\n const pattern = state.patterns.find((p) => p.id === suggestion.pattern.id);\n if (pattern) {\n pattern.surfaced = true;\n }\n}\n\nexport function suggestEvolution(pattern: Pattern, ctx: MimicContext): EvolutionSuggestion | null {\n switch (pattern.type) {\n case \"tool\":\n if (pattern.count >= 10) {\n return {\n type: \"shortcut\",\n name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`,\n description: ctx.i18n.t(\"evolution.suggest.tool.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.tool.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"file\":\n if (pattern.count >= 5) {\n return {\n type: \"hook\",\n name: `watch-${pattern.description.split(\"/\").pop()?.replace(/\\./g, \"-\") || \"file\"}`,\n description: ctx.i18n.t(\"evolution.suggest.file.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.file.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"commit\":\n if (pattern.count >= 3) {\n return {\n type: \"command\",\n name: `commit-${pattern.description.slice(0, 20).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.commit.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.commit.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"sequence\":\n if (pattern.count >= 5) {\n return {\n type: \"agent\",\n name: `${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}-specialist`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.agent.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.agent.reason\", { count: pattern.count }),\n pattern,\n };\n }\n if (pattern.count >= 3) {\n return {\n type: \"skill\",\n name: `auto-${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.skill.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.skill.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n }\n\n return null;\n}\n\nexport async function getEvolutionSuggestions(ctx: MimicContext): Promise<EvolutionSuggestion[]> {\n const state = await ctx.stateManager.read();\n const suggestions: EvolutionSuggestion[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n\n const suggestion = suggestEvolution(pattern, ctx);\n if (suggestion) {\n suggestions.push(suggestion);\n }\n }\n\n return suggestions;\n}\n\nexport async function evolveCapability(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<{ capability: EvolvedCapability; filePath: string }> {\n const state = await ctx.stateManager.read();\n const { filePath, content } = await buildEvolutionOutput(ctx, suggestion);\n await writeFile(filePath, content, \"utf-8\");\n\n const capability = createCapabilityFromSuggestion(suggestion);\n updateEvolutionState(state, capability, suggestion);\n\n await ctx.stateManager.save(state);\n await ctx.stateManager.addMilestone(\n ctx.i18n.t(\"milestone.evolved\", {\n name: capability.name,\n type: formatCapabilityType(ctx.i18n, capability.type),\n }),\n );\n\n return { capability, filePath };\n}\n\nexport function formatEvolutionResult(\n ctx: MimicContext,\n capability: EvolvedCapability,\n filePath: string,\n): string {\n const typeLabel = formatCapabilityType(ctx.i18n, capability.type);\n let result = `### ✨ ${capability.name}\\n\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.type\")}**: ${typeLabel}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.description\")}**: ${capability.description}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.file\")}**: \\`${filePath}\\`\\n\\n`;\n result += `*${ctx.i18n.t(\"evolution.result.restart\", { type: typeLabel })}*\\n\\n`;\n\n switch (capability.type) {\n case \"command\":\n case \"shortcut\":\n result += `${ctx.i18n.t(\"evolution.result.command\", { name: capability.name })}\\n`;\n break;\n\n case \"hook\":\n result += `${ctx.i18n.t(\"evolution.result.hook\")}\\n`;\n break;\n\n case \"skill\":\n result += `${ctx.i18n.t(\"evolution.result.skill\")}\\n`;\n break;\n\n case \"agent\":\n result += `${ctx.i18n.t(\"evolution.result.agent\", { name: capability.name })}\\n`;\n break;\n\n case \"mcp\":\n result += `${ctx.i18n.t(\"evolution.result.mcp\", { name: capability.name })}\\n`;\n break;\n }\n\n return result;\n}\n","import type { I18n } from \"@/i18n\";\nimport type { CreatorLevel, State } from \"@/types\";\n\ninterface LevelConfig {\n greetingStyle: \"formal\" | \"casual\" | \"minimal\" | \"chaotic\";\n detailLevel: \"high\" | \"medium\" | \"low\";\n useEmoji: boolean;\n technicalTerms: boolean;\n}\n\nconst LEVEL_CONFIGS: Record<CreatorLevel, LevelConfig> = {\n technical: {\n greetingStyle: \"minimal\",\n detailLevel: \"high\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"semi-technical\": {\n greetingStyle: \"casual\",\n detailLevel: \"medium\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"non-technical\": {\n greetingStyle: \"formal\",\n detailLevel: \"low\",\n useEmoji: true,\n technicalTerms: false,\n },\n chaotic: {\n greetingStyle: \"chaotic\",\n detailLevel: \"medium\",\n useEmoji: true,\n technicalTerms: true,\n },\n};\n\nexport function getLevelConfig(level: CreatorLevel | null): LevelConfig {\n return LEVEL_CONFIGS[level ?? \"technical\"];\n}\n\nexport function adaptMessage(message: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (config.greetingStyle === \"minimal\") {\n return message.replace(/^#+\\s*/gm, \"\").trim();\n }\n\n if (config.greetingStyle === \"chaotic\") {\n const chaosEmojis = [\"🔥\", \"⚡\", \"🚀\", \"💥\", \"✨\"];\n const emoji = chaosEmojis[Math.floor(Math.random() * chaosEmojis.length)];\n return `${emoji} ${message}`;\n }\n\n return message;\n}\n\nexport function formatGreeting(i18n: I18n, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n const name = state.project.name;\n\n switch (config.greetingStyle) {\n case \"minimal\":\n return i18n.t(\"level.greeting.minimal\", {\n project: name,\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n });\n case \"casual\":\n return i18n.t(\"level.greeting.casual\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"formal\":\n return i18n.t(\"level.greeting.formal\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"chaotic\": {\n const greetings = [\n i18n.t(\"level.greeting.chaotic.chomp\"),\n i18n.t(\"level.greeting.chaotic.lid_creaks\"),\n i18n.t(\"level.greeting.chaotic.teeth_gleam\"),\n i18n.t(\"level.greeting.chaotic.tongue_flicks\"),\n ];\n const g = greetings[Math.floor(Math.random() * greetings.length)];\n return i18n.t(\"level.greeting.chaotic.template\", {\n tag: g,\n project: name,\n sessions: state.journey.sessionCount,\n });\n }\n }\n}\n\nexport function formatSuggestion(i18n: I18n, suggestion: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (!config.technicalTerms) {\n const replacements: Array<[string, string]> = [\n [i18n.t(\"level.term.tool\"), i18n.t(\"level.term.shortcut\")],\n [i18n.t(\"level.term.pattern\"), i18n.t(\"level.term.habit\")],\n [i18n.t(\"level.term.hook\"), i18n.t(\"level.term.automation\")],\n ];\n let result = suggestion;\n for (const [from, to] of replacements) {\n if (!from || from === to) continue;\n const escaped = from.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(escaped, \"gi\"), to);\n }\n return result;\n }\n\n return suggestion;\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport type { Event } from \"@opencode-ai/sdk\";\nimport type { MimicContext } from \"@/context\";\nimport { analyzeTimeSinceLastSession, formatDuration } from \"@/format\";\nimport { createI18n, loadMimicConfig, resolveLanguage } from \"@/i18n\";\nimport { detectPatterns, surfacePatterns } from \"@/patterns\";\nimport { StateManager } from \"@/state\";\nimport { createTools } from \"@/tools\";\nimport type { ToolCall } from \"@/types\";\n\nexport const mimic: Plugin = async ({ directory, client }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const ctx: MimicContext = { stateManager, directory, i18n, client };\n\n const sessionId = crypto.randomUUID();\n const sessionStartTime = Date.now();\n const toolCalls: ToolCall[] = [];\n const filesEdited: Set<string> = new Set();\n\n const handleSessionCreated = async () => {\n const state = await stateManager.read();\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n\n state.statistics.totalSessions += 1;\n state.statistics.lastSessionId = sessionId;\n state.journey.sessionCount += 1;\n state.journey.lastSession = new Date().toISOString();\n\n await stateManager.save(state);\n\n if (timeSince === \"long-break\") {\n await stateManager.addObservation(i18n.t(\"obs.returned_after_long_break\"));\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n }),\n variant: \"info\",\n },\n });\n };\n\n const handleSessionIdle = async () => {\n const newPatterns = await detectPatterns(ctx);\n if (newPatterns.length > 0) {\n const state = await stateManager.read();\n state.patterns.push(...newPatterns);\n await stateManager.save(state);\n }\n\n const suggestions = await surfacePatterns(ctx);\n for (const suggestion of suggestions) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: suggestion,\n variant: \"info\",\n },\n });\n }\n };\n\n const handleFileEdited = async (event: Event) => {\n if (!(\"properties\" in event)) return;\n\n const filename = (event.properties as { filename?: string })?.filename;\n if (!filename) return;\n\n filesEdited.add(filename);\n const state = await stateManager.read();\n state.statistics.filesModified[filename] = (state.statistics.filesModified[filename] || 0) + 1;\n await stateManager.save(state);\n };\n\n return {\n async event({ event }: { event: Event }) {\n switch (event.type) {\n case \"session.created\":\n await handleSessionCreated();\n return;\n case \"session.idle\":\n await handleSessionIdle();\n return;\n case \"file.edited\":\n await handleFileEdited(event);\n }\n },\n\n async \"tool.execute.after\"(\n input: { tool: string; sessionID: string; callID: string },\n _output: { title: string; output: string; metadata: unknown },\n ) {\n const state = await stateManager.read();\n if (!state.preferences.learningEnabled) return;\n\n const toolCall: ToolCall = {\n tool: input.tool,\n callID: input.callID,\n timestamp: Date.now(),\n };\n\n toolCalls.push(toolCall);\n state.statistics.totalToolCalls += 1;\n\n const toolPattern = input.tool;\n const existing = state.patterns.find(\n (p) => p.type === \"tool\" && p.description === toolPattern,\n );\n if (existing) {\n existing.count += 1;\n existing.lastSeen = Date.now();\n } else {\n state.patterns.push({\n id: crypto.randomUUID(),\n type: \"tool\",\n description: toolPattern,\n count: 1,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [toolCall],\n });\n }\n\n await stateManager.save(state);\n },\n\n async stop() {\n const sessionDuration = Date.now() - sessionStartTime;\n\n const sessionData = {\n sessionId,\n startTime: new Date(sessionStartTime).toISOString(),\n endTime: new Date().toISOString(),\n durationMs: sessionDuration,\n toolCalls: toolCalls.length,\n filesEdited: Array.from(filesEdited),\n };\n\n await stateManager.saveSession(sessionId, sessionData);\n\n if (toolCalls.length > 20) {\n await stateManager.addObservation(\n i18n.t(\"obs.intensive_session\", { tools: toolCalls.length }),\n );\n }\n if (filesEdited.size > 10) {\n await stateManager.addMilestone(\n i18n.t(\"milestone.major_refactor\", { files: filesEdited.size }),\n );\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\n }),\n variant: \"info\",\n },\n });\n },\n\n tool: createTools(stateManager, directory, toolCalls, i18n),\n };\n};\n\nexport default mimic;\n"],"mappings":"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","names":["existsSync","readFile","join","writeFile","format","existsSync","mkdir","readFile","writeFile","join","existsSync","readFile","join","mkdir","writeFile","i18n","format","writeFile","suggestions","existsSync","readFile","mkdir","join"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-plugin-mimic",
3
- "version": "0.1.0",
3
+ "version": "0.1.4",
4
4
  "description": "An OpenCode plugin that learns from your patterns and adapts to your workflow. Mimic watches how you work, remembers across sessions, and suggests actions based on what you do repeatedly.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -47,6 +47,7 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@opencode-ai/plugin": "latest",
50
+ "@opencode-ai/sdk": "latest",
50
51
  "date-fns": "^4.1.0"
51
52
  },
52
53
  "devDependencies": {
@@ -63,7 +64,6 @@
63
64
  "build": "tsup",
64
65
  "dev": "tsup --watch",
65
66
  "test": "vitest",
66
- "test:coverage": "vitest run --coverage",
67
- "prepublishOnly": "pnpm run build"
67
+ "test:coverage": "vitest run --coverage"
68
68
  }
69
- }
69
+ }