# AX Copilot - ๊ฐœ๋ฐœ ๋ฌธ์„œ - Document update: 2026-04-04 23:47 (KST) - Added AX-side session-memory compaction, collapse/snip trimming, and per-conversation compaction usage tracking so compact now records staged reductions instead of only the last before/after snapshot. - Document update: 2026-04-04 23:47 (KST) - The AX Agent context tooltip now shows session totals for compaction count, saved tokens, session-memory passes, microcompact boundaries, and snipped messages for the current conversation. - Document update: 2026-04-04 23:47 (KST) - Added a post-compaction flag and conversation-level follow-up usage counters so AX can distinguish the first response after compaction and report its prompt/completion token cost separately. - Document update: 2026-04-05 00:01 (KST) - Added per-model daily token aggregation (`service:model`) plus post-compaction model usage buckets so AX can compare normal usage and compact-follow-up usage more like claw-code's compaction accounting. - Document update: 2026-04-05 00:01 (KST) - Compact boundary messages now render as dedicated compact cards, and compact-related thinking events render as lightweight pills so the timeline distinguishes compression boundaries from ordinary assistant replies and general execution logs. - Document update: 2026-04-04 23:32 (KST) - Upgraded ContextCondenser from a two-step path to a three-step path (tool-result truncate -> microcompact -> summarize) so long sessions can strip older execution/tool chatter before invoking the LLM summary stage. - Document update: 2026-04-04 23:32 (KST) - Added AX-side microcompact boundaries that compress older tool results, execution metadata, and oversized messages into lighter boundary summaries, bringing the compact flow closer to the staged approach used in claude-code. - Document update: 2026-04-04 20:27 (KST) - Added AX Agent theme styles (`claw/codex/slate`) and exposed separate selection inside the in-chat settings. - Document update: 2026-04-04 18:03 (KST) - Added a context usage ring with compact guidance, a direct compact action, and Git branch status badges to the AX Agent composer/footer. - Document update: 2026-04-04 18:03 (KST) - Removed document format/design selectors from the footer and moved their defaults into AX Agent settings, keeping output format on AI automatic selection by default. - Document update: 2026-04-04 18:03 (KST) - Simplified AX Agent message headers, converted model quick settings into a popup panel, flattened slash command rows, and aligned composer dropdown buttons to a unified panel pattern. - Document update: 2026-04-04 18:03 (KST) - Added a Git branch dropdown panel, flattened permission/template popup rows to match the slash list, and made AI message action bars persist on selected messages. - Document update: 2026-04-04 18:03 (KST) - Flattened the data-usage popup into row lists, added branch switching/creation inside the Git dropdown, and exposed quick model chips in the inline model panel to reduce ComboBox-heavy UX. - Document update: 2026-04-04 18:03 (KST) - Reworked the inline model panel into custom service cards and row-based model lists so the visible UI relies much less on default ComboBox controls. - Document update: 2026-04-04 18:03 (KST) - Added recent/favorite sections to the preset popup and enabled right-click pinning so the preset picker follows a more Codex-like frequent-use flow. - Document update: 2026-04-04 18:03 (KST) - Added preset search, strengthened selected-message visuals, and reduced permission detail emphasis by shifting more of the popup to flat row-based information. - Document update: 2026-04-04 18:03 (KST) - Converted recent permission-denied actions into row actions, surfaced Git upstream status in the branch panel, and gave inline quick actions stronger stateful card visuals. --- ## ๐Ÿ“‘ ๋ชฉ์ฐจ 1. [๊ด€๋ จ ๋ฌธ์„œ](#๊ด€๋ จ-๋ฌธ์„œ) 2. [์‚ฌ๋‚ด ์ „์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์›์น™](#์‚ฌ๋‚ด-์ „์šฉ-ํ”„๋กœ๊ทธ๋žจ-๊ฐœ๋ฐœ-์›์น™) 3. [ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ](#ํ”„๋กœ์ ํŠธ-๊ตฌ์กฐ) 4. [์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”](#์•„ํ‚คํ…์ฒ˜-๊ฐœ์š”) 5. [ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ํ๋ฆ„](#ํ•ต์‹ฌ-๋ฐ์ดํ„ฐ-ํ๋ฆ„) 6. [๊ฐ ํ•ธ๋“ค๋Ÿฌ ์ƒ์„ธ](#๊ฐ-ํ•ธ๋“ค๋Ÿฌ-์ƒ์„ธ) 7. [์„ค์ • UI (SettingsWindow)](#์„ค์ •-ui-settingswindow) 8. [์„ค์ • ์Šคํ‚ค๋งˆ (`settings.json`)](#์„ค์ •-์Šคํ‚ค๋งˆ-settingsjson) 9. [์ฃผ์š” ๊ธฐ๋Šฅ ์ƒ์„ธ](#์ฃผ์š”-๊ธฐ๋Šฅ-์ƒ์„ธ) 10. [๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ](#๋ฐ์ดํ„ฐ-์ €์žฅ-๊ฒฝ๋กœ) 11. [๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ](#๋ณด์•ˆ-๊ณ ๋ ค์‚ฌํ•ญ) 12. [ํ…Œ๋งˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•](#ํ…Œ๋งˆ-์ปค์Šคํ„ฐ๋งˆ์ด์ง•) 13. [๋‹จ์œ„ ํ…Œ์ŠคํŠธ](#๋‹จ์œ„-ํ…Œ์ŠคํŠธ) 14. [์ฝ”๋“œ ๊ฒ€ํ†  ์ด๋ ฅ](#์ฝ”๋“œ-๊ฒ€ํ† -์ด๋ ฅ) 15. [๋ฒ„๊ทธ ์ˆ˜์ • ์ด๋ ฅ](#๋ฒ„๊ทธ-์ˆ˜์ •-์ด๋ ฅ) 16. [์•Œ๋ ค์ง„ ์ œํ•œ์‚ฌํ•ญ ๋ฐ ํ–ฅํ›„ ๊ฐœ์„ ](#์•Œ๋ ค์ง„-์ œํ•œ์‚ฌํ•ญ-๋ฐ-ํ–ฅํ›„-๊ฐœ์„ ) 17. [๊ฐœ๋ฐœ ํ™˜๊ฒฝ](#๊ฐœ๋ฐœ-ํ™˜๊ฒฝ) 18. [๊ฒฝ์Ÿ ์ œํ’ˆ ๊ธฐ๋Šฅ ๋น„๊ต](#๊ฒฝ์Ÿ-์ œํ’ˆ-๊ธฐ๋Šฅ-๋น„๊ต) 19. [์ƒˆ๋กœ์šด ํ•ธ๋“ค๋Ÿฌ/ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•](#์ƒˆ๋กœ์šด-ํ•ธ๋“ค๋Ÿฌํ‚ค์›Œ๋“œ-์ถ”๊ฐ€-๋ฐฉ๋ฒ•-๊ฐœ๋ฐœ์ž-๊ฐ€์ด๋“œ) 20. [์‚ฌ๋‚ด LLM / AI Agent ์—ฐ๋™ ๊ฐ€์ด๋“œ](#์‚ฌ๋‚ด-llm--ai-agent-์—ฐ๋™-๊ฐ€์ด๋“œ-ํ–ฅํ›„-ํ™•์žฅ) 21. [๋ฒ„์ „ ์ด๋ ฅ](#๋ฒ„์ „-์ด๋ ฅ) 22. [๊ฐœ๋ฐœ ๊ฒ€ํ†  โ€” ์›Œํฌํ”Œ๋กœ์šฐ ๋ณ‘๋ชฉ ๋ถ„์„ ๊ทธ๋ž˜ํ”„](#๊ฐœ๋ฐœ-๊ฒ€ํ† --์›Œํฌํ”Œ๋กœ์šฐ-๋ณ‘๋ชฉ-๋ถ„์„-๊ทธ๋ž˜ํ”„) 23. [์–‘์‹ ๊ธฐ๋ฐ˜ ๋ฌธ์„œ ์ƒ์„ฑ (Template Mode)](#์–‘์‹-๊ธฐ๋ฐ˜-๋ฌธ์„œ-์ƒ์„ฑ-template-mode) --- ## ๊ด€๋ จ ๋ฌธ์„œ | ๋ฌธ์„œ | ์„ค๋ช… | |------|------| | [AX Agent ๋กœ๋“œ๋งต](AGENT_ROADMAP.html) | AX Agent ๋Œ€ํ™” ์„œ๋น„์Šค ๊ณ ๋„ํ™” ์ข…ํ•ฉ ๊ณ„ํš (Phase 2.5~11) | | [AX Commander ๋กœ๋“œ๋งต](LAUNCHER_ROADMAP.html) | AX Commander ๋Ÿฐ์ฒ˜ ๊ณ ๋„ํ™” ๊ณ„ํš | | [์‚ฌ์šฉ ๊ฐ€์ด๋“œ](../src/AxCopilot/Assets/AX%20Copilot%20์‚ฌ์šฉ๊ฐ€์ด๋“œ.htm) | ์‚ฌ์šฉ์ž์šฉ ๋‹จ์ถ•ํ‚ค & ์˜ˆ์•ฝ์–ด ๊ฐ€์ด๋“œ | --- ## ์‚ฌ๋‚ด ์ „์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์›์น™ > **ํ˜„์žฌ ๊ธฐ์ค€ ์ œํ’ˆ๋ช…์€ AX Copilot์ด๋ฉฐ, ๋Ÿฐ์ฒ˜๋Š” AX Commander, AI ๋Œ€ํ™” ์„œ๋น„์Šค๋Š” AX Agent์ž…๋‹ˆ๋‹ค.** > ์ด ๋ฌธ์„œ๋Š” ๊ณผ๊ฑฐ ๊ฐœ๋ฐœ ์ด๋ ฅ์„ ํฌํ•จํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ๊ตฌ๊ฐ„์— ์˜ˆ์ „ ๋ช…์นญ์ด ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ํ•ด์„ ๊ธฐ์ค€์€ ํ•ญ์ƒ ํ˜„์žฌ ๋ช…์นญ ์ฒด๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ### ์™ธ๋ถ€ ์—ฐ๊ฒฐ ๊ธˆ์ง€ | ๊ธˆ์ง€ ํ•ญ๋ชฉ | ์„ค๋ช… | |-----------|------| | ์™ธ๋ถ€ HTTP/HTTPS ํ˜ธ์ถœ | `HttpClient`, `WebClient`, `HttpWebRequest` ๋“ฑ์œผ๋กœ ์™ธ๋ถ€ ์„œ๋ฒ„์— ์š”์ฒญ ๊ธˆ์ง€ | | ์™ธ๋ถ€ SDK ์—ฐ๋™ | ์„œ๋“œํŒŒํ‹ฐ ํด๋ผ์šฐ๋“œ SDK, AI API, SaaS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๊ธˆ์ง€ | | ์›๊ฒฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‹ค์šด๋กœ๋“œ | ๋Ÿฐํƒ€์ž„์— ์™ธ๋ถ€์—์„œ DLL/์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ ๊ธˆ์ง€ | | ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ / ์˜ค๋ฅ˜ ์ˆ˜์ง‘ | ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ์ผ์ฒด์˜ ์ฝ”๋“œ ๊ธˆ์ง€ | | NuGet ํŒจํ‚ค์ง€ | ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ๋‚ด์žฅ๋œ ํŒจํ‚ค์ง€ ์‹ ๊ทœ ๋„์ž… ๊ธˆ์ง€ | **ํ—ˆ์šฉ**: ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ, Windows API (P/Invoke), ์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท URL (๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ๊ฐ€๋œ ๊ฒฝ์šฐ๋งŒ), ๋กœ์ปฌ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰. ### ์™ธ๋ถ€ SDK ๊ธˆ์ง€ ๊ธฐ์กด์— ๋“ฑ๋ก๋œ `JsonSkillLoader`์˜ HTTP ์Šคํ‚ฌ ๊ธฐ๋Šฅ(`type: "http"`)์€ **์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท ์—”๋“œํฌ์ธํŠธ ์ „์šฉ**์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ### ์˜์กด์„ฑ ๊ด€๋ฆฌ ์‹ ๊ทœ NuGet ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”: 1. ํŒจํ‚ค์ง€๊ฐ€ ์™ธ๋ถ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š”์ง€ ๊ฒ€ํ†  2. ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ BCL(Base Class Library)์ด๋‚˜ Windows API๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ๋จผ์ € ๊ฒ€ํ†  3. ์ถ”๊ฐ€ ์‹œ `DEVELOPMENT.md`์— ์ด์œ ๋ฅผ ๊ธฐ๋ก ### UI ์ƒ‰์ƒยท๋ ˆ์ด์•„์›ƒ ๊ทœ์น™ > **๋ชจ๋“  UI ๊ฐœ๋ฐœ ์‹œ ์•„๋ž˜ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜์„ธ์š”.** (์ƒ์„ธ: `docs/AI_Service_Review.html` ยง12.8) 1. **์‹œ์Šคํ…œ ๊ธฐ๋ณธ ์ปจํŠธ๋กค ์‚ฌ์šฉ ๊ธˆ์ง€** โ€” `ContextMenu`, `MessageBox`, `ComboBox` ๋“œ๋กญ๋‹ค์šด์„ ์ฑ„ํŒ… ์ฐฝ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ. ๋ฐ˜๋“œ์‹œ ์ปค์Šคํ…€ `Popup` ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ 2. **์ƒ‰์ƒ ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€** โ€” `Brushes.White`, `#A0A4BE` ๋“ฑ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ๋ผ์ดํŠธ/๋‹คํฌ ํ…Œ๋งˆ ์ „ํ™˜ ์‹œ ๋Œ€๋น„๊ฐ€ ๊นจ์ง - XAML: `{DynamicResource PrimaryText}`, `{DynamicResource SecondaryText}` ๋“ฑ ๋ฆฌ์†Œ์Šค ํ‚ค ์‚ฌ์šฉ - ์ฝ”๋“œ๋น„ํ•˜์ธ๋“œ: `TryFindResource("PrimaryText") as Brush ?? Brushes.White` ํŒจํ„ด ์‚ฌ์šฉ 3. **์ˆ˜ํ‰ ์Šคํฌ๋กค๋ฐ” ๊ธˆ์ง€** โ€” ์•„์ด์ฝ˜/์นฉ ๋ชฉ๋ก์€ `ScrollViewer` ๊ฐ€๋กœ ์Šคํฌ๋กค ๋Œ€์‹  `WrapPanel`๋กœ ์ฐฝ ํญ์— ๋งž๊ฒŒ ์ž๋™ ์ค„๋ฐ”๊ฟˆ 4. **Popup ๋‚ด๋ถ€์— `Button` ์‚ฌ์šฉ ๊ธˆ์ง€** โ€” ํฌ์ปค์Šค ์บก์ฒ˜๋กœ ํŒ์—…์ด ์ฆ‰์‹œ ๋‹ซํž˜. `Border` + `MouseLeftButtonUp` ํŒจํ„ด ์‚ฌ์šฉ 5. **ํฐํŠธ ํฌ๊ธฐ** โ€” ๋ฉ”๋‰ด ํ•ญ๋ชฉ 13px ์ด์ƒ, ์„ค๋ช… ํ…์ŠคํŠธ 12px ์ด์ƒ (๊ฐ€๋…์„ฑ ํ™•๋ณด) 6. **ํ˜ธ๋ฒ„/ํด๋ฆญ ํšจ๊ณผ ํ•„์ˆ˜** โ€” `#18FFFFFF` ๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ + ํ•ธ๋“œ ์ปค์„œ, ํŒ์—… `PopupAnimation="Fade"` ๊ธฐ๋ณธ ์ ์šฉ 7. **์‚ฌ์šฉ์ž ์˜์‚ฌ๊ฒฐ์ • UI = ํ•˜๋‹จ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ํŒจํ„ด** โ€” AI๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ ํƒ์„ ์š”์ฒญํ•  ๋•Œ(ํฌ๋งท, ๋””์ž์ธ, ๊ถŒํ•œ ๋“ฑ) ์•„์ด์ฝ˜์„ ์ฃผ์šฑ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  **์ปดํŒฉํŠธ ๋“œ๋กญ๋‹ค์šด ๋ฒ„ํŠผ** `[๋ผ๋ฒจ: ํ˜„์žฌ๊ฐ’ โ–พ]` โ†’ ํด๋ฆญ ์‹œ `Popup` ๋ฉ”๋‰ด ํ‘œ์‹œ. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์— ํ…์ŠคํŠธ ์ž…๋ ฅ ์˜ต์…˜ ํฌํ•จ ๊ฐ€๋Šฅ. - ์„ค์ •(Settings)์—์„œ ํ•ด๋‹น ๊ฐ’์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ - ๊ฐ™์€ ํŒจํ„ด์„ ๋ชจ๋“  ํƒญ(Chat, Cowork, Code)์— ์ผ๊ด€ ์ ์šฉ 8. **ํ”„๋ฆฌ๋ทฐ ํŒจ๋„ = ํƒญ ๊ธฐ๋ฐ˜** โ€” ๋‹ค์ค‘ ํŒŒ์ผ ํ”„๋ฆฌ๋ทฐ๋ฅผ ํƒญ์œผ๋กœ ๊ด€๋ฆฌ, ํŒŒ์ผ๋ช… ํ‘œ์‹œ, ํƒญ ์ถ•์†Œ, ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์•„์ด์ฝ˜ ํฌํ•จ 9. **์ผœ๊ธฐ/๋„๊ธฐ UI = ToggleSwitch ์Šคํƒ€์ผ ์‚ฌ์šฉ** โ€” ์„ค์ • ์ฐฝ ๋“ฑ ๋ชจ๋“  on/off ์˜ต์…˜์—๋Š” ๊ธฐ๋ณธ `CheckBox`๊ฐ€ ์•„๋‹Œ `Style="{StaticResource ToggleSwitch}"` ์ขŒ์šฐ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€์„ ์‚ฌ์šฉ. ์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ ๋ชฉ๋ก๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ (Grid ์ขŒ: ๋ผ๋ฒจ, ์šฐ: ํ† ๊ธ€) 10. **ContextMenu ์‚ฌ์šฉ ๊ธˆ์ง€ โ†’ ์ปค์Šคํ…€ Popup ๋ฉ”๋‰ด** โ€” WPF ๊ธฐ๋ณธ `ContextMenu`/`MenuItem` ์‚ฌ์šฉ ๊ธˆ์ง€. ๋ชจ๋“  ์šฐํด๋ฆญ ๋ฉ”๋‰ดยท๋“œ๋กญ๋‹ค์šด์„ ์ปค์Šคํ…€ `Popup` (Border + MouseLeftButtonUp ํŒจํ„ด, 12px ๋ผ์šด๋“œ, ํ˜ธ๋ฒ„, ๋“œ๋กญ์„€๋„)์œผ๋กœ ๊ตฌํ˜„ 9. **ํด๋” ๋ฐ์ดํ„ฐ ํ™œ์šฉ ์‹œ ๊ด€๋ จ์„ฑ ๊ฒ€์ฆ ํ•„์ˆ˜** โ€” ์ ๊ทน ํ™œ์šฉ ๋ชจ๋“œ์—์„œ๋„ ๋Œ€ํ™” ์ฃผ์ œ์™€ ๋ฌด๊ด€ํ•œ ํŒŒ์ผ์€ ์ฝ์ง€ ์•Š์Œ. ๊ณ„ํš ๋‹จ๊ณ„์—์„œ ์ฝ์„ ํŒŒ์ผ ๋ชฉ๋ก๊ณผ ์ด์œ ๋ฅผ ๋จผ์ € ์ œ์‹œ 10. **์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์˜์—ญ ์ตœ์†Œ ํฌ๊ธฐ 36px** โ€” ๋ฒ„ํŠผยท์•„์ด์ฝ˜ยท๋ฉ”๋‰ด ๋“ฑ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋Š” ๋ณด๋‚ด๊ธฐ ๋ฒ„ํŠผ(36ร—36)๊ณผ ๋™์ผํ•œ ํ„ฐ์น˜ ํฌ๊ธฐ ํ™•๋ณด. FontSize ์ตœ์†Œ 12px, Padding ์ตœ์†Œ 6px. ํด๋”๋ฐ”ยท๋ชจ๋ธ ์„ ํƒ ๋“ฑ ํ…์ŠคํŠธ ์˜์—ญ๋„ MinHeight=34 ์ด์ƒ --- ## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ > ์•„๋ž˜ ๊ตฌ์กฐ๋„์—๋Š” ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ ๋ช…์นญ(AxCommander)์ด ์ด๋ ฅ ๋ณด์กด ๋ชฉ์ ์œผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. > ํ˜„์žฌ ์ œํ’ˆ ๊ธฐ์ค€ ๊ฒฝ๋กœ๋Š” src/AxCopilot/์ด๋ฉฐ, ๋Ÿฐ์ฒ˜ ์„œ๋ธŒ์˜์—ญ์ด AX Commander, ๋Œ€ํ™” ์„œ๋ธŒ์˜์—ญ์ด AX Agent์ž…๋‹ˆ๋‹ค. ``` AX Commander/ โ”œโ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ AxCommander/ # ๋ฉ”์ธ WPF ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ”‚ โ”‚ โ”œโ”€โ”€ App.xaml / App.xaml.cs # ์•ฑ ์ง„์ž…์ , ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”, ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜ โ”‚ โ”‚ โ”œโ”€โ”€ Assets/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ icon.ico # ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ๋ณด์„ ์•„์ด์ฝ˜ (7ํฌ๊ธฐ: 16~256px) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ diamond_pixel.svg # ์•„์ด์ฝ˜ SVG ์›๋ณธ (์ฐธ๊ณ ์šฉ) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ mascot.png # About ์ฐฝ ๋งˆ์Šค์ฝ”ํŠธ ์ด๋ฏธ์ง€ (์„ ํƒ) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Quotes/ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ famous.json # ๋‚ด์žฅ ๋ช…์–ธ 500๊ฐœ (EmbeddedResource) โ”‚ โ”‚ โ”œโ”€โ”€ Core/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ CommandResolver.cs # ํ”„๋ฆฌํ”ฝ์Šค ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ContextManager.cs # ์œˆ๋„์šฐ ์Šค๋ƒ…์ƒท & ๋ณต์› (์›Œํฌ์ŠคํŽ˜์ด์Šค) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ FuzzyEngine.cs # ํผ์ง€ ๊ฒ€์ƒ‰ + ํ•œ๊ตญ์–ด ์ดˆ์„ฑ ์ง€์› โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ InputListener.cs # ์ „์—ญ ํ‚ค๋ณด๋“œ ํ›… (WH_KEYBOARD_LL) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ PluginHost.cs # DLL/JSON ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋” โ”‚ โ”‚ โ”œโ”€โ”€ Handlers/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ AliasHandler.cs # @(URL) ~(ํด๋”) >(๋ฐฐ์น˜) ํ•ธ๋“ค๋Ÿฌ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ CalculatorHandler.cs # = ๊ณ„์‚ฐ๊ธฐ + ๋‹จ์œ„๋ณ€ํ™˜ + ํ†ตํ™”๋ณ€ํ™˜ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ClipboardHandler.cs # $ ํด๋ฆฝ๋ณด๋“œ ๋ณ€ํ™˜ (12์ข… ๋‚ด์žฅ) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ClipboardHistoryHandler.cs # # ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ColorHandler.cs # color HEX/RGB/HSL/HSV ๋ณ€ํ™˜๊ธฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ColorPickHandler.cs # pick ์Šคํฌ์ด๋“œ ์ƒ‰์ƒ ์ถ”์ถœ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ DateCalcHandler.cs # date ๋‚ ์งœ ๊ณ„์‚ฐ/D-day/ํƒ€์ž„์Šคํƒฌํ”„ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ EncodeHandler.cs # encode base64/url/hex/md5/sha256 โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ EnvHandler.cs # env ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์กฐํšŒ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ EmojiHandler.cs # emoji ์ด๋ชจ์ง€ ํ”ผ์ปค (300+ ์ด๋ชจ์ง€) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JsonHandler.cs # json JSON ๊ฒ€์ฆ/ํฌ๋งท/๋ฏธ๋‹ˆํŒŒ์ด โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ JsonSkillLoader.cs # .skill.json HTTP API ์—ฐ๋™ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ NoteHandler.cs # note ๋น ๋ฅธ ๋ฉ”๋ชจ ์ €์žฅ/์กฐํšŒ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ PortHandler.cs # port ํฌํŠธ/ํ”„๋กœ์„ธ์Šค ์ ๊ฒ€ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ RecentFilesHandler.cs # recent Windows ์ตœ๊ทผ ํŒŒ์ผ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ RenameHandler.cs # rename ํŒŒ์ผ ์ผ๊ด„ ์ด๋ฆ„๋ณ€๊ฒฝ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ScreenCaptureHandler.cs # cap ํ™”๋ฉด/์ฐฝ/์Šคํฌ๋กค ์บก์ฒ˜ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ScaffoldHandler.cs # scaffold ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ServiceHandler.cs # svc Windows ์„œ๋น„์Šค ๊ด€๋ฆฌ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SnapHandler.cs # snap ์ฐฝ ๋ฐฐ์น˜ ๋ ˆ์ด์•„์›ƒ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SnippetHandler.cs # ; ํ…์ŠคํŠธ ์Šค๋‹ˆํŽซ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SystemCommandHandler.cs # / ์‹œ์Šคํ…œ ๋ช…๋ น + ํƒ€์ด๋จธ/์•Œ๋žŒ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ TextStatsHandler.cs # stats ํ…์ŠคํŠธ ํ†ต๊ณ„ ๋ถ„์„ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ UninstallHandler.cs # uninstall ์•ฑ ์ œ๊ฑฐ (๋ ˆ์ง€์ŠคํŠธ๋ฆฌ) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ FavoriteHandler.cs # fav ์ฆ๊ฒจ์ฐพ๊ธฐ (ํŒŒ์ผยทํด๋”) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ MonitorHandler.cs # monitor ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ WorkspaceHandler.cs # ! ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ด€๋ฆฌ โ”‚ โ”‚ โ”œโ”€โ”€ Models/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ AppSettings.cs # ์„ค์ • POCO (JSON ์ง๋ ฌํ™”) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ DailyUsageStats.cs # ์ผ๋ณ„ ์‚ฌ์šฉ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ โ”‚ โ”‚ โ”œโ”€โ”€ Services/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ ClipboardHistoryService.cs # WM_CLIPBOARDUPDATE ํ›… โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ IndexService.cs # ํŒŒ์ผ ์‹œ์Šคํ…œ ์ธ๋ฑ์„œ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ LogService.cs # ํŒŒ์ผ ๋กœ๊ฑฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ NotificationService.cs # ํŠธ๋ ˆ์ด ํ’์„  ์•Œ๋ฆผ (ํƒ€์ด๋จธ/์•Œ๋žŒ) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ QuoteService.cs # ๋ช…์–ธ JSON ๋กœ๋” (famous.json ๋‚ด์žฅ ๋ฆฌ์†Œ์Šค) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SessionTrackingService.cs # PC ์ž ๊ธˆ/ํ•ด์ œ ์‹œ๊ฐ„ ์ถ”์  โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ L10n.cs # ์ •์  ๋‹ค๊ตญ์–ด ์„œ๋น„์Šค (ko/en/ja/zh/vi) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SettingsService.cs # settings.json ๋กœ๋“œ/์ €์žฅ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ UsageRankingService.cs # ์‹คํ–‰ ๋นˆ๋„ ์ถ”์  & ํผ์ง€ ๊ฒฐ๊ณผ ์ •๋ ฌ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ UsageStatisticsService.cs # ์ผ๋ณ„ ํ†ต๊ณ„ ์ง‘๊ณ„ (๋Ÿฐ์ฒ˜ ํ˜ธ์ถœ/๋ช…๋ น/ํ™œ์„ฑ์‹œ๊ฐ„) โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ WindowTracker.cs # ์ด์ „ ํ™œ์„ฑ ์ฐฝ ํ•ธ๋“ค ๋ณด์กด (snap/cap์šฉ) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ WorktimeReminderService.cs # ์ž ๊ธˆ ํ•ด์ œ ์‹œ ์‚ฌ์šฉ์‹œ๊ฐ„ ์•Œ๋ฆผ ํŒ์—… ์„œ๋น„์Šค โ”‚ โ”‚ โ”œโ”€โ”€ Themes/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Converters.cs # WPF ๊ฐ’ ๋ณ€ํ™˜๊ธฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Symbols.cs # Segoe MDL2 Assets ์ƒ์ˆ˜ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Dark.xaml / Light.xaml / OLED.xaml โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Nord.xaml / Monokai.xaml / Catppuccin.xaml / Sepia.xaml โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Alfred.xaml / AlfredLight.xaml โ”‚ โ”‚ โ”œโ”€โ”€ ViewModels/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ LauncherViewModel.cs # ๋Ÿฐ์ฒ˜ MVVM ViewModel โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SettingsViewModel.cs # ์„ค์ • ์ฐฝ ViewModel + ๋ณด์กฐ ๋ชจ๋ธ โ”‚ โ”‚ โ”‚ โ”‚ # (ThemeCardModel, ColorRowModel, โ”‚ โ”‚ โ”‚ โ”‚ # AppShortcutModel, SnippetRowModel) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ StatisticsViewModel.cs # ์‚ฌ์šฉ ํ†ต๊ณ„ ์ฐฝ ViewModel (DayBarItem, CommandStatItem) โ”‚ โ”‚ โ””โ”€โ”€ Views/ โ”‚ โ”‚ โ”œโ”€โ”€ LauncherWindow.xaml/.cs # ๋ฉ”์ธ ๋Ÿฐ์ฒ˜ UI โ”‚ โ”‚ โ”œโ”€โ”€ LargeTypeWindow.xaml/.cs # Large Type ์ „์ฒด ํ™”๋ฉด ์˜ค๋ฒ„๋ ˆ์ด โ”‚ โ”‚ โ”œโ”€โ”€ SettingsWindow.xaml/.cs # ์„ค์ • ์ฐฝ UI (์ขŒ์ธก ์‚ฌ์ด๋“œ๋ฐ” 10ํƒญ) โ”‚ โ”‚ โ”œโ”€โ”€ AboutWindow.xaml/.cs # ๊ฐœ๋ฐœ์ž ์ •๋ณด ์ฐฝ โ”‚ โ”‚ โ”œโ”€โ”€ HelpDetailWindow.xaml/.cs # ๋„์›€๋ง ์ „์ฒด ๋ชฉ๋ก ์นด๋“œ ์ฐฝ โ”‚ โ”‚ โ”œโ”€โ”€ EyeDropperWindow.xaml/.cs # ์ „์ฒด ํ™”๋ฉด ์Šคํฌ์ด๋“œ ์˜ค๋ฒ„๋ ˆ์ด โ”‚ โ”‚ โ”œโ”€โ”€ ColorPickResultWindow.xaml/.cs # ์ƒ‰์ƒ ์ถ”์ถœ ๊ฒฐ๊ณผ ๋ฐ˜ํˆฌ๋ช… ํŒ์—… โ”‚ โ”‚ โ”œโ”€โ”€ ReminderPopupWindow.xaml/.cs # ์ž ๊ธˆ ํ•ด์ œ ์‚ฌ์šฉ์‹œ๊ฐ„ ์•Œ๋ฆผ ํŒ์—… โ”‚ โ”‚ โ”œโ”€โ”€ StatisticsWindow.xaml/.cs # ์‚ฌ์šฉ ํ†ต๊ณ„ ์ฐจํŠธ ์ฐฝ โ”‚ โ”‚ โ””โ”€โ”€ TrayContextMenu.cs # ํŠธ๋ ˆ์ด ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด ํŒฉํ† ๋ฆฌ (๋ชจ๋˜ ํ…Œ๋งˆ ์ธ์‹) โ”‚ โ”œโ”€โ”€ AxCommander.SDK/ โ”‚ โ”‚ โ””โ”€โ”€ IActionHandler.cs # ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ณ„์•ฝ (LauncherItem, PluginMetadata) โ”‚ โ”œโ”€โ”€ AxCommander.Tests/ โ”‚ โ”‚ โ”œโ”€โ”€ Core/FuzzyEngineTests.cs # ํผ์ง€ ์—”์ง„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (19๊ฐœ) โ”‚ โ”‚ โ”œโ”€โ”€ Handlers/ClipboardTransformTests.cs # ํด๋ฆฝ๋ณด๋“œ ๋ณ€ํ™˜ ํ…Œ์ŠคํŠธ (21๊ฐœ) โ”‚ โ”‚ โ””โ”€โ”€ Services/SettingsServiceTests.cs # ์„ค์ • ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ (17๊ฐœ) โ”‚ โ”œโ”€โ”€ AxCommander.Installer.Offline/ # ์˜คํ”„๋ผ์ธ ์ธ์Šคํ†จ๋Ÿฌ (.NET 8, self-contained ZIP ๋‚ด์žฅ) โ”‚ โ”‚ โ”œโ”€โ”€ SetupForm.cs # ๋ชจ๋˜ WinForms UI (๊ทธ๋ผ๋ฐ์ด์…˜ ํ—ค๋”, ์„ค์น˜/์—…๊ทธ๋ ˆ์ด๋“œ/์ œ๊ฑฐ) โ”‚ โ”‚ โ””โ”€โ”€ Program.cs โ”‚ โ””โ”€โ”€ AxCommander.Installer.Online/ # ์˜จ๋ผ์ธ ์ธ์Šคํ†จ๋Ÿฌ (.NET Framework 4.8, ~1MB) โ”‚ โ”œโ”€โ”€ OnlineSetupForm.cs # .NET 4.8 WinForms UI + .NET 8 ๋Ÿฐํƒ€์ž„ ์ž๋™ ๋‹ค์šด๋กœ๋“œ โ”‚ โ””โ”€โ”€ Program.cs โ”œโ”€โ”€ tools/ โ”‚ โ””โ”€โ”€ IconGenerator/ # ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ์•„์ด์ฝ˜ ์ƒ์„ฑ ๋„๊ตฌ (.NET 8 ์ฝ˜์†”) โ”‚ โ””โ”€โ”€ Program.cs # ๋ณด์„ ๋‹ค์ด์•„๋ชฌ๋“œ ์ปท + RGBG 4์ƒ‰ โ†’ ICO ์ƒ์„ฑ โ”œโ”€โ”€ docs/ โ”‚ โ””โ”€โ”€ DEVELOPMENT.md # ์ด ํŒŒ์ผ โ”œโ”€โ”€ build.bat # 3์ข… ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ (๋ณธ์ฒด + ์˜คํ”„๋ผ์ธ + ์˜จ๋ผ์ธ) โ””โ”€โ”€ README.md ``` --- ## ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š” ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ App.xaml.cs โ”‚ โ”‚ (์„œ๋น„์Šค ์ดˆ๊ธฐํ™” ยท ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก ยท ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜ ๊ด€๋ฆฌ) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ LauncherWindow โ”‚ โ—„โ”€โ”€โ”€ MVVM โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ SettingsWindow โ”‚ โ”‚ (WPF, OLED ์Šคํƒ€์ผ)โ”‚ โ”‚ (์ขŒ์ธก ์‚ฌ์ด๋“œ๋ฐ”) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ์ž…๋ ฅ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ CommandResolver โ”‚ โ† ํ”„๋ฆฌํ”ฝ์Šค ๋ผ์šฐํ„ฐ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ํ”„๋ฆฌํ”ฝ์Šค ๋ถ„๊ธฐ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ = Calculator/Currency /System+Timer ; Snippet โ”‚ โ”‚ # History @ UrlAlias ~ Folder > Batch $ Clip โ”‚ โ”‚ ! Workspace ? WebSearch emoji color recent โ”‚ โ”‚ note uninstall kill media info [plugin/skill] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ํ”„๋ฆฌํ”ฝ์Šค ์—†์Œ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ FuzzyEngine โ”‚ โ† ํ•œ๊ตญ์–ด ์ดˆ์„ฑ + ํผ์ง€ ๋งค์นญ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ### ๊ฒ€์ƒ‰ ํ๋ฆ„ 1. ์‚ฌ์šฉ์ž๊ฐ€ ๋Ÿฐ์ฒ˜์— ํ…์ŠคํŠธ ์ž…๋ ฅ 2. `LauncherViewModel.InputText` setter ํŠธ๋ฆฌ๊ฑฐ 3. `CommandResolver.ResolveAsync(input)` ํ˜ธ์ถœ 4. ํ”„๋ฆฌํ”ฝ์Šค ์ผ์น˜ โ†’ ํ•ด๋‹น `IActionHandler.GetItemsAsync()` ํ˜ธ์ถœ 5. ํ”„๋ฆฌํ”ฝ์Šค ์—†์Œ โ†’ `FuzzyEngine.Search()` ํ˜ธ์ถœ 6. ๊ฒฐ๊ณผ๋ฅผ `ObservableCollection`์— ๋ฐ”์ธ๋”ฉ 7. `LauncherWindow` ListView ์ž๋™ ๊ฐฑ์‹  ### ์‹คํ–‰ ํ๋ฆ„ 1. ์‚ฌ์šฉ์ž๊ฐ€ `Enter` ํ‚ค ์ž…๋ ฅ 2. `LauncherViewModel.ExecuteSelectedAsync()` ํ˜ธ์ถœ 3. `CommandResolver.ExecuteAsync(item, lastInput)` ํ˜ธ์ถœ 4. ํ”„๋ฆฌํ”ฝ์Šค ์žˆ์Œ โ†’ `handler.ExecuteAsync(item)` ์œ„์ž„ 5. ํ”„๋ฆฌํ”ฝ์Šค ์—†์Œ โ†’ `IndexEntry.Path`๋ฅผ `Process.Start`๋กœ ์‹คํ–‰ 6. ๋Ÿฐ์ฒ˜ ์ฐฝ ์ž๋™ ์ˆจ๊น€ ### ํ…Œ๋งˆ ์ „ํ™˜ ํ๋ฆ„ 1. ์„ค์ • ์ฐฝ ํ…Œ๋งˆ ํƒญ์—์„œ ์นด๋“œ ํด๋ฆญ 2. `SettingsViewModel.SelectTheme(key)` ํ˜ธ์ถœ 3. `ThemePreviewRequested` ์ด๋ฒคํŠธ ๋ฐœ์ƒ 4. `App.PreviewCallback` โ†’ `LauncherWindow.ApplyTheme(key)` ํ˜ธ์ถœ 5. `Application.Current.Resources.MergedDictionaries` ๊ต์ฒด (๋Ÿฐํƒ€์ž„ ํ•ซ์Šค์™‘) 6. ์„ค์ • ์ €์žฅ ์—†์ด ๋‹ซ์œผ๋ฉด `RevertCallback`์œผ๋กœ ์›๋ณต --- ## ๊ฐ ํ•ธ๋“ค๋Ÿฌ ์ƒ์„ธ ### CalculatorHandler (`=`) - **์—”์ง„**: `MathEvaluator` ์žฌ๊ท€ ํ•˜๊ฐ• ํŒŒ์„œ (์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์Œ) - **์—ฐ์‚ฐ์ž**: `+`, `-`, `*`, `/`, `%`, `^` (๊ฑฐ๋“ญ์ œ๊ณฑ) - **ํ•จ์ˆ˜**: `sqrt`, `abs`, `ceil`, `floor`, `round`, `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log`, `log2`, `ln`, `exp`, `pow`, `min`, `max` - **์ƒ์ˆ˜**: `pi`, `e`, `inf` - **๋ฆฌํ„ฐ๋Ÿด**: ์ผ๋ฐ˜ ์ •์ˆ˜/์†Œ์ˆ˜, 16์ง„์ˆ˜(`0xFF`), ๊ณผํ•™์  ํ‘œ๊ธฐ(`1.5e3`) - **๋‹จ์œ„ ๋ณ€ํ™˜**: `100km in miles`, `32f in c`, `5lb to kg` ๋“ฑ (๊ธธ์ด/์˜จ๋„/๋ฌด๊ฒŒ/์†๋„/๋ฐ์ดํ„ฐ/๋„“์ด) - **ํ†ตํ™” ๋ณ€ํ™˜**: `100 USD to KRW`, `50 EUR in JPY` โ€” `open.er-api.com` ๋ฌด๋ฃŒ API, 1์‹œ๊ฐ„ ์บ์‹œ - **์‹คํ–‰**: ๊ฒฐ๊ณผ๋ฅผ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ ### SystemCommandHandler (`/`) | ๋ช…๋ น | ๊ธฐ๋Šฅ | P/Invoke | |------|------|----------| | `/lock` | ํ™”๋ฉด ์ž ๊ธˆ | `user32.LockWorkStation` | | `/sleep` | ์ ˆ์ „ | `WinForms.SetSuspendState(Suspend)` | | `/hibernate` | ์ตœ๋Œ€ ์ ˆ์ „ | `WinForms.SetSuspendState(Hibernate)` | | `/restart` | ์žฌ์‹œ์ž‘ | `shutdown /r /t 5` | | `/shutdown` | ์ข…๋ฃŒ | `shutdown /s /t 5` | | `/logout` | ๋กœ๊ทธ์•„์›ƒ | `user32.ExitWindowsEx(EWX_LOGOFF)` | | `/recycle` | ํœด์ง€ํ†ต ๋น„์šฐ๊ธฐ | `shell32.SHEmptyRecycleBin` | | `/timer 5m` | ํƒ€์ด๋จธ | `Task.Delay` + `NotificationService.Notify` | | `/timer 1h30m ํšŒ์˜` | ๋ผ๋ฒจ ํฌํ•จ ํƒ€์ด๋จธ | ์œ„์™€ ๋™์ผ | | `/alarm 14:30` | ์ง€์ • ์‹œ๊ฐ ์•Œ๋žŒ | ๋ชฉํ‘œ ์‹œ๊ฐ ๋ฏธ๋ž˜ ๊ณ„์‚ฐ + `Task.Delay` | ๊ฐ ๋ช…๋ น์€ `SystemCommandSettings`์—์„œ ๊ฐœ๋ณ„ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ. ์œ„ํ—˜ํ•œ ๋ช…๋ น(์žฌ์‹œ์ž‘, ์ข…๋ฃŒ ๋“ฑ)์€ ์‹คํ–‰ ์ „ ์ปค์Šคํ…€ ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋จธ/์•Œ๋žŒ ์™„๋ฃŒ ์‹œ ํŠธ๋ ˆ์ด ํ’์„  ์•Œ๋ฆผ(`NotificationService.Notify`). **๋ช…๋ น ๋ณ„์นญ** (v0.8 ์ถ”๊ฐ€): `CommandAliases` ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ช…๋ นํ‚ค๋ณ„ ๋ณ„์นญ ๋ชฉ๋ก ์„ค์ • ๊ฐ€๋Šฅ. ```json "commandAliases": { "lock": ["์ž ๊ธˆ", "l"], "sleep": ["์ ˆ์ „", "s"], "restart": ["์žฌ์‹œ์ž‘", "r"], "shutdown": ["์ข…๋ฃŒ"], "logout": ["๋กœ๊ทธ์•„์›ƒ"] } ``` ์˜ˆ) `/์ž ๊ธˆ` ๋˜๋Š” `/l` ์ž…๋ ฅ ์‹œ ํ™”๋ฉด ์ž ๊ธˆ ์‹คํ–‰. ์„ค์ • UI์˜ ์‹œ์Šคํ…œ ํƒญ์—์„œ ์‰ผํ‘œ ๊ตฌ๋ถ„์œผ๋กœ ํŽธ์ง‘ ๊ฐ€๋Šฅ. ### EmojiHandler (`emoji`) - 300+ ์ด๋ชจ์ง€ ๋‚ด์žฅ (ํ•œ๊ตญ์–ด+์˜์–ด ํ‚ค์›Œ๋“œ ํƒœ๊ทธ) - **์‚ฌ์šฉ**: `emoji ํ•˜ํŠธ`, `emoji wave`, `emoji` (๊ธฐ๋ณธ 30๊ฐœ) - **์‹คํ–‰**: ์ด๋ชจ์ง€ ๋ฌธ์ž๋ฅผ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ - **์นดํ…Œ๊ณ ๋ฆฌ**: ํ‘œ์ •/๊ฐ์ •, ์†/๋ชธ, ํ•˜ํŠธ/๊ธฐํ˜ธ, ์Œ์‹, ๋™๋ฌผ, ๋ฌผ๊ฑด/๋„๊ตฌ, ์ด๋™์ˆ˜๋‹จ, ์žฅ์†Œ, ๊ธฐํ˜ธ ### ColorHandler (`color`) - **์ž…๋ ฅ ํ˜•์‹**: HEX(`#FF5500`), RGB(`255,85,0` / `rgb(255,85,0)`), RGBA, HSL(`hsl(24,100%,50%)`), ์ƒ‰์ƒ ์ด๋ฆ„(`red`, `๋นจ๊ฐ•`) - **์ถœ๋ ฅ**: HEX / RGB / HSL / HSV 4๊ฐ€์ง€ ํ˜•์‹ ๋™์‹œ ํ‘œ์‹œ - **์ƒ‰์ƒ ์ด๋ฆ„**: 30+ ํ•œ/์˜ ์ƒ‰์ƒ ์ด๋ฆ„ ์ง€์› (red, ๋นจ๊ฐ•, skyblue, ํ•˜๋Š˜์ƒ‰ ๋“ฑ) - **์‹คํ–‰**: ์„ ํƒํ•œ ํ˜•์‹์„ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ ### RecentFilesHandler (`recent`) - `%APPDATA%\Microsoft\Windows\Recent` ํด๋”์˜ `.lnk` ํŒŒ์ผ ์ฝ๊ธฐ - ์ตœ๊ทผ ์ˆ˜์ • ์ˆœ ์ •๋ ฌ, ์ตœ๋Œ€ 100๊ฐœ ์Šค์บ” โ†’ 20๊ฐœ ํ‘œ์‹œ - 10์ดˆ ์บ์‹œ - **์‹คํ–‰**: Windows ์…ธ์ด `.lnk` ๋งํฌ๋ฅผ ๋”ฐ๋ผ ์›๋ณธ ํŒŒ์ผ ์‹คํ–‰ ### NoteHandler (`note`) - **์ €์žฅ**: `note ๋‚ด์ผ ํšŒ์˜ 9์‹œ` โ†’ `%APPDATA%\AxCommander\notes.txt` ์— ํƒ€์ž„์Šคํƒฌํ”„์™€ ํ•จ๊ป˜ append - **์กฐํšŒ**: `note` โ†’ ์ตœ๊ทผ 10๊ฐœ ์—ญ์ˆœ ํ‘œ์‹œ (Enter๋กœ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ) - **์ „์ฒด ์‚ญ์ œ**: `note clear` ๋˜๋Š” ๋ชฉ๋ก ๋งจ ์•„๋ž˜ ํ•ญ๋ชฉ ์„ ํƒ - **์•Œ๋ฆผ**: ์ €์žฅ ์‹œ ํŠธ๋ ˆ์ด ํ’์„  ์•Œ๋ฆผ ํ‘œ์‹œ ### UninstallHandler (`uninstall`) - `HKLM\SOFTWARE\...\Uninstall` + `HKCU\SOFTWARE\...\Uninstall` ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์Šค์บ” - `WOW6432Node` ๊ฒฝ๋กœ๋„ ํฌํ•จ (32๋น„ํŠธ ์•ฑ) - ์ด๋ฆ„ / ๊ฒŒ์‹œ์ž๋กœ ๊ฒ€์ƒ‰, 30์ดˆ ์บ์‹œ - **์‹คํ–‰**: `UninstallString` ํŒŒ์‹ฑ ํ›„ `Process.Start` โ€” `msiexec` ์ž๋™ ์ฒ˜๋ฆฌ - ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ(`SystemComponent=1`) ๋ฐ KB ํŒจ์น˜ ์ž๋™ ํ•„ํ„ฐ๋ง ### SnippetHandler (`;`) - ์„ค์ • `snippets[]` ๋ฐฐ์—ด์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ํผ์ง€ ๊ฒ€์ƒ‰ - **๋ณ€์ˆ˜ ์น˜ํ™˜**: `{date}`, `{time}`, `{datetime}`, `{year}`, `{month}`, `{day}` - **๋ถ™์—ฌ๋„ฃ๊ธฐ**: `Clipboard.SetText` ํ›„ `SendInput(Ctrl+V)` ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (100ms ์ง€์—ฐ) ### ClipboardHistoryService + ClipboardHistoryHandler (`#`) - `HwndSource(HWND_MESSAGE)` ๊ธฐ๋ฐ˜ ์ˆจ๊ฒจ์ง„ ๋ฉ”์‹œ์ง€ ์ฐฝ ์ƒ์„ฑ - `AddClipboardFormatListener` + `WM_CLIPBOARDUPDATE` ํ›… - ์ตœ๋Œ€ `maxItems`๊ฐœ ์ €์žฅ (๊ธฐ๋ณธ 50), FIFO ๋ฐฉ์‹ - **๋ณด์•ˆ ์ œ์™ธ ํŒจํ„ด**: `ExcludePatterns` Regex ๋ชฉ๋ก์œผ๋กœ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์ž๋™ ์ œ์™ธ - `SuppressNextCapture()`: ์ž์ฒด ๋ถ™์—ฌ๋„ฃ๊ธฐ ์‹œ ์ค‘๋ณต ๊ธฐ๋ก ๋ฐฉ์ง€ ### ClipboardHandler (`$`) 12๊ฐ€์ง€ ๋‚ด์žฅ ๋ณ€ํ™˜๊ธฐ: | ํ‚ค | ๋ณ€ํ™˜ | |----|------| | `$json` | JSON ํฌ๋งทํŒ… | | `$upper` / `$lower` | ๋Œ€/์†Œ๋ฌธ์ž ๋ณ€ํ™˜ | | `$ts` | Unix ํƒ€์ž„์Šคํƒฌํ”„ โ†’ ๋‚ ์งœ | | `$epoch` | ๋‚ ์งœ โ†’ Unix ํƒ€์ž„์Šคํƒฌํ”„ | | `$urle` / `$urld` | URL ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ | | `$b64e` / `$b64d` | Base64 ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ | | `$md` | Markdown ์ œ๊ฑฐ | | `$trim` | ๊ณต๋ฐฑ ์ •๋ฆฌ | | `$lines` | ๋นˆ ์ค„ ์ œ๊ฑฐ | --- ## ์„ค์ • UI (SettingsWindow) ### ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ์„ค์ • ์ฐฝ(`SettingsWindow.xaml`)์€ **์ขŒ์ธก ์‚ฌ์ด๋“œ๋ฐ” + ์šฐ์ธก ์ปจํ…์ธ ** ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. WPF `TabControl`์˜ ์ปค์Šคํ…€ `ControlTemplate`์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, `TabStripPlacement="Left"`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 820 ร— 610 โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ AX โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Commander โ”‚ โ”‚ ์„ ํƒ๋œ ํƒญ์˜ ์ปจํ…์ธ  โ”‚ โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ”‚ (ScrollViewer + StackPanel) โ”‚ โ”‚ โ”‚ โ”‚ โ— ์ผ๋ฐ˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ํ…Œ๋งˆ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ์ƒ‰์ƒ ํŽธ์ง‘ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ์Šค๋‹ˆํŽซ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ํด๋ฆฝ๋ณด๋“œ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ์‹œ์Šคํ…œ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ๋น ๋ฅธ ์‹คํ–‰ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ๋ฐฐ์น˜ ๋ช…๋ น โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ์บก์ฒ˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ์•Œ๋ฆผ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”‚ AX Commander ยท v0.0 [์ทจ์†Œ] [๐Ÿ’พ ์ €์žฅ] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ํƒญ ๊ตฌ์„ฑ | ํƒญ | MDL2 ์•„์ด์ฝ˜ | ์ฃผ์š” ์„ค์ • ํ•ญ๋ชฉ | |----|------------|--------------| | ์ผ๋ฐ˜ | E713 | ๊ธ€๋กœ๋ฒŒ ๋‹จ์ถ•ํ‚ค, ์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜, **๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์—”์ง„**, ํˆฌ๋ช…๋„, **๋Ÿฐ์ฒ˜ ์œ„์น˜**, ์ธ๋ฑ์Šค ๊ฒฝ๋กœ, **๊ฒ€์ƒ‰ ํ™•์žฅ์ž** (ํƒœ๊ทธํ˜• UI, ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ) | | ํ…Œ๋งˆ | E790 | 11๊ฐœ ํ…Œ๋งˆ ์นด๋“œ (ํด๋ฆญ โ†’ ์ฆ‰์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ): Dark/Light/OLED/Nord/Monokai/Catppuccin/Sepia/Alfred/Alfred Light/System/Custom | | ์ƒ‰์ƒ ํŽธ์ง‘ | E771 | ์ปค์Šคํ…€ ํ…Œ๋งˆ 14๊ฐœ ์ƒ‰์ƒ (์ปค์Šคํ…€ ์„ ํƒ ์‹œ๋งŒ ํ™œ์„ฑ) | | ์Šค๋‹ˆํŽซ | E70B | **์ž๋™ ํ™•์žฅ ํ† ๊ธ€**, ์Šค๋‹ˆํŽซ ์ถ”๊ฐ€/์‚ญ์ œ, ๋ณ€์ˆ˜ ์น˜ํ™˜ ์•ˆ๋‚ด | | ํด๋ฆฝ๋ณด๋“œ | E77F | ํ™œ์„ฑํ™” ํ† ๊ธ€, ์ตœ๋Œ€ ๋ณด๊ด€ ๊ฐœ์ˆ˜, ๋ณด์•ˆ ํŒจํ„ด ํ‘œ์‹œ | | ์‹œ์Šคํ…œ | E7E8 | 7๊ฐœ ์‹œ์Šคํ…œ ๋ช…๋ น ๊ฐœ๋ณ„ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”, **๋ช…๋ น๋ณ„ ๋ณ„์นญ ํŽธ์ง‘**, **๋ณ„์นญ ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”** | | ๋น ๋ฅธ ์‹คํ–‰ | E7C3 | ํ‚ค์›Œ๋“œโ†’์•ฑ/URL/ํด๋” ๋‹จ์ถ•ํ‚ค ์ถ”๊ฐ€/์‚ญ์ œ | | ๋ฐฐ์น˜ ๋ช…๋ น | E756 | **`>` ํ”„๋ฆฌํ”ฝ์Šค ๋ฐฐ์น˜ ๋ช…๋ น ์ถ”๊ฐ€/์‚ญ์ œ, ShowWindow ์˜ต์…˜** | | ์บก์ฒ˜ | E722 | `cap` ํ”„๋ฆฌํ”ฝ์Šค ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ, ํŒŒ์ผ ์ž๋™ ์ €์žฅ ํ† ๊ธ€ยท์ €์žฅ ๊ฒฝ๋กœ ์„ค์ • | | ์•Œ๋ฆผ | EA8F | ์ž ๊ธˆ ํ•ด์ œ ์•Œ๋ฆผ ํ™œ์„ฑํ™” ํ† ๊ธ€, ํ‘œ์‹œ ์œ„์น˜(4๋ฐฉํ–ฅ), ํ‘œ์‹œ ๊ฐ„๊ฒฉ, ์ž๋™ ๋‹ซํž˜ ์‹œ๊ฐ„ | ### ๋””์ž์ธ ์‹œ์Šคํ…œ **์ปฌ๋Ÿฌ ์•„์ด์ฝ˜ ๋ฐ•์Šค** โ€” ๊ฐ ์„ค์ • ํ–‰ ์ขŒ์ธก์— `36ร—36 CornerRadius="9"` ๋ฐ•์Šค๋กœ ๊ธฐ๋Šฅ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. | ๊ธฐ๋Šฅ ์˜์—ญ | ๋ฐฐ๊ฒฝ์ƒ‰ | |----------|--------| | ๋‹จ์ถ•ํ‚ค / ๋น ๋ฅธ ์‹คํ–‰ | `#4B5EFC` | | ๊ฒ€์ƒ‰ | `#00A8CC` | | ํˆฌ๋ช…๋„ / ์ ˆ์ „ | `#7B2FBE` | | ์Šค๋‹ˆํŽซ | `#FF6B35` | | ํด๋ฆฝ๋ณด๋“œ ํ™œ์„ฑํ™” | `#20B2AA` | | ๋ณด๊ด€ ๊ฐœ์ˆ˜ | `#FF8C42` | | ๋ณด์•ˆ / ํ™”๋ฉด ์ž ๊ธˆ | `#C50F1F` | | ์žฌ์‹œ์ž‘ | `#107C10` | | ์‹œ์Šคํ…œ ์ข…๋ฃŒ | `#C50F1F` | | ๋กœ๊ทธ์•„์›ƒ | `#CA5010` | **ํ† ๊ธ€ ์Šค์œ„์น˜** (`ToggleSwitch` ์Šคํƒ€์ผ) โ€” iOS ์Šคํƒ€์ผ์˜ ์ปค์Šคํ…€ `CheckBox` ์Šคํƒ€์ผ. ํด๋ฆฝ๋ณด๋“œ ํ™œ์„ฑํ™”์™€ ์‹œ์Šคํ…œ ๋ช…๋ น 7๊ฐœ์— ์ ์šฉ. ``` OFF: [โ—‹โ”€โ”€โ”€โ”€โ”€โ”€] ๋ฐฐ๊ฒฝ: #D0D0E0 ON: [โ”€โ”€โ”€โ”€โ”€โ”€โ—] ๋ฐฐ๊ฒฝ: #4B5EFC ``` **SideNavItem ์Šคํƒ€์ผ** โ€” ํƒญ ์„ ํƒ ์ƒํƒœ: - ์„ ํƒ๋จ: ์ขŒ์ธก 3px `#4B5EFC` accent bar + `#EEF0FF` ๋ฐฐ๊ฒฝ + SemiBold ํ…์ŠคํŠธ - ํ˜ธ๋ฒ„: `#F4F4FF` ๋ฐฐ๊ฒฝ - ๋น„์„ ํƒ: ํˆฌ๋ช… ๋ฐฐ๊ฒฝ ### SettingsViewModel ๋ณด์กฐ ๋ชจ๋ธ ```csharp // ํ…Œ๋งˆ ์นด๋“œ (ํ…Œ๋งˆ ํƒญ) class ThemeCardModel { Key, Name, PreviewBackground/Text/Accent/..., IsSelected } // ์ปค์Šคํ…€ ์ƒ‰์ƒ ํ–‰ (์ƒ‰์ƒ ํŽธ์ง‘ ํƒญ) class ColorRowModel { Label, Property, Hex, Preview(SolidColorBrush) } // ๋น ๋ฅธ ์‹คํ–‰ ๋‹จ์ถ•ํ‚ค (๋น ๋ฅธ ์‹คํ–‰ ํƒญ) class AppShortcutModel { Key, Description, Target, Type, TypeSymbol, TypeLabel } // ์Šค๋‹ˆํŽซ ํ–‰ (์Šค๋‹ˆํŽซ ํƒญ) class SnippetRowModel { Key, Name, Content, Preview } // ๋ฐฐ์น˜ ๋ช…๋ น ํ–‰ (๋ฐฐ์น˜ ๋ช…๋ น ํƒญ) class BatchCommandModel { Key, Command, ShowWindow } ``` --- ## ์„ค์ • ์Šคํ‚ค๋งˆ (`settings.json`) ```jsonc { "version": "1.0", "hotkey": "Alt+Space", "launcher": { "opacity": 0.96, "maxResults": 7, "theme": "dark", // system|dark|light|oled|nord|monokai|catppuccin|sepia|custom "width": 680, "position": "center-top", // center-top|center|bottom "webSearchEngine": "g", // g|n|d|y|w (Google|Naver|DuckDuckGo|YouTube|Wikipedia) "snippetAutoExpand": true, // ๊ธ€๋กœ๋ฒŒ ์Šค๋‹ˆํŽซ ์ž๋™ ํ™•์žฅ ํ™œ์„ฑํ™” "customTheme": { /* 14๊ฐœ ์ƒ‰์ƒ ํ‚ค */ } }, "indexPaths": [ "%USERPROFILE%\\Desktop", "%APPDATA%\\Microsoft\\Windows\\Start Menu" ], "indexExtensions": [ ".exe", ".lnk", ".bat", ".ps1", ".url", ".cmd", ".msi", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".hwp", ".hwpx", ".txt", ".md", ".csv", ".json", ".xml", ".yaml", ".yml", ".log", ".ini", ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".webp", ".zip", ".7z", ".rar" ], "aliases": [ { "key": "vscode", "type": "app", "target": "C:\\...\\Code.exe", "description": "VS Code" }, { "key": "gh", "type": "url", "target": "https://github.com" }, { "key": "dl", "type": "folder", "target": "%USERPROFILE%\\Downloads" }, { "key": "build", "type": "batch", "target": "dotnet build", "description": "๋นŒ๋“œ", "showWindow": true }, { "key": "test", "type": "batch", "target": "dotnet test", "description": "ํ…Œ์ŠคํŠธ", "showWindow": false } ], "snippets": [ { "key": "addr", "name": "ํšŒ์‚ฌ ์ฃผ์†Œ", "content": "์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ..." } ], "clipboardHistory": { "enabled": true, "maxItems": 50, "excludePatterns": ["^\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}$"] }, "systemCommands": { "showLock": true, "showSleep": true, "showRestart": true, "showShutdown": true, "showHibernate": false, "showLogout": true, "showRecycleBin": true, "commandAliases": { "lock": ["์ž ๊ธˆ", "l"], "sleep": ["์ ˆ์ „", "s"], "restart": ["์žฌ์‹œ์ž‘"], "shutdown": ["์ข…๋ฃŒ"], "hibernate": [], "logout": ["๋กœ๊ทธ์•„์›ƒ"], "recycle": [] } }, "clipboardTransformers": [ { "key": "$mine", "type": "regex", "pattern": "foo", "replace": "bar", "timeout": 2000 } ], "screenCapture": { "prefix": "cap", // cap ํ”„๋ฆฌํ”ฝ์Šค ๋ฌธ์ž์—ด (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ) "saveToFile": false, // true๋ฉด ์บก์ฒ˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ๋กœ๋„ ์ €์žฅ "savePath": "" // ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด %USERPROFILE%\Pictures\Screenshots\ }, "reminder": { "enabled": false, // ์ž ๊ธˆ ํ•ด์ œ ์‚ฌ์šฉ์‹œ๊ฐ„ ์•Œ๋ฆผ ํ™œ์„ฑํ™” "position": "BottomRight", // TopLeft|TopRight|BottomLeft|BottomRight "intervalMinutes": 60, // ์•Œ๋ฆผ ์ตœ์†Œ ๊ฐ„๊ฒฉ (๋ถ„): 30|60|120|240 "autoDismissSeconds": 10 // ์ž๋™ ๋‹ซํž˜ ์ดˆ: 5|10|15|20|30 }, "monitorMismatch": "warn", // fit|skip|warn "profiles": [], // !save๋กœ ์ž๋™ ๊ด€๋ฆฌ "plugins": [ { "path": "C:\\Plugins\\MyPlugin.dll", "enabled": true } ] } ``` --- ## ์ฃผ์š” ๊ธฐ๋Šฅ ์ƒ์„ธ ### ํŒŒ์ผ ์•ก์…˜ ์„œ๋ธŒ๋ฉ”๋‰ด (`โ†’` ํ‚ค) ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ํŒŒ์ผ์ด๋‚˜ ์•ฑ(IndexEntry)์ด ์„ ํƒ๋œ ์ƒํƒœ์—์„œ `โ†’` ํ‚ค(์ปค์„œ๊ฐ€ ์ž…๋ ฅ ๋์— ์žˆ์„ ๋•Œ)๋ฅผ ๋ˆ„๋ฅด๋ฉด ํŒŒ์ผ ์•ก์…˜ ์„œ๋ธŒ๋ฉ”๋‰ด๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. **์ง„์ž… ์กฐ๊ฑด**: `InputBox.CaretIndex == Text.Length && Text.Length > 0 && SelectedItem.Data is IndexEntry` **์ œ๊ณต ์•ก์…˜**: | ์•ก์…˜ | ์„ค๋ช… | ๊ตฌํ˜„ | |------|------|------| | ๊ฒฝ๋กœ ๋ณต์‚ฌ | ํŒŒ์ผ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ | `Clipboard.SetText(path)` | | ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์—์„œ ์—ด๊ธฐ | ํƒ์ƒ‰๊ธฐ์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์„ ํƒ ์ƒํƒœ๋กœ ํ‘œ์‹œ | `explorer.exe /select,"path"` | | ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ | UAC ๊ถŒํ•œ ์ƒ์Šน ํ›„ ์‹คํ–‰ (ํŒŒ์ผ๋งŒ, ํด๋” ์ œ์™ธ) | `ProcessStartInfo { Verb = "runas" }` | | ํ„ฐ๋ฏธ๋„์—์„œ ์—ด๊ธฐ | Windows Terminal ๋˜๋Š” cmd.exe๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ ์—ด๊ธฐ | `wt.exe -d "dir"` โ†’ ์‹คํŒจ ์‹œ `cmd.exe /k cd /d "dir"` | **์ƒํƒœ ํ๋ฆ„**: ``` ์ผ๋ฐ˜ ๋ชจ๋“œ โ†’ [โ†’ ํ‚ค] โ†’ ์•ก์…˜ ๋ชจ๋“œ (breadcrumb ๋ฐ” ํ‘œ์‹œ) โ†’ [Enter] โ†’ ์•ก์…˜ ์‹คํ–‰ + ๋‹ซ๊ธฐ โ†’ [Esc] โ†’ ์ผ๋ฐ˜ ๋ชจ๋“œ ๋ณต๊ท€ (์ด์ „ ์ฟผ๋ฆฌ ๋ณต์›) ``` **๊ด€๋ จ ์ฝ”๋“œ**: - `LauncherViewModel.EnterActionMode()` โ€” ์•ก์…˜ ํ•ญ๋ชฉ ๋นŒ๋“œ ๋ฐ `_savedQuery` ์ €์žฅ - `LauncherViewModel.ExitActionMode()` โ€” ์ด์ „ ์ฟผ๋ฆฌ ๋ณต์› ๋ฐ ์žฌ๊ฒ€์ƒ‰ - `LauncherViewModel.ExecuteFileAction()` โ€” ์ •์  ๋ฉ”์„œ๋“œ๋กœ ์•ก์…˜ ์‹คํ–‰ - `LauncherWindow.xaml` โ€” `Grid.Row="1"` breadcrumb ๋ฐ” (ShowActionModeBar ๋ฐ”์ธ๋”ฉ) --- ### Large Type (`Shift+Enter`) ์„ ํƒ๋œ ํ•ญ๋ชฉ์˜ ํ…์ŠคํŠธ๋ฅผ ์ „์ฒด ํ™”๋ฉด ์˜ค๋ฒ„๋ ˆ์ด๋กœ ํฌ๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. **ํ‘œ์‹œ ํ…์ŠคํŠธ ์šฐ์„ ์ˆœ์œ„**: 1. ๊ณ„์‚ฐ๊ธฐ ๊ฒฐ๊ณผ (`SelectedItem.Data is string`) โ†’ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ’ 2. ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ ํ…์ŠคํŠธ (`ClipboardEntry.IsText`) โ†’ ์ „์ฒด ํ…์ŠคํŠธ 3. ๊ธฐ๋ณธ โ†’ `SelectedItem.Title` **๊ธ€๊ผด ํฌ๊ธฐ ์ž๋™ ๊ฒฐ์ •** (`LargeTypeWindow`): | ํ…์ŠคํŠธ ๊ธธ์ด | FontSize | |------------|---------| | โ‰ค 10์ž | 120 | | โ‰ค 30์ž | 96 | | โ‰ค 60์ž | 72 | | โ‰ค 120์ž | 52 | | ๊ทธ ์™ธ | 38 | `Viewbox Stretch=Uniform`์œผ๋กœ ์ตœ์ข… ํฌ๊ธฐ๋ฅผ ํ™”๋ฉด์— ๋งž๊ฒŒ ์Šค์ผ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค. **๋‹ซ๊ธฐ**: `Esc` ํ‚ค / ํ™”๋ฉด ํด๋ฆญ / ์šฐ์ƒ๋‹จ ๋ฒ„ํŠผ **๊ด€๋ จ ์ฝ”๋“œ**: - `Views/LargeTypeWindow.xaml/.cs` โ€” ์ „์ฒด ํ™”๋ฉด ์˜ค๋ฒ„๋ ˆ์ด ์ฐฝ - `LauncherViewModel.GetLargeTypeText()` โ€” ํ…์ŠคํŠธ ์ถ”์ถœ ๋กœ์ง - `LauncherWindow.xaml.cs` โ†’ `ShowLargeType()` โ†’ `new LargeTypeWindow(text).Show()` > **์ฃผ์˜**: ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ ๋Œ€๊ธฐ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ `Shift+Enter`๋ฅผ ๋ˆ„๋ฅด๋ฉด Large Type ๋Œ€์‹  **ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ**์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. --- ### ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ (`Shift+โ†‘โ†“`, `Shift+Enter`) `#` ํ”„๋ฆฌํ”ฝ์Šค(ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ) ๋ชจ๋“œ์—์„œ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์—ฌ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. **์กฐ์ž‘๋ฒ•**: | ํ‚ค | ๋™์ž‘ | |----|------| | `Shift+โ†“` | ํ˜„์žฌ ํ•ญ๋ชฉ ์„ ํƒ/ํ•ด์ œ ํ›„ ๋‹ค์Œ ํ•ญ๋ชฉ์œผ๋กœ ์ด๋™ | | `Shift+โ†‘` | ํ˜„์žฌ ํ•ญ๋ชฉ ์„ ํƒ/ํ•ด์ œ ํ›„ ์ด์ „ ํ•ญ๋ชฉ์œผ๋กœ ์ด๋™ | | `Shift+Enter` | ์„ ํƒ๋œ ํ•ญ๋ชฉ๋“ค์„ `\n`์œผ๋กœ ํ•ฉ์ณ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ | | `Esc` | ์„ ํƒ ์ทจ์†Œ ๋ฐ ๋ชจ๋“œ ์ข…๋ฃŒ | **ํžŒํŠธ ๋ฐ”**: ์„ ํƒ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด `Grid.Row="3"` ํžŒํŠธ ๋ฐ” ํ‘œ์‹œ ``` โœ“ 2๊ฐœ ์„ ํƒ๋จ ยท Shift+Enter๋กœ ํ•ฉ์น˜๊ธฐ ยท Esc๋กœ ์ทจ์†Œ ``` **๋ณ‘ํ•ฉ ์ˆœ์„œ**: `Results` ์ปฌ๋ ‰์…˜์˜ ํ‘œ์‹œ ์ˆœ์„œ ๊ธฐ์ค€ (HashSet ์ˆœ์„œ ์•„๋‹˜) **๊ด€๋ จ ์ฝ”๋“œ**: - `LauncherViewModel._mergeQueue` โ€” `HashSet` ๋ณ‘ํ•ฉ ๋Œ€๊ธฐ ํ - `LauncherViewModel.ToggleMergeItem()` โ€” ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ œ๊ฑฐ ํ† ๊ธ€ - `LauncherViewModel.ExecuteMerge()` โ€” Results ์ˆœ์„œ ๊ธฐ์ค€์œผ๋กœ `\n` ๊ฒฐํ•ฉ ํ›„ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ - `LauncherViewModel.ClearMerge()` โ€” ํ ์ดˆ๊ธฐํ™” --- ### ๋Ÿฐ์ฒ˜ ํ‚ค ๋ฐ”์ธ๋”ฉ ์ „์ฒด ํ‘œ | ํ‚ค | ๋™์ž‘ | |----|------| | `โ†‘` / `โ†“` | ๊ฒฐ๊ณผ ๋ชฉ๋ก ํƒ์ƒ‰ | | `Enter` | ์„ ํƒ ํ•ญ๋ชฉ ์‹คํ–‰ | | `Shift+Enter` | Large Type ํ‘œ์‹œ (๋ณ‘ํ•ฉ ํ•ญ๋ชฉ ์žˆ์œผ๋ฉด ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ) | | `โ†’` (์ปค์„œ ๋) | ํŒŒ์ผ ์•ก์…˜ ์„œ๋ธŒ๋ฉ”๋‰ด ์ง„์ž… | | `Shift+โ†“` | ํ˜„์žฌ ํ•ญ๋ชฉ ๋ณ‘ํ•ฉ ์„ ํƒ + ๋‹ค์Œ์œผ๋กœ ์ด๋™ | | `Shift+โ†‘` | ํ˜„์žฌ ํ•ญ๋ชฉ ๋ณ‘ํ•ฉ ์„ ํƒ + ์ด์ „์œผ๋กœ ์ด๋™ | | `Tab` | ์„ ํƒ ํ•ญ๋ชฉ ์ œ๋ชฉ์„ ์ž…๋ ฅ์ฐฝ์— ์ž๋™์™„์„ฑ | | `Esc` | ์•ก์…˜ ๋ชจ๋“œ๋ฉด ์ด์ „ ํ™”๋ฉด ๋ณต๊ท€ / ์•„๋‹ˆ๋ฉด ๋Ÿฐ์ฒ˜ ๋‹ซ๊ธฐ | | `Ctrl+,` | ์„ค์ • ์ฐฝ ์—ด๊ธฐ | --- ## ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” `%APPDATA%\AxCommander\`์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. EXE ์‹คํ–‰ ํŒŒ์ผ ์˜†์—๋Š” ์–ด๋–ค ํŒŒ์ผ๋„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์–ด๋А ๊ฒฝ๋กœ์—์„œ ์‹คํ–‰ํ•ด๋„ ์‹คํ–‰ ํŒŒ์ผ ํด๋”๋Š” ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ``` %APPDATA%\AxCommander\ โ”œโ”€โ”€ settings.json # ์ „์ฒด ์„ค์ • (JSON ํ‰๋ฌธ) โ”œโ”€โ”€ clipboard_history.dat # ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ (DPAPI ์•”ํ˜ธํ™” ๋ฐ”์ด๋„ˆ๋ฆฌ) โ”œโ”€โ”€ usage.json # ์‹คํ–‰ ๋นˆ๋„ ๋žญํ‚น ๋ฐ์ดํ„ฐ โ”œโ”€โ”€ notes.txt # ๋น ๋ฅธ ๋ฉ”๋ชจ ์ €์žฅ โ”œโ”€โ”€ favorites.json # ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ชฉ๋ก โ”œโ”€โ”€ routines.json # ๋ฃจํ‹ด ์ž๋™ํ™” ์ •์˜ (์‚ฌ์šฉ์ž ํŽธ์ง‘ ๊ฐ€๋Šฅ) โ”œโ”€โ”€ logs/ โ”‚ โ””โ”€โ”€ app-YYYY-MM-DD.log # ์ผ๋ณ„ ๋กœ๊ทธ (14์ผ ์ž๋™ ์‚ญ์ œ) โ”œโ”€โ”€ stats/ โ”‚ โ””โ”€โ”€ YYYY-MM-DD.json # ์ผ๋ณ„ ์‚ฌ์šฉ ํ†ต๊ณ„ (30์ผ ์ž๋™ ์‚ญ์ œ) โ”œโ”€โ”€ templates/ โ”‚ โ””โ”€โ”€ *.json # ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ ์‚ฌ์šฉ์ž ํ…œํ”Œ๋ฆฟ โ””โ”€โ”€ plugins/ โ””โ”€โ”€ *.dll # ์™ธ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ (์„ ํƒ) ``` **์ž๋™ ์‚ญ์ œ ์ •์ฑ…**: | ํŒŒ์ผ | ๋ณด์กด ๊ธฐ๊ฐ„ | ๋ฐฉ์‹ | |------|----------|------| | ๋กœ๊ทธ (`logs/app-*.log`) | 14์ผ | ์•ฑ ์‹œ์ž‘ ์‹œ 1ํšŒ `PurgeOldLogs()` | | ํ†ต๊ณ„ (`stats/*.json`) | 30์ผ | ํ†ต๊ณ„ ๊ธฐ๋ก ์‹œ `PurgeOldFiles()` | | ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ | ๋ฌด๊ธฐํ•œ (์ตœ๋Œ€ ํ•ญ๋ชฉ ์ˆ˜ ์ œํ•œ) | `maxItems` ์„ค์ •๊ฐ’ ๊ธฐ์ค€ FIFO | | ๊ธฐํƒ€ (settings, notes ๋“ฑ) | ๋ฌด๊ธฐํ•œ | ์ˆ˜๋™ ๊ด€๋ฆฌ | --- ## ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ | ํ•ญ๋ชฉ | ๊ตฌํ˜„ | |------|------| | URL ์Šคํ‚ด ๊ฒ€์ฆ | `http`, `https`, `ftp`, `ftps`, `ms-settings`, `mailto`, `file` ํ—ˆ์šฉ. `javascript:` ๋“ฑ ์ฐจ๋‹จ | | PowerShell ์ธ์ ์…˜ ๋ฐฉ์ง€ | `>` ๋ช…๋ น์–ด ์ž…๋ ฅ์˜ `"` ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ | | ReDoS ๋ฐฉ์ง€ | ์‚ฌ์šฉ์ž ์ •์˜ Regex์— `TimeSpan` ํƒ€์ž„์•„์›ƒ ์ ์šฉ | | ์ž๊ฒฉ์ฆ๋ช… ์ €์žฅ | Windows Credential Manager (`advapi32.dll`, DPAPI ์•”ํ˜ธํ™”) | | ํด๋ฆฝ๋ณด๋“œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ | Regex ๊ธฐ๋ฐ˜ ์ œ์™ธ ํŒจํ„ด (`excludePatterns`) โ€” ์‹ ์šฉ์นด๋“œยทIP ๋“ฑ ๊ธฐ๋ณธ ์ฐจ๋‹จ | | API ํƒ€์ž„์•„์›ƒ | JSON ์Šคํ‚ฌ HTTP ์š”์ฒญ 3์ดˆ ์ œํ•œ | | ์‹œ์Šคํ…œ ๋ช…๋ น ํ™•์ธ | ์žฌ์‹œ์ž‘ยท์ข…๋ฃŒยท๋กœ๊ทธ์•„์›ƒ ์‹คํ–‰ ์ „ ์ปค์Šคํ…€ ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ 2๋‹จ๊ณ„ ์ ์šฉ | | **๋””์ปดํŒŒ์ผ ๋ฐฉ์ง€** | `Security/AntiTamper.cs` โ€” ๋””๋ฒ„๊ฑฐ ๊ฐ์ง€ (๊ด€๋ฆฌํ˜•+๋„ค์ดํ‹ฐ๋ธŒ+์›๊ฒฉ), ๋””์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๊ฐ์ง€ (dnSpy, ILSpy, dotPeek, x64dbg ๋“ฑ 15์ข…), Release ๋นŒ๋“œ๋งŒ ํ™œ์„ฑ | | **PDB ์ œ๊ฑฐ** | Release ๋นŒ๋“œ ์‹œ `DebugType=none`, `DebugSymbols=false`. build.bat์—์„œ `.pdb`/`.xml` ์ „์ˆ˜ ์‚ญ์ œ | | **์†Œ์Šค ๋งํฌ ๋น„ํ™œ์„ฑ** | `EnableSourceLink=false`, `EmbedAllSources=false` โ€” ์†Œ์Šค ์ฝ”๋“œ ๊ฒฝ๋กœ ๋…ธ์ถœ ์ฐจ๋‹จ | | **๋‚œ๋…ํ™” ํ˜ธํ™˜** | `[assembly: Obfuscation]` ์†์„ฑ ์ ์šฉ. Obfuscar/ConfuserEx/Dotfuscator ์—ฐ๋™ ์‹œ ์ž๋™ ๋‚œ๋…ํ™” | --- ## ํ…Œ๋งˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ…Œ๋งˆ XAML ํŒŒ์ผ(`Themes/*.xaml`)์€ ์ƒ‰์ƒ 14๊ฐœ + ๋ชจ์–‘ 2๊ฐœ = **์ด 16๊ฐœ ResourceKey**๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค: | ํ‚ค | ํƒ€์ž… | ์šฉ๋„ | |----|------|------| | `LauncherBackground` | SolidColorBrush | ์ „์ฒด ๋ฐฐ๊ฒฝ | | `ItemBackground` | SolidColorBrush | ํ•ญ๋ชฉ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ | | `ItemSelectedBackground` | SolidColorBrush | ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋ฐฐ๊ฒฝ | | `ItemHoverBackground` | SolidColorBrush | ํ˜ธ๋ฒ„ ๋ฐฐ๊ฒฝ | | `PrimaryText` | SolidColorBrush | ์ฃผ ํ…์ŠคํŠธ ์ƒ‰์ƒ | | `SecondaryText` | SolidColorBrush | ๋ณด์กฐ ํ…์ŠคํŠธ ์ƒ‰์ƒ | | `PlaceholderText` | SolidColorBrush | ํ”Œ๋ ˆ์ด์Šคํ™€๋” ํ…์ŠคํŠธ | | `AccentColor` | SolidColorBrush | ๊ฐ•์กฐ์ƒ‰ (์„ ํƒ ๋ฐ”, ๋ฐฐ์ง€ ๋“ฑ) | | `SeparatorColor` | SolidColorBrush | ๊ตฌ๋ถ„์„  ์ƒ‰์ƒ | | `HintBackground` | SolidColorBrush | ํžŒํŠธ ๋ฐฐ๊ฒฝ | | `HintText` | SolidColorBrush | ํžŒํŠธ ํ…์ŠคํŠธ | | `BorderColor` | SolidColorBrush | ์ฐฝ ํ…Œ๋‘๋ฆฌ | | `ScrollbarThumb` | SolidColorBrush | ์Šคํฌ๋กค๋ฐ” ์ƒ‰์ƒ | | `ShadowColor` | Color | ๋“œ๋กญ ์„€๋„์šฐ ์ƒ‰์ƒ | | `WindowCornerRadius` | CornerRadius | ์ฐฝ ์ „์ฒด ๋ชจ์„œ๋ฆฌ ๋ผ์šด๋”ฉ | | `ItemCornerRadius` | CornerRadius | ๊ฒฐ๊ณผ ํ•ญ๋ชฉ ๋ชจ์„œ๋ฆฌ ๋ผ์šด๋”ฉ | **ํ…Œ๋งˆ๋ณ„ ๋ชจ์„œ๋ฆฌ ๋ผ์šด๋”ฉ ๊ฐ’**: | ํ…Œ๋งˆ | WindowCornerRadius | ItemCornerRadius | ํŠน์ง• | |------|-------------------|-----------------|------| | Dark / Light | 20 | 10 | ๊ธฐ๋ณธ ๋ถ€๋“œ๋Ÿฌ์šด ๋ผ์šด๋”ฉ | | OLED | 26 | 13 | ๊ฐ€์žฅ ๋‘ฅ๊ทผ ํ˜•ํƒœ | | Catppuccin | 22 | 12 | ์•ฝ๊ฐ„ ๋” ๋‘ฅ๊ทผ ํŒŒ์Šคํ…” ๋А๋‚Œ | | Nord | 16 | 8 | ์•ฝ๊ฐ„ ๊ฐ์ง„ ๋ถ์œ ๋Ÿฝ ์Šคํƒ€์ผ | | Monokai | 14 | 6 | ์—๋””ํ„ฐ ์Šคํƒ€์ผ โ€” ์ ๋‹นํžˆ ๊ฐ์ง„ | | Sepia | 12 | 6 | ํด๋ž˜์‹ํ•˜๊ณ  ์ฐจ๋ถ„ํ•œ ๋А๋‚Œ | | Alfred / AlfredLight | 14 | 6 | Alfred ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ๋น„์œจ | **ํŠธ๋ ˆ์ด ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด**: `TrayContextMenu.cs`์˜ `ModernTrayRenderer`๋Š” ๋Ÿฐํƒ€์ž„์— `Application.Current.Resources`์—์„œ WPF ํ…Œ๋งˆ ์ƒ‰์ƒ(`LauncherBackground`, `AccentColor` ๋“ฑ)์„ ์ฝ์–ด ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ๋ฐฐ๊ฒฝยทํ…์ŠคํŠธยทํ˜ธ๋ฒ„ ์ƒ‰์ƒ์— ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ…Œ๋งˆ๋ฅผ ์ „ํ™˜ํ•˜๋ฉด ๋‹ค์Œ ๋ฉ”๋‰ด ์˜คํ”ˆ ์‹œ ์ƒˆ ํ…Œ๋งˆ๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. **์ƒˆ ํ…Œ๋งˆ ์ถ”๊ฐ€ ์ˆœ์„œ**: 1. `Themes/MyTheme.xaml` ์ž‘์„ฑ (์œ„ 16๊ฐœ ํ‚ค ๋ชจ๋‘ ์ •์˜, `WindowCornerRadius`ยท`ItemCornerRadius` ํฌํ•จ) 2. `.csproj`์— `` ์ถ”๊ฐ€ 3. `LauncherWindow.xaml.cs`์˜ `GetEffectiveThemeName()` switch์— ์ผ€์ด์Šค ์ถ”๊ฐ€ 4. `SettingsViewModel.ThemeCards` ๋ชฉ๋ก์— `ThemeCardModel` ํ•ญ๋ชฉ ์ถ”๊ฐ€ --- ## ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ```bash dotnet test src/AxCommander.Tests ``` | ํŒŒ์ผ | ํ…Œ์ŠคํŠธ ์ˆ˜ | ๋Œ€์ƒ | |------|----------|------| | `FuzzyEngineTests.cs` | 19 | CalculateScore, FuzzyMatch, ์ดˆ์„ฑ ๊ฒ€์ƒ‰ | | `ClipboardTransformTests.cs` | 21 | 12๊ฐœ ๋‚ด์žฅ ๋ณ€ํ™˜๊ธฐ | | `SettingsServiceTests.cs` | 17 | ๊ธฐ๋ณธ๊ฐ’, JSON ์ง๋ ฌํ™” ๋ผ์šด๋“œํŠธ๋ฆฝ | ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋Š” `InternalsVisibleTo`๋กœ `internal` ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. --- ## ์ฝ”๋“œ ๊ฒ€ํ†  ์ด๋ ฅ ### v0.3 ์ตœ์ข… ๊ฒ€ํ†  ๊ฒฐ๊ณผ (2026-03-24) ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ **์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ์—†์Œ** ํ™•์ธ. v0.3 ์‹ ๊ทœ ์ฝ”๋“œ ํฌํ•จ. | ๊ฒ€ํ†  ํ•ญ๋ชฉ | ๊ฒฐ๊ณผ | |----------|------| | ํƒ€์ž… ์ฐธ์กฐ (`Symbols.Lock`, `Symbols.MediaPlay`, `Symbols.Computer`) | โœ… ๋ชจ๋‘ `Themes/Symbols.cs`์— ์ •์˜๋จ | | XAML ์ปจ๋ฒ„ํ„ฐ (`BoolToVisibility`, `CountToVisibility`, `SymbolToBackground` ๋“ฑ) | โœ… `App.xaml`์— ๋ชจ๋‘ ๋“ฑ๋ก๋จ | | ViewModel ๋ฐ”์ธ๋”ฉ (`ShowActionModeBar`, `ActionModeBreadcrumb`, `ShowMergeHint`, `MergeHintText`) | โœ… `LauncherViewModel`์— ๋ชจ๋‘ ์ •์˜๋จ | | `LauncherItem` ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋ถ€ (`Symbol:` named parameter) | โœ… SDK ๋ ˆ์ฝ”๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ผ์น˜ | | `ClipboardEntry` `IsText` / `Text` ํ”„๋กœํผํ‹ฐ | โœ… `ClipboardHistoryService.cs`์— ์ •์˜๋จ | | `HashSet` ๋™๋“ฑ์„ฑ | โœ… record ๊ตฌ์กฐ์  ๋™๋“ฑ์„ฑ + ๋™์ผ ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ์ •์ƒ ์ž‘๋™ | | `IndexEntry.Path` ํ”„๋กœํผํ‹ฐ | โœ… `IndexService.cs`์— ์ •์˜๋จ | | `FileAction` enum / `FileActionData` record ์ ‘๊ทผ์„ฑ | โœ… ๋™์ผ ํŒŒ์ผ(ViewModels) ๋‚ด ์ •์˜, ์ ‘๊ทผ ๊ฐ€๋Šฅ | | `LargeTypeWindow` ๋„ค์ž„์ŠคํŽ˜์ด์Šค | โœ… `AxCommander.Views` โ€” LauncherWindow์™€ ๋™์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, import ๋ถˆํ•„์š” | | `LauncherWindow.xaml` Grid.Row ๋ฒˆํ˜ธ | โœ… Row 0~4 ์ˆœ์„œ ์ •ํ™• (0:์ž…๋ ฅ, 1:์•ก์…˜๋ฐ”, 2:๊ตฌ๋ถ„์„ , 3:๋ณ‘ํ•ฉํžŒํŠธ, 4:๋ฆฌ์ŠคํŠธ) | --- ## ๋ฒ„๊ทธ ์ˆ˜์ • ์ด๋ ฅ ### v0.1 โ†’ v0.2 | ํŒŒ์ผ | ๋ฌธ์ œ | ์ˆ˜์ • ๋‚ด์šฉ | |------|------|----------| | `InputListener.cs` | `LogService.Services.LogService.XXX()` โ€” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฝ๋กœ๋กœ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ | `using AxCommander.Services;` ์ถ”๊ฐ€ ํ›„ `LogService.XXX()` ์ง์ ‘ ํ˜ธ์ถœ๋กœ ์ˆ˜์ •. ํŒŒ์ผ ํ•˜๋‹จ์˜ ๋นˆ `namespace LogService { }` ์„ ์–ธ ์ œ๊ฑฐ | ### v0.2 โ†’ v0.3 | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Core/HotkeyParser.cs` (์‹ ๊ทœ) | ํ•ซํ‚ค ๋ฌธ์ž์—ด ํŒŒ์‹ฑ/ํฌ๋งท โ€” `"Alt+Space"` โ†” `HotkeyDefinition` ๋ณ€ํ™˜ | | `Core/InputListener.cs` | ํ•˜๋“œ์ฝ”๋”ฉ Alt+Space ์ œ๊ฑฐ โ†’ `HotkeyDefinition` ๊ธฐ๋ฐ˜ ๋™์  ํ•ซํ‚ค + `SuspendHotkey` ์ง€์› | | `Views/SettingsWindow.xaml/.cs` | Alfred ์Šคํƒ€์ผ ํ•ซํ‚ค ๋ ˆ์ฝ”๋” UI (ํด๋ฆญ โ†’ ๋ฐฐ์ง€ ํ‘œ์‹œ โ†’ ํ‚ค ์ž…๋ ฅ ์บก์ฒ˜) | | `Views/LargeTypeWindow.xaml/.cs` (์‹ ๊ทœ) | ์ „์ฒด ํ™”๋ฉด Large Type ์˜ค๋ฒ„๋ ˆ์ด | | `ViewModels/LauncherViewModel.cs` | ํŒŒ์ผ ์•ก์…˜ ๋ชจ๋“œ + ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ + Large Type ํ…์ŠคํŠธ ์ถ”์ถœ ์ถ”๊ฐ€ | | `Views/LauncherWindow.xaml` | ์•ก์…˜ ๋ชจ๋“œ breadcrumb ๋ฐ” (Row 1) + ๋ณ‘ํ•ฉ ํžŒํŠธ ๋ฐ” (Row 3) ์ถ”๊ฐ€ | | `Views/LauncherWindow.xaml.cs` | `โ†’`, `Shift+Enter`, `Shift+โ†‘โ†“` ํ‚ค ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ / Esc ์•ก์…˜๋ชจ๋“œ ๋ถ„๊ธฐ | | `App.xaml.cs` | ์„ค์ • ์ €์žฅ ํ›„ ํ•ซํ‚ค ๊ฐฑ์‹  + SuspendHotkey ์ฝœ๋ฐฑ ์ฃผ์ž… | ### v0.3 โ†’ v0.4 (Alfred ๋น„๊ต ๊ธฐ๋ฐ˜ ์„ค์ • UI ๊ฐœ์„ ) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Models/AppSettings.cs` | `LauncherSettings`์— `WebSearchEngine`, `SnippetAutoExpand`, `Position` ํ•„๋“œ ์ถ”๊ฐ€ | | `Handlers/WebSearchHandler.cs` | ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์—”์ง„์„ ํ•˜๋“œ์ฝ”๋”ฉ์—์„œ `settings.Launcher.WebSearchEngine` ๋Ÿฐํƒ€์ž„ ์ฝ๊ธฐ๋กœ ์ „ํ™˜ / ๋ถˆํ•„์š”ํ•œ `using AxCommander.Models` ์ œ๊ฑฐ | | `App.xaml.cs` | `WebSearchHandler` ์ƒ์„ฑ์ž์— `settings` ์ฃผ์ž… | | `Core/SnippetExpander.cs` | `HandleKey()` ์ง„์ž…๋ถ€์— `SnippetAutoExpand` ๋น„ํ™œ์„ฑํ™” ์‹œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ ์ถ”๊ฐ€ | | `ViewModels/LauncherViewModel.cs` | `WindowPosition` ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ (์„ค์ • ์—ฐ๋™) | | `Views/LauncherWindow.xaml.cs` | `CenterOnScreen()` โ€” `position` ์„ค์ • ์—ฐ๋™ + `ActualHeight/Width = 0` ๋ฐฉ์–ด ์ฒ˜๋ฆฌ | | `ViewModels/SettingsViewModel.cs` | `LauncherPosition`, `WebSearchEngine`, `SnippetAutoExpand` ๋ฐ”์ธ๋”ฉ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ / `BatchCommandModel` ๋ฐ ๋ฐฐ์น˜ ๋ช…๋ น CRUD ์ถ”๊ฐ€ | | `Views/SettingsWindow.xaml` | ์ผ๋ฐ˜ ํƒญ: ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์—”์ง„ยท๋Ÿฐ์ฒ˜ ์œ„์น˜ ComboBox ์ถ”๊ฐ€ / ์Šค๋‹ˆํŽซ ํƒญ: ์ž๋™ ํ™•์žฅ ํ† ๊ธ€ ์ถ”๊ฐ€ / 8๋ฒˆ์งธ ํƒญ ๋ฐฐ์น˜ ๋ช…๋ น ํƒญ ์ถ”๊ฐ€ | | `Views/SettingsWindow.xaml.cs` | `AddBatchCommand_Click`, `DeleteBatchCommand_Click` ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ | **๋ฒ„๊ทธ ์ˆ˜์ •**: | ํŒŒ์ผ | ๋ฒ„๊ทธ | ์ˆ˜์ • | |------|------|------| | `Views/LauncherWindow.xaml.cs` | `CenterOnScreen()` โ€” ์ฒซ `Show()` ํ˜ธ์ถœ ์‹œ ๋ ˆ์ด์•„์›ƒ ํŒจ์Šค ์ด์ „ `ActualHeight`๊ฐ€ 0์ด ๋˜๋Š” ํƒ€์ด๋ฐ ์ด์Šˆ | `var h = ActualHeight > 0 ? ActualHeight : 80` ๋ฐฉ์–ด ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ | | `Handlers/WebSearchHandler.cs` | `using AxCommander.Models` โ€” ํŒŒ์ผ ๋‚ด Models ํƒ€์ž… ๋ฏธ์‚ฌ์šฉ ๋ถˆํ•„์š”ํ•œ ์ž„ํฌํŠธ | ํ•ด๋‹น `using` ์ œ๊ฑฐ | ### v0.4 โ†’ v0.5 (๋ฐฐํฌ ์ค€๋น„ + About ์ฐฝ + ํŠธ๋ ˆ์ด ๊ธฐ๋Šฅ ๊ฐ•ํ™”) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `App.xaml.cs` | ์ž๋™ ์‹œ์ž‘ ํ† ๊ธ€ โ€” `HKCU\...\Run` ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ์ฒดํฌ๋ฐ•์Šค ํ•ญ๋ชฉ ์ถ”๊ฐ€ | | `App.xaml.cs` | "์ •๋ณด" ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ํ•ญ๋ชฉ ์ถ”๊ฐ€ โ†’ `AboutWindow` ์˜คํ”ˆ | | `Views/AboutWindow.xaml/.cs` (์‹ ๊ทœ) | ๊ฐœ๋ฐœ์ž ์ •๋ณด ์ฐฝ โ€” ๊ทธ๋ผ๋ฐ์ด์…˜ ํ—ค๋”, ๋งˆ์Šค์ฝ”ํŠธ ์ด๋ฏธ์ง€, ๊ฐœ๋ฐœ ๋ชฉ์ , ๋ธ”๋กœ๊ทธ ๋งํฌ, ๋ฒ„์ „ ์ •๋ณด | | `AxCommander.csproj` | `Assets/mascot.png/.jpg/.webp` ์กฐ๊ฑด๋ถ€ CopyToOutputDirectory ์ถ”๊ฐ€ | | `Views/SettingsWindow.xaml` | ๋‹จ์ถ•ํ‚ค ์•„์ด์ฝ˜ E704(InkingTool) โ†’ E765(Keyboard) ์ˆ˜์ • | | `Views/LargeTypeWindow.xaml` | `LineHeight="1.2"` ์ œ๊ฑฐ โ€” WPF LineHeight๋Š” ํ”ฝ์…€ ๋‹จ์œ„, 1.2px๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ์œ ๋ฐœ | | `AxCommander.csproj` | `` ์ถ”๊ฐ€ โ€” WPF+WinForms ๋™์‹œ ์‚ฌ์šฉ ์‹œ `KeyEventArgs` ๋ชจํ˜ธ์„ฑ ํ•ด์†Œ | **์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ ํ™•์ธ**: `%APPDATA%\AxCommander\settings.json` โ€” ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ ์‚ฌ์šฉ ์ค‘, ๋ณ„๋„ ๋ณ€๊ฒฝ ์—†์Œ. **๋ฐฐํฌ ๋ฐฉ์‹**: `dotnet publish` โ†’ ๋‹จ์ผ `.exe` ํŒŒ์ผ (SelfContained, PublishSingleFile). ์ธ์Šคํ†จ๋Ÿฌ ์—†์ด EXE ๋ณต์‚ฌ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ. ### v0.5 โ†’ v0.6 (Alfred ๋น„๊ต ๊ธฐ๋ฐ˜ 7๊ฐœ ๊ธฐ๋Šฅ ์ถ”๊ฐ€) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Handlers/EmojiHandler.cs` (์‹ ๊ทœ) | `emoji` ํ”„๋ฆฌํ”ฝ์Šค, 300+ ์ด๋ชจ์ง€ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ•œ/์˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰, ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ | | `Handlers/ColorHandler.cs` (์‹ ๊ทœ) | `color` ํ”„๋ฆฌํ”ฝ์Šค, HEX/RGB/RGBA/HSL/์ƒ‰์ƒ์ด๋ฆ„ โ†’ HEX+RGB+HSL+HSV 4์ข… ๋ณ€ํ™˜ | | `Handlers/SystemCommandHandler.cs` | `/timer`, `/alarm` ์ถ”๊ฐ€ โ€” ์‹œ๊ฐ„ ๋ฌธ์ž์—ด ํŒŒ์‹ฑ(5m/1h30m/30s), Task.Delay ๊ธฐ๋ฐ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒ€์ด๋จธ | | `Handlers/RecentFilesHandler.cs` (์‹ ๊ทœ) | `recent` ํ”„๋ฆฌํ”ฝ์Šค, Windows Recent .lnk ํŒŒ์‹ฑ, ์ตœ๊ทผ์ˆœ ์ •๋ ฌ, 10์ดˆ ์บ์‹œ | | `Handlers/CalculatorHandler.cs` | `= 100 USD to KRW` ํ†ตํ™” ๋ณ€ํ™˜ ์ถ”๊ฐ€ โ€” `CurrencyConverter` ๋‚ด๋ถ€ ํด๋ž˜์Šค, `open.er-api.com` ๋ฌด๋ฃŒ API, 1์‹œ๊ฐ„ ์บ์‹œ, `async` ์ „ํ™˜ | | `Handlers/UninstallHandler.cs` (์‹ ๊ทœ) | `uninstall` ํ”„๋ฆฌํ”ฝ์Šค, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ HKLM/HKCU/WOW6432Node ์Šค์บ”, msiexec/exe ์ œ๊ฑฐ ์‹คํ–‰ | | `Handlers/NoteHandler.cs` (์‹ ๊ทœ) | `note` ํ”„๋ฆฌํ”ฝ์Šค, notes.txt append ์ €์žฅ, ์—ญ์ˆœ ์กฐํšŒ, clear ๋ช…๋ น, ValueTuple ๋ช…์‹œ์  ํŒจํ„ด ๋งค์นญ | | `Services/NotificationService.cs` (์‹ ๊ทœ) | static delegate ํŒจํ„ด โ€” App.xaml.cs์—์„œ ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜๊ณผ ์—ฐ๊ฒฐ, ํƒ€์ด๋จธ/์•Œ๋žŒ ์•Œ๋ฆผ์— ์‚ฌ์šฉ | | `Themes/Symbols.cs` | Emoji/ColorPicker/Timer/RecentFiles/Currency/Uninstall/Note ์‹ฌ๋ณผ ์ถ”๊ฐ€ | | `App.xaml.cs` | 5๊ฐœ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก (Emoji/Color/Recent/Note/Uninstall) + `NotificationService.Initialize()` ์—ฐ๊ฒฐ | **๋ฒ„๊ทธ ์ˆ˜์ •**: | ํŒŒ์ผ | ๋ฒ„๊ทธ | ์ˆ˜์ • | |------|------|------| | `Handlers/NoteHandler.cs` | `case ("__SAVE__", string content):` โ€” `object?` ํƒ€์ž…์— ๋Œ€ํ•œ positional ํŒจํ„ด ์ปดํŒŒ์ผ ๋ถˆ์•ˆ์ • | `case ValueTuple t when t.Item1 == "__SAVE__":` ๋ช…์‹œ์  ํƒ€์ž… ํŒจํ„ด์œผ๋กœ ๋ณ€๊ฒฝ | | `Themes/Symbols.cs` | `Warning` ์ƒ์ˆ˜ ์ค‘๋ณต ์ •์˜ (์‹ ๊ทœ ์ถ”๊ฐ€ ์‹œ ์‹ค์ˆ˜) | ํ•˜๋‹จ ์ค‘๋ณต ์ œ๊ฑฐ | ### v0.6 โ†’ v0.7 (๊ฐœ๋ฐœ์ž ๋„๊ตฌ + ํ™”๋ฉด ์บก์ฒ˜ + ๋žญํ‚น ์‹œ์Šคํ…œ) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Handlers/PortHandler.cs` (์‹ ๊ทœ) | `port` ํ”„๋ฆฌํ”ฝ์Šค, TCP ํ™œ์„ฑ ์—ฐ๊ฒฐ ์กฐํšŒ, ํฌํŠธ๋ฒˆํ˜ธ/ํ”„๋กœ์„ธ์Šค๋ช… ๊ฒ€์ƒ‰, netstat -ano PID ๋งคํ•‘ | | `Services/UsageRankingService.cs` (์‹ ๊ทœ) | ์‹คํ–‰ ๋นˆ๋„ JSON ์ €์žฅ(`usage.json`), `SortByUsage()` ์ œ๊ณต | | `Core/CommandResolver.cs` | ํผ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ `UsageRankingService.SortByUsage()`๋กœ ์žฌ์ •๋ ฌ, IndexEntry ์‹คํ–‰ ์‹œ `RecordExecution()` ํ˜ธ์ถœ | | `Handlers/EnvHandler.cs` (์‹ ๊ทœ) | `env` ํ”„๋ฆฌํ”ฝ์Šค, ์šฐ์„ ์ˆœ์œ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ 20๊ฐœ ํ‘œ์‹œ, ํ‚ค/๊ฐ’ ๋ชจ๋‘ ๊ฒ€์ƒ‰, Enter๋กœ ๋ณต์‚ฌ | | `Handlers/JsonHandler.cs` (์‹ ๊ทœ) | `json` ํ”„๋ฆฌํ”ฝ์Šค, ํด๋ฆฝ๋ณด๋“œ ๋˜๋Š” ์ธ๋ผ์ธ JSON ํŒŒ์‹ฑ, `format`/`minify` ์„œ๋ธŒ์ปค๋งจ๋“œ, `System.Text.Json` ๋‚ด์žฅ | | `Handlers/EncodeHandler.cs` (์‹ ๊ทœ) | `encode ` ํ”„๋ฆฌํ”ฝ์Šค(๋’ค ๊ณต๋ฐฑ), base64/url/hex/md5/sha1/sha256/sha512/html ์ธ์ฝ”๋”ฉ + decode ์ ‘๋‘์‚ฌ๋กœ ์—ญ๋ณ€ํ™˜ | | `Services/WindowTracker.cs` (์‹ ๊ทœ) | `GetForegroundWindow()` P/Invoke, `Capture()` ํ˜ธ์ถœ ์‹œ PreviousWindow ์ €์žฅ | | `Handlers/SnapHandler.cs` (์‹ ๊ทœ) | `snap` ํ”„๋ฆฌํ”ฝ์Šค, left/right/top/bottom/full/tl/tr/bl/br/center/restore, `SetWindowPos` + `GetMonitorInfo` | | `Handlers/ScreenCaptureHandler.cs` (์‹ ๊ทœ) | `cap` ํ”„๋ฆฌํ”ฝ์Šค, screen(์ „์ฒด)/window(์ฐฝ)/scroll(์Šคํฌ๋กค ์บก์ฒ˜), `PrintWindow`+`BitBlt`, ์˜ค๋ฒ„๋žฉ ๊ฒ€์ถœ ์Šคํ‹ฐ์นญ, `%USERPROFILE%\Pictures\Screenshots\` ์ €์žฅ | | `Themes/Symbols.cs` | PortIcon/EnvVar/JsonValid/JsonFormat/JsonMinify/EncodeIcon/SnapLayout/CaptureIcon/ScrollCapture ์‹ฌ๋ณผ ์ถ”๊ฐ€ | | `App.xaml.cs` | 6๊ฐœ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก (Port/Env/Json/Encode/Snap/ScreenCapture) + `OnHotkeyTriggered()`์— `WindowTracker.Capture()` ์ถ”๊ฐ€ | **v0.7 ์ฝ”๋“œ ๊ฒ€ํ†  ํ›„ ์ฆ‰์‹œ ์ˆ˜์ • (๋ฒ„๊ทธ ํ”ฝ์Šค):** | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | |------|----------| | `Handlers/PortHandler.cs` | `GetPidForPort()`๊ฐ€ ๋ฃจํ”„๋งˆ๋‹ค `netstat -ano` ์‹คํ–‰ํ•˜๋˜ N+1 ๋ฌธ์ œ โ†’ `RefreshProcessCache()` ๋‚ด๋ถ€์—์„œ netstat 1ํšŒ ์‹คํ–‰ ํ›„ `_pidMap(ํฌํŠธโ†’PID)` ์บ์‹œ ๊ตฌ์ถ•. `GetPidForPort()`๋Š” ์บ์‹œ ์กฐํšŒ๋งŒ ์ˆ˜ํ–‰ | | `Handlers/ScreenCaptureHandler.cs` | `AreSimilar()`/`FindOverlap()`์˜ `GetPixel()` ํ”ฝ์…€ ๋น„๊ต โ†’ `LockBits + unsafe ํฌ์ธํ„ฐ` ์—ฐ์‚ฐ์œผ๋กœ ๊ต์ฒด (~50ร— ์†๋„ ํ–ฅ์ƒ) | | `ViewModels/LauncherViewModel.cs` | `PrefixMap`์— v0.6 ํ•ธ๋“ค๋Ÿฌ(emoji/color/recent/note/uninstall) + v0.7 ํ•ธ๋“ค๋Ÿฌ(port/env/json/encode/snap/cap) + `/`(SystemCommand) ๋ˆ„๋ฝ ํ•ญ๋ชฉ ์ผ๊ด„ ์ถ”๊ฐ€. `kill`/`media`/`info` ํ‚ค๋ฅผ ๊ณต๋ฐฑ ํฌํ•จ ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ • | | `AxCommander.csproj` | `true` ์ถ”๊ฐ€ | **์Šคํฌ๋กค ์บก์ฒ˜ ๋™์ž‘ ๋ฐฉ์‹**: 1. `WindowTracker.PreviousWindow`์— ์ €์žฅ๋œ ์ด์ „ ํ™œ์„ฑ ์ฐฝ์„ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ํ™œ์„ฑํ™” 2. `PrintWindow(PW_RENDERFULLCONTENT=2)` ๋˜๋Š” `CopyFromScreen` ํด๋ฐฑ์œผ๋กœ ์ฒซ ํ”„๋ ˆ์ž„ ์บก์ฒ˜ 3. `WM_VSCROLL SB_PAGEDOWN` (์Šคํฌ๋กค ๊ฐ€๋Šฅ ์ž์‹ ์ฐฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” `WM_KEYDOWN VK_NEXT` ์ „์†ก 4. 120ms ๋Œ€๊ธฐ ํ›„ ์žฌ์บก์ฒ˜, ์ด์ „ ํ”„๋ ˆ์ž„ ํ•˜๋‹จ 20%์™€ ๋น„๊ตํ•˜์—ฌ 97% ์ด์ƒ ์œ ์‚ฌํ•˜๋ฉด ์Šคํฌ๋กค ์ข…๋ฃŒ ๊ฐ์ง€ โ†’ ์ค‘๋‹จ 5. ๊ฐ ํ”„๋ ˆ์ž„ ์‚ฌ์ด ์˜ค๋ฒ„๋žฉ ํ”ฝ์…€ ์ˆ˜๋ฅผ ํ”ฝ์…€ ์ƒ˜ํ”Œ๋ง์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋น„๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋งŒ ์ˆ˜์ง ์Šคํ‹ฐ์นญ 6. ๊ฒฐ๊ณผ๋ฅผ `%USERPROFILE%\Pictures\Screenshots\scroll_yyyyMMdd_HHmmss.png`๋กœ ์ €์žฅ + ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ **์‹คํ–‰ ๋นˆ๋„ ๋žญํ‚น ๋™์ž‘ ๋ฐฉ์‹**: - ํผ์ง€ ๊ฒ€์ƒ‰(ํŒŒ์ผ/์•ฑ/ํด๋”) ์‹คํ–‰ ์‹œ `IndexEntry.Path`๋ฅผ ํ‚ค๋กœ ์นด์šดํŠธ ์ฆ๊ฐ€ - `usage.json`์— ๋น„๋™๊ธฐ ์ €์žฅ (์•ฑ ์ข…๋ฃŒ ์‹œ์—๋„ ๋ˆ„์ ๋จ) - ๋‹ค์Œ ๊ฒ€์ƒ‰๋ถ€ํ„ฐ `SortByUsage`๋กœ ์ƒ์œ„ ํ•ญ๋ชฉ์ด ๊ฒฐ๊ณผ ๋ชฉ๋ก ์ตœ์ƒ๋‹จ์— ํ‘œ์‹œ ### About ์ฐฝ (`AboutWindow`) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [๋ธ”๋ฃจ-ํผํ”Œ ๊ทธ๋ผ๋ฐ์ด์…˜ ํ—ค๋”] โ”‚ โ”‚ (๋งˆ์Šค์ฝ”ํŠธ ์ด๋ฏธ์ง€ ์›ํ˜•) โ”‚ โ”‚ AX Commander โ”‚ โ”‚ v0.0 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”Œโ”€โ”€โ”€ ๊ฐœ๋ฐœ ๋ชฉ์  ๋ฐฐ๋„ˆ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ์—…๋ฌด ํŽธ์˜์„ฑ ์ฆ๊ฐ€ ๋ฐ LLM ... โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ ๐Ÿข AX์—ฐ๊ตฌ์†Œ AIํŒ€ โ”‚ โ”‚ ๋ฐฑ์Šน์žฌ ยท SW Architect โ”‚ โ”‚ ๐Ÿ”— www.swarchitect.net โ”‚ โ”‚ โ”‚ โ”‚ AX Commander ยท .NET 8 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` - ์•ฑ ์•„์ด์ฝ˜: `Assets/icon.ico` โ€” ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ๋ณด์„ ์ปท ๋””์ž์ธ (Blue/Green/Red/Green 4์ƒ‰, ํฐ์ƒ‰ facet ์„ ) - 7๊ฐœ ํฌ๊ธฐ (16, 24, 32, 48, 64, 128, 256px) ํฌํ•จ - `tools/IconGenerator/` ์ฝ˜์†” ์•ฑ์œผ๋กœ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ: `dotnet run -- <์ถœ๋ ฅ๊ฒฝ๋กœ>` - SVG ์›๋ณธ: `Assets/diamond_pixel.svg` - ๋งˆ์Šค์ฝ”ํŠธ ์ด๋ฏธ์ง€: `Assets/mascot.png` (๋˜๋Š” .jpg/.webp) ์กด์žฌ ์‹œ ์ž๋™ ๋กœ๋“œ, ์—†์œผ๋ฉด ์•ฑ ์•„์ด์ฝ˜ ํ‘œ์‹œ - ์ •๋ณด ์ฐฝ: ์ดˆ๊ธฐ ํ‘œ์‹œ ์‹œ ์•ฑ ์•„์ด์ฝ˜, ๊ฐœ๋ฐœ์ž ์ด๋ฆ„ ํด๋ฆญ ์‹œ ๋งˆ์Šค์ฝ”ํŠธ ์˜ค๋ฒ„๋ ˆ์ด - ์ฐฝ ๋“œ๋ž˜๊ทธ ์ด๋™ ๊ฐ€๋Šฅ (`MouseDown` โ†’ `DragMove`) - ๋ธ”๋กœ๊ทธ ๋งํฌ ํด๋ฆญ ์‹œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๊ธฐ --- ## v0.7 3์ฐจ ์ „์ฒด ์ ๊ฒ€ ์ˆ˜์ • (๋ฒ„๊ทธยท๋ณด์•ˆยท์Šค๋ ˆ๋”ฉ) > ๋นŒ๋“œ ์˜ค๋ฅ˜ 3๊ฑด, ์ปดํŒŒ์ผ ๊ฒฝ๊ณ  1๊ฑด, ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ 6๊ฑด, ๋ณด์•ˆ ์ด์Šˆ 2๊ฑด์„ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ### ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ์ˆ˜์ • | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | ์˜ค๋ฅ˜ ์ฝ”๋“œ | |------|----------|----------| | `Services/UsageRankingService.cs` | `using System.IO;` ๋ˆ„๋ฝ ์ถ”๊ฐ€ (`Path`, `File`, `Directory` ์ธ์‹ ๋ถˆ๊ฐ€) | CS0103 | | `Views/SettingsWindow.xaml.cs` | `Key.Enter`์™€ `Key.Return` ์ค‘๋ณต switch ์ผ€์ด์Šค โ†’ `Key.Enter or Key.Return` ๋‹จ์ผ arm์œผ๋กœ ํ†ตํ•ฉ | CS8510 | | `Core/ContextManager.cs` | `EnumDisplayMonitors` ์ฝœ๋ฐฑ ๋žŒ๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜ผํ•ฉ ํƒ€์ž… (`ref RECT` + ์•”์‹œ์  `_`) โ†’ ์ „์ฒด ๋ช…์‹œ์  ํƒ€์ž…์œผ๋กœ ์ˆ˜์ • (ร—2) | CS0748 | | `Assets/icon.ico` | ์•„์ด์ฝ˜ ํŒŒ์ผ ๋ˆ„๋ฝ โ†’ ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ๋ณด์„ ์•„์ด์ฝ˜์œผ๋กœ ๊ต์ฒด (`tools/IconGenerator`๋กœ ์ƒ์„ฑ, 7ํฌ๊ธฐ ICO) | CS7064 | | `Views/SettingsWindow.xaml.cs` | `NewIndexPathBox` nullable ์—ญ์ฐธ์กฐ โ†’ null ์กฐ๊ฑด ์ถ”๊ฐ€ | CS8602 | ### ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ ์ˆ˜์ • | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | ์‹ฌ๊ฐ๋„ | |------|----------|-------| | `Handlers/JsonSkillLoader.cs` | `NavigatePath`: `field[0` ๊ฐ™์ด `]` ์—†๋Š” ๊ฒฝ๋กœ ํŒŒ์‹ฑ ์‹œ `IndexOf` ๋ฐ˜ํ™˜ โˆ’1๋กœ ์ธํ•œ ์˜ˆ์™ธ โ†’ `closingIdx < 0` ์กฐ๊ธฐ ๋ฐ˜ํ™˜ ์ถ”๊ฐ€ | HIGH | | `Services/ClipboardHistoryService.cs` | `_ignoreNext` ํ”Œ๋ž˜๊ทธ๋ฅผ `volatile bool`๋กœ ์„ ์–ธํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ | MEDIUM | | `Services/ClipboardHistoryService.cs` | `Initialize()` ํ˜ธ์ถœ ์‹œ ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋œ ๊ฒฝ์šฐ(`_msgSource != null`) ๋˜๋Š” `Dispose()` ํ›„ ์žฌํ˜ธ์ถœ ๋ฐฉ์ง€ ๊ฐ€๋“œ ์ถ”๊ฐ€ | MEDIUM | | `Services/ClipboardHistoryService.cs` | `Dispose()` ์ค‘๋ณต ํ˜ธ์ถœ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ `_disposed` ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€ | MEDIUM | | `Services/IndexService.cs` | `ScheduleRebuild`: `_debounceTimer` ๊ต์ฒด ์‹œ ๋น„์›์ž์  Dispose + ์žฌํ• ๋‹น์„ `_timerLock` ์œผ๋กœ ๋ณดํ˜ธ | MEDIUM | | `Services/SettingsService.cs` | settings.json ๋ฐฑ์—… ์‹คํŒจ ์‹œ ๋นˆ `catch {}` โ†’ `LogService.Warn`์œผ๋กœ ์›์ธ ๊ธฐ๋ก | MEDIUM | ### ๋ณด์•ˆ ์ˆ˜์ • | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | ์‹ฌ๊ฐ๋„ | |------|----------|-------| | `Handlers/JsonSkillLoader.cs` | `ExecuteAsync`: `item.ActionUrl` ์‹คํ–‰ ์ „ `http`/`https` ์Šคํ‚ด ๊ฒ€์ฆ ์ถ”๊ฐ€ โ€” API ์‘๋‹ต์ด ์กฐ์ž‘๋œ `file://` ๋“ฑ ๋น„ํ‘œ์ค€ URL ์‹คํ–‰ ๋ฐฉ์ง€ | MEDIUM | ### ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | |------|----------| | `Handlers/SystemCommandHandler.cs` | `allCommands` ๋ชฉ๋ก์—์„œ `timer`ยท`alarm` no-op ํ•ญ๋ชฉ ์ œ๊ฑฐ โ€” ๋‘ ๋ช…๋ น์€ `q.StartsWith` early-return์œผ๋กœ ์™„์ „ํžˆ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, `Action = () => Task.CompletedTask` ํ•ญ๋ชฉ์€ ํด๋ฆญ ์‹œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž ํ˜ผ๋ž€ ์œ ๋ฐœ | --- ## v0.7 2์ฐจ ์ฝ”๋“œ ๊ฒ€ํ†  ์ˆ˜์ • (์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ  ์ œ๊ฑฐ) | ํŒŒ์ผ | ์ˆ˜์ • ๋‚ด์šฉ | ๊ฒฝ๊ณ  ์ฝ”๋“œ | |------|----------|----------| | `Services/UsageRankingService.cs` | `using AxCommander.Services;` ์ž๊ธฐ ์ž์‹  namespace import ์ œ๊ฑฐ | CS0105 | | `Handlers/PortHandler.cs` | `UdpStatistics? udpStats = null;` ๋ฏธ์‚ฌ์šฉ ๋ณ€์ˆ˜ ์ œ๊ฑฐ | CS0219 | | `Handlers/PortHandler.cs` | `using System.Net;` ๋ฏธ์‚ฌ์šฉ using ์ œ๊ฑฐ (๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํƒ€์ž…์€ `System.Net.NetworkInformation`์—์„œ ํ™•๋ณด) | IDE0005 | | `Handlers/ScreenCaptureHandler.cs` | ๋ฏธ์‚ฌ์šฉ P/Invoke `keybd_event` ์„ ์–ธ ์ œ๊ฑฐ (์‹ค์ œ ํ‚ค ์ „์†ก์€ `SendMessage`๋กœ ๊ตฌํ˜„) | CS0649 | | `Handlers/ScreenCaptureHandler.cs` | ๋ฏธ์‚ฌ์šฉ ์ƒ์ˆ˜ `KEYEVENTF_KEYUP`, `SB_BOTTOM` ์ œ๊ฑฐ | CS0219 | | `Handlers/SnapHandler.cs` | ์ฃผ์„ `"snap " ํ”„๋ฆฌํ”ฝ์Šค` โ†’ `"snap" ํ”„๋ฆฌํ”ฝ์Šค` (์‹ค์ œ Prefix ํ•„๋“œ์™€ ์ผ์น˜) | ๋ฌธ์„œ ์˜ค๋ฅ˜ | ### v0.7 โ†’ v0.8 (UI ๊ฐœ์„  + ๋ช…๋ น ๋ณ„์นญ + ์‚ฌ์šฉ ํ†ต๊ณ„) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Views/SettingsWindow.xaml` | ์Šค๋‹ˆํŽซ ํƒญ "์ถ”๊ฐ€" ๋ฒ„ํŠผ `Width="60"` โ†’ `MinWidth="72"` (ํ…์ŠคํŠธ ์ž˜๋ฆผ ์ˆ˜์ •) | | `Models/AppSettings.cs` | `SystemCommandSettings`์— `CommandAliases` ๋”•์…”๋„ˆ๋ฆฌ ์ถ”๊ฐ€ | | `Handlers/SystemCommandHandler.cs` | `GetItemsAsync` ํ•„ํ„ฐ๋ง์— ๋ณ„์นญ ๋งค์นญ ์ถ”๊ฐ€ โ€” `/์ž ๊ธˆ`, `/l` ๋“ฑ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ„์นญ์œผ๋กœ๋„ ๋ช…๋ น ์ ‘๊ทผ ๊ฐ€๋Šฅ | | `ViewModels/SettingsViewModel.cs` | `AliasLock`ยท`AliasSleep`ยท`AliasRestart`ยท`AliasShutdown`ยท`AliasHibernate`ยท`AliasLogout`ยท`AliasRecycle` 7๊ฐœ ๋ณ„์นญ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ / `ResetSystemCommandAliases()` ์ถ”๊ฐ€ | | `Views/SettingsWindow.xaml` | ์‹œ์Šคํ…œ ํƒญ ํ–‰์„ 4์—ด ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์žฌ์„ค๊ณ„ โ€” [์•„์ด์ฝ˜][์ด๋ฆ„/ํ”„๋ฆฌํ”ฝ์Šค][๋ณ„์นญ TextBox][ํ† ๊ธ€], "๋ณ„์นญ ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”" ๋ฒ„ํŠผ ์ถ”๊ฐ€ | | `Views/SettingsWindow.xaml.cs` | `ResetCommandAliases_Click` ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ | | `Models/DailyUsageStats.cs` (์‹ ๊ทœ) | ์ผ๋ณ„ ์‚ฌ์šฉ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ โ€” `LauncherOpens`, `CommandUsage`, `ActiveSeconds` | | `Services/UsageStatisticsService.cs` (์‹ ๊ทœ) | static ํ†ต๊ณ„ ์„œ๋น„์Šค โ€” `%APPDATA%\AxCommander\stats\YYYY-MM-DD.json` ์ €์žฅ, 30์ผ ๋กค๋ง ์‚ญ์ œ, `RecordLauncherOpen()` / `RecordCommandUsage()` / `AddActiveSeconds()` / `GetStats()` | | `Services/SessionTrackingService.cs` (์‹ ๊ทœ) | `SystemEvents.SessionSwitch` ๊ธฐ๋ฐ˜ PC ํ™œ์„ฑ ์‹œ๊ฐ„ ์ถ”์  โ€” ์ž ๊ธˆ ์‹œ ๋ˆ„์  ์ดˆ ๊ธฐ๋ก, ํ•ด์ œ ์‹œ ํƒ€์ด๋จธ ์žฌ๊ฐœ, `Dispose()` ์‹œ ํ”Œ๋Ÿฌ์‹œ | | `ViewModels/StatisticsViewModel.cs` (์‹ ๊ทœ) | `DayBarItem` / `CommandStatItem` ๋ ˆ์ฝ”๋“œ, `LauncherOpenBars` / `ActiveTimeBars` / `TopCommands` ์ปฌ๋ ‰์…˜, ์š”์•ฝ ์นด๋“œ ๋ฌธ์ž์—ด | | `Views/StatisticsWindow.xaml` (์‹ ๊ทœ) | ๋‹คํฌ ๊ทธ๋ผ๋ฐ์ด์…˜ ํ—ค๋”, 4๊ฐœ ์š”์•ฝ ์นด๋“œ, ๋Ÿฐ์ฒ˜ ํ˜ธ์ถœ ๋ง‰๋Œ€ ์ฐจํŠธ (์ตœ๊ทผ 14์ผ), PC ํ™œ์„ฑ ์‹œ๊ฐ„ ๋ง‰๋Œ€ ์ฐจํŠธ (์ตœ๊ทผ 14์ผ), ์ƒ์œ„ ๋ช…๋ น ์ˆœ์œ„ ๋ชฉ๋ก | | `Views/StatisticsWindow.xaml.cs` (์‹ ๊ทœ) | ๋“œ๋ž˜๊ทธ ์ด๋™, ์ƒˆ๋กœ๊ณ ์นจ/๋‹ซ๊ธฐ ๋ฒ„ํŠผ ํ•ธ๋“ค๋Ÿฌ | | `Views/TrayContextMenu.cs` | `GlyphStats = "\uE9D9"` (Chart) ์ƒ์ˆ˜ ์ถ”๊ฐ€ | | `App.xaml.cs` | `_sessionTracking` ํ•„๋“œ ์ถ”๊ฐ€, `OnHotkeyTriggered()`์— `UsageStatisticsService.RecordLauncherOpen()` ์ถ”๊ฐ€, ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด "์‚ฌ์šฉ ํ†ต๊ณ„" ํ•ญ๋ชฉ ์ถ”๊ฐ€, `OnExit()`์— `_sessionTracking?.Dispose()` ์ถ”๊ฐ€ | | `Core/CommandResolver.cs` | `ExecuteAsync()`์— ๋ช…๋ น ์‚ฌ์šฉ ํ†ต๊ณ„ ๊ธฐ๋ก ์ถ”๊ฐ€ โ€” ํ”„๋ฆฌํ”ฝ์Šค + ์ฒซ ๋‹จ์–ด๋ฅผ ํ‚ค๋กœ `UsageStatisticsService.RecordCommandUsage()` ํ˜ธ์ถœ | **์‚ฌ์šฉ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ**: `%APPDATA%\AxCommander\stats\` **์ผ๋ณ„ JSON ํ˜•์‹**: ```json { "date": "2026-03-26", "launcherOpens": 42, "commandUsage": { "/lock": 3, "=": 8, ";addr": 5 }, "activeSeconds": 18432 } ``` **์ฐจํŠธ ๊ตฌ์„ฑ**: - ๋Ÿฐ์ฒ˜ ํ˜ธ์ถœ ํšŸ์ˆ˜: ์ตœ๊ทผ 14์ผ ๋ง‰๋Œ€ ์ฐจํŠธ (์˜ค๋Š˜ ๊ฐ•์กฐ) - PC ํ™œ์„ฑ ์‹œ๊ฐ„: ์ตœ๊ทผ 14์ผ ๋ง‰๋Œ€ ์ฐจํŠธ (์ดˆ โ†’ ์‹œ๊ฐ„ ํ™˜์‚ฐ) - ์ƒ์œ„ ๋ช…๋ น: 30์ผ ํ•ฉ์‚ฐ Top 10, ์ˆœ์œ„ + ๋ช…๋ นํ‚ค + ์‚ฌ์šฉํšŸ์ˆ˜ + ๋น„์œจ ๋ฐ” **๋นŒ๋“œ ๊ฒ€์ฆ**: `dotnet build --output "C:/Temp/axtest"` โ€” **0 errors, 0 warnings** ํ™•์ธ ### v0.8 โ†’ v0.9 (UX ๋ฒ„๊ทธ ์ˆ˜์ • + ํด๋ฆฝ๋ณด๋“œ ์˜์†์„ฑ + ๋‹ค๊ตญ์–ด + ๋‹จ์ผ ์ธ์Šคํ„ด์Šค) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Views/LauncherWindow.xaml` | `Window` ์š”์†Œ์— `PreviewKeyDown="Window_PreviewKeyDown"` ์ถ”๊ฐ€. TextBox์—์„œ ํ‚ค ํ•ธ๋“ค๋Ÿฌ ์ œ๊ฑฐ (ScrollViewer ํ‚ค ์†Œ๋น„ ๋ฌธ์ œ ํ•ด๊ฒฐ) | | `Views/LauncherWindow.xaml.cs` | `Window_PreviewKeyDown` ์œผ๋กœ EscapeยทEnterยทDownยทUpยทRightยทTab ์ผ๊ด„ ์ฒ˜๋ฆฌ. Tab ์ปค์„œ ์œ„์น˜๋ฅผ `Dispatcher.BeginInvoke(DispatcherPriority.Input)`์œผ๋กœ ๋’ค๋กœ ์ด๋™ ์ˆ˜์ •. `Window_KeyDown`์€ Ctrl+, ์ „๋‹ด | | `Services/ClipboardHistoryService.cs` | JSON ์˜์†์„ฑ ์ถ”๊ฐ€ โ€” `%APPDATA%\AxCommander\clipboard_history.json`. `Initialize()` ์‹œ ๋กœ๋“œ, ํ•ญ๋ชฉ ๋ณ€๊ฒฝยท์‚ญ์ œ ์‹œ ๋น„๋™๊ธฐ ์ €์žฅ, `Dispose()` ์‹œ ๋™๊ธฐ ์ €์žฅ | | `Handlers/ClipboardHistoryHandler.cs` | ํด๋ฆฝ๋ณด๋“œ ํ•ญ๋ชฉ ์„ ํƒ ํ›„ ์ด์ „ ์ฐฝ ํฌ์ปค์Šค ๋ณต์› + Ctrl+V ์ž๋™ ๋ถ™์—ฌ๋„ฃ๊ธฐ. `SetForegroundWindow` P/Invoke ์ถ”๊ฐ€, 150ms ๋”œ๋ ˆ์ด ํ›„ `WindowTracker.PreviousWindow`๋กœ ํฌ์ปค์Šค ์ด๋™ | | `App.xaml.cs` | ๋‹จ์ผ ์ธ์Šคํ„ด์Šค Mutex (`Global\\AXCommander_SingleInstance`) ์ถ”๊ฐ€. ์ค‘๋ณต ์‹คํ–‰ ์‹œ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€ ํ›„ `Shutdown()`. ํŠธ๋ ˆ์ด `DoubleClick` โ†’ `MouseClick` (์ขŒํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ๋Ÿฐ์ฒ˜ ํ† ๊ธ€). `L10n.SetLanguage(settings.Settings.Launcher.Language)` ํ˜ธ์ถœ ์ถ”๊ฐ€. `OnExit()`์— Mutex ํ•ด์ œ ์ถ”๊ฐ€ | | `Services/SettingsService.cs` | `CreateDefaults()` ์—์„œ `D:\Non_Document` ์กด์žฌ ์‹œ ์ธ๋ฑ์Šค ๊ฒฝ๋กœ์— ์ž๋™ ์ถ”๊ฐ€ | | `Services/L10n.cs` (์‹ ๊ทœ) | ์ •์  ๋‹ค๊ตญ์–ด ์„œ๋น„์Šค โ€” `L10n.SetLanguage(lang)` / `L10n.Get(key)`. ์ง€์› ์–ธ์–ด: koยทenยทjaยทzhยทvi. ํ‚ค: placeholderยทloadingยทno_resultsยทclipboard_emptyยทmerge_hint ๋“ฑ | | `Models/AppSettings.cs` | `LauncherSettings`์— `Language` ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ (`"ko"` ๊ธฐ๋ณธ๊ฐ’) | | `ViewModels/SettingsViewModel.cs` | `Language` ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€, `Save()` ์‹œ `L10n.SetLanguage()` ํ˜ธ์ถœ | | `ViewModels/LauncherViewModel.cs` | `PlaceholderText` โ†’ `L10n.Get("placeholder")` ๋ฐ˜ํ™˜ | | `Views/SettingsWindow.xaml` | ์ผ๋ฐ˜ ํƒญ ์ƒ๋‹จ์— ์–ธ์–ด ์„ ํƒ ComboBox ์ถ”๊ฐ€ (ํ•œ๊ตญ์–ด/English/ๆ—ฅๆœฌ่ชž/ไธญๆ–‡/Tiแบฟng Viแป‡t) | | `Handlers/HelpHandler.cs` | ํ—ค๋” ํ•ญ๋ชฉ `Data = "__HELP_OVERVIEW__"` ์„ค์ •. `ExecuteAsync` ์—์„œ `HelpDetailWindow` ์—ด๊ธฐ | | `Views/HelpDetailWindow.xaml` (์‹ ๊ทœ) | ํ”„๋ ˆ์ž„๋ฆฌ์Šค ๋‹คํฌ ์ฐฝ (720ร—640). ๋ชจ๋“  ๋„์›€๋ง ํ•ญ๋ชฉ์„ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ. ESC ๋‹ซ๊ธฐ, ๋“œ๋ž˜๊ทธ ์ด๋™ | | `Views/HelpDetailWindow.xaml.cs` (์‹ ๊ทœ) | `HelpItemModel` ํด๋ž˜์Šค (CategoryยทCommandยทTitleยทDescriptionยทExampleยทSymbolยทColorBrush) | | `Views/` | `AboutWindow`์— `mascot.png` ์ด๋ฏธ์ง€ ํ‘œ์‹œ โ€” `Assets/mascot.png` ํŒŒ์ผ์ด ์žˆ์„ ๋•Œ๋งŒ ํ‘œ์‹œ (์—†์œผ๋ฉด ๊ณต๊ฐ„ ์ˆจ๊น€) | **๋ฐฉํ–ฅํ‚ค ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฒ„๊ทธ ์›์ธ ๋ฐ ์ˆ˜์ •**: TextBox ๋‚ด๋ถ€์˜ `PART_ContentHost`(ScrollViewer)๊ฐ€ ํ„ฐ๋„๋ง ๋‹จ๊ณ„(PreviewKeyDown)์—์„œ Up/Down ํ‚ค๋ฅผ ์†Œ๋น„ํ•˜๋ฏ€๋กœ TextBox ๋ ˆ๋ฒจ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ๋Š” ์ฐจ๋‹จ ๋ถˆ๊ฐ€. ์ˆ˜์ •: Window ๋ ˆ๋ฒจ `PreviewKeyDown`์œผ๋กœ ์ด๋™ โ€” Window๋Š” ํ„ฐ๋„๋ง ์ตœ์ƒ์œ„์ด๋ฏ€๋กœ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ณด๋‹ค ๋จผ์ € ํ‚ค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ . **Tab ์ปค์„œ ์œ„์น˜ ๋ฒ„๊ทธ ์›์ธ ๋ฐ ์ˆ˜์ •**: `_vm.InputText = title` ๋ฐ”์ธ๋”ฉ ์—…๋ฐ์ดํŠธ๋Š” ๋ Œ๋”๋ง ์‚ฌ์ดํด ์ดํ›„์— TextBox์— ๋ฐ˜์˜๋˜๋ฏ€๋กœ ์งํ›„ `CaretIndex`๋ฅผ ์„ค์ •ํ•ด๋„ ๋ฐ”์ธ๋”ฉ์ด ๋ฎ์–ด์”€. ์ˆ˜์ •: `Dispatcher.BeginInvoke(() => InputBox.CaretIndex = ..., DispatcherPriority.Input)` ์œผ๋กœ ๋‹ค์Œ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์‚ฌ์ดํด์— ์ปค์„œ ์œ„์น˜ ์„ค์ •. **ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ JSON ํ˜•์‹** (`clipboard_history.json`): ```json [ { "text": "๋ณต์‚ฌํ•œ ํ…์ŠคํŠธ", "ts": "2026-03-26T10:30:00" }, { "text": "์ด์ „ ๋ณต์‚ฌ", "ts": "2026-03-26T10:25:00" } ] ``` ์ด๋ฏธ์ง€ ํƒ€์ž…์€ ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š์Œ (ํ…์ŠคํŠธ ์ „์šฉ ์ €์žฅ). **๋นŒ๋“œ ๊ฒ€์ฆ**: `dotnet build --output "C:/Temp/axtest3"` โ€” **0 errors, 0 warnings** ํ™•์ธ ### v0.9 2์ฐจ (์ž ๊ธˆ ํ•ด์ œ ์•Œ๋ฆผ + ํ™”๋ฉด ์บก์ฒ˜ ์„ค์ • + ํ…Œ๋งˆ ๋ชจ์–‘ + ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ๊ฐœ์„ ) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Assets/Quotes/famous.json` (์‹ ๊ทœ) | ๋‚ด์žฅ ๋ช…์–ธ 500๊ฐœ JSON (EmbeddedResource) โ€” ๋™์„œ์–‘ ์ฒ ํ•™์žยท์‚ฌ์ƒ๊ฐ€ยท๊ณผํ•™์žยท๊ฒฝ์˜์žยท์ž‘๊ฐ€ยทํ•œ๊ตญ ์œ„์ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ๋ฌผ | | `Services/QuoteService.cs` (์‹ ๊ทœ) | `GetRandomQuote()` โ€” `famous.json` EmbeddedResource ๋กœ๋“œ, ์•ฑ ์ƒ์•  ๋™์•ˆ ํ•œ ๋ฒˆ๋งŒ ํŒŒ์‹ฑ, ๋žœ๋ค ๋ฐ˜ํ™˜ | | `Services/WorktimeReminderService.cs` (์‹ ๊ทœ) | `SessionTrackingService`๋กœ๋ถ€ํ„ฐ ์ž ๊ธˆ ํ•ด์ œ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ๋ˆ„์  ์‚ฌ์šฉ์‹œ๊ฐ„ ๊ณ„์‚ฐ. ์„ค์ •ํ•œ ๊ฐ„๊ฒฉ(30~240๋ถ„) ์ด์ƒ ๊ฒฝ๊ณผ ์‹œ `ReminderPopupWindow` ํ‘œ์‹œ. `enabled` ์„ค์ •์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ์ฆ‰์‹œ ๋น„ํ™œ์„ฑ | | `Views/ReminderPopupWindow.xaml/.cs` (์‹ ๊ทœ) | ์ž ๊ธˆ ํ•ด์ œ ํŒ์—… โ€” ์‚ฌ์šฉ ์‹œ๊ฐ„ยท๊ฒฉ๋ ค ๋ฌธ๊ตฌยท๋ช…์–ธ ํ‘œ์‹œ. ์„ค์ •ํ•œ ํ™”๋ฉด ๋ชจ์„œ๋ฆฌ(4๋ฐฉํ–ฅ)์— ์œ„์น˜. `SetNoActivate()` P/Invoke๋กœ ํฌ์ปค์Šค ๋น„ํ™œ์„ฑ ์ƒํƒœ ์œ ์ง€. ์„ค์ •ํ•œ ์ดˆ ํ›„ ์ž๋™ ๋‹ซํž˜ | | `Models/AppSettings.cs` | `ScreenCaptureSettings` ์ค‘์ฒฉ ํด๋ž˜์Šค ์ถ”๊ฐ€ (`Prefix`, `SaveToFile`, `SavePath`). `ReminderSettings` ์ค‘์ฒฉ ํด๋ž˜์Šค ์ถ”๊ฐ€ (`Enabled`, `Position`, `IntervalMinutes`, `AutoDismissSeconds`) | | `Views/SettingsWindow.xaml/.cs` | ์บก์ฒ˜ ํƒญ ์ถ”๊ฐ€ โ€” `cap` ํ”„๋ฆฌํ”ฝ์Šค TextBox, ํŒŒ์ผ ์ €์žฅ ํ† ๊ธ€, ์ €์žฅ ๊ฒฝ๋กœ TextBox+ํด๋” ์„ ํƒ ๋ฒ„ํŠผ. ์•Œ๋ฆผ ํƒญ ์ถ”๊ฐ€ โ€” ํ™œ์„ฑํ™” ํ† ๊ธ€, ์œ„์น˜ ComboBox(4๋ฐฉํ–ฅ), ๊ฐ„๊ฒฉ ComboBox(30/60/120/240๋ถ„), ์ž๋™ ๋‹ซํž˜ ComboBox(5/10/15/20/30์ดˆ) | | `ViewModels/SettingsViewModel.cs` | `CapPrefix`, `SaveToFile`, `SavePath`, `ReminderEnabled`, `ReminderPosition`, `ReminderIntervalMinutes`, `ReminderAutoDismissSeconds` ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ | | `Handlers/ScreenCaptureHandler.cs` | `Prefix` ํ”„๋กœํผํ‹ฐ๋ฅผ `settings.ScreenCapture.Prefix` ๋Ÿฐํƒ€์ž„ ๊ฐ’์œผ๋กœ ๊ต์ฒด. ์บก์ฒ˜ ์„ฑ๊ณต ์‹œ `settings.ScreenCapture.SaveToFile`์ด true๋ฉด `SavePath`(๋นˆ ๊ฐ’์ด๋ฉด ๊ธฐ๋ณธ ๊ฒฝ๋กœ)์— PNG ํŒŒ์ผ ์ €์žฅ | | `App.xaml.cs` | `WorktimeReminderService` ์ดˆ๊ธฐํ™” + `SessionTrackingService`์™€ ์—ฐ๊ฒฐ. `OnExit()`์— `_worktimeReminder?.Dispose()` ์ถ”๊ฐ€ | | `Themes/*.xaml` (9๊ฐœ ํŒŒ์ผ) | ๊ฐ ํ…Œ๋งˆ์— `WindowCornerRadius`ยท`ItemCornerRadius` `CornerRadius` ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€ (ํ…Œ๋งˆ๋ณ„ ๊ณ ์œ  ๊ฐ’ ์ ์šฉ) | | `Views/LauncherWindow.xaml` | ์ฐฝ ์ตœ์ƒ์œ„ `Border.CornerRadius` โ†’ `{DynamicResource WindowCornerRadius}`. ํ•ญ๋ชฉ `ControlTemplate Border.CornerRadius` โ†’ `{DynamicResource ItemCornerRadius}` | | `Views/LauncherWindow.xaml.cs` | `BuildCustomDictionary()`์— `WindowCornerRadius`ยท`ItemCornerRadius` ๊ธฐ๋ณธ๊ฐ’(20, 10) ์ถ”๊ฐ€ | | `Views/TrayContextMenu.cs` | `DarkTrayRenderer`/`DarkColorTable` โ†’ `ModernTrayRenderer`/`ModernColorTable` ์ „๋ฉด ์žฌ์ž‘์„ฑ. WPF `Application.Current.Resources`์—์„œ `LauncherBackground`ยท`AccentColor`ยท`PrimaryText` ๋“ฑ์„ ์ฝ์–ด ํ…Œ๋งˆ ์ƒ‰์ƒ ๋ฐ˜์˜. `SetWindowRgn` P/Invoke๋กœ ๋ฉ”๋‰ด ์ฐฝ ๋ชจ์„œ๋ฆฌ ๋ผ์šด๋”ฉ. ์‹œ์ž‘ ์‹œ ์ž๋™์‹คํ–‰ ํ•ญ๋ชฉ ๊ธ€๋ฆฌํ”„ โ†’ ์ „๊ตฌ(`\uE82F`), ํ™œ์„ฑ ์‹œ ์•ฐ๋ฒ„ ์ƒ‰์ƒ(`#FFB300`) + ํ›„๊ด‘ ํšจ๊ณผ. `OnRenderItemCheck` ๋นˆ override๋กœ ๊ธฐ๋ณธ ์ฒดํฌ๋งˆํฌ ์–ต์ œ | | `Themes/Symbols.cs` | `ReminderBell = "\uEA8F"` (๋ฒจ ์•„์ด์ฝ˜) + `Lightbulb = "\uE82F"` (์ „๊ตฌ ์•„์ด์ฝ˜) ์ถ”๊ฐ€ | | `Handlers/HelpHandler.cs` | `cap` ํ•ญ๋ชฉ: ํ”„๋ฆฌํ”ฝ์Šค ๋ณ€๊ฒฝ ๊ฐ€๋ŠฅยทํŒŒ์ผ ์ €์žฅ ๊ฒฝ๋กœ ์„ค๋ช… ์ถ”๊ฐ€. `info` ํ•ญ๋ชฉ: ์ปค๋งจ๋“œ ํ‘œ์‹œ `"info ยท *"`, `*` ๋‹จ์ถ•ํ‚ค ์„ค๋ช… ์ถ”๊ฐ€. ์‹ ๊ทœ `์•Œ๋ฆผ` ์นดํ…Œ๊ณ ๋ฆฌ ํ•ญ๋ชฉ ์ถ”๊ฐ€ (์ž ๊ธˆ ํ•ด์ œ ์‚ฌ์šฉ์‹œ๊ฐ„ ์•Œ๋ฆผ) | **WorktimeReminderService ๋™์ž‘ ํ๋ฆ„**: ``` SessionTrackingService.Unlocked ์ด๋ฒคํŠธ โ†’ WorktimeReminderService.OnUnlocked() โ†’ ์„ค์ • disabled? โ†’ ๋ฌด์‹œ โ†’ ๋งˆ์ง€๋ง‰ ์•Œ๋ฆผ ์ดํ›„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ < IntervalMinutes? โ†’ ๋ฌด์‹œ โ†’ ReminderPopupWindow(์‚ฌ์šฉ์‹œ๊ฐ„, ๋ช…์–ธ) ํ‘œ์‹œ (Dispatcher.Invoke) โ†’ _lastReminderTime ๊ฐฑ์‹  ``` **ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด `ThemeColor()` ํ—ฌํผ**: ```csharp private static Color ThemeColor(string key, Color fallback) { try { if (Application.Current?.Resources[key] is System.Windows.Media.SolidColorBrush b) return Color.FromArgb(b.Color.A, b.Color.R, b.Color.G, b.Color.B); } catch { } return fallback; } ``` WPF ResourceDictionary๋ฅผ WinForms GDI ๋ Œ๋”๋Ÿฌ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ๊ธฐ ์œ„ํ•ด try/catch๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค. **๋นŒ๋“œ ๊ฒ€์ฆ**: `dotnet build` โ€” **0 errors, 0 warnings** ํ™•์ธ ### v0.9 3์ฐจ (๋ณด์•ˆ ๊ฐ•ํ™” + ๊ธ€๋กœ๋ฒŒ ์บก์ฒ˜ ๋‹จ์ถ•ํ‚ค + ์˜์—ญ ๋ฏธ์„ธ์กฐ์ •) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Services/ClipboardHistoryService.cs` | ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ ์ €์žฅ์„ **DPAPI ์•”ํ˜ธํ™”**๋กœ ์ „ํ™˜. `clipboard_history.json`(ํ‰๋ฌธ) โ†’ `clipboard_history.dat`(DPAPI). ๊ตฌ๋ฒ„์ „ ํ‰๋ฌธ ํŒŒ์ผ ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ + ์›๋ณธ ์‚ญ์ œ. `DataProtectionScope.CurrentUser` โ€” ํ˜„์žฌ Windows ์‚ฌ์šฉ์ž ๊ณ„์ •์—์„œ๋งŒ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ | | `AxCommander.csproj` | `System.Security.Cryptography.ProtectedData 8.0.0` NuGet ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ (๋กœ์ปฌ ์ „์šฉ, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์—†์Œ) | | `Models/AppSettings.cs` | `ScreenCaptureSettings`์—์„œ `SaveToFile`, `SavePath` ์™„์ „ ์ œ๊ฑฐ (๋ณด์•ˆ ์ •์ฑ…). `GlobalHotkeyEnabled`, `GlobalHotkey`, `GlobalHotkeyMode`, `ScrollDelayMs` ์ถ”๊ฐ€. `CustomThemeColors`์— `WindowCornerRadius`, `ItemCornerRadius` ์ถ”๊ฐ€ | | `Handlers/ScreenCaptureHandler.cs` | ํŒŒ์ผ ์ €์žฅ ๋กœ์ง(`ShouldSave`, `GetSaveDir`, `bmp.Save()`) ์ „๋ฉด ์ œ๊ฑฐ โ€” ์บก์ฒ˜ ๊ฒฐ๊ณผ๋Š” **ํด๋ฆฝ๋ณด๋“œ์—๋งŒ ๋ณต์‚ฌ**. `CaptureDirectAsync(mode)` public ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (๊ธ€๋กœ๋ฒŒ ๋‹จ์ถ•ํ‚ค์šฉ). ์Šคํฌ๋กค ๋”œ๋ ˆ์ด ํ•˜๋“œ์ฝ”๋”ฉ 120ms โ†’ `ScrollDelayMs` ์„ค์ •๊ฐ’ ์‚ฌ์šฉ | | `Core/InputListener.cs` | `_captureHotkey` + `CaptureHotkeyTriggered` ์ด๋ฒคํŠธ ์ถ”๊ฐ€. `UpdateCaptureHotkey(string, bool)` ๋ฉ”์„œ๋“œ๋กœ ์บก์ฒ˜ ๋‹จ์ถ•ํ‚ค ๋™์  ๋“ฑ๋ก/ํ•ด์ œ | | `Core/HotkeyParser.cs` | `PrintScreen`(0x2C), `Pause`(0x13), `ScrollLock`(0x91) ํ‚ค ์ถ”๊ฐ€ | | `App.xaml.cs` | `OnCaptureHotkeyTriggered` ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ โ€” ๋Ÿฐ์ฒ˜ ์—†์ด `CaptureDirectAsync` ์ง์ ‘ ํ˜ธ์ถœ. ์„ค์ • ์ €์žฅ ์‹œ ์บก์ฒ˜ ๋‹จ์ถ•ํ‚ค ๊ฐฑ์‹  | | `ViewModels/SettingsViewModel.cs` | `CapGlobalHotkeyEnabled`, `CapGlobalHotkey`, `CapGlobalMode`, `CapScrollDelayMs/Str`, `CustomWindowCornerRadius`, `CustomItemCornerRadius` ํ”„๋กœํผํ‹ฐ + Load/Save | | `Views/SettingsWindow.xaml` | ์บก์ฒ˜ ํƒญ: ํŒŒ์ผ ์ €์žฅ UI ์ „๋ฉด ์ œ๊ฑฐ, ๊ธ€๋กœ๋ฒŒ ๋‹จ์ถ•ํ‚ค ์„น์…˜ ์ถ”๊ฐ€ (ํ™œ์„ฑ ํ† ๊ธ€ยทํ‚ค ๋ ˆ์ฝ”๋”ยท๋ชจ๋“œ ์„ ํƒยท๊ธฐ๋ณธ๊ฐ’ ๋ณต์›), ์Šคํฌ๋กค ๋”œ๋ ˆ์ด ComboBox. ์ƒ‰์ƒ ํŽธ์ง‘ ํƒญ: "๋ชจ์–‘ (๋ชจ์„œ๋ฆฌ ๋ผ์šด๋”ฉ)" ์„น์…˜ + ์Šฌ๋ผ์ด๋” 2๊ฐœ (์ฐฝ/ํ•ญ๋ชฉ) | | `Views/SettingsWindow.xaml.cs` | `CapHotkeyRecorder_PreviewKeyDown` ํ‚ค ๋…นํ™” ํ•ธ๋“ค๋Ÿฌ, `ResetCapGlobalHotkey_Click` ์ถ”๊ฐ€ | | `Views/LauncherWindow.xaml.cs` | `BuildCustomDictionary()`๊ฐ€ ์ปค์Šคํ…€ `WindowCornerRadius`/`ItemCornerRadius` ์„ค์ •๊ฐ’ ์ ์šฉ (๊ธฐ์กด ํ•˜๋“œ์ฝ”๋”ฉ 20/10 โ†’ ์‚ฌ์šฉ์ž ๊ฐ’) | | `Views/LauncherWindow.xaml` | ์•ก์…˜ breadcrumb ๋ฐ” ํ•˜๋“œ์ฝ”๋”ฉ `#4B5EFC` โ†’ `{DynamicResource AccentColor}` ๊ต์ฒด | | `Views/RegionSelectWindow.xaml.cs` | `_endPoint` ํ•„๋“œ ์ถ”๊ฐ€, ๋“œ๋ž˜๊ทธ ์ข…๋ฃŒ ํ›„ ํ™”์‚ดํ‘œ ํ‚ค(1px/Shift 10px) ๋ฏธ์„ธ์กฐ์ • + Enter ํ™•์ • ์ง€์› | | `Views/TrayContextMenu.cs` | `SetWindowRgn` ์‹คํŒจ ์‹œ `DeleteObject(rgn)` ํ˜ธ์ถœ โ†’ GDI ํ•ธ๋“ค ๋ˆ„์ˆ˜ ์ˆ˜์ • | | `Handlers/HelpHandler.cs` | `_entries.Length - 6` ํ•˜๋“œ์ฝ”๋”ฉ โ†’ `_entries.Count(e => e.Category != "ํ‚ค๋ณด๋“œ")` ๋™์  ๊ณ„์‚ฐ. `cap` ํ•ญ๋ชฉ ์„ค๋ช…์— ๊ธ€๋กœ๋ฒŒ ๋‹จ์ถ•ํ‚ค ์–ธ๊ธ‰ ์ถ”๊ฐ€ | | `Views/ReminderPopupWindow.xaml.cs` | `GetWindowLong`/`SetWindowLong` โ†’ `GetWindowLongPtr`/`SetWindowLongPtr` 64๋น„ํŠธ ์•ˆ์ „ ๊ต์ฒด. ํƒ€์ด๋จธ Tick ํ•ธ๋“ค๋Ÿฌ ํ•ด์ œ. Esc ํ‚ค ๋‹ซ๊ธฐ ์ง€์› | | `Services/WorktimeReminderService.cs` | `lock(_lock)` ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ์ถ”๊ฐ€ (SessionSwitch ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ โ†” UI ์Šค๋ ˆ๋“œ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ํ•ด์†Œ). `IntervalMinutes` ์ตœ์†Œ๊ฐ’ ๋ณดํ˜ธ (`Math.Max(1, ...)`) | **๋ณด์•ˆ ์ •์ฑ… ๋ณ€๊ฒฝ**: - ์บก์ฒ˜: ํŒŒ์ผ ์ €์žฅ ๊ธฐ๋Šฅ ์ฝ”๋“œ์—์„œ ์™„์ „ ์ œ๊ฑฐ. ์„ค์ • UI์—๋„ ์—†์Œ. ํด๋ฆฝ๋ณด๋“œ์—๋งŒ ๋ณต์‚ฌ. - ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ: DPAPI `DataProtectionScope.CurrentUser`๋กœ ์•”ํ˜ธํ™” ์ €์žฅ. ํŒŒ์ผ ํ™•์žฅ์ž `.json` โ†’ `.dat`. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž/PC์—์„œ ์—ด ์ˆ˜ ์—†์Œ. - ํ†ต๊ณ„(`stats/*.json`): ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์•„๋‹˜, ์•”ํ˜ธํ™” ๋ฏธ์ ์šฉ. **๋นŒ๋“œ ๊ฒ€์ฆ**: `dotnet build` โ€” **0 errors, 0 warnings** ํ™•์ธ ### v0.9 โ†’ v0.9.x (๋Œ€๊ทœ๋ชจ ๊ธฐ๋Šฅ ํ™•์žฅ โ€” ์œ ํ‹ธ๋ฆฌํ‹ฐ 8์ข… + ์Šคํฌ์ด๋“œ + ์„œ๋น„์Šค ๊ด€๋ฆฌ) | ํŒŒ์ผ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | |------|----------| | `Handlers/ColorPickHandler.cs` (์‹ ๊ทœ) | `pick` ํ”„๋ฆฌํ”ฝ์Šค. ์ „์ฒด ํ™”๋ฉด ์Šคํฌ์ด๋“œ ๋ชจ๋“œ(`EyeDropperWindow`) โ†’ ํด๋ฆญ ์ง€์  ์ƒ‰์ƒ HEX ์ฝ”๋“œ ์ถ”์ถœ โ†’ ๋ฐ˜ํˆฌ๋ช… ๊ฒฐ๊ณผ ์ฐฝ(`ColorPickResultWindow`) 5์ดˆ ํ‘œ์‹œ โ†’ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ | | `Views/EyeDropperWindow.xaml/.cs` (์‹ ๊ทœ) | ์ „์ฒด ํ™”๋ฉด ํˆฌ๋ช… ์˜ค๋ฒ„๋ ˆ์ด. ๋งˆ์šฐ์Šค ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ๋‹๋ณด๊ธฐ ์› + ์‹ค์‹œ๊ฐ„ HEX ์ฝ”๋“œ ๋ ˆ์ด๋ธ”. `GetPixel` P/Invoke๋กœ ํ™”๋ฉด ํ”ฝ์…€ ์ƒ‰์ƒ ์ฝ๊ธฐ. ์ขŒํด๋ฆญ ํ™•์ •, ์šฐํด๋ฆญ/Esc ์ทจ์†Œ | | `Views/ColorPickResultWindow.xaml/.cs` (์‹ ๊ทœ) | ๋ฐ˜ํˆฌ๋ช… ๋‹คํฌ ํŒ์—…. ์ƒ‰์ƒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์› + HEX/RGB ํ…์ŠคํŠธ + ์ž๋™ ๋‹ซํž˜ 5์ดˆ ํƒ€์ด๋จธ | | `Handlers/DateCalcHandler.cs` (์‹ ๊ทœ) | `date` ํ”„๋ฆฌํ”ฝ์Šค. `+30d`/`-100d` ๊ฐ€๊ฐ, D-day ๊ณ„์‚ฐ, Unix timestamp โ†” ๋‚ ์งœ ๋ณ€ํ™˜, ์š”์ผยทISO ์ฃผ์ฐจ, `date unix` ํ˜„์žฌ ํƒ€์ž„์Šคํƒฌํ”„ | | `Handlers/ServiceHandler.cs` (์‹ ๊ทœ) | `svc` ํ”„๋ฆฌํ”ฝ์Šค. `ServiceController` API๋กœ Windows ์„œ๋น„์Šค ๊ฒ€์ƒ‰ยท์ƒํƒœ ์กฐํšŒ. `svc start/stop/restart [์ด๋ฆ„]`์œผ๋กœ ์ œ์–ด(๊ด€๋ฆฌ์ž ๊ถŒํ•œ UAC). `svc restart clipboard` โ†’ AX ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ ์„œ๋น„์Šค ๊ฐ•์ œ ์žฌ์‹œ์ž‘ | | `Services/ClipboardHistoryService.cs` | `Reinitialize()` ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ โ€” Dispose ํ›„ ๋‚ด๋ถ€ ์ƒํƒœ ์ดˆ๊ธฐํ™” + ํด๋ฆฝ๋ณด๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์žฌ๊ฐœ | | `AxCommander.csproj` | `System.ServiceProcess.ServiceController 8.0.1` NuGet ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ (๋กœ์ปฌ ์ „์šฉ) | | `Handlers/TextStatsHandler.cs` (์‹ ๊ทœ) | `stats` ํ”„๋ฆฌํ”ฝ์Šค. ํด๋ฆฝ๋ณด๋“œ ํ…์ŠคํŠธ ๊ธ€์žยท๋‹จ์–ดยท์ค„ ์ˆ˜, UTF-8 ๋ฐ”์ดํŠธ, ํ‚ค์›Œ๋“œ ๋นˆ๋„(Top 5), ์ฝ๊ธฐ ์‹œ๊ฐ„ ์ถ”์ •, ํŠน์ • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ | | `Handlers/FavoriteHandler.cs` (์‹ ๊ทœ) | `fav` ํ”„๋ฆฌํ”ฝ์Šค. ์ž์ฃผ ์“ฐ๋Š” ํŒŒ์ผยทํด๋” ๊ฒฝ๋กœ๋ฅผ `favorites.json`์— ์ €์žฅ, `fav add/del` ์„œ๋ธŒ์ปค๋งจ๋“œ | | `Handlers/RenameHandler.cs` (์‹ ๊ทœ) | `rename` ํ”„๋ฆฌํ”ฝ์Šค. ํด๋”\ํŒจํ„ด ํŒŒ์ผ ๋ชฉ๋ก, ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜ `{n}`์ˆœ๋ฒˆ `{date}`๋‚ ์งœ `{orig}`์›๋ณธ๋ช…, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ›„ ์‹คํ–‰ | | `Handlers/MonitorHandler.cs` (์‹ ๊ทœ) | `monitor` ํ”„๋ฆฌํ”ฝ์Šค. CPUยท๋ฉ”๋ชจ๋ฆฌ(`GlobalMemoryStatusEx`)ยท๋””์Šคํฌยท๊ฐ€๋™์‹œ๊ฐ„ยทTop 5 ํ”„๋กœ์„ธ์Šค | | `Handlers/ScaffoldHandler.cs` (์‹ ๊ทœ) | `scaffold` ํ”„๋ฆฌํ”ฝ์Šค. ๋‚ด์žฅ 5๊ฐœ + ์‚ฌ์šฉ์ž JSON ํ…œํ”Œ๋ฆฟ | | `Themes/Symbols.cs` | EyeDropperยทDateIconยทServiceIcon + TextStatsยทFavoriteยทRenameIconยทMonitorIconยทScaffoldIcon 8๊ฐœ ์‹ฌ๋ณผ ์ถ”๊ฐ€ | | `Handlers/ClipboardPipeHandler.cs` (์‹ ๊ทœ) | `pipe` ํ”„๋ฆฌํ”ฝ์Šค. 19์ข… ํ•„ํ„ฐ๋ฅผ `>` ์ฒด์ด๋‹ โ€” upper/lower/trim/sort/unique/reverse/number/quote/b64e/b64d/urle/urld/md/lines/count/csv/tab/trimall ๋“ฑ | | `Handlers/JournalHandler.cs` (์‹ ๊ทœ) | `journal` ํ”„๋ฆฌํ”ฝ์Šค. `UsageStatisticsService` ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์—…๋ฌด ์ผ์ง€ ๋งˆํฌ๋‹ค์šด ์ž๋™ ์ƒ์„ฑ (ํ™œ์„ฑ ์‹œ๊ฐ„, ๋Ÿฐ์ฒ˜ ํ˜ธ์ถœ, ๋ช…๋ น์–ด ์‚ฌ์šฉ ์ˆœ์œ„) | | `Handlers/RoutineHandler.cs` (์‹ ๊ทœ) | `routine` ํ”„๋ฆฌํ”ฝ์Šค. `routines.json` + ๋‚ด์žฅ 2๊ฐœ(morning/endofday). ์•ฑยทํด๋”ยทURLยท๋ช…๋ น์„ ์ˆœ์„œ๋Œ€๋กœ ์ผ๊ด„ ์‹คํ–‰ | | `Handlers/BatchTextHandler.cs` (์‹ ๊ทœ) | `batch` ํ”„๋ฆฌํ”ฝ์Šค. ํด๋ฆฝ๋ณด๋“œ ๊ฐ ์ค„์— ๋™์‹œ ๋ณ€ํ™˜ โ€” prefix/suffix/wrap/number/sort/unique/trim/replace/csv/split/indent ๋“ฑ 14์ข… | | `Handlers/DiffHandler.cs` (์‹ ๊ทœ) | `diff` ํ”„๋ฆฌํ”ฝ์Šค. ํด๋ฆฝ๋ณด๋“œ ์ตœ๊ทผ 2๊ฐœ ๋น„๊ต + ํŒŒ์ผ 2๊ฐœ ๊ฒฝ๋กœ ๋น„๊ต + **ํŒŒ์ผ ์„ ํƒ ๋‹ค์ด์–ผ๋กœ๊ทธ(OpenFileDialog)** ์ง€์› | | `Handlers/WindowSwitchHandler.cs` (์‹ ๊ทœ) | `win` ํ”„๋ฆฌํ”ฝ์Šค. `EnumWindows` P/Invoke๋กœ ์—ด๋ฆฐ ์ฐฝ ๋ชฉ๋ก ์กฐํšŒยท๊ฒ€์ƒ‰, `SetForegroundWindow`๋กœ ์ฆ‰์‹œ ์ „ํ™˜. ์ตœ์†Œํ™” ์ฐฝ ์ž๋™ ๋ณต์› | | `Handlers/HelpHandler.cs` | 14๊ฐœ ์‹ ๊ทœ ํ•ธ๋“ค๋Ÿฌ ๋„์›€๋ง ํ•ญ๋ชฉ ์ถ”๊ฐ€ | | `Views/HelpDetailWindow.xaml/.cs` | **์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์žฌ์„ค๊ณ„** โ€” ์ƒ๋‹จ ์นดํ…Œ๊ณ ๋ฆฌ ํƒญ ๋ฐ” + โ† โ†’ ํ‚ค ํŽ˜์ด์ง€ ์ „ํ™˜ + ์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ + ํŽ˜์ด์ง€ ์ธ๋””์ผ€์ดํ„ฐ | | `App.xaml.cs` | 14๊ฐœ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก + `DispatcherUnhandledException` ์ „์—ญ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ + `LoadAppIcon` ๋‚ด์žฅ ๋ฆฌ์†Œ์Šค ํด๋ฐฑ | | `Services/ClipboardHistoryService.cs` | `Reinitialize()` ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (ServiceHandler์˜ ํด๋ฆฝ๋ณด๋“œ ๊ฐ•์ œ ์žฌ์‹œ์ž‘์šฉ) | | `AxCommander.csproj` | `IncludeNativeLibrariesForSelfExtract=true` (๋‹จ์ผ EXE ๋ฐฐํฌ), `System.ServiceProcess.ServiceController 8.0.1` ์ถ”๊ฐ€, mascot/icon ๋‚ด์žฅ ๋ฆฌ์†Œ์Šค | **๋ฐฐํฌ** (`build.bat` ๋”๋ธ”ํด๋ฆญ์œผ๋กœ 3์ข… ์ž๋™ ๋นŒ๋“œ): | ํŒŒ์ผ | ํฌ๊ธฐ | ์šฉ๋„ | |------|------|------| | `dist\AxCommander\` | 163MB (ํด๋”) | ๋ณธ์ฒด EXE + DLL โ€” ํด๋”์งธ ๋ณต์‚ฌํ•ด๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ | | `dist\AxCommander_Setup.exe` | ~136MB | ์˜คํ”„๋ผ์ธ ์ธ์Šคํ†จ๋Ÿฌ (๋ณธ์ฒด+๋Ÿฐํƒ€์ž„ ๋ชจ๋‘ ZIP ๋‚ด์žฅ, ์ธํ„ฐ๋„ท ๋ถˆํ•„์š”) | | `dist\AxCommander_Setup_Online.exe` | **~1MB** | ์˜จ๋ผ์ธ ์ธ์Šคํ†จ๋Ÿฌ (.NET Framework 4.8 ๊ธฐ๋ฐ˜, ๋ณธ์ฒด(~2MB) ZIP ๋‚ด์žฅ + .NET 8 Runtime ์ธํ„ฐ๋„ท ์ž๋™ ์„ค์น˜) | ์ธ์Šคํ†จ๋Ÿฌ ๊ธฐ๋Šฅ: ์„ค์น˜ ๊ฒฝ๋กœ ์„ ํƒ ยท ๋ฐ”ํƒ•ํ™”๋ฉด ๋ฐ”๋กœ๊ฐ€๊ธฐ ยท ์‹œ์ž‘ ๋ฉ”๋‰ด ยท ์ž๋™ ์‹คํ–‰ ยท ํ”„๋กœ๊ทธ๋žจ ์ถ”๊ฐ€/์ œ๊ฑฐ ยท ๊ธฐ์กด ์„ค์น˜ ๊ฐ์ง€ โ†’ ์—…๊ทธ๋ ˆ์ด๋“œ ยท ์ œ๊ฑฐ **v0.9.x ์ตœ์ข… ์ˆ˜์ • (๋””์ž์ธ/์˜ค๋ฅ˜ ๊ฒ€์ˆ˜)**: | ํŒŒ์ผ | ์ˆ˜์ • | |------|------| | `Views/SettingsWindow.xaml` | `{StaticResource ModernComboBox}` ์ฐธ์กฐ 2๊ณณ ์ œ๊ฑฐ โ€” ํ•ด๋‹น ์Šคํƒ€์ผ ๋ฏธ์ •์˜๋กœ ์„ค์ • ์ฐฝ XamlParseException ํฌ๋ž˜์‹œ ์ˆ˜์ • | | `Views/TrayContextMenu.cs` | `MakeItem()`์— 1ร—1 ํˆฌ๋ช… ๋”๋ฏธ `Image` ์„ค์ • โ€” `OnRenderItemImage` ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„ ๊ธ€๋ฆฌํ”„ ์•„์ด์ฝ˜ ๋ฏธํ‘œ์‹œ ๋ฌธ์ œ ์ˆ˜์ •. `OnRenderItemCheck`์—์„œ๋„ `DrawGlyph()` ํ˜ธ์ถœ. ์ „๊ตฌ ๊บผ์ง ์ƒ‰์ƒ `#A0A08C` โ†’ `#78788C` ์ง„ํ•œ ํšŒ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ | | `App.xaml.cs` | ์ž๋™์‹คํ–‰ `autoStartItem`์— `Image = new Bitmap(1,1)` ์ถ”๊ฐ€ | | `Views/HelpDetailWindow.xaml.cs` | `NavigateToPage()` ๋นˆ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐฉ์–ด ์ฝ”๋“œ | | `Handlers/WindowSwitchHandler.cs` | ์ž๊ธฐ ํ”„๋กœ์„ธ์Šค ์ œ์™ธ๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉ ํƒ€์ดํ‹€ ๋Œ€์‹  `Process.GetCurrentProcess().ProcessName` ๋น„๊ต๋กœ ๋ณ€๊ฒฝ | **v0.9.x UI/UX ์ตœ์ข… ์ˆ˜์ •**: | ํŒŒ์ผ | ์ˆ˜์ • | |------|------| | `Views/SettingsWindow.xaml` | ์‚ฌ์ด๋“œ๋ฐ” `TabPanel`์„ `ScrollViewer`๋กœ ๊ฐ์‹ธ ํƒญ 10๊ฐœ+ ์Šคํฌ๋กค ์ง€์›. `ModernComboBox` ๋ฏธ์ •์˜ ์ฐธ์กฐ ์ œ๊ฑฐ (XamlParseException ์ˆ˜์ •) | | `Views/TrayContextMenu.cs` | `MakeItem()`์— 1ร—1 ๋”๋ฏธ Image ์„ค์ • โ†’ ๊ธ€๋ฆฌํ”„ ์•„์ด์ฝ˜ ํ‘œ์‹œ. `DrawLightbulbGlow`๋ฅผ `PathGradientBrush` ์›ํ˜• ๊ทธ๋ผ๋ฐ์ด์…˜์œผ๋กœ ๊ต์ฒด (๋น› ๋Œ€์นญ). `OnRenderItemCheck`์—์„œ๋„ `DrawGlyph` ํ˜ธ์ถœ | | `Views/HelpDetailWindow.xaml` | ์นดํ…Œ๊ณ ๋ฆฌ ํƒญ ๋ฐ” `ScrollViewer` โ†’ `WrapPanel` (์Šคํฌ๋กค ์ œ๊ฑฐ, ๋ชจ๋‘ ํ‘œ์‹œ). ์ฐฝ ํฌ๊ธฐ 880ร—680 | | `Views/HelpDetailWindow.xaml.cs` | ํ”„๋กœ๊ทธ๋žจ ๊ฐœ์š” 3๊ฐœ ํ•ญ๋ชฉ(์„ค๋ช…/์‚ฌ์šฉ๋ฒ•/์ €์žฅ๊ฒฝ๋กœ) ์ž๋™ ์‚ฝ์ž…. `NavigateToPage()` ๋นˆ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐฉ์–ด ์ฝ”๋“œ | | `Handlers/HelpHandler.cs` | `static _entries` โ†’ `_baseEntries` + `GetEntries()` ๋™์  ๋ฉ”์„œ๋“œ. ์„ค์ •์—์„œ ๋ณ€๊ฒฝํ•œ ์บก์ฒ˜ ํ”„๋ฆฌํ”ฝ์Šคยท๊ธ€๋กœ๋ฒŒ ํ•ซํ‚ค ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜ | | `Views/AboutWindow.xaml/.cs` | ์ƒ๋‹จ ์›ํ˜• โ†’ ์•ฑ ์•„์ด์ฝ˜(icon.ico) ํ‘œ์‹œ. ๋งˆ์Šค์ฝ”ํŠธ๋Š” ์ˆจ๊น€ ์ƒํƒœ๋กœ ๋กœ๋“œ โ†’ ์‚ฌ์šฉ์ž ํด๋ฆญ ์‹œ ์˜ค๋ฒ„๋ ˆ์ด๋งŒ. ์กฐ์ง๋ช… ํ–‰์—์„œ ์ด๋ฆ„/์ง๊ธ‰ ์ œ๊ฑฐ (ํ•˜๋‹จ์—๋งŒ ํ‘œ์‹œ). `TryLoadAppIcon()` + `TryLoadMascot()` ๋ถ„๋ฆฌ | | `Services/LogService.cs` | `PurgeOldLogs()` ์ถ”๊ฐ€ โ€” 14์ผ ์ดˆ๊ณผ ๋กœ๊ทธ ์ž๋™ ์‚ญ์ œ (์•ฑ ์„ธ์…˜ ๋‹น 1ํšŒ) | | `App.xaml.cs` | `DispatcherUnhandledException` ์ „์—ญ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ. `LoadAppIcon` pack:// ๋‚ด์žฅ ๋ฆฌ์†Œ์Šค ํด๋ฐฑ. `HelpHandler(settings)` ์ฃผ์ž… | **v0.9.x ์ถ”๊ฐ€ ๊ธฐ๋Šฅ**: | ํŒŒ์ผ | ๋ณ€๊ฒฝ | |------|------| | `Services/FaviconService.cs` (์‹ ๊ทœ) | URL ๋ณ„์นญ ํ•ญ๋ชฉ์— ์‚ฌ์ดํŠธ favicon ํ‘œ์‹œ. Google Favicon API โ†’ ๋””์Šคํฌ ์บ์‹œ(`%APPDATA%\AxCommander\favicons\`) โ†’ `IconPath`์— ๊ฒฝ๋กœ ์ „๋‹ฌ | | `Handlers/AliasHandler.cs` | `UrlAliasHandler.GetFaviconPath()` โ€” favicon ์บ์‹œ ๊ฒฝ๋กœ ์กฐํšŒ + ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ | | `Views/LauncherWindow.xaml` | ์•„์ดํ…œ ์•„์ด์ฝ˜ ์˜์—ญ์— `IconPath` ์ด๋ฏธ์ง€ ํ‘œ์‹œ ์ง€์› (`NullToCollapsedConverter`๋กœ ์‹ฌ๋ณผ/์ด๋ฏธ์ง€ ์ž๋™ ์ „ํ™˜) | | `Themes/Converters.cs` | `NullToCollapsedConverter` ์ถ”๊ฐ€ | | `App.xaml` | `NullToCollapsedConverter` ๊ธ€๋กœ๋ฒŒ ๋“ฑ๋ก | | `Handlers/WebSearchHandler.cs` | `?ni`(๋„ค์ด๋ฒ„ ์ด๋ฏธ์ง€), `?gi`(๊ตฌ๊ธ€ ์ด๋ฏธ์ง€) ์—”์ง„ ์ถ”๊ฐ€ (์ด 10๊ฐœ) | | `Handlers/HelpHandler.cs` | ์›น ๊ฒ€์ƒ‰ ํ•ญ๋ชฉ์— 10๊ฐœ ์—”์ง„ ์ „์ฒด ๋ชฉ๋ก ํ‘œ์‹œ | | `ViewModels/SettingsViewModel.cs` | `ValidateBeforeSave()` โ€” ์˜ˆ์•ฝ์–ด/ํ”„๋ฆฌํ”ฝ์Šค ์ถฉ๋Œ ๊ฐ์ง€. ์ถฉ๋Œ ์‹œ `MessageBox` ์•Œ๋ฆผ + ์ €์žฅ ๊ฑฐ๋ถ€ | | `Views/SettingsWindow.xaml/.cs` | ํ•˜๋‹จ ๋ฐ”์— **๋‚ด๋ณด๋‚ด๊ธฐ/๋ถˆ๋Ÿฌ์˜ค๊ธฐ** ๋ฒ„ํŠผ ์ถ”๊ฐ€ (`.axsettings` ํŒŒ์ผ) | **v0.9.x ์•„์ด์ฝ˜ ๊ต์ฒด + ์ตœ์ข… ๋””์ž์ธ ๊ฒ€์ˆ˜**: | ํŒŒ์ผ | ์ˆ˜์ • | |------|------| | `Assets/icon.ico` | ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ๋ณด์„ ์ปท ์•„์ด์ฝ˜์œผ๋กœ ๊ต์ฒด (Blue/Green/Red/Green 4์ƒ‰, ํฐ์ƒ‰ facet ์„ , 7ํฌ๊ธฐ 16~256px) | | `Assets/diamond_pixel.svg` | ์•„์ด์ฝ˜ SVG ์›๋ณธ (์ฐธ๊ณ ์šฉ) | | `tools/IconGenerator/` | ์•„์ด์ฝ˜ ์ƒ์„ฑ ์ฝ˜์†” ์•ฑ (.NET 8 WinForms, `System.Drawing`์œผ๋กœ ๋ณด์„ ๋‹ค์ด์•„๋ชฌ๋“œ ๋ Œ๋”๋ง โ†’ ICO ์ถœ๋ ฅ) | | `Views/AboutWindow.xaml` | ๋ฒ„์ „ ํ…์ŠคํŠธ ํด๋ฐฑ `"v0.0.1"` ์œ ์ง€๋กœ ์ •๋ฆฌ (๋‹น์‹œ csproj ๋ฒ„์ „๋„ ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌ) | | `Views/SettingsWindow.xaml` | ์‚ฌ์ด๋“œ๋ฐ” `ScrollViewer`์—์„œ `DockPanel.Dock="Top"` ์ œ๊ฑฐ โ†’ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋‚จ์€ ๊ณต๊ฐ„ ์ฑ„์›Œ ์Šคํฌ๋กค ์ •์ƒ ๋™์ž‘ | **์ตœ์ข… ๊ฒ€์ˆ˜ ๊ฒฐ๊ณผ**: - ์ „์ฒด ๋นŒ๋“œ (3๊ฐœ ํ”„๋กœ์ ํŠธ): **0 errors, 0 warnings** - ๋‹น์‹œ ๋ฒ„์ „ ํ…์ŠคํŠธ์™€ ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์ผ์น˜ ํ™•์ธ โœ“ - CornerRadius DynamicResource ๋ฐ”์ธ๋”ฉ: ์ •์ƒ โœ“ - ์‚ฌ์ด๋“œ๋ฐ” ScrollViewer: ์ˆ˜์ • ์™„๋ฃŒ (DockPanel.Dock ์ œ๊ฑฐ) โœ“ - ์ „๊ตฌ ๊ธ€๋กœ์šฐ: PathGradientBrush ์ค‘์‹ฌ ๋Œ€์นญ ํ™•์ธ โœ“ - HelpHandler ํ•ญ๋ชฉ: ์ „์ฒด ์ •ํ™•์„ฑ ํ™•์ธ โœ“ - ์•„์ด์ฝ˜ ๋กœ๋”ฉ: pack:// ๋ฆฌ์†Œ์Šค + ํŒŒ์ผ์‹œ์Šคํ…œ ํด๋ฐฑ ์ •์ƒ โœ“ --- ## ๐Ÿšง ๊ฐœ๋ฐœ ์ด๋ ฅ โ€” `!` ์˜ˆ์•ฝ์–ด ๊ธฐ๋ฐ˜ AI ๋Œ€ํ™” ๊ธฐ๋Šฅ ๋„์ž… > **์ƒํƒœ**: ํ•ต์‹ฌ ๊ตฌํ˜„ ์™„๋ฃŒ > **๋ฒ„์ „**: v0.0.5 > **๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ**: 2026-03-28 ### ๊ฐœ์š” `!` ์˜ˆ์•ฝ์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด LLM(๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ) ์„œ๋น„์Šค์— ์งˆ์˜๋ฅผ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„ ํ‘œ์‹œํ•˜๋Š” **์ดˆ๊ธฐ AI ๋Œ€ํ™” ๊ธฐ๋Šฅ**์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ๊ฐ„์€ ํ˜„์žฌ AX Agent๋กœ ํ™•์žฅ๋˜๊ธฐ ์ „ ๋„์ž… ์ด๋ ฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ### ์ž…๋ ฅ ๋ฐฉ์‹ | ์ž…๋ ฅ | ๋™์ž‘ | |------|------| | `!์•ˆ๋…•ํ•˜์„ธ์š”` | `!` ์ œ๊ฑฐ ํ›„ "์•ˆ๋…•ํ•˜์„ธ์š”"๋ฅผ LLM์— ์ „์†ก | | `! ์•ˆ๋…•ํ•˜์„ธ์š”` | `!`์™€ ํ…์ŠคํŠธ ์‚ฌ์ด ๊ณต๋ฐฑ ์ œ๊ฑฐ ํ›„ "์•ˆ๋…•ํ•˜์„ธ์š”"๋ฅผ LLM์— ์ „์†ก | | `!` (๋‹จ๋…) | ๋Œ€ํ™” ์ฐฝ๋งŒ ์—ด๊ธฐ (๋นˆ ์ƒํƒœ) | ### ๋Œ€ํ™” ์ฐฝ (ChatWindow) ์ดˆ๊ธฐ ์„ค๊ณ„ **๋ ˆ์ด์•„์›ƒ: 2ํŒจ๋„ ๊ตฌ์กฐ** ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [โ‰ก] AX Commander โ€” AI ๋Œ€ํ™” [_][โ–ก][โœ•] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ [+ ์ƒˆ ๋Œ€ํ™”] โ”‚ โ”‚ โ”‚ [๐Ÿ” ๊ฒ€์ƒ‰] โ”‚ ๋Œ€ํ™” ๋ฉ”์‹œ์ง€ ์˜์—ญ โ”‚ โ”‚ โ”‚ (๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋ง) โ”‚ โ”‚ โ”€โ”€ ๊ณ ์ • โ”€โ”€ โ”‚ โ”‚ โ”‚ ๐Ÿ“Œ ์„œ๋ฒ„์„ค์ • โ”‚ โ”‚ โ”‚ ๐Ÿ“Œ ์ฝ”๋“œ๋ฆฌ๋ทฐ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”€โ”€ ์˜ค๋Š˜ โ”€โ”€ โ”‚ โ”‚ โ”‚ API ์˜ค๋ฅ˜.. โ”‚ โ”‚ โ”‚ ๋ฐฐํฌ ๋ฐฉ๋ฒ•.. โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”€โ”€ ์–ด์ œ โ”€โ”€ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ ํšŒ์˜๋ก ์ •๋ฆฌ โ”‚ โ”‚ ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”... [โ–ถ] โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Ollama โ–พ โ”‚ llama3:8b โ–พ โ”‚ โ— ์—ฐ๊ฒฐ๋จ โ”‚ ํ† ํฐ: 1.2k โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **์ขŒ์ธก ํŒจ๋„ โ€” ๋Œ€ํ™” ๋ชฉ๋ก**: - **์ƒˆ ๋Œ€ํ™”** ๋ฒ„ํŠผ (Ctrl+N) - **๊ฒ€์ƒ‰** โ€” ๋Œ€ํ™” ์ œ๋ชฉยท๋‚ด์šฉ ํ•„ํ„ฐ - **๊ณ ์ • ๋Œ€ํ™”** โ€” ํ•€ ๊ณ ์ • ํ•ญ๋ชฉ์ด ์ตœ์ƒ๋‹จ์— ์œ„์น˜ (์šฐํด๋ฆญ > ๊ณ ์ •/ํ•ด์ œ) - **๋‚ ์งœ๋ณ„ ๊ทธ๋ฃน** โ€” ์˜ค๋Š˜ / ์–ด์ œ / ์ด๋ฒˆ ์ฃผ / ์ด์ „ ์ˆœ์„œ - **๋Œ€ํ™” ์‚ญ์ œ** โ€” ์šฐํด๋ฆญ > ์‚ญ์ œ (ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ) **์šฐ์ธก ํŒจ๋„ โ€” ๋Œ€ํ™” ์˜์—ญ**: - ๋ฉ”์‹œ์ง€ ๋ฒ„๋ธ” (์‚ฌ์šฉ์ž: ์šฐ์ธก / AI: ์ขŒ์ธก) - **๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋ง** โ€” ์ฝ”๋“œ ๋ธ”๋ก, ๋ชฉ๋ก, ๋ณผ๋“œ ๋“ฑ ๊ธฐ๋ณธ ์ง€์› - **์ฝ”๋“œ ๋ธ”๋ก ๋ณต์‚ฌ** ๋ฒ„ํŠผ - **์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต** โ€” SSE/์ŠคํŠธ๋ฆผ ์ง€์› ์‹œ ํ•œ ๊ธ€์ž์”ฉ ํ‘œ์‹œ - **์žฌ์ƒ์„ฑ** ๋ฒ„ํŠผ โ€” ๋งˆ์ง€๋ง‰ ์‘๋‹ต์„ ๋‹ค์‹œ ์š”์ฒญ - **๋ณต์‚ฌ** ๋ฒ„ํŠผ โ€” ๊ฐœ๋ณ„ ๋ฉ”์‹œ์ง€ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ **์ฐฝ ๊ธฐ๋Šฅ**: - ์ฐฝ ํฌ๊ธฐ ์ž์œ  ์กฐ์ ˆ (๊ฐ€๋กœยท์„ธ๋กœ) - ์ „์ฒด ํ™”๋ฉด / ์ตœ์†Œํ™” / ์ตœ๋Œ€ํ™” ์ง€์› - ํ…Œ๋งˆ ์—ฐ๋™ (DynamicResource ์‚ฌ์šฉ, ๋Ÿฐ์ฒ˜์™€ ๋™์ผํ•œ 8์ข… ํ…Œ๋งˆ) - ๋…๋ฆฝ ์ฐฝ (๋Ÿฐ์ฒ˜์™€ ๋ณ„๋„๋กœ ์—ด๋ฆผ, ํ•ญ์ƒ ์œ„ ์„ ํƒ ๊ฐ€๋Šฅ) ### ๋Œ€ํ™” ์ €์žฅ โ€” ๋กœ์ปฌ ์ „์šฉ **ํ•ต์‹ฌ**: LLM API(Ollama, vLLM, Gemini)๋Š” ๋ชจ๋‘ **๋ฌด์ƒํƒœ(stateless)**. ์„œ๋ฒ„ ์ธก์—์„œ ์ด์ „ ๋Œ€ํ™”๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ. ๋”ฐ๋ผ์„œ **๋ชจ๋“  ๋Œ€ํ™”๋Š” ๋กœ์ปฌ์— ์ €์žฅ**ํ•˜๊ณ , API ํ˜ธ์ถœ ์‹œ ์ด์ „ ๋Œ€ํ™” ๋งฅ๋ฝ์„ ํ•จ๊ป˜ ์ „์†กํ•ด์•ผ ํ•จ. ``` %APPDATA%/AxCommander/ conversations/ {uuid}.json โ† ๊ฐœ๋ณ„ ๋Œ€ํ™” ํŒŒ์ผ conversation-index.json โ† ์ œ๋ชฉยท๋‚ ์งœยท๊ณ ์ • ์—ฌ๋ถ€ ์ธ๋ฑ์Šค ``` **๋Œ€ํ™” ํŒŒ์ผ ๊ตฌ์กฐ (์˜ˆ์‹œ)**: ```json { "id": "a1b2c3d4-...", "title": "์„œ๋ฒ„ ์„ค์ • ๋ฐฉ๋ฒ•", "createdAt": "2026-03-27T10:00:00", "updatedAt": "2026-03-27T10:05:00", "pinned": true, "provider": "ollama", "model": "llama3:8b", "messages": [ { "role": "user", "content": "nginx ์„ค์ • ๋ฐฉ๋ฒ• ์•Œ๋ ค์ค˜", "timestamp": "..." }, { "role": "assistant", "content": "nginx ์„ค์ •์€...", "timestamp": "..." } ] } ``` **๋ณด๊ด€ ์ •์ฑ…**: - ๊ธฐ๋ณธ ๋ณด๊ด€ ๊ธฐ๊ฐ„: **30์ผ** (์„ค์ •์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ: 7์ผ / 30์ผ / 90์ผ / ๋ฌด์ œํ•œ) - ๊ณ ์ •(๐Ÿ“Œ)๋œ ๋Œ€ํ™”๋Š” ๋ณด๊ด€ ๊ธฐ๊ฐ„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ **์˜๊ตฌ ๋ณด๊ด€** - ๋งŒ๋ฃŒ๋œ ๋Œ€ํ™”๋Š” ์•ฑ ์‹œ์ž‘ ์‹œ ์ž๋™ ์ •๋ฆฌ **๋Œ€ํ™” ๊ด€๋ฆฌ ๋™์ž‘**: - **๋ณด๊ด€ํ•จ์œผ๋กœ ์ด๋™**: ์šฐํด๋ฆญ > "๋ณด๊ด€ํ•จ์œผ๋กœ ์ด๋™" โ€” ๋ณด๊ด€ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋„ ์ž๋™ ์‚ญ์ œ๋˜์ง€ ์•Š์Œ (์ˆ˜๋™ ์‚ญ์ œ๋งŒ ๊ฐ€๋Šฅ) - **์‚ญ์ œ**: ์šฐํด๋ฆญ > "์‚ญ์ œ" โ€” ํ™•์ธ ๋Œ€ํ™”์ƒ์ž("์ด ๋Œ€ํ™”๋ฅผ ์ •๋ง ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ž‘์—…์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") ํ‘œ์‹œ ํ›„ ์ง„ํ–‰ - **๋ณด๊ด€ํ•จ ํƒญ**: ์ขŒ์ธก ํŒจ๋„ ํ•˜๋‹จ์— "๋ณด๊ด€ํ•จ" ํƒญ ๋ณ„๋„ ํ‘œ์‹œ, ๋ณด๊ด€๋œ ๋Œ€ํ™” ๋ชฉ๋ก ์—ด๋žŒ ๊ฐ€๋Šฅ - ๋ณด๊ด€ํ•จ ๋‚ด ๋Œ€ํ™”๋„ ์‚ญ์ œ ๊ฐ€๋Šฅ (๋™์ผํ•œ ํ™•์ธ ์ ˆ์ฐจ) **API ํ˜ธ์ถœ ์‹œ ์ปจํ…์ŠคํŠธ ์ „์†ก**: - ์ „์ฒด ๋Œ€ํ™” ์ด๋ ฅ์„ `messages` ๋ฐฐ์—ด๋กœ ์ „์†ก (OpenAI ํ˜ธํ™˜ ํ˜•์‹) - ํ† ํฐ ํ•œ๋„ ์ดˆ๊ณผ ์‹œ ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ถ€ํ„ฐ ์ž๋™ ์ž˜๋ผ๋ƒ„ (sliding window) - ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ์„ค์ •์—์„œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ ### ์ง€์› LLM ์„œ๋น„์Šค (์ดˆ๊ธฐ 4์ข…) ์„ค์ • ์ฐฝ์—์„œ ์„œ๋น„์Šค๋ณ„ ๋ชจ๋ธ ๋“ฑ๋ก ํ›„, ๋Œ€ํ™” ์ฐฝ ์ž…๋ ฅ ๋ฐ”์—์„œ ๋ชจ๋ธ ์„ ํƒ Popup์œผ๋กœ ์ „ํ™˜ ๊ฐ€๋Šฅ. | ์„œ๋น„์Šค | ์—ฐ๊ฒฐ ๋ฐฉ์‹ | ์„ค์ •๊ฐ’ | |--------|----------|--------| | **Ollama** | ๋กœ์ปฌ HTTP (`http://localhost:11434`) | ์—”๋“œํฌ์ธํŠธ URL, ๋ชจ๋ธ๋ช… | | **vLLM** | HTTP API (OpenAI ํ˜ธํ™˜) | ์—”๋“œํฌ์ธํŠธ URL, ๋ชจ๋ธ๋ช…, API ํ‚ค | | **Gemini API** | Google REST API | API ํ‚ค, ๋ชจ๋ธ๋ช… (gemini-2.0-flash ๋“ฑ) | | **Claude API** | Anthropic REST API | API ํ‚ค, ๋ชจ๋ธ๋ช… (claude-sonnet-4-20250514 ๋“ฑ) | ### API ํ‚ค ์•”ํ˜ธํ™” ์ฒด๊ณ„ **์•”ํ˜ธํ™” ๋ชจ๋“œ ์ „ํ™˜**: `settings.json` โ†’ `llm.encryptionEnabled` ์„ค์ •์œผ๋กœ ์ œ์–ด | ๋ชจ๋“œ | `encryptionEnabled` | ์„ค๋ช… | ์šฉ๋„ | |------|---------------------|------|------| | **๋น„์•”ํ˜ธํ™” (๊ธฐ๋ณธ)** | `false` | API ํ‚คยท๋ชจ๋ธ๋ช…์„ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ/ํ‘œ์‹œ | ๋‚ด๋ถ€ ๊ฐœ๋ฐœ ๋ฐฐํฌ, ํ…Œ์ŠคํŠธ | | **์•”ํ˜ธํ™”** | `true` | AES-256-CBC(์•ฑ ๊ณต์šฉ ํ‚ค)๋กœ ์•”ํ˜ธํ™” ์ €์žฅ | ์šด์˜ ๋ฐฐํฌ | **๋น„์•”ํ˜ธํ™” ๋ชจ๋“œ** (ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’): - API ํ‚ค, ๋ชจ๋ธ๋ช…์ด settings.json์— **ํ‰๋ฌธ**์œผ๋กœ ์ €์žฅ๋จ - ์„ค์ • ์ฐฝ์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ณ  ์ €์žฅ๋จ - ๋‚ด๋ถ€ ๊ฐœ๋ฐœ์ž ๋ฐฐํฌ ์‹œ ๋น ๋ฅธ ์„ค์ •์— ์ ํ•ฉ **์•”ํ˜ธํ™” ๋ชจ๋“œ** (`encryptionEnabled: true`๋กœ ์ „ํ™˜ ์‹œ): - ์•ฑ ๋‚ด์žฅ ๊ณ ์ • ํ‚ค + AES-256-CBC๋กœ ์•”ํ˜ธํ™” - PBKDF2(SHA-256, 100,000ํšŒ ๋ฐ˜๋ณต)๋กœ 256-bit ํ‚ค ํŒŒ์ƒ - ๊ด€๋ฆฌ์ž PC์—์„œ ์•”ํ˜ธํ™”ํ•œ ๊ฐ’์ด ๋ชจ๋“  PC์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณตํ˜ธํ™”๋จ - AxKeyEncryptor ๋„๊ตฌ๋กœ ์‚ฌ์ „ ์•”ํ˜ธํ™” ๊ฐ€๋Šฅ - ์„ค์ • ์ฐฝ์—์„œ ์ด๋ฏธ ์ €์žฅ๋œ ํ‚ค๋Š” "(์ €์žฅ๋จ)"์œผ๋กœ ํ‘œ์‹œ **์šด์˜ ๋ฐฐํฌ ์‹œ ์•”ํ˜ธํ™” ์ „ํ™˜ ๋ฐฉ๋ฒ•**: 1. `settings.json`์—์„œ `"encryptionEnabled": true` ์„ค์ • 2. ๊ธฐ์กด ํ‰๋ฌธ ํ‚ค/๋ชจ๋ธ๋ช…์€ ์•ฑ ์žฌ์‹œ์ž‘ ์‹œ ์„ค์ • ์ €์žฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”๋จ 3. ๋˜๋Š” AxKeyEncryptor ๋„๊ตฌ๋กœ ๋ฏธ๋ฆฌ ์•”ํ˜ธํ™”ํ•œ ๊ฐ’ ๋ฐฐํฌ **ํ•˜์œ„ ํ˜ธํ™˜**: ์•”ํ˜ธํ™” ๋ชจ๋“œ์—์„œ ๋ณตํ˜ธํ™” ์‹คํŒจ ์‹œ ํ‰๋ฌธ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๋™์ž‘ (๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์•ˆ์ „) > **๋Œ€ํ™” ๋‚ด์—ญ ์•”ํ˜ธํ™”**๋Š” `encryptionEnabled`์™€ ๋ณ„๊ฐœ๋กœ ํ•ญ์ƒ **PC๋ณ„ AES-256-GCM + DPAPI**๋กœ ์•”ํ˜ธํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€ํ™” ํ”„๋ผ์ด๋ฒ„์‹œ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ๋ณ„๋„ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ### ์„ค์ • UI (๋„์ž… ๋‹น์‹œ ๊ธฐ์ค€) | ์„ค์ • ํ•ญ๋ชฉ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | |-----------|------|--------| | LLM ์„œ๋น„์Šค ์„ ํƒ | ComboBox (Ollama/vLLM/Gemini) | Ollama | | ์—”๋“œํฌ์ธํŠธ URL | TextBox | `http://localhost:11434` | | ๋ชจ๋ธ๋ช… | TextBox / ComboBox | `llama3:8b` | | API ํ‚ค (์•”ํ˜ธํ™”) | PasswordBox | (์—†์Œ) | | ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ | TextBox (์—ฌ๋Ÿฌ ์ค„) | "๋‹น์‹ ์€ ์œ ๋Šฅํ•œ AI ๋น„์„œ์ž…๋‹ˆ๋‹ค." | | ๋Œ€ํ™” ๋ณด๊ด€ ๊ธฐ๊ฐ„ | ComboBox | 30์ผ | | ์ตœ๋Œ€ ์ปจํ…์ŠคํŠธ ํ† ํฐ | Slider / TextBox | 4096 | | ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต | ToggleSwitch | ON | | ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ | Button | "์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ" | ### ๊ตฌํ˜„ ํŒŒ์ผ ๊ตฌ์กฐ (๋„์ž… ๋‹น์‹œ ์„ค๊ณ„์•ˆ) ``` src/AxCommander/ Models/ ChatMessage.cs โ† ๋ฉ”์‹œ์ง€ ๋ชจ๋ธ (role, content, timestamp) Conversation.cs โ† ๋Œ€ํ™” ๋ชจ๋ธ (id, title, messages, pinned, ...) LlmSettings.cs โ† LLM ์„ค์ • ๋ชจ๋ธ Services/ LlmService.cs โ† LLM API ์ถ”์ƒํ™” (Ollama/vLLM/Gemini ํ†ตํ•ฉ) OllamaClient.cs โ† Ollama HTTP ํด๋ผ์ด์–ธํŠธ VllmClient.cs โ† vLLM (OpenAI ํ˜ธํ™˜) ํด๋ผ์ด์–ธํŠธ GeminiClient.cs โ† Gemini REST ํด๋ผ์ด์–ธํŠธ ConversationStore.cs โ† ๋Œ€ํ™” ๋กœ์ปฌ ์ €์žฅ/๋กœ๋“œ/์‚ญ์ œ/๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ KeyEncryptionService.cs โ† API ํ‚ค ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ViewModels/ ChatViewModel.cs โ† ๋Œ€ํ™” ์ฐฝ ViewModel Views/ ChatWindow.xaml / .cs โ† ์ „์šฉ ๋Œ€ํ™” ์ฐฝ (2ํŒจ๋„) Handlers/ LlmChatHandler.cs โ† ! ์˜ˆ์•ฝ์–ด ํ•ธ๋“ค๋Ÿฌ (๋Ÿฐ์ฒ˜์—์„œ ChatWindow ์—ด๊ธฐ) src/AxKeyEncryptor/ โ† ๋ณ„๋„ ํ”„๋กœ์ ํŠธ (์•”ํ˜ธํ™” ๋„๊ตฌ) Program.cs โ† ์ฝ˜์†” ๋˜๋Š” ๊ฐ„๋‹จํ•œ WinForms GUI ``` ### ๋‹จ๊ณ„๋ณ„ ๊ตฌํ˜„ ํ˜„ํ™ฉ | ๋‹จ๊ณ„ | ๋‚ด์šฉ | ์ƒํƒœ | |------|------|------| | **1๋‹จ๊ณ„** | Ollama ์—ฐ๊ฒฐ + ๊ธฐ๋ณธ ๋Œ€ํ™” ์ฐฝ (๋‹จ์ผ ๋Œ€ํ™”) | โœ… ์™„๋ฃŒ | | **2๋‹จ๊ณ„** | ๋Œ€ํ™” ๋ชฉ๋ก + ์ €์žฅ/๋กœ๋“œ + ๊ณ ์ •/์‚ญ์ œ/๋ถ„๋ฅ˜/์ด๋ฆ„๋ณ€๊ฒฝ | โœ… ์™„๋ฃŒ | | **3๋‹จ๊ณ„** | vLLM / Gemini / Claude ์—ฐ๊ฒฐ ์ถ”๊ฐ€ + ์„ค์ • ํƒญ | โœ… ์™„๋ฃŒ | | **4๋‹จ๊ณ„** | ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต + ๋งˆํฌ๋‹ค์šด/์ฝ”๋“œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ๋ Œ๋”๋ง | โœ… ์™„๋ฃŒ | | **5๋‹จ๊ณ„** | ํ”„๋กฌํ”„ํŠธ ์นด๋“œ + ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ | โœ… ์™„๋ฃŒ | | **6๋‹จ๊ณ„** | ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰(k/m ๋‹จ์œ„) + ์‘๋‹ต ์†Œ์š”์‹œ๊ฐ„ ํ‘œ์‹œ | โœ… ์™„๋ฃŒ | | **7๋‹จ๊ณ„** | ํƒ€์ดํ•‘ ํšจ๊ณผ + ํ”ผ๋“œ๋ฐฑ(์ข‹์•„์š”/์‹ซ์–ด์š”) ์˜์†์„ฑ | โœ… ์™„๋ฃŒ | | **8๋‹จ๊ณ„** | ์ปค์Šคํ…€ Popup ๋ฉ”๋‰ด ํ†ต์ผ (ContextMenu ์ œ๊ฑฐ) | โœ… ์™„๋ฃŒ | | **9๋‹จ๊ณ„** | ์ง€์—ฐ ์บก์ฒ˜ (Shift+Enter 3/5/10์ดˆ ํƒ€์ด๋จธ) | โœ… ์™„๋ฃŒ | | **ํ›„์† ํ™•์žฅ** | ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ, ๋‚ด๋ณด๋‚ด๊ธฐ, Cowork ํƒญ | ์ดํ›„ AX Agent ๋กœ๋“œ๋งต์œผ๋กœ ์ด๊ด€ | --- ## ์•Œ๋ ค์ง„ ์ œํ•œ์‚ฌํ•ญ ๋ฐ ํ–ฅํ›„ ๊ฐœ์„  | ํ•ญ๋ชฉ | ํ˜„ํ™ฉ | ๊ฐœ์„  ๋ฐฉํ–ฅ | |------|------|----------| | ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ ์ด๋ฏธ์ง€ | ํ…์ŠคํŠธ๋งŒ ์ง€์› | `IDataObject` ์ด๋ฏธ์ง€ ํƒ€์ž… ์ถ”๊ฐ€ | | ํด๋ฆฝ๋ณด๋“œ ๋ณ‘ํ•ฉ ํ•ญ๋ชฉ ์‹œ๊ฐ ํ‘œ์‹œ | ํžŒํŠธ ๋ฐ”๋กœ๋งŒ ๊ฐœ์ˆ˜ ํ‘œ์‹œ | ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์— ์ฒดํฌ๋งˆํฌ ์•„์ด์ฝ˜ ์ถ”๊ฐ€ | | ์Šค๋‹ˆํŽซ ๊ธ€๋กœ๋ฒŒ ํ™•์žฅ | ๋Ÿฐ์ฒ˜์—์„œ๋งŒ ๋™์ž‘ | `WH_KEYBOARD_LL` ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ™•์žฅ | | ์ธ๋ฑ์Šค ๊ฒฝ๋กœ | Desktop + Start Menu | Program Files ๋“ฑ ์ถ”๊ฐ€ ์˜ต์…˜ | | ๋ณด์•ˆ ์ œ์™ธ ํŒจํ„ด ํŽธ์ง‘ | ์ฝ๊ธฐ ์ „์šฉ ํ‘œ์‹œ | ์„ค์ • UI์—์„œ ํŒจํ„ด ์ถ”๊ฐ€/์‚ญ์ œ ์ง€์› | ### ํ–ฅํ›„ ๊ฐœ์„  โ€” ONNX ์ž„๋ฒ ๋”ฉ ์ฝ”๋“œ ๊ฒ€์ƒ‰ (์‚ฌ์–‘ ํ™•๋ณด ์‹œ) ํ˜„์žฌ ์ฝ”๋“œ ๊ฒ€์ƒ‰์€ **TF-IDF + SQLite ์˜์† ์ธ๋ฑ์Šค** ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (v0.5.x). ์‚ฌ๋‚ด PC ์‚ฌ์–‘์ด ํ™•๋ณด๋˜๋ฉด ONNX ๋กœ์ปฌ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### ํ˜„์žฌ ๊ตฌํ˜„ (TF-IDF + SQLite) - **๋ฐฉ์‹**: ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ TF-IDF ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ + ๋ฐ”์ด๊ทธ๋žจ + ์Šคํ†ฑ์›Œ๋“œ ์ œ๊ฑฐ - **์ €์žฅ**: `%APPDATA%\AxCopilot\index\{folderHash}.db` (SQLite) - **์žฅ์ **: ์™ธ๋ถ€ ์˜์กด ์—†์Œ, ๋ฐฐํฌ +3MB, ์ €์‚ฌ์–‘ PC์—์„œ๋„ ๋™์ž‘ - **ํ•œ๊ณ„**: ๋™์˜์–ด/์˜๋ฏธ ์œ ์‚ฌ์„ฑ ๋ฏธ์ง€์› ("์‚ฌ์šฉ์ž ์ธ์ฆ" โ†” "๋กœ๊ทธ์ธ ๊ฒ€์ฆ" ๋งค์นญ ๋ถˆ๊ฐ€) #### ONNX ์ž„๋ฒ ๋”ฉ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ณ„ํš | ํ•ญ๋ชฉ | ๋‚ด์šฉ | |------|------| | **NuGet** | `Microsoft.ML.OnnxRuntime` 1.17+ (CPU ์ „์šฉ) | | **๋ชจ๋ธ** | `all-MiniLM-L6-v2` (90MB, 384์ฐจ์›) ๋˜๋Š” `bge-small-en` (130MB) | | **๋ฒกํ„ฐ DB** | ๊ธฐ์กด SQLite์— BLOB ์ปฌ๋Ÿผ ์ถ”๊ฐ€ (384ร—float32 = 1.5KB/์ฒญํฌ) | | **๋ฐฐํฌ ํฌ๊ธฐ** | ํ˜„์žฌ ~20MB โ†’ ~160MB (+140MB) | | **์ตœ์†Œ ์‚ฌ์–‘** | RAM 4GB ์ด์ƒ, CPU AVX2 ์ง€์› ๊ถŒ์žฅ | #### ์—…๊ทธ๋ ˆ์ด๋“œ ์ ˆ์ฐจ (๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ) 1. **NuGet ์ถ”๊ฐ€**: ```bash dotnet add src/AxCopilot/AxCopilot.csproj package Microsoft.ML.OnnxRuntime --version 1.17.0 ``` 2. **๋ชจ๋ธ ๋ฐฐ์น˜**: `Assets/models/all-MiniLM-L6-v2.onnx` (๋นŒ๋“œ ์‹œ ๋ณต์‚ฌ) 3. **CodeIndexService ์ˆ˜์ •**: ```csharp // ์ธ๋ฑ์‹ฑ ์‹œ ์ฒญํฌ๋ณ„ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ์ƒ์„ฑ var embedding = _onnxSession.Run(new[] { tokenizedInput }); // SQLite chunks ํ…Œ์ด๋ธ”์— embedding BLOB ์ปฌ๋Ÿผ ์ถ”๊ฐ€ // ๊ฒ€์ƒ‰ ์‹œ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๋ฒกํ„ฐ ๊ฐ„ ๊ณ„์‚ฐ ``` 4. **SQLite ์Šคํ‚ค๋งˆ ํ™•์žฅ**: ```sql ALTER TABLE chunks ADD COLUMN embedding BLOB; -- ๊ฒ€์ƒ‰ ์‹œ: SELECT ... ORDER BY cosine_similarity(query_vec, embedding) DESC ``` 5. **์„ค์ • ์ถ”๊ฐ€**: `AppSettings.Llm.Code.UseEmbeddingSearch` (bool, default false) - false: ๊ธฐ์กด TF-IDF ์‚ฌ์šฉ (์ €์‚ฌ์–‘ ํ˜ธํ™˜) - true: ONNX ์ž„๋ฒ ๋”ฉ ์‚ฌ์šฉ (๊ณ ํ’ˆ์งˆ) 6. **ํด๋ฐฑ**: ONNX ๋กœ๋“œ ์‹คํŒจ ์‹œ ์ž๋™์œผ๋กœ TF-IDF ๋ชจ๋“œ๋กœ ์ „ํ™˜ > **์ฐธ๊ณ **: ์‚ฌ๋‚ด PC ์‚ฌ์–‘(CPU, RAM)์ด ๋‚ฎ์•„ ONNX ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ ์‹œ๊ฐ„(3~5์ดˆ)๊ณผ > ์ธ๋ฑ์‹ฑ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ. ๋ฐ˜๋“œ์‹œ ์‚ฌ์–‘ ํ™•์ธ ํ›„ ๋„์ž… ๊ฒฐ์ •. ### ๋ฏธ์ง€์› โ€” ๊ฐœ๋ฐœ ๊ณ„ํš ์—†์Œ ์•„๋ž˜ ๊ธฐ๋Šฅ์€ Alfred ๋น„๊ต์—์„œ ์–ธ๊ธ‰๋œ ๋ฐ” ์žˆ์œผ๋‚˜ **AX Commander์— ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์ •**๋˜์–ด ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ Alfred ๋น„๊ต ์‹œ์—๋„ ์ด ํ•ญ๋ชฉ๋“ค์€ ๋น„๊ต ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. | ๊ธฐ๋Šฅ | ์ด์œ  | |------|------| | ์›Œํฌํ”Œ๋กœ์šฐ ์ž๋™ํ™” ์ฒด์ธ | ์‚ฌ๋‚ด ์—…๋ฌด ํ๋ฆ„์ƒ ๋ถˆํ•„์š”. ๋ฐฐ์น˜ ๋ช…๋ น(`>`)์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋Œ€์ฒด ๊ฐ€๋Šฅ | | ์—ฐ๋ฝ์ฒ˜ ๊ฒ€์ƒ‰ | MAPI/vCard ์—ฐ๋™ ๋ณต์žก๋„ ๋Œ€๋น„ ์‚ฌ์šฉ ๋นˆ๋„ ๋‚ฎ์Œ | | ์‚ฌ์ „ (Dictionary) | OS ๋‚ด์žฅ ์‚ฌ์ „ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๊ฒ€์ƒ‰์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋Œ€์ฒด ๊ฐ€๋Šฅ | | QR์ฝ”๋“œ ์ƒ์„ฑ | ์—…๋ฌด ํ™œ์šฉ๋„ ๋‚ฎ์Œ, ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†๋Š” ๊ตฌํ˜„ ๋น„์šฉ ๋Œ€๋น„ ํšจ์šฉ ๋‚ฎ์Œ | --- ## ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - **IDE**: Visual Studio 2022 / JetBrains Rider / VS Code (C# Dev Kit) - **SDK**: .NET 8 SDK - **ํƒ€๊ฒŸ**: `net8.0-windows`, `win-x64` - **UI ํ”„๋ ˆ์ž„์›Œํฌ**: WPF (`UseWPF=true`) + WinForms (`UseWindowsForms=true`, ColorDialog ์‚ฌ์šฉ) - **ํ…Œ์ŠคํŠธ**: xUnit 2.9.0, FluentAssertions 6.12.0 --- ## ๊ฒฝ์Ÿ ์ œํ’ˆ ๊ธฐ๋Šฅ ๋น„๊ต ์•„๋ž˜ ๋น„๊ตํ‘œ๋Š” **๋Ÿฐ์ฒ˜ ์˜์—ญ(AX Commander) ์ดˆ๊ธฐ ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค ๊ธฐ์ค€**์œผ๋กœ macOS Alfred 5, macOS Spotlight, Windows PowerToys Run๊ณผ ๋น„๊ตํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. | ๊ธฐ๋Šฅ | AX Commander | Alfred 5 | Spotlight | PowerToys Run | |------|:---:|:---:|:---:|:---:| | ์•ฑ/ํŒŒ์ผ ํผ์ง€ ๊ฒ€์ƒ‰ | O | O | O | O | | ํ•œ๊ตญ์–ด ์ดˆ์„ฑ ๊ฒ€์ƒ‰ | **O** | X | X | X | | ์‹คํ–‰ ๋นˆ๋„ ํ•™์Šต | O | O | O | O | | ๊ณ„์‚ฐ๊ธฐ + ์ˆ˜ํ•™ ํ•จ์ˆ˜ | O | O | โ–ณ (๊ธฐ๋ณธ) | O | | ๋‹จ์œ„ ๋ณ€ํ™˜ | O | O | O | O | | ํ†ตํ™” ๋ณ€ํ™˜ (์‹ค์‹œ๊ฐ„) | O | O | X | X | | ์›น ๊ฒ€์ƒ‰ (๋‹ค์ค‘ ์—”์ง„) | O | O | O | O | | ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ | O | O (Powerpack) | X | X | | ํด๋ฆฝ๋ณด๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์ฒด์ด๋‹ | **O** | X | X | X | | ํ…์ŠคํŠธ ์ผ๊ด„ ์ฒ˜๋ฆฌ (batch) | **O** | X | X | X | | ํ…์ŠคํŠธ ์Šค๋‹ˆํŽซ + ์ž๋™ ํ™•์žฅ | O | O (Powerpack) | X | X | | ํŒŒ์ผ ์•ก์…˜ ์„œ๋ธŒ๋ฉ”๋‰ด | O | O | X | X | | JSON ํฌ๋งท/๊ฒ€์ฆ | O | X | X | X | | ์ธ์ฝ”๋”ฉ/ํ•ด์‹ฑ (Base64, SHA) | O | X | X | X | | ์ƒ‰์ƒ ๋ณ€ํ™˜ (HEX/RGB/HSL) | O | X | X | X | | ์Šคํฌ์ด๋“œ ์ƒ‰์ƒ ์ถ”์ถœ | **O** | X | X | X | | ํฌํŠธ/ํ”„๋กœ์„ธ์Šค ์กฐํšŒ | O | X | X | X | | ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์กฐํšŒ | O | X | X | X | | ํ™”๋ฉด ์บก์ฒ˜ (4๋ชจ๋“œ) | O | X | โ–ณ (์Šคํฌ๋ฆฐ์ƒท) | X | | ๊ธ€๋กœ๋ฒŒ ์บก์ฒ˜ ๋‹จ์ถ•ํ‚ค | O | X | O | X | | ์Šคํฌ๋กค ์บก์ฒ˜ (์ž๋™ ์Šคํ‹ฐ์นญ) | **O** | X | X | X | | ์˜์—ญ ์บก์ฒ˜ ํ‚ค๋ณด๋“œ ๋ฏธ์„ธ์กฐ์ • | **O** | X | X | X | | ์ฐฝ ์Šค๋ƒ… ๋ ˆ์ด์•„์›ƒ | O | X | X | O | | ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ €์žฅ/๋ณต์› | O | X | X | X | | ์œˆ๋„์šฐ ์Šค์œ„์ฒ˜ (๊ฒ€์ƒ‰+์ „ํ™˜) | **O** | X | X | O | | ์‹œ์Šคํ…œ ๋ช…๋ น (์ž ๊ธˆ/์ ˆ์ „/์ข…๋ฃŒ) | O | O | X | O | | ๋ฏธ๋””์–ด ์ œ์–ด | O | O | O | X | | ํƒ€์ด๋จธ/์•Œ๋žŒ | O | X | X | X | | ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ (kill) | O | X | X | O | | ์„œ๋น„์Šค ๊ด€๋ฆฌ (svc) | **O** | X | X | X | | ๋‚ ์งœ ๊ณ„์‚ฐ/D-day/ํƒ€์ž„์Šคํƒฌํ”„ | **O** | X | X | X | | ํŒŒ์ผ ๋น„๊ต (diff) | **O** | X | X | X | | ํŒŒ์ผ ์ผ๊ด„ ์ด๋ฆ„๋ณ€๊ฒฝ | **O** | X | X | O | | ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ | **O** | X | X | X | | ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ด€๋ฆฌ | O | X | X | X | | ์—…๋ฌด ์ผ์ง€ ์ž๋™ ์ƒ์„ฑ | **O** | X | X | X | | ๋ฃจํ‹ด ์ž๋™ํ™” | **O** | โ–ณ (์›Œํฌํ”Œ๋กœ์šฐ) | X | X | | ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ | O | X | X | O | | ์ด๋ชจ์ง€ ํ”ผ์ปค | O | X | X | O | | ์ตœ๊ทผ ํŒŒ์ผ | O | O | O | X | | ๋น ๋ฅธ ๋ฉ”๋ชจ | O | X | X | X | | ์•ฑ ์ œ๊ฑฐ | O | X | X | X | | ์ž ๊ธˆ ํ•ด์ œ ์‚ฌ์šฉ์‹œ๊ฐ„ ์•Œ๋ฆผ | **O** | X | X | X | | ํ…Œ๋งˆ (9์ข… + ์ปค์Šคํ…€ + ๋ชจ์–‘) | O | O | X | โ–ณ (์ œํ•œ) | | ๋‹ค๊ตญ์–ด (5๊ฐœ ์–ธ์–ด) | O | O | O | O | | ํ”Œ๋Ÿฌ๊ทธ์ธ DLL ํ™•์žฅ | O | O | X | O | | DPAPI ํด๋ฆฝ๋ณด๋“œ ์•”ํ˜ธํ™” | **O** | X | X | X | | ๋‹จ์ผ EXE ๋ฐฐํฌ | **O** | X | N/A | X | | ์™„์ „ ์˜คํ”„๋ผ์ธ (์™ธ๋ถ€ ํ†ต์‹  ์—†์Œ) | **O** | โ–ณ | O | O | **O** = ์ง€์›, **โ–ณ** = ๋ถ€๋ถ„ ์ง€์›, **X** = ๋ฏธ์ง€์›, **๊ตต์€ O** = AX Commander ๊ณ ์œ  ๊ธฐ๋Šฅ --- ## ์ƒˆ๋กœ์šด ํ•ธ๋“ค๋Ÿฌ/ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ• (๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ) ### 1๋‹จ๊ณ„: IActionHandler ๊ตฌํ˜„ ```csharp // Handlers/MyNewHandler.cs using AxCommander.SDK; using AxCommander.Themes; namespace AxCommander.Handlers; public class MyNewHandler : IActionHandler { // ์ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ”„๋ฆฌํ”ฝ์Šค (null์ด๋ฉด ํผ์ง€ ๊ฒ€์ƒ‰์— ํ†ตํ•ฉ) public string? Prefix => "myprefix"; public PluginMetadata Metadata => new( "MyNew", "๋‚ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ โ€” myprefix", "1.0", "AX"); public Task> GetItemsAsync(string query, CancellationToken ct) { // query: ํ”„๋ฆฌํ”ฝ์Šค ์ดํ›„์˜ ์ž…๋ ฅ ํ…์ŠคํŠธ // LauncherItem์˜ Data ํ•„๋“œ์— ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ๋ฐ˜ํ™˜ return Task.FromResult>( [ new LauncherItem( "์ œ๋ชฉ", "์„ค๋ช… ยท Enter๋กœ ์‹คํ–‰", null, "์‹คํ–‰ ์‹œ ์ „๋‹ฌ๋  ๋ฐ์ดํ„ฐ", Symbol: Symbols.Info) ]); } public Task ExecuteAsync(LauncherItem item, CancellationToken ct) { // item.Data์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ์‹คํ–‰ if (item.Data is string data) { // ์ž‘์—… ์ˆ˜ํ–‰ } return Task.CompletedTask; } } ``` ### 2๋‹จ๊ณ„: ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก (App.xaml.cs) ```csharp // App.xaml.cs OnStartup() ๋‚ด๋ถ€, HelpHandler ์œ„์— ์ถ”๊ฐ€ commandResolver.RegisterHandler(new MyNewHandler()); ``` ### 3๋‹จ๊ณ„: ์‹ฌ๋ณผ ์ถ”๊ฐ€ (Symbols.cs) ```csharp // Themes/Symbols.cs public const string MyNewIcon = "\uE946"; // Segoe MDL2 Assets ์œ ๋‹ˆ์ฝ”๋“œ ``` ์ฐธ๊ณ : [Segoe MDL2 Assets ์•„์ด์ฝ˜ ๋ชฉ๋ก](https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font) ### 4๋‹จ๊ณ„: ๋„์›€๋ง ํ•ญ๋ชฉ ์ถ”๊ฐ€ (HelpHandler.cs) `_entries` ๋ฐฐ์—ด์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ (ํ‚ค๋ณด๋“œ ์„น์…˜ ์œ„์—): ```csharp new("์นดํ…Œ๊ณ ๋ฆฌ", "myprefix", "๊ธฐ๋Šฅ ์ œ๋ชฉ", "๊ธฐ๋Šฅ ์„ค๋ช…", "์‚ฌ์šฉ ์˜ˆ์‹œ", Symbols.MyNewIcon, "#HEX์ƒ‰์ƒ"), ``` ### 5๋‹จ๊ณ„: ์„ค์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 1. `Models/AppSettings.cs`์— ์„ค์ • ํด๋ž˜์Šค ์ถ”๊ฐ€ 2. `ViewModels/SettingsViewModel.cs`์— ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ 3. `Views/SettingsWindow.xaml`์— ํƒญ ๋˜๋Š” ์„น์…˜ ์ถ”๊ฐ€ ### 6๋‹จ๊ณ„: ์™ธ๋ถ€ DLL ํ”Œ๋Ÿฌ๊ทธ์ธ ์™ธ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” `AxCommander.SDK` ํ”„๋กœ์ ํŠธ์˜ `IActionHandler`๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” DLL์„ ๋งŒ๋“ค์–ด `settings.json`์˜ `plugins` ๋ฐฐ์—ด์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค: ```json "plugins": [ { "path": "C:\\Plugins\\MyPlugin.dll", "enabled": true } ] ``` ๋Ÿฐํƒ€์ž„์— `PluginHost`๊ฐ€ Assembly.LoadFrom()์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  `IActionHandler` ๊ตฌํ˜„์ฒด๋ฅผ ์ž๋™ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. --- ## ์‚ฌ๋‚ด LLM / AI Agent ์—ฐ๋™ ๊ฐ€์ด๋“œ (ํ–ฅํ›„ ํ™•์žฅ) AX Commander๋Š” ์‚ฌ๋‚ด LLM ๋˜๋Š” AI Agent๋ฅผ ์—ฐ๋™ํ•˜์—ฌ **์ž์—ฐ์–ด ์งˆ์˜-์‘๋‹ต** ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ### ์—ฐ๋™ ์‹œ๋‚˜๋ฆฌ์˜ค 1. **์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท LLM API**: ๋ณ„๋„ ํ”„๋ฆฌํ”ฝ์Šค(`ai` ๋˜๋Š” `?? `) ์ž…๋ ฅ โ†’ ์‚ฌ๋‚ด AI ์„œ๋ฒ„์— ์งˆ์˜ โ†’ ์‘๋‹ต์„ ๋Ÿฐ์ฒ˜ ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ 2. **ํ‚ค์›Œ๋“œ ์—†๋Š” ์ž๋™ ๊ฐ์ง€**: ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ ์—†๊ณ  ํผ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ โ†’ ์ž๋™์œผ๋กœ AI์— ์งˆ์˜ ํด๋ฐฑ 3. **ํด๋ฆฝ๋ณด๋“œ AI ๋ถ„์„**: ํด๋ฆฝ๋ณด๋“œ ํ…์ŠคํŠธ๋ฅผ AI์— ์ „๋‹ฌํ•˜์—ฌ ์š”์•ฝ/๋ฒˆ์—ญ/๊ต์ • ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ### ๊ตฌํ˜„ ๋ฐฉ๋ฒ• #### ๋ฐฉ๋ฒ• A: ์ „์šฉ ํ•ธ๋“ค๋Ÿฌ (๊ถŒ์žฅ) ```csharp // Handlers/AiQueryHandler.cs public class AiQueryHandler : IActionHandler { public string? Prefix => "ai"; // ๋˜๋Š” "??" ๋“ฑ private readonly HttpClient _client; // ์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท ์ „์šฉ public AiQueryHandler(string intranetEndpoint) { _client = new HttpClient { BaseAddress = new Uri(intranetEndpoint) }; _client.Timeout = TimeSpan.FromSeconds(10); } public async Task> GetItemsAsync(string query, CancellationToken ct) { if (string.IsNullOrWhiteSpace(query)) return [new LauncherItem("AI์—๊ฒŒ ์งˆ๋ฌธํ•˜์„ธ์š”", "์‚ฌ๋‚ด LLM์— ์งˆ์˜ํ•ฉ๋‹ˆ๋‹ค", null, null)]; try { // ์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท API ํ˜ธ์ถœ (DEVELOPMENT.md ๊ฐœ๋ฐœ ์›์น™์— ์˜๊ฑฐ, // ์‚ฌ๋‚ด ๋ช…์‹œ ํ—ˆ๊ฐ€๋œ ์—”๋“œํฌ์ธํŠธ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ) var response = await _client.PostAsJsonAsync("/api/chat", new { prompt = query }, ct); var result = await response.Content.ReadAsStringAsync(ct); return [new LauncherItem( "AI ์‘๋‹ต", result.Length > 200 ? result[..197] + "โ€ฆ" : result, null, result, Symbol: Symbols.Lightbulb)]; } catch (Exception ex) { return [new LauncherItem("AI ์‘๋‹ต ์‹คํŒจ", ex.Message, null, null, Symbol: Symbols.Error)]; } } public Task ExecuteAsync(LauncherItem item, CancellationToken ct) { if (item.Data is string text) Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); return Task.CompletedTask; } } ``` #### ๋ฐฉ๋ฒ• B: CommandResolver ํด๋ฐฑ ํ†ตํ•ฉ `Core/CommandResolver.cs`์˜ `ResolveAsync` ๋ฉ”์„œ๋“œ์—์„œ ํผ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ 0๊ฑด์ผ ๋•Œ AI ํ•ธ๋“ค๋Ÿฌ๋กœ ํด๋ฐฑ: ```csharp // Core/CommandResolver.cs if (fuzzyResults.Count == 0 && _aiHandler != null) { return await _aiHandler.GetItemsAsync(input, ct); } ``` #### ๋ฐฉ๋ฒ• C: JSON ์Šคํ‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ (๊ธฐ์กด ์ธํ”„๋ผ ํ™œ์šฉ) ๊ธฐ์กด `JsonSkillLoader`๊ฐ€ ์ด๋ฏธ HTTP API ํ˜ธ์ถœ์„ ์ง€์›ํ•˜๋ฏ€๋กœ, `.skill.json` ํŒŒ์ผ๋กœ LLM API๋ฅผ ๋“ฑ๋ก: ```json { "prefix": "ai", "name": "์‚ฌ๋‚ด AI ์งˆ์˜", "type": "http", "url": "https://intranet.company.com/api/llm", "method": "POST", "bodyTemplate": "{\"prompt\": \"{{query}}\"}", "responsePath": "data.answer" } ``` ### ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ | ํ•ญ๋ชฉ | ์›์น™ | |------|------| | ์—”๋“œํฌ์ธํŠธ | **์‚ฌ๋‚ด ์ธํŠธ๋ผ๋„ท URL๋งŒ ํ—ˆ์šฉ** โ€” settings.json์— ๋ช…์‹œ์  ๋“ฑ๋ก ํ•„์š” | | ํƒ€์ž„์•„์›ƒ | ์ตœ๋Œ€ 10์ดˆ (๋Ÿฐ์ฒ˜ UX ์œ ์ง€) | | ๋ฐ์ดํ„ฐ | ํด๋ฆฝ๋ณด๋“œ ๋‚ด์šฉ์„ AI์— ์ „๋‹ฌํ•  ๋•Œ ๋ณด์•ˆ ํŒจํ„ด ๊ฒ€์‚ฌ ์„ ํ–‰ (๊ธฐ์กด `excludePatterns` ํ™œ์šฉ) | | ์ธ์ฆ | Windows ์ธ์ฆ(SSPI) ๋˜๋Š” ์‚ฌ๋‚ด ํ† ํฐ โ€” `CredentialManager` (advapi32.dll, DPAPI) ์‚ฌ์šฉ | | ๋กœ๊น… | AI ์งˆ์˜ ๋‚ด์šฉ์€ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜์ง€ ์•Š์Œ (๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ํฌํ•จ ๊ฐ€๋Šฅ) | ### ์„ค์ • UI ํ™•์žฅ ์„ค์ • ์ฐฝ์— **AI ํƒญ**์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ์„ ๊ด€๋ฆฌ: | ์„ค์ • ํ•ญ๋ชฉ | ์„ค๋ช… | |----------|------| | AI ์—ฐ๋™ ํ™œ์„ฑํ™” | ๊ธฐ๋Šฅ ์ „์ฒด ํ† ๊ธ€ | | ์‚ฌ๋‚ด API ์—”๋“œํฌ์ธํŠธ | ์ธํŠธ๋ผ๋„ท URL ์ž…๋ ฅ | | ํ”„๋ฆฌํ”ฝ์Šค | `ai`, `??`, ๋˜๋Š” ๋นˆ ๊ฐ’ (์ž๋™ ํด๋ฐฑ) | | ํƒ€์ž„์•„์›ƒ (์ดˆ) | 1~30์ดˆ | | ์ž๋™ ํด๋ฐฑ | ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ 0๊ฑด ์‹œ ์ž๋™์œผ๋กœ AI ์งˆ์˜ | ### ๋กœ๋“œ๋งต | ๋‹จ๊ณ„ | ๋‚ด์šฉ | |------|------| | Phase 1 | `ai` ํ”„๋ฆฌํ”ฝ์Šค ํ•ธ๋“ค๋Ÿฌ + ์‚ฌ๋‚ด REST API ์—ฐ๋™ (ํ…์ŠคํŠธ ์งˆ์˜/์‘๋‹ต) | | Phase 2 | ์ž๋™ ํด๋ฐฑ (ํผ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์„ ๋•Œ) | | Phase 3 | ํด๋ฆฝ๋ณด๋“œ AI ๋ถ„์„ (`ai summarize`, `ai translate`, `ai proofread`) | | Phase 4 | Agent ๋ชจ๋“œ โ€” ๋ฉ€ํ‹ฐํ„ด ๋Œ€ํ™” + ๋„๊ตฌ ํ˜ธ์ถœ (ํŒŒ์ผ ์ฝ๊ธฐ, ๊ณ„์‚ฐ ๋“ฑ์„ AI๊ฐ€ ๊ฒฐ์ •) | --- ## ์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด (/ Commands) AX Agent ๋Œ€ํ™” ์ž…๋ ฅ์ฐฝ์—์„œ `/`๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์™„์„ฑ ํŒ์—…์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํƒญ์— ๋งž๋Š” ๋ช…๋ น์–ด๋งŒ ํ•„ํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค. ### ๊ณตํ†ต ๋ช…๋ น์–ด (๋ชจ๋“  ํƒญ) | ๋ช…๋ น์–ด | ๊ธฐ๋Šฅ | ์„ค๋ช… | |--------|------|------| | `/summary` | Summary | ํ…์ŠคํŠธ/๋ฌธ์„œ๋ฅผ ํ•ต์‹ฌ ํฌ์ธํŠธ ์ค‘์‹ฌ์œผ๋กœ ์š”์•ฝ | | `/translate` | Translate | ํ…์ŠคํŠธ๋ฅผ ์˜์–ด๋กœ ๋ฒˆ์—ญ (์›๋ฌธ ํ†ค ์œ ์ง€) | | `/explain` | Explain | ๋‚ด์šฉ์„ ์‰ฝ๊ณ  ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช… (์˜ˆ์‹œ ํฌํ•จ) | | `/fix` | Fix | ๋งž์ถค๋ฒ•, ๋ฌธ๋ฒ•, ์ž์—ฐ์Šค๋Ÿฌ์šด ํ‘œํ˜„ ๊ต์ • | | `/help` | Help | ์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด ๋„์›€๋ง ์ฐฝ ํ‘œ์‹œ | ### ๊ฐœ๋ฐœ ๋ช…๋ น์–ด (Cowork/Code ํƒญ ์ „์šฉ) | ๋ช…๋ น์–ด | ๊ธฐ๋Šฅ | ์‚ฌ์šฉ ๋„๊ตฌ | |--------|------|-----------| | `/review` | Code Review | `code_review` (diff_review) | | `/pr` | PR Summary | `code_review` (pr_summary) | | `/test` | Test | `test_loop` | | `/structure` | Structure | `folder_map` | | `/build` | Build | `build_run` | | `/search` | Search | `search_codebase` | ### ์Šคํ‚ฌ ๋ช…๋ น์–ด `%APPDATA%\AxCopilot\skills\` ํด๋”์— `*.skill.md` ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด๋กœ ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. **์Šคํ‚ฌ ํŒŒ์ผ ํ˜•์‹** (2์ข…๋ฅ˜ ์ง€์›): 1) **๊ธฐ์กด ํ˜•์‹** (`*.skill.md` ๋‹จ์ผ ํŒŒ์ผ): ```markdown --- name: skill-name label: ํ‘œ์‹œ ์ด๋ฆ„ description: ์„ค๋ช… icon: \uE768 --- ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋‚ด์šฉ... ``` 2) **SKILL.md ํ‘œ์ค€** (agentskills.io ํ˜ธํ™˜, Claude Code/Cursor/Windsurf ๊ณตํ†ต): ``` skill-name/ โ”œโ”€โ”€ SKILL.md โ”œโ”€โ”€ scripts/ (์„ ํƒ) โ””โ”€โ”€ references/ (์„ ํƒ) ``` ```markdown --- name: skill-name description: ์„ค๋ช…. ์‚ฌ์šฉ ์‹œ์  ํ‚ค์›Œ๋“œ ํฌํ•จ ๊ถŒ์žฅ. license: Apache-2.0 compatibility: Requires Python 3.14+ metadata: label: ํ‘œ์‹œ ์ด๋ฆ„ icon: \uE768 author: team-name version: "1.0" allowed-tools: process file_read grep_tool --- ์ง€์‹œ์‚ฌํ•ญ ๋งˆํฌ๋‹ค์šด... ``` **๊ธฐ๋ณธ ์ œ๊ณต ์Šคํ‚ฌ** (์ž๋™ ์ƒ์„ฑ): - `/daily-standup` โ€” ๋ฐ์ผ๋ฆฌ ์Šคํƒ ๋“œ์—… ๋ณด๊ณ ์„œ - `/bug-hunt` โ€” ์ž ์žฌ์  ๋ฒ„๊ทธ ํŒจํ„ด ๊ฒ€์ƒ‰ - `/code-explain` โ€” ์ฝ”๋“œ ์ƒ์„ธ ์„ค๋ช… ### ์—์ด์ „ํŠธ ๋„๊ตฌ ๋ชฉ๋ก (v0.5.0) | ๋„๊ตฌ๋ช… | ๊ธฐ๋Šฅ | ํƒญ | |--------|------|----| | `file_read` | ํŒŒ์ผ ์ฝ๊ธฐ | Cowork/Code | | `file_write` | ํŒŒ์ผ ์“ฐ๊ธฐ | Cowork/Code | | `file_edit` | ํŒŒ์ผ ํŽธ์ง‘ (์ค„ ๊ธฐ๋ฐ˜) | Cowork/Code | | `glob` | ํŒŒ์ผ ํŒจํ„ด ๊ฒ€์ƒ‰ | Cowork/Code | | `grep_tool` | ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ | Cowork/Code | | `process` | ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ | Cowork/Code | | `folder_map` | ํด๋” ๊ตฌ์กฐ ์กฐํšŒ | Cowork/Code | | `document_read` | ๋ฌธ์„œ ์ฝ๊ธฐ (PDF/DOCX) | Cowork/Code | | `search_codebase` | ์ฝ”๋“œ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ (TF-IDF) | Cowork/Code | | `code_review` | AI ์ฝ”๋“œ ๋ฆฌ๋ทฐ | Cowork/Code | | `project_rules` | AX.md ๊ฐœ๋ฐœ ์ง€์นจ ๊ด€๋ฆฌ | Cowork/Code | | `git_tool` | Git ์ž‘์—… | Code | | `build_run` | ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ ์‹คํ–‰ | Code | | `dev_env_detect` | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ฐ์ง€ | Code | | `lsp` | LSP ์ฝ”๋“œ ์ธํ…”๋ฆฌ์ „์Šค | Code | | `test_loop` | ํ…Œ์ŠคํŠธ ์ž๋™ ๋ฃจํ”„ | Code | | `spawn_agent` | ์„œ๋ธŒ์—์ด์ „ํŠธ ์ƒ์„ฑ | Code | | `wait_agents` | ์„œ๋ธŒ์—์ด์ „ํŠธ ๊ฒฐ๊ณผ ๋Œ€๊ธฐ | Code | | `skill_manager` | ์Šคํ‚ฌ ๊ด€๋ฆฌ (list/info/reload) | Cowork/Code | | `memory` | ์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ | Cowork/Code | | `excel_create` | Excel ์ƒ์„ฑ | Cowork/Code | | `docx_create` | Word ์ƒ์„ฑ | Cowork/Code | | `csv_create` | CSV ์ƒ์„ฑ | Cowork/Code | | `markdown_create` | ๋งˆํฌ๋‹ค์šด ์ƒ์„ฑ | Cowork/Code | | `html_create` | HTML ์ƒ์„ฑ | Cowork/Code | | `chart_create` | ์ฐจํŠธ ์ƒ์„ฑ | Cowork/Code | | `batch_create` | ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ | Cowork/Code | | `document_review` | ๋ฌธ์„œ ํ’ˆ์งˆ ๊ฒ€์ฆ | Cowork/Code | | `format_convert` | ํฌ๋งท ๋ณ€ํ™˜ | Cowork/Code | --- ## ๋ฒ„์ „ ์ด๋ ฅ > **โš  ๋ฒ„์ „ ๋ณ€๊ฒฝ ์‹œ ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋™์‹œ์— ์ˆ˜์ •ํ•˜์„ธ์š”. ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๋ฒ„์ „ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.** > > | # | ์ˆ˜์ • ๋Œ€์ƒ | ํŒŒ์ผ ๊ฒฝ๋กœ | ์ˆ˜์ • ๋‚ด์šฉ | > |---|----------|----------|----------| > | 1 | **ํ”„๋กœ์ ํŠธ ๋ฒ„์ „** | `src/AxCopilot/AxCopilot.csproj` โ†’ `` | ๋ฒ„์ „ ๋ฒˆํ˜ธ ๋ณ€๊ฒฝ (์„ค์ • ์ฐฝยทWindows ์†์„ฑ์— ์ž๋™ ๋ฐ˜์˜) | > | 2 | **์ธ์Šคํ†จ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๋ฒ„์ „** | `src/AxCopilot.Installer/AxCopilot.Installer.csproj` โ†’ `` | ์ธ์Šคํ†จ๋Ÿฌ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฒ„์ „ ์ผ์น˜ | > | 3 | **์ธ์Šคํ†จ๋Ÿฌ ํ‘œ์‹œ ๋ฒ„์ „** | `src/AxCopilot.Installer/SetupForm.cs` โ†’ `AppVer` ์ƒ์ˆ˜ | ์„ค์น˜ UI ํ—ค๋”ยท๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘œ์‹œ๋˜๋Š” ๋ฒ„์ „ ๋ฌธ์ž์—ด | > | 4 | **๊ฐœ๋ฐœ ๋ฌธ์„œ ๋ฒ„์ „ ์ด๋ ฅ** | `docs/DEVELOPMENT.md` โ†’ ๋ฒ„์ „ ์ด๋ ฅ ์„น์…˜ | ์ƒˆ ๋ฒ„์ „ ํ•ญ๋ชฉ ์ถ”๊ฐ€ (์ด ํŒŒ์ผ) | > | 5 | **์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ ๋ฌธ์„œ** | `src/AxCopilot/Assets/AX Copilot ์‚ฌ์šฉ๊ฐ€์ด๋“œ.htm` | ํ—ค๋” `version-tag` + ๋ฒ„์ „ ์ด๋ ฅ ์„น์…˜์— ์ƒˆ ํ•ญ๋ชฉ ์ถ”๊ฐ€ | > | 6 | **ํ—ฌํ”„ ์ฐฝ ๋‚ด์šฉ** | `src/AxCopilot/Views/HelpDetailWindow.xaml.cs` | `_overviewItems`์˜ ์‹ ๊ธฐ๋Šฅ ํ•ญ๋ชฉยทํ”„๋ฆฌ๋ทฐ ํ•ญ๋ชฉ ๊ฐฑ์‹  | > | 7 | **MCP ํด๋ผ์ด์–ธํŠธ ๋ฒ„์ „** | `src/AxCopilot/Services/McpClientService.cs` โ†’ `clientInfo.version` | MCP ํ”„๋กœํ† ์ฝœ ํด๋ผ์ด์–ธํŠธ ๋ฒ„์ „ ๋ฌธ์ž์—ด | > | 8 | **๋กœ๋“œ๋งต ๋ฌธ์„œ** | `docs/AGENT_ROADMAP.md`, `docs/AGENT_ROADMAP.html`, `docs/LAUNCHER_ROADMAP.md`, `docs/LAUNCHER_ROADMAP.html` | ํ‘ธํ„ฐ/ํ—ค๋” ๋ฒ„์ „ ๋ฒˆํ˜ธ ๊ฐฑ์‹  | > > **์ธ์Šคํ†จ๋Ÿฌ ์ฃผ์˜**: `SetupForm.cs`์˜ `AppVer` ์ƒ์ˆ˜๋Š” ์„ค์น˜ UI ํ—ค๋” ํ‘œ์‹œ + `RegAdd()`์—์„œ > ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ `DisplayVersion`์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์ด ์•ฑ ๋ณธ์ฒด์™€ ๋‹ค๋ฅด๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ์ง€๊ฐ€ ์˜ค์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. > **๋ฐ˜๋“œ์‹œ ์•ฑ ๋ณธ์ฒด csproj ``๊ณผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.** > > ์„ค์ • ์ฐฝ(`SettingsWindow.xaml.cs โ†’ SetVersionText()`)๊ณผ ์ •๋ณด ์ฐฝ(`AboutWindow.xaml.cs`)์€ > ์•ฑ ๋ณธ์ฒด csproj ``์„ ๋ฆฌํ”Œ๋ ‰์…˜์œผ๋กœ ์ฝ์œผ๋ฏ€๋กœ ๋ณ„๋„ ์ˆ˜์ • ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. > **โš  ์‚ฌ์šฉ์ž ๋…ธ์ถœ ๋ฌธ์„œ ์ž‘์„ฑ ์›์น™ (์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ ยท ํ—ฌํ”„ ์ฐฝ)** > > ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ(`AX Copilot ์‚ฌ์šฉ๊ฐ€์ด๋“œ.htm`)์™€ ํ—ฌํ”„ ์ฐฝ(`HelpDetailWindow.xaml.cs`)์€ > **์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ณด๋Š” ๋ฌธ์„œ**์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€์— ๋‚ด๋ถ€ ๊ธฐ์ˆ  ์Šคํƒ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์•„๋ž˜ ์›์น™์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜์„ธ์š”. > > | ๊ตฌ๋ถ„ | ์‚ฌ์šฉ ๊ธˆ์ง€ (๋‚ด๋ถ€ ๊ธฐ์ˆ ) | ๋Œ€์‹  ์‚ฌ์šฉ (์‚ฌ์šฉ์ž ๊ด€์ ) | > |------|---------------------|----------------------| > | ํ”„๋กœํ† ์ฝœ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | MCP, JSON-RPC, stdio, P/Invoke, DPAPI, LCS, REST API | "์™ธ๋ถ€ ๋„๊ตฌ ์—ฐ๊ฒฐ", "์•”ํ˜ธํ™” ์ €์žฅ" | > | ํด๋ž˜์Šค/์„œ๋น„์Šค๋ช… | McpClientService, TokenEstimator, AuditLogService, DiffService | ๊ธฐ๋Šฅ ์„ค๋ช…์œผ๋กœ ๋Œ€์ฒด | > | ๋‚ด๋ถ€ ๊ตฌ์กฐ | ParentId/BranchLabel, FallbackModels, SettingsViewModel | "๋Œ€ํ™” ๋ถ„๊ธฐ", "์ž๋™ ์ „ํ™˜", "์„ค์ •" | > | ์ฝ”๋“œ ํŒจํ„ด | CJK ๊ฐ€์ค‘์น˜, ๋™์  ๋ฐ˜๋ณต ํ•œ๋„, SWE-bench, ๋‹ค๋‹จ๊ณ„ ๋ฐ˜์„ฑ | "๋” ์ •ํ™•ํ•œ ๋ถ„์„", "AI ์„ฑ๋Šฅ ๊ฐœ์„ " | > | ํŒŒ์ผ๋ช…/๊ฒฝ๋กœ | english.json, movies.json, SetupForm.cs, endpoint/apiKey | ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Œ | > > **์›์น™**: ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” "๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€"๋งŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. > "์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€"๋Š” ์ด ๊ฐœ๋ฐœ ๋ฌธ์„œ(`DEVELOPMENT.md`)์—๋งŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. > > **์ ์šฉ ๋Œ€์ƒ**: ๋ฒ„์ „ ์ด๋ ฅ, ์‹ ๊ธฐ๋Šฅ ์„ค๋ช…, ๊ฐœ์š” ํ•ญ๋ชฉ, ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋…ธ์ถœ ํ…์ŠคํŠธ ### v0.8.0 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ์—์ด์ „ํŠธ ์ธํ”„๋ผ ์ „๋ฉด ๊ณ ๋„ํ™” โ€” Phase 17-UI, 17-A~G, 18-A~C, L3 ์™„๋ฃŒ. ์‚ฌ๋‚ด/์‚ฌ์™ธ ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ ์ถ”๊ฐ€. | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์—์ด์ „ํŠธ ์ฑ„ํŒ… ํ™”๋ฉด ๊ฐœํŽธ (Phase 17-UI)** | ์ฑ„ํŒ… ์ฐฝ ์„œ๋ธŒ ๋ฐ”์— Plan ๋ชจ๋“œ 3์ƒํƒœ ํ† ๊ธ€ (Off / Auto / Always) ์ถ”๊ฐ€. ํด๋ฆญ ์‹œ ์ˆœํ™˜ ์ „ํ™˜, ํ™œ์„ฑ ์ƒํƒœ ์ƒ‰์ƒ ๊ฐ•์กฐ. `LlmSettings.PlanMode` ์„ค์ • ์—ฐ๋™ | | **Reflexion ๊ฐ•ํ™” (Phase 17-A)** | `ReflexionService` ํ™•์žฅ: ์ž๊ธฐ ํ‰๊ฐ€ โ†’ ์ „๋žต ์ˆ˜์ • ๋ฃจํ”„ ๊ตฌํ˜„. ๋„๊ตฌ ์‹คํ–‰ ์‹คํŒจ ์‹œ ๋ฐ˜์„ฑ ๊ธฐ๋ฐ˜ ์žฌ์‹œ๋„ ์ „๋žต ์ž๋™ ์„ ํƒ | | **๊ตฌ์กฐํ™”๋œ ์ด๋ฒคํŠธ ๋กœ๊ทธ (Phase 17-B)** | `AgentEventLog` JSONL ๊ธฐ๋ก ์‹œ์Šคํ…œ. `AgentLoopService`์— ์„ธ์…˜ ID ์ƒ์„ฑ + SessionStart / ToolRequest / ToolResult / SessionEnd ์ด๋ฒคํŠธ ๊ธฐ๋ก ํ†ตํ•ฉ | | **ํ›… ์‹œ์Šคํ…œ ๊ณ ๋„ํ™” (Phase 17-C)** | `ExtendedHookRunner`: PreCompact / UserPromptSubmit / AgentThinking ํ›… ์ด๋ฒคํŠธ ์ถ”๊ฐ€. `asyncRewake` ์†์„ฑ์œผ๋กœ ๋น„๋™๊ธฐ ํ›… ์™„๋ฃŒ ํ›„ ์—์ด์ „ํŠธ ์žฌ๊ฐœ ๊ฐ€๋Šฅ | | **์Šคํ‚ฌ ์‹œ์Šคํ…œ ๊ณ ๋„ํ™” (Phase 17-D)** | `PathBasedSkillActivator`: ๊ฒฝ๋กœ ํŒจํ„ด ๊ธฐ๋ฐ˜ ์Šคํ‚ฌ ์ž๋™ ํ™œ์„ฑํ™”. `SkillExtensionStore` ์‚ฌ์ด๋“œ์นด ํŒจํ„ด์œผ๋กœ ์Šคํ‚ฌ ํ™•์žฅ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ | | **๋ฉ”๋ชจ๋ฆฌ/์ปจํ…์ŠคํŠธ ๊ณ ๋„ํ™” (Phase 17-E)** | `ContextCondenser` ๊ฒฝ๋กœ ๊ทœ์น™ ์—ฐ๋™. `PathScopedRuleInjector`๋กœ ์ž‘์—… ํด๋”์— ๋”ฐ๋ฅธ ๊ทœ์น™ ์ž๋™ ์ฃผ์ž…. `@include` ์ง€์‹œ๋ฌธ ์ฒ˜๋ฆฌ | | **๊ถŒํ•œ ์‹œ์Šคํ…œ ๊ณ ๋„ํ™” (Phase 17-F)** | `PermissionSystem` Chain of Responsibility ํŒจํ„ด. Allow/Deny ๊ทœ์น™ ์„ค์ • UI ์—ฐ๋™. acceptEdits ๋ชจ๋“œ์—์„œ ํŒŒ์ผ ํŽธ์ง‘ ๋„๊ตฌ ์ž๋™ ์Šน์ธ | | **๋ฉ€ํ‹ฐํŒŒ์ผ Diff + ์ž๋™ ์ปจํ…์ŠคํŠธ (Phase 17-G)** | `MultiFileDiffViewModel`: ํŒŒ์ผ๋ณ„ diff ์ถ”์  + ์ผ๊ด„ ์ˆ˜๋ฝ. `AutoContextCollector`: `@ํŒŒ์ผ๋ช…` ๋ฉ˜์…˜ ์ •๊ทœ์‹ ํŒŒ์‹ฑ + ์ž๋™ ํŒŒ์ผ ๋‚ด์šฉ ์ฃผ์ž…. `ToolRiskMapper`: ๋„๊ตฌ๋ณ„ Low/Medium/High ์œ„ํ—˜๋„ ๋ถ„๋ฅ˜ | | **๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒ€ (Phase 18-A)** | `DelegateAgentTool` + `BackgroundAgentService` + `WorktreeManager`. `AgentLoopService`์— `RunSubAgentAsync` ์œ„์ž„ ์—ฐ๊ฒฐ. ToolRegistry์— ์ž๋™ ๋“ฑ๋ก | | **์—์ด์ „ํŠธ ๋ฆฌํ”Œ๋ ˆ์ด (Phase 18-B)** | `AgentReplayService`: JSONL ์ด๋ฒคํŠธ ๋กœ๊ทธ ํŒŒ์ผ ์—ด๊ฑฐ + ๋‹จ๊ณ„๋ณ„ ์žฌ์ƒ. `ReplayTimelineViewModel`: ์žฌ์ƒ UI ๋ฐ”์ธ๋”ฉ ViewModel | | **ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์„œ๋น„์Šค (Phase 18-C)** | `PluginInstallService`: ๋กœ์ปฌ zip ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์„ค์น˜ (URL ๋‹ค์šด๋กœ๋“œ ์—†์Œ). `PluginManifest` / `InstalledPlugin` / `PluginInstallResult` ๋ ˆ์ฝ”๋“œ. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ JSONL ์˜์†ํ™” | | **์‚ฌ๋‚ด/์‚ฌ์™ธ ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ** | `AppSettings.InternalModeEnabled` (๊ธฐ๋ณธ: ์‚ฌ๋‚ด ๋ชจ๋“œ). ์‚ฌ์™ธ ์ „ํ™˜ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ `axgo123!` ์ธ์ฆ ํ•„์š”. `WebSearchHandler` + `HttpTool` ์—์„œ ๋ชจ๋“œ ์ฒดํฌ ์ ์šฉ | | **์•Œ๋ฆผ ์„ผํ„ฐ (L3-7)** | `NotificationCenterService`: ์•Œ๋ฆผ ํƒ€์ž…(Info/Success/Warning/Error) + ํžˆ์Šคํ† ๋ฆฌ ํ(์ตœ๋Œ€ 50๊ฑด). `NotificationRaised` ์ด๋ฒคํŠธ๋กœ UI ๊ตฌ๋… ์ง€์›. ๊ธฐ์กด `NotificationService` ํŠธ๋ ˆ์ด BalloonTip ์œ„์ž„ | | **ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐค๋Ÿฌ๋ฆฌ ViewModel (L3-1)** | `PluginGalleryViewModel`: ์„ค์น˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชฉ๋ก + ์„ค์น˜/์ œ๊ฑฐ/ํ™œ์„ฑํ™” ์ปค๋งจ๋“œ ๋ฐ”์ธ๋”ฉ. `PluginItemViewModel` ๋ž˜ํผ | | **ํŒŒ๋ผ๋ฏธํ„ฐ ํ€ต๋งํฌ (L3-4)** | `QuickLinkHandler` (`ql` ํ”„๋ฆฌํ”ฝ์Šค) + `UrlTemplateEngine`. `{0}`, `{query}` ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์น˜ํ™˜. ์„ค์ •์—์„œ `QuickLinkEntry` ๋ชฉ๋ก ๊ด€๋ฆฌ | | **AI ์Šค๋‹ˆํŽซ (L3-3)** | `AiSnippetHandler` (`ai` ํ”„๋ฆฌํ”ฝ์Šค) + `SnippetTemplateService`. ์—…๋ฌด ์ด๋ฉ”์ผ/์š”์•ฝ/๋ฒˆ์—ญ/์ฝ”๋“œ๋ฆฌ๋ทฐ/์ปค๋ฐ‹ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ 5์ข… ๋‚ด์žฅ. LLM ํ˜ธ์ถœ ํ›„ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ. AI ๋น„ํ™œ์„ฑํ™” ์‹œ ํ•ญ๋ชฉ ๋ฏธํ‘œ์‹œ | | **์›น ๊ฒ€์ƒ‰ AI ์š”์•ฝ (L3-2)** | `WebSearchSummaryHandler` (`?!` ํ”„๋ฆฌํ”ฝ์Šค) + `ContentExtractor`. URL ๋˜๋Š” ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์‹œ AI๊ฐ€ ์š”์•ฝ ์ƒ์„ฑ ํ›„ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ. ์‚ฌ์™ธ ๋ชจ๋“œ + AI ํ™œ์„ฑํ™” ์ƒํƒœ์—์„œ๋งŒ ๋™์ž‘ | ### v0.7.3 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: AX Agent ๊ถŒํ•œ ์ฝ”์–ด ์žฌ๊ตฌ์„ฑ + slash ์ž…๋ ฅ ๊ณ„์ธต ๋ถ„๋ฆฌ + ์„ค์ •/์ƒํƒœ ํ‘œํ˜„ ์ •๋ฆฌ ์—…๋ฐ์ดํŠธ: 2026-04-04 10:49 (KST) | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๊ถŒํ•œ ๋ชจ๋“œ ์ •๊ทœํ™”** | `Default`, `AcceptEdits`, `Plan`, `BypassPermissions`, `DontAsk`, `Deny`๋ฅผ ์ •์‹ ๊ถŒํ•œ ๋ชจ๋“œ๋กœ ๋„์ž…ํ•˜๊ณ , ๊ธฐ์กด `Ask`, `Auto`๋Š” ํ˜ธํ™˜ alias๋กœ ์œ ์ง€ | | **๊ถŒํ•œ ํŒ์ • ์ฒด์ธ ์žฌ๊ตฌ์„ฑ** | ๊ถŒํ•œ ํ•ด์„ ์ˆœ์„œ๋ฅผ `deny ํŒจํ„ด ๊ทœ์น™ โ†’ allow/override ๊ทœ์น™ โ†’ ๊ธ€๋กœ๋ฒŒ ๋ชจ๋“œ โ†’ ๊ธฐ๋ณธ Ask` ์ˆœ์„œ๋กœ ์žฌ์ •๋ฆฌํ•˜์—ฌ `claude-code` ์ˆ˜์ค€์˜ ์ •์ฑ… ํ•ด์„ ํ๋ฆ„์— ๋งž์ถค | | **๋„๊ตฌ ๊ถŒํ•œ ํด๋ž˜์Šค ๋ถ„๋ฆฌ** | `file_write/file_edit/file_manage`์™€ `process/build_run/test_loop/snippet_runner/spawn_agent`๋ฅผ ๋ณ„๋„ ๊ถŒํ•œ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•ด `AcceptEdits`๋Š” ํŒŒ์ผ ํŽธ์ง‘ ์ž๋™ ํ—ˆ์šฉ, `Plan`์€ ์“ฐ๊ธฐ ์ฐจ๋‹จ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋ณด๊ฐ• | | **AX Agent ๊ถŒํ•œ UI ๋ฐ˜์˜** | ๊ถŒํ•œ ํŒ์—…, ์ƒ๋‹จ ๋ฐฐ๋„ˆ, slash ๋ช…๋ น ์‘๋‹ต, ์ƒํƒœ ์š”์•ฝ์— ์ƒˆ ๊ถŒํ•œ ๋ช…์นญ๊ณผ ์„ค๋ช…์„ ๋ฐ˜์˜ํ•˜๊ณ , ๋„๊ตฌ๋ณ„ override ์š”์•ฝ์ด ํ˜„์žฌ ๋ชจ๋“œ์™€ ํ•จ๊ป˜ ๋ณด์ด๋„๋ก ์ •๋ฆฌ | | **AX Agent ์„ค์ •์ฐฝ ๋ฌธ์ž์—ด ๋ณต๊ตฌ** | `AgentSettingsWindow`๋ฅผ ์ „๋ฉด ์ •๋ฆฌํ•ด ๊นจ์ง„ ํ•œ๊ธ€ ๋ฌธ์ž์—ด์„ ๋ณต๊ตฌํ•˜๊ณ , ์šด์˜ ๋ชจ๋“œ/๊ณ„ํš ๋ชจ๋“œ/์ถ”๋ก  ๊ฐ•๋„/ํด๋” ๋ฐ์ดํ„ฐ ํ™œ์šฉ์„ ํ˜„์žฌ AX ์šฉ์–ด๋กœ ํ‘œ์‹œํ•˜๋„๋ก ์ˆ˜์ • | | **๊ถŒํ•œ ์šฉ์–ด ๋ฐ ์ƒํƒœ ํ‘œํ˜„ ํ†ต์ผ** | `Plan`, `Bypass`, `DontAsk`์ฒ˜๋Ÿผ ์˜๋ฌธ์œผ๋กœ ๋‚จ์•„ ์žˆ๋˜ ๊ถŒํ•œ ํ‘œํ˜„์„ `๊ณ„ํš ์ค‘์‹ฌ`, `์™„์ „ ์ž๋™`, `์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰`์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ์ธ๋ผ์ธ ์„ค์ • ํŒจ๋„ ๋ฌธ๊ตฌ๋„ ํ•จ๊ป˜ ํ†ต์ผ | | **๊ถŒํ•œ UIยท์‹คํ–‰ ๋กœ์ง ๊ฒฐํ•ฉ ์ •๋ฆฌ** | ๊ถŒํ•œ ํŒ์—…์„ `๊ถŒํ•œ ์š”์ฒญ/ํŽธ์ง‘ ์ž๋™ ์Šน์ธ/๊ณ„ํš ๋ชจ๋“œ/๊ถŒํ•œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ` ์ค‘์‹ฌ ๋ฆฌ์ŠคํŠธ๋กœ ์žฌ๊ตฌ์„ฑํ•˜๊ณ , `BtnPermissionMode` ๋ฐ ์ธ๋ผ์ธ `NextPermission` ์ˆœํ™˜ ๋กœ์ง๋„ ๊ฐ™์€ 4๋‹จ๊ณ„ ์ถ•์œผ๋กœ ๋‹จ์ˆœํ™” | | **์Šฌ๋ž˜์‹œ ํŒ”๋ ˆํŠธ UI ์ •๋ฆฌ** | `/` ์ž…๋ ฅ ์‹œ ์ฒซ ํ•ญ๋ชฉ์„ ๊ธฐ๋ณธ ์„ ํƒํ•˜๋„๋ก ์กฐ์ •ํ•˜๊ณ , ํ•ญ๋ชฉ ์šฐ์ธก ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒ„ํŠผ/์œ ํ˜• ๋ฐฐ์ง€๋ฅผ ์ œ๊ฑฐํ•ด `์•„์ด์ฝ˜+๋ช…๋ น+์„ค๋ช…` ์ค‘์‹ฌ์˜ ๋‹จ์ˆœ ๋ฆฌ์ŠคํŠธ ํƒ์ƒ‰ ๊ตฌ์กฐ๋กœ ์ •๋ฆฌ | | **ํ•˜๋‹จ ์ปดํฌ์ € ํŒจ๋„ ๋‹จ์ˆœํ™”** | ์ธ๋ผ์ธ ์„ค์ • ๋น ๋ฅธ ๋ฒ„ํŠผ์„ `Fast/์ถ”๋ก /๊ณ„ํš/๊ถŒํ•œ` ์ค‘์‹ฌ์œผ๋กœ ์ค„์ด๊ณ  ๋ถ€๊ฐ€ ๋ฒ„ํŠผ(์Šคํ‚ฌ/๋ช…๋ น ๋ธŒ๋ผ์šฐ์ €/MCP)์„ ์ˆจ๊ฒจ ์ž…๋ ฅ ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ์ •๋ฆฌ | | **๋ชจ๋ธ/ํ”„๋ฆฌ์…‹ ์ƒ๋‹จ ๋ฐ” ์ปดํŒฉํŠธํ™”** | ์ž…๋ ฅ์ฐฝ ์ƒ๋‹จ ๋ชจ๋ธ/ํ”„๋ฆฌ์…‹ ๋ฒ„ํŠผ์˜ ๋†’์ด์™€ ํŒจ๋”ฉ์„ ์ค„์ด๊ณ , ๋ชจ๋ธ๋ช…์ด ๊ธธ ๋•Œ ์ž๋™ ๋ง์ค„์ž„(`โ€ฆ`) ์ฒ˜๋ฆฌํ•ด ์ž…๋ ฅ์ฐฝ ํญ์ด ์ข์•„๋„ ์ƒ๋‹จ ๋ฐ”๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก ๋ณด๊ฐ• | | **์ขŒ์ธก ์‚ฌ์ด๋“œ๋ฐ” ๋ฐ€๋„ ์ •๋ฆฌ** | ์‚ฌ์ด๋“œ๋ฐ” ํ—ค๋”/๊ฒ€์ƒ‰/๋ฉ”๋‰ด/๋Œ€ํ™” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ„๊ฒฉ๊ณผ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ์žฌ์กฐ์ •ํ•˜๊ณ , ๋Œ€ํ™” ์นด๋“œ์˜ ์ œ๋ชฉ/์‹œ๊ฐ„/์ƒํƒœ ๋ฐฐ์ง€ ํฌ๊ธฐ๋ฅผ ๋‚ฎ์ถฐ `claw-code`ํ˜• ์ปดํŒฉํŠธ ๋ฐ€๋„์— ๋งž์ถค | | **๋ฉ”์‹œ์ง€ ๋ฒ„๋ธ” ๋ ˆ์ด์•„์›ƒ ์ •๋ฆฌ** | ์‚ฌ์šฉ์ž/์–ด์‹œ์Šคํ„ดํŠธ ๋ฒ„๋ธ”์˜ ํŒจ๋”ฉยทํฐํŠธยทํƒ€์ž„์Šคํƒฌํ”„ ํฌ๊ธฐ์™€ ์ขŒ์šฐ ๋งˆ์ง„์„ ์กฐ์ •ํ•ด ๋Œ€ํ™” ์˜์—ญ์„ ๋” ์ด˜์ด˜ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , ์•ก์…˜ ๋ฒ„ํŠผ ํฌ๊ธฐ๋„ ์ค„์—ฌ ์‹œ๊ฐ์  ์žก์Œ์„ ์™„ํ™” | | **์—์ด์ „ํŠธ ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ ํ‘œ์‹œ๋ฐฉ์‹ ์ •๋ฆฌ** | ์‹คํ–‰ ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ์˜ ์นด๋“œ ๋ฐ€๋„(ํŒจ๋”ฉ/๋งˆ์ง„/ํฐํŠธ)๋ฅผ ์ค„์ด๊ณ , ToolCall/ToolResult ๊ธด ์š”์•ฝ์€ ์ž๋™ ์ ˆ๋‹จํ•ด ํŽผ์นจ ํ† ๊ธ€ ์—†์ด ์ฝํžˆ๋„๋ก ์ •๋ฆฌ. ๊ถŒํ•œ/๊ณ„ํš/๊ฒฐ์ • ๋ฐฐ์ง€ ๋ผ๋ฒจ๋„ ํ•œ๊ตญ์–ด๋กœ ํ†ต์ผ | | **๋„๊ตฌ ๊ฒฐ๊ณผ ์นด๋“œ ์‹œ๊ฐ ๋‹จ์ˆœํ™”** | ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐฐ๋„ˆ๋ฅผ ํŒŒ์ผ๋ช… ์ค‘์‹ฌ 2๋‹จ ํ‘œ๊ธฐ(ํŒŒ์ผ๋ช…/๋””๋ ‰ํ„ฐ๋ฆฌ)๋กœ ๋ฐ”๊พธ๊ณ , ๋น ๋ฅธ ์ž‘์—… ๋ฒ„ํŠผ์„ ํ…์ŠคํŠธ ๋ผ๋ฒจ ๋Œ€์‹  ์•„์ด์ฝ˜ ์ „์šฉ์œผ๋กœ ์ถ•์†Œํ•ด ์ด๋ฒคํŠธ ์นด๋“œ ๋ณธ๋ฌธ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„  | | **Slash palette ์ƒํƒœ ๋ถ„๋ฆฌ ์‹œ์ž‘** | `ChatWindow` ๋‚ด๋ถ€์— ํผ์ ธ ์žˆ๋˜ slash ์„ ํƒ ์ƒํƒœ๋ฅผ `SlashPaletteState`๋กœ ๋ถ„๋ฆฌํ•ด ์ดํ›„ Codex/Claudeํ˜• composer ๊ฐœํŽธ์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จ | | **์„ค์ •/์ƒํƒœ ์—ฐ๋™** | `AppSettings`, `AppStateService`, `AgentSettingsWindow`, `ChatWindow`๊ฐ€ ๋™์ผ ๊ถŒํ•œ ์ฒด๊ณ„๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์ •๋ฆฌํ•˜๊ณ  ๋Œ€ํ™”๋ณ„ ๊ถŒํ•œ ์ƒํƒœ ์ €์žฅ ํ๋ฆ„์„ ์œ ์ง€ | | **๋Ÿฐ์ฒ˜ ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฐฝ (Phase L2-3)** | `ClipboardImagePreviewWindow` ์‹ ๊ทœ ์ถ”๊ฐ€. ์›๋ณธ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€ ํ‘œ์‹œ, `Ctrl+ํœ `/`+`/`-`/`0`/`F`/`Esc` ๋‹จ์ถ•ํ‚ค, PNGยทJPEGยทBMP ์ €์žฅ, ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ, `#` ์ด๋ฏธ์ง€ ํ•ญ๋ชฉ `Shift+Enter` ์—ฐ๊ฒฐ, ๋‹จ์ถ•ํ‚ค ๋„์›€๋ง ๊ฐฑ์‹  | | **๊ฒ€์ฆ** | `dotnet build` ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0, `dotnet test` 436 passed / 0 failed ํ™•์ธ | ### v0.7.2 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ์•ˆ์ •ํ™” ๋ฆด๋ฆฌ์ฆˆ โ€” ๋Ÿฐ์ฒ˜ ์†๋„, ์—์ด์ „ํŠธ ์ปจํ…์ŠคํŠธ ์••์ถ•, ๋Œ€ํ™” ๋ณต์›, ๋ฒ„๊ทธ ์ˆ˜์ • 11๊ฑด | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์ปจํ…์ŠคํŠธ ์••์ถ• (Context Condenser)** | 2๋‹จ๊ณ„ ์ž๋™ ์••์ถ• ๊ตฌํ˜„. 1๋‹จ๊ณ„: ์˜ค๋ž˜๋œ ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ LLM ํ˜ธ์ถœ ์—†์ด 1500์ž๋กœ ์ถ•์•ฝ. 2๋‹จ๊ณ„: ์ด์ „ ๋Œ€ํ™”๋ฅผ LLM์œผ๋กœ ์š”์•ฝํ•˜์—ฌ ๊ต์ฒด. ๋ชจ๋ธ๋ณ„ ํ† ํฐ ํ•œ๋„ ์ž๋™ ์ธ์‹ (Claude 180K, Gemini 900K, GPT-4 120K, Ollama 16K). 65% ์ž„๊ณ„๊ฐ’์—์„œ ์••์ถ• ์‹œ์ž‘ | | **๋Œ€ํ™” ์ด๋ ฅ ๋ณต์›** | ์•ฑ ์žฌ์‹œ์ž‘ ์‹œ ํƒญ๋ณ„ ๋งˆ์ง€๋ง‰ ๋Œ€ํ™”๋ฅผ ์ž๋™ ๋ณต์›. `LastConversationIds` ์„ค์ •์— ํƒญโ†”๋Œ€ํ™” ID ๋งคํ•‘ ์ €์žฅ. ์ข…๋ฃŒยทํƒญ ์ „ํ™˜ ์‹œ ์ž๋™ ์˜์†ํ™” | | **๋Ÿฐ์ฒ˜ ์†๋„ ๊ฐœ์„ ** | ํ•ซํ‚ค ์‘๋‹ต ~230ms ์ ˆ๊ฐ. `Thread.Sleep` ๋‹จ์ถ• (200โ†’110ms), ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™” (fade 160โ†’100ms, slide 200โ†’120ms). ํ…์ŠคํŠธ ๋ฏธ์‚ฌ์šฉ ์‹œ ์ฆ‰์‹œ ๋Ÿฐ์ฒ˜ ํ‘œ์‹œ | | **๊ฒ€์ฆ ๋ฆฌํŒฉํ„ฐ๋ง** | ๋„๊ตฌ ์‹คํ–‰ ํ›„ ๊ฒ€์ฆ์„ ์ฝ๊ธฐ ์ „์šฉ(`file_read`, `directory_list`)์œผ๋กœ ์ œํ•œ. ๊ฒ€์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋งŒ ํ•˜๊ณ  ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ โ€” ๋ฌธ์„œ ํ’ˆ์งˆ ์ €ํ•˜ ๋ฐฉ์ง€ | | **์„ค์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ˆ˜์ •** | ๊ฐœ๋ฐœ์ž ๋ชจ๋“œยท์Šคํ…๋ฐ”์ด์Šคํ… ํ† ๊ธ€์ด ์„ค์ • ์ฐฝ ์—ด ๋•Œ๋งˆ๋‹ค ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์ž…๋ ฅ์„ ์š”๊ตฌํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ •. `IsLoaded` ๊ฐ€๋“œ ์ถ”๊ฐ€ | | **๊ณ„ํš ๋ฒ„ํŠผ ๋™๊ธฐํ™”** | PlanViewerWindow์—์„œ ์Šน์ธ ํ›„ ๋Œ€ํ™”์ฐฝ ์ธ๋ผ์ธ ์Šน์ธ/์ทจ์†Œ ๋ฒ„ํŠผ์ด ์ž๋™ ์ถ•์†Œ๋˜์ง€ ์•Š๋˜ ๋ฌธ์ œ ์ˆ˜์ •. `TCS.ContinueWith` ์ฝœ๋ฐฑ ์ถ”๊ฐ€ | | **์•ผ๊ฐ„ ์‹œ๊ฐ„ ์ˆ˜์ •** | PC ๋ฏธ์ข…๋ฃŒ ์ƒํƒœ์—์„œ ์ž์ • ๋„˜๊ธธ ๋•Œ ๊ทผ๋ฌด ์‹œ๊ฐ„์ด ์ „๋‚ ๋ถ€ํ„ฐ ๋ˆ„์ ๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ •. `_sessionStart`๋ฅผ ์ž์ •(DateTime.Today)์œผ๋กœ ๋ฆฌ์…‹ | | **ํด๋ฆฝ๋ณด๋“œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์ˆ˜์ •** | ์ด์ „ ํ™œ์„ฑ ์ฐฝ์— `SetForegroundWindow` ํ˜ธ์ถœ ํ›„ `Ctrl+V` ์ „์†กํ•˜๋„๋ก ๋ณ€๊ฒฝ โ€” ๋Ÿฐ์ฒ˜๊ฐ€ ํฌ์ปค์Šค๋ฅผ ๋บ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ | | **ํ™œ์„ฑ ์ฐฝ ์บก์ฒ˜ ์ˆ˜์ •** | ๋Ÿฐ์ฒ˜๊ฐ€ ์™„์ „ํžˆ ์ˆจ๊ฒจ์งˆ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ + ๋Œ€์ƒ ์ฐฝ์— `SetForegroundWindow` ํ˜ธ์ถœ โ€” ๋Ÿฐ์ฒ˜ ์ž์ฒด๊ฐ€ ์บก์ฒ˜๋˜๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ | | **์Šคํฌ๋กค ์บก์ฒ˜ ์ˆ˜์ •** | `FindOverlap` ๋‹ค์ค‘ ํ–‰ ๋น„๊ต๋กœ ์˜ค๋ฒ„๋žฉ ๊ฐ์ง€ ์ •ํ™•๋„ ํ–ฅ์ƒ. `StitchFrames`๋ฅผ ์ฆ๋ถ„ ์Šคํ‹ฐ์นญ์œผ๋กœ ๋ณ€๊ฒฝ โ€” ์ „์ฒด ํ”„๋ ˆ์ž„ ์ค‘๋ณต ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฌธ์ œ ํ•ด๊ฒฐ | | **๋Ÿฐ์ฒ˜ ์ž”์—ฌ ๊ฒฐ๊ณผ ์ œ๊ฑฐ** | `OnShown()`์—์„œ `Results.Clear()` ํ˜ธ์ถœ ์ถ”๊ฐ€ โ€” ๋Ÿฐ์ฒ˜ ์žฌํ‘œ์‹œ ์‹œ ์ด์ „ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ณด์ด๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ | | **AI ๋ชจ๋ธ ํ˜ธํ™˜์„ฑ ๊ฐ€์ด๋“œ** | ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ์— ๋„๊ตฌ ์‚ฌ์šฉ(Function Calling) ์ง€์› ๋ชจ๋ธ ํ‘œ ์ถ”๊ฐ€. ํด๋ผ์šฐ๋“œ(Claude/Gemini) + Ollama ๋กœ์ปฌ ๋ชจ๋ธ 15์ข… ํ˜ธํ™˜์„ฑ ๋ช…์‹œ. ์‚ฌ๋‚ด ํ™˜๊ฒฝ ์ถ”์ฒœ ์กฐํ•ฉ ํฌํ•จ | ### v0.7.1 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ์—์ด์ „ํŠธ ๋ฃจํ”„ ๊ฒ€์ฆ ๊ฐ•์ œ + UI ๊ฐœ์„  + ๋„๊ตฌ ์Šคํ‚ค๋งˆ ์ˆ˜์ • | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๋„๊ตฌ ์‹คํ–‰ ํ›„ ๊ฒ€์ฆ ๊ฐ•์ œ (Post-Tool Verification)** | ๋ฌธ์„œ ์ƒ์„ฑ ๋„๊ตฌ(`file_write`, `docx_create`, `html_create`, `excel_create` ๋“ฑ) ์‹คํ–‰ ํ›„ LLM์— ๊ฒ€์ฆ ์ „์šฉ ํ˜ธ์ถœ์„ ์ž๋™ ์‚ฝ์ž…. ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ `file_read`๋กœ ์ฝ๊ณ  ๋‚ด์šฉ ์™„์ „์„ฑยท๊ตฌ์กฐยท๋งž์ถค๋ฒ•์„ ํ™•์ธํ•˜๋„๋ก ๊ฐ•์ œ. ๋ฌธ์ œ ๋ฐœ๊ฒฌ ์‹œ ์ฆ‰์‹œ ์ˆ˜์ • ๋„๊ตฌ ํ˜ธ์ถœ. OpenHands ๋“ฑ ์˜คํ”ˆ์†Œ์Šค์—๋Š” ์—†๋Š” ์ฐจ๋ณ„ํ™” ๊ธฐ๋Šฅ. `EnablePostToolVerification` ์„ค์ • ํ† ๊ธ€ (๊ธฐ๋ณธ OFF) | | **Gemini ๋ฐฐ์—ด ์Šคํ‚ค๋งˆ ์ˆ˜์ •** | `MultiReadTool.paths`์™€ `UserAskTool.options`์— `Items` ํ•„๋“œ ์ถ”๊ฐ€. Gemini API๊ฐ€ array ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— items ํ•„๋“œ๋ฅผ ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ | | **์›Œํฌํ”Œ๋กœ์šฐ ๋ถ„์„๊ธฐ UI ๊ฐœ์„ ** | ํƒ€์ดํ‹€๋ฐ” ์ „์ฒด ์˜์—ญ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ (`Background="Transparent"` ์ถ”๊ฐ€), ํ™œ์„ฑ ํƒญ ํ…์ŠคํŠธ White ๊ฐ•์กฐ, ์ƒํƒœ ํ…์ŠคํŠธ `TextTrimming` + `MaxWidth` ์ ์šฉ | | **ํ”Œ๋žœ ๋ทฐ์–ด ๋ฒ„ํŠผ ๊ฐ€์‹œ์„ฑ** | ์•„์›ƒ๋ผ์ธ ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ `0x18` ํ‹ดํŠธ + ํ…Œ๋‘๋ฆฌ `0x80` ๋ถˆํˆฌ๋ช…๋„ + `1.2px` ๋‘๊ป˜๋กœ ๊ฐ€์‹œ์„ฑ ๊ฐœ์„  | | **์›Œํ„ฐ๋งˆํฌ ์Šฌ๋ž˜์‹œ ์นฉ ์ถฉ๋Œ ์ˆ˜์ •** | ์Šฌ๋ž˜์‹œ ์นฉ ํ™œ์„ฑ ์‹œ `InputWatermark` ์ฆ‰์‹œ ์ˆจ๊น€ ์ฒ˜๋ฆฌ | | **ํ”ผ๋“œ๋ฐฑ ํ•™์Šต ์ปจํ…์ŠคํŠธ** | `BuildFeedbackContext()`๋ฅผ Cowork/Code ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž…. ์ตœ๊ทผ 20๊ฑด ๋Œ€ํ™”์˜ ์ข‹์•„์š”/์‹ซ์–ด์š” ํŒจํ„ด ๋ถ„์„ | | **์ˆ˜์ • ํ›„ ์žฌ์‹œ๋„ ๋ฒ„ํŠผ** | ๋‘ ๋ฒˆ์งธ ์•ก์…˜๋ฐ”์— ์žฌ์‹œ๋„ ๋ฒ„ํŠผ ์ถ”๊ฐ€ (์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ž…๋ ฅ ํ›„ ์žฌ์ƒ์„ฑ) | | **์„ค์ • ์ถ”๊ฐ€** | `EnablePostToolVerification`(bool, ๊ธฐ๋ณธ false) โ€” ๋ฌธ์„œ ์ƒ์„ฑ ํ›„ ๊ฒ€์ฆ LLM ํ˜ธ์ถœ ๊ฐ•์ œ | ### v0.7.0 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase 16 โ€” ์—์ด์ „ํŠธ ์ง€๋Šฅ ๊ฐ•ํ™” + ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜ | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **ํ”Œ๋žœ ๋ชจ๋“œ (Plan Mode)** | ์—์ด์ „ํŠธ ๋„๊ตฌ ์‹คํ–‰ ์ „ ๊ตฌ์กฐํ™”๋œ ๊ณ„ํš ์ƒ์„ฑโ†’์‚ฌ์šฉ์ž ๊ฒ€ํ† /์Šน์ธโ†’์‹คํ–‰ ํ๋ฆ„. `PlanMode` 3๋ชจ๋“œ(off/always/auto). always=LLM ํ…์ŠคํŠธ ์ „์šฉ ๊ณ„ํš ์ƒ์„ฑ(์ตœ๋Œ€ 3ํšŒ ์ˆ˜์ • ์š”์ฒญ), auto=๊ณ„ํš ๊ฐ์ง€ ์‹œ ์Šน์ธ ์š”์ฒญ | | **๋„๊ตฌ/์ปค๋„ฅํ„ฐ ๊ด€๋ฆฌ UI** | ์„ค์ • โ€บ AX Agent โ€บ ๋„๊ตฌ ํƒญ ์‹ ์„ค. 52๊ฐœ ์—์ด์ „ํŠธ ๋„๊ตฌ๋ฅผ 6๊ฐœ ์นดํ…Œ๊ณ ๋ฆฌ(ํŒŒ์ผ/๊ฒ€์ƒ‰, ๋ฌธ์„œ ์ƒ์„ฑ, ๋ฌธ์„œ ํ’ˆ์งˆ, ์ฝ”๋“œ/๊ฐœ๋ฐœ, ๋ฐ์ดํ„ฐ/์œ ํ‹ธ, ์‹œ์Šคํ…œ)๋ณ„ ์นด๋“œ ํ‘œ์‹œ. ๊ฐœ๋ณ„ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ํ† ๊ธ€ + MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ƒํƒœ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ. `DisabledTools` ์„ค์ •์œผ๋กœ ์˜์† | | **ํ”„๋กœ์ ํŠธ ๊ทœ์น™ ์‹œ์Šคํ…œ** | `.ax/rules/*.md` YAML ํ”„๋ก ํŠธ๋งคํ„ฐ(name, description, applies-to, when) ํŒŒ์‹ฑ. glob ํŒจํ„ด ๋งค์นญ, when ์กฐ๊ฑด ํ•„ํ„ฐ๋ง. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— "ํ”„๋กœ์ ํŠธ ๊ทœ์น™" ์„น์…˜ ์ž๋™ ์ฃผ์ž…. ProjectRuleTool์— list_rules/read_rule ์•ก์…˜ ์ถ”๊ฐ€. `EnableProjectRules` ํ† ๊ธ€ | | **๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ-์ˆ˜์ • ๋ฃจํ”„** | TestLoopTool `auto_fix` ์•ก์…˜ โ€” ํ…Œ์ŠคํŠธ ์‹คํ–‰โ†’๊ตฌ์กฐํ™”๋œ ์‹คํŒจ ํŒŒ์‹ฑ(.NET Failed/pytest FAILED, ํŒŒ์ผ ๊ฒฝ๋กœยท๋ผ์ธ ๋ฒˆํ˜ธ ์ถ”์ถœ)โ†’`[AUTO_FIX:]` ๋งˆ์ปค ์ถœ๋ ฅ. AgentLoopService์—์„œ test_loop+AUTO_FIX ๊ฐ์ง€ ์‹œ ๋ฐ˜๋ณต ์˜ˆ์‚ฐ ์ž๋™ ํ™•์žฅ. `MaxTestFixIterations` ์„ค์ • | | **๋ณ‘๋ ฌ ๋„๊ตฌ ์‹คํ–‰** | ์ฝ๊ธฐ ์ „์šฉ ๋„๊ตฌ(file_read, grep_tool, glob ๋“ฑ 12์ข… ReadOnlyTools ์…‹) ์ž๋™ ๋ถ„๋ฅ˜ โ†’ `Task.WhenAll()` ๋ณ‘๋ ฌ ์‹คํ–‰, ์“ฐ๊ธฐ ๋„๊ตฌ๋Š” ์ˆœ์ฐจ ์œ ์ง€. ParallelState ํด๋ž˜์Šค๋กœ async ref ์ œ์•ฝ ํ•ด๊ฒฐ. `EnableParallelTools` ํ† ๊ธ€ | | **SKILL.md ํ‘œ์ค€ ํ˜ธํ™˜** | ์™ธ๋ถ€โ†”๋‚ด๋ถ€ ๋„๊ตฌ ์ด๋ฆ„ ๋งคํ•‘ ํ…Œ์ด๋ธ” 20๊ฐœ(Bashโ†’process, Readโ†’file_read, Grepโ†’grep_tool, execute_commandโ†’process ๋“ฑ). ParseSkillFile์—์„œ ์Šคํ‚ฌ ๋ณธ๋ฌธ ๋กœ๋“œ ์‹œ ์ž๋™ ์น˜ํ™˜ | | **์‚ฌ๋‚ด ๋ณด์•ˆ ์˜ˆ์™ธ** | AntiTamper ๋ณด์•ˆ ๊ฐ์ง€์— ์‚ฌ๋‚ด IP ๋Œ€์—ญ(11.99/11.90/12.25/12.23/12.24) ์˜ˆ์™ธ ์ฒ˜๋ฆฌ. IsTrustedNetwork()๋กœ IPv4 ํ”„๋ฆฌํ”ฝ์Šค ๋งค์นญ | | **์„ค์ • ์ถ”๊ฐ€** | `PlanMode`(off/always/auto), `EnableProjectRules`(bool), `MaxTestFixIterations`(int), `EnableParallelTools`(bool), `DisabledTools`(List\) | ### v0.6.1 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ์„ค์ • UI ๊ฐœ์„  + ํ—ฌํ”„ IP ๋ณดํ˜ธ + ๋ชจ๋ธ ์„ ํƒ ๋ฒ„๊ทธ ์ˆ˜์ • + ์ฐจ์„ธ๋Œ€ ๊ณ ๋„ํ™” ๊ณ„ํš ์ˆ˜๋ฆฝ | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๊ณ ํ’ˆ์งˆ ๋ฌธ์„œ ์ƒ์„ฑ ์„ค์ •** | ์„ค์ • โ€บ ์—์ด์ „ํŠธ โ€บ ์ฝ”์›Œํฌ์— "๊ณ ํ’ˆ์งˆ ๋ฌธ์„œ ์ƒ์„ฑ" ToggleSwitch ์ถ”๊ฐ€. ๋ฉ€ํ‹ฐํŒจ์Šค ๋ฌธ์„œ ์—”์ง„ ๊ธฐ๋ณธ๊ฐ’ OFF (๋ฌด๋ฃŒ API ํ™˜๊ฒฝ ํ˜ธํ™˜์„ฑ). ๋น„ํ™œ์„ฑ ์‹œ `document_plan`/`document_assemble` ๋„๊ตฌ ์ฐจ๋‹จ | | **ํ—ฌํ”„ ํ™”๋ฉด IP ๋ณดํ˜ธ** | ๋ฒ„์ „๋ณ„ ์‹ ๊ธฐ๋Šฅ ํ•ญ๋ชฉ ์‚ญ์ œ, ์˜์—ญ๋ณ„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘์‹ฌ ์žฌ๊ตฌ์„ฑ. ๋‚ด๋ถ€ ๊ธฐ์ˆ  ์šฉ์–ด(SSE, AES-256-GCM, DPAPI, OpenXML ๋“ฑ) ๋…ธ์ถœ ์ œ๊ฑฐ. CLAUDE.md์— ํ—ฌํ”„ IP ๋ณดํ˜ธ ๊ทœ์น™ ์ถ”๊ฐ€ | | **๋ชจ๋ธ ์„ ํƒ ํŒ์—… ๋ฒ„๊ทธ ์ˆ˜์ •** | ์„œ๋น„์Šค๋งŒ ๋ณ€๊ฒฝ ํ›„ ๋ชจ๋ธ ๋ฏธ์„ ํƒ ์‹œ ํŒ์—… ๋‹ซ์œผ๋ฉด ์ด์ „ ์„œ๋น„์Šค/๋ชจ๋ธ๋กœ ๋กค๋ฐฑ. ๋ชจ๋ธ ํ™•์ •(`Save`) ์‹œ์—๋งŒ ๋ณ€๊ฒฝ ๋ฐ˜์˜ | | **ESC ํ‚ค ๋‹ซ๊ธฐ ํ™•์žฅ** | AboutWindow(๊ฐœ๋ฐœ ์ •๋ณด) ESC ํ‚ค ๋‹ซ๊ธฐ ์ถ”๊ฐ€ | | **๊ฐ€์ด๋“œ ๋ฒ„์ „ ํ‘œ๊ธฐ ์ œ๊ฑฐ** | ์‚ฌ์šฉ์ž/๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ํ—ค๋” version-tag ๋ฐ ํ‘ธํ„ฐ ๋ฒ„์ „ ๋ฒˆํ˜ธ ์ œ๊ฑฐ. CLAUDE.md์— ๊ฐ€์ด๋“œ ๋ฒ„์ „ ๋ฏธํ‘œ๊ธฐ ๊ทœ์น™ ์ถ”๊ฐ€ | | **์ฐจ์„ธ๋Œ€ ๊ณ ๋„ํ™” ๊ณ„ํš ์ˆ˜๋ฆฝ** | Phase 16(v0.7.0)~18(v2.0) ๊ณ„ํš: ํ”Œ๋žœ ๋ชจ๋“œ, ๋„๊ตฌ ๊ด€๋ฆฌ UI, ํ”„๋กœ์ ํŠธ ๊ทœ์น™, ์ž๊ธฐ ์„ฑ์ฐฐ, ๋ฉ€ํ‹ฐํŒŒ์ผ Diff, ์—์ด์ „ํŠธ ํŒ€ ๋“ฑ 18๊ฐœ ๊ธฐ๋Šฅ | ### v0.6.0 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase 15 โ€” ๋ฉ€ํ‹ฐํŒจ์Šค ๋ฌธ์„œ ์—”์ง„ + ๋‚ด์žฅ ์Šคํ‚ฌ 29์ข… ํ™•์žฅ + ์—์ด์ „ํŠธ ๋„๊ตฌ 42๊ฐœ + PPT ๋„ค์ดํ‹ฐ๋ธŒ ์ƒ์„ฑ | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๋ฉ€ํ‹ฐํŒจ์Šค ๋ฌธ์„œ ์ƒ์„ฑ ์—”์ง„** | `document_plan` (๊ฐœ์š” ๊ตฌ์กฐํ™”) + `document_assemble` (์„น์…˜๋ณ„ ์กฐ๋ฆฝ) ๋„๊ตฌ ์‹ ๊ทœ ์ถ”๊ฐ€. 3ํŽ˜์ด์ง€ ์ด์ƒ ๋ฌธ์„œ ์ž‘์„ฑ ์‹œ ๊ฐœ์š”โ†’์„น์…˜๋ณ„ ์ƒ์„ธโ†’์กฐ๋ฆฝ ๋ฐฉ์‹์œผ๋กœ ํ’ˆ์งˆ ๋Œ€ํญ ํ–ฅ์ƒ. ์ฝ”์›Œํฌ ๋ณด๊ณ ์„œ/๋ฌธ์„œ ํ”„๋ฆฌ์…‹์— ๋ฉ€ํ‹ฐํŒจ์Šค ์ง€์‹œ๋ฌธ ์ž๋™ ํฌํ•จ | | **PPT ๋„ค์ดํ‹ฐ๋ธŒ ์ƒ์„ฑ** | `pptx_create` ๋„๊ตฌ โ€” OpenXML SDK ๊ธฐ๋ฐ˜ C# ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌํ˜„. Python/Node ์—†์ด ์Šฌ๋ผ์ด๋“œ ์ƒ์„ฑ (title/content/two_column/table/blank ๋ ˆ์ด์•„์›ƒ, 4์ข… ํ…Œ๋งˆ) | | **๋ฐ์ดํ„ฐ ๋ถ„์„ ๋„๊ตฌ** | `data_pivot` โ€” CSV/JSON ๊ทธ๋ฃนํ™”ยทํ”ผ๋ฒ—ยท์ง‘๊ณ„ (sum/avg/count/min/max), ํ•„ํ„ฐยท์ •๋ ฌยทTop N ์ง€์›. LINQ ๊ธฐ๋ฐ˜ ์ˆœ์ˆ˜ C# ๊ตฌํ˜„ | | **ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง** | `template_render` โ€” Mustache ์Šคํƒ€์ผ ๋ณ€์ˆ˜ ์น˜ํ™˜ + ๋ฐ˜๋ณต({{#list}}) + ์กฐ๊ฑด๋ถ€({{^cond}}) ๋ Œ๋”๋ง. ์ •๊ธฐ ๋ณด๊ณ ์„œ ํ…œํ”Œ๋ฆฟ ์ž๋™ํ™” | | **์ด๋ฏธ์ง€ ๋ถ„์„** | `image_analyze` โ€” LLM ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ํ™œ์šฉ ์ด๋ฏธ์ง€ ์„ค๋ช…/ํ…์ŠคํŠธ ์ถ”์ถœ/์ฐจํŠธ ๋ฐ์ดํ„ฐ ํ•ด์„/๋น„๊ต ๋ถ„์„ | | **ํŒŒ์ผ ๋ณ€๊ฒฝ ๊ฐ์ง€** | `file_watch` โ€” ํด๋” ๋‚ด ์ตœ๊ทผ ๋ณ€๊ฒฝยท์ƒ์„ฑ ํŒŒ์ผ ํƒ์ง€ (์ƒ๋Œ€ ์‹œ๊ฐ„ ์ง€์›: 1h/24h/7d), ์œ ํ˜•๋ณ„ ํ†ต๊ณ„ | | **ํ…์ŠคํŠธ ์š”์•ฝ** | `text_summarize` โ€” ๊ธด ํ…์ŠคํŠธ/๋ฌธ์„œ ์ฒญํฌ ๋ถ„ํ•  โ†’ ํ•ต์‹ฌ ๋ฌธ์žฅ ์ถ”์ถœ ์š”์•ฝ (bullet/paragraph/executive/technical ์Šคํƒ€์ผ) | | **๋‚ด์žฅ ์Šคํ‚ฌ 16์ข… ์ถ”๊ฐ€** | email-draft, translate, compare, weekly-report, log-analyze, sql-report, data-convert, refactor, gen-test, impact + ์™ธ๋ถ€ ๊ฒ€์ฆ ์Šคํ‚ฌ 6์ข…: security-audit (๋ณด์•ˆ ์ฝ”๋“œ ๊ฐ์‚ฌ/OWASP), prd-generator (์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ/์œ ์ €์Šคํ† ๋ฆฌ), adr-writer (์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ๊ธฐ๋ก), changelog (๋ณ€๊ฒฝ์ด๋ ฅ/๋ฆด๋ฆฌ์ฆˆ๋…ธํŠธ), dependency-audit (์˜์กด์„ฑ ๋ถ„์„/๋ผ์ด์„ ์Šค), perf-audit (์„ฑ๋Šฅ ๊ฐ์‚ฌ/์•ˆํ‹ฐํŒจํ„ด) โ€” **์ด 29์ข…** | | **์„ค์ • ์ถ”๊ฐ€** | `EnableMultiPassDocument` (๋ฉ€ํ‹ฐํŒจ์Šค ๋ฌธ์„œ ON/OFF), `MultiPassThresholdPages` (์ž๋™ ๋ฉ€ํ‹ฐํŒจ์Šค ๊ธฐ์ค€ ํŽ˜์ด์ง€ ์ˆ˜, ๊ธฐ๋ณธ 3) | | **๊ฐ€์ด๋“œ ๋ทฐ์–ด ๋ฒ„ํŠผ ์ˆ˜์ •** | ๋‹ซ๊ธฐ/์ตœ์†Œํ™”/์ตœ๋Œ€ํ™” ๋ฒ„ํŠผ MouseLeftButtonDown + Handled๋กœ DragMove ์ถฉ๋Œ ํ•ด๊ฒฐ | | **ESC ํ‚ค ๋‹ซ๊ธฐ** | GuideViewerWindow, HelpDetailWindow์—์„œ Escape ํ‚ค๋กœ ์ฐฝ ๋‹ซ๊ธฐ ์ง€์› | ### v0.5.4 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase 12-3 ์™„๋ฃŒ + ๋Œ€ํ™” UX ์•ˆ์ •ํ™” + ์Šฌ๋ž˜์‹œ ํŒ์—… ๊ณ ๋„ํ™” + ์„ค์ • ๊ฐœ์„  | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **Phase 12-3 ์™„๋ฃŒ** | ์‹คํ–‰์ด๋ ฅ์ƒ์„ธ๋„๋ฅผ ๊ฐœ๋ฐœ์ž ํƒญ์œผ๋กœ ์ด๋™. Phase 12-3 (๋Ÿฐํƒ€์ž„ ์Šคํ‚ฌ + ์›Œํฌํ”Œ๋กœ์šฐ ๋ถ„์„๊ธฐ + ์„ค์ • ๊ฐœ์„ ) ์ „์ฒด ์™„๋ฃŒ | | **๊ธ€๋กœ์šฐ ํšจ๊ณผ ์ง€์†** | ๋ ˆ์ธ๋ณด์šฐ ๊ธ€๋กœ์šฐ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ ์ง€์† (๊ธฐ์กด 3์ดˆ ์ž๋™ ๊บผ์ง โ†’ StopRainbowGlow ํŽ˜์ด๋“œ์•„์›ƒ). Chat/Cowork/Code ์ „์ฒด ์ ์šฉ | | **์ŠคํŠธ๋ฆฌ๋ฐ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ํ‘œ์‹œ** | ํ—ค๋” ์šฐ์ธก์— ์‹ค์‹œ๊ฐ„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ํ‘œ์‹œ (0s, 5s, 12s...). ์™„๋ฃŒ ํ›„ ํ•˜๋‹จ์— ์ตœ์ข… ์‹œ๊ฐ„ + ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ํ•œ ์ค„ TextBlock ํ‘œ์‹œ (์ค„๋ฐ”๊ฟˆ ๋ฐฉ์ง€) | | **์Šฌ๋ž˜์‹œ ํŒ์—… UX ๊ฐœ์„ ** | โ†‘/โ†“ ๋ฐฉํ–ฅํ‚ค ์•„์ดํ…œ ๋‹จ์œ„ ์ด๋™ + ์„ ํƒ ํ•˜์ด๋ผ์ดํŠธ, Enter๋กœ ์‹คํ–‰, ๋งˆ์šฐ์Šค ํœ  ์Šคํฌ๋กค ์ง€์›, ๊ธฐ๋ณธ ํ‘œ์‹œ 7๊ฐœ (์ตœ๋Œ€ 20), `/help` ์ง์ ‘ ์ž…๋ ฅ ์‹œ ๋„์›€๋ง ์ฐฝ ํ‘œ์‹œ, ์Šฌ๋ผ์ด๋”์— ํ˜„์žฌ ๊ฐ’ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ | | **๋„์›€๋ง ์ฐฝ ๋‹ซ๊ธฐ ์ˆ˜์ •** | DragMove ์ถฉ๋Œ ํ•ด๊ฒฐ โ€” MouseLeftButtonDown + Handled๋กœ ๋‹ซ๊ธฐ ์ด๋ฒคํŠธ ์šฐ์„  ์ฒ˜๋ฆฌ. ๋“œ๋ž˜๊ทธ๋Š” ํ—ค๋” ์˜์—ญ์—์„œ๋งŒ ๋™์ž‘ | | **์„ค์ • ์ ‘๊ธฐ/์—ด๊ธฐ ์ˆ˜์ •** | ๋„๊ตฌ ์นดํ…Œ๊ณ ๋ฆฌยท์Šคํ‚ฌ ๊ทธ๋ฃน ์ ‘๊ธฐ/์—ด๊ธฐ๋ฅผ MouseLeftButtonDown์œผ๋กœ ๋ณ€๊ฒฝ (ScrollViewer ๋‚ด MouseUp ์†Œ์‹ค WPF ์ด์Šˆ ํ•ด๊ฒฐ) | | **์„ค์ • ๋‹ซ๊ธฐ ๋‹ค์ด์–ผ๋กœ๊ทธ ์ œ๊ฑฐ** | ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋‹ซ์„ ๋•Œ ํ™•์ธ ํŒ์—… + ํ•˜๋‹จ ํ† ์ŠคํŠธ ๋ฐฐ๋„ˆ ์ œ๊ฑฐ, ๋ฐ”๋กœ ๋‹ซํž˜ (๋ณ€๊ฒฝ์‚ฌํ•ญ ์ž๋™ revert) | | **์„ค์ • ์Šคํ‚ฌ ๋กœ๋”ฉ ์ง€์—ฐ ํ•ด๊ฒฐ** | ์Šคํ‚ฌ ๋ฏธ๋กœ๋“œ ์‹œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ Task๋กœ RuntimeDetector ํฌํ•จ ๋น„๋™๊ธฐ ๋กœ๋“œ ํ›„ UI ๊ตฌ์„ฑ | | **ํƒญ ์ „ํ™˜ ์‹œ ๋Œ€ํ™” ์œ ์ง€** | StopStreamingIfActive() โ€” ํƒญ ์ „ํ™˜ ์‹œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฆ‰์‹œ ์ค‘๋‹จ + ๋Œ€ํ™” ์ฆ‰์‹œ ์ €์žฅ. originTab ์บก์ฒ˜๋กœ ์˜ฌ๋ฐ”๋ฅธ ํƒญ์— ID ๋งคํ•‘. SendRegenerateAsync ์ด๋ ฅ ๊ฐฑ์‹  ์ถ”๊ฐ€ | | **์„น์…˜ ๊ฐ„ ๊ฐ„๊ฒฉ ๊ฐœ์„ ** | ์ฐจ๋‹จ ํ™•์žฅ์ž โ†’ ๋„๊ตฌ/์ปค๋„ฅํ„ฐ ๊ฐ„ 16px ๋งˆ์ง„, ๋„์›€๋ง ์ฐฝ ์Šคํ‚ฌ ํ•ญ๋ชฉ ๊ฐ„๊ฒฉ ํ™•๋Œ€, ๋ช…๋ น์–ด ์—ด ๋„ˆ๋น„ 120px | ### v0.5.3 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase L2 ํด๋ฆฝ๋ณด๋“œ ๊ณ ๋„ํ™” + Phase 14 ์—์ด์ „ํŠธ ๋„๊ตฌ/์Šคํ‚ฌ ํ™•์žฅ + ์„ค์ • UI ๊ฐœ์„  + ๊ฐ€์ด๋“œ ์‹œ์Šคํ…œ | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | ํด๋ฆฝ๋ณด๋“œ ์ด๋ฏธ์ง€ ์›๋ณธ ๋ณด์กด | ์›๋ณธ PNG๋ฅผ `clipboard_images/` ์บ์‹œ ํด๋”์— ์ €์žฅ, ์ธ๋„ค์ผ(80px)์€ ํ‘œ์‹œ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ. Enter ๋ณต์› ์‹œ ์›๋ณธ ํ•ด์ƒ๋„๋กœ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ. ์บ์‹œ ์ •๋ฆฌ ์ •์ฑ… (30์ผ/500MB) | | Shift+Enter ์ž๋™ ๋ณต์‚ฌ | ํžˆ์Šคํ† ๋ฆฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(Shift+Enter) ์‹œ ์‹œ์Šคํ…œ ํด๋ฆฝ๋ณด๋“œ์— ์ž๋™ ๋ณต์‚ฌ (ํ…์ŠคํŠธ/์ด๋ฏธ์ง€ ์›๋ณธ ํ•ด์ƒ๋„) | | ์Šคํ‚ฌ ๊ฐค๋Ÿฌ๋ฆฌ ๋ฒ„๊ทธ ์ˆ˜์ • | YAML ์•„์ด์ฝ˜ ์ด์Šค์ผ€์ดํ”„ ๋ณ€ํ™˜, DragMove ๋‹ซ๊ธฐ ์ถฉ๋Œ ํ•ด๊ฒฐ(3์ฐฝ), ์นด๋“œ ํด๋ฆญ ์ƒ์„ธ ํŒ์—…, ์ƒ๋‹จ๋ฐ” ์ •๋ ฌ | | **์—์ด์ „ํŠธ ๋„๊ตฌ 12์ข… ์ถ”๊ฐ€** | json_tool, regex_tool, diff_tool, clipboard_tool, notify_tool, env_tool, zip_tool, http_tool, sql_tool, base64_tool, hash_tool, datetime_tool | | **๋‚ด์žฅ ์Šคํ‚ฌ 3์ข… ์ถ”๊ฐ€** | api-docs, db-schema, commit-review (์ด 13์ข… ๋ฒˆ๋“ค) | | **์„ค์ • UI ๊ฐœ์„ ** | ๋… ๋ฐ” ํƒญ 3๋ฒˆ์งธ ์œ„์น˜๋กœ ์ด๋™ (ํ…Œ๋งˆ ๋’ค), ๊ธฐํƒ€ ํƒญ ์ ‘๊ธฐ/์—ด๊ธฐ ์„น์…˜ (๋“ฑ๋ก๋œ ๋„๊ตฌยทMCP ์ปค๋„ฅํ„ฐยท์Šฌ๋ž˜์‹œ ์Šคํ‚ฌ ๊ฐ๊ฐ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) | | **About ์ •๋ณด ๋ณ€๊ฒฝ** | ๊ฐœ๋ฐœ ์ •๋ณด์—์„œ ".NET 8" ์ œ๊ฑฐ โ†’ "Commander + Agent" ํ‘œ์‹œ (๊ธฐ์ˆ  ์Šคํƒ ๋น„๋…ธ์ถœ) | | **๊ฐ€์ด๋“œ ์‹œ์Šคํ…œ ์‹ ์„ค** | ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ + ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ๋ถ„๋ฆฌ (๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ์—๋งŒ ๋ฒ„์ „ ์ด๋ ฅ ํฌํ•จ). AES-256-CBC ๊ณ ์ • ํ‚ค ์•”ํ˜ธํ™” (.enc). GuideViewerWindow ๋‚ด์žฅ ๋ทฐ์–ด (WebView2 ๋น„๋™๊ธฐ ์ดˆ๊ธฐํ™”). ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ONโ†’๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ, OFFโ†’์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ. ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด โ†’ ์™ธ๋ถ€ ๋ธŒ๋ผ์šฐ์ € ๋Œ€์‹  ์•ฑ ๋‚ด ๋ทฐ์–ด๋กœ ์ „ํ™˜ | | **๊ฐ€์ด๋“œ ์•”ํ˜ธํ™” ๋„๊ตฌ** | GuideEncryptor.cs (AES-256-CBC ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์œ ํ‹ธ๋ฆฌํ‹ฐ), encrypt_guides.ps1 (๋นŒ๋“œ ์ „ ์•”ํ˜ธํ™” ์Šคํฌ๋ฆฝํŠธ) | ### v0.5.2 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase 12-4/12-5 ๋Ÿฐํƒ€์ž„ ์Šคํ‚ฌ + ์›Œํฌํ”Œ๋กœ์šฐ ๋ถ„์„๊ธฐ + ๊ฐœ๋ฐœ์ž ํƒญ + ์„ค์ • ๊ฐœ์„  | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๋Ÿฐํƒ€์ž„ ์˜์กด ์Šคํ‚ฌ (12-4)** | RuntimeDetector โ€” Python/Node.js ์„ค์น˜ ๊ฐ์ง€ (where.exe + --version, 5๋ถ„ ์บ์‹œ). SkillDefinition.Requires/IsAvailable/UnavailableHint. ๊ณ ๊ธ‰ ์Šคํ‚ฌ 4์ข… ๋ฒˆ๋“ค (docx-creator, xlsx-analyzer, pdf-processor, pptx-creator). ์Šฌ๋ž˜์‹œ ํŒ์—…์—์„œ ๋น„๊ฐ€์šฉ ์Šคํ‚ฌ ํšŒ์ƒ‰ ํ‘œ์‹œ. ๊ธฐํƒ€ ํƒญ์— ์Šคํ‚ฌ ๋ชฉ๋ก ์นด๋“œ | | **์›Œํฌํ”Œ๋กœ์šฐ ๋ถ„์„๊ธฐ (12-5)** | WorkflowAnalyzerWindow โ€” ์„ธ๋กœ ํƒ€์ž„๋ผ์ธ ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐํ™”. AgentEvent ํ™•์žฅ (ElapsedMs/InputTokens/OutputTokens/ToolInput/Iteration). Stopwatch ํƒ€์ด๋ฐ + LastTokenUsage ํ† ํฐ. AgentLogLevel 3๋‹จ๊ณ„ ๋ถ„๊ธฐ (simple/detailed/debug) | | **๊ฐœ๋ฐœ์ž ํƒญ ๋ถ„๋ฆฌ** | ์„ค์ • โ€บ ์—์ด์ „ํŠธ์— ๊ฐœ๋ฐœ์ž ์„œ๋ธŒํƒญ ์‹ ์„ค. ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณดํ˜ธ ์„ธ์…˜ ์ „์šฉ. ๊ฐœ๋ฐœ์ž๋ชจ๋“œ/์‹คํ–‰์ด๋ ฅ์ƒ์„ธ๋„/์Šคํ…๋ฐ”์ด์Šคํ…/์›Œํฌํ”Œ๋กœ์šฐ ์‹œ๊ฐํ™”/๊ฐ์‚ฌ๋กœ๊ทธ/์—์ด์ „ํŠธ๊ณ ๊ธ‰/๋ชจ๋ธํด๋ฐฑ/MCP์„œ๋ฒ„ ๋ฐฐ์น˜ | | **์„ค์ • ๊ฐœ์„ ** | AgentLogLevel ๊ธฐ๋ณธ๊ฐ’ simple, DevMode ์„ธ์…˜ ์ „์šฉํ™” (๋งค๋ฒˆ ์žฌ์ธ์ฆ), WorkflowVisualizer ํ† ๊ธ€ ์ถ”๊ฐ€, ๊ฐœ๋ฐœ์ž๋ชจ๋“œ ? ํˆดํŒ ์ œ๊ฑฐ | | **UI ๊ฐœ์„ ** | ํ›…/MCP ์„œ๋ฒ„ ์ถ”๊ฐ€ ๋‹ค์ด์–ผ๋กœ๊ทธ์— ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์ž…๋ ฅ ์˜ˆ์‹œ, ์ขŒ์šฐ ํŒจ๋”ฉ ์ฆ๊ฐ€, ํ›… ESC ๋‹ซ๊ธฐ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํˆดํŒ ์˜คํƒˆ์ž(๋ณ€๊ฒฝ์‚ฌํ•ญ) ์ˆ˜์ • | | **์„ค์ • ๊ธฐ๋Šฅ ํƒญ ๊ฐœํŽธ** | ๊ธฐ๋Šฅ ์„ค์ • ํŽ˜์ด์ง€๋ฅผ 3๊ฐœ ์„œ๋ธŒํƒญ(AI ๊ธฐ๋Šฅ / AX Commander / ๋””์ž์ธยท๊ธฐํƒ€)์œผ๋กœ ๋ถ„๋ฅ˜. ํด๋ฆฝ๋ณด๋“œ ํ™•์žฅ์„ ๋””์ž์ธยท๊ธฐํƒ€๋กœ ์ด๋™, ์‹คํ–‰์ด๋ ฅ์ƒ์„ธ๋„๋ฅผ ์ฝ”์›Œํฌ/์ฝ”๋“œ ํƒญ์œผ๋กœ ๋ณต๊ท€ | | **Phase 13 ๊ณ„ํš ์ˆ˜๋ฆฝ** | ์Šคํ‚ฌ ์ƒํƒœ๊ณ„ + ์—์ด์ „ํŠธ ๋ถ„์„ ๊ณ ๋„ํ™” 5๊ฐœ ํ•ญ๋ชฉ (์Šคํ‚ฌ ๊ฐค๋Ÿฌ๋ฆฌ/ํŽธ์ง‘๊ธฐ/๊ฐ€์ ธ์˜ค๊ธฐยท๋‚ด๋ณด๋‚ด๊ธฐ/ํ†ต๊ณ„ ๋Œ€์‹œ๋ณด๋“œ/AgentLogLevel ์—ฐ๋™). AGENT_ROADMAP ๋ฌธ์„œ ๋ฐ˜์˜ | | **์Šคํ‚ฌ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ (13-2)** | SkillEditorWindow โ€” ํผ ๊ธฐ๋ฐ˜ ์Šคํ‚ฌ ์ƒ์„ฑ/ํŽธ์ง‘ GUI. ์•„์ด์ฝ˜ ์„ ํƒ๊ธฐ(MDL2 20์ข…), ๋„๊ตฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ(ToolRegistry ์—ฐ๋™), ํ…œํ”Œ๋ฆฟ ์‚ฝ์ž…(๋„๊ตฌ๋ชฉ๋ก/์ถœ๋ ฅํ˜•์‹/๋‹จ๊ณ„๋ณ„), ํ† ํฐ ์˜ˆ์ƒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, YAML ํ”„๋ก ํŠธ๋งคํ„ฐ + ๋งˆํฌ๋‹ค์šด ๋ณธ๋ฌธ ์ž๋™ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž ์Šคํ‚ฌ ํด๋” ์ €์žฅ. ์Šคํ‚ฌ ๊ฐค๋Ÿฌ๋ฆฌ ์—ฐ๋™ (์ƒˆ ์Šคํ‚ฌ โ†’ ํŽธ์ง‘๊ธฐ, ์‚ฌ์šฉ์ž ์Šคํ‚ฌ ํŽธ์ง‘ โ†’ ์‹œ๊ฐ์  ํŽธ์ง‘๊ธฐ) | ### v0.5.1 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: Phase 12 ์Šคํ‚ฌ/์ปค๋„ฅํ„ฐ ๊ณ ๋„ํ™” + UI ๊ฐœ์„  + ๋ฒ„๊ทธ ์ˆ˜์ • | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์Šฌ๋ž˜์‹œ ๋ช…๋ น ์˜์–ด ์ „ํ™˜** | ๋‚ด์žฅ ์Šฌ๋ž˜์‹œ ๋ช…๋ น 11๊ฐœ๋ฅผ ํ•œ๊ตญ์–ด(/์š”์•ฝ,/๋ฒˆ์—ญ)์—์„œ ์˜์–ด(/summary,/translate,/review,/pr ๋“ฑ)๋กœ ์ „ํ™˜. IME ์ „ํ™˜ ์—†์ด ์ฆ‰์‹œ ์ž…๋ ฅ ๊ฐ€๋Šฅ | | **๋„๊ตฌ/์ปค๋„ฅํ„ฐ ๊ด€๋ฆฌ UI (12-1)** | ์„ค์ • โ€บ ์—์ด์ „ํŠธ โ€บ ๊ธฐํƒ€ ํƒญ์— ๋“ฑ๋ก๋œ ๋„๊ตฌ 29์ข…์„ 5๊ฐœ ์นดํ…Œ๊ณ ๋ฆฌ(ํŒŒ์ผ/ํ”„๋กœ์„ธ์Šค/์ฝ”๋“œ๋ถ„์„/๋ฌธ์„œ์ƒ์„ฑ/์—์ด์ „ํŠธ)๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ํ‘œ์‹œ. MCP ์ปค๋„ฅํ„ฐ ์•ˆ๋‚ด ์„น์…˜ | | **SKILL.md ํ‘œ์ค€ ํ˜ธํ™˜ (12-2)** | SkillService โ€” *.skill.md (๊ธฐ์กด) + ํด๋”/SKILL.md (ํ‘œ์ค€) 2ํ˜•์‹ ๋™์‹œ ์ง€์›. YAML metadata ๋งต ํŒŒ์‹ฑ, license/compatibility/allowed-tools ํ•„๋“œ. SkillDefinition ํ™•์žฅ | | **์ปค์Šคํ…€ ComboBox** | ์ „์—ญ ComboBox/ComboBoxItem ์Šคํƒ€์ผ โ€” ControlTemplate ๊ธฐ๋ฐ˜ ๋ชจ๋˜ ๋“œ๋กญ๋‹ค์šด, ํ˜ธ๋ฒ„/์„ ํƒ ํšจ๊ณผ, Slide ์• ๋‹ˆ๋ฉ”์ด์…˜. ์„ค์ •์ฐฝ ์ „์ฒด(27๊ฐœ์†Œ) ์ž๋™ ์ ์šฉ | | **BlockedPaths ํŒจํ„ด ์ˆ˜์ •** | `*\Documents\*` โ†’ `*Documents*` โ€” ๋ฐฑ์Šฌ๋ž˜์‹œ ์—†๋Š” ํŒจํ„ด์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์ •์ƒ ์ฐจ๋‹จ ๋™์ž‘ | | **์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ ์ •๋ฆฌ** | v0.5.1 ์ด๋ ฅ ์ถ”๊ฐ€, v0.4.0 ์ดํ•˜ ์ด์ „ ์ด๋ ฅ์œผ๋กœ ์ ‘๊ธฐ, ๋‚ด๋ถ€ ๊ธฐ์ˆ  ์šฉ์–ด ์ œ๊ฑฐ(DPAPI, Ollama/vLLM, ํด๋ž˜์Šค๋ช… ๋“ฑ), ํ‘ธํ„ฐ ๋ฒ„์ „ ๊ฐฑ์‹  | ### v0.5.0 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ๋Œ€ํ™” ์„œ๋น„์Šค Phase 9~11 ์™„๋ฃŒ + ๋Ÿฐ์ฒ˜ Phase L1 ์ถ”๊ฐ€ + ์ €์žฅ ๊ณต๊ฐ„ ๊ด€๋ฆฌ + ๋ฌธ์„œ ์ฒด๊ณ„ํ™” | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **LSP ์ฝ”๋“œ ์ธํ…”๋ฆฌ์ „์Šค (9-1)** | LspClientService โ€” C#/TS/Python/C++/Java ์–ธ์–ด ์„œ๋ฒ„ ์ž๋™ ๊ฐ์ง€. `lsp_code_intel` ๋„๊ตฌ (goto_definition, find_references, symbols). ์„ค์ • `EnableLsp` ํ† ๊ธ€ | | **์„œ๋ธŒ์—์ด์ „ํŠธ (9-2)** | SubAgentTool (`spawn_agent`) + WaitAgentsTool (`wait_agents`). ์ฝ๊ธฐ ์ „์šฉ ๊ฒฉ๋ฆฌ ์‹คํ–‰. `MaxSubAgents` ์„ค์ •์œผ๋กœ ๋™์‹œ ์‹คํ–‰ ์ œํ•œ | | **์ฝ”๋“œ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ (9-3)** | CodeIndexService โ€” TF-IDF ์ธ๋ฑ์‹ฑ (camelCase ๋ถ„ํ• , 50๋ผ์ธ ์ฒญํฌ). `search_codebase` ๋„๊ตฌ. `EnableCodeIndex`/`CodeIndexMaxFileKb` ์„ค์ • | | **์ž๋™ ํ…Œ์ŠคํŠธ ๋ฃจํ”„ (9-4)** | TestLoopTool โ€” generate/run/analyze 3๋‹จ๊ณ„. .NET/Python/Node.js/Go ํ”„๋ ˆ์ž„์›Œํฌ ์ž๋™ ๊ฐ์ง€ | | **์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ (9-5)** | AgentTriggerService โ€” FileSystemWatcher(ํŒŒ์ผ ๋ณ€๊ฒฝ) + DispatcherTimer(์Šค์ผ€์ค„). triggers.json ๊ทœ์น™ ๊ธฐ๋ฐ˜ | | **PDF ๋‚ด๋ณด๋‚ด๊ธฐ (9-6)** | PdfExportService โ€” HTML ์ธ์‡„ ์ตœ์ ํ™” + ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์ธ์‡„. ๋Œ€ํ™” ๋‚ด๋ณด๋‚ด๊ธฐ์— "PDF ์ธ์‡„์šฉ HTML" ์˜ต์…˜ ์ถ”๊ฐ€ | | **diff ๋ทฐ์–ด (9-7)** | DiffViewerPanel โ€” ๋ผ์ธ ๊ธฐ๋ฐ˜ diff (Added/Removed/Equal), ๋ผ์ธ ๋ฒˆํ˜ธ, Accept/Reject ๋ฒ„ํŠผ | | **ํƒ์ƒ‰๊ธฐ ์…ธ ํ™•์žฅ** | ShellExtensionService โ€” HKCU ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์šฐํด๋ฆญ ๋ฉ”๋‰ด ๋“ฑ๋ก/ํ•ด์ œ. ํŒŒ์ผ/ํด๋”/ํด๋”๋ฐฐ๊ฒฝ 3์ข… | | **์ €์žฅ ๊ณต๊ฐ„ ๊ด€๋ฆฌ** | StorageAnalyzer โ€” ์•ฑ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋Ÿ‰ ๋ถ„์„ (๋Œ€ํ™”/๊ฐ์‚ฌ/๋กœ๊ทธ/์ธ๋ฑ์Šค/ํด๋ฆฝ๋ณด๋“œ), ๋“œ๋ผ์ด๋ธŒ ์—ฌ์œ  ๊ณต๊ฐ„, 7/14/30์ผ ์ •๋ฆฌ. ์„ค์ • ๊ณตํ†ต ํƒญ์— UI | | **์„ค์ • ๋„์›€๋ง ์•„์ด์ฝ˜** | AI ๊ด€๋ จ ์„ค์ • 17๊ฐœ์— `?` ์•„์ด์ฝ˜ + `HelpTooltipStyle` ์ปค์Šคํ…€ ๋‹คํฌ ํˆดํŒ | | **ํด๋ฐฑ ๋ชจ๋ธ ๊ฐœ์„ ** | ์„œ๋น„์Šค๋ณ„ ๊ทธ๋ฃนํ™” (Ollama/vLLM/Gemini/Claude). ViewModel๊ณผ AppSettings ๋™์‹œ ์ฝ๊ธฐ๋กœ ์ €์žฅ ์ „ ์ฆ‰์‹œ ๋ฐ˜์˜ | | **ํด๋ฆฝ๋ณด๋“œ ๋ถ™์—ฌ๋„ฃ๊ธฐ** | Alt+SetForegroundWindow ์šฐํšŒ. TryGetSelectedText ํ›„ํฌ ์Šค๋ ˆ๋“œ ๋ถ„๋ฆฌ | | **๋… ๋ฐ” ๊ฐœ์„ ** | ๋ฒ„ํŠผ ํžˆํŠธ ํ…Œ์ŠคํŠธ ์ˆ˜์ • (MouseLeftButtonDown), ์‹œ์ž‘ ์‹œ ์ž๋™ ํ‘œ์‹œ, ์„ค์ • ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜ | | **ํฌ๋งท ๋ฉ”๋‰ด** | AI ์ž๋™ ์„ ํƒ ๋งจ ์œ„๋กœ ์ด๋™ | | **์ฝ”๋“œ ํƒญ ์•„์ด์ฝ˜** | ํŒŒ์ผ(์•ฐ๋ฒ„)/๊ถŒํ•œ(ํŒŒ๋ž‘ยท๋นจ๊ฐ•)/๋ฐ์ดํ„ฐํ™œ์šฉ(๋…นยท์•ฐ๋ฒ„ยทํšŒ) ์ƒ‰์ƒ ๊ตฌ๋ถ„ | | **์‚ฌ๋‚ด ํ™˜๊ฒฝ ์›์น™** | CLAUDE.md์— ์™ธ๋ถ€ ์˜์กด ์ตœ์†Œํ™”, ๋ฐ์ดํ„ฐ ๋กœ์ปฌ ์ €์žฅ, ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๊ธˆ์ง€ ์ง€์นจ ์ถ”๊ฐ€ | | **๋ฌธ์„œ ์ฒด๊ณ„ํ™”** | CLAUDE.md ๋ฌธ์„œ ๊ด€๋ฆฌ ์›์น™ ์ถ”๊ฐ€, AGENT/LAUNCHER ROADMAP Phase 9/L1 ์™„๋ฃŒ ํ‘œ์‹œ, NEXT_ROADMAP ์ฐจ๊ธฐ ๊ณ„ํš ์ „๋ฉด ์—…๋ฐ์ดํŠธ | | **์ž๋™ ๋ชจ๋ธ ์„ ํƒ (10-1)** | AutoRouterService โ€” ์งˆ๋ฌธ ์œ ํ˜•(์ฝ”๋”ฉ/๋ฒˆ์—ญ/๋ถ„์„) ๊ฐ์ง€ โ†’ ์ตœ์  ๋ชจ๋ธ ์ž๋™ ๋ผ์šฐํŒ…. ์ž ๊ธˆ ๋ชจ๋“œ ์ง€์› | | **์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ (10-2)** | MemoryTool โ€” ํ”„๋กœ์ ํŠธ ๊ทœ์น™, ์ฝ”๋”ฉ ์„ ํ˜ธ๋„ ์ž๋™ ๊ธฐ์–ต. ๋Œ€ํ™” ๊ฐ„ ์˜์† ์œ ์ง€ | | **๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ž…๋ ฅ (10-4)** | ์ด๋ฏธ์ง€/์Šคํฌ๋ฆฐ์ƒท Ctrl+V ๋ถ™์—ฌ๋„ฃ๊ธฐ โ†’ base64 ์ธ์ฝ”๋”ฉ โ†’ Gemini/Claude/Ollama/OpenAI Vision API ์ง์ ‘ ์ „๋‹ฌ. ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ UI | | **์ฝ”๋“œ ๊ฒ€์ƒ‰ ๊ฐœ์„  (10-5)** | TF-IDF + SQLite ์˜์† ์ธ๋ฑ์Šค, ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ, ๋ฐ”์ด๊ทธ๋žจ ํ† ํฐ, ์Šคํ†ฑ์›Œ๋“œ ํ•„ํ„ฐ๋ง | | **์—์ด์ „ํŠธ ํ›… ์‹œ์Šคํ…œ (10-6)** | ๋„๊ตฌ ํ˜ธ์ถœ ์ „/ํ›„ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰. hooks.json ๊ทœ์น™ ๊ธฐ๋ฐ˜ | | **์Šคํ‚ฌ ์‹œ์Šคํ…œ (11-1)** | SkillService โ€” *.skill.md YAML ํ”„๋ก ํŠธ๋งคํ„ฐ ํŒŒ์‹ฑ โ†’ ์Šฌ๋ž˜์‹œ ๋ช…๋ น ์ž๋™ ๋“ฑ๋ก. 3ํด๋” ์šฐ์„ ์ˆœ์œ„(์•ฑโ†’%APPDATA%โ†’์ปค์Šคํ…€). ๊ธฐ๋ณธ ์Šคํ‚ฌ 3์ข…(daily-standup/bug-hunt/code-explain) ์ž๋™ ์ƒ์„ฑ. `skill_manager` ๋„๊ตฌ | | **AI ์ฝ”๋“œ ๋ฆฌ๋ทฐ (11-2)** | CodeReviewTool โ€” diff_review/file_review/pr_summary. ์ •์  ๋ถ„์„(๋นˆ catch/๋™๊ธฐ ๋Œ€๊ธฐ/ํ•˜๋“œ์ฝ”๋”ฉ ํ‚ค/๊ธด ๋ฉ”์„œ๋“œ). Git diff ํŒŒ์„œ. ๋ฆฌ๋ทฐ ์ดˆ์ (bugs/performance/security/style) | | **๋“œ๋ž˜๊ทธ&๋“œ๋กญ AI (11-3)** | ํŒŒ์ผ ๋“œ๋ž˜๊ทธ ์‹œ ์œ ํ˜•๋ณ„ AI ์•ก์…˜ ํŒ์—…(์ฝ”๋“œโ†’๋ฆฌ๋ทฐ/์„ค๋ช…/๋ฆฌํŒฉํ† ๋ง, ๋ฌธ์„œโ†’์š”์•ฝ/๋ฒˆ์—ญ, ๋ฐ์ดํ„ฐโ†’๋ถ„์„/์‹œ๊ฐํ™”, ์ด๋ฏธ์ง€โ†’์„ค๋ช…). "์ฒจ๋ถ€๋งŒ" ์˜ต์…˜. `EnableDragDropAiActions` ์„ค์ • | | **ํ”„๋กœ์ ํŠธ ์ง€์นจ (11 ์ถ”๊ฐ€)** | ProjectRuleTool โ€” AX.md read/append/write. ์‚ฌ์šฉ์ž ์Šน์ธ ํ›„ ์ €์žฅ. ์ƒ์œ„ 3๋‹จ๊ณ„ ํƒ์ƒ‰ | | **์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด ๊ฐ•ํ™” (11 ์ถ”๊ฐ€)** | ํƒญ๋ณ„ ํ•„ํ„ฐ๋ง(Chat=๊ณตํ†ต, Cowork/Code=๊ณตํ†ต+๊ฐœ๋ฐœ). `/help` ๋„์›€๋ง ์ฐฝ. ์ด 12๊ฐœ ๋‚ด์žฅ ๋ช…๋ น | | **์‚ฌ์šฉ ํ†ต๊ณ„ ์ฐจํŠธ ํ™•์žฅ** | ๋ฉ”์ธ ํƒญ ๋ฏธ๋‹ˆ์ฐจํŠธ 2์ข…, ์ปค๋งจ๋” ํƒญ ์š”์ผ๋ณ„ ํ‰๊ท ์ฐจํŠธ, ์—์ด์ „ํŠธ ํƒญ ํƒญ๋น„์œจ+ํ† ํฐ๋น„์œจ ์ฐจํŠธ | | **์ธ์‚ฌ ๋ฌธ๊ตฌ ์™ธ๋ถ€ํ™”** | greetings.json ์™ธ๋ถ€ ํŒŒ์ผ ๋กœ๋”ฉ + ์ž„๋ฒ ๋””๋“œ ๋ฆฌ์†Œ์Šค ํด๋ฐฑ + 5๋ถ„ ์บ์‹œ | | **์บก์ฒ˜ ์•Œ๋ฆผ ๊ฐœ์„ ** | ์ง€์—ฐ ์บก์ฒ˜ ์นด์šดํŠธ๋‹ค์šด ์•Œ๋ฆผ ์ œ๊ฑฐ (์‹œ์ž‘/์ดˆ๋‹จ์œ„ ๋ชจ๋‘). ์™„๋ฃŒ ์•Œ๋ฆผ๋งŒ ์œ ์ง€ | | **์•Œ๋ฆผ ์•„์ด์ฝ˜ ์ˆ˜์ •** | ToolTipIcon.Info โ†’ ToolTipIcon.None ๋ณ€๊ฒฝ์œผ๋กœ ์•ฑ ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜ ํ‘œ์‹œ | ### v0.4.0 > **๊ฐœ๋ฐœ ๋ฒ”์œ„**: ๋Ÿฐ์ฒ˜ ๊ณ ๋„ํ™” Phase L1 (LAUNCHER_ROADMAP) + ๋Œ€ํ™” ์„œ๋น„์Šค ๊ณ ๋„ํ™” Phase 9 (AGENT_ROADMAP) ๋ณ‘ํ–‰ > > | ์˜์—ญ | ๋ฌธ์„œ | ์™„๋ฃŒ ํ•ญ๋ชฉ | > |------|------|----------| > | ๋Ÿฐ์ฒ˜ | `LAUNCHER_ROADMAP.md` | L1-1(์„ ํƒ ํ…์ŠคํŠธ AI), L1-5(๋… ๋ฐ”), L1-6(๋Œ€ํ™”์ƒ์ž ํ†ตํ•ฉ), L1-7(ํด๋ฆฝ๋ณด๋“œ ํ•€/์นดํ…Œ๊ณ ๋ฆฌ) | > | ๋Œ€ํ™” ์„œ๋น„์Šค | `AGENT_ROADMAP.md` | Phase 8 ์™„๋ฃŒ, ๊ธฐ์ˆ ๋ถ€์ฑ„ ํ•ด๊ฒฐ | | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์„ ํƒ ํ…์ŠคํŠธ AI ๋ช…๋ น (L1-1)** | TextActionPopup โ€” ํ•ซํ‚ค ์‹œ ์„ ํƒ ํ…์ŠคํŠธ ๊ฐ์ง€ (Ctrl+C ์‹œ๋ฎฌ๋ ˆ์ด์…˜), ์ปค์„œ ์œ„์น˜์— ์•ก์…˜ ํŒ์—… ํ‘œ์‹œ (๋ฒˆ์—ญ/์š”์•ฝ/๊ต์ •/์„ค๋ช…/๋‹ค์‹œ์“ฐ๊ธฐ), โ†‘โ†“/๋งˆ์šฐ์Šค ์„ ํƒ, Enter ์‹คํ–‰ โ†’ AX Agent์— `!` ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์ „๋‹ฌ | | **๋… ๋ฐ” (L1-5)** | DockBarWindow โ€” ํ™”๋ฉด ํ•˜๋‹จ ๊ณ ์ • ๋ฏธ๋‹ˆ ๋ฐ”. ์„ค์ • ๊ธฐ๋ฐ˜ ๋™์  ์•„์ดํ…œ ๋นŒ๋“œ (`DockBarItems`). CPU(PerformanceCounter)/RAM(GlobalMemoryStatusEx)/์‹œ๊ณ„ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ. ๋ฌด์ง€๊ฐœ ๊ธ€๋กœ์šฐ, ํˆฌ๋ช…๋„(0.3~1.0), ์œ„์น˜ ๊ธฐ์–ต(`DockBarLeft/Top`), ๋“œ๋ž˜๊ทธ ์ด๋™. ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ํ† ๊ธ€ | | **๋Œ€ํ™”์ƒ์ž ํ†ตํ•ฉ (L1-6)** | FileDialogWatcher โ€” `SetWinEventHook(EVENT_OBJECT_SHOW)` + `#32770` ํด๋ž˜์Šค ๊ฐ์ง€. ์—ด๊ธฐ/์ €์žฅ ๋Œ€ํ™”์ƒ์ž ๊ฐ์ง€ ์‹œ ๋Ÿฐ์ฒ˜ ์ž๋™ ์—ด๊ธฐ (`cd ` ํ”„๋ฆฌํ”ฝ์Šค) | | **ํด๋ฆฝ๋ณด๋“œ ํ•€/์นดํ…Œ๊ณ ๋ฆฌ (L1-7)** | ClipboardEntry์— `IsPinned`/`Category` ์ถ”๊ฐ€. ์ž๋™ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜ (URL/์ฝ”๋“œ/๊ฒฝ๋กœ/์ผ๋ฐ˜). ํ•€ ํ•ญ๋ชฉ ์ƒ๋‹จ ๊ณ ์ • + ์‚ญ์ œ ๋ณดํ˜ธ. `#pin`/`#url`/`#์ฝ”๋“œ`/`#๊ฒฝ๋กœ` ํ•„ํ„ฐ. Ctrl+P ํ•€ ํ† ๊ธ€ | | **์•„์ด์ฝ˜ ๊ต์ฒด** | ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ICO (7 sizes, 25% block, rounded) ์ƒ์„ฑ. ์ƒ=ํŒŒ๋ž‘/ํ•˜=๋นจ๊ฐ•/์ขŒ=๋…น/์šฐ=๋…น. AboutWindow/LauncherWindow/SetupForm/SVG ์ „์ฒด ์ƒ‰์ƒ ํ†ต์ผ. ๋ชจ๋“  Window์— `Icon=` ์†์„ฑ ์ถ”๊ฐ€. ๋ฐ”๋กœ๊ฐ€๊ธฐ์— `IconLocation` ๋ช…์‹œ | | **๋… ๋ฐ” ์„ค์ • ํƒญ** | SettingsWindow์— ๋… ๋ฐ” ํƒญ ์ถ”๊ฐ€ โ€” ์ž๋™ ํ‘œ์‹œ, ๊ธ€๋กœ์šฐ ํšจ๊ณผ, ํˆฌ๋ช…๋„ ์Šฌ๋ผ์ด๋”, ์œ„์น˜ ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ, ํ‘œ์‹œ ํ•ญ๋ชฉ ํ† ๊ธ€ (8์ข…) | | **์ธ์Šคํ†จ๋Ÿฌ** | UAC `requireAdministrator` ์œ ์ง€. SetupForm ๋‹ค์ด์•„๋ชฌ๋“œ ์•„์ด์ฝ˜ `FillRoundRect`๋กœ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ. ๋ฐ”๋กœ๊ฐ€๊ธฐ `IconLocation` ์„ค์ • | | **UI ํ†ต์ผ** | ์•Œ๋ฆผ ์นดํ…Œ๊ณ ๋ฆฌ CheckBox โ†’ ToggleSwitch. Ollama/vLLM ์„œ๋ฒ„ ์ฃผ์†Œ ๋ผ๋ฒจ "๊ธฐ๋ณธ ์„œ๋ฒ„ ์ฃผ์†Œ"๋กœ ํ†ต์ผ. ๊ฐœ๋ฐœ์ž ์ •๋ณด์ฐฝ ๊ธฐ์—ฌ์ž ํ‘œ์‹œ (`about.json` contributors). ์ฐฝ ๋†’์ด ์กฐ์ • | ### v0.3.1 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **SnapHandler ๋ ˆ์ด์•„์›ƒ ํ™•์žฅ** | ๊ธฐ์กด 11๊ฐœ โ†’ 22๊ฐœ ์Šค๋ƒ… ์˜ต์…˜. 3๋“ฑ๋ถ„(third-l/c/r), 2/3+1/3(two3-l/r), 3๋ถ„ํ•  ์กฐํ•ฉ(l-rt, l-rb, r-lt, r-lb) ์ถ”๊ฐ€ | | **Everything SDK ์—ฐ๋™** | `es` ํ”„๋ฆฌํ”ฝ์Šค๋กœ Everything ์ดˆ๊ณ ์† ํŒŒ์ผ ๊ฒ€์ƒ‰ ํ†ตํ•ฉ. Everything ๋ฏธ์„ค์น˜ ์‹œ graceful fallback. ํŒŒ์ผ ํƒ€์ž…๋ณ„ ์•„์ด์ฝ˜ ๊ตฌ๋ถ„ | | **ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž๋™ ์„ค์น˜** | `PluginHost.InstallFromZip()` โ€” ๋กœ์ปฌ zip์—์„œ DLL/JSON ์Šคํ‚ฌ ์ž๋™ ์ถ”์ถœยท๋“ฑ๋กยท๋กœ๋“œ. `UninstallPlugin()` ์ œ๊ฑฐ ๊ธฐ๋Šฅ ํฌํ•จ. URL ๊ธฐ๋ฐ˜ ์„ค์น˜๋Š” ์‚ฌ๋‚ด ๋ณด์•ˆ ์ •์ฑ…์œผ๋กœ ์ œ์™ธ | | **์ด๋ฏธ์ง€ ํด๋ฆฝ๋ณด๋“œ ์˜์†ํ™”** | ํด๋ฆฝ๋ณด๋“œ ํžˆ์Šคํ† ๋ฆฌ ์ด๋ฏธ์ง€ ํ•ญ๋ชฉ์„ PNGโ†’Base64๋กœ DPAPI ์•”ํ˜ธํ™” ์ €์žฅ/๋ณต์›. ์•ฑ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์ด๋ฏธ์ง€ ํžˆ์Šคํ† ๋ฆฌ ์œ ์ง€ | | **๋‹คํฌ ํ…Œ๋งˆ ๋Œ€๋น„ ๊ฐ•ํ™”** | 6์ข… ๋‹คํฌ ํ…Œ๋งˆ SecondaryText/PlaceholderText/HintText ๋ฐ๊ธฐ +12~20 ์ถ”๊ฐ€ ๊ฐœ์„ . ํ—ฌํ”„/๋‹จ์ถ•ํ‚ค ์ฐฝ ํ…์ŠคํŠธ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ | | **์ธ์Šคํ†จ๋Ÿฌ ๋ฒ„์ „ ๋™๊ธฐํ™”** | SetupForm.cs `AppVer` 1.2.2โ†’1.3.1 ์ˆ˜์ •. ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— MCP ๋ฒ„์ „ยท๋กœ๋“œ๋งต ๋ฌธ์„œ ํ•ญ๋ชฉ ์ถ”๊ฐ€ | | **์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ ์—…๋ฐ์ดํŠธ** | version-tag v0.2.2โ†’v0.3.1, v0.3.0/v0.3.1 ๋ฒ„์ „ ์ด๋ ฅ ์ถ”๊ฐ€, version-tag์— `color:#fff` ์ถ”๊ฐ€ | | **ํ—ฌํ”„ ์ฐฝ ์—…๋ฐ์ดํŠธ** | v0.3.1 ์‹ ๊ธฐ๋Šฅ ํ•ญ๋ชฉ ์ถ”๊ฐ€, ํŒŒ์ผ ํƒ€์ž…๋ณ„ ์‹ฌ๋ณผ 12์ข… ์ถ”๊ฐ€ (Excel/Word/Pdf/Image/Video/Music/Archive/Code ๋“ฑ) | | **๋ฌธ์„œ ์ •๋น„** | AI_Service_Review.html โ†’ AGENT_ROADMAP.html ๋ณ‘ํ•ฉ ํ›„ ์‚ญ์ œ, ๊ธฐ์ˆ ๋ถ€์ฑ„ ํ•ญ๋ชฉ ์™„๋ฃŒ ํ‘œ์‹œ, LAUNCHER_ROADMAP ์ƒ์„ฑ | ### v0.3.0 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **MCP ํด๋ผ์ด์–ธํŠธ** | McpClientService (stdio/JSON-RPC 2.0). ConnectAsync โ†’ initialize โ†’ tools/list โ†’ tools/call. McpTool์ด IAgentTool๋กœ ๋ž˜ํ•‘ | | **๋ชจ๋ธ ํด๋ฐฑ** | LlmService.SendAsync์— FallbackModels ์ˆœ์ฐจ ์‹œ๋„. ์‹คํŒจ ์‹œ ํ† ์ŠคํŠธ ์•Œ๋ฆผ์œผ๋กœ ํด๋ฐฑ ๋ชจ๋ธ ์•ˆ๋‚ด | | **๋Œ€ํ™” ๋ถ„๊ธฐ** | ChatConversation.ParentId/BranchLabel, ForkConversation(). ์šฐํด๋ฆญ "์—ฌ๊ธฐ์„œ ๋ถ„๊ธฐ" ๋ฉ”๋‰ด. ์‚ฌ์ด๋“œ๋ฐ” ๋“ค์—ฌ์“ฐ๊ธฐ ํ‘œ์‹œ | | **์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ** | CommandPaletteWindow (Ctrl+Shift+P). 16๊ฐœ ๋ช…๋ น, ํ•œ๊ธ€ ์ดˆ์„ฑ ๊ฒ€์ƒ‰ | | **๋ณด์•ˆ ๊ฐ์‚ฌ ๋กœ๊ทธ** | AuditLogService โ€” JSON ์˜์†ํ™”, 30์ผ ๋ณด๊ด€, ์„ค์ • ํ† ๊ธ€ + ํด๋” ์—ด๊ธฐ ๋ฒ„ํŠผ | | **์—์ด์ „ํŠธ ์ž์œจ์„ฑ** | ๋™์  ๋ฐ˜๋ณต ํ•œ๋„ (๋„๊ตฌ 15+ํšŒ โ†’ ํ•œ๋„ 2๋ฐฐ, ์ตœ๋Œ€ 50). ๋‹ค๋‹จ๊ณ„ ๋ฐ˜์„ฑ | | **ํ† ํฐ ๊ด€๋ฆฌ** | TokenEstimator (๋ชจ๋ธ๋ณ„ ๋น„์šฉ, CJK ๊ฐ€์ค‘์น˜). ์ƒํƒœ๋ฐ” ๋น„์šฉ ํ‘œ์‹œ | | **์Šคํ”Œ๋ฆฟ ๋ทฐ** | Code ํƒญ ํŒŒ์ผ ์ˆ˜์ • ์‹œ ์ž๋™ ํ”„๋ฆฌ๋ทฐ, AutoPreview ์„ค์ • | | **๋‹ค์ค‘ ์„œ๋ฒ„** | RegisteredModel์— endpoint/apiKey ํ•„๋“œ. ๋ชจ๋ธ๋ณ„ ์„œ๋ฒ„ ๋ผ์šฐํŒ… (Ollama/vLLM) | | **๋Œ€ํ™”๋ณ„ ์„ค์ •** | Permission/DataUsage/Mood๋ฅผ ๋Œ€ํ™”๋ณ„ ๋…๋ฆฝ ์ €์žฅยท๋ณต์› | | **DiffService** | LCS ๊ธฐ๋ฐ˜ ๋ผ์ธ diff (Added/Removed/Equal). GetSummary() ํ†ต๊ณ„ | ### v0.2.2 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **AX.md ํ”„๋กœ์ ํŠธ ๋ฌธ๋งฅ ํŒŒ์ผ** | ์ž‘์—… ํด๋”์— AX.md๋ฅผ ๋งŒ๋“ค๋ฉด Cowork/Code ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ž๋™ ์ฃผ์ž…. ์ƒ์œ„ 3๋‹จ๊ณ„๊นŒ์ง€ ํƒ์ƒ‰, ์ตœ๋Œ€ 8000์ž | | **ํŒ ์•Œ๋ฆผ ์‹œ์Šคํ…œ** | Cowork/Code ํƒญ ์ „ํ™˜ ์‹œ 24๊ฐœ ์‚ฌ์šฉ๋ฒ• ํŒ ๋žœ๋ค ํ‘œ์‹œ. ์„ค์ •: ํ‘œ์‹œ ์—ฌ๋ถ€(ShowTips) + ์ž๋™ ์‚ฌ๋ผ์ง ์‹œ๊ฐ„(TipDurationSeconds, 0~30์ดˆ) | | **๊ฐœ๋ฐœ์ž ๋ชจ๋“œ** | ์„ค์ • โ†’ ๊ณตํ†ต โ†’ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ (๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณดํ˜ธ). ๋„๊ตฌ ํ˜ธ์ถœ ํŒŒ๋ผ๋ฏธํ„ฐ/๊ฒฐ๊ณผ ์ƒ์„ธ ํ‘œ์‹œ + ์Šคํ…๋ณ„ ์Šน์ธ/๊ฑด๋„ˆ๋›ฐ๊ธฐ/์ค‘๋‹จ | | **ํ†ต๊ณ„ ๊ฐ•ํ™”** | DailyUsageStats์— ChatCounts(ํƒญ๋ณ„), TotalTokens/PromptTokens/CompletionTokens ์ถ”๊ฐ€. ํ†ต๊ณ„ ์œˆ๋„์šฐ์— ๋Œ€ํ™” ๋นˆ๋„ + ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ 14์ผ ๋ง‰๋Œ€ ์ฐจํŠธ | | **๋ฌด์ง€๊ฐœ ๊ธ€๋กœ์šฐ** | ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ ์ž…๋ ฅ์ฐฝ ํ…Œ๋‘๋ฆฌ์— 7์ƒ‰ ๋ฌด์ง€๊ฐœ ๊ทธ๋ผ๋ฐ์ด์…˜ ํšŒ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜ (2์ดˆ, LinearGradientBrush ํšŒ์ „) | | **๋Ÿฐ์ฒ˜ ์ค‘๋ณต ์ œ๊ฑฐ** | IndexService: Path ๊ธฐ๋ฐ˜ ์ค‘๋ณต ๋ฐฉ์ง€. CommandResolver: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ๊ฐ™์€ Path ํ•„ํ„ฐ๋ง (2์ค‘ ๋ฐฉ์–ด) | ### v0.2.1 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **Code ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๊ณ ๋„ํ™”** | Claude Code/OpenCode ๋ฒค์น˜๋งˆํฌ ๊ธฐ๋ฐ˜ 8๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ (ORIENTโ†’BASELINEโ†’ANALYZEโ†’PLANโ†’IMPLEMENTโ†’VERIFYโ†’GITโ†’REPORT). ํ…Œ์ŠคํŠธ ์šฐ์„ , ๋ณ€๊ฒฝ ์˜ํ–ฅ ๋ถ„์„, ์ž๊ธฐ ๊ฒ€์ฆ | | **GitTool** | ์‚ฌ๋‚ด GitHub Enterprise ์—ฐ๋™. status/diff/log/add/commit/branch/checkout/stash/remote ์ง€์›. push/pull/fetch/rebase ์ฐจ๋‹จ (์‚ฌ์šฉ์ž ์ง์ ‘ ์ˆ˜ํ–‰) | | **BuildRunTool lint/format** | action="lint", action="format" ์ถ”๊ฐ€. ESLint/Prettier(JS), Ruff/Black(Python), dotnet format(C#), checkstyle(Maven) ์ž๋™ ๋งคํ•‘ | | **Grep ๊ฐ•ํ™”** | context_lines(0~5์ค„) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋งค์น˜ ์ „ํ›„ ์ฝ”๋“œ ํ‘œ์‹œ, case_sensitive ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ œ์–ด | | **FileEdit replace_all** | replace_all=true ์‹œ ๋ชจ๋“  ๋งค์น˜ ์ผ๊ด„ ๊ต์ฒด. false๋ฉด ๊ธฐ์กด ์œ ์ผ์„ฑ ๊ฒ€์ฆ ์œ ์ง€ | | **๋ฃจํŠธ ๋“œ๋ผ์ด๋ธŒ ์ฐจ๋‹จ** | C:\, D:\ ๋“ฑ ์ตœ์ƒ์œ„ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จ (ํ•˜์œ„ ํด๋” ์„ ํƒ ํ•„์ˆ˜) | | **ํ”„๋ฆฌ์…‹ ์ˆœ์„œ ์ •๋ ฌ** | TopicPreset.Order ํ•„๋“œ ์ถ”๊ฐ€, JSON์—์„œ order ๊ฐ’์œผ๋กœ ํ‘œ์‹œ ์ˆœ์„œ ์ œ์–ด | | **์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ ๊ฐœ์„ ** | Cowork/Code: ํ”„๋ฆฌ์…‹ ์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ, ์ปค์Šคํ…€ ํ”„๋ฆฌ์…‹ `__custom__` ํ†ตํ•ฉ ๋ถ„๋ฅ˜ | | **์—์ด์ „ํŠธ ์ด๋ฆ„ ๋งคํ•‘** | Code ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์—์ด์ „ํŠธ ์ด๋ฆ„ (์ฝ”๋“œ๊ฐœ๋ฐœ/๋ฆฌํŒฉํ„ฐ๋ง/์ฝ”๋“œ๋ฆฌ๋ทฐ/๋ณด์•ˆ์ ๊ฒ€/ํ…Œ์ŠคํŠธ) + ๋Œ€ํ™” ์ด๋ ฅ ์•„์ด์ฝ˜ ์ •ํ™• ํ‘œ์‹œ | | **AI Agent ์ƒ์„ธ ๊ฐ€์ด๋“œ** | ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ์— Chat/Cowork/Code 3ํƒญ ์ƒ์„ธ ์„ค๋ช…, ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ (๋ฐฑ์—… ํ•„์ˆ˜), ๊ณตํ†ต ๊ธฐ๋Šฅ ์•ˆ๋‚ด | | **๋ณด์•ˆ ์ ๊ฒ€ ๋ฆฌ๋„ค์ด๋ฐ** | "๋ณด์•ˆ ์ทจ์•ฝ์  ์ ๊ฒ€" โ†’ "๋ณด์•ˆ ์ ๊ฒ€"์œผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ | ### v0.2.0 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **Code ํƒญ ํ™œ์„ฑํ™”** | ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ํƒญ ํ™œ์„ฑํ™” โ€” ์ฝ”๋“œ ๊ฐœ๋ฐœ, ๋ฆฌํŒฉํ„ฐ๋ง, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ณด์•ˆ ์ ๊ฒ€, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ 5๊ฐœ ํ”„๋ฆฌ์…‹ | | **DevEnvDetectTool** | IDE(VS Code, Visual Studio, IntelliJ, PyCharm) + ๋Ÿฐํƒ€์ž„(dotnet, python/conda, java, node, gcc) + ๋นŒ๋“œ๋„๊ตฌ(MSBuild, Maven, Gradle, CMake) ์ž๋™ ๊ฐ์ง€. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ+PATH+ํ™˜๊ฒฝ๋ณ€์ˆ˜, 60์ดˆ ์บ์‹œ | | **BuildRunTool** | ํ”„๋กœ์ ํŠธ ํƒ€์ž… ๊ฐ์ง€(*.csproj, pom.xml, package.json ๋“ฑ 7์ข…) + ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ/์‹คํ–‰ ๋ช…๋ น ์ž๋™ ๋งคํ•‘ | | **CodeSettings** | Nexus URL, NuGet/PyPI/Maven/npm ์ €์žฅ์†Œ ์„ค์ •, ์„ ํ˜ธ IDE ๊ฒฝ๋กœ, ๋นŒ๋“œ ํƒ€์ž„์•„์›ƒ(30~300์ดˆ), ์™„๋ฃŒ ์•Œ๋ฆผ | | **Code ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ** | ๋ถ„์„โ†’๊ณ„ํšโ†’๊ตฌํ˜„โ†’๊ฒ€์ฆโ†’๋ณด๊ณ  5๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ, ์–ธ์–ด๋ณ„ ๊ฐ€์ด๋“œ๋ผ์ธ(C#/Python/Java/C++/JS), ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ ์ฃผ์ž… | | **์„ค์ • UI** | Code ํƒญ ์ „์šฉ ์„ค์ • ํŒจ๋„ โ€” Nexus ์ €์žฅ์†Œ, ์–ธ์–ด๋ณ„ ์†Œ์Šค URL, IDE ๊ฒฝ๋กœ, ๋นŒ๋“œ ํƒ€์ž„์•„์›ƒ, ์™„๋ฃŒ ์•Œ๋ฆผ | | **๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋Ÿฌ ์™„์„ฑ** | ํ…Œ์ด๋ธ”(`\|`), ์ธ์šฉ(`>`), ์ทจ์†Œ์„ (`~~`), ๋งํฌ(`[text](url)`) ์ง€์› ์ถ”๊ฐ€ | | **๋ฉ”์‹œ์ง€ ์‚ญ์ œ** | ์šฐํด๋ฆญ โ†’ "์ดํ›„ ๋ฉ”์‹œ์ง€ ๋ชจ๋‘ ์‚ญ์ œ" (ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ + ์žฌ๋ Œ๋”๋ง) | | **ํƒญ ๋‹จ์ถ•ํ‚ค** | Ctrl+1=Chat, Ctrl+2=Cowork, Ctrl+3=Code | | **์—๋Ÿฌ ๋ณต๊ตฌ UI** | LLM ์˜ค๋ฅ˜ ์‹œ "์žฌ์‹œ๋„" ๋ฒ„ํŠผ ์ž๋™ ํ‘œ์‹œ | | **์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ ๊ฐœ์„ ** | Cowork/Code: ํ”„๋ฆฌ์…‹ ์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ, ์ปค์Šคํ…€ ํ”„๋ฆฌ์…‹ ํ†ตํ•ฉ ๋ถ„๋ฅ˜ | | **์—์ด์ „ํŠธ ์ด๋ฆ„ ํ™•์žฅ** | Code ํ”„๋ฆฌ์…‹๋ณ„ ์—์ด์ „ํŠธ ์ด๋ฆ„ ๋งคํ•‘ (์ฝ”๋“œ ๊ฐœ๋ฐœ/๋ฆฌํŒฉํ„ฐ๋ง/๋ฆฌ๋ทฐ/๋ณด์•ˆ/ํ…Œ์ŠคํŠธ) | | **์ตœ๋Œ€ํ™” ๋ฒ„ํŠผ** | ํƒ€์ดํ‹€๋ฐ”์— ์ตœ์†Œํ™”-์ตœ๋Œ€ํ™”-๋‹ซ๊ธฐ 3๋ฒ„ํŠผ | | **์„œ๋ธŒ ๋ฐ”** | ํƒญ ๋ฐ” ์•„๋ž˜์— ๋Œ€ํ™” ์ œ๋ชฉ(์ขŒ) + ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฒ„ํŠผ(์šฐ) ๋ถ„๋ฆฌ ๋ฐฐ์น˜ | | **์™„๋ฃŒ ์•Œ๋ฆผ** | Cowork/Code ์—์ด์ „ํŠธ ์™„๋ฃŒ ์‹œ ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด ์•Œ๋ฆผ | ### v0.1.1 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **WebView2 ํ”„๋ฆฌ๋ทฐ** | IE ๊ธฐ๋ฐ˜ WebBrowser โ†’ Chromium ๊ธฐ๋ฐ˜ WebView2 ๊ต์ฒด. AppData์— ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ง€์ • | | **Markdown ํ”„๋ฆฌ๋ทฐ** | Markdig NuGet์œผ๋กœ .md ํŒŒ์ผ์„ ๋ฌด๋“œ CSS ์ ์šฉ HTML ๋ Œ๋”๋ง | | **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ•ํ™”** | ๋ผ์ธ ๋ฒˆํ˜ธ, ์ „์ฒดํ™”๋ฉด ํŒ์—…, ํŒŒ์ผ ์ €์žฅ ๋ฒ„ํŠผ, ์–ธ์–ด๋ณ„ ํ™•์žฅ์ž ์ž๋™ ์ถ”์ฒœ | | **๋ฌด๋“œ ๊ฐค๋Ÿฌ๋ฆฌ** | ํ…์ŠคํŠธ ๋ชฉ๋ก โ†’ 2์—ด ๋น„์ฃผ์–ผ ์นด๋“œ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ฌด๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์„ ํƒ | | **์—์ด์ „ํŠธ ์ง„ํ–‰๋ฅ  ์Šคํ‹ฐํ‚ค ๋ฐ”** | ๋ฉ”์‹œ์ง€ ์ƒ๋‹จ ๊ณ ์ • ๋ฐ” โ€” ๋‹จ๊ณ„/ํผ์„ผํŠธ/๊ฒฝ๊ณผ์‹œ๊ฐ„, ์™„๋ฃŒ ์‹œ ํŽ˜์ด๋“œ์•„์›ƒ | | **ํŒŒ์ผ ๋น ๋ฅธ ์ž‘์—…** | ์ƒ์„ฑ ํŒŒ์ผ ๋ฐฐ๋„ˆ์— [ํ”„๋ฆฌ๋ทฐ][์—ด๊ธฐ][ํด๋”][๋ณต์‚ฌ] 4๊ฐœ ์ธ๋ผ์ธ ์•ก์…˜ ๋ฒ„ํŠผ | | **์ž‘์—… ํด๋” ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ** | ์ ‘์ด์‹ TreeView, ์ง€์—ฐ ๋กœ๋”ฉ, ์šฐํด๋ฆญ ๋ฉ”๋‰ด(์—ด๊ธฐ/์‚ญ์ œ/์ด๋ฆ„๋ณ€๊ฒฝ), ์—์ด์ „ํŠธ ํŒŒ์ผ ์ƒ์„ฑ ์‹œ ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ, ์ƒํƒœ ์ €์žฅ | | **document_review ๋„๊ตฌ** | ๋นˆ ์„น์…˜, ํ”Œ๋ ˆ์ด์Šคํ™€๋”, ๋‚ ์งœ ์ •ํ•ฉ์„ฑ, HTML ํƒœ๊ทธ ๊ท ํ˜•, ๋ฐ˜๋ณต ํ…์ŠคํŠธ, ๊ธฐ๋Œ€ ์„น์…˜ ๋ˆ„๋ฝ ๊ฒ€์‚ฌ | | **format_convert ๋„๊ตฌ** | mdโ†’html, htmlโ†’txt, csvโ†’html, mdโ†’txt ๋ณ€ํ™˜. ๋ฏธ์ง€์› ๋ณ€ํ™˜์€ ๋Œ€์•ˆ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ๋‚ด | | **๋Œ€ํ™” ๋‚ด ๊ฒ€์ƒ‰** | Ctrl+F ๊ฒ€์ƒ‰ ๋ฐ”, ์ด์ „/๋‹ค์Œ ํƒ์ƒ‰, ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ ํ‘œ์‹œ, ESC ๋‹ซ๊ธฐ | | **๋ฉ”์‹œ์ง€ ์šฐํด๋ฆญ ๋ฉ”๋‰ด** | ํ…์ŠคํŠธ ๋ณต์‚ฌ, ๋งˆํฌ๋‹ค์šด ๋ณต์‚ฌ, ์ธ์šฉ ๋‹ต์žฅ, ์žฌ์ƒ์„ฑ | | **ํ† ์ŠคํŠธ ์•Œ๋ฆผ** | ๋ณต์‚ฌ/์ €์žฅ ๋“ฑ ์•ก์…˜ ์‹œ ํ•˜๋‹จ ์ค‘์•™ ํŽ˜์ด๋“œ์ธ-์•„์›ƒ ์•Œ๋ฆผ | | **๋Œ€ํ™” ๋ชฉ๋ก ์„ฑ๋Šฅ** | ๋ ˆ์ด์ง€ ๋กœ๋”ฉ (50๊ฐœ ๋‹จ์œ„ + "๋” ๋ณด๊ธฐ"), ์ œ๋ชฉ+๋‚ด์šฉ ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (Preview ํ•„๋“œ) | | **์˜์‚ฌ๊ฒฐ์ • UI** | ์Šน์ธ/์ˆ˜์ •/์ทจ์†Œ ๋ฒ„ํŠผ ์„ ํƒ ํ›„ ์ž๋™ ์ˆจ๊น€ + ๊ฒฐ๊ณผ ๋ผ๋ฒจ ํ‘œ์‹œ | | **์ฑ„ํŒ… ๋ฐ˜์‘ํ˜• ๋„ˆ๋น„** | ์ฐฝ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ๋ฒ„๋ธ” MaxWidth ์ž๋™ ์กฐ์ ˆ (์ตœ์†Œ 500, ์ตœ๋Œ€ 1200) | | **์ปค์Šคํ…€ ํ”„๋ฆฌ์…‹/๋ฌด๋“œ** | ์•„์ด์ฝ˜ ์…‹ ์„ ํƒ UI (5์นดํ…Œ๊ณ ๋ฆฌร—8์•„์ด์ฝ˜), ์ปค์Šคํ…€ ๋ฌด๋“œ CSS ํŽธ์ง‘, ํ”„๋ฆฌ์…‹ ๋ฐฐ์ง€ | | **ํƒญ ์ „ํ™˜ ์•ˆ์ •ํ™”** | Auto ๊ถŒํ•œ ๊ฒฝ๊ณ  ์ดˆ๊ธฐํ™”, ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ ์ƒํƒœ ๋ณต์›, ์•ˆ๋‚ด๋ฌธ๊ตฌ ๊ฐฑ์‹  | | **๋Ÿฐ์ฒ˜ ๊ฐœ์„ ** | ํผ์ง€ ๊ฒ€์ƒ‰ Shift+Enter๋กœ ํด๋” ์—ด๊ธฐ, ์›น๊ฒ€์ƒ‰ ๊ฒฝ๊ณ ๋ฌธ ์ˆ˜์ • | ### v0.1.0 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **Cowork ์—์ด์ „ํŠธ ๋ฃจํ”„ ์—”์ง„** | LLM Function Calling ๊ธฐ๋ฐ˜ Planโ†’Tool Executeโ†’Observeโ†’Re-evaluate ๋ฐ˜๋ณต ๋ฃจํ”„. ์ตœ๋Œ€ 25ํšŒ ๋ฐ˜๋ณต, ์‹คํŒจ ์‹œ Self-Reflection ์ž๋™ ์žฌ์‹œ๋„ (์ตœ๋Œ€ 3ํšŒ) | | **๋„๊ตฌ ์‹œ์Šคํ…œ (8์ข…)** | file_read, file_write, file_edit, glob, grep, process, folder_map, document_read | | **๋ฌธ์„œ ์ƒ์„ฑ ์Šคํ‚ฌ (6์ข…)** | excel_create (.xlsx), docx_create (.docx), csv_create (.csv), markdown_create (.md), html_create (.html), script_create (.bat/.ps1) | | **๋””์ž์ธ ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ** | 10์ข… CSS ๋ฌด๋“œ ํ…œํ”Œ๋ฆฟ (modern, professional, creative, minimal, elegant, dark, colorful, corporate, magazine, dashboard). ๋Œ€ํ™”์ฐฝ ํ•˜๋‹จ ๋ฌด๋“œ ์•„์ด์ฝ˜ ๋ฐ”๋กœ ์„ ํƒ | | **Task Decomposition** | LLM ์‘๋‹ต์—์„œ ๊ณ„ํš ๋‹จ๊ณ„ ์ž๋™ ์ถ”์ถœ โ†’ ์ง„ํ–‰๋ฅ  UI (๋‹จ๊ณ„ ์นด๋“œ + ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ”) | | **Thinking UI** | LLM ์ถ”๋ก  ๊ณผ์ •์„ "Thinking..." ๋ฐฐ๋„ˆ๋กœ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ | | **Context Condenser** | ํ† ํฐ ์ดˆ๊ณผ ์‹œ ์ด์ „ ๋Œ€ํ™”๋ฅผ LLM์œผ๋กœ ์ž๋™ ์š”์•ฝํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ๊ด€๋ฆฌ | | **Folder Map ๋„๊ตฌ** | ์ž‘์—… ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ ์ž๋™ ์ƒ์„ฑ (depth/filter ์ง€์›, ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์ž๋™ ์ œ์™ธ) | | **Diff Preview** | file_edit ๋„๊ตฌ ์‹คํ–‰ ์‹œ unified diff ์ƒ์„ฑ + ์ƒ‰์ƒ ํ•˜์ด๋ผ์ดํŒ… UI (์ถ”๊ฐ€=์ดˆ๋ก, ์‚ญ์ œ=๋นจ๊ฐ•) | | **๋ฌธ์„œ ์ฝ๊ธฐ ๋„๊ตฌ** | PDF (PdfPig), DOCX, XLSX (OpenXml), CSV/TXT ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹ ํ…์ŠคํŠธ ์ถ”์ถœ. ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์‹œ ํด๋” ๋ฐ์ดํ„ฐ ์ž๋™ ์ฐธ์กฐ | | **ํด๋” ๋ฐ์ดํ„ฐ ํ™œ์šฉ ์„ค์ •** | ์ ๊ทน ํ™œ์šฉ(์ž๋™ ํƒ์ƒ‰) / ์†Œ๊ทน ํ™œ์šฉ(์š”์ฒญ ์‹œ) / ํ™œ์šฉํ•˜์ง€ ์•Š์Œ โ€” ์„ค์ • + ๋Œ€ํ™”์ฐฝ ํ•˜๋‹จ ๋ฉ”๋‰ด์—์„œ ์ „ํ™˜ | | **Cowork ์„ค์ • UI** | ํŒŒ์ผ ์ ‘๊ทผ ๊ถŒํ•œ, ์ถœ๋ ฅ ํ˜•์‹, ์ž๋™ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์—์ด์ „ํŠธ ๋ฐ˜๋ณต/์žฌ์‹œ๋„ ํšŸ์ˆ˜, ๋กœ๊ทธ ์ƒ์„ธ๋„, ๋ฐ์ดํ„ฐ ํ™œ์šฉ ์ˆ˜์ค€ | | **์ปค์Šคํ…€ ํด๋” ๋ฉ”๋‰ด** | ์‹œ์Šคํ…œ ContextMenu โ†’ ์ปค์Šคํ…€ Popup (Border+MouseLeftButtonUp ํŒจํ„ด, 14px ํฐํŠธ) | | **๋ชจ๋ธ ์„ ํƒ๊ธฐ ๊ฐœ์„ ** | ์„œ๋น„์Šค ๋ณ€๊ฒฝ ์‹œ ํŒ์—… ์œ ์ง€, ๋ชจ๋ธ ๋ชฉ๋ก ๋™์  ์žฌ๊ตฌ์„ฑ (closeOnClick ํŒจํ„ด) | | **Gemini ๋ชจ๋ธ ์ˆ˜์ •** | ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ ID(gemini-3-flash ๋“ฑ) โ†’ ์‹ค์ œ ๋ชจ๋ธ(gemini-2.5-pro/flash ๋“ฑ)๋กœ ๊ต์ฒด | | **์—์ด์ „ํŠธ ์ด๋ฒคํŠธ UI** | Planning/StepStart/StepDone/ToolCall/ToolResult ๋ฐฐ๋„ˆ + ์ ‘์ด์‹ ์ƒ์„ธ ๋ณด๊ธฐ | ### v0.0.7 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **Chat/Cowork/Code 3ํƒญ UI** | ์ƒ๋‹จ ํƒญ์„ Agent ๋‹จ์ผ โ†’ Chat \| Cowork \| Code 3ํƒญ์œผ๋กœ ์ „ํ™˜. Cowork/Code ํƒญ ํ™œ์„ฑํ™” (Phase 2/3 ์ค€๋น„) | | **์ž‘์—… ํด๋” ์„ ํƒ ๋ฐ”** | ์ž…๋ ฅ ๋ฐ” ์ƒ๋‹จ์— ํด๋” ๊ฒฝ๋กœ ํ‘œ์‹œ + ์„ ํƒ/ํ•ด์ œ ๋ฒ„ํŠผ. Cowork/Code ํƒญ์—์„œ ์ž๋™ ํ‘œ์‹œ. ์ตœ๊ทผ ํด๋” 10๊ฐœ ๊ธฐ์–ต | | **ํŒŒ์ผ ์ปจํ…์ŠคํŠธ ์ฒจ๋ถ€** | ํŒŒ์ผ ์ฒจ๋ถ€ ๋ฒ„ํŠผ + ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ํŒŒ์ผ์„ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€ (์ตœ๋Œ€ 10MB). ํ…์ŠคํŠธ ํŒŒ์ผ ๋‚ด์šฉ ์ž๋™ ์‚ฝ์ž… | | **๊ถŒํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„** | 3๋‹จ๊ณ„ ํŒŒ์ผ ์ ‘๊ทผ ๊ถŒํ•œ: Ask(๋งค๋ฒˆ ํ™•์ธ) / Auto(์ž๋™ ํ—ˆ์šฉ) / Deny(์ฐจ๋‹จ). ์„ค์ •์—์„œ ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ | | **๋Œ€ํ™” ์ฃผ์ œ ํ”„๋ฆฌ์…‹ 7์ข…** | ์ผ๋ฐ˜/๊ฒฝ์˜/์—ฐ๊ตฌ๊ฐœ๋ฐœ/์ œํ’ˆ๋ถ„์„/์ˆ˜์œจ๋ถ„์„/์ œ์กฐ๊ธฐ์ˆ /์‹œ์Šคํ…œ โ€” JSON ๊ธฐ๋ฐ˜ ํ”„๋ฆฌ์…‹ ๋™์  ๋กœ๋“œ (EmbeddedResource) | | **๋Œ€ํ™” ๋‚ด๋ณด๋‚ด๊ธฐ ํ™•์žฅ** | Markdown + JSON + HTML + Text 4์ข… ํฌ๋งท ์ง€์›. HTML์€ ๋‹คํฌ ํ…Œ๋งˆ ์Šคํƒ€์ผ ๋‚ด์žฅ | | **๋ฉ”์‹œ์ง€ ํƒ€์ž„์Šคํƒฌํ”„** | ์‚ฌ์šฉ์ž/AI ๋ฉ”์‹œ์ง€์— HH:mm ์‹œ๊ฐ„ ํ‘œ์‹œ | | **๊ฒฉ๋ ค ์•Œ๋ฆผ ์ฃผ๊ธฐ ํƒ€์ด๋จธ** | ์ฃผ๊ธฐ์  ํƒ€์ด๋จธ ์ถ”๊ฐ€ โ€” ํ™”๋ฉด ์ž ๊ธˆ ์—†์ด๋„ ์„ค์ • ๊ฐ„๊ฒฉ๋งˆ๋‹ค ๊ฒฉ๋ ค ๋ฌธ๊ตฌ ํŒ์—… ํ‘œ์‹œ | | **์ปค์Šคํ…€ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค** | ์•ฑ ์ „์ฒด ๊ธฐ๋ณธ MessageBox๋ฅผ ํ…Œ๋งˆ ํ†ตํ•ฉ ์ปค์Šคํ…€ ๋‹ค์ด์–ผ๋กœ๊ทธ๋กœ ๊ต์ฒด (์ธ์Šคํ†จ๋Ÿฌ ํฌํ•จ) | ### v0.0.6 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์ŠคํŠธ๋ฆฌ๋ฐ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ ์ˆ˜์ •** | 80ms ์“ฐ๋กœํ‹€ + Task.Delay โ†’ ์ฒญํฌ ๋‹จ์œ„ ๊ฐฑ์‹  + `Dispatcher.InvokeAsync(Background)` ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜. ์‘๋‹ต์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ‘œ์‹œ | | **Shift+Enter ์ค„๋ฐ”๊ฟˆ** | `AcceptsReturn="True"` + PreviewKeyDown ํ•ธ๋“ค๋Ÿฌ. Shift+Enter=์ค„๋ฐ”๊ฟˆ, Enter=์ „์†ก. ์ž…๋ ฅ ์˜์—ญ ์ž๋™ ์ˆ˜์ง ํ™•์žฅ (MinHeight 40 โ†’ MaxHeight 160) | | **ํ”„๋กฌํ”„ํŠธ ์นด๋“œ ์›Œํ„ฐ๋งˆํฌ** | ํ”„๋กฌํ”„ํŠธ ์นด๋“œ ์„ ํƒ ์‹œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ์‹ค์ œ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ์›Œํ„ฐ๋งˆํฌ(placeholder) ์˜ค๋ฒ„๋ ˆ์ด๋กœ ํ‘œ์‹œ. ์ž…๋ ฅ ์‹œ ์ž๋™ ์‚ฌ๋ผ์ง | | **์ข‹์•„์š”/์‹ซ์–ด์š” ์ƒํ˜ธ ๋ฐฐํƒ€ ํ† ๊ธ€** | ์ข‹์•„์š”โ†”์‹ซ์–ด์š” ์ƒํ˜ธ ๋ฐฐํƒ€ โ€” ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค๋ฅธ ์ชฝ ์ž๋™ ํ•ด์ œ. `resetSibling`/`registerReset` ์ฝœ๋ฐฑ ํŒจํ„ด | | **๋””์Šคํฌ ์šฉ๋Ÿ‰ ์ดˆ๊ณผ ์ž๋™ ์‚ญ์ œ** | ๋“œ๋ผ์ด๋ธŒ ์‚ฌ์šฉ๋ฅ  98% ์ดˆ๊ณผ ์‹œ ํ•€ ๊ณ ์ • ์ œ์™ธ ์˜ค๋ž˜๋œ ๋Œ€ํ™”๋ถ€ํ„ฐ ์ž๋™ ์‚ญ์ œ (`PurgeForDiskSpace`). 2% ์—ฌ์œ  ํ™•๋ณด ํ›„ ์ค‘๋‹จ | | **์šฐํด๋ฆญ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด** | ๋Œ€ํ™” ์ œ๋ชฉ์—์„œ ์šฐํด๋ฆญ ์‹œ ์ปค์Šคํ…€ ๋ฉ”๋‰ด ๋ฐ”๋กœ ํ‘œ์‹œ (ํŽœ ์•„์ด์ฝ˜ ํด๋ฆญ ๋ถˆํ•„์š”). `MouseRightButtonDown` ์ด๋ฒคํŠธ | | **๋Œ€ํ™” ๋”๋ธ”ํด๋ฆญ ์˜ค๋ฅ˜ ์ˆ˜์ •** | Visual ์ž์‹ ์ธ๋ฑ์Šค ์ถฉ๋Œ ์˜ค๋ฅ˜ โ€” `RemoveAt`+`Insert` ํŒจํ„ด์œผ๋กœ ์•ˆ์ „ ๊ต์ฒด + ์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘ ๋Œ€ํ™” ์ „ํ™˜ ์‹œ `_streamCts?.Cancel()` ์ฒ˜๋ฆฌ | ### v0.0.5 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **AX Agent ๋Œ€ํ™” ์ฐฝ** | `!` ์˜ˆ์•ฝ์–ด๋กœ AI ๋Œ€ํ™” ์ฐฝ (ChatWindow) ๊ตฌํ˜„. ์ขŒ์ธก ๋Œ€ํ™” ๋ชฉ๋ก + ์šฐ์ธก ๋ฉ”์‹œ์ง€ ์˜์—ญ 2ํŒจ๋„ ๊ตฌ์กฐ. Claude Desktop ์Šคํƒ€์ผ ๋””์ž์ธ | | **LLM 4์ข… ์„œ๋น„์Šค ์ง€์›** | Ollama, vLLM(OpenAI ํ˜ธํ™˜), Gemini, Claude API ํ†ตํ•ฉ. ์„ค์ • ์ฐฝ์—์„œ ์„œ๋น„์Šค/๋ชจ๋ธ ๋“ฑ๋ก ๋ฐ ์ „ํ™˜ | | **์ŠคํŠธ๋ฆฌ๋ฐ + ํƒ€์ดํ•‘ ํšจ๊ณผ** | SSE ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต. 12ms ํƒ€์ด๋จธ๋กœ 1~3๊ธ€์ž์”ฉ ํƒ€์ดํ•‘ ํšจ๊ณผ ํ‘œ์‹œ. ์ปค์„œ ๊นœ๋นก์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜ | | **๋งˆํฌ๋‹ค์šด + ์ฝ”๋“œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ** | ์ฝ”๋“œ ๋ธ”๋ก(10๊ฐœ ์–ธ์–ด ํ‚ค์›Œ๋“œ ํ•˜์ด๋ผ์ดํŒ…), ๋ชฉ๋ก, ๋ณผ๋“œ, ์ธ๋ผ์ธ ์ฝ”๋“œ, ๋ณต์‚ฌ ๋ฒ„ํŠผ | | **ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ํ‘œ์‹œ** | ๊ฐ ์„œ๋น„์Šค๋ณ„ ์‹ค์ œ ํ† ํฐ ํŒŒ์‹ฑ. k/m ๋‹จ์œ„ ํ‘œ๊ธฐ (1.2k, 2.3m). ์‘๋‹ต ์†Œ์š”์‹œ๊ฐ„(์ดˆ) ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ | | **ํ”„๋กฌํ”„ํŠธ ์นด๋“œ** | ๊ฐœ๋ฐœ์ž ๋ฏธ๋ฆฌ ์„ค์ • ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ (Tag ํ˜•์‹). ์นด๋“œ ํด๋ฆญ ์‹œ SystemCommand ์ž๋™ ์‚ฝ์ž… + placeholder ์•ˆ๋‚ด | | **์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ** | ์„ค์ •์—์„œ ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ. ์ž…๋ ฅ ๋ฐ” ์™ผ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ์ ‘๊ทผ | | **๋Œ€ํ™” ๊ด€๋ฆฌ** | ๊ณ ์ •/์ด๋ฆ„๋ณ€๊ฒฝ/๋ถ„๋ฅ˜(6์ข… ์นดํ…Œ๊ณ ๋ฆฌ)/์‚ญ์ œ. ์ปค์Šคํ…€ Popup ๋ฉ”๋‰ด. ์ธ๋ผ์ธ ์ œ๋ชฉ ํŽธ์ง‘ (ํด๋ฆญ โ†’ ์ž…๋ ฅ โ†’ Enter) | | **ํ”ผ๋“œ๋ฐฑ ์˜์†์„ฑ** | ๋ฉ”์‹œ์ง€๋ณ„ ์ข‹์•„์š”/์‹ซ์–ด์š” ์ƒํƒœ ์ €์žฅ ๋ฐ ๋Œ€ํ™” ๋กœ๋“œ ์‹œ ๋ณต์› | | **์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ํŽธ์ง‘/๋ณต์‚ฌ** | ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€์— ํŽธ์ง‘/๋ณต์‚ฌ ๋ฒ„ํŠผ ์ถ”๊ฐ€. ํŽธ์ง‘ ์‹œ ํ•ด๋‹น ๋ฉ”์‹œ์ง€ ์ดํ›„ ์žฌ์ƒ์„ฑ | | **์ปค์Šคํ…€ Popup ๋ฉ”๋‰ด ํ†ต์ผ** | ๋ชจ๋“  ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ContextMenu โ†’ ์ปค์Šคํ…€ Popup (12px ๋ผ์šด๋“œ, ํ˜ธ๋ฒ„, ๋“œ๋กญ์„€๋„) ์œผ๋กœ ์ „ํ™˜ | | **์บก์ฒ˜ ์ˆœ์„œ ๋ณ€๊ฒฝ** | cap ๋ช…๋ น ์•„์ดํ…œ ์ˆœ์„œ: ์˜์—ญ ์„ ํƒ โ†’ ํ™œ์„ฑ ์ฐฝ โ†’ ์Šคํฌ๋กค โ†’ ์ „์ฒด ํ™”๋ฉด (์‚ฌ์šฉ ๋นˆ๋„์ˆœ) | | **์ง€์—ฐ ์บก์ฒ˜** | Shift+Enter๋กœ ์บก์ฒ˜ ์•„์ดํ…œ ์„ ํƒ ์‹œ ํƒ€์ด๋จธ(3์ดˆ/5์ดˆ/10์ดˆ) ์„ ํƒ ํ›„ ์นด์šดํŠธ๋‹ค์šด ์บก์ฒ˜ | | **๋ฒ„๊ทธ ์ˆ˜์ •** | ๋ชฉ๋ก ํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ(StackPanelโ†’Grid), ํŽธ์ง‘ Visual ์ž์‹ ์˜ค๋ฅ˜, + ๋ฒ„ํŠผ ํด๋ฆญ ๋ถˆ๊ฐ€, ์ œ๋ชฉ ํŽธ์ง‘ ์ด์ค‘ ์ปค๋ฐ‹ ํฌ๋ž˜์‹œ | ### v0.0.4 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์„ค์ • ์•Œ๋ฆผ ๋ฐ”๋กœ๋ณด๊ธฐ ๋ฒ„ํŠผ** | ์•Œ๋ฆผ ํƒญ ํ•˜๋‹จ์— "๋ฐ”๋กœ๋ณด๊ธฐ" ๋ฒ„ํŠผ ์ถ”๊ฐ€. ์‹œ๊ฐ„ ๋ฏธ๋„๋ž˜ ์‹œ์—๋„ ์„ค์ •ํ•œ ์œ„์น˜ยทํ‘œ์‹œ ์‹œ๊ฐ„์œผ๋กœ ํŒ์—… ์ฆ‰์‹œ ํ™•์ธ ๊ฐ€๋Šฅ | | **๋Ÿฐ์ฒ˜ ์•ˆ๋‚ด ๋ฌธ๊ตฌ ๋žœ๋คํ™”** | ๊ณ ์ • ํ”Œ๋ ˆ์ด์Šคํ™€๋” "๋ฌด์—‡์„ ๋„์™€๋“œ๋ฆด๊นŒ์š”?" โ†’ 25์ข… ๋žœ๋ค ๋ฌธ๊ตฌ. ์ •์ค‘ํ•œ ์ธ์‚ฌ + ๊ธฐ๋Šฅ ํ™๋ณด(๊ณ„์‚ฐ๊ธฐยทํด๋ฆฝ๋ณด๋“œยท์›น๊ฒ€์ƒ‰ยท์ฆ๊ฒจ์ฐพ๊ธฐยท์Šค๋‹ˆํŽซยท์›Œํฌ์ŠคํŽ˜์ด์Šคยท์บก์ฒ˜ ๋“ฑ). ๋Ÿฐ์ฒ˜ ์—ด๋ฆด ๋•Œ๋งˆ๋‹ค ๊ต์ฒด. 5๊ฐœ๊ตญ์–ด ๋Œ€์‘(ko/en/ja/zh/vi) | | **๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ์•„์ด์ฝ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜** | ๋Ÿฐ์ฒ˜ ์ž…๋ ฅ์ฐฝ ์ขŒ์ธก 4๊ฐœ ํ”ฝ์…€์ด ์ˆœ์ฐจ์ ์œผ๋กœ Opacity ์ ๋ฉธ (4์ดˆ ์ฃผ๊ธฐ Forever). ๋””์Šคํ”Œ๋ ˆ์ด ํŒจ๋„ ํ”ฝ์…€ ์ ๋“ฑ ํ˜•์ƒํ™” | | **๊ธ€๋กœ๋ฒŒ ๋‹จ์ถ•ํ‚ค ์ฝค๋ณด๋ฐ•์Šค** | ๋ถˆ์•ˆ์ •ํ•œ ํ‚ค ๋…นํ™” ๋ฐฉ์‹ ์ œ๊ฑฐ โ†’ ๊ฒ€์ฆ๋œ 12์ข… ํ‚ค ์กฐํ•ฉ ์ฝค๋ณด๋ฐ•์Šค ์„ ํƒ์œผ๋กœ ๋ณ€๊ฒฝ. Alt+Space, Ctrl+Space, Ctrl+Alt+Space, Alt+X/A/Z, Ctrl+Shift+Space, Ctrl+`, Win+Space, Ctrl+Alt+A, Ctrl+;, F12 | | **ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ๊ฐœํŽธ** | "์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ณด๊ธฐ" ํ•ญ๋ชฉ ์‹ ๊ทœ ์ถ”๊ฐ€ (GlyphGuide = `\uE736`). "์ •๋ณด" โ†’ "๊ฐœ๋ฐœ์ž ์ •๋ณด"๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ + ์ข…๋ฃŒ ๋ฐ”๋กœ ์œ„๋กœ ์œ„์น˜ ์ด๋™ | | **์‚ฌ์šฉ ํ†ต๊ณ„ ํ™”๋ฉด FHD ์ตœ์ ํ™”** | ์ฐฝ ๋†’์ด 640โ†’900px, MinHeight 540โ†’700px. ์ฐจํŠธ ๋ง‰๋Œ€ ๋†’์ด 110โ†’88px (MaxBarHeight 80โ†’66). ์ž์ฃผ ์“ด ๋ช…๋ น์–ด ํ‘œ์‹œ ๊ฐœ์ˆ˜ 8โ†’10๊ฐœ. ์ธ๊ธฐ ๋ช…๋ น์–ดยท์ฆ๊ฒจ์ฐพ๊ธฐ ์„น์…˜ ๊ฐ„ ๋งˆ์ง„ ์ถ”๊ฐ€ | | **์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฌธ์„œ ๋ฐฐํฌ** | `Assets/AX Commander ์‚ฌ์šฉ๊ฐ€์ด๋“œ.htm` ๋นŒ๋“œ ์‹œ ์ถœ๋ ฅ ํด๋”์— ์ž๋™ ๋ณต์‚ฌ. ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด์—์„œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๊ธฐ. ๋ฒ„์ „ ์ด๋ ฅ ์„น์…˜ ํฌํ•จ (v0.0.0 ~ v0.0.4) | ### v0.0.3 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค 16์ข… ์ถ”๊ฐ€** | 1์ฐจ: F1(๋„์›€๋ง), F5(์ธ๋ฑ์Šค ์ƒˆ๋กœ ๊ณ ์นจ), Delete(ํ•ญ๋ชฉ ์ œ๊ฑฐ+ํ™•์ธ), Ctrl+L(์ž…๋ ฅ ์ดˆ๊ธฐํ™”), Ctrl+C(์ด๋ฆ„ ๋ณต์‚ฌ), Ctrl+Shift+C(๊ฒฝ๋กœ ๋ณต์‚ฌ), Ctrl+Shift+E(ํƒ์ƒ‰๊ธฐ ์—ด๊ธฐ), Ctrl+Enter(๊ด€๋ฆฌ์ž ์‹คํ–‰), Alt+Enter(์†์„ฑ ๋ณด๊ธฐ). 2์ฐจ: Ctrl+H(ํžˆ์Šคํ† ๋ฆฌ), Ctrl+R(์ตœ๊ทผ), Ctrl+B(์ฆ๊ฒจ์ฐพ๊ธฐ), Ctrl+K(๋‹จ์ถ•ํ‚ค ๋„์›€๋ง), Ctrl+1~9(N๋ฒˆ์งธ ์‹คํ–‰), F2(์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ), PageUp/Down(ํŽ˜์ด์ง€ ์Šคํฌ๋กค) | | **๊ฒฐ๊ณผ ๋ชฉ๋ก ๋ฒˆํ˜ธ ๋ฑƒ์ง€** | 1~9 ๋ฒˆํ˜ธ ํ‘œ์‹œ (IndexToNumberConverter). Ctrl+N์œผ๋กœ ์ฆ‰์‹œ ์‹คํ–‰ ์—ฐ๋™ | | **ํ† ์ŠคํŠธ ์˜ค๋ฒ„๋ ˆ์ด** | ๋ณ„๋„ ToastOverlay Border (๋…น์ƒ‰ ๋ฐฐ๊ฒฝ+์ฒดํฌ ์•„์ด์ฝ˜). ๊ฒฝ๋กœ ๋ณต์‚ฌ ๋“ฑ ๊ฒฐ๊ณผ ํ‘œ์‹œ, 2์ดˆ ์ž๋™ ์ˆจ๊น€ | | **๋„์›€๋ง ๊ฒ€์ƒ‰** | HelpDetailWindow ์ƒ๋‹จ์— SearchBox ์ถ”๊ฐ€. ์‹ค์‹œ๊ฐ„ ํ‚ค์›Œ๋“œ ํ•„ํ„ฐ๋ง (์ œ๋ชฉ/๋ช…๋ น/์„ค๋ช…/์นดํ…Œ๊ณ ๋ฆฌ) | | **์•ก์…˜ ๋ชจ๋“œ ํ™•์žฅ** | โ†’ ์ง„์ž… ์‹œ 7๊ฐœ ์˜ต์…˜: ๊ฒฝ๋กœ ๋ณต์‚ฌ, ์ „์ฒด ๊ฒฝ๋กœ ๋ณต์‚ฌ, ํƒ์ƒ‰๊ธฐ, ๊ด€๋ฆฌ์ž, ํ„ฐ๋ฏธ๋„, ์†์„ฑ ๋ณด๊ธฐ, ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ | | **๋„์›€๋ง ์ฐฝ 3ํƒญ ๋ฉ”๋‰ด ์žฌ์„ค๊ณ„** | ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฅผ ๊ฐœ์š”/๋‹จ์ถ•ํ‚ค ํ˜„ํ™ฉ/์˜ˆ์•ฝ์–ด ํ˜„ํ™ฉ 3ํƒญ์œผ๋กœ ๋ถ„๋ฆฌ. ํ•˜์œ„ ์นดํ…Œ๊ณ ๋ฆฌ ํƒญ ์œ ์ง€. ์ˆซ์žํ‚ค 1/2/3์œผ๋กœ ํƒญ ์ „ํ™˜ | | **ํ”„๋ฆฌํ”ฝ์Šค ๋ณ€๊ฒฝ** | `~` โ†’ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ด€๋ฆฌ (๊ธฐ์กด `!`), `cd` โ†’ ํด๋” ๋ณ„์นญ (๊ธฐ์กด `~`), `!` โ†’ ๋น„์–ด์žˆ์Œ (์‹ ๊ธฐ๋Šฅ ๋ฐฐ์ • ๊ฐ€๋Šฅ) | | **์„ค์ • ๋ฒ„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜** | SettingsService์— `MigrateIfNeeded()` ํ”„๋ ˆ์ž„์›Œํฌ ์ถ”๊ฐ€. ์ด์ „ ๋ฒ„์ „ settings.json์„ ์ตœ์‹  ์Šคํ‚ค๋งˆ๋กœ ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜. ์‹ ๊ทœ ํ”„๋กœํผํ‹ฐ๋Š” C# ๊ธฐ๋ณธ๊ฐ’ ์ž๋™ ์ ์šฉ. ๊ตฌ์กฐ ๋ณ€๊ฒฝ(ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋“ฑ)์€ ๋ฒ„์ „๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กœ์ง ์ˆœ์ฐจ ์‹คํ–‰ | | **ํŒŒ๊ดด์  ๋™์ž‘ ํ™•์ธ** | Delete ํ‚ค ์‹คํ–‰ ์‹œ MessageBox ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ (OK/Cancel) | | **ํ† ์ŠคํŠธ ์•Œ๋ฆผ** | LauncherWindow์— ShowToast() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€. ๊ฒฝ๋กœ ๋ณต์‚ฌ ๋“ฑ ๊ฒฐ๊ณผ๋ฅผ IndexStatusText์— ์ž„์‹œ ํ‘œ์‹œ | | **Windows ์‹คํ–‰ ๋ช…๋ น (`^`)** | `^ notepad`, `^ cmd`, `^ calc` ๋“ฑ Win+R ์‹คํ–‰ ์ฐฝ๊ณผ ๋™์ผํ•œ ๋ช…๋ น ์‹คํ–‰. RunHandler ์‹ ๊ทœ ์ถ”๊ฐ€ | | **๊ธฐ๋ณธ ์•ฑ ๋ณ„์นญ ๊ฐ•ํ™”** | `note`, `txt` โ†’ ๋ฉ”๋ชจ์žฅ, `msword`/`msexcel`/`mspowerpoint` + ํ™•์žฅ์ž(`docx`, `xlsx`, `pptx`, `csv`, `doc`, `xls`, `ppt`) โ†’ ํ•ด๋‹น Office ์•ฑ. Score ๋ถ€์ŠคํŠธ(95)๋กœ ํ•ญ์ƒ ์ตœ์ƒ๋‹จ ํ‘œ์‹œ | | **์ธ์Šคํ†จ๋Ÿฌ UI ์•„์ด์ฝ˜** | ํผ ์•„์ด์ฝ˜(ํƒ€์ดํ‹€๋ฐ”+์ž‘์—…ํ‘œ์‹œ์ค„)์— ๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ์•„์ด์ฝ˜ ๋ฐ˜์˜ | | **Help ์ฐฝ ํ™•๋Œ€** | 880โ†’1020px ๋„ˆ๋น„ ํ™•๋Œ€ + ์นดํ…Œ๊ณ ๋ฆฌ ํƒญ ํŒจ๋”ฉ ์ถ•์†Œ โ†’ ๊ฐ€๋กœ ์Šคํฌ๋กค ์—†์ด ๋ชจ๋“  ํƒญ ํ‘œ์‹œ | | **Help ๊ฐœ์š” ๊ฐฑ์‹ ** | ๊ฐœ์š” ๋ฌธ๊ตฌ์— v0.0.3 ํ‘œ๊ธฐ, ํด๋” ๊ฒ€์ƒ‰ยท๋ฃจํ‹ดยท์ผ์ง€ยทํ•œ๊ธ€ ์•ฑ ์‹คํ–‰ ๊ธฐ๋Šฅ ๋ฐ˜์˜, ์›น๊ฒ€์ƒ‰ ์˜ˆ์‹œ(`?n` ๋„ค์ด๋ฒ„) ์ถ”๊ฐ€ | | **์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ ** | ShowIndexingProgress ์˜ค๋ฒ„๋ ˆ์ด ๋ˆ„์ˆ˜ ์ˆ˜์ •(finally ์ œ๊ฑฐ), RunHandler Process.Dispose, IndexService volatile, HelpDetailWindow ์ƒ์ˆ˜ ์ถ”์ถœ, SetupForm Icon null ์ฒดํฌ | ### v0.0.2 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **๋น ๋ฅธ ์‹คํ–‰ Placeholder** | ์ž…๋ ฅ ํ•„๋“œ์— ํžŒํŠธ ํ…์ŠคํŠธ ํ‘œ์‹œ (ํ‚ค์›Œ๋“œ, ํ‘œ์‹œ ์ด๋ฆ„, ๊ฒฝ๋กœ). ModernTextBox ํ…œํ”Œ๋ฆฟ์— `Tag` ๊ธฐ๋ฐ˜ ์›Œํ„ฐ๋งˆํฌ ์ถ”๊ฐ€ | | **๊ธฐ๋ณธ ์•ฑ ๋ณ„์นญ 19์ข…** | ํ•œ๊ธ€+์˜๋ฌธ ์ด๋ฆ„์œผ๋กœ ์ฆ‰์‹œ ์‹คํ–‰: ๋ฉ”๋ชจ์žฅ/notepad, ๊ณ„์‚ฐ๊ธฐ/calc, ์—‘์…€/excel, ์›Œ๋“œ/word, ํŒŒ์›Œํฌ์ธํŠธ/ppt, ํƒ์ƒ‰๊ธฐ/explorer, cmd, powershell, ๊ทธ๋ฆผํŒ/paint, ์บก์ฒ˜/snip, Edge, Teams, VS Code, Outlook, ์›๊ฒฉ/rdp, ์ž‘์—…๊ด€๋ฆฌ์ž/taskmgr ๋“ฑ. ์‹ค์ œ ์„ค์น˜๋œ ์•ฑ๋งŒ ์ž๋™ ๊ฐ์ง€ | ### v0.0.1 | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | |------|------| | **์ธ์Šคํ†จ๋Ÿฌ ํ†ตํ•ฉ** | ์˜จ๋ผ์ธ/์˜คํ”„๋ผ์ธ 2์ข… โ†’ ์˜คํ”„๋ผ์ธ 1์ข…์œผ๋กœ ํ†ตํ•ฉ. .NET Framework 4.8 ๊ธฐ๋ฐ˜ (Windows ๊ธฐ๋ณธ ํฌํ•จ). ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ์ž๋™ ์š”์ฒญ (app.manifest `requireAdministrator`) | | **๊ฒ€์ƒ‰ ํ™•์žฅ์ž ์„ค์ •** | ์„ค์ • โ†’ ์ผ๋ฐ˜ ํƒญ์— ํƒœ๊ทธํ˜• ํ™•์žฅ์ž UI. ๊ธฐ๋ณธ 30+์ข… (์‹คํ–‰/๋ฌธ์„œ/ํ…์ŠคํŠธ/์ด๋ฏธ์ง€). ์‚ฌ์šฉ์ž ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ | | **ํด๋” ์ธ๋ฑ์‹ฑ** | ์ธ๋ฑ์Šค ๊ฒฝ๋กœ์˜ 1๋‹จ๊ณ„ ํ•˜์œ„ ํด๋”๋„ ๊ฒ€์ƒ‰ยท์—ด๊ธฐ ๊ฐ€๋Šฅ | | **์ธ๋ฑ์‹ฑ ํ˜„ํ™ฉ ํ‘œ์‹œ** | ๋Ÿฐ์ฒ˜ ํ•˜๋‹จ์— `โœ“ N๊ฐœ ํ•ญ๋ชฉ ์ƒ‰์ธ๋จ (X.X์ดˆ)` ์ž๋™ ํ‘œ์‹œ โ†’ 5์ดˆ ํ›„ ์‚ฌ๋ผ์ง. ์„ค์ • ์ €์žฅ ์‹œ ํ”„๋กœ๊ทธ๋ ˆ์Šค ์˜ค๋ฒ„๋ ˆ์ด | | **Help ์ธ๊ธฐ ํƒญ** | โญ ์ธ๊ธฐ ํƒญ ์ถ”๊ฐ€ (2๋ฒˆ์งธ ์œ„์น˜). ํŒŒ์ผ๊ฒ€์ƒ‰/์›น๊ฒ€์ƒ‰/ํด๋ฆฝ๋ณด๋“œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ํ•„ํ„ฐ | | **๋‹ค์ด์•„๋ชฌ๋“œ ํ”ฝ์…€ ์•„์ด์ฝ˜** | ๋Ÿฐ์ฒ˜ ์ž…๋ ฅ์ฐฝ ์ขŒ์ธก + ์ •๋ณด ์ฐฝ + ํŠธ๋ ˆ์ด + ์ธ์Šคํ†จ๋Ÿฌ ํ—ค๋”์— ๋ฒกํ„ฐ ๋‹ค์ด์•„๋ชฌ๋“œ ์•„์ด์ฝ˜ ์ ์šฉ | | **์ •๋ณด ์ฐฝ ์•„์ด์ฝ˜** | ๋น„ํŠธ๋งต ICO โ†’ ๋ฒกํ„ฐ Canvas ๋ Œ๋”๋ง (ํ•ด์ƒ๋„ ๋…๋ฆฝ, DPI ๋ฌด๊ด€ ์„ ๋ช…) | | **์–ธ์–ด ๋ผ๋ฒจ** | ์„ค์ • โ†’ Language (์˜์–ด ํ‘œ๊ธฐ๋กœ ๋ณ€๊ฒฝ, ๋‹ค๊ตญ์–ด ์‚ฌ์šฉ์ž ์ ‘๊ทผ์„ฑ) | | **๋ฒ„๊ทธ ์ˆ˜์ •** | HelpDetailWindow ์ธ๊ธฐ ํƒญ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋ฒ„๊ทธ (`&&`/`||`), DispatcherTimer ์ค‘๋ณต ์ƒ์„ฑ ๋ฐฉ์ง€, Installer nullable ๊ฒฝ๊ณ  13๊ฐœ ํ•ด์†Œ | ### v0.0.0 ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ. 40๊ฐœ+ ๋ช…๋ น์–ด, 9์ข… ํ…Œ๋งˆ, 11๊ฐœ ์„ค์ • ํƒญ, ํด๋ฆฝ๋ณด๋“œ DPAPI ์•”ํ˜ธํ™”, ์ž ๊ธˆ ํ•ด์ œ ์•Œ๋ฆผ, ํ™”๋ฉด ์บก์ฒ˜, ๋ชจ๋˜ ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด, ์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ. --- ## ๊ฐœ๋ฐœ ๊ฒ€ํ†  โ€” ์›Œํฌํ”Œ๋กœ์šฐ ๋ณ‘๋ชฉ ๋ถ„์„ ๊ทธ๋ž˜ํ”„ > **์ƒํƒœ**: ๊ฒ€ํ†  ์™„๋ฃŒ ยท ๊ตฌํ˜„ ๋Œ€๊ธฐ > **๊ฒ€ํ† ์ผ**: 2026-03-30 > **๋Œ€์ƒ**: ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ์ „์šฉ ๊ธฐ๋Šฅ ### ๋ฐฐ๊ฒฝ WorkflowAnalyzerWindow(ํƒ€์ž„๋ผ์ธ ๋ทฐ)์™€ AgentStatsDashboardWindow(ํ†ต๊ณ„ ๋Œ€์‹œ๋ณด๋“œ)๊ฐ€ ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋‚˜, **์‹ค์‹œ๊ฐ„์œผ๋กœ ์–ด๋””๊ฐ€ ๋ณ‘๋ชฉ์ธ์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ž˜ํ”„**๊ฐ€ ์—†์Œ. ์—์ด์ „ํŠธ ์‹คํ–‰ ์ค‘ "LLM ํ˜ธ์ถœ์ด ๋А๋ฆฐ ๊ฑด์ง€, ํŠน์ • ๋„๊ตฌ๊ฐ€ ๋А๋ฆฐ ๊ฑด์ง€" ํŒ๋‹จ์ด ์–ด๋ ค์›€. ### ํ˜„์žฌ ๋ณด์œ  ๊ธฐ๋ฐ˜ | ๊ตฌ์„ฑ์š”์†Œ | ์ƒํƒœ | ์œ„์น˜ | |----------|:----:|------| | WorkflowAnalyzerWindow | โœ… | `Views/WorkflowAnalyzerWindow.xaml(.cs)` โ€” ์ด๋ฒคํŠธ ํƒ€์ž„๋ผ์ธ, ์š”์•ฝ ์นด๋“œ | | AgentEvent.ElapsedMs | โœ… | ๊ฐ ๋„๊ตฌ ์‹คํ–‰ ์†Œ์š”์‹œ๊ฐ„ ์ˆ˜์ง‘์ค‘ | | AgentEvent.InputTokens/OutputTokens | โœ… | LLM ํ˜ธ์ถœ๋ณ„ ํ† ํฐ๋Ÿ‰ ์ˆ˜์ง‘์ค‘ | | AgentEvent.Iteration | โœ… | ๋ฐ˜๋ณต ๋ฒˆํ˜ธ ์ˆ˜์ง‘์ค‘ | | AgentStatsDashboardWindow | โœ… | `Views/AgentStatsDashboardWindow.xaml(.cs)` โ€” ์ผ๋ณ„ ๋ฐ” ์ฐจํŠธ, ๋„๊ตฌ ๋นˆ๋„ | | LLM ํ˜ธ์ถœ ์ž์ฒด์˜ ์†Œ์š”์‹œ๊ฐ„ | โŒ ๋ฏธ์ˆ˜์ง‘ | `SendWithToolsAsync` ์ „ํ›„ Stopwatch ์ถ”๊ฐ€ ํ•„์š” | | ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | โŒ ๋ถˆํ•„์š” | ๋ชจ๋“  ์ฐจํŠธ๋ฅผ WPF Canvas+Rectangle ์ง์ ‘ ๊ตฌํ˜„ | ### ์ถ”๊ฐ€ ๊ตฌํ˜„ ๋Œ€์ƒ โ€” 3์ข… ์‹œ๊ฐํ™” #### โ‘  ์›Œํ„ฐํด ์ฐจํŠธ (์‹œ๊ฐ„ ํ๋ฆ„ + ๋ณ‘๋ชฉ ์ƒ‰์ƒ) ``` ์‹œ๊ฐ„ โ†’ 0s 2s 4s 6s 8s 10s โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค LLM 1 โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 2.1s (ํ† ํฐ 1.2K) Tool 1 โ–ˆโ–ˆโ–ˆ 0.8s folder_map LLM 2 โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 3.5s (ํ† ํฐ 2.8K) โ† ๐Ÿ”ด ๋ณ‘๋ชฉ! Tool 2 โ–ˆ 0.2s file_read LLM 3 โ–ˆโ–ˆโ–ˆโ–ˆ 1.2s (ํ† ํฐ 1.5K) Tool 3 โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 1.8s html_create ``` - **๋นจ๊ฐ„ ๋ฐ”**: ๊ฐ€์žฅ ๊ธด ๊ตฌ๊ฐ„ (๋ณ‘๋ชฉ), **์ฃผํ™ฉ**: ํ‰๊ท  ์ด์ƒ, **๋…น์ƒ‰**: ์ •์ƒ - LLM ํ˜ธ์ถœ๊ณผ ๋„๊ตฌ ์‹คํ–‰์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‹œ๊ฐ„ ์†Œ๋น„ ํŒจํ„ด์„ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ - **๊ตฌํ˜„**: Canvas + Rectangle, ์ƒ‰์ƒ ์ž„๊ณ„๊ฐ’ ์ž๋™ ๊ณ„์‚ฐ (ํ‰๊ท  ร— 1.5 = ์ฃผํ™ฉ, ร— 2.0 = ๋นจ๊ฐ•) - **์ „์ œ ์กฐ๊ฑด**: LLM ํ˜ธ์ถœ ์†Œ์š”์‹œ๊ฐ„ ์ˆ˜์ง‘ (`SendWithToolsAsync` ์ „ํ›„ Stopwatch) #### โ‘ก ๋„๊ตฌ๋ณ„ ๋ˆ„์  ์†Œ์š”์‹œ๊ฐ„ ๋ฐ” ์ฐจํŠธ ``` ๋„๊ตฌ๋ณ„ ์†Œ์š”์‹œ๊ฐ„ (์ด๋ฒˆ ์„ธ์…˜) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ html_create โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 4.2s โ† ๐Ÿ”ด ์ตœ๋‹ค file_read โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 1.8s folder_map โ–ˆโ–ˆโ–ˆโ–ˆ 0.9s grep โ–ˆโ–ˆ 0.4s LLM ํ˜ธ์ถœ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ 7.1s ``` - ํ˜„์žฌ AgentStatsDashboardWindow์˜ ๋„๊ตฌ ๋นˆ๋„ ๋ฐ” ์ฐจํŠธ์™€ ๋™์ผ ํŒจํ„ด - ElapsedMs ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ - ์‹ค์‹œ๊ฐ„: ์ด๋ฒคํŠธ ์ˆ˜์‹  ์‹œ `Dictionary`์— ๋ˆ„์  ํ›„ ๋ฐ” ์žฌ๋ Œ๋”๋ง - **๊ตฌํ˜„ ๋‚œ์ด๋„**: ๋‚ฎ์Œ โ€” ๊ธฐ์กด ์ฝ”๋“œ ๋ณต์ œ ์ˆ˜์ค€ #### โ‘ข ๋ฐ˜๋ณต๋ณ„ ํ† ํฐ ์ถ”์„ธ์„  ``` ํ† ํฐ โ†‘ 3000 โ”‚ โ— โ”‚ โ— โ— 2000 โ”‚ โ— โ— โ”‚โ— โ— 1000 โ”‚ 0 โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ†’ ๋ฐ˜๋ณต 1 2 3 4 5 6 ``` - ๊บพ์€์„  ๊ทธ๋ž˜ํ”„: Canvas + WPF `Polyline` (๊ธฐ๋ณธ ๋„ํ˜•) - ์ž…๋ ฅ ํ† ํฐ ์ง€์† ์ฆ๊ฐ€ ํŒจํ„ด ๊ฐ์ง€ โ†’ **"โš  ์ปจํ…์ŠคํŠธ ํฌ๊ธฐ ๊ธ‰์ฆ"** ๊ฒฝ๊ณ  ๋ฐฐ์ง€ - **๊ตฌํ˜„ ๋‚œ์ด๋„**: ์ค‘๊ฐ„ ### ๊ตฌํ˜„ ๋น„์šฉ ๋ถ„์„ | ํ•ญ๋ชฉ | ์˜ˆ์ƒ ์ฝ”๋“œ๋Ÿ‰ | ์•ฑ ํฌ๊ธฐ ์˜ํ–ฅ | ๋น„๊ณ  | |------|------------|:----------:|------| | LLM ํ˜ธ์ถœ ์‹œ๊ฐ„ ์ˆ˜์ง‘ | ~5์ค„ | 0 | AgentLoopService์— Stopwatch ์ถ”๊ฐ€ | | ์›Œํ„ฐํด ์ฐจํŠธ | ~150์ค„ | 0 | Canvas+Rectangle | | ๋„๊ตฌ๋ณ„ ๋ฐ” ์ฐจํŠธ | ~80์ค„ | 0 | ๊ธฐ์กด ๋ฐ” ์ฐจํŠธ ํŒจํ„ด ๋ณต์ œ | | ํ† ํฐ ์ถ”์„ธ์„  | ~100์ค„ | 0 | Canvas+Polyline | | ์™ธ๋ถ€ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | ๋ถˆํ•„์š” | 0 | WPF ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ถฉ๋ถ„ | | **ํ•ฉ๊ณ„** | **~335์ค„** | **0KB** | | ### ๊ถŒ์žฅ ๊ตฌํ˜„ ์ˆœ์„œ | Phase | ๋ฒ”์œ„ | ํšจ๊ณผ | |-------|------|------| | **Phase 1** (์ฆ‰์‹œ ๊ฐ€๋Šฅ) | LLM ํ˜ธ์ถœ ์‹œ๊ฐ„ ์ˆ˜์ง‘ + ๋„๊ตฌ๋ณ„ ๋ฐ” ์ฐจํŠธ | "์–ด๋–ค ๋„๊ตฌ๊ฐ€ ๋А๋ฆฐ์ง€" ์ฆ‰์‹œ ํŒŒ์•… | | **Phase 2** (๋‹ค์Œ) | ์›Œํ„ฐํด ์ฐจํŠธ | ์‹œ๊ฐ„ ํ๋ฆ„์—์„œ LLM vs ๋„๊ตฌ ๋น„์œจ ์‹œ๊ฐํ™” | | **Phase 3** (์„ ํƒ) | ํ† ํฐ ์ถ”์„ธ์„  + ์ปจํ…์ŠคํŠธ ํญ๋ฐœ ๊ฒฝ๊ณ  | ๊ณ ๊ธ‰ ๋””๋ฒ„๊น…์šฉ | ### ๊ฒฐ๋ก  | ๊ด€์  | ํ‰๊ฐ€ | |------|------| | ๊ธฐ์ˆ  ๊ฐ€๋Šฅ์„ฑ | โœ… ๋†’์Œ โ€” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ 90% ์™„์„ฑ, ์ฐจํŠธ๋Š” ๊ธฐ์กด ํŒจํ„ด ์žฌํ™œ์šฉ | | ๊ตฌํ˜„ ๋‚œ์ด๋„ | ์ค‘~ํ•˜ โ€” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆํ•„์š” | | ์‚ฌ์šฉ์ž ๊ฐ€์น˜ | ๋†’์Œ โ€” "์™œ ๋А๋ฆฐ์ง€" ์›์ธ ์ฆ‰์‹œ ํŒŒ์•… ๊ฐ€๋Šฅ | | ์•ฑ ํฌ๊ธฐ | 0 ์˜ํ–ฅ โ€” ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ | | ๋ฐฐ์น˜ ์œ„์น˜ | WorkflowAnalyzerWindow ๋‚ด๋ถ€ (์š”์•ฝ ์นด๋“œ ์•„๋ž˜, ํƒ€์ž„๋ผ์ธ ์œ„) | --- ## ๊ฐœ๋ฐœ ๊ฒ€ํ†  โ€” ์—์ด์ „ํŠธ ๋ฃจํ”„ ๊ฒ€์ฆ ๊ฐ•์ œ (Post-Tool Verification) > **์ƒํƒœ**: ๊ตฌํ˜„ ์™„๋ฃŒ > **๊ฒ€ํ† ์ผ**: 2026-03-31 > **๋Œ€์ƒ**: Cowork/Code ๋ชจ๋“œ ์—์ด์ „ํŠธ ๋ฃจํ”„ ### ๋ฐฐ๊ฒฝ โ€” ์—…๊ณ„ ์˜คํ”ˆ์†Œ์Šค์™€์˜ ๋น„๊ต ์—์ด์ „ํŠธ ๋ฃจํ”„๊ฐ€ ๋ฌธ์„œ ์ƒ์„ฑ ํ›„ ๊ฒ€์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๊ด€์ฐฐ๋จ. OpenHands(๊ตฌ OpenDevin), Claude Code, Cursor ๋“ฑ ์ฃผ์š” ์˜คํ”ˆ์†Œ์Šค/์ƒ์šฉ ์„œ๋น„์Šค์˜ ์—์ด์ „ํŠธ ๋ฃจํ”„๋ฅผ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ, **์—…๊ณ„ ์ „์ฒด๊ฐ€ ๋™์ผํ•œ ๊ตฌ์กฐ์  ํ•œ๊ณ„**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ํ™•์ธ. #### ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต | ํ•ญ๋ชฉ | AX Copilot | OpenHands | Claude Code | |------|-----------|-----------|-------------| | ๋ฃจํ”„ ๊ตฌ์กฐ | while + SendWithToolsAsync | while + agent.step(state) | while + tool_use | | **๋ฐ˜๋ณต๋‹น LLM ํ˜ธ์ถœ** | **1ํšŒ** | **1ํšŒ** | **1ํšŒ** | | **๊ฒ€์ฆ ๊ฐ•์ œ** | **โœ… v0.7.1 ๊ตฌํ˜„** | โŒ ์—†์Œ | โŒ ์—†์Œ | | ๊ณ„ํš ๋‹จ๊ณ„ | PlanMode 3๋ชจ๋“œ | ์—†์Œ (implicit) | ์—†์Œ | | ์ข…๋ฃŒ ์กฐ๊ฑด | ๋„๊ตฌ ํ˜ธ์ถœ ์—†์Œ | AgentFinishAction | ๋„๊ตฌ ํ˜ธ์ถœ ์—†์Œ | | ์ž๊ธฐ ๋ฐ˜์„ฑ | Self-Reflection ํ”„๋กฌํ”„ํŠธ | ์—†์Œ | ์—†์Œ | | ์‚ฌ์šฉ์ž ์Šน์ธ | UserDecisionCallback | SecurityAnalyzer | ๊ถŒํ•œ ํ”„๋กฌํ”„ํŠธ | | ์ปจํ…์ŠคํŠธ ์••์ถ• | ContextCondenser | ์š”์•ฝ ๊ธฐ๋ฐ˜ | ์—†์Œ | #### OpenHands ๋ฃจํ”„ ์˜์‚ฌ์ฝ”๋“œ ```python # OpenHands: agent.step() = 1 LLM ํ˜ธ์ถœ + 1 ๋„๊ตฌ ์‹คํ–‰ while budget > 0: action = agent.step(state) # 1 LLM call observation = runtime.run(action) # 1 tool execution state.update(action, observation) if action == AgentFinishAction: break # ๊ฒ€์ฆ ์—†์Œ โ€” LLM์ด ์ž์œจ์ ์œผ๋กœ ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ ํ™•์ธ ์—ฌ๋ถ€ ๊ฒฐ์ • ``` #### AX Copilot ๊ฒ€์ฆ ๊ฐ•์ œ ๋ฃจํ”„ (๊ฐœ์„  ํ›„) ``` ๋ฐ˜๋ณต 1: LLM โ†’ "๊ณ„ํš ์ˆ˜๋ฆฝ" + file_read โ†’ ๊ธฐ์กด ํŒŒ์ผ ํ™•์ธ ๋ฐ˜๋ณต 2: LLM โ†’ "์‹คํ–‰" + html_create โ†’ ๋ฌธ์„œ ์ƒ์„ฑ โ†ณ โ˜…๊ฒ€์ฆ LLM ํ˜ธ์ถœโ˜… โ†’ file_read๋กœ ๋‚ด์šฉ ํ™•์ธ โ†’ ์ˆ˜์ • ํ•„์š” ์‹œ ๋„๊ตฌ ํ˜ธ์ถœ ๋ฐ˜๋ณต 3: LLM โ†’ ์™„๋ฃŒ ์‘๋‹ต ๋˜๋Š” ์ถ”๊ฐ€ ์ˆ˜์ • ``` ### ๊ตฌํ˜„ ์ƒ์„ธ | ๊ตฌ์„ฑ์š”์†Œ | ํŒŒ์ผ | ๋‚ด์šฉ | |----------|------|------| | ์„ค์ • | `AppSettings.cs` | `EnablePostToolVerification` (bool, ๊ธฐ๋ณธ false) | | UI | `SettingsWindow.xaml` | "๊ณ ํ’ˆ์งˆ ๋ฌธ์„œ" ์„น์…˜์— ํ† ๊ธ€ ์ถ”๊ฐ€ | | ๋ฐ”์ธ๋”ฉ | `SettingsViewModel.cs` | Load/Save ๋งคํ•‘ | | ์—”์ง„ | `AgentLoopService.cs` | `RunPostToolVerificationAsync()` + `IsDocumentCreationTool()` | #### ๊ฒ€์ฆ ๋Œ€์ƒ ๋„๊ตฌ | ๋„๊ตฌ๋ช… | ์„ค๋ช… | |--------|------| | `file_write` | ์ผ๋ฐ˜ ํŒŒ์ผ ์“ฐ๊ธฐ | | `docx_create` | Word ๋ฌธ์„œ ์ƒ์„ฑ | | `html_create` | HTML ๋ณด๊ณ ์„œ ์ƒ์„ฑ | | `excel_create` | Excel ํŒŒ์ผ ์ƒ์„ฑ | | `csv_create` | CSV ํŒŒ์ผ ์ƒ์„ฑ | | `script_create` | Python ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ | | `pptx_create` | PowerPoint ์ƒ์„ฑ | #### ๊ฒ€์ฆ ํ”„๋กฌํ”„ํŠธ ๊ตฌ์กฐ ๊ฒ€์ฆ LLM ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ 4๋‹จ๊ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฃผ์ž…: 1. `file_read`๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ ๋‚ด์šฉ ์ฝ๊ธฐ 2. ์‚ฌ์šฉ์ž ์š”์ฒญ ๋Œ€๋น„ ์™„์ „์„ฑ ํ™•์ธ 3. ๊ตฌ์กฐยทํ˜•์‹ ์˜ฌ๋ฐ”๋ฆ„ ํ™•์ธ 4. ๋ฌธ์ œ ๋ฐœ๊ฒฌ ์‹œ ์ฆ‰์‹œ ์ˆ˜์ • ๋„๊ตฌ ํ˜ธ์ถœ ### ํšจ๊ณผ | ๊ด€์  | Before (v0.7.0) | After (v0.7.1) | |------|-----------------|-----------------| | ๋ฌธ์„œ ์ƒ์„ฑ ํ›„ ํ™•์ธ | LLM ์ž์œจ ํŒ๋‹จ (๋Œ€๋ถ€๋ถ„ ์ƒ๋žต) | ๊ฐ•์ œ ํ™•์ธ + ์ˆ˜์ • | | ๋ฐ˜๋ณต๋‹น ์ตœ์†Œ LLM ํ˜ธ์ถœ | 1ํšŒ | ๋ฌธ์„œ ์ƒ์„ฑ ์‹œ 2ํšŒ | | ๋ˆ„๋ฝ ์„น์…˜ | ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฐœ๊ฒฌ | AI๊ฐ€ ์ž๋™ ๊ฐ์ง€ | | ์—…๊ณ„ ๋น„๊ต | OpenHands์™€ ๋™์ผ | **์ฐจ๋ณ„ํ™” ํฌ์ธํŠธ** | --- ## ์–‘์‹ ๊ธฐ๋ฐ˜ ๋ฌธ์„œ ์ƒ์„ฑ (Template Mode) > **์ƒํƒœ**: ๊ตฌํ˜„ ์™„๋ฃŒ > **์ ์šฉ์ผ**: 2026-03-30 > **๋Œ€์ƒ ์Šคํ‚ฌ**: docx-creator, pptx-creator, xlsx-analyzer ### ๊ฐœ์š” ์ž‘์—… ํด๋”์— ์–‘์‹ ํŒŒ์ผ(`.docx`, `.pptx`, `.xlsx`)์„ ๋„ฃ์–ด๋‘๋ฉด, ๋Ÿฐํƒ€์ž„ ๊ณ ๊ธ‰ ์Šคํ‚ฌ(`/docx-creator`, `/pptx-creator`, `/xlsx-analyzer`) ์‹คํ–‰ ์‹œ **์–‘์‹์˜ ์Šคํƒ€์ผยท๋ ˆ์ด์•„์›ƒ์„ ์ž๋™์œผ๋กœ ์ƒ์†**ํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ### ๋™์ž‘ ์›๋ฆฌ ``` ์‚ฌ์šฉ์ž: "์ด๋ฒˆ ๋‹ฌ ๋ณด๊ณ ์„œ ์ž‘์„ฑํ•ด์ค˜" โ”Œโ”€ ์Šคํ‚ฌ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 1. folder_map โ†’ ์ž‘์—… ํด๋” ์Šค์บ” โ”‚ โ”‚ 2. ์–‘์‹ ํ›„๋ณด ํƒ์ƒ‰ (ํŒŒ์ผ๋ช… ํ‚ค์›Œ๋“œ ๋งค์นญ) โ”‚ โ”‚ 3. ์–‘์‹ ๋ฐœ๊ฒฌ โ†’ document_read๋กœ ๊ตฌ์กฐ ํŒŒ์•… โ”‚ โ”‚ 4. Document('์–‘์‹.docx') ๊ธฐ๋ฐ˜ ์ƒ์„ฑ โ”‚ โ”‚ (์–‘์‹ ์—†์œผ๋ฉด โ†’ Document() ์ƒˆ ๋ฌธ์„œ) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ์–‘์‹ ๊ฐ์ง€ ํ‚ค์›Œ๋“œ ํŒŒ์ผ๋ช…์— ๋‹ค์Œ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜๋ฉด ์–‘์‹์œผ๋กœ ์ž๋™ ์ธ์‹: | ํ‚ค์›Œ๋“œ | ์˜ˆ์‹œ ํŒŒ์ผ๋ช… | |--------|------------| | ์–‘์‹ | `์›”๊ฐ„๋ณด๊ณ _์–‘์‹.docx` | | template | `report_template.pptx` | | ์„œ์‹ | `์„œ์‹_๊ณต๋ฌธ.docx` | | ํ‘œ์ค€ | `ํ‘œ์ค€_๋ฐœํ‘œ์ž๋ฃŒ.pptx` | | ๊ธฐ๋ณธ | `๊ธฐ๋ณธ์–‘์‹.xlsx` | ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํŒŒ์ผ๋ช…์„ ์ง€์ •ํ•˜๋ฉด ํ‚ค์›Œ๋“œ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ด๋‹น ํŒŒ์ผ์„ ์–‘์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ### ์Šคํ‚ฌ๋ณ„ ์–‘์‹ ํ™œ์šฉ ๋ฐฉ์‹ | ์Šคํ‚ฌ | ์–‘์‹ ๋กœ๋“œ | ์ƒ์†๋˜๋Š” ์š”์†Œ | |------|----------|-------------| | **docx-creator** | `Document('์–‘์‹.docx')` | ์Šคํƒ€์ผ, ๋จธ๋ฆฌ๊ธ€/๋ฐ”๋‹ฅ๊ธ€, ๋กœ๊ณ , ํŽ˜์ด์ง€ ์„ค์ •, ๊ธ€๊ผด | | **pptx-creator** | `Presentation('์–‘์‹.pptx')` | ๋งˆ์Šคํ„ฐ ์Šฌ๋ผ์ด๋“œ, ๋ฐฐ๊ฒฝ, ์ƒ‰ ํ…Œ๋งˆ, ํฐํŠธ, ๋ ˆ์ด์•„์›ƒ | | **xlsx-analyzer** | `load_workbook('์–‘์‹.xlsx')` | ์…€ ์„œ์‹, ๋ณ‘ํ•ฉ, ํ…Œ๋‘๋ฆฌ, ์—ด ๋„ˆ๋น„, ์ฐจํŠธ ์˜์—ญ | ### ๊ตฌํ˜„ ๋ฐฉ์‹ C# ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด **์Šคํ‚ฌ ํ”„๋กฌํ”„ํŠธ(`.skill.md`)๋งŒ ํ™•์žฅ**ํ•˜์—ฌ ๊ตฌํ˜„: - `skills/docx-creator.skill.md` โ€” `## ์–‘์‹ ํ™œ์šฉ (ํ…œํ”Œ๋ฆฟ ๋ชจ๋“œ)` ์„น์…˜ ์ถ”๊ฐ€ - `skills/pptx-creator.skill.md` โ€” `## ์–‘์‹ ํ™œ์šฉ (๋งˆ์Šคํ„ฐ ์Šฌ๋ผ์ด๋“œ ํ…œํ”Œ๋ฆฟ)` ์„น์…˜ ์ถ”๊ฐ€ - `skills/xlsx-analyzer.skill.md` โ€” `## ์–‘์‹ ํ™œ์šฉ (Excel ๋ณด๊ณ ์„œ ํ…œํ”Œ๋ฆฟ)` ์„น์…˜ ์ถ”๊ฐ€ ๊ฐ ์Šคํ‚ฌ์˜ Python ์Šคํฌ๋ฆฝํŠธ ํ…œํ”Œ๋ฆฟ์— ์–‘์‹ ์ž๋™ ๊ฐ์ง€ ๋กœ์ง ํฌํ•จ: ```python template_keywords = ['์–‘์‹', 'template', '์„œ์‹', 'ํ‘œ์ค€', '๊ธฐ๋ณธ'] template_file = None for f in os.listdir('.'): if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): template_file = f break if template_file: doc = Document(template_file) # ์–‘์‹ ์Šคํƒ€์ผ ์ƒ์† else: doc = Document() # ์ƒˆ ๋ฌธ์„œ ``` ### ์‚ฌ๋‚ด ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค | ์‹œ๋‚˜๋ฆฌ์˜ค | ์–‘์‹ ํŒŒ์ผ | ๊ฒฐ๊ณผ | |---------|----------|------| | ์›”๊ฐ„ ๋ณด๊ณ ์„œ | `์›”๊ฐ„๋ณด๊ณ _์–‘์‹.docx` (์‚ฌ๋‚ด ํ‘œ์ค€ ํ—ค๋”ยท๋กœ๊ณ ยทํŽ˜์ด์ง€ ์„ค์ •) | ๋™์ผ ๊ทœ๊ฒฉ์˜ ๋ณด๊ณ ์„œ ์ž๋™ ์ƒ์„ฑ | | ํŒ€ ๋ฐœํ‘œ | `ํŒ€๋ฐœํ‘œ_์–‘์‹.pptx` (๋ถ€์„œ ๋งˆ์Šคํ„ฐ ์Šฌ๋ผ์ด๋“œ) | ๋ถ€์„œ ๋””์ž์ธ ์œ ์ง€ + ์ƒˆ ๋‚ด์šฉ | | ์ˆ˜์œจ ๋ถ„์„ | `์ˆ˜์œจ๋ณด๊ณ _์–‘์‹.xlsx` (์…€ ์„œ์‹ยท์ฐจํŠธ ์˜์—ญ ์„ค์ •) | ์–‘์‹์— ๋ฐ์ดํ„ฐ๋งŒ ์‚ฝ์ž… | | ๊ณต๋ฌธ ์ž‘์„ฑ | `๊ณต๋ฌธ_์„œ์‹.docx` (์‚ฌ๋‚ด ๊ณต๋ฌธ ๊ทœ๊ฒฉ) | ๊ทœ๊ฒฉ ์œ ์ง€ + ๋‚ด์šฉ ์ž‘์„ฑ | ### ํ–ฅํ›„ ๊ณ ๋„ํ™” | ๋‹จ๊ณ„ | ๋‚ด์šฉ | ๊ณต์ˆ˜ | |------|------|------| | ํ˜„์žฌ (v0.6.1) | ์Šคํ‚ฌ ํ”„๋กฌํ”„ํŠธ์—์„œ ์–‘์‹ ์ž๋™ ๊ฐ์ง€ ์•ˆ๋‚ด | ์™„๋ฃŒ | | ๋‹ค์Œ | ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์–‘์‹ ๋ชฉ๋ก ์ž๋™ ์ฃผ์ž… (BuildCoworkSystemPrompt) | ๋‚ฎ์Œ | | ์žฅ๊ธฐ | `.ax/templates/` ๊ณต์šฉ ์–‘์‹ ํด๋” + ํ”„๋กœ์ ํŠธ ๊ทœ์น™์—์„œ ๊ธฐ๋ณธ ์–‘์‹ ์ง€์ • | ์ค‘๊ฐ„ | --- ## 2026-04-04 ์ง„ํ–‰ ๊ธฐ๋ก (AX Agent ๋ช…๋ น/๋„๊ตฌ ๋ณด๊ฐ•) ### 1. ์Šฌ๋ž˜์‹œ ๋ช…๋ น ์ฒด๊ณ„ ๋ณด๊ฐ• - `/chrome`: ์ธ์ž ๋ฏธ์ž…๋ ฅ ์‹œ MCP ๋Ÿฐํƒ€์ž„ ์ง„๋‹จ, ์ธ์ž ์ž…๋ ฅ ์‹œ ๋ธŒ๋ผ์šฐ์ € ์ž‘์—… ์‹คํ–‰ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ…. - `/mcp`: `status`, `enable|disable`, `reconnect` ๋™์ž‘ ์ •๋ฆฌ ๋ฐ ์ƒํƒœ ๋ผ๋ฒจ ํ‘œ์ค€ํ™”. - `/settings`: `model|permissions|mcp|theme` ํ•˜์œ„ ์•ก์…˜ ์ง€์›. - `/permissions`: `ask|auto|deny|status` ํ•˜์œ„ ์•ก์…˜ ์ง€์›. - `/verify`: Cowork/Code ํƒญ ์ „์šฉ ๊ฒ€์ฆ ํ”„๋กฌํ”„ํŠธ ๊ฒฝ๋กœ๋กœ ๊ณ ์ •. - `/commit`: ์Šน์ธ ๊ธฐ๋ฐ˜ ์ปค๋ฐ‹ ์‹คํ–‰ + `files:path1,path2 :: message` ๋ถ€๋ถ„ ์ปค๋ฐ‹ ์ง€์›. - `/compact`: ์ˆ˜๋™ ์ปจํ…์ŠคํŠธ ์••์ถ• ๋ช…๋ น ์œ ์ง€ ๋ฐ slash ํŒ์—… ํžŒํŠธ/๋„์›€๋ง ๋ฐ˜์˜. ### 2. ๋„๊ตฌ/๊ถŒํ•œ ์ •์ฑ… ์ •๋ ฌ - `GitTool`์˜ commit ๊ฒฝ๋กœ์—์„œ ๋ ˆ๊ฑฐ์‹œ ๋น„ํ™œ์„ฑ ์‘๋‹ต(`์ปค๋ฐ‹ ๋น„ํ™œ์„ฑ`) ์ œ๊ฑฐ. - ์„ธ์…˜ ๋‹จ์œ„ MCP ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์˜ค๋ฒ„๋ผ์ด๋“œ ์ ์šฉ(์˜๊ตฌ ์„ค์ • ๋ฏธ์˜ค์—ผ). - `/chrome` ์ง„๋‹จ ์‹คํŒจ ์‹œ `/mcp reconnect all` ์ž๋™ 1ํšŒ ์žฌ์‹œ๋„ ํ›„ ์ƒํƒœ ์žฌํ‰๊ฐ€. ### 3. ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `ChatWindowSlashPolicyTests`: - ์Šฌ๋ž˜์‹œ ํŒŒ์„œ(`ParseGenericAction`, `ParseMcpAction`) ๊ฒ€์ฆ. - `/verify` ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํ•„์ˆ˜ ์„น์…˜ ๊ฒ€์ฆ. - MCP ์ƒํƒœ ๋ผ๋ฒจ ๋งคํ•‘ ๊ฒ€์ฆ. - `/commit` ์ž…๋ ฅ ํŒŒ์„œ ๊ฒ€์ฆ. - `AgentParityToolsTests`: - `git_tool commit` ๋ ˆ๊ฑฐ์‹œ ๋น„ํ™œ์„ฑ ๋ฉ”์‹œ์ง€ ํšŒ๊ท€ ๋ฐฉ์ง€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€. ### 4. ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ๊ฒฐ๊ณผ - `dotnet build AxCopilot.sln` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ. - ๊ธฐ์ค€ ์‹œ์  ์ „์ฒด ํ…Œ์ŠคํŠธ: 403 passed, 0 failed. ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 2์ฐจ) ### A. /mcp ๋ช…๋ น ํ™•์žฅ - `/mcp add :: stdio [args...]` ์ง€์›. - `/mcp add :: sse ` ์ง€์›. - `/mcp remove ` ์ง€์›. - `/mcp reset` ์ง€์› (์„ธ์…˜ ์˜ค๋ฒ„๋ผ์ด๋“œ ์ดˆ๊ธฐํ™”). - ์ƒํƒœ/๋„์›€๋ง ๋ฌธ๊ตฌ๋ฅผ ํ™•์žฅ ๋ช…๋ น ๊ธฐ์ค€์œผ๋กœ ์—…๋ฐ์ดํŠธ. ### B. Agentic loop ๋ณต๊ตฌ ๊ฐ€์ด๋“œ ๊ฐ•ํ™” - ๋ฏธ๋“ฑ๋ก/๋น„ํ—ˆ์šฉ ๋„๊ตฌ ๋ณต๊ตฌ ํ”„๋กฌํ”„ํŠธ์— `tool_search` ์šฐ์„  ์‚ฌ์šฉ ์ง€์นจ ์ถ”๊ฐ€. - ๋ฐ˜๋ณต ์‹คํŒจ ์ค‘๋‹จ ์‘๋‹ต์—๋„ `tool_search` ๊ธฐ๋ฐ˜ ์žฌ์‹œ๋„ ๋ฃจํŠธ๋ฅผ ๋ช…์‹œ. ### C. UI/UX ๋‹จ์ˆœํ™”(์Šฌ๋ž˜์‹œ ํŒ์—… ํžŒํŠธ) - `agentUiExpressionLevel`(`rich|balanced|simple`)์— ๋”ฐ๋ผ ์Šฌ๋ž˜์‹œ ํŒ์—… ํžŒํŠธ ๋ฐ€๋„ ์กฐ์ •. - simple: ์ตœ์†Œ ์ •๋ณด, rich: ์ถ”์ฒœ ๋ช…๋ น ํฌํ•จ, balanced: ๊ธฐ๋ณธ ์ •๋ณด. ### D. ์„ค์ •๊ฐ’-์‹ค๋™์ž‘ ์ ๊ฒ€(ํ•ต์‹ฌ) - `MaxRetryOnError`, `EnableProactiveContextCompact`, `ContextCompactTriggerPercent`, `MaxContextTokens`, `AllowInsecureTls`, `AgentUiExpressionLevel` ํ•ญ๋ชฉ์˜ ๋ชจ๋ธ/๋ทฐ๋ชจ๋ธ/UI/๋Ÿฐํƒ€์ž„ ์ฐธ์กฐ ๊ฒฝ๋กœ๋ฅผ ์ ๊ฒ€ํ•˜์—ฌ ๋™์ž‘ ์—ฐ๊ฒฐ์„ ํ™•์ธ. ### E. ๊ฒ€์ฆ ๊ฒฐ๊ณผ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (411 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 3์ฐจ) ### /mcp ์ธ์ฆ ๋ช…๋ น ์ถ”๊ฐ€ - `/mcp login <์„œ๋ฒ„๋ช…> <ํ† ํฐ>`: ์„ธ์…˜ ์ธ์ฆ ํ† ํฐ ์„ค์ •. - `/mcp logout <์„œ๋ฒ„๋ช…|all>`: ์„ธ์…˜ ์ธ์ฆ ํ† ํฐ ์ œ๊ฑฐ. - `/mcp reset` ์‹œ ์„ธ์…˜ MCP ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์˜ค๋ฒ„๋ผ์ด๋“œ์™€ ์ธ์ฆ ํ† ํฐ์„ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”. ### ๋Ÿฐํƒ€์ž„ ๋ฐ˜์˜ ๋ฒ”์œ„ - MCP ์ƒํƒœ ์ ๊ฒ€(`/mcp status`)๊ณผ Chrome ์ง„๋‹จ(`/chrome`)์—์„œ ์„ธ์…˜ ํ† ํฐ์„ `MCP_AUTH_TOKEN` ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ•ฉ์„ฑ ์ ์šฉ. - ์ƒํƒœ ์ถœ๋ ฅ์— `Auth(Session)` ํ‘œ๊ธฐ ์ถ”๊ฐ€. ### ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `ChatWindowSlashPolicyTests`์— `login/logout` ํŒŒ์„œ ๋ฐ ๋กœ๊ทธ์ธ ์ž…๋ ฅ ํŒŒ์„œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€. ### ๊ฒ€์ฆ ๊ฒฐ๊ณผ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (415 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 4์ฐจ: ๊ณ„ํš 1~4) ### 1) ๊ถŒํ•œ/๋„๊ตฌ UX ํ†ตํ•ฉ - `/permissions`, `/allowed-tools`, `/settings permissions`๊ฐ€ ๋™์ผํ•œ ๊ถŒํ•œ ์ƒํƒœ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ ฌ. - ๊ณตํ†ต ์ฒ˜๋ฆฌ ์ถ”๊ฐ€: - ๊ถŒํ•œ ๋ชจ๋“œ ์ ์šฉ ํ—ฌํผ(`ask|auto|deny`) - ๊ถŒํ•œ ์ƒํƒœ ์š”์•ฝ ํ…์ŠคํŠธ ์ƒ์„ฑ - ๊ถŒํ•œ ํŒ์—… ์˜คํ”ˆ ๊ฒฝ๋กœ ํ†ต์ผ - `/allowed-tools`์—์„œ๋„ `ask|auto|deny|status`๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ง€์›. ### 2) ๋ฃจํ”„ ๋ณต๊ตฌ ํ…Œ์ŠคํŠธ ํ™•๋Œ€ - `AgentLoopCodeQualityTests`์— unknown/disallowed/no-progress ํ˜ผํ•ฉ ๊ด€์  ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€. - unknown/disallowed ์ค‘๋‹จ ์‘๋‹ต์— `tool_search` ๊ฐ€์ด๋“œ๊ฐ€ ์œ ์ง€๋˜๋Š”์ง€ ํšŒ๊ท€ ๊ฒ€์ฆ. ### 3) ์ขŒ์ธก ํŒจ๋„ ๋‹จ์ˆœํ™” 2์ฐจ - ํ‘œํ˜„ ๋ ˆ๋ฒจ ๊ธฐ์ค€ ์ •๋ฆฌ: - `rich`: ์‹คํŒจ ํ•„ํ„ฐ ๋…ธ์ถœ - `balanced/simple`: ์‹คํŒจ ํ•„ํ„ฐ ๋น„๋…ธ์ถœ - Quick strip ํ‘œ์‹œ ์กฐ๊ฑด๋„ ์œ„ ์ •์ฑ…๊ณผ ์—ฐ๋™ํ•ด ์‹คํŒจ ๋ฒ„ํŠผ์ด ์ˆจ๊ฒจ์ง„ ๋ชจ๋“œ์—์„œ ๊ณผ๋ฐ€ ํ‘œ์‹œ๋ฅผ ๋ฐฉ์ง€. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (421 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 5์ฐจ: ์ž‘์—… ์š”์•ฝ ํŒ์—… ํ‘œ์‹œ ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 10:55 (KST) ### 1) ์ž‘์—… ์š”์•ฝ ํŒ์—… ๋ฐ€๋„/ํ‘œ์‹œ ๋ฐฉ์‹ ์ •๋ฆฌ - ํŒ์—… ํƒ€์ดํ‹€์„ `์ž‘์—… ์š”์•ฝ`์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ๋ณด์กฐ ์„ค๋ช…(`ํ˜„์žฌ ์‹คํ–‰/๊ถŒํ•œ/์ž‘์—… ํ๋ฆ„`)์„ ์ถ”๊ฐ€. - ํ•„ํ„ฐ ์นฉ์„ `์ „์ฒดยท๊ถŒํ•œยท๋Œ€๊ธฐยท๋„๊ตฌยท์„œ๋ธŒยทํ›…` ์ค‘์‹ฌ์œผ๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ , ์นฉ ํŒจ๋”ฉ/ํฐํŠธ/๋งˆ์ง„์„ ์ถ•์†Œํ•ด ์Šคํฌ๋กค ํ”ผ๋กœ๋ฅผ ์™„ํ™”. - ํŒ์—… ๋ฃจํŠธ ๋ฐฐ๊ฒฝ์„ ํ…Œ๋งˆ ๋ฆฌ์†Œ์Šค(`LauncherBackground`) ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ , ๋ณธ๋ฌธ ํ…์ŠคํŠธ๋Š” `PrimaryText/SecondaryText`๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ˆ. ### 2) ๊ถŒํ•œ ์นด๋“œ/์ด๋ ฅ ๊ตฌ์กฐ ๋‹จ์ˆœํ™” - ๊ถŒํ•œ ์š”์•ฝ ์นด๋“œ๋ฅผ `ํ˜„์žฌ ๊ถŒํ•œยท์„ค๋ช…ยท๊ธฐ๋ณธ ๋ชจ๋“œยท์˜ˆ์™ธ ๊ฐœ์ˆ˜` ๊ตฌ์กฐ๋กœ ๋‹จ์ˆœํ™”. - ๋ชจ๋“œ๋ณ„ ์‹œ๊ฐ ํŒ”๋ ˆํŠธ ํ•จ์ˆ˜๋ฅผ ๋„์ž…ํ•ด `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ/๊ถŒํ•œ ์š”์ฒญ/ํŽธ์ง‘ ์ž๋™ ์Šน์ธ/๊ณ„ํš ๋ชจ๋“œ/๊ถŒํ•œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ` ์ƒํƒœ๋ฅผ ์ผ๊ด€ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œ. - ์ตœ๊ทผ ๊ถŒํ•œ ์ด๋ ฅ์„ ๊ธฐ์กด ๋‹จ์ผ ๋ฌธ์žฅ ํฌ๋งท์—์„œ `์‹œ๊ฐ„ยท๋„๊ตฌยท๊ฒฐ๊ณผยท์š”์•ฝ` ํฌ๋งท์œผ๋กœ ์žฌ๊ตฌ์„ฑ. ### 3) ๊ถŒํ•œ ์•ก์…˜ ๋ผ๋ฒจ ์ตœ์‹  ์ฒด๊ณ„ ๋ฐ˜์˜ - Task Summary์˜ ๊ถŒํ•œ ์•ก์…˜ ๋ฒ„ํŠผ์„ ์•„๋ž˜ ์ˆœ์„œ๋กœ ํ†ต์ผ: - `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ` - `๊ถŒํ•œ ์š”์ฒญ` - `ํŽธ์ง‘ ์ž๋™ ์Šน์ธ` - `๊ณ„ํš ๋ชจ๋“œ` - `๊ถŒํ•œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ` - `ํ•ด์ œ` ### 4) ๋ถˆํ•„์š” ์‹คํŒจ ์ค‘์‹ฌ ์•ก์…˜ ์ถ•์†Œ - ์ž‘์—… ์š”์•ฝ ํŒ์—… ํ•˜๋‹จ ์•ก์…˜์—์„œ `์‹คํŒจ ๋Œ€ํ™”๋งŒ ๋ณด๊ธฐ` ๋ฒ„ํŠผ์„ ์ œ๊ฑฐํ•˜๊ณ , ์žฌ์‹œ๋„/์ง„ํ–‰์ค‘ ํ•„ํ„ฐ ์ค‘์‹ฌ์œผ๋กœ ๋‹จ์ˆœํ™”. ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 6์ฐจ: ์ตœ๊ทผ ์‹คํ–‰ ์นด๋“œ ์••์ถ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:00 (KST) ### 1) ์ตœ๊ทผ ์—์ด์ „ํŠธ ์‹คํ–‰ ์นด๋“œ ํ‘œ์‹œ ๊ฐ„์†Œํ™” - ์ตœ๊ทผ ์‹คํ–‰ ํ‘œ์‹œ ๊ฐœ์ˆ˜๋ฅผ 4๊ฐœ์—์„œ 3๊ฐœ๋กœ ์ถ•์†Œ. - ์นด๋“œ ๋ณธ๋ฌธ ์š”์•ฝ์„ ๊ธธ์ด ์ œํ•œ(๋ง์ค„์ž„) ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•ด ๊ธด ์„ค๋ช…์ด ๋ ˆ์ด์•„์›ƒ์„ ๊นจ์ง€ ์•Š๋„๋ก ์กฐ์ •. - `๊ด€๋ จ ์‹คํ–‰ ๋กœ๊ทธ/๊ด€๋ จ ํŒŒ์ผ` ์ƒ์„ธ ๋ชฉ๋ก ๋‚˜์—ด์„ ์ œ๊ฑฐํ•˜๊ณ  `์‹คํ–‰ ๋กœ๊ทธ n ยท ๊ด€๋ จ ํŒŒ์ผ n` ํ•œ ์ค„ ์š”์•ฝ์œผ๋กœ ์••์ถ•. ### 2) ์‹คํ–‰ ์นด๋“œ ์•ก์…˜ ์ •๋ฆฌ - ์‹คํ–‰ ์ƒ์„ธ ์ด๋™์€ `ํƒ€์ž„๋ผ์ธ ๋ณด๊ธฐ` ๋‹จ์ผ ์•ก์…˜์œผ๋กœ ํ†ต์ผ. - ์™„๋ฃŒ ์ƒํƒœ ์นด๋“œ์—์„œ `์ƒˆ ๋ถ„๊ธฐ์—์„œ ์ด์–ด๊ฐ€๊ธฐ`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  `ํ›„์† ์ž‘์—… ํ์— ๋„ฃ๊ธฐ` ์ค‘์‹ฌ์œผ๋กœ ๋‹จ์ˆœํ™”. ### 3) ์‹œ๊ฐ ๋ฐ€๋„ ์ •๋ฆฌ - ์นด๋“œ ํŒจ๋”ฉ/๊ฐ„๊ฒฉ์„ ์ถ•์†Œํ•ด ๋™์ผ ์˜์—ญ์—์„œ ๋” ๋น ๋ฅด๊ฒŒ ์Šค์บ” ๊ฐ€๋Šฅํ•˜๋„๋ก ์กฐ์ •. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 7์ฐจ: ์ž‘์—… ์นด๋“œ ๋ฒ„ํŠผ ์Šคํƒ€์ผ ํ†ต์ผ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:03 (KST) ### 1) ๊ณตํ†ต ๋ฒ„ํŠผ ๋นŒ๋” ๋„์ž… - `ChatWindow.xaml.cs`์— `CreateTaskSummaryActionButton(...)` ์ถ”๊ฐ€. - ์ž‘์—… ์š”์•ฝ ํŒ์—… ๋‚ด ์•ก์…˜ ๋ฒ„ํŠผ ๊ณตํ†ต ์†์„ฑ์„ ์ผ์›ํ™”: - `FontSize 10.5`, `MinHeight 28`, `Padding 9x4`, `BorderThickness 1` - ์ผ๊ด€๋œ ๋งˆ์ง„ ๊ทœ์น™(๊ธฐ๋ณธ trailing 6px) ### 2) ์ ์šฉ ๋ฒ”์œ„ - `BuildTaskSummaryActionRow` (queue/permission) - `BuildHookSummaryCard` - `BuildActiveBackgroundSummaryCard` - `BuildRecentBackgroundJobCard` - `ShowTaskSummaryPopup`์˜ ์ตœ๊ทผ ์‹คํ–‰/์žฌ์‹œ๋„/์ง„ํ–‰์ค‘ ํ•„ํ„ฐ ๋ฒ„ํŠผ ### 3) ํšจ๊ณผ - ์นด๋“œ ์˜์—ญ๋งˆ๋‹ค ๋ฒ„ํŠผ ํฌ๊ธฐ/๋‘๊ป˜/๊ฐ„๊ฒฉ์ด ๋‹ฌ๋ผ ๋ณด์ด๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด์†Œ. - ์ƒ‰์ƒ ์ฒด๊ณ„๋Š” ์œ ์ง€ํ•˜๋ฉด์„œ ์‹œ๊ฐ์  ๋ฐ€๋„์™€ ํด๋ฆญ ์˜์—ญ ์ผ๊ด€์„ฑ์„ ํ™•๋ณด. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 8์ฐจ: ์นด๋“œ ํƒ€์ดํฌ ๊ณ„์ธต ํ†ต์ผ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:06 (KST) ### 1) ํƒ€์ดํฌ ๊ณ„์ธต ์ •๋ ฌ - `BuildTaskSummaryCard`์˜ ํ•ต์‹ฌ ๋ผ๋ฒจ์„ `11px + SemiBold`๋กœ ์ •๋ฆฌํ•ด ์นด๋“œ ํ—ค๋” ์œ„๊ณ„๋ฅผ ๊ณ ์ •. - `BuildHookSummaryCard`, `BuildActiveBackgroundSummaryCard`, `BuildRecentBackgroundJobCard` ๋ณธ๋ฌธ์„ `10.5px` ๊ธฐ์ค€์œผ๋กœ ํ†ต์ผ. ### 2) ํ…Œ๋งˆ ๋Œ€๋น„ ์ผ๊ด€ํ™” - ์นด๋“œ ๋ณธ๋ฌธ/๋ณด์กฐ๋ฌธ๊ตฌ์˜ ๊ธฐ๋ณธ ์ƒ‰์ƒ์„ `SecondaryText` ๋ฆฌ์†Œ์Šค ์šฐ์„  ์‚ฌ์šฉ์œผ๋กœ ์ •๋ฆฌ. - ํ™œ์„ฑ/๊ฐ•์กฐ ์ƒํƒœ๋งŒ ๋ณ„๋„ ๊ฐ•์กฐ์ƒ‰์„ ์œ ์ง€ํ•˜์—ฌ ์ •๋ณด ๊ณ„์ธต์ด ๋” ๋ช…ํ™•ํ•ด์ง€๋„๋ก ์กฐ์ •. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 9์ฐจ: ์นด๋“œ ์•„์ด์ฝ˜/ํ‘œ์‹œ ๊ทœ์น™ ํ†ต์ผ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:08 (KST) ### 1) ์ž‘์—… ์นด๋“œ ์•„์ด์ฝ˜ ํ—ค๋” ๋„์ž… - `BuildTaskSummaryCard`์— ์ž‘์—… ์ข…๋ฅ˜๋ณ„ ์•„์ด์ฝ˜์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ œ๋ชฉ/์š”์•ฝ์„ 2์ค„ ๊ตฌ์กฐ๋กœ ๋ถ„๋ฆฌ. - ์ž‘์—… ์ข…๋ฅ˜๋ณ„ ๊ณตํ†ต ๋งคํ•‘ ํ•จ์ˆ˜ `GetTaskKindVisual(kind)` ์ถ”๊ฐ€: - permission, queue, tool, hook, subagent, default ### 2) ํ›…/๋ฐฑ๊ทธ๋ผ์šด๋“œ ์นด๋“œ ์•„์ด์ฝ˜ ์ •๋ ฌ - `BuildHookSummaryCard`์— `ํ›… ์ด๋ฒคํŠธ` ์•„์ด์ฝ˜ ํ—ค๋” ์ถ”๊ฐ€. - `BuildActiveBackgroundSummaryCard`์— ์‹คํ–‰์ค‘ ๋ฐฐ๊ฒฝ์ž‘์—… ์•„์ด์ฝ˜ ํ—ค๋” ์ถ”๊ฐ€. - `BuildRecentBackgroundJobCard`์— ์ž‘์—… ์ƒํƒœ ์•„์ด์ฝ˜ ํ—ค๋” ์ถ”๊ฐ€. ### 3) ํšจ๊ณผ - ์นด๋“œ ํƒ€์ž…์„ ํ…์ŠคํŠธ ์ฝ๊ธฐ ์ „์— ์•„์ด์ฝ˜/์ƒ‰์œผ๋กœ ๋จผ์ € ์ธ์ง€ ๊ฐ€๋Šฅ. - ๋™์ผ ์นด๋“œ๊ตฐ์—์„œ ํ—ค๋” ํ‘œ์‹œ ๋ฐฉ์‹์ด ํ†ต์ผ๋˜์–ด ์‹œ๊ฐ ํ๋ฆ„์ด ์•ˆ์ •ํ™”๋จ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 10์ฐจ: ๊ถŒํ•œ ํŒ์—… ํ‘œ์‹œ/๊ฐ•์กฐ ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:11 (KST) ### 1) ๊ถŒํ•œ ๋ชจ๋“œ ๋ฆฌ์ŠคํŠธ ์„ ํƒ ๊ฐ•์กฐ - ํ™œ์„ฑ ํ•ญ๋ชฉ์— `๋ฐฐ๊ฒฝ(#EEF2FF) + ํ…Œ๋‘๋ฆฌ(#C7D2FE) + ์ฒดํฌ ์•„์ด์ฝ˜`์„ ์ ์šฉํ•ด ์„ ํƒ ์ƒํƒœ ์ธ์ง€๋ฅผ ๊ฐ•ํ™”. - hover ์‹œ ๋น„ํ™œ์„ฑ ํ•ญ๋ชฉ์€ ์—ฐํ•œ ๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ, ํ™œ์„ฑ ํ•ญ๋ชฉ์€ ๊ฐ•์กฐ์ƒ‰์„ ์œ ์ง€ํ•˜๋„๋ก ๋ถ„๋ฆฌ. ### 2) ์„ค๋ช… ๊ฐ€๋…์„ฑ ์ •๋ฆฌ - ๊ถŒํ•œ ์š”์•ฝ ์„ค๋ช…/๋ชจ๋“œ ์„ค๋ช… ํ…์ŠคํŠธ์— ์ค„๊ฐ„๊ฒฉ(`LineHeight`)์„ ์ ์šฉ. - ์•„์ด์ฝ˜/ํ…์ŠคํŠธ ์ •๋ ฌ๊ณผ ํŒจ๋”ฉ์„ ์กฐ์ •ํ•ด ๊ฐ ํ–‰์˜ ์‹œ๊ฐ ์ค‘์‹ฌ์„ ๋งž์ถค. ### 3) ๋ผ๋ฒจ/์ƒ‰์ƒ ๋ณด์ • - ๊ถŒํ•œ ์š”์•ฝ์— ๊ธฐ๋ณธ ๋ชจ๋“œ๋ฅผ ๋‚ด๋ถ€ ๊ฐ’ ๋Œ€์‹  ํ‘œ์‹œ ๋ผ๋ฒจ(`PermissionModeCatalog.ToDisplayLabel`)๋กœ ์ถœ๋ ฅ. - `๊ถŒํ•œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ` ์ƒ‰์ƒ์„ ๊ฒฝ๊ณ ํ˜• ๋ถ‰์€ ๊ณ„์—ด์—์„œ ํ—ˆ์šฉํ˜• ๋…น์ƒ‰ ๊ณ„์—ด๋กœ ๋ณด์ •. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 11์ฐจ: ๊ถŒํ•œ ์˜ˆ์™ธ/๊ฑฐ๋ถ€ ๋ธ”๋ก ์ •๋ฆฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:12 (KST) ### 1) ๋„๊ตฌ๋ณ„ ์˜ˆ์™ธ ๋ธ”๋ก ์ •๋ฆฌ - `๋„๊ตฌ๋ณ„ override` ๋ช…์นญ์„ `๋„๊ตฌ๋ณ„ ์˜ˆ์™ธ`๋กœ ๋ณ€๊ฒฝ. - ๊ฐ ์˜ˆ์™ธ ์นฉ์— ๊ถŒํ•œ ์•„์ด์ฝ˜์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ชจ๋“œ ๊ฐ’์€ ๋‚ด๋ถ€ ํ‚ค ๋Œ€์‹  ํ‘œ์‹œ ๋ผ๋ฒจ๋กœ ์ถœ๋ ฅ. - ์นฉ ํŒจ๋”ฉ/๋งˆ์ง„์„ ์ค„์—ฌ ํŒ์—… ๋†’์ด ์‚ฌ์šฉ๋Ÿ‰์„ ์ ˆ๊ฐ. ### 2) ์ตœ๊ทผ ๊ถŒํ•œ ๊ฑฐ๋ถ€ ๋ธ”๋ก ์ •๋ฆฌ - ๋ธ”๋ก ํ—ค๋”๋ฅผ ์•„์ด์ฝ˜+์ œ๋ชฉ ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ•˜๊ณ , ์ด๋ฒคํŠธ ์ƒ์„ธ๋ฅผ ๋ณธ๋ฌธ ์ค„๋กœ ๋ถ„๋ฆฌ. - ๋ณธ๋ฌธ ์ค„๊ฐ„๊ฒฉ(LineHeight) ์ ์šฉ์œผ๋กœ ๊ธด ๋ฌธ์žฅ ๊ฐ€๋…์„ฑ ๊ฐœ์„ . ### 3) ๋น ๋ฅธ ์•ก์…˜ ์šฉ์–ด ํ†ต์ผ - `๊ธฐ๋ณธ์œผ๋กœ/์ ๊ทน ํ—ˆ์šฉ/์ฐจ๋‹จ ์œ ์ง€/override ํ•ด์ œ`๋ฅผ - `๊ถŒํ•œ ์š”์ฒญ/ํŽธ์ง‘ ์ž๋™ ์Šน์ธ/ํ™œ์šฉํ•˜์ง€ ์•Š์Œ/์˜ˆ์™ธ ํ•ด์ œ` ๋กœ ํ†ต์ผ. - ๋ฒ„ํŠผ ํฌ๊ธฐ/๋งˆ์ง„์„ ์ถ•์†Œํ•ด ๊ฐ™์€ ์˜์—ญ์— ๋” ๋งŽ์€ ์•ก์…˜์„ ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐ์น˜. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 12์ฐจ: ๊ถŒํ•œ ํŒ์—… ์„น์…˜ ์ ‘ํž˜/ํŽผ์นจ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:17 (KST) ### 1) ๊ธฐ๋ณธ ๋…ธ์ถœ ๊ตฌ์กฐ ๋ณ€๊ฒฝ - ๊ถŒํ•œ ํŒ์—…์—์„œ ๊ธฐ๋ณธ ๋…ธ์ถœ ์˜์—ญ์„ `ํ•ต์‹ฌ ๊ถŒํ•œ ๋ชจ๋“œ`๋กœ ๊ณ ์ •. - `ํ˜„์žฌ ๊ถŒํ•œ ์š”์•ฝ`, `๋„๊ตฌ๋ณ„ ์˜ˆ์™ธ`, `์ตœ๊ทผ ๊ถŒํ•œ ๊ฑฐ๋ถ€`, `๊ณ ๊ธ‰ ๋ชจ๋“œ`๋Š” ์ ‘ํž˜ ์„น์…˜์œผ๋กœ ์žฌ๊ตฌ์„ฑ. ### 2) ์ ‘ํž˜ UI ๊ตฌํ˜„ - ์„น์…˜ ํ—ค๋”(์•„์ด์ฝ˜/ํƒ€์ดํ‹€/์บ๋Ÿฟ) + ๋ณธ๋ฌธ ํ† ๊ธ€ ๊ตฌ์กฐ๋ฅผ ๊ณตํ†ต ๋นŒ๋”(`CreateCollapsibleSection`)๋กœ ๊ตฌํ˜„. - hover/ํด๋ฆญ ๋ฐ˜์‘๊ณผ ํŽผ์นจ ์ƒํƒœ ์บ๋Ÿฟ(โ–ถ/โ–ผ)์„ ๋™๊ธฐํ™”. ### 3) ๊ธฐ๋Œ€ ํšจ๊ณผ - ์ดˆ๊ธฐ ํŒ์—… ๋†’์ด๊ฐ€ ์ค„์–ด ์ž…๋ ฅ/์ฑ„ํŒ… ์˜์—ญ์„ ๊ฐ€๋ฆฌ๋Š” ์ •๋„ ์™„ํ™”. - ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๋‹จ๊ณ„์ ์œผ๋กœ ์—ด๋žŒ ๊ฐ€๋Šฅํ•ด ๊ถŒํ•œ ๋ฉ”๋‰ด ํƒ์ƒ‰ ํ”ผ๋กœ ๊ฐ์†Œ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 13์ฐจ: ๊ถŒํ•œ ํŒ์—… ์„น์…˜ ์ƒํƒœ ์ €์žฅ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:19 (KST) ### 1) ์„ค์ • ๋ชจ๋ธ ํ™•์žฅ - `LlmSettings`์— `permissionPopupSections` ๋”•์…”๋„ˆ๋ฆฌ ์ถ”๊ฐ€. - ๊ถŒํ•œ ํŒ์—… ์„น์…˜๋ณ„ ๋งˆ์ง€๋ง‰ ํŽผ์นจ ์ƒํƒœ๋ฅผ ์„ค์ • ํŒŒ์ผ(`settings.dat`)์— ์ €์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ™•์žฅ. ### 2) ChatWindow ์ƒํƒœ ์—ฐ๋™ - `GetPermissionPopupSectionExpanded(sectionKey)` / `SetPermissionPopupSectionExpanded(sectionKey, expanded)` ํ—ฌํผ ์ถ”๊ฐ€. - ์ ‘ํž˜ ํ—ค๋” ํด๋ฆญ ์‹œ ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ์ €์žฅํ•˜๊ณ , ํŒ์—… ์žฌ์˜คํ”ˆ ์‹œ ์ €์žฅ๋œ ์ƒํƒœ๋ฅผ ๋ณต์›. ### 3) ์ ์šฉ ์„น์…˜ ํ‚ค - `permission_summary` - `permission_overrides` - `permission_denied` - `permission_advanced` ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 14์ฐจ: ์Šฌ๋ž˜์‹œ ํŒ”๋ ˆํŠธ ๊ทธ๋ฃน ์ ‘ํž˜/์ƒํƒœ ์ €์žฅ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:23 (KST) ### 1) ์„ค์ • ๋ชจ๋ธ ํ™•์žฅ - `LlmSettings`์— `slashPaletteSections` ๋”•์…”๋„ˆ๋ฆฌ ์ถ”๊ฐ€. - `/` ํŒ”๋ ˆํŠธ ๊ทธ๋ฃน์˜ ํŽผ์นจ ์ƒํƒœ๋ฅผ `settings.dat`์— ์ €์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅ. ### 2) ์Šฌ๋ž˜์‹œ ํŒ”๋ ˆํŠธ ๊ทธ๋ฃน UI - `RenderSlashPage()`์— ๊ทธ๋ฃน ํ—ค๋” ์ถ”๊ฐ€: - `๋ช…๋ น` - `์Šคํ‚ฌ` - ๊ฐ ํ—ค๋”์—์„œ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ ํ† ๊ธ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ์ €์žฅ. ### 3) ์„ ํƒ/์ด๋™ ๋ณด์ • - ์ ‘ํž˜ ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•ด ๊ธฐ๋ณธ ์„ ํƒ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐ(`GetFirstVisibleSlashIndex`). - Up/Down/ํœ  ์ด๋™(`SlashPopup_ScrollByDelta`)์ด ํŽผ์ณ์ง„ ๊ทธ๋ฃน ํ•ญ๋ชฉ๋งŒ ์ˆœํšŒํ•˜๋„๋ก ๋ณด์ •. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 15์ฐจ: ์Šฌ๋ž˜์‹œ ์ตœ๊ทผ ์‚ฌ์šฉ ์ƒ๋‹จ ๊ณ ์ •) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:32 (KST) ### 1) ์„ค์ • ๋ชจ๋ธ ํ™•์žฅ - `LlmSettings`์— `recentSlashCommands`(MRU) ์ถ”๊ฐ€. - ์ตœ๊ทผ ์‹คํ–‰ํ•œ ์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด๋ฅผ ์ตœ์‹  ์ˆœ์œผ๋กœ ์ €์žฅ(์ตœ๋Œ€ 20๊ฐœ). ### 2) ์‹คํ–‰ ์‹œ์  ๊ธฐ๋ก - `ExecuteSlashSelectedItem()`์—์„œ ์‹ค์ œ ์‹คํ–‰๋œ ๋ช…๋ น์„ MRU์— ๊ธฐ๋ก. ### 3) ๊ทธ๋ฃน ๋‚ด๋ถ€ ์ •๋ ฌ/ํ‘œ์‹œ - `RenderSlashPage()`์—์„œ `๋ช…๋ น`/`์Šคํ‚ฌ` ๊ทธ๋ฃน ๊ฐ๊ฐ์„ ์ตœ๊ทผ ์‚ฌ์šฉ ์ˆœ์œผ๋กœ ์ •๋ ฌ. - ์ตœ๊ทผ ์‚ฌ์šฉ ํ•ญ๋ชฉ์— `์ตœ๊ทผ` ๋ฐฐ์ง€๋ฅผ ํ‘œ์‹œํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ถ„. ### 4) ์„ ํƒ ์Šคํฌ๋กค ์ •ํ™•๋„ ๋ณด๊ฐ• - ์„น์…˜ ํ—ค๋”/์ ‘ํž˜์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋˜ ์ธ๋ฑ์Šค ๋ถˆ์ผ์น˜๋ฅผ ์ œ๊ฑฐ: - ๋ Œ๋”๋œ ์‹ค์ œ ์•„์ดํ…œ ๋งต(`_slashVisibleItemByAbsoluteIndex`)์œผ๋กœ ๊ฐ€์‹œ ์˜์—ญ ์Šคํฌ๋กค ๋ณด์ •. ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 16์ฐจ: ์Šฌ๋ž˜์‹œ ํ•€ ๊ณ ์ • ๊ฒฐํ•ฉ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:36 (KST) ### 1) ์ˆ˜๋™ ํ•€ ๊ณ ์ • UI ์ถ”๊ฐ€ - ์Šฌ๋ž˜์‹œ ํŒ”๋ ˆํŠธ ํ•ญ๋ชฉ ์šฐ์ธก์— ํ•€ ํ† ๊ธ€(๊ณ ์ •/ํ•ด์ œ) ์ถ”๊ฐ€. - ํ•€ ์ƒํƒœ ํ•ญ๋ชฉ์— `ํ•€` ๋ฐฐ์ง€ ํ‘œ์‹œ. ### 2) ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„ ํ†ตํ•ฉ - ๊ทธ๋ฃน ๋‚ด๋ถ€ ์ •๋ ฌ์„ `ํ•€(Favorite) > ์ตœ๊ทผ(MRU) > ๋ช…๋ น์–ด ์ด๋ฆ„` ์ˆœ์œผ๋กœ ํ†ตํ•ฉ. - ๋ช…๋ น/์Šคํ‚ฌ ๊ทธ๋ฃน ๋ชจ๋‘ ๋™์ผ ์šฐ์„ ์ˆœ์œ„ ์ ์šฉ. ### 3) ์ƒํ˜ธ์ž‘์šฉ ๋ณด์ • - ํ•€ ํ† ๊ธ€ ํด๋ฆญ ์‹œ ๋ช…๋ น ์‹คํ–‰ ์ด๋ฒคํŠธ๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌ(`Handled=true`). - ํŒ์—… ์˜คํ”ˆ ์ƒํƒœ์—์„œ๋Š” TextChanged ํŠธ๋ฆฌ๊ฑฐ ์—†์ด ์ฆ‰์‹œ ์žฌ๋ Œ๋”๋งํ•˜๋„๋ก `ToggleSlashFavorite()` ๋ณด๊ฐ•. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 17์ฐจ: AX Agent ๊ธฐ๋ณธ ํ™œ์„ฑ + ์—…๋ฐ์ดํŠธ ํŒ์—… ์ œ๊ฑฐ) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:39 (KST) ### 1) AX Agent ๊ธฐ๋ณธ ํ™œ์„ฑํ™” - `AppSettings.AiEnabled` ๊ธฐ๋ณธ๊ฐ’์„ `true`๋กœ ๋ณ€๊ฒฝ. - ์„ค์ • ๋กœ๋“œ ์ •๊ทœํ™”(`SettingsService.NormalizeRuntimeSettings`)์—์„œ `AiEnabled=false`์ธ ๊ธฐ์กด ๊ฐ’๋„ ์ž๋™์œผ๋กœ `true`๋กœ ๋ณด์ •. ### 2) ์—…๋ฐ์ดํŠธ ์„ค์น˜ ํ›„ ๋ฉ”์‹œ์ง€๋ฐ•์Šค ์ œ๊ฑฐ - `App.xaml.cs` ์‹œ์ž‘ ๋กœ์ง์—์„œ `MigrationSummary`๋ฅผ `CustomMessageBox`๋กœ ํ‘œ์‹œํ•˜๋˜ ๋ธ”๋ก ์ œ๊ฑฐ. - ๊ฒฐ๊ณผ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ/๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์งํ›„ ํ‘œ์‹œ๋˜๋˜ ์•ˆ๋‚ด ํŒ์—…์ด ๋” ์ด์ƒ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 18์ฐจ: ์Šฌ๋ž˜์‹œ ํ•€/์ตœ๊ทผ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ ์„ค์ •์ฐฝ ์—ฐ๋™) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:41 (KST) ### 1) ์„ค์ • ๋ชจ๋ธ ํ™•์žฅ - `LlmSettings`์— ์•„๋ž˜ ํ•ญ๋ชฉ ์ถ”๊ฐ€: - `maxFavoriteSlashCommands` (๊ธฐ๋ณธ 10) - `maxRecentSlashCommands` (๊ธฐ๋ณธ 20) ### 2) ์„ค์ •์ฐฝ(UI) ์—ฐ๋™ - AX Agent > ์Šคํ‚ฌ ์„น์…˜์— ์Šฌ๋ผ์ด๋” 2์ข… ์ถ”๊ฐ€: - `์Šฌ๋ž˜์‹œ ํ•€ ์ตœ๋Œ€ ๊ฐœ์ˆ˜` (1~30) - `์Šฌ๋ž˜์‹œ ์ตœ๊ทผ ์ตœ๋Œ€ ๊ฐœ์ˆ˜` (5~50) - `SettingsViewModel`์— ๋ฐ”์ธ๋”ฉ ์†์„ฑ/Load/Save ๋งคํ•‘ ์ถ”๊ฐ€. ### 3) ๋Ÿฐํƒ€์ž„ ์ œํ•œ ๋ฐ˜์˜ - `ToggleSlashFavorite()`์—์„œ ํ•€ ๊ฐœ์ˆ˜ ์ƒํ•œ์„ ์„ค์ •๊ฐ’์œผ๋กœ ์ ์šฉ. - `RegisterRecentSlashCommand()`์—์„œ ์ตœ๊ทผ(MRU) ์ƒํ•œ์„ ์„ค์ •๊ฐ’์œผ๋กœ ์ ์šฉ. - `BuildFavoriteSlashRankMap()`์€ ์ตœ๋Œ€ ํ•€ ๊ฐœ์ˆ˜๊นŒ์ง€๋งŒ ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„์— ๋ฐ˜์˜. ### 4) ์ •๊ทœํ™” ๋ณด๊ฐ• - `SettingsService.NormalizeRuntimeSettings()`์—์„œ ํ•€/์ตœ๊ทผ ์ตœ๋Œ€๊ฐ’ ๋ฒ”์œ„ ๋ณด์ • ๋ฐ ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ์ž๋™ ์ •๋ฆฌ. ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 19์ฐจ: ์Šฌ๋ž˜์‹œ ๊ฐœ์ˆ˜ ์„ค์ • ํšŒ๊ท€ ์ ๊ฒ€) ์—…๋ฐ์ดํŠธ: 2026-04-04 11:46 (KST) ### 1) ์Šฌ๋ž˜์‹œ ์„ค์ • ์—ฐ๋™ ๊ฒ€์ฆ - `maxFavoriteSlashCommands`, `maxRecentSlashCommands` ์„ค์ •๊ฐ’์ด - ํ•€ ํ† ๊ธ€ ์ƒํ•œ - ์ตœ๊ทผ(MRU) ๋ˆ„์  ์ƒํ•œ - ๊ทธ๋ฃน ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„ ์— ๋ฐ˜์˜๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ ๊ฒ€. ### 2) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (39 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 20์ฐจ: ์Šฌ๋ž˜์‹œ/๊ถŒํ•œ UX ๋งˆ๋ฌด๋ฆฌ + ์ „์ฒด ํšŒ๊ท€) ์—…๋ฐ์ดํŠธ: 2026-04-04 12:05 (KST) ### 1) ์Šฌ๋ž˜์‹œ ํŒ”๋ ˆํŠธ ํ€ต๊ด€๋ฆฌ ๋งˆ๋ฌด๋ฆฌ - `/` ํŒ์—… ํ—ค๋”์— `์ •๋ฆฌ`, `์ „์ฒด ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ` ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€. - ๋ชจ๋“  ์„น์…˜์ด ์ ‘ํžŒ ๊ฒฝ์šฐ ํ•˜๋‹จ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ๋…ธ์ถœํ•ด ๋นˆ ํ™”๋ฉด ์˜ค์ธ ๋ฐฉ์ง€. - ์„น์…˜ ์ƒํƒœ ๋ผ๋ฒจ(`์ „์ฒด ์ ‘๊ธฐ`/`์ „์ฒด ํŽผ์น˜๊ธฐ`)์„ ํ˜„์žฌ ์ƒํƒœ์— ๋งž์ถฐ ์ฆ‰์‹œ ๊ฐฑ์‹ . ### 2) ๊ถŒํ•œ ํŒ์—… ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ๋ณด๊ฐ• - ์„น์…˜ ํ—ค๋”๋ฅผ ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  `Enter/Space` ํ† ๊ธ€ ์ง€์›. - ๊ถŒํ•œ ๋ชจ๋“œ ํ–‰์„ ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  `Enter/Space` ์ฆ‰์‹œ ์ ์šฉ ์ง€์›. - ํŒ์—… ์˜คํ”ˆ ์‹œ ์ฒซ ํฌ์ปค์Šค ์ž๋™ ์ด๋™, `Esc` ๋‹ซ๊ธฐ ์ง€์›์œผ๋กœ ํ‚ค๋ณด๋“œ ์™„๊ฒฐ์„ฑ ํ™•๋ณด. ### 3) ์„ค์ • ์—ฐ๋™ ๊ฐ€์‹œ์„ฑ ๊ฐœ์„  - AX Agent ์„ค์ •์˜ ์Šฌ๋ž˜์‹œ ํ•€/์ตœ๊ทผ ์ƒํ•œ ์Šฌ๋ผ์ด๋”์— `์ €์žฅ ํ›„ ์ฆ‰์‹œ ๋ฐ˜์˜` ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ฐ˜์˜ ์‹œ์ ์„ ๋ช…ํ™•ํ™”. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (436 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 21์ฐจ: Codex/Claudeํ˜• ์ž…๋ ฅ UX ๋ณด๊ฐ• + ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ •๋น„) ์—…๋ฐ์ดํŠธ: 2026-04-04 12:11 (KST) ### 1) ์Šฌ๋ž˜์‹œ ์ž…๋ ฅ ํƒ์ƒ‰ ๋ณด๊ฐ• - `/` ํŒ์—… `ScrollViewer`์— ์ง์ ‘ ํœ  ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด ์Šคํฌ๋กค ๋ˆ„๋ฝ์„ ์ค„์ž„. - ํ‚ค๋ณด๋“œ ํƒ์ƒ‰์„ `Up/Down`์—์„œ `PageUp/PageDown/Home/End`๊นŒ์ง€ ํ™•์žฅ. - ๊ณ ํ•ด์ƒ๋„ ํœ  ๋ธํƒ€๋ฅผ ๋‹จ๊ณ„ ์ด๋™์œผ๋กœ ํ™˜์‚ฐํ•ด ๊ณผ๋„ํ•œ ์ ํ”„/๋ฏธ๋™์ž‘์„ ๋ฐฉ์ง€. ### 2) ๊ถŒํ•œ ํŒ์—… ํฌ์ปค์Šค ์•ˆ์ •ํ™” - ๊ถŒํ•œ ํŒ์—… ์˜คํ”ˆ ์‹œ ์ตœ์ƒ์œ„ ์ž์‹๋งŒ ํ™•์ธํ•˜๋˜ ํฌ์ปค์Šค ๋กœ์ง์„ ์žฌ๊ท€ ํƒ์ƒ‰์œผ๋กœ ๊ต์ฒด. - ์‹ค์งˆ์ ์œผ๋กœ ํฌ์ปค์Šค ๊ฐ€๋Šฅํ•œ ์ฒซ ํ•ญ๋ชฉ(ํ–‰/์„น์…˜ ํ—ค๋”)์— ์•ˆ์ •์ ์œผ๋กœ ์ง„์ž…ํ•˜๋„๋ก ๋ณด๊ฐ•. ### 3) ๋ชจ๋ธ ์„ ํƒ UX ๋‹จ์ˆœํ™” - ์ž…๋ ฅ์ฐฝ ์ƒ๋‹จ ๋ชจ๋ธ ๋ฒ„ํŠผ ํด๋ฆญ ๋™์ž‘์„ AX Agent ๋‚ด๋ถ€ `๋น ๋ฅธ ์„ค์ • ํŒจ๋„` ํ† ๊ธ€๋กœ ๋ณ€๊ฒฝ. - ๋ชจ๋ธ/ํ”„๋ฆฌ์…‹ ๋ฒ„ํŠผ ๋†’์ด/ํŒจ๋”ฉ์„ ์ค„์—ฌ ๋‹จ์ผ ๋ผ์ธ ์ปดํฌ์ € ๋ฐ€๋„๋ฅผ ์ •๋ˆ. ### 4) UI ํšŒ๊ท€ ๋ฌธ์„œํ™” - `docs/UI_UX_CHECKLIST.md` ์‹ ๊ทœ ์ถ”๊ฐ€. - ๊ณตํ†ต ํ’ˆ์งˆ, ์Šฌ๋ž˜์‹œ, ๊ถŒํ•œ, ์„ค์ •, ๋‚ด๋ถ€/์‚ฌ์™ธ ์šด์˜ ๋ชจ๋“œ, ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค ์ ๊ฒ€ ๊ธฐ์ค€์„ ๋ฌธ์„œํ™”. ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 22์ฐจ: ๊ถŒํ•œ ์ฒด๊ณ„ ํ‘œ๋ฉด ํ†ต์ผ + ์šด์˜ ๋ชจ๋“œ ์ ๊ฒ€) ์—…๋ฐ์ดํŠธ: 2026-04-04 12:22 (KST) ### 1) ๊ถŒํ•œ ํ‘œ๋ฉด ๋ช…์นญ/์ˆœ์„œ ํ†ต์ผ - `PermissionModeCatalog` ํ‘œ์‹œ ๋ผ๋ฒจ์„ ์•„๋ž˜ ์ฒด๊ณ„๋กœ ํ†ต์ผ: - `Deny` โ†’ `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ` - `Default` โ†’ `์†Œ๊ทน ํ™œ์šฉ` - `AcceptEdits` โ†’ `์ ๊ทน ํ™œ์šฉ` - `Plan` โ†’ `๊ณ„ํš ์ค‘์‹ฌ` - `BypassPermissions` โ†’ `์™„์ „ ์ž๋™` - `DontAsk` โ†’ `์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰` - ๊ถŒํ•œ ํŒ์—… ์„ ํƒ ์ˆœ์„œ๋ฅผ ๋™์ผ ์ฒด๊ณ„๋กœ ์žฌ์ •๋ ฌํ•˜๊ณ , ๊ธฐ์กด ๊ณ ๊ธ‰ ์„น์…˜ ๋ถ„๋ฆฌ๋ฅผ ์ค„์—ฌ ๋‹จ์ผ ํ๋ฆ„ ํƒ์ƒ‰์œผ๋กœ ์ •๋ฆฌ. ### 2) ๊ถŒํ•œ UI/๋™์ž‘ ์—ฐ๊ฒฐ ์ •๋น„ - ํ•˜๋‹จ/๋ฐฐ๋„ˆ/ํŒ์—…์—์„œ ๊ถŒํ•œ ๋ผ๋ฒจ๊ณผ ์ƒ‰์ƒ ์ฒด๊ณ„๋ฅผ ์ผ์น˜์‹œํ‚ด. - `Chat` ํƒญ ๊ธฐ๋ณธ ๊ถŒํ•œ ์ ์šฉ ๊ฒฝ๋กœ๋ฅผ `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ`์œผ๋กœ ์กฐ์ •. - `/sandbox-toggle`์™€ `AgentSettingsWindow` ๊ถŒํ•œ ์ˆœํ™˜ ์ˆœ์„œ๋ฅผ ๋™์ผ ์ฒด๊ณ„๋กœ ํ†ต์ผ. - ์ž‘์—… ์š”์•ฝ ์นด๋“œ์˜ ๊ถŒํ•œ ์•ก์…˜ ๋ฒ„ํŠผ ๋ผ๋ฒจ๋„ ์ƒˆ ์ฒด๊ณ„๋กœ ๋งž์ถค. ### 3) ์ขŒ์ธก ํŒจ๋„ ๋‹จ์ˆœํ™” ๋ณด๊ฐ• - ์ขŒ์ธก ํŒจ๋„์˜ ๋ชจ๋“œ ๋ฐฐ์ง€ ํ—ค๋”๋ฅผ ์ˆจ๊ฒจ ์‹œ๊ฐ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ํƒญ๋ณ„ ํ•ต์‹ฌ ์„ ํƒ(์ฃผ์ œ/์ž‘์—…) ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌ. ### 4) ์šด์˜ ๋ชจ๋“œ(์‚ฌ๋‚ด/์‚ฌ์™ธ) ํšŒ๊ท€ ์ ๊ฒ€ - ์ฝ”๋“œ ๊ฒฝ๋กœ ํ™•์ธ: - `HttpTool`, `OpenExternalTool`, `OperationModePolicy` ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ๋กœ์ง ์œ ์ง€ ํ™•์ธ. - ํ…Œ์ŠคํŠธ ํ•„ํ„ฐ ์‹คํ–‰: - `OperationModePolicyTests` - `OperationModeReadinessTests` - `LlmOperationModeTests` - ๊ฒฐ๊ณผ: 18/18 ํ†ต๊ณผ. ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (436 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 23์ฐจ: UI ๋งˆ๊ฐ ํŠœ๋‹ + ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์‹คํ–‰ ๊ธฐ๋ก) ์—…๋ฐ์ดํŠธ: 2026-04-04 12:33 (KST) ### 1) ๊ถŒํ•œ ํŒ์—… ๊ฐ€๋…์„ฑ ๋งˆ๊ฐ - ๊ถŒํ•œ ์„น์…˜ ํ—ค๋”/์š”์•ฝ ์นด๋“œ/๊ถŒํ•œ ํ–‰์˜ ํฐํŠธยทํŒจ๋”ฉยท์ค„๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•ด ๋ฐ€๋„ ๊ท ํ˜•์„ ๊ฐœ์„ . - ๊ถŒํ•œ ์„ค๋ช… ๋ฌธ์žฅ์˜ ์ค„๋ฐ”๊ฟˆ์„ ์ •๋ˆํ•ด ํ•ญ๋ชฉ ๊ฐ„ ์Šค์บ” ์†๋„๋ฅผ ๊ฐœ์„ . ### 2) ์ขŒ์ธก ํŒจ๋„/์นดํ…Œ๊ณ ๋ฆฌ ๋ผ๋ฒจ ์ •๋ฆฌ - ํƒญ๋ณ„ ๊ธฐ๋ณธ ์นดํ…Œ๊ณ ๋ฆฌ ๋ผ๋ฒจ์„ - Chat: `์ฃผ์ œ ์„ ํƒ` - Cowork/Code: `์ž‘์—… ์„ ํƒ` ๋กœ ํ†ต์ผํ•ด ์ขŒ์ธก ๋ชฉ์ ์„ฑ์„ ๋ช…ํ™•ํ™”. ### 3) ์ปดํฌ์ € ๋ฏธ์„ธ ํŠœ๋‹ - ์ž…๋ ฅ ์ปจํ…Œ์ด๋„ˆ ํŒจ๋”ฉ, ๋ชจ๋ธ/ํ”„๋ฆฌ์…‹ ๋ฐ” ์ƒ๋‹จ ๊ฐ„๊ฒฉ, ์ธ๋ผ์ธ ์„ค์ • ํŒจ๋„ ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•ด ๋‹จ์ผ ๋ผ์ธ ๊ตฌ์„ฑ์„ ๋” ์ปดํŒฉํŠธํ•˜๊ฒŒ ์ •๋ˆ. - `/` ํŒ”๋ ˆํŠธ ํ•˜๋‹จ ์•ˆ๋‚ด ๋ฌธ๊ตฌ์— `PgUp/PgDn/Home/End` ํ‚ค ์ด๋™ ์ •๋ณด๋ฅผ ๋ฐ˜์˜. ### 4) ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฐ ์šด์˜ ๋ชจ๋“œ ์ ๊ฒ€ ๊ธฐ๋ก - `docs/UI_UX_CHECKLIST.md`์— ์ตœ๊ทผ ์ ๊ฒ€ ๊ฒฐ๊ณผ ์„น์…˜ ์ถ”๊ฐ€. - ์šด์˜ ๋ชจ๋“œ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ํ•„ํ„ฐ 18๊ฑด ํ†ต๊ณผ: - `OperationModePolicyTests` - `OperationModeReadinessTests` - `LlmOperationModeTests` ### 5) ๋นŒ๋“œ ์ด์Šˆ ๋Œ€์‘ - WPF ์ž„์‹œ ์ƒ์„ฑ๋ฌผ(`wpftmp`) ๊ผฌ์ž„์œผ๋กœ ๋ฐœ์ƒํ•œ ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ํ™•์ธ. - `src/AxCopilot/obj`, `src/AxCopilot/bin` ์ •๋ฆฌ ํ›„ ์žฌ๋นŒ๋“œ/์žฌํ…Œ์ŠคํŠธ๋กœ ์ •์ƒ ๋ณต๊ตฌ. ### 6) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj` ํ†ต๊ณผ (436 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 24์ฐจ: ๊ถŒํ•œ/์„ค์ • ์•ˆ์ •ํ™” ๋ณด๊ฐ• + ์‹œ๋‚˜๋ฆฌ์˜ค ์ ๊ฒ€) ์—…๋ฐ์ดํŠธ: 2026-04-04 12:41 (KST) ### 1) ๊ถŒํ•œ ์ƒํƒœ ํ‘œ์‹œ ๊ฐ„์†Œํ™” - `/permissions`, `/allowed-tools` ์ƒํƒœ ํ…์ŠคํŠธ๋ฅผ ์ถ•์•ฝํ˜•์œผ๋กœ ์žฌ์ •๋ฆฌ: - ํ˜„์žฌ ๊ถŒํ•œ ๋ชจ๋“œ - ์šด์˜ ๋ชจ๋“œ - ๊ธฐ๋ณธ๊ฐ’/์˜ˆ์™ธ ๊ฐœ์ˆ˜ - ์˜ˆ์™ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(์ตœ๋Œ€ 3๊ฐœ) - ํ•˜๋‹จ ๊ถŒํ•œ ๋ฒ„ํŠผ ํˆดํŒ์—๋„ ๋™์ผํ•œ ์šด์˜ ๋ชจ๋“œ/๊ธฐ๋ณธ๊ฐ’/์˜ˆ์™ธ ์ •๋ณด๋ฅผ ๋ฐ˜์˜. ### 2) ์ขŒ์ธก ํŒจ๋„ ์ „ํ™˜ ์•ˆ์ •ํ™” - `UpdateSidebarModeMenu()`์—์„œ ํƒญ๋ณ„ ๋ฉ”๋‰ด ํ‘œ์‹œ๋ฅผ ๋™์ผ ๊ฐ’ ์žฌํ• ๋‹นํ•˜์ง€ ์•Š๋„๋ก ๋ณด๊ฐ•ํ•ด ์ „ํ™˜ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ํ”๋“ค๋ฆผ์„ ์™„ํ™”. ### 3) ์ปดํฌ์ € ๋ฐ˜์‘ํ˜• ๋ณด๊ฐ• - ์ƒ๋‹จ ๋ชจ๋ธ ๋ผ๋ฒจ์— `MaxWidth=280`, `TextTrimming=CharacterEllipsis` ์ ์šฉ. - ๊ธด ๋ชจ๋ธ๋ช… ์„ ํƒ ์‹œ ์ปดํฌ์ € ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ๋ฐฉ์ง€. ### 4) AX Agent ์„ค์ •์ฐฝ ์˜คํ”ˆ ์•ˆ์ •์„ฑ ๋ณด๊ฐ• - ์„ค์ •์ฐฝ ๋ฆฌ์†Œ์Šค ๋ณ‘ํ•ฉ ์‹คํŒจ ์‹œ์—๋„ ์ฐฝ ์˜คํ”ˆ์ด ์œ ์ง€๋˜๋„๋ก ์˜ˆ์™ธ ๋ฐฉ์–ด ์ถ”๊ฐ€. - `OpenAgentSettingsFromExternal()`๋ฅผ Dispatcher ๊ฒฝ์œ ๋กœ ๋ณ€๊ฒฝํ•ด ํŠธ๋ ˆ์ด/์™ธ๋ถ€ ์ง„์ž… ์‹œ ํƒ€์ด๋ฐ ์ด์Šˆ๋ฅผ ์™„ํ™”. ### 5) ์‹œ๋‚˜๋ฆฌ์˜ค/ํšŒ๊ท€ ์ ๊ฒ€ - ์šด์˜ ๋ชจ๋“œ ํ•„ํ„ฐ ํ…Œ์ŠคํŠธ(18๊ฑด) ์žฌํ†ต๊ณผ: - `OperationModePolicyTests` - `OperationModeReadinessTests` - `LlmOperationModeTests` - ์ „์ฒด ํ…Œ์ŠคํŠธ 436๊ฑด ์žฌํ†ต๊ณผ. - `dotnet build` ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ์œ ์ง€. ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 25์ฐจ: ์Šฌ๋ž˜์‹œ ํƒ์ƒ‰ ์ •ํ•ฉํ™” + ๊ถŒํ•œ ์š”์ฒญ์ฐฝ ๋ฌธ๊ตฌ ๋ณต๊ตฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:07 (KST) ### 1) slash palette ํƒ์ƒ‰ ์ •ํ•ฉํ™” - ChatWindow์— ๋ Œ๋” ์ˆœ์„œ ์ „์šฉ ์ธ๋ฑ์Šค(_slashVisibleAbsoluteOrder)๋ฅผ ์ถ”๊ฐ€. - / ํŒ์—… ๋ Œ๋” ์‹œ ์‹ค์ œ ํ‘œ์‹œ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ๋ฐฉํ–ฅํ‚ค/ํœ  ์ด๋™์ด ์›๋ณธ ๋ชฉ๋ก ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ ๋ Œ๋” ์ˆœ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋ณด์ •. - Home/End ํ‚ค๋„ ๋™์ผ ๊ธฐ์ค€(ํ˜„์žฌ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ฒซ/๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ)์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ†ต์ผ. ### 2) ๊ถŒํ•œ ์•ก์…˜/ํ‘œ๊ธฐ ์ผ๊ด€์„ฑ ๋ณด๊ฐ• - ์ตœ๊ทผ ๊ถŒํ•œ ๊ฑฐ๋ถ€ ์นด๋“œ์˜ ๋น ๋ฅธ ์•ก์…˜ ์ˆœ์„œ๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์Œ โ†’ ์†Œ๊ทน ํ™œ์šฉ โ†’ ์ ๊ทน ํ™œ์šฉ โ†’ ์˜ˆ์™ธ ํ•ด์ œ๋กœ ์ •๋ ฌ. - /permissions, /allowed-tools ์‚ฌ์šฉ๋ฒ• ํ‘œ๊ธฐ๋ฅผ ๋™์ผ ์ˆœ์„œ(deny|default|acceptedits|plan|bypass|dontask|status)๋กœ ์ •๋ฆฌ. ### 3) ๊ถŒํ•œ ์š”์ฒญ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ•œ๊ตญ์–ด/์ธ์ฝ”๋”ฉ ๋ณต๊ตฌ - PermissionRequestWindow์˜ ์˜ต์…˜/๋„์›€๋ง/ํ—ค๋”/์œ„ํ—˜๋„/๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฌธ๊ตฌ๋ฅผ ํ•œ๊ตญ์–ด ๊ธฐ์ค€์œผ๋กœ ํ†ต์ผ. - ๊นจ์ง„ ๋ฌธ์ž์—ด(๊ถŒํ•œ ํ™•์ธ/์ž‘์—… ํ—ˆ์šฉ/์œ„ํ—˜๋„ ๋ผ๋ฒจ) ๋ณต๊ตฌ. - ํŒŒ์ผ ์š”์•ฝ ๋ฌธ๊ตฌ์—์„œ ์ธ์ฝ”๋”ฉ ์†์ƒ ํ…์ŠคํŠธ๋ฅผ ์ •๋ฆฌ(์กด์žฌํ•จ ยท ์šฉ๋Ÿ‰ ยท ์ˆ˜์ • ์‹œ๊ฐ). - ๋ช…๋ น ์œ„ํ—˜๋„ ๋ถ„๋ฅ˜ ๋ฌธ๊ตฌ๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ณ€ํ™˜. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - dotnet build src/AxCopilot/AxCopilot.csproj ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModeReadinessTests" ํ†ต๊ณผ (43 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 26์ฐจ: slash ์ž…๋ ฅ ๊ณ„์ธต ๋ชจ๋“ˆํ™” 1๋‹จ๊ณ„) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:24 (KST) ### 1) slash ๋ช…๋ น ์นดํƒˆ๋กœ๊ทธ ๋ถ„๋ฆฌ - ChatWindow ๋‚ด๋ถ€์— ์žˆ๋˜ ๋Œ€ํ˜• ์Šฌ๋ž˜์‹œ ๋ช…๋ น ์ •์˜๋ฅผ Views/SlashCommandCatalog.cs๋กœ ๋ถ„๋ฆฌ. - ์นดํƒˆ๋กœ๊ทธ์— ๋‹ค์Œ API๋ฅผ ์ถ”๊ฐ€: - MatchBuiltinCommands(input, isDevTab) - TryGetEntry(commandToken, out entry) - ChatWindow๋Š” ์นดํƒˆ๋กœ๊ทธ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•ด ์ž…๋ ฅ ๊ณ„์ธต ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค. ### 2) slash ํƒ์ƒ‰ ํšŒ๊ท€ ๊ฒ€์ฆ - dotnet build src/AxCopilot/AxCopilot.csproj ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests" ํ†ต๊ณผ (39 passed, 0 failed). ### 3) ์ฐธ๊ณ  - ํ…Œ์ŠคํŠธ ์žฌ๋นŒ๋“œ ์‹œ์ ์— AxCopilot.dll ํŒŒ์ผ ์ž ๊ธˆ(CS2012)์ด ๊ฐ„ํ— ๋ฐœ์ƒํ•˜์—ฌ, ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ๊ธฐ์ค€ --no-build ์‹คํ–‰์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒ€์ฆํ•จ. ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 27์ฐจ: ๊ถŒํ•œ ํ‘œ์‹œ ์นดํƒˆ๋กœ๊ทธ ๋‹จ์ผํ™”) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:25 (KST) ### 1) ๊ถŒํ•œ ํ‘œ์‹œ ์นดํƒˆ๋กœ๊ทธ ๋ถ„๋ฆฌ - ์‹ ๊ทœ ํŒŒ์ผ PermissionModePresentationCatalog๋ฅผ ์ถ”๊ฐ€. - ๊ถŒํ•œ ๋ชจ๋“œ๋ณ„ ๋ผ๋ฒจ/์„ค๋ช…/์•„์ด์ฝ˜/์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๋‹จ์ผ ์†Œ์Šค๋กœ ๊ด€๋ฆฌ: - ํ™œ์šฉํ•˜์ง€ ์•Š์Œ - ์†Œ๊ทน ํ™œ์šฉ - ์ ๊ทน ํ™œ์šฉ - ๊ณ„ํš ์ค‘์‹ฌ - ์™„์ „ ์ž๋™ - ์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰ ### 2) ChatWindow ์—ฐ๋™ - ๊ถŒํ•œ ํŒ์—…์˜ ํ•ต์‹ฌ ๋ชจ๋“œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ์‹œ ํ•˜๋“œ์ฝ”๋”ฉ ํŠœํ”Œ์„ ์ œ๊ฑฐํ•˜๊ณ  ์นดํƒˆ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜. - ๊ฒฐ๊ณผ: ๊ถŒํ•œ ํ‘œ๋ฉด ๊ธฐ์ค€(์ˆœ์„œ/๋ฌธ๊ตฌ/์•„์ด์ฝ˜/์ƒ‰์ƒ)์˜ ์œ ์ง€๋ณด์ˆ˜ ํฌ์ธํŠธ๋ฅผ 1๊ณณ์œผ๋กœ ์ถ•์†Œ. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - dotnet build src/AxCopilot/AxCopilot.csproj ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModeReadinessTests" ํ†ต๊ณผ (43 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 28์ฐจ: ํƒญ๋ณ„ ์„ค์ • ํ•ด์„๊ธฐ ๋„์ž…) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:32 (KST) ### 1) ํƒญ๋ณ„ ์„ค์ • ํ•ด์„ ๋‹จ์ผํ™” - ์‹ ๊ทœ ํŒŒ์ผ AgentTabSettingsResolver ์ถ”๊ฐ€. - ActiveTab ๊ธฐ์ค€ ๊ณตํ†ต ๋ถ„๊ธฐ ์ œ๊ณต: - IsCodeTab, IsCoworkTab - IsPostToolVerificationEnabled(activeTab, llm) - EnumerateCodeTabDisabledTools(codeSettings) ### 2) Agent loop ์—ฐ๋™ - AgentLoopService.MergeDisabledTools()์—์„œ Code ํƒญ ์ „์šฉ ๋„๊ตฌ ๋น„ํ™œ์„ฑ ๋ชฉ๋ก์„ resolver๋กœ ๊ณ„์‚ฐํ•˜๋„๋ก ์ „ํ™˜. - AgentLoopTransitions.Execution์˜ post-tool verification ํŒ๋‹จ์—์„œ resolver ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ฆฌ. ### 3) ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - AgentTabSettingsResolverTests ์‹ ๊ทœ ์ถ”๊ฐ€: - ํƒญ ํŒ๋ณ„ - Cowork/Code ๊ฒ€์ฆ ํ”Œ๋ž˜๊ทธ ๋ถ„๊ธฐ - Code ์ „์šฉ ๋น„ํ™œ์„ฑ ๋„๊ตฌ ๋ชฉ๋ก ๊ณ„์‚ฐ ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - dotnet build src/AxCopilot/AxCopilot.csproj -p:UseSharedCompilation=false -nodeReuse:false ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~AgentTabSettingsResolverTests|FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModeReadinessTests" ํ†ต๊ณผ (49 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 29์ฐจ: ๊ถŒํ•œ/์Šฌ๋ž˜์‹œ L4 ํ†ตํ•ฉ ํšŒ๊ท€ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:40 (KST) ### 1) ๊ถŒํ•œ ๋ชจ๋“œ ์นดํƒˆ๋กœ๊ทธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ - ์‹ ๊ทœ `PermissionModeCatalogTests`: - ๊ธ€๋กœ๋ฒŒ/๋„๊ตฌ ๊ถŒํ•œ ์ •๊ทœํ™” ๋งคํ•‘ ๊ฒ€์ฆ - ์‚ฌ์šฉ์ž ์Šน์ธ ํ•„์š” ์—ฌ๋ถ€ ์ •์ฑ… ๊ฒ€์ฆ - ๊ถŒํ•œ ๋ชจ๋“œ ํ‘œ์‹œ ๋ผ๋ฒจ(ํ™œ์šฉํ•˜์ง€ ์•Š์Œ/์†Œ๊ทน ํ™œ์šฉ/์ ๊ทน ํ™œ์šฉ/๊ณ„ํš ์ค‘์‹ฌ/์™„์ „ ์ž๋™/์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰) ๊ฒ€์ฆ - ์‹ ๊ทœ `PermissionModePresentationCatalogTests`: - ๊ถŒํ•œ ํ‘œ๋ฉด ์ˆœ์„œ(Denyโ†’Defaultโ†’AcceptEditsโ†’Planโ†’BypassPermissionsโ†’DontAsk) ๊ฒ€์ฆ - ๋ฏธ์ •์˜ ๋ชจ๋“œ fallback์ด `Default`๋กœ ์ˆ˜๋ ดํ•˜๋Š”์ง€ ๊ฒ€์ฆ ### 2) ๊ถŒํ•œ ๊ทœ์น™ ์šฐ์„ ์ˆœ์œ„ ํšŒ๊ท€ ๋ณด๊ฐ• - `OperationModePolicyTests`์— deny/allow ํŒจํ„ด ์ถฉ๋Œ ์ผ€์ด์Šค ์ถ”๊ฐ€: - `process@git push * = deny`๊ฐ€ `process@git * = acceptedits`๋ณด๋‹ค ์šฐ์„  ์ ์šฉ๋˜๋Š”์ง€ ๊ฒ€์ฆ ### 3) slash ์นดํƒˆ๋กœ๊ทธ ํšŒ๊ท€ ๋ณด๊ฐ• - ์‹ ๊ทœ `SlashCommandCatalogTests`: - Chat ํƒญ์—์„œ dev ์ „์šฉ ๋ช…๋ น(`/review`)์ด ์ˆจ๊ฒจ์ง€๋Š”์ง€ ๊ฒ€์ฆ - ํ•ต์‹ฌ parity ๋ช…๋ น(`/compact`, `/permissions`, `/mcp`)์˜ ์นดํƒˆ๋กœ๊ทธ ๋“ฑ๋ก ๊ฒ€์ฆ ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~SlashCommandCatalogTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (88 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 30์ฐจ: ๊ถŒํ•œ ํŒ์—… ํ•ต์‹ฌ 4๋ชจ๋“œ ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 13:55 (KST) ### 1) ๊ถŒํ•œ ํŒ์—… ๊ตฌ์กฐ ๋‹จ์ˆœํ™” (claw-code ํ๋ฆ„ ๋ฐ˜์˜) - ๊ถŒํ•œ ํŒ์—… ์ตœ์ƒ๋‹จ ๋…ธ์ถœ ๋ชจ๋“œ๋ฅผ ํ•ต์‹ฌ 4๊ฐœ๋กœ ์ •๋ฆฌ: - ์†Œ๊ทน ํ™œ์šฉ - ์ ๊ทน ํ™œ์šฉ - ๊ณ„ํš ์ค‘์‹ฌ - ์™„์ „ ์ž๋™ - `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ`, `์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰`์€ `๊ณ ๊ธ‰ ๋ชจ๋“œ` ์ ‘ํž˜ ์„น์…˜์œผ๋กœ ๋ถ„๋ฆฌ. ### 2) ๊ณ ๊ธ‰ ๋ชจ๋“œ ์ ‘ํž˜ ์ƒํƒœ ์ €์žฅ - `permission_advanced_modes` ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ๊ณ ๊ธ‰ ๋ชจ๋“œ ์„น์…˜์˜ ํŽผ์นจ/์ ‘ํž˜ ์ƒํƒœ๋ฅผ ์„ค์ •์— ์ €์žฅํ•˜๊ณ  ์žฌ์˜คํ”ˆ ์‹œ ๋ณต์›. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - ํ…Œ์ŠคํŠธ ์žฌ๋นŒ๋“œ ์‹œ WPF ์ž„์‹œ ์ƒ์„ฑ๋ฌผ ๋ˆ„๋ฝ(CS2001, `AxCopilot_*_wpftmp.csproj`)์ด ๊ฐ„ํ— ๋ฐœ์ƒํ•˜์—ฌ ๋‹ค์Œ์œผ๋กœ ํšŒ๊ท€ ํ™•์ธ: - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~OperationModeReadinessTests"` ํ†ต๊ณผ (86 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 31์ฐจ: slash ํŒ์—… ์Šคํฌ๋กค/์„ ํƒ ์ฒด๊ฐ ๊ฐœ์„ ) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:01 (KST) ### 1) slash ์ด๋™ ์‹œ ์žฌ๋ Œ๋”๋ง ์ œ๊ฑฐ - ๊ธฐ์กด: ํœ /๋ฐฉํ–ฅํ‚ค ์ด๋™๋งˆ๋‹ค `RenderSlashPage()`๋ฅผ ํ˜ธ์ถœํ•ด ์ „์ฒด ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ๊ทธ๋ฆผ. - ๋ณ€๊ฒฝ: ์ด๋™ ์‹œ `UpdateSlashSelectionVisualState()` + `EnsureSlashSelectionVisible()`๋งŒ ํ˜ธ์ถœํ•˜๋„๋ก ์ „ํ™˜. - ํšจ๊ณผ: ์Šคํฌ๋กค ์‹œ ๊นœ๋นก์ž„/์ ํ”„๋ฅผ ์ค„์ด๊ณ  ์„ ํƒ ์ด๋™ ์ฒด๊ฐ์ด ๋” ๋ถ€๋“œ๋Ÿฌ์›Œ์ง. ### 2) ์„ ํƒ ํ•˜์ด๋ผ์ดํŠธ ๋™๊ธฐํ™” ๊ฒฝ๋กœ ์ •๋ฆฌ - ํ•ญ๋ชฉ Hover/Home/End ์ด๋™์—์„œ ๋™์ผํ•œ ํ•˜์ด๋ผ์ดํŠธ ๊ฐฑ์‹  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ†ต์ผ. - ๋ชฉ๋ก ์žฌ๋ Œ๋”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ(๊ทธ๋ฃน ์ ‘ํž˜/ํŽผ์นจ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ณ€๊ฒฝ)๋งŒ `RenderSlashPage()` ์œ ์ง€. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~SlashCommandCatalogTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests"` ํ†ต๊ณผ (84 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 32์ฐจ: slash ํŒ์—… ๋ฐ€๋„ ์••์ถ• 2๋‹จ๊ณ„) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:09 (KST) ### 1) slash ํŒ์—… ํ”„๋ ˆ์ž„ ๋ฐ€๋„ ์กฐ์ • - `ChatWindow.xaml`์˜ slash ํŒ์—… ํญ/๋†’์ด์™€ ๋‚ด๋ถ€ ์—ฌ๋ฐฑ์„ ์ถ•์†Œ: - `MinWidth 620 โ†’ 580`, `MaxWidth 780 โ†’ 740` - `ScrollViewer MaxHeight 420 โ†’ 380` - ํ—ค๋”/๋ฆฌ์ŠคํŠธ/ํ‘ธํ„ฐ ํŒจ๋”ฉ ๋ฐ ๋งˆ์ง„ ์ถ•์†Œ - ๋ชฉ์ : ๋” ์ปดํŒฉํŠธํ•œ ์ •๋ณด ๋ฐ€๋„์™€ ๋น ๋ฅธ ์Šค์บ” ํ๋ฆ„ ํ™•๋ณด. ### 2) ํ•ญ๋ชฉ/์„น์…˜ ํƒ€์ดํฌ ๋ฐ€๋„ ์กฐ์ • - `ChatWindow.xaml.cs`์˜ ๋ Œ๋”๋ง ํ•ญ๋ชฉ ํฌ๊ธฐ๋ฅผ ์ถ•์†Œ: - ์„น์…˜ ํ—ค๋” ํŒจ๋”ฉ/ํฐํŠธ(`10.5/10 โ†’ 10/9.5`) - ๋ช…๋ น ํ•ญ๋ชฉ ํŒจ๋”ฉ/๋งˆ์ง„ ์ถ•์†Œ - ๋ช…๋ น ๋ผ๋ฒจ/์„ค๋ช… ํฐํŠธ(`13/11.5 โ†’ 12.5/11`) - ๋ชฉ์ : ํ•œ ํ™”๋ฉด์— ๋” ๋งŽ์€ ๋ช…๋ น์ด ๋ณด์ด๋„๋ก ๊ฐœ์„ . ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~SlashCommandCatalogTests"` ํ†ต๊ณผ (41 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 33์ฐจ: ๊ถŒํ•œ ํŒ์—… ๋ฐ€๋„ ์••์ถ• 2๋‹จ๊ณ„) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:16 (KST) ### 1) ๊ถŒํ•œ ํŒ์—… ์นด๋“œ/์„น์…˜ ๋ฐ€๋„ ์กฐ์ • - `CreateCollapsibleSection`์˜ ํ—ค๋”/๋ณธ๋ฌธ ๊ฐ„๊ฒฉ๊ณผ ํฐํŠธ๋ฅผ ์ถ•์†Œ. - ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ ๋งˆ์ง„์„ ์ค„์—ฌ ์นด๋“œ ๊ฐ„ ์—ฌ๋ฐฑ์„ ์••์ถ•. ### 2) ๊ถŒํ•œ ์š”์•ฝ/์˜ˆ์™ธ/๊ฑฐ๋ถ€ ์นด๋“œ ํƒ€์ดํฌ ์••์ถ• - ์š”์•ฝ ์นด๋“œ์™€ ์˜ˆ์™ธ ์นฉ, ์ตœ๊ทผ ๊ฑฐ๋ถ€ ์นด๋“œ์˜ ํŒจ๋”ฉยท๋งˆ์ง„ยทํฐํŠธยท๋ผ์ธ๋†’์ด๋ฅผ ์ถ•์†Œ. - ์ตœ๊ทผ ๊ฑฐ๋ถ€ ๋น ๋ฅธ ์•ก์…˜ ๋ฒ„ํŠผ ํฌ๊ธฐ(ํŒจ๋”ฉ/ํฐํŠธ/์ตœ์†Œ๋„ˆ๋น„)๋ฅผ ๋‚ฎ์ถฐ ํ•œ ํ–‰ ๋ฐ€๋„๋ฅผ ๊ฐœ์„ . ### 3) ํ•ต์‹ฌ ๊ถŒํ•œ ๋ชจ๋“œ ๋ฆฌ์ŠคํŠธ ๋ฐ€๋„ ์กฐ์ • - ๊ถŒํ•œ ํ–‰(์•„์ด์ฝ˜/์ œ๋ชฉ/์„ค๋ช…/์ฒดํฌ)์˜ ํŒจ๋”ฉยทํฐํŠธยทํ–‰๊ฐ„์„ ์ถ•์†Œ. - ๋ชฉ์ : ์Šฌ๋ž˜์‹œ ํŒ์—…๊ณผ ์œ ์‚ฌํ•œ ์ปดํŒฉํŠธ ์Šค์บ” ๋ฆฌ๋“ฌ์œผ๋กœ ํ†ต์ผ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (82 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 34์ฐจ: ์ž…๋ ฅ ํ•˜๋‹จ/๋ชจ๋ธ ์„ ํƒ ์ปดํŒฉํŠธ ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:35 (KST) ### 1) ์ž…๋ ฅ ํ•˜๋‹จ ํ”„๋ ˆ์ž„ ๋ฐ€๋„ ์กฐ์ • - `InputBorder` ์ฝ”๋„ˆ/ํŒจ๋”ฉ์„ ์ถ•์†Œ(`CornerRadius 24โ†’22`, `Padding 7โ†’6`). - ์ž…๋ ฅ ์ƒ๋‹จ ๋ชจ๋ธ/ํ”„๋ฆฌ์…‹ ๋ผ์ธ์˜ ๋ฒ„ํŠผ ๋†’์ด/ํŒจ๋”ฉ์„ ์ถ•์†Œํ•ด ํ•œ ์ค„ ๋ฐ€๋„๋ฅผ ๊ฐ•ํ™”. ### 2) ๋ชจ๋ธ ์„ ํƒ/์ธ๋ผ์ธ ์„ค์ • ํƒ€์ดํฌ ์ •๋ฆฌ - `ModelLabel` ํฐํŠธ์™€ ์ตœ๋Œ€ ํญ์„ ์ถ•์†Œํ•ด ๋ชจ๋ธ๋ช… ๊ธธ์ด์— ๋”ฐ๋ฅธ ํ”๋“ค๋ฆผ์„ ์™„ํ™”. - ์ธ๋ผ์ธ ์„ค์ • ํŒจ๋„(์„œ๋น„์Šค/๋ชจ๋ธ/ํ€ต์•ก์…˜)์˜ ํฐํŠธ, ์ฝค๋ณด ๋†’์ด, ๋ฒ„ํŠผ ํŒจ๋”ฉ์„ ํ•œ ๋‹จ๊ณ„ ์ถ•์†Œ. ### 3) ์ž…๋ ฅ ๋ณธ๋ฌธ/์•ก์…˜ ๋ฒ„ํŠผ ๋ฐ€๋„ ์กฐ์ • - `InputBox`/์›Œํ„ฐ๋งˆํฌ ํฐํŠธยทํŒจ๋”ฉยท์ตœ์†Œ ๋†’์ด๋ฅผ ์†Œํญ ์ถ•์†Œํ•ด ์ž…๋ ฅ ์‹œ์•ผ๋ฅผ ํ™•๋ณด. - ์ฒจ๋ถ€/๋‚ด๋ณด๋‚ด๊ธฐ/์ „์†ก/์ค‘์ง€ ๋ฒ„ํŠผ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ Codexํ˜• ํ•˜๋‹จ ์ปดํŒฉํŠธ ํ†ค์œผ๋กœ ์ •๋ ฌ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --no-build --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests"` ํ†ต๊ณผ (82 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 35์ฐจ: ๋กœ์ง ์•ˆ์ •ํ™” ํšŒ๊ท€ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:47 (KST) ### 1) ContextCondenser ์‹ค๋™์ž‘ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ - ์‹ ๊ทœ `ContextCondenserTests`: - proactive compact ๋น„ํ™œ์„ฑ ์‹œ ๋ฉ”์‹œ์ง€ ๋ฌด๋ณ€๊ฒฝ ๊ฒ€์ฆ - ๋Œ€์šฉ๋Ÿ‰ `tool_result`๊ฐ€ ์˜ค๋ž˜๋œ ๊ตฌ๊ฐ„์— ์žˆ์„ ๋•Œ ์ถ•์•ฝ(`[์ถ•์•ฝ๋จ]`)๋˜๋Š”์ง€ ๊ฒ€์ฆ ### 2) vLLM ์—ฐ๊ฒฐ ํ•ด์„ ํšŒ๊ท€ ๋ณด๊ฐ• - `LlmRuntimeOverrideTests` ์ถ”๊ฐ€: - ์•”ํ˜ธํ™”๋œ `VllmApiKey`๊ฐ€ ๋Ÿฐํƒ€์ž„์—์„œ ๋ณตํ˜ธํ™”๋˜๋Š”์ง€ ๊ฒ€์ฆ - ๋“ฑ๋ก๋ชจ๋ธ `AllowInsecureTls=false` + ์ „์—ญ `VllmAllowInsecureTls=true` ์กฐํ•ฉ์—์„œ ์ตœ์ข…๊ฐ’์ด true๋กœ ์œ ์ง€๋˜๋Š”์ง€ ๊ฒ€์ฆ ### 3) ์ค‘๊ธฐ ์‹คํ–‰ ํ”„๋ ˆ์ž„ ๋ฌธ์„œํ™” - `docs/NEXT_ROADMAP.md`์— 3์ถ• ๊ณ ์ • ์šด์˜(๋กœ์ง ์•ˆ์ •ํ™” โ†’ ๊ธฐ๋Šฅ ๋™๋“ฑ์„ฑ โ†’ UX ์ •๋ ฌ)๊ณผ ์™„๋ฃŒ ์กฐ๊ฑด(๋นŒ๋“œ/ํšŒ๊ท€/๋ฌธ์„œ)์„ ์ถ”๊ฐ€. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~ContextCondenserTests|FullyQualifiedName~LlmRuntimeOverrideTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (65 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 36์ฐจ: ๊ถŒํ•œ ๊ทœ์น™ ๊ตฌ๋ฌธ ํ˜ธํ™˜์„ฑ ํ™•์žฅ) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:55 (KST) ### 1) ๊ถŒํ•œ ํŒจํ„ด ํŒŒ์„œ ํ˜ธํ™˜์„ฑ ํ™•์žฅ - `AgentContext`์˜ ํŒจํ„ด ๊ทœ์น™ ํŒŒ์„œ๋ฅผ ํ™•์žฅํ•ด ๊ธฐ์กด `tool@pattern`๊ณผ ํ•จ๊ป˜ `tool|pattern`, `tool(pattern)` ํ‘œ๊ธฐ๋„ ํ—ˆ์šฉ. - ๊ธฐ์กด deny ์šฐ์„  ํ‰๊ฐ€ ํ๋ฆ„์€ ์œ ์ง€ํ•˜๋ฉด์„œ, claw-code ๊ณ„์—ด ํ‘œ๊ธฐ ์ฐจ์ด๋กœ ์ธํ•œ ๊ทœ์น™ ๋ฏธ์ ์šฉ ์ผ€์ด์Šค๋ฅผ ์ค„์ž„. ### 2) ๊ถŒํ•œ ์ฒด์ธ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `OperationModePolicyTests`์— ์ผ€์ด์Šค ์ถ”๊ฐ€: - `process|git *`, `process|git push *` ์กฐํ•ฉ์—์„œ allow/deny ์šฐ์„ ์ˆœ์œ„ ๊ฒ€์ฆ - `process(git *)`, `process(git push *)` ์กฐํ•ฉ์—์„œ dontask/deny ํ•ด์„ ๊ฒ€์ฆ ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~PermissionModePresentationCatalogTests"` ํ†ต๊ณผ (45 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 37์ฐจ: ๊ถŒํ•œ ๋ชจ๋“œ ๋ณ„์นญ ์ •ํ•ฉ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 14:57 (KST) ### 1) ๊ถŒํ•œ ๋ชจ๋“œ ์ •๊ทœํ™” ๋ณ„์นญ ํ™•์žฅ - `PermissionModeCatalog.NormalizeGlobalMode`์— ๋ณ„์นญ ์ถ”๊ฐ€: - `none`, `disabled` โ†’ `Deny` - `passive` โ†’ `Default` - `active` โ†’ `AcceptEdits` - `planning` โ†’ `Plan` - `fullauto` โ†’ `BypassPermissions` - `silent` โ†’ `DontAsk` ### 2) Slash ๊ถŒํ•œ ๋ช…๋ น ๋ณ„์นญ ๋™๊ธฐํ™” - `ChatWindow.TryApplyPermissionModeFromAction`์—๋„ ๋™์ผ ๋ณ„์นญ์„ ๋ฐ˜์˜ํ•ด `/permissions`, `/allowed-tools` ์ž…๋ ฅ๊ณผ ๋‚ด๋ถ€ ์ •๊ทœํ™” ๊ทœ์น™์„ ์ผ์น˜์‹œํ‚ด. ### 3) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `PermissionModeCatalogTests`์— ์‹ ๊ทœ ๋ณ„์นญ ์ž…๋ ฅ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ์ •๊ทœํ™” ํšŒ๊ท€ ๊ฒ€์ฆ ๊ฐ•ํ™”. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (88 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 38์ฐจ: ๊ถŒํ•œ ๊ธฐ๋ณธ๊ฐ’ ์ •์ฑ… ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 15:02 (KST) ### 1) ๊ถŒํ•œ ๊ธฐ๋ณธ๊ฐ’์„ Deny๋กœ ์ •๋ ฌ - `AppSettings.LlmSettings`์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝ: - `FilePermission`: `Default` โ†’ `Deny` - `DefaultAgentPermission`: `Default` โ†’ `Deny` - ๋ชฉ์ : ์‹ ๊ทœ ์„ค์น˜/์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ์š”์ฒญํ•˜์‹  ๊ธฐ๋ณธ ์ •์ฑ…(ํ™œ์šฉํ•˜์ง€ ์•Š์Œ)์œผ๋กœ ์‹œ์ž‘. ### 2) ์•ฑ ์ƒํƒœ ๊ธฐ๋ณธ๊ฐ’ ๋™๊ธฐํ™” - `AppStateService.PermissionPolicyState.FilePermission` ๊ธฐ๋ณธ๊ฐ’์„ `Deny`๋กœ ๋ณ€๊ฒฝ. - `AppStateService.PermissionSummaryState` ๊ธฐ๋ณธ๊ฐ’(`EffectiveMode`, `DefaultMode`)๋„ `Deny`๋กœ ๋ณ€๊ฒฝ. ### 3) Slash ๊ถŒํ•œ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฌธ๊ตฌ ์ •๋ ฌ - `/permissions`, `/allowed-tools`์˜ ์‚ฌ์šฉ๋ฒ• ๋ฌธ๊ตฌ๋ฅผ ์‹ค์‚ฌ์šฉ ๋ณ„์นญ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌ: - `none|passive|active|plan|fullauto|silent|status` ### 4) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `AppStateServiceTests`์— ์‹ ๊ทœ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€: - `LoadFromSettings_DefaultPermission_ShouldBeDeny` - ๊ฒ€์ฆ ๋ฒ”์œ„: - `AppStateServiceTests` - `PermissionModeCatalogTests` - `ChatWindowSlashPolicyTests` - `OperationModePolicyTests` ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~AppStateServiceTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~OperationModePolicyTests"` ํ†ต๊ณผ (132 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 39์ฐจ: ํƒญ ์ „ํ™˜ ๋นˆ ๋Œ€ํ™” ๋ˆ„์  ๋ฐฉ์ง€) ์—…๋ฐ์ดํŠธ: 2026-04-04 15:48 (KST) ### 1) ์„ธ์…˜ ์ €์žฅ ์ •์ฑ… ๋ณด๊ฐ• - `ChatSessionStateService.SaveCurrentConversation`์—์„œ ๋Œ€ํ™” ์ €์žฅ ์ „ `HasPersistableContent` ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€. - ๋ฉ”์‹œ์ง€/์‹คํ–‰์ด๋ ฅ/๋Ÿฐ๊ธฐ๋ก/๋“œ๋ž˜ํ”„ํŠธ/ํ•€/ํด๋”/์‹œ์Šคํ…œ๋ช…๋ น/๊ถŒํ•œ/์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ ์‹ค์งˆ ์ƒํƒœ๊ฐ€ ์—†๋Š” "๋นˆ ์ƒˆ ๋Œ€ํ™”"๋Š” ๋””์Šคํฌ ์ €์žฅ ๋ฐ ํƒญ ๊ธฐ์–ต ๋Œ€์ƒ์—์„œ ์ œ์™ธ. ### 2) ๋Œ€ํ™” ๋ชฉ๋ก ๋…ธ์ด์ฆˆ ํ•„ํ„ฐ - `ChatWindow.RefreshConversationList`์—์„œ ํƒญ ์ „ํ™˜ ์ค‘ ์ƒ์„ฑ๋œ ๋ฌด์˜๋ฏธํ•œ ๋นˆ ํ•ญ๋ชฉ(์ œ๋ชฉ=์ƒˆ ๋Œ€ํ™”, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์—†์Œ, ์‹คํ–‰ ์ด๋ ฅ ์—†์Œ ๋“ฑ)์„ ๋ Œ๋”๋ง ๋Œ€์ƒ์—์„œ ์ œ์™ธ. - ํšจ๊ณผ: ํƒญ ์ด๋™๋งŒ์œผ๋กœ ์ขŒ์ธก ์ด๋ ฅ์— ์ƒˆ ๋Œ€ํ™”๊ฐ€ ๋ˆ„์ ๋˜๋Š” ์ฒด๊ฐ ๋ฌธ์ œ ์™„ํ™”. ### 3) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ - `ChatSessionStateServiceTests.SaveCurrentConversation_DoesNotPersistEmptyFreshConversation` ์ถ”๊ฐ€. - ๋นˆ ์ดˆ๊ธฐ ๋Œ€ํ™” ์ €์žฅ ํ˜ธ์ถœ ์‹œ `RememberConversation`์ด null๋กœ ์œ ์ง€๋˜๋Š”์ง€ ๊ฒ€์ฆ. - ์ €์žฅ์†Œ ์žฌ์กฐํšŒ(`storage.Load(conv.Id)`)์—์„œ null์ธ์ง€ ๊ฒ€์ฆ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~ChatSessionStateServiceTests|FullyQualifiedName~AppStateServiceTests|FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~ChatWindowSlashPolicyTests"` ํ†ต๊ณผ (132 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 40์ฐจ: ๊ถŒํ•œ ํŒ์—… ์ˆœ์„œ/์ฆ‰์‹œ๋ฐ˜์˜ ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 15:52 (KST) ### 1) ๊ถŒํ•œ ํŒ์—… ํ‘œ์‹œ ์ˆœ์„œ ์ •๋ ฌ - `ChatWindow` ๊ถŒํ•œ ํŒ์—…์˜ ํ•ต์‹ฌ ๋ชจ๋“œ ๋ชฉ๋ก์— `ํ™œ์šฉํ•˜์ง€ ์•Š์Œ(Deny)`์„ ํฌํ•จํ•ด ๋งจ ์œ„์—์„œ ์„ ํƒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์กฐ์ •. - ๊ณ ๊ธ‰ ๋ชจ๋“œ๋Š” `์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰(DontAsk)`๋งŒ ์œ ์ง€ํ•ด ํ•ต์‹ฌ/๊ณ ๊ธ‰ ๊ตฌ๋ถ„์„ ๋‹จ์ˆœํ™”. ### 2) ํƒญ/๋Œ€ํ™” ์ „ํ™˜ ์‹œ ๊ถŒํ•œ ์ฆ‰์‹œ๋ฐ˜์˜ ๋ณด๊ฐ• - `LoadConversationSettings`์—์„œ ๋Œ€ํ™” ๊ถŒํ•œ์ด ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋ช…์‹œ์ ์œผ๋กœ ํƒญ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉ: - `Chat` ํƒญ: `Deny` - `Cowork/Code` ํƒญ: `DefaultAgentPermission` - ํšจ๊ณผ: ์ด์ „ ๋Œ€ํ™”์˜ ๊ถŒํ•œ ๊ฐ’์ด ๋‚จ์•„ 2๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ๋ฐ˜์˜๋˜๋Š” ํ˜„์ƒ ์™„ํ™”. ### 3) ๊ถŒํ•œ ํ”„๋ฆฌ์  ํ…Œ์ด์…˜ ์นดํƒˆ๋กœ๊ทธ ๋ฌธ์ž์—ด ์ •๋ฆฌ - `PermissionModePresentationCatalog`์˜ ๊ถŒํ•œ ๋ผ๋ฒจ/์„ค๋ช… ๋ฌธ์ž์—ด์„ ์ •์ƒ ํ•œ๊ธ€ ๋ฌธ๊ตฌ๋กœ ์ •๋ฆฌ(๊นจ์ง ๋ฌธ์ž์—ด ์ œ๊ฑฐ). - ํ‘œ์‹œ ๋ฌธ๊ตฌ์™€ ์‹ค์ œ ๊ถŒํ•œ ์˜๋ฏธ๋ฅผ ์ผ์น˜์‹œ์ผœ UX ํ˜ผ์„ ์„ ์ค„์ž„. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~ChatSessionStateServiceTests"` ํ†ต๊ณผ (111 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 41์ฐจ: ๊ถŒํ•œ ์ƒ‰์ƒ ์ฒด๊ณ„ ํ†ต์ผ) ์—…๋ฐ์ดํŠธ: 2026-04-04 16:12 (KST) ### 1) ๊ถŒํ•œ ์š”์•ฝ ์นด๋“œ ์ƒ‰์ƒ ๋งคํ•‘ ์ •๋ ฌ - `GetPermissionModePalette`์˜ ๋ชจ๋“œ๋ณ„ ์ƒ‰์ƒ์„ ํŒ์—…/๋ฐฐ๋„ˆ ๊ธฐ์ค€๊ณผ ํ†ต์ผ: - Deny: ๋…น์ƒ‰ - Default: ์ค‘๋ฆฝ/ํŒŒ๋ž‘ ๊ณ„์—ด(๊ธฐ์กด ์œ ์ง€) - AcceptEdits: ๋…น์ƒ‰ - Plan: ๋ณด๋ผ - BypassPermissions: ์ฃผํ™ฉ - DontAsk: ๋นจ๊ฐ• ### 2) ์ƒ๋‹จ ๊ถŒํ•œ ๋ฐฐ๋„ˆ ์‹œ๊ฐ ํ†ต์ผ - `BypassPermissions`์™€ `DontAsk`๋ฅผ ๋ถ„๋ฆฌ ๋ Œ๋”๋ง: - ์™„์ „ ์ž๋™: ์ฃผํ™ฉ ๋ฐฐ๋„ˆ + ์ฃผํ™ฉ ์•„์ด์ฝ˜ - ์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰: ๋นจ๊ฐ• ๋ฐฐ๋„ˆ + ๋นจ๊ฐ• ์•„์ด์ฝ˜ - ๊ธฐ์กด์ฒ˜๋Ÿผ ๋‘ ๋ชจ๋“œ๋ฅผ ๋™์ผ ์œ„ํ—˜์ƒ‰์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ํ˜ผ์„ ์„ ์ œ๊ฑฐ. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj --filter "FullyQualifiedName~PermissionModePresentationCatalogTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~ChatSessionStateServiceTests"` ํ†ต๊ณผ (72 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 42์ฐจ: ์Šฌ๋ž˜์‹œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ž…๋ ฅ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 16:18 (KST) ### 1) InputBox ํฌ์ปค์Šค ์ƒํƒœ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ณด๊ฐ• - `InputBox_PreviewKeyDown` ์ดˆ์ž…์—์„œ ์Šฌ๋ž˜์‹œ ์ „์šฉ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์šฐ์„  ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝ. - ๊ธฐ์กด์—๋Š” ์ฐฝ ์ˆ˜์ค€ `KeyDown`์— ์˜์กดํ•ด ํ™˜๊ฒฝ/ํฌ์ปค์Šค ์ƒํ™ฉ์—์„œ ๋ฐฉํ–ฅํ‚ค๊ฐ€ ํ…์ŠคํŠธ ์ปค์„œ ์ด๋™์œผ๋กœ ์†Œ๋น„๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์—ˆ์Œ. ### 2) ์Šฌ๋ž˜์‹œ ํ‚ค ์ฒ˜๋ฆฌ ๊ฒฝ๋กœ ํ†ตํ•ฉ - `TryHandleSlashNavigationKey`๋ฅผ ์‹ ์„คํ•ด `InputBox`์™€ ์ฐฝ ์ „์ฒด `KeyDown` ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ์ฒ˜๋ฆฌ: - `Up/Down`, `PageUp/PageDown`, `Home/End`, `Esc`, `Enter`, `Tab` - ํšจ๊ณผ: ํ‚ค๋ณด๋“œ ํƒ์ƒ‰ ๋™์ž‘ ์ผ๊ด€์„ฑ ๊ฐœ์„ . ### 3) ํœ  ์Šคํฌ๋กค fallback ์ถ”๊ฐ€ - `SlashPopup_ScrollByDelta`์—์„œ ๋ชจ๋“  ๊ทธ๋ฃน์ด ์ ‘ํžŒ ์ƒํƒœ(๊ฐ€์‹œ ํ•ญ๋ชฉ 0)์ผ ๋•Œ `SlashScrollViewer` ์˜คํ”„์…‹์„ ์ง์ ‘ ์ด๋™ํ•˜๋„๋ก fallback ์ถ”๊ฐ€. - ํšจ๊ณผ: ํ•ญ๋ชฉ ์„ ํƒ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ๋„ ํœ  ์ž…๋ ฅ์ด ๋ฌด๋ฐ˜์‘์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ ์™„ํ™”. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -p:UseSharedCompilation=false -nodeReuse:false --filter "FullyQualifiedName~ChatWindowSlashPolicyTests|FullyQualifiedName~PermissionModeCatalogTests|FullyQualifiedName~ChatSessionStateServiceTests"` ํ†ต๊ณผ (109 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 43์ฐจ: ์‚ฌ๋‚ด/์‚ฌ์™ธ ๋ชจ๋“œ ํšŒ๊ท€ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 16:24 (KST) ### 1) ์ •์ฑ… ๊ฒฝ๊ณ„ ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• - `OperationModePolicyTests`์— `IsExternalUrl_DetectsOnlyHttpSchemes` ์ถ”๊ฐ€. - ๊ฒ€์ฆ ๋ฒ”์œ„: - `http/https`๋Š” ์™ธ๋ถ€ URL๋กœ ํŒ์ • - ๋กœ์ปฌ ํŒŒ์ผ ๊ฒฝ๋กœ, `mailto`, ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์€ ์™ธ๋ถ€ URL์ด ์•„๋‹˜ ### 2) ๋ชจ๋“œ ์ „ํ™˜ ์ฆ‰์‹œ ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ - `OperationModeReadinessTests`๋ฅผ ์ •๋ฆฌ/๋ณด๊ฐ•: - `WebSearch_ModeSwitch_InternalToExternal_ShouldReflectImmediately` ์ถ”๊ฐ€ - ๊ฐ™์€ ํ•ธ๋“ค๋Ÿฌ ์ธ์Šคํ„ด์Šค์—์„œ ์„ค์ •๊ฐ’ ์ „ํ™˜ ํ›„ ๊ฒฐ๊ณผ๊ฐ€ ์ฆ‰์‹œ `์ฐจ๋‹จ`โ†’`๊ฒ€์ƒ‰`์œผ๋กœ ๋ฐ˜์˜๋˜๋Š”์ง€ ๊ฒ€์ฆ - ๊ธฐ์กด readiness ํ…Œ์ŠคํŠธ์˜ ๋ฌธ์ž์—ด ๋น„๊ต๋„ ์ •์ƒ ํ•œ๊ธ€ ๊ธฐ์ค€์œผ๋กœ ์ •๋น„. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -p:UseSharedCompilation=false -nodeReuse:false --filter "FullyQualifiedName~OperationModePolicyTests|FullyQualifiedName~OperationModeReadinessTests"` ํ†ต๊ณผ (20 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 44์ฐจ: AX Agent ์„ค์ •์ฐฝ ์˜คํ”ˆ ์•ˆ์ •ํ™”) ์—…๋ฐ์ดํŠธ: 2026-04-04 17:12 (KST) ### 1) ์ „์—ญ ํ† ๊ธ€ ๋ฆฌ์†Œ์Šค ๋ณด๊ฐ• - `App.xaml`์— `ToggleSwitch` ์Šคํƒ€์ผ์„ ์ „์—ญ ๋ฆฌ์†Œ์Šค๋กœ ์ถ”๊ฐ€. - ํšจ๊ณผ: - ์ฐฝ๋ณ„ ๋ฆฌ์†Œ์Šค ๋ณ‘ํ•ฉ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ `ToggleSwitch` ํ‚ค๋ฅผ ํ•ญ์ƒ ํ•ด์„ ๊ฐ€๋Šฅ. - AX Agent ์ฐฝ(`ChatWindow`) ์ดˆ๊ธฐํ™” ์ค‘ `StaticResource ToggleSwitch` ๋ˆ„๋ฝ ์˜ˆ์™ธ ์žฌ๋ฐœ ๋ฐฉ์ง€. ### 2) AX Agent ์„ค์ •์ฐฝ ๋ฆฌ์†Œ์Šค ์ฃผ์ž… ๊ฒฝ๋กœ ๊ฐœ์„  - `ChatWindow.OpenAgentSettingsWindow()`์—์„œ ์ฐฝ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์‚ฌ์ „์„ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋˜ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ฑฐ. - ๋Œ€์‹  AX Agent ์ „์šฉ ํ…Œ๋งˆ ์‚ฌ์ „(`Themes/AgentLight|AgentDark.xaml`)๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ์ž…ํ•˜๋„๋ก ๋ณ€๊ฒฝ. - ํšจ๊ณผ: - ์„ค์ •์ฐฝ ์˜คํ”ˆ ์‹œ ๋ฆฌ์†Œ์Šค ์ถฉ๋Œ ์œ„ํ—˜ ๊ฐ์†Œ. - ํ…Œ๋งˆ ์ผ๊ด€์„ฑ ์œ ์ง€ + ์„ค์ •์ฐฝ ์˜คํ”ˆ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ ์™„ํ™”. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` ํ†ต๊ณผ (59 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 45์ฐจ: ๊ถŒํ•œ ์ˆœํ™˜/์Šฌ๋ž˜์‹œ ์Šคํฌ๋กค ์ฒด๊ฐ ๋ณด๊ฐ•) ์—…๋ฐ์ดํŠธ: 2026-04-04 17:27 (KST) ### 1) ๊ถŒํ•œ ๋ชจ๋“œ ๊ธฐ๋ณธ ์ˆœํ™˜ ์ •๋ ฌ - `claw-code`์˜ ์ฝ”์–ด ๋ชจ๋“œ ์ˆœํ™˜ ๊ธฐ์ค€์— ๋งž์ถฐ ๊ธฐ๋ณธ ์ˆœํ™˜์„ `Deny โ†’ Default โ†’ AcceptEdits โ†’ Plan โ†’ BypassPermissions โ†’ Deny`๋กœ ๊ณ ์ •. - `DontAsk`๋Š” ๊ณ ์œ„ํ—˜ ๋ชจ๋“œ๋กœ ๋ถ„๋ฆฌํ•ด ๊ธฐ๋ณธ ์ˆœํ™˜(์ธ๋ผ์ธ/์Šฌ๋ž˜์‹œ/์„ค์ •์ฐฝ ๋ฒ„ํŠผ)์—์„œ ์ œ์™ธํ•˜๊ณ  ๋ช…์‹œ ์„ ํƒ์œผ๋กœ๋งŒ ์ง„์ž…ํ•˜๋„๋ก ์กฐ์ •. - ๋ฐ˜์˜ ์œ„์น˜: - `ChatWindow.NextPermission(...)` - `AgentSettingsWindow.BtnPermissionMode_Click(...)` ### 2) ์Šฌ๋ž˜์‹œ ํŒ์—… ํœ  ์Šคํฌ๋กค ๋ฐ˜์‘ ๋ณด๊ฐ• - `/` ํŒ์—… ํœ  ์ž…๋ ฅ ์‹œ: 1. `ScrollViewer` ์˜คํ”„์…‹์„ ์‹ค์ œ๋กœ ์ด๋™ 2. ๋ทฐํฌํŠธ ์ƒ๋‹จ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•ญ๋ชฉ์œผ๋กœ ์„ ํƒ ์ธ๋ฑ์Šค๋ฅผ ๋™๊ธฐํ™” 3. ์„ ํƒ ๊ฐ•์กฐ/๊ฐ€์‹œํ™” ๊ฐฑ์‹  - ํšจ๊ณผ: - ํ„ฐ์น˜ํŒจ๋“œ/๋งˆ์šฐ์Šค์—์„œ ์Šคํฌ๋กค ์ฒด๊ฐ์ด ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ์ง€๊ณ , ์„ ํƒ ํ•˜์ด๋ผ์ดํŠธ์™€ ์‹ค์ œ ์Šคํฌ๋กค ์œ„์น˜ ๋ถˆ์ผ์น˜๊ฐ€ ์™„ํ™”๋จ. ### 3) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ - `ChatWindowSlashPolicyTests.NextPermission_ShouldCycleCoreModesAndReturnToDeny` ์ถ”๊ฐ€. - ๊ฒ€์ฆ ์ผ€์ด์Šค: - `BypassPermissions -> Deny` - `DontAsk -> Deny` - ์ฝ”์–ด ์ˆœํ™˜ ์ „ ๊ตฌ๊ฐ„. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` ํ†ต๊ณผ (65 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 46์ฐจ: ๊ถŒํ•œ ํŒ์—… ์ƒ์„ธ์˜์—ญ ๋‹จ์ˆœํ™”) ์—…๋ฐ์ดํŠธ: 2026-04-04 16:45 (KST) ### 1) ๊ถŒํ•œ ํŒ์—… ๊ตฌ์กฐ ๋‹จ์ˆœํ™” - ๊ธฐ์กด `ํ˜„์žฌ ๊ถŒํ•œ ์š”์•ฝ`, `๋„๊ตฌ๋ณ„ ์˜ˆ์™ธ`, `์ตœ๊ทผ ๊ถŒํ•œ ๊ฑฐ๋ถ€` 3๊ฐœ ๊ฐœ๋ณ„ ์ ‘ํž˜ ์„น์…˜์„ ๋‹จ์ผ `์ƒ์„ธ ์ •๋ณด` ์„น์…˜์œผ๋กœ ํ†ตํ•ฉ. - ๊ธฐ๋ณธ ํ™”๋ฉด์€ `ํ•ต์‹ฌ ๊ถŒํ•œ ๋ชจ๋“œ`(+`๊ณ ๊ธ‰ ๋ชจ๋“œ`) ์ค‘์‹ฌ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ , ๋ถ€๊ฐ€ ์ •๋ณด๋Š” 1ํšŒ ์ถ”๊ฐ€ ํ™•์žฅ์œผ๋กœ ํ™•์ธํ•˜๋„๋ก ์ •๋ฆฌ. ### 2) ์š”์•ฝ ์นด๋“œ ํ…์ŠคํŠธ ๋ฐ€๋„ ๋ณด์ • - ์š”์•ฝ ์นด๋“œ ๋ณธ๋ฌธ์„ ์ค„๋ฐ”๊ฟˆ ๊ธฐ๋ฐ˜์—์„œ ๋ง์ค„์ž„ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ์ •ํ•ด ํŒ์—… ๊ธฐ๋ณธ ๋†’์ด์™€ ์‹œ์•ผ ๋ฐ€๋„๋ฅผ ์•ˆ์ •ํ™”. - ํšจ๊ณผ: ๋ชจ๋“œ ์„ ํƒ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฒซ ํ™”๋ฉด์—์„œ ๋” ๋งŽ์ด ๋ณด์ด๊ณ , ์Šค์บ” ๋™์„ ์ด ๋‹จ์ˆœํ™”๋จ. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - ์ดˆ๊ธฐ ๋นŒ๋“œ์—์„œ WPF ์ž„์‹œ ์‚ฐ์ถœ๋ฌผ(`wpftmp/.g.cs`) ๋ˆ„๋ฝ ์ด์Šˆ๋ฅผ ํ™•์ธํ–ˆ๊ณ , `dotnet clean` ํ›„ ์žฌ๋นŒ๋“œ๋กœ ์ •์ƒ ๋ณต๊ตฌ. - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` ํ†ต๊ณผ (65 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 47์ฐจ: ๊ถŒํ•œ ํŒ์—… ๋ฐ€๋„/์ •๋ ฌ ๋ฏธ์„ธ์กฐ์ •) ์—…๋ฐ์ดํŠธ: 2026-04-04 16:58 (KST) ### 1) ๊ถŒํ•œ ํ–‰ ์ปดํŒฉํŠธ ์ •๋ ฌ - ๊ถŒํ•œ ๋ชจ๋“œ ํ–‰์˜ ๋ ˆ์ด์•„์›ƒ ๊ฐ’์„ ๋ฏธ์„ธ ์กฐ์ •: - ํ–‰ ํŒจ๋”ฉ/๋งˆ์ง„ ์ถ•์†Œ - ์•„์ด์ฝ˜ ํฌ๊ธฐ/์ขŒ์šฐ ๊ฐ„๊ฒฉ ์ถ•์†Œ - ์ฒดํฌ๋งˆํฌ ๊ฐ„๊ฒฉ ์ถ•์†Œ - ์ œ๋ชฉ/์„ค๋ช… ํฐํŠธ์™€ ์ค„๊ฐ„๊ฒฉ ์ถ•์†Œ - ๋ชฉํ‘œ: ํ•œ ํ™”๋ฉด์—์„œ ๋” ๋งŽ์€ ๊ถŒํ•œ ํ•ญ๋ชฉ์„ ์•ˆ์ •์ ์œผ๋กœ ์Šค์บ” ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐ€๋„ ๊ฐœ์„ . ### 2) ์š”์•ฝ ์นด๋“œ ํƒ€์ดํฌ ๊ท ํ˜• ์กฐ์ • - ์ƒ๋‹จ ์š”์•ฝ ์นด๋“œ์˜ ์ œ๋ชฉ/๋ณธ๋ฌธ ํฐํŠธ์™€ ์—ฌ๋ฐฑ์„ ํ•œ ๋‹จ๊ณ„ ์ถ•์†Œํ•ด ๋ณธ๋ฌธ ๊ณผ์ ์œ ๋ฅผ ์ค„์ž„. - ํšจ๊ณผ: ๊ถŒํ•œ ํŒ์—… ์ฒซ ์ง„์ž… ์‹œ ํ•ต์‹ฌ ๋ชจ๋“œ ๋ฆฌ์ŠคํŠธ ๊ฐ€์‹œ์„ฑ ํ–ฅ์ƒ. ### 3) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - `dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Debug -p:UseSharedCompilation=false -nodeReuse:false --filter "ChatWindowSlashPolicyTests|OperationModePolicyTests|OperationModeReadinessTests"` ํ†ต๊ณผ (65 passed, 0 failed). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 48์ฐจ: AX Agent ํŒจ๋„/๋ฉ”์‹œ์ง€/composer ์‹œ๊ฐ ๊ทœ์น™ ํ†ต์ผ 1์ฐจ) ์—…๋ฐ์ดํŠธ: 2026-04-04 19:07 (KST) ### 1) ํŒ์—… ํŒจ๋„ row ์–ธ์–ด ํ†ต์ผ - ๊ถŒํ•œ ํŒ์—…์˜ `๋„๊ตฌ๋ณ„ ์˜ˆ์™ธ`๋ฅผ ์นฉ ๋‚˜์—ด์—์„œ row ๊ธฐ๋ฐ˜ ๋ชฉ๋ก์œผ๋กœ ๋ฐ”๊ฟ”, Git/ํ”„๋ฆฌ์…‹/์Šฌ๋ž˜์‹œ์™€ ๊ฐ™์€ ์Šค์บ” ๋ฐฉ์‹์œผ๋กœ ๋งž์ถค. - ๊ถŒํ•œ ์ƒ์„ธ ์ ‘ํž˜ ์„น์…˜ ์นด๋“œ ์™ธ๊ณฝ์„ ๋ฌด๊ฑฐ์šด ๋ฐ•์Šคํ˜•์—์„œ ๊ฒฝ๊ณ„์„  ์ค‘์‹ฌ ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ•ด `claw-code` ๊ธฐ์ค€์˜ ๊ฐ€๋ฒผ์šด ํŒจ๋„ ๋ฐ€๋„์— ๊ฐ€๊น๊ฒŒ ์กฐ์ •. - Git ๋ธŒ๋žœ์น˜ ํŒ์—…์˜ ๋ณ€๊ฒฝ ํ†ต๊ณ„๋ฅผ ํ…์ŠคํŠธ ๋‚˜์—ด ๋Œ€์‹  pill ๋ฐฐ์ง€๋กœ ์ •๋ฆฌํ•˜๊ณ , ์„น์…˜ ๋ผ๋ฒจ๊ณผ ์•ก์…˜ row๋ฅผ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ํ†ต์ผ. - ๊ณตํ†ต `CreateFlatPopupRow()`์— ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค/EnterยทSpace ์‹คํ–‰/chevron ํ‘œ์‹œ๋ฅผ ๋„ฃ์–ด ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋ณด๊ฐ•. ### 2) ๋ฉ”์‹œ์ง€ ์•ก์…˜ ๋ฐ”์™€ ์„ ํƒ ์ƒํƒœ ์ •๋ฆฌ - ๋ฉ”์‹œ์ง€ ์•ก์…˜ ๋ฒ„ํŠผ์„ ์•„์ด์ฝ˜๋งŒ ์žˆ๋Š” ์ƒํƒœ์—์„œ `์•„์ด์ฝ˜ + ๋ผ๋ฒจ` pillํ˜• ๋ฒ„ํŠผ์œผ๋กœ ๋ฐ”๊ฟ”, hover/์„ ํƒ ์‹œ์—๋„ ๊ธฐ๋Šฅ์„ ๋” ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์กฐ์ •. - ์ปค์Šคํ…€ ์•ก์…˜ ๋ฒ„ํŠผ ํ…œํ”Œ๋ฆฟ์ด BorderBrush/BorderThickness๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด ๋ฉ”์‹œ์ง€ ์•ก์…˜ ๋ฐ”๊ฐ€ ์‹ค์ œ ์ปค์Šคํ…€ ์ปจํŠธ๋กค์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์ •๋ฆฌ. - ๋ฉ”์‹œ์ง€ ์„ ํƒ ์‹œ ์นด๋“œ ์™ธ๊ณฝ์„ ๊ณผ ๊ทธ๋ฆผ์ž ๊ฐ•์กฐ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜๋„๋ก ์ •๋ ฌ. ### 3) composer ํ•˜๋‹จ ๋ฐ” ๋ฐ€๋„ ๋ณด์ • - ์ž…๋ ฅ ์นด๋“œ ํŒจ๋”ฉ, ๋ชจ๋ธ ์„ ํƒ ๋ฒ„ํŠผ, ํ”„๋ฆฌ์…‹ ๋ฒ„ํŠผ, ํ† ํฐ ์‚ฌ์šฉ ์นด๋“œ์˜ ๋†’์ด/๊ณก๋ฅ ์„ ์žฌ์ •๋ฆฌํ•ด ์ƒ๋‹จ control strip์ด ๊ฐ™์€ ๊ณ„์—ด์˜ composer ์š”์†Œ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์กฐ์ •. - Cowork/Code ํ•˜๋‹จ `FolderBar`๋ฅผ ๋…๋ฆฝ ์นด๋“œํ˜• ์˜์—ญ์œผ๋กœ ์˜ฌ๋ฆฌ๊ณ , ๋ฐ์ดํ„ฐ ํ™œ์šฉ/๊ถŒํ•œ/Git ๋ฒ„ํŠผ ํŒจ๋”ฉ๊ณผ ์นด๋“œ ๋ฐ€๋„๋ฅผ ๋™์ผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 49์ฐจ: AX Agent ํƒ€์ž„๋ผ์ธ์„ Codexํ˜• ๋ณธ๋ฌธ ๋กœ๊ทธ ๊ตฌ์กฐ๋กœ ์žฌ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 19:11 (KST) ### 1) ์‹คํ–‰ ๋กœ๊ทธ ๋ฐฐ๋„ˆ๋ฅผ ์–‡์€ ๋ณธ๋ฌธ ๋กœ๊ทธ๋กœ ์žฌ๊ตฌ์„ฑ - `AddAgentEventBanner()`๋ฅผ ๋ฌด๊ฑฐ์šด ์ปฌ๋Ÿฌ ๋ฐฐ๋„ˆ ์นด๋“œ์—์„œ `์–‡์€ ์‹คํ–‰ ์ค„ + ์šฐ์ธก ๋ฉ”ํƒ€` ๊ตฌ์กฐ๋กœ ์ „ํ™˜. - ๋กœ๊ทธ ๋ผ๋ฒจ, ์‹คํ–‰ ์‹œ๊ฐ„, ํ† ํฐ ๋ฐฐ์ง€๋Š” ์œ ์ง€ํ•˜๋˜ ์ƒ‰/๊ณก๋ฅ /๋งˆ์ง„์„ ๋‚ฎ์ถฐ ๋ณธ๋ฌธ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ฆฌ. - detailed/debug ์š”์•ฝ, tool input, file path ๋ณด์กฐ ์ •๋ณด๋„ ๋™์ผ ๊ธฐ์ค€์˜ ์–•์€ ๋ธ”๋ก์œผ๋กœ ๋งž์ถค. ### 2) ๊ณ„ํš ์นด๋“œ๋ฅผ ๋Œ€ํ™” ํ๋ฆ„ํ˜• ์นด๋“œ๋กœ ๋ณด์ • - `AddPlanningCard()`๋ฅผ ๋ณ„๋„ ๊ฐ•์กฐ ๋ฐ•์Šค๋ณด๋‹ค `๋ฉ”์‹œ์ง€ ์นด๋“œ์™€ ๊ฐ™์€ ํญ/๊ณก๋ฅ `์— ๊ฐ€๊น๊ฒŒ ์žฌ์ •๋ ฌ. - ํ—ค๋” ๋ฌธ๊ตฌ๋ฅผ `N๊ฐœ์˜ ์ž‘์—… ์™„๋ฃŒ ์ค‘ 0` ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ” Codex ์Šคํƒ€์ผ์˜ ์ง„ํ–‰ํ˜• ๊ณ„ํš ์นด๋“œ ๋ฆฌ๋“ฌ์— ๋งž์ถค. - ์ง„ํ–‰๋ฅ  ๋ฐ”/๋‹จ๊ณ„ ๋ชฉ๋ก์˜ ํ…์ŠคํŠธ ์ƒ‰๊ณผ ํญ๋„ ํ˜„์žฌ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ ํญ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถค. ### 3) ์ด์ „ ๋Œ€ํ™” ๋กœ๋“œ ์นด๋“œ ํ†ค ๋‹ค์šด - `CreateTimelineLoadMoreCard()`๋ฅผ ์นด๋“œํ˜• ๋ฐ•์Šค์—์„œ ์–‡์€ outline pillํ˜• ๋ฒ„ํŠผ์œผ๋กœ ์ „ํ™˜ํ•ด ํƒ€์ž„๋ผ์ธ ์ƒ๋‹จ ๋ฐ€๋„๋ฅผ ๋‚ฎ์ถค. ### 4) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 50์ฐจ: ๋ฉ”์‹œ์ง€/์ŠคํŠธ๋ฆฌ๋ฐ/composer/์„ค์ • ํ‘œํ˜„์„ ๊ฐ™์€ UX ๊ทœ์น™์œผ๋กœ ์žฌ์ •๋ ฌ) ์—…๋ฐ์ดํŠธ: 2026-04-04 19:25 (KST) ### 1) ๋ฉ”์‹œ์ง€ ์นด๋“œ์™€ ์ŠคํŠธ๋ฆฌ๋ฐ ์นด๋“œ ๊ทœ์น™ ํ†ต์ผ - ์‚ฌ์šฉ์ž/AI ๋ฉ”์‹œ์ง€ ์นด๋“œ์˜ ์„ธ๋กœ ๋งˆ์ง„, ์ฝ”๋„ˆ ๋ฐ˜๊ฒฝ, ๋ณธ๋ฌธ ํŒจ๋”ฉ, ํƒ€์ž„์Šคํƒฌํ”„ ํฌ๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ์ค„์—ฌ Codexํ˜• ์ด˜์ด˜ํ•œ ๋ณธ๋ฌธ ๋ฐ€๋„๋กœ ์žฌ์ •๋ ฌ. - ์ŠคํŠธ๋ฆฌ๋ฐ ์นด๋“œ ํ—ค๋”์˜ ์•„์ด์ฝ˜/์ด๋ฆ„/๊ฒฝ๊ณผ ์‹œ๊ฐ„ ํƒ€์ดํฌ๋ฅผ ์ผ๋ฐ˜ AI ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถ”๊ณ , ์นด๋“œ ๋ฐ˜๊ฒฝ/ํŒจ๋”ฉ/๋ฉ”ํƒ€ ์ค„ ๊ฐ„๊ฒฉ๋„ ๋™์ผ ๊ทœ์น™์œผ๋กœ ํ†ต์ผ. - ์•ก์…˜ ๋ฐ”์˜ ์„ธ๋กœ ๊ฐ„๊ฒฉ๊ณผ ๋ฉ”ํƒ€ ์ •๋ณด ํฌ๊ธฐ๋ฅผ ๋‚ฎ์ถฐ ๋ณธ๋ฌธ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง€๋„๋ก ์ •๋ฆฌ. ### 2) composer ์ƒ๋‹จ strip / ํ•˜๋‹จ ์ƒํƒœ์ค„ ์••์ถ• - ์ž…๋ ฅ ์นด๋“œ, ๋ชจ๋ธ ๋ฒ„ํŠผ, ํ”„๋ฆฌ์…‹ ๋ฒ„ํŠผ, ํ† ํฐ ๋ง ์นด๋“œ์˜ ๋†’์ด์™€ ํŒจ๋”ฉ์„ ๋” ๋‚ฎ๊ณ  ํ‰ํ‰ํ•˜๊ฒŒ ์กฐ์ •ํ•ด `claw-code` ๊ณ„์—ด์˜ ์–‡์€ composer ๋ฆฌ๋“ฌ์— ๊ฐ€๊น๊ฒŒ ์ •๋ ฌ. - ์ž…๋ ฅ ๋ฐ•์Šค ์ตœ์†Œ ๋†’์ด์™€ ํŒจ๋”ฉ, ์ฒจ๋ถ€/๋‚ด๋ณด๋‚ด๊ธฐ/์ค‘์ง€/์ „์†ก ๋ฒ„ํŠผ ํฌ๊ธฐ๋ฅผ ํ•จ๊ป˜ ์ค„์—ฌ ํ•˜๋‹จ๋ถ€ ์ „์ฒด๊ฐ€ ํ•œ ๋ฉ์–ด๋ฆฌ์˜ ์–‡์€ ์ž‘์—…์ค„์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ๋ณด์ •. - Cowork/Code `FolderBar`๋„ ๋†’์ด/๊ณก๋ฅ /ํŒจ๋”ฉ์„ ๋‹ค์‹œ ๋‚ฎ์ถฐ ํ•˜๋‹จ ์ƒํƒœ์ค„์ด ๋ณธ๋ฌธ๋ณด๋‹ค ๊ณผํ•˜๊ฒŒ ํŠ€์ง€ ์•Š๋„๋ก ์ •๋ฆฌ. ### 3) AX Agent ์„ค์ • ํŽ˜์ด์ง€์™€ ์ธ๋ผ์ธ ๋น ๋ฅธ ์„ค์ • ํ‘œํ˜„ ์ผ์น˜ - ์ธ๋ผ์ธ ๋น ๋ฅธ ์„ค์ •์˜ ์ƒํƒœ ๋ผ๋ฒจ์„ `์ œ๋ชฉ ยท ํ˜„์žฌ๊ฐ’` ๊ตฌ์กฐ๋กœ ํ†ต์ผํ•˜๊ณ , ์ „์ฒด ์„ค์ •์˜ ๋น ๋ฅธ ์„ค์ • ๋ฒ„ํŠผ๋„ ๊ฐ™์€ ํ‘œ๊ธฐ ๊ทœ์น™์œผ๋กœ ๋™๊ธฐํ™”. - ์ „์ฒด ์„ค์ •์˜ `๋น ๋ฅธ ์ œ์–ด` ์˜์—ญ์„ `๋น ๋ฅธ ์„ค์ •`์œผ๋กœ ์žฌ์ •์˜ํ•˜๊ณ , ์ธ๋ผ์ธ ๋น ๋ฅธ ์„ค์ •๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ๋ช…/๊ฐ•์กฐ ๋ฐฉ์‹์œผ๋กœ ๋งž์ถค. - ์ „์ฒด ์„ค์ • ์„ค๋ช… ๋ฌธ๊ตฌ๋„ `AX Agent ์„ค์ •์„ ์ด ํ™”๋ฉด ํ•˜๋‚˜์—์„œ ์ •๋ฆฌ`ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•ด ํŠธ๋ ˆ์ด ๊ธฐ๋ฐ˜ ํ‘œํ˜„์˜ ์ž”์žฌ๋ฅผ ์ œ๊ฑฐ. ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 51์ฐจ: AX Agent ์‹ค์‚ฌ์šฉ ๋ฒ„๊ทธ์™€ ํญ/ํ…Œ๋งˆ ์ •๋น„) ์—…๋ฐ์ดํŠธ: 2026-04-04 19:48 (KST) ### 1) Chat ์ขŒ์ธก ์ฃผ์ œ ํด๋ฆญ๊ณผ ํ”„๋ฆฌ์…‹ ๋ฐ˜์˜ ํ๋ฆ„ ๋ณด์ • - Chat ์ขŒ์ธก `์ฃผ์ œ ํƒ์ƒ‰` ํด๋ฆญ ์‹œ ๋‹จ์ˆœ ํ•„ํ„ฐ ์ดˆ๊ธฐํ™”๋งŒ ํ•˜๋˜ ํ๋ฆ„์„ ์ˆ˜์ •ํ•ด, ํ”„๋ฆฌ์…‹ ์นด๋“œ์™€ EmptyState๊ฐ€ ์ฆ‰์‹œ ๋‹ค์‹œ ๋ณด์ด๋„๋ก ์ •๋ฆฌ. - ํ”„๋ฆฌ์…‹ ์„ ํƒ ์‹œ ์นดํ…Œ๊ณ ๋ฆฌ ๋ผ๋ฒจ, ๋Œ€ํ™” ๋ฉ”ํƒ€, ์›Œํ„ฐ๋งˆํฌ, ๋Œ€ํ™” ๋ชฉ๋ก ์ €์žฅ ํ๋ฆ„์„ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•ด `๋ˆŒ๋Ÿฌ๋„ ์•„๋ฌด ์ผ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”` ์ƒํƒœ๋ฅผ ์ค„์ž„. ### 2) ๊ถŒํ•œ/๋ฐ์ดํ„ฐ ํ™œ์šฉ ์ƒํƒœ ๋ฐ˜์˜ ์ง€์—ฐ ๋ณด์ • - ๋Œ€ํ™” ์„ค์ • ์ €์žฅ ์ „์— ํ˜„์žฌ ๋Œ€ํ™” ๊ฐ์ฒด์˜ ๊ถŒํ•œ/๋ฐ์ดํ„ฐ ํ™œ์šฉ/๋ฌด๋“œ ๊ฐ’์„ ๋จผ์ € ๋™๊ธฐํ™”ํ•˜๋„๋ก ์กฐ์ •ํ•ด ํ•˜๋‹จ ์ƒํƒœ๊ฐ€ ํ•œ ๋‹จ๊ณ„ ๋Šฆ๊ฒŒ ๋ฐ˜์˜๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์ค„์ž„. - ๊ถŒํ•œ ํŒ์—…๊ณผ ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํŒ์—…์˜ row ํด๋ฆญ์„ `MouseLeftButtonDown` ๊ธฐ์ค€์œผ๋กœ ๋ฐ”๊ฟ” ์ฆ‰์‹œ ๋ฐ˜์˜๊ฐ์ด ๋‚˜๋„๋ก ๋ณด์ •. - ๊ถŒํ•œ/๋ฐ์ดํ„ฐ ํ™œ์šฉ ๋ณ€๊ฒฝ ํ›„ ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋น ๋ฅธ ์„ค์ • ๋ผ๋ฒจ๋„ ์ฆ‰์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋„๋ก ์—ฐ๊ฒฐ. ### 3) ์ฑ„ํŒ… ํญ/์„ค์ • ๋ ˆ์ด์•„์›ƒ/ํ…Œ๋งˆ ์กฐ์ • - ๋ฉ”์‹œ์ง€ ์ตœ๋Œ€ ํญ ๊ณ„์‚ฐ๊ณผ ์ขŒ์šฐ ๋งˆ์ง„์„ ์ค„์—ฌ Chat ๋ณธ๋ฌธ๊ณผ composer๊ฐ€ ๋” ๋„“๊ฒŒ ๋ณด์ด๋„๋ก ์กฐ์ •. - AX Agent ์„ค์ • ์˜ค๋ฒ„๋ ˆ์ด์˜ ์ขŒ์ธก ์ปฌ๋Ÿผ ํญ๊ณผ ํ—ค๋” ํƒ€์ดํฌ๋ฅผ ์กฐ์ •ํ•˜๊ณ , ์„ค๋ช… ๋ฌธ๊ตฌ์— ์ค„๋ฐ”๊ฟˆ์„ ํ—ˆ์šฉํ•ด ์ œ๋ชฉ์ด ์ž˜๋ ค ๋ณด์ด๋˜ ํ˜„์ƒ์„ ์™„ํ™”. - `Claw` ์Šคํƒ€์ผ ํ‘œ์‹œ๋Š” `Claude`๋กœ ๋ณด์ด๋„๋ก ์ •๋ฆฌํ•˜๊ณ , ์ „์šฉ ํ…Œ๋งˆ์˜ ๋ฐ์€/์‹œ์Šคํ…œ/๋‹คํฌ ํŒ”๋ ˆํŠธ๋ฅผ ๋” ์ค‘์„ฑ์ ์ธ ๋ฒ ์ด์ง€ยทํšŒ์ƒ‰ ๊ณ„์—ด๋กœ ๋‹ค๋“ฌ์–ด ๋…ธ๋ž€ ํ†ค์„ ์™„ํ™”. ### 4) ํ•˜๋‹จ ๋ฐ” ์‹œ๊ฐ ์ •๋ ฌ๊ณผ ํŠธ๋ ˆ์ด ์ง„์ž…์  ์ •๋ฆฌ - ํด๋” ๋ฐ์ดํ„ฐ ํ™œ์šฉ ๋ฒ„ํŠผ์„ ๊ธฐ๋ณธ ์„ ํƒํ˜• ์นด๋“œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋„๋ก ํˆฌ๋ช… ๋ฐฐ๊ฒฝ + ๊ฒฝ๊ณ„์„  ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•ด ๊ถŒํ•œ ๋ฒ„ํŠผ๊ณผ ๋” ๋น„์Šทํ•œ ๋ฐ€๋„๋กœ ๋งž์ถค. - ํŠธ๋ ˆ์ด์˜ `์„ค์ •` ํ•ญ๋ชฉ์€ AI ํ™œ์„ฑํ™” ์‹œ `AX Agent ์„ค์ •`์œผ๋กœ ์ง์ ‘ ์ง„์ž…ํ•˜๋„๋ก ๋ฐ”๊พธ๊ณ , AI ๋น„ํ™œ์„ฑ ์ƒํƒœ์—์„œ๋Š” ๊ธฐ์กด ์•ฑ ์„ค์ •์œผ๋กœ ํด๋ฐฑํ•˜๋„๋ก ์—ฐ๊ฒฐ. ### 5) ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ - `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal` ํ†ต๊ณผ (๊ฒฝ๊ณ  0, ์˜ค๋ฅ˜ 0). - 2026-04-04 20:41 (KST): Reduced AX Agent permission surface to the four claw-code-aligned public modes (`๊ถŒํ•œ ์š”์ฒญ`, `ํŽธ์ง‘ ์ž๋™ ์Šน์ธ`, `๊ณ„ํš ๋ชจ๋“œ`, `๊ถŒํ•œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ`), removed legacy `์งˆ๋ฌธ ์—†์ด ์ง„ํ–‰` exposure from popups/slash guidance, and normalized old aliases onto the four-mode flow. - 2026-04-04 20:41 (KST): Simplified the in-chat AX Agent settings page by shortening navigation/section copy, tightening the settings information hierarchy, and making the overlay read more like a single integrated settings page instead of separate mini panels. - 2026-04-04 20:41 (KST): Trimmed Chat/Cowork/Code sidebar information labels to a smaller shared structure (`์ฃผ์ œ`, `์ž‘์—…`, `์ฝ”๋“œ ์ž‘์—…`) so the left rail reads closer to the simpler Claude/Codex-style navigation density. ## 2026-04-04 ?? ?? ?? (?? ?? 52?: AX Agent ?? ???? ??? ??/row ???) ????: 2026-04-04 20:10 (KST) ### 1) ??? ??? ?? ?? ?? - AX Agent ?? ?????? ?? ?? ??? ??? ??(AX Agent ???, ?? ??/???, ???/??, ???????????Fast, ?? ??? ??, vLLM SSL ??)? ?? ?? ???? ?? composer/??/?? ??/?? ???? ?? ?? ????? ??. - ?????, API ?, ?? ???, ?? ??(?? ?? ??/?? ???? ??/?? ??? ??)? LostFocus ?? ???? ? ????? ????, ??? ??? ?? ? ?? + ?? ??? ??. ### 2) ?? ???? ?? ?? - ?? ?? ?? ?, ?? ??, ?? ??? ?? Claude/Codex ???? ? ?? ???? ???? ??. - ?? ?? ??? ?? ??? ?? ?? ?? ??? ?? ???? ???? ?? ???? ???? ??. ### 3) row ?? ?? ???? ?? - ?? ?? ??? ?? ?? ???? ??/??/???? ? ??? ?? Fast, ???? ??, ?? ? ??, ?? ??? ?? ???? ???? ??. - ???/?? ??? ??/??? ???, ??/?????/API ?/?? ??? ??? ?? ??? ??? ?? ?? ??? ? ??? ? ?? UX? ???? ??. ### 4) ?? ??? - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal ?? (?? 0, ?? 0). ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 53์ฐจ: AX Agent ๊ณ ๊ธ‰ ์„ค์ • ์„ค๋ช…ํ˜• On/Off ๊ฐœํŽธ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:05 (KST) - AX Agent ์ฑ„ํŒ… ๋‚ด๋ถ€ ์„ค์ • ์˜ค๋ฒ„๋ ˆ์ด์˜ ๊ณ ๊ธ‰ ์˜ต์…˜ ๋ฌถ์Œ์„ ํ•œ ์ค„ ์ฒดํฌ๋ฐ•์Šค ๋ชฉ๋ก์—์„œ ์„ค๋ช…ํ˜• ํ–‰(row) ๊ตฌ์กฐ๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. - ์˜ต์…˜ ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉ์ž ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. ์˜ˆ: ์ž๋™ ์ปจํ…์ŠคํŠธ ์••์ถ•โ†’์ž๋™ ๋Œ€ํ™” ์••์ถ•, ์Šคํ‚ฌ ์‹œ์Šคํ…œโ†’ํ™•์žฅ ์Šคํ‚ฌ ์‚ฌ์šฉ, ๋ณ‘๋ ฌ ๋„๊ตฌ ์‹คํ–‰โ†’๋„๊ตฌ ๋ณ‘๋ ฌ ์‹คํ–‰. - ๊ฐ ์˜ต์…˜ ์•„๋ž˜์— ์ƒ์„ธ ์„ค๋ช…์„ ๋ถ™์ด๊ณ , ์ผœ๊ธฐ / ๋„๊ธฐ ์ปค์Šคํ…€ ์„ ํƒ ๋ฒ„ํŠผ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. - ๋‚ด๋ถ€ ์ €์žฅ ๋กœ์ง์€ ๊ธฐ์กด ์ฒดํฌ๋ฐ•์Šค ๊ธฐ๋ฐ˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด ํ˜ธํ™˜์„ฑ์„ ์ง€ํ‚ค๊ณ , ํ‘œ์‹œ UI๋งŒ ์ปค์Šคํ…€ ์ปจํŠธ๋กค๋กœ ๊ต์ฒดํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal โ†’ ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 54์ฐจ: AX Agent ๋ชจ๋ธ ์„ ํƒ/SSL ํ๋ฆ„ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 20:58 (KST) - AX Agent ๋ฉ”์ธ ์„ค์ •์˜ ๋‚ด๋ถ€ ์„œ๋น„์Šค(Ollama, vLLM)๋Š” `๋“ฑ๋ก ๋ชจ๋ธ` ๋ชฉ๋ก๊ณผ `์‚ฌ์šฉํ•  ๋ชจ๋ธ` ์นฉ ์„ ํƒ๋งŒ ๋‚จ๊ธฐ๊ณ , ๋ณ„๋„ ๋ชจ๋ธ๋ช… ํ…์ŠคํŠธ ์ž…๋ ฅ ํ๋ฆ„์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. - ์ฑ„ํŒ… ๋‚ด๋ถ€ AX Agent ์„ค์ • ์˜ค๋ฒ„๋ ˆ์ด๋Š” ๋“ฑ๋ก ๋ชจ๋ธ ์นฉ ์„ ํƒ์„ ๊ธฐ์ค€ ๊ฒฝ๋กœ๋กœ ๊ณ ์ •ํ•˜๊ณ , ์ˆจ๊ฒจ์ง„ ๋ชจ๋ธ ์ž…๋ ฅ์นธ๊ณผ ์ „์—ญ vLLM SSL ํ† ๊ธ€์ด ์ €์žฅ ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๋ณด์ •ํ–ˆ๋‹ค. - ๊ตฌํ˜• `AgentSettingsWindow`์—์„œ๋„ ๋ชจ๋ธ ์„ ํƒ์„ ๋‚ด๋ถ€ `_selectedModel` + ์นฉ ์„ ํƒ ํ๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ณ , ์ „์—ญ vLLM SSL ์šฐํšŒ ํ† ๊ธ€์€ ๋…ธ์ถœ/์ €์žฅ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ–ˆ๋‹ค. - `ModelRegistrationDialog`๋Š” vLLM์ผ ๋•Œ๋งŒ SSL ์ธ์ฆ์„œ ๊ฒ€์ฆ ์ƒ๋žต ์˜ต์…˜์„ ํ‘œ์‹œํ•˜๋„๋ก ์ •๋ฆฌํ•ด, SSL ์šฐํšŒ๋Š” ๋ชจ๋ธ ๋“ฑ๋ก/ํŽธ์ง‘ ๋‹จ๊ณ„์—์„œ๋งŒ ๊ด€๋ฆฌํ•˜๋„๋ก ๋งž์ท„๋‹ค. - ๊ฒ€์ฆ: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` โ†’ ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 55์ฐจ: ์ปจํ…์ŠคํŠธ ํ‘œ์‹œ ๋‹จ์ˆœํ™”์™€ 1M ์ƒํ•œ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 21:02 (KST) - ํ•˜๋‹จ composer์˜ ์ปจํ…์ŠคํŠธ ์นด๋“œ๋ฅผ `์ปจํ…์ŠคํŠธ 32%` + `83K / 258K`์ฒ˜๋Ÿผ ๋” ์งง๊ฒŒ ์ฝํžˆ๋Š” ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ•˜๊ณ , ์ƒ์„ธ ์ •๋ณด๋Š” hover ํˆดํŒ์—์„œ ๋ณด์ด๋„๋ก ๋ฐ”๊ฟจ๋‹ค. - hover ํˆดํŒ์—๋Š” ์ƒํƒœ, ์‹ค์ œ ํ† ํฐ ์ˆ˜, ์••์ถ• ์‹œ์ž‘ ์ž„๊ณ„์น˜, ํ˜„์žฌ ์ž…๋ ฅ ์ดˆ์•ˆ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ํ† ํฐ ํ‘œ๊ธฐ ๋‹จ์œ„๋Š” `k` ๋Œ€์‹  `K`, `M` ๊ธฐ์ค€์œผ๋กœ ํ†ต์ผํ•ด ํฐ ์ปจํ…์ŠคํŠธ ์ฐฝ์—์„œ ๋” ๋น ๋ฅด๊ฒŒ ์ฝํžˆ๋„๋ก ๋ณด์ •ํ–ˆ๋‹ค. - ์„ค์ •์˜ `์ตœ๋Œ€ ์ปจํ…์ŠคํŠธ ํ† ํฐ` ์„ ํƒ ๋ฒ”์œ„๋ฅผ `32K / 64K / 128K / 256K / 512K / 1M`๊นŒ์ง€ ํ™•์žฅํ•˜๊ณ , ViewModel/์˜ค๋ฒ„๋ ˆ์ด ์ž…๋ ฅ ๊ฒฝ๋กœ์—์„œ๋„ ์ตœ๋Œ€๊ฐ’์„ `1,000,000`์œผ๋กœ ์ œํ•œํ–ˆ๋‹ค. - ๊ฒ€์ฆ: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` โ†’ ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 56์ฐจ: ์„œ๋น„์Šค ์„ ํƒ UI ํ†ต์ผ๊ณผ composer ํ‘œ๊ธฐ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 21:02 (KST) - AX Agent ์„ค์ •์˜ ์„œ๋น„์Šค ์„œ๋ธŒํƒญ ์Šคํƒ€์ผ์„ ๋” ์–‡๊ณ  ์ •๋ˆ๋œ ์นด๋“œํ˜• ๋ผ๋””์˜ค ๋ฒ„ํŠผ์œผ๋กœ ์กฐ์ •ํ•˜๊ณ , ์„ ํƒ ์ƒํƒœ๋Š” AccentColor ๊ฒฝ๊ณ„์„  + ๋ฐฐ๊ฒฝ ๊ฐ•์กฐ๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ–ˆ๋‹ค. - `Gemini`, `Claude` ์„œ๋น„์Šค ํŒจ๋„๋„ ๊ธฐ์กด ComboBox ๋Œ€์‹  ๋ฒ„ํŠผํ˜• ๋ชจ๋ธ ์นฉ ๋ชฉ๋ก์œผ๋กœ ๊ต์ฒดํ•ด `Ollama`, `vLLM`๊ณผ ๊ฐ™์€ ์„ ํƒ ๋ฌธ๋ฒ•์œผ๋กœ ๋งž์ท„๋‹ค. - ๋ฉ”์ธ ์„ค์ •์˜ ์„œ๋น„์Šค ํŒจ๋„์€ ๋‚ด๋ถ€ ์„œ๋น„์Šค/์™ธ๋ถ€ ์„œ๋น„์Šค ๋ชจ๋‘ `์‚ฌ์šฉํ•  ๋ชจ๋ธ` + `๋ชจ๋ธ ์„ ํƒ` + `API ํ‚ค` ๊ตฌ์กฐ๋กœ ํ†ต์ผํ–ˆ๋‹ค. - ์ฑ„ํŒ… ํ•˜๋‹จ composer์˜ ๋ชจ๋ธ ๋ฒ„ํŠผ ๋ฌธ๊ตฌ๋ฅผ `์„œ๋น„์Šค {์„œ๋น„์Šค๋ช…} ยท ๋ชจ๋ธ {๋ชจ๋ธ๋ช…}` ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ” ์„ค์ • ํ™”๋ฉด๊ณผ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ฝํžˆ๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - `claw-code` ์†Œ์Šค์™€์˜ ๊ฒฉ์ฐจ๋Š” ์‹ค์ œ ์ฝ”๋“œ ๊ตฌ์กฐ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์ ๊ฒ€ํ–ˆ๋‹ค. ํ˜„์žฌ UI/๊ถŒํ•œ/๋ชจ๋ธ ์„ ํƒ ํ๋ฆ„์€ ๊ทผ์ ‘ํ–ˆ์ง€๋งŒ, `claw-code`์—๋Š” ์—ฌ์ „ํžˆ ๋” ๊นŠ์€ ์ƒํƒœ ๊ณ„์ธต(์„ค์ • ์†Œ์Šค ์šฐ์„ ์ˆœ์œ„, ์„ธ์…˜๋ณ„ bypass ์ƒํƒœ, per-model usage/turn budget ์ง‘๊ณ„, settings change fan-out)์ด ์กด์žฌํ•ด ์ด ๋ถ€๋ถ„์ด ์ฃผ๋œ ๋‚จ์€ ๊ฒฉ์ฐจ๋กœ ํ™•์ธ๋๋‹ค. - ๊ฒ€์ฆ: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` โ†’ ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ## 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 57์ฐจ: ์„ค์ • ์„œ๋ธŒํƒญ ์™ธ๊ณฝ์„  ์ œ๊ฑฐ์™€ ์ •๋ ฌ ๋ณด์ •) - ์—…๋ฐ์ดํŠธ: 2026-04-04 21:20 (KST) - `SettingsWindow`์˜ ์„œ๋ธŒํƒญ ๊ณตํ†ต ์Šคํƒ€์ผ(`AgentSubTabStyle`)์—์„œ ๋ฒ„ํŠผ ์™ธ๊ณฝ์„ ๊ณผ ์„ ํƒ ์‹œ ํ…Œ๋‘๋ฆฌ ๊ฐ•์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ฐฐ๊ฒฝ ๊ฐ•์กฐ ์ค‘์‹ฌ์˜ ๋” ๊ฐ€๋ฒผ์šด ํƒญ ํ‘œํ˜„์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. - `์ผ๋ฐ˜`, `ํ…Œ๋งˆ`, `๊ธฐ๋Šฅ`, `AX Agent`, `์„œ๋น„์Šค` ์„œ๋ธŒํƒญ ๋ฌถ์Œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐฐ๊ฒฝ ๋ฐ•์Šค๋ฅผ ๊ฑท์–ด๋‚ด๊ณ , ํƒญ ์ค„์˜ ์ƒํ•˜ ์—ฌ๋ฐฑ๊ณผ ์„ธ๋กœ ์ •๋ ฌ์„ ๋ณด์ •ํ•ด ์ œ๋ชฉ ์•„๋ž˜์—์„œ ๋” ์ค‘์•™์— ์˜ค๋„๋ก ๋งž์ท„๋‹ค. - ์„ค์ • ํ™”๋ฉด ์ „์ฒด๊ฐ€ ๊ธฐ๋ณธ ์ปจํŠธ๋กค ๋А๋‚Œ๋ณด๋‹ค Claude/Codex ๊ณ„์—ด์ฒ˜๋Ÿผ ๋” ์–‡๊ณ  ๋‹จ์ •ํ•œ ํƒญ ๋ฐ€๋„๋กœ ์ฝํžˆ๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ๊ฒ€์ฆ: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` โ†’ ๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0 ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 58์ฐจ: Cowork/Code ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ•„ํ„ฐ ์ „ํ™˜) - ์—…๋ฐ์ดํŠธ: 2026-04-04 21:55 (KST) - ChatWindow ์ƒ๋‹จ ํ•„ํ„ฐ์™€ ์ขŒ์ธก ๋ฉ”๋‰ด์—์„œ Cowork/Code์˜ ์ฃผ์ œ/์ž‘์—… ์œ ํ˜• ์„ ํƒ์„ ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ•„ํ„ฐ๋กœ ์ „ํ™˜ํ–ˆ๋‹ค. - ๋“œ๋กญ๋‹ค์šด์€ ํ˜„์žฌ ํƒญ ๋Œ€ํ™” ๋ฉ”ํƒ€์˜ WorkFolder๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ณ , ์„ ํƒ ์‹œ ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋Œ€ํ™”๋งŒ ํ‘œ์‹œํ•œ๋‹ค. - Chat ํƒญ์€ ๊ธฐ์กด ์ฃผ์ œ ํ•„ํ„ฐ๋ฅผ ์œ ์ง€ํ•ด ํ”„๋ฆฌ์…‹/์นดํ…Œ๊ณ ๋ฆฌ ํ๋ฆ„์„ ๋ณด์กดํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 59์ฐจ: ์‚ฌ์ด๋“œ๋ฐ” ๊ฒ€์ƒ‰ ์•ก์…˜ํ™”์™€ ๊ฒฝ๊ณ„์„  ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:08 (KST) - AX Agent ์ขŒ์ธก ์‚ฌ์ด๋“œ๋ฐ” ๊ฒ€์ƒ‰ ๋ฐ•์Šค๋ฅผ ํ‰์‹œ์—๋Š” ํ‰ํ‰ํ•œ ์•ก์…˜ ํ–‰์œผ๋กœ ๋ณด์ด๊ฒŒ ๋ฐ”๊พธ๊ณ , ํด๋ฆญ ์‹œ ์ขŒ์ธก์—์„œ ์šฐ์ธก์œผ๋กœ ํŽผ์ณ์ง€๋Š” ์ธ๋ผ์ธ ๊ฒ€์ƒ‰ ์ž…๋ ฅ์œผ๋กœ ์ „ํ™˜ํ–ˆ๋‹ค. - ๊ฒ€์ƒ‰ ํ–‰์€ hover ์‹œ Ctrl+K ๋‹จ์ถ•ํ‚ค๋ฅผ ํ‘œ์‹œํ•˜๊ณ , Ctrl+K ์ž…๋ ฅ์œผ๋กœ๋„ ์ฆ‰์‹œ ์—ด๋ฆฌ๋„๋ก ์—ฐ๊ฒฐํ–ˆ๋‹ค. - ์ขŒ์ธก ๋ฉ”๋‰ด ์ปจํ…Œ์ด๋„ˆ์˜ ๋ถˆํ•„์š”ํ•œ ์นด๋“œํ˜• ๊ฒฝ๊ณ„์„ ์„ ์ œ๊ฑฐํ•ด claw-code ๊ณ„์—ด์˜ ๋” ํ‰ํ‰ํ•œ ๋ฆฌ์ŠคํŠธํ˜• ๋А๋‚Œ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 60์ฐจ: ๋Œ€ํ™” ๋ชฉ๋ก ๋‚ ์งœ ๊ทธ๋ฃน ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:14 (KST) - ์ขŒ์ธก ๋Œ€ํ™” ๋ชฉ๋ก์„ ์˜ค๋Š˜ / ์–ด์ œ / ์ด์ „ 3๋‹จ๊ณ„ ๊ทธ๋ฃน์œผ๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. - ์ฒซ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง๊ณผ ๋” ๋ณด๊ธฐ ํ™•์žฅ ๋ Œ๋”๋ง ๋ชจ๋‘ ๊ฐ™์€ ๋‚ ์งœ ๊ทธ๋ฃน ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 61์ฐจ: AX Agent ๊ณ ๊ธ‰ ์„ค์ • ํ† ๊ธ€ ์Šค์œ„์น˜ํ™”) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:22 (KST) - AX Agent ๊ณ ๊ธ‰ ์„ค์ •์˜ ์ผœ๊ธฐ/๋„๊ธฐ ์ด์ค‘ ๋ฒ„ํŠผ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ ํ•ญ๋ชฉ์„ ๋‹จ์ผ ToggleSwitch๋กœ ๊ต์ฒดํ–ˆ๋‹ค. - ๊ณ ๊ธ‰ ์„ค์ • ํ–‰์€ ์œ ์ง€ํ•˜๋˜ ์กฐ์ž‘๋ถ€๋ฅผ ๋” ๋‹จ์ˆœํ•œ ์Šค์œ„์น˜ํ˜•์œผ๋กœ ๋ฐ”๊ฟ” ๊ฐ€๋…์„ฑ๊ณผ ์ƒํƒœ ์ธ์ง€์„ฑ์„ ๊ฐœ์„ ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 62์ฐจ: ์ƒ๋‹จ ์•ก์…˜ ์ค„ ๋‹จ์ˆœํ™”์™€ Code ์›ŒํฌํŠธ๋ฆฌ UI ์ถ”๊ฐ€) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:47 (KST) - AX Agent ์ขŒ์ธก ์ƒ๋‹จ ์•ก์…˜์„ ์ƒˆ ๋Œ€ํ™” / ๊ฒ€์ƒ‰์˜ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธํ˜• ํ–‰์œผ๋กœ ํ†ต์ผํ•˜๊ณ , ๊ฒ€์ƒ‰์€ ์œ ์ง€ํ•˜๋˜ ์˜ˆ์•ฝ๋จ/Dispatch ์„ฑ๊ฒฉ์˜ ํ•ญ๋ชฉ์€ ๋…ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒ ํŒ์—…์— ๊ฒ€์ƒ‰ ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•ด ๋Œ€ํ™” ๋ฉ”ํƒ€์™€ ์ตœ๊ทผ ํด๋”๋ฅผ ํ•จ๊ป˜ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ํŒจ๋„ํ˜•์œผ๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. - Code ํƒญ ํ•˜๋‹จ ๋ฐ”์—์„œ ์–ธ์–ด ์„ ํƒ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋กœ์ปฌ / ์›ŒํฌํŠธ๋ฆฌ ์ค‘์‹ฌ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ, Git ์ €์žฅ์†Œ์—์„œ๋Š” ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ๊ธฐ์ค€ git worktree add๋กœ ๋ถ„๋ฆฌ ์ž‘์—… ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ์ผ๋ฐ˜ ํด๋”๋Š” ๋ณต์‚ฌ๋ณธ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ์ „ํ™˜ํ•˜๋„๋ก ์—ฐ๊ฒฐํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 63์ฐจ: AX Agent ์„ค์ • ํ†ตํ•ฉ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 22:55 (KST) - ๋ฉ”์ธ ์„ค์ •์˜ ์ผ๋ฐ˜ ํƒญ์— ๋‚จ์•„ ์žˆ๋˜ `AI ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”`, `์šด์˜ ๋ชจ๋“œ` ๋…ธ์ถœ์„ ์ˆจ๊ธฐ๊ณ , AX Agent ๊ณตํ†ต ํƒญ ์ƒ๋‹จ์˜ `๊ธฐ๋ณธ ์ƒํƒœ` ์„น์…˜์œผ๋กœ ์ด๋™ํ•ด AX Agent ๊ด€๋ จ ์ œ์–ด๋ฅผ ํ•œ๊ณณ์—์„œ ํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - AX Agent ๊ณตํ†ต ํƒญ์—๋Š” `AX Agent ์‚ฌ์šฉ` ํ† ๊ธ€๊ณผ `์šด์˜ ๋ชจ๋“œ` ์„ ํƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ์กด ์ €์žฅ ๊ฒฝ๋กœ์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ๋™๊ธฐํ™”ํ–ˆ๋‹ค. - ๊ธฐ๋Šฅ ํƒญ์— ๋‚จ์•„ ์žˆ๋˜ `์ž๋™ ๋ชจ๋ธ ๋ผ์šฐํŒ…` ์ค€๋น„ ์ค‘ UI๋Š” ์ˆจ๊ธฐ๊ณ , AX Agent ๊ฐœ๋ฐœ์ž ํƒญ ์•ˆ์˜ ํ‘œ์‹œํ˜• ์„น์…˜์œผ๋กœ ์˜ฎ๊ฒจ AX Agent ์ „์šฉ ์‹คํ—˜/๊ฐœ๋ฐœ ํ•ญ๋ชฉ ์œ„์น˜๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋งž์ท„๋‹ค. - `ApplyAiEnabledState`, `ApplyOperationModeState`๋ฅผ ๋ณด๊ฐ•ํ•ด ์ผ๋ฐ˜ ํƒญ/AX Agent ํƒญ์˜ ์ค‘๋ณต ์ปจํŠธ๋กค์ด ์žˆ์–ด๋„ ๋™์ผ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 64์ฐจ: AX Agent ์„œ๋ธŒํƒญ ๋‹จ์ˆœํ™”์™€ ์„ค์ • ๋ฐ€๋„ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:02 (KST) - AX Agent ์ƒ๋‹จ ์„œ๋ธŒํƒญ์„ `๊ณตํ†ต / ์„œ๋น„์Šค / ๊ถŒํ•œ / ๊ณ ๊ธ‰` 4๊ฐœ ์ค‘์‹ฌ์œผ๋กœ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๊ธฐ์กด `์ฝ”์›Œํฌ/์ฝ”๋“œ/๋„๊ตฌ/์Šคํ‚ฌ/์ฐจ๋‹จ` ์„ธ๋ถ€ ํƒญ์€ ํ‘œ๋ฉด์—์„œ ์ˆจ๊ฒผ๋‹ค. - AX Agent ๊ณตํ†ต ํŒจ๋„ ๋‚ด๋ถ€๋ฅผ `๊ธฐ๋ณธ ์ƒํƒœ`, `์„œ๋น„์Šค ์„ค์ •`, `๊ณตํ†ต ๋Ÿฐํƒ€์ž„ ์„ค์ •` ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋„๋ก `AgentCommonOverviewSection`, `AgentServiceSection`, `AgentCommonRuntimeSection` ๋ž˜ํผ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์„ ํƒ๋œ ์„œ๋ธŒํƒญ์— ๋”ฐ๋ผ ๊ฐ™์€ ํŒจ๋„ ์•ˆ์—์„œ ํ•„์š”ํ•œ ์„น์…˜๋งŒ ๋ณด์ด๋„๋ก ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. - `๊ณตํ†ต` ํƒญ์€ ๊ธฐ๋ณธ ์ƒํƒœ์™€ ๊ณตํ†ต ๋Ÿฐํƒ€์ž„ ์„ค์ •, `์„œ๋น„์Šค` ํƒญ์€ ํ™œ์„ฑ ์„œ๋น„์Šค/์„œ๋น„์Šค๋ณ„ ๋ชจ๋ธ ์„ค์ •, `๊ถŒํ•œ` ํƒญ์€ Cowork/Code ๊ณตํ†ต ๊ถŒํ•œ๊ณผ ์‹คํ–‰ ์ œ์–ด, `๊ณ ๊ธ‰` ํƒญ์€ ๊ฐœ๋ฐœ์ž ์„ฑ๊ฒฉ์˜ ์ƒ์„ธ ์„ค์ • ์ค‘์‹ฌ์œผ๋กœ ๋ณด์ด๊ฒŒ ๋งคํ•‘ํ–ˆ๋‹ค. - AX Agent ์„ค์ • ํ–‰ ๊ฐ„๊ฒฉ๊ณผ ์„œ๋ธŒํƒญ ํŒจ๋”ฉ์„ ๋Š˜๋ ค ๊ฐ€๋…์„ฑ์„ ๋†’์˜€๊ณ , ๊ธฐ๋Šฅ ํƒญ์˜ `AI ๊ธฐ๋Šฅ` ์„œ๋ธŒํƒญ ํ‘œ๊ธฐ๋ฅผ `ํ…์ŠคํŠธ/ํŒŒ์ผ`๋กœ ๋ฐ”๊พธ๋Š” ๋“ฑ ์ผ๋ฐ˜ ์„ค์ •์— ๋‚จ์•„ ์žˆ๋˜ ๊ณผํ•œ AI ํ‘œํ˜„์„ ์ค„์˜€๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 65์ฐจ: ์›Œํฌ์ŠคํŽ˜์ด์Šค/๋ธŒ๋žœ์น˜ ํŒจ๋„ ์–ธ์–ด ํ†ต์ผ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:08 (KST) - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒ ํŒ์—…์„ `์ตœ๊ทผ ์›Œํฌ์ŠคํŽ˜์ด์Šค / ์ „์ฒด ์›Œํฌ์ŠคํŽ˜์ด์Šค` ์„น์…˜ํ˜•์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•ด `claw-code` ๊ณ„์—ด์ฒ˜๋Ÿผ ์ตœ๊ทผ ์‚ฌ์šฉ๊ณผ ์ „์ฒด ํ›„๋ณด๋ฅผ ๋‚˜๋ˆ  ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ์›Œํฌ์ŠคํŽ˜์ด์Šค ํŒจ๋„์€ ์ตœ๊ทผ ๋ชฉ๋ก๊ณผ ์ „์ฒด ๋ชฉ๋ก์„ ๋ถ„๋ฆฌํ•˜๋˜, ํ˜„์žฌ ํ™œ์„ฑ ํด๋”๋Š” ๋™์ผํ•œ ์ฒดํฌ/์•„์ด์ฝ˜ ๋ฌธ๋ฒ•์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋Š” ๋‘ ์„น์…˜์— ๊ณตํ†ต ์ ์šฉ๋˜๋„๋ก ๋งž์ท„๋‹ค. - Code ํƒญ ํ•˜๋‹จ์˜ Git ๋ธŒ๋žœ์น˜ ํŒ์—…์€ ๊ธฐ์กด flat row ์ค‘์‹ฌ ๋ Œ๋”์—์„œ worktree ํŒจ๋„๊ณผ ๊ฐ™์€ `์„น์…˜ ๋ผ๋ฒจ + ์„ค๋ช…ํ˜• row` ์–ธ์–ด๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. - ๋ธŒ๋žœ์น˜ ํŒจ๋„์€ `ํ˜„์žฌ ๋ธŒ๋žœ์น˜ / ์ €์žฅ์†Œ / ์—…์ŠคํŠธ๋ฆผ / ๋น ๋ฅธ ์ž‘์—… / ๋ธŒ๋žœ์น˜ ์ „ํ™˜ / ๋ธŒ๋žœ์น˜ ์ž‘์—…` ์„น์…˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ํ•ญ๋ชฉ์„ worktree ๋ฉ”๋‰ด์™€ ๊ฐ™์€ ์„ ํƒ/์ฒดํฌ ๋ฌธ๋ฒ•์œผ๋กœ ํ‘œ์‹œํ•˜๋„๋ก ํ†ต์ผํ–ˆ๋‹ค. - `CreatePopupMenuRow` nullable ๊ฒฝ๋กœ๋ฅผ ์ •๋ฆฌํ•ด ๋ธŒ๋žœ์น˜ ํŒจ๋„ ๋ฆฌํŒฉํ„ฐ๋ง ํ›„์—๋„ ๋นŒ๋“œ ๊ฒฝ๊ณ ๊ฐ€ ๋‚จ์ง€ ์•Š๋„๋ก ๋ณด์ •ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 66์ฐจ: AX Agent ์„ค์ • ํ–‰ ๋ฐ€๋„/์›Œํฌ์ŠคํŽ˜์ด์Šค ํŒจ๋„ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:20 (KST) - AX Agent ์„ค์ •์˜ AgentSettingsRow ํŒจ๋”ฉ๊ณผ ๊ฐ„๊ฒฉ์„ ํ•œ ๋‹จ๊ณ„ ๋” ๋„“ํžˆ๊ณ , ์„œ๋น„์Šค ํƒญ๊ณผ ๊ถŒํ•œ ํƒญ์˜ ์ฃผ์š” ์„ค์ • ํ–‰์„ ๊ฐ™์€ ow + toggle ์‹œ๊ฐ ์–ธ์–ด๋กœ ๋‹ค์‹œ ์ •๋ ฌํ–ˆ๋‹ค. - ์„œ๋น„์Šค ํƒญ์˜ Ollama/vLLM/Gemini/Claude ์„ค์ • ํ–‰๊ณผ ๊ถŒํ•œ ํƒญ์˜ ๊ถŒํ•œ/์—์ด์ „ํŠธ ๋™์ž‘/ํ”„๋กœ์ ํŠธ ๊ทœ์น™/๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ํ–‰์„ AgentSettingsRow ๊ธฐ์ค€์œผ๋กœ ํ†ต์ผํ•ด, ์„ค์ • ๋ฐ€๋„์™€ ํ† ๊ธ€ ๋ฆฌ๋“ฌ์ด ์„ž์—ฌ ๋ณด์ด๋˜ ๋ฌธ์ œ๋ฅผ ์ค„์˜€๋‹ค. - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒ ํŒ์—…์€ ์ œ๋ชฉ, ๊ฒ€์ƒ‰ ์ž…๋ ฅ, ๋‚ด๋ถ€ ์Šคํฌ๋กค ์˜์—ญ์„ ๊ฐ€์ง„ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ์„ ํƒ ํŒจ๋„๋กœ ์žฌ๊ตฌ์„ฑํ•ด claw-code ๊ณ„์—ด์ฒ˜๋Ÿผ ์ตœ๊ทผ/์ „์ฒด ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 67์ฐจ: AX Agent ํ‘œํ˜„ ์ˆ˜์ค€ ์ด๊ด€๊ณผ Code ํ•˜๋‹จ ๊ตฌ์กฐ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:33 (KST) - AX Agent ๊ณตํ†ต ์„ค์ •์— ํ‘œํ˜„ ์ˆ˜์ค€ ํ–‰์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ์กด ์ˆจ๊น€ ์˜์—ญ์— ๋‚จ์•„ ์žˆ๋˜ ํ‘œํ˜„ ์ˆ˜์ค€ ๋ผ๋””์˜ค์™€ ์ƒˆ AX Agent ๋ผ๋””์˜ค๋ฅผ ๊ฐ™์€ ์ €์žฅ ๊ฒฝ๋กœ๋กœ ๋™๊ธฐํ™”ํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ํ‘œํ˜„ ์ˆ˜์ค€ ์ดˆ๊ธฐํ™”๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ์šฐ์„  ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด, ์„ค์ • ์ฐฝ์„ ์—ด ๋•Œ๋งˆ๋‹ค `rich`๋กœ ๋ฎ์–ด์“ฐ์ด๋˜ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ–ˆ๋‹ค. - Code ํƒญ ํ•˜๋‹จ ๋ฐ”๋Š” ๋กœ์ปฌ / ๋ธŒ๋žœ์น˜ / ์›ŒํฌํŠธ๋ฆฌ ํ๋ฆ„์„ ์šฐ์„ ์œผ๋กœ ๋ณด์ด๋„๋ก ์žฌ์ •๋ฆฌํ•˜๊ณ , Code ์ „์šฉ ํ•˜๋‹จ ์•ก์…˜์—์„œ ํŒŒ์ผ ๋ฒ„ํŠผ๊ณผ ์‹คํ–‰ ์ด๋ ฅ ์ƒ์„ธ๋„ ๋ฒ„ํŠผ์„ ์ œ๊ฑฐํ•ด claw-code ๊ณ„์—ด์ฒ˜๋Ÿผ ๋” ๋‹จ์ˆœํ•œ ์ž‘์—… ์ „ํ™˜ ๊ตฌ์กฐ๋กœ ๋งž์ท„๋‹ค. - ๋กœ์ปฌ ๋ฒ„ํŠผ์€ ์›๋ณธ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ๋ณต๊ท€, ์›ŒํฌํŠธ๋ฆฌ ๋ฒ„ํŠผ์€ ๋ถ„๋ฆฌ ์ž‘์—… ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ/์ „ํ™˜ ํŒ์—…์„ ์—ด๋„๋ก ์—ฐ๊ฒฐํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 68์ฐจ: ๋นˆ ํ™”๋ฉด ์ค‘์•™ ์ •๋ ฌ๊ณผ ํ”„๋ฆฌ์…‹ ๊ฐ„๊ฒฉ ๋ณด์ •) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:41 (KST) - Chat/Cowork/Code๊ฐ€ ๊ณต์œ ํ•˜๋Š” EmptyState์˜ ์ตœ๋Œ€ ํญ, ์ƒํ•˜ ์—ฌ๋ฐฑ, ์ œ๋ชฉ/์„ค๋ช… ๋ธ”๋ก ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•ด ์„ธ ํƒญ์˜ ๋นˆ ํ™”๋ฉด ์„ธ๋กœ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ธฐ์ค€์„ ์— ๋งž๋„๋ก ๋ณด์ •ํ–ˆ๋‹ค. - EmptyState ์„ค๋ช… ํ…์ŠคํŠธ๋Š” ๊ณ ์ • ํญ๊ณผ ์ค‘์•™ ์ •๋ ฌ์„ ์ ์šฉํ•ด ํƒญ๋ณ„ ๋ฌธ๊ตฌ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ๋„ ํ”„๋ฆฌ์…‹ ์นด๋“œ ์˜์—ญ ์‹œ์ž‘์ ์ด ํ”๋“ค๋ฆฌ์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ํ”„๋ฆฌ์…‹ ์นด๋“œ/๊ธฐํƒ€/ํ”„๋ฆฌ์…‹ ์ถ”๊ฐ€ ์นด๋“œ์˜ ํญ, ๋†’์ด, ์™ธ๊ณฝ ๋งˆ์ง„, ๋‚ด๋ถ€ ํŒจ๋”ฉ, ์•„์ด์ฝ˜ ํ•˜๋‹จ ๊ฐ„๊ฒฉ์„ ํ†ต์ผํ•ด ์ค‘์•™ ์ •๋ ฌ ๊ธฐ์ค€์—์„œ๋„ ํ–‰ ๊ฐ„๊ฒฉ์ด ๋” ๊ท ์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋‹ค๋“ฌ์—ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 69์ฐจ: ์„œ๋น„์Šค/๊ถŒํ•œ ์นด๋“œ ์„ ํƒ๊ณผ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฐ•์กฐ ๋ณด๊ฐ•) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:49 (KST) - AX Agent ์„œ๋น„์Šค ํƒญ์˜ ์‚ฌ์šฉํ•  ์„œ๋น„์Šค ์„ ํƒ์„ ๊ธฐ๋ณธ ComboBox ๋Œ€์‹  Ollama / vLLM / Gemini / Claude ์นด๋“œํ˜• ๋ผ๋””์˜ค ์„ ํƒ์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , ์„ ํƒ ์‹œ ์„œ๋น„์Šค ์„œ๋ธŒํƒญ/๋ชจ๋ธ ํŒจ๋„์ด ํ•จ๊ป˜ ๋™๊ธฐํ™”๋˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - AX Agent ๊ถŒํ•œ ํƒญ์˜ ๊ธฐ๋ณธ ํŒŒ์ผ ์ ‘๊ทผ ๊ถŒํ•œ, ์˜์‚ฌ๊ฒฐ์ • ์ˆ˜์ค€, ํ”Œ๋žœ ๋ชจ๋“œ๋„ ์นด๋“œํ˜• ๋ผ๋””์˜ค ์„ ํƒ์œผ๋กœ ์ „ํ™˜ํ•ด ์„œ๋น„์Šค ํƒญ๊ณผ ๊ฐ™์€ ์„ ํƒ ์–ธ์–ด๋กœ ํ†ต์ผํ–ˆ๋‹ค. - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒ ํŒจ๋„์€ ์ตœ๊ทผ ์›Œํฌ์ŠคํŽ˜์ด์Šค ยท N, ์ „์ฒด ์›Œํฌ์ŠคํŽ˜์ด์Šค ยท N์ฒ˜๋Ÿผ ๊ฐœ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ๋ฐ”๊พธ๊ณ , ํ˜„์žฌ ์„ ํƒ๋œ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋Š” ๊ฐ•์กฐ ๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ์™€ ํ˜„์žฌ ์„ ํƒ ์„ค๋ช…์œผ๋กœ ๋” ๋ช…ํ™•ํžˆ ๋ณด์ด๋„๋ก ๋ณด๊ฐ•ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 70์ฐจ: ๋ธŒ๋žœ์น˜ ๊ฒ€์ƒ‰ ํŒจ๋„ ๋ณด๊ฐ•) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:57 (KST) - Git ๋ธŒ๋žœ์น˜ ํŒจ๋„ ์ƒ๋‹จ์— ๊ฒ€์ƒ‰ ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•ด ๋ธŒ๋žœ์น˜ ์ˆ˜๊ฐ€ ๋งŽ์€ ์ €์žฅ์†Œ์—์„œ๋„ ์ „ํ™˜ ๋Œ€์ƒ์„ ๋ฐ”๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. - ๋ธŒ๋žœ์น˜ ํŒ์—…์„ ์—ด๋ฉด ๊ฒ€์ƒ‰์–ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ฒ€์ƒ‰ ์ž…๋ ฅ์— ํฌ์ปค์Šค๋ฅผ ์ฃผ๋„๋ก ์ •๋ฆฌํ–ˆ์œผ๋ฉฐ, ๊ฒ€์ƒ‰ ์ค‘์—๋Š” ๋ธŒ๋žœ์น˜ ์ „ํ™˜ ยท ํ‘œ์‹œ์ˆ˜/์ „์ฒด์ˆ˜ ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ๋„๋ก ๋ณด๊ฐ•ํ–ˆ๋‹ค. - ์„œ๋น„์Šค/๊ถŒํ•œ ํƒญ์˜ ์ฃผ์š” ์„ ํƒ์€ ์ด๋ฏธ ์นด๋“œํ˜• ๋ผ๋””์˜ค ์„ ํƒ์œผ๋กœ ์ „ํ™˜๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ๋ธŒ๋žœ์น˜ ํŒจ๋„๋„ ๊ฐ™์€ ๊ฒ€์ƒ‰-์„ ํƒ ํ๋ฆ„์˜ ์ปค์Šคํ…€ ํŒจ๋„ ์–ธ์–ด๋กœ ํ™•์žฅํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 71์ฐจ: AX Agent ๊ณตํ†ต ์นด๋“œ ์„ ํƒ๊ณผ ์ตœ๊ทผ ๋ธŒ๋žœ์น˜ ํ๋ฆ„ ๋ณด๊ฐ•) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:59 (KST) - AX Agent ๊ณตํ†ต ํƒญ์˜ ์šด์˜ ๋ชจ๋“œ ์„ ํƒ์„ ๊ธฐ๋ณธ ComboBox์—์„œ ์‚ฌ๋‚ด/์‚ฌ์™ธ ์นด๋“œํ˜• ์„ ํƒ์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๋’ค ์ฆ‰์‹œ ์ €์žฅ๊ณผ ํ™”๋ฉด ๋™๊ธฐํ™”๊ฐ€ ๋˜๋„๋ก ๊ฒฝ๋กœ๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค. - AX Agent ๊ณตํ†ต ๋Ÿฐํƒ€์ž„์˜ ์ตœ๋Œ€ ์ปจํ…์ŠคํŠธ ํ† ํฐ๊ณผ ๋Œ€ํ™” ๋ณด๊ด€ ๊ธฐ๊ฐ„์„ ์นด๋“œํ˜•/์นฉํ˜• ์„ ํƒ์œผ๋กœ ๋ฐ”๊ฟ” ์„œ๋น„์Šค/๊ถŒํ•œ/๊ณ ๊ธ‰ ํƒญ๊ณผ ๊ฐ™์€ ์„ ํƒ UI ์–ธ์–ด๋กœ ํ†ต์ผํ–ˆ๋‹ค. - AX Agent ๊ณ ๊ธ‰ ํƒญ์˜ ์‹คํ–‰ ์ด๋ ฅ ์ƒ์„ธ๋„๋„ ๊ฐ„๋žต/์ƒ์„ธ/๋””๋ฒ„๊ทธ ์นด๋“œํ˜• ์„ ํƒ์œผ๋กœ ์ „ํ™˜ํ•ด ๋‚จ์•„ ์žˆ๋˜ ๊ธฐ๋ณธ ComboBox ํ”์ ์„ ์ค„์˜€๋‹ค. - Git ๋ธŒ๋žœ์น˜ ํŒจ๋„์—๋Š” ์ตœ๊ทผ ์ „ํ™˜ ๋ธŒ๋žœ์น˜ ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด ์ž์ฃผ ์˜ค๊ฐ€๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๊ฒ€์ƒ‰ ์ „์— ์šฐ์„  ๋…ธ์ถœํ•˜๋„๋ก ๋ณด๊ฐ•ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-05 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 72์ฐจ: DraftQueue ๊ธฐ๋ณธ ์ „์†ก ์Šน๊ฒฉ๊ณผ ์ž‘์—… ์œ„์น˜ ํŒจ๋„ ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-05 00:10 (KST) - Enter ์ž…๋ ฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ DraftQueue์— ์ถ”๊ฐ€๋˜๊ณ , Ctrl+Enter์™€ ์ „์†ก ๋ฒ„ํŠผ๋„ ๊ฐ™์€ ๋Œ€๊ธฐ์—ด ๊ฒฝ๋กœ๋ฅผ ํƒ€๋„๋ก ์ •๋ฆฌํ•ด ์ „์†ก ํ๋ฆ„์ด ์ฆ‰์‹œ ์‹คํ–‰๊ณผ ๋Œ€๊ธฐ์—ด ์‹คํ–‰์œผ๋กœ ๊ฐˆ๋ผ์ง€์ง€ ์•Š๊ฒŒ ๋งž์ท„๋‹ค. - ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์ „์†ก, ์žฌ์‹คํ–‰, ๋“œ๋ž˜๊ทธ๋“œ๋กญ ์ž๋™ ์ „์†ก, ํ›„์† ์ž‘์—… ์ƒ์„ฑ๋„ ๊ฐ™์€ ํ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ฆฌํ•ด ๋Œ€ํ™” ์‹คํ–‰ ์ง„์ž…์ ์ด ํ•˜๋‚˜์˜ ๊ตฌ์กฐ๋กœ ๋ชจ์ด๊ฒŒ ํ–ˆ๋‹ค. - DraftQueueItem์— kind(message/command/direct/followup/steering)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์นด๋“œ ํ—ค๋”์— ์ƒํƒœยท์šฐ์„ ์ˆœ์œ„ยท์ข…๋ฅ˜๊ฐ€ ํ•จ๊ป˜ ๋ณด์ด๋„๋ก ๋ณด๊ฐ•ํ–ˆ๋‹ค. - Code ํƒญ ์ž‘์—… ์œ„์น˜ ํŒจ๋„์€ ํ˜„์žฌ ์ž‘์—… ์œ„์น˜ / ์›ŒํฌํŠธ๋ฆฌยท๋ณต์‚ฌ๋ณธ / ์ƒˆ ์ž‘์—… ์œ„์น˜ ์„น์…˜์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•ด ๋ธŒ๋žœ์น˜/์›Œํฌ์ŠคํŽ˜์ด์Šค ํŒจ๋„๊ณผ ๊ฐ™์€ ์„ค๋ช…ํ˜• row ์–ธ์–ด๋กœ ํ†ต์ผํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-05 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 73์ฐจ: ํ ์นด๋“œยทcomposerยท์ž‘์—… ์œ„์น˜ ํŒจ๋„ ์‹œ๊ฐ ์–ธ์–ด ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-05 00:28 (KST) - DraftQueue ํŒจ๋„์„ ์‹คํ–‰ ๋Œ€๊ธฐ / ์ตœ๊ทผ ๊ฒฐ๊ณผ ์„น์…˜ํ˜•์œผ๋กœ ๋‹ค์‹œ ๋ฌถ๊ณ , ๊ฐ ์นด๋“œ ํ—ค๋”์— ์ข…๋ฅ˜ยท์ƒํƒœยท์šฐ์„ ์ˆœ์œ„ ๋ฐฐ์ง€๋ฅผ ๋„ฃ์–ด ํ ์ƒํƒœ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ •๋ฆฌํ–ˆ๋‹ค. - ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ ํƒ ํŒจ๋„์€ ๊ธฐ์กด ๋…๋ฆฝ ์นด๋“œํ˜• ํ–‰์„ ๊ณตํ†ต Popup row ์ƒ์„ฑ ๊ทœ์น™์œผ๋กœ ๋งž์ถฐ ๋ธŒ๋žœ์น˜/์›ŒํฌํŠธ๋ฆฌ/์›Œํฌ์ŠคํŽ˜์ด์Šค๊ฐ€ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ ๋ฌธ๋ฒ•์œผ๋กœ ๋ณด์ด๋„๋ก ํ†ต์ผํ–ˆ๋‹ค. - composer ์˜์—ญ์€ ์ตœ๋Œ€ ํญ์„ ๋„“ํžˆ๊ณ , ํ•˜๋‹จ FolderBar ์™ธ๊ณฝ ๋ฐ•์Šค๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ๋กœ์ปฌ/์›ŒํฌํŠธ๋ฆฌ/๋ฐ์ดํ„ฐ/๊ถŒํ•œ/Git ๋ฒ„ํŠผ์„ ์นฉํ˜• ๋ฆฌ๋“ฌ์œผ๋กœ ์ •๋ฆฌํ•ด claw-code ๊ณ„์—ด์ฒ˜๋Ÿผ ๋” ๊ฐ€๋ณ๊ฒŒ ๋ณด์ด๋„๋ก ์กฐ์ •ํ–ˆ๋‹ค. - ๋ชจ๋ธ ํ‘œ์‹œ ๋ฌธ๊ตฌ๋Š” `์„œ๋น„์Šค ... ยท ๋ชจ๋ธ ...` ํ˜•์‹์—์„œ `์„œ๋น„์Šค ยท ๋ชจ๋ธ๋ช…` ํ˜•์‹์œผ๋กœ ์ค„์—ฌ ํ•˜๋‹จ ๋น ๋ฅธ ์„ ํƒ ๋ผ๋ฒจ์ด ๋” ์งง๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณด์ด๋„๋ก ๋งž์ท„๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-05 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 74์ฐจ: ํ ์ƒํƒœ ์š”์•ฝ ๊ฐ•ํ™”์™€ gitignore ์ •๋ฆฌ) - ์—…๋ฐ์ดํŠธ: 2026-04-05 00:38 (KST) - DraftQueue ํŒจ๋„ ์ƒ๋‹จ์— ์‹คํ–‰ ์ค‘ / ๋‹ค์Œ / ๋ณด๋ฅ˜ / ์™„๋ฃŒ / ์‹คํŒจ ์ƒํƒœ ์š”์•ฝ pill์„ ์ถ”๊ฐ€ํ•ด ํ˜„์žฌ ๋Œ€๊ธฐ์—ด ์ƒํƒœ๋ฅผ ์นด๋“œ ๋ชฉ๋ก์„ ์ฝ๊ธฐ ์ „์— ๋จผ์ € ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. - composer ์ƒ๋‹จ์˜ ๋ชจ๋ธ/์ปจํ…์ŠคํŠธ/ํ”„๋ฆฌ์…‹ ์ค„์€ ๋ฒ„ํŠผ ๋†’์ด์™€ ํŒจ๋”ฉ์„ ๋” ๋‚ฎ์ถ”๊ณ  ํ† ํฐ ์นด๋“œ ๋ฐ€๋„๋„ ์ค„์—ฌ Codexยทclaude-code ๊ณ„์—ด์ฒ˜๋Ÿผ ๋” ํ‰ํ‰ํ•œ ๋ฆฌ๋“ฌ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. - ๋ธŒ๋žœ์น˜/์›ŒํฌํŠธ๋ฆฌ ํŒจ๋„์—๋Š” ๊ณตํ†ต ์š”์•ฝ strip์„ ์ถ”๊ฐ€ํ•ด ํ˜„์žฌ ๋ธŒ๋žœ์น˜, ํŒŒ์ผ ์ƒํƒœ, ์ตœ๊ทผ ๋ธŒ๋žœ์น˜ ์ˆ˜, ๋กœ์ปฌ/์›ŒํฌํŠธ๋ฆฌ ๋ชจ๋“œ, ๋ณ€ํ˜• ๊ฐœ์ˆ˜๋ฅผ ๊ฐ™์€ ์‹œ๊ฐ ์–ธ์–ด๋กœ ๋ณด์—ฌ์ฃผ๋„๋ก ๋งž์ท„๋‹ค. - ์ €์žฅ์†Œ ๋ฃจํŠธ `.gitignore`์—๋Š” ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ(bin/obj/publish), IDE ํŒŒ์ผ(.vs, *.user, *.suo), ์šด์˜์ฒด์ œ ์žกํŒŒ์ผ(Thumbs.db, Desktop.ini, .DS_Store), ๋น„๋ฐ€์ •๋ณด ํŒจํ„ด(*.env, credentials.json)์„ ์ถ”๊ฐ€ํ•ด ๋ถˆํ•„์š”ํ•œ ์ถ”์ ์„ ์ค„์˜€๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 75์ฐจ: ํŠธ๋ ˆ์ด ์ง„์ž… ํ๋ฆ„๊ณผ ์„ค์ • fan-out ๋ณด๊ฐ•) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:14 (KST) - ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ์ƒ๋‹จ์— ํ˜„์žฌ ์•ฑ ๋ฒ„์ „์„ `AX Copilot v.0.7.3` ํ˜•์‹์˜ ํ—ค๋”๋กœ ํ‘œ๊ธฐํ•ด ์šฐํด๋ฆญ ์‹œ ์ œํ’ˆ ๋ฒ„์ „์„ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. - ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜ ์ขŒํด๋ฆญ ๋™์ž‘์€ AI ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ์‹œ AX Agent ์ฐฝ์„ ์šฐ์„  ์—ด๊ณ , AI ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ AX Commander๋ฅผ ์—ด๋„๋ก ๋ฐ”๊ฟ” ์‚ฌ์šฉ ํ๋ฆ„์„ AX Agent ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. - ๋ฉ”์ธ ์„ค์ • ์ €์žฅ ์™„๋ฃŒ ์‹œ ์—ด๋ ค ์žˆ๋Š” AX Agent ์ฐฝ์ด ์ฆ‰์‹œ ํ…Œ๋งˆ, ๋ชจ๋ธ, ๊ถŒํ•œ, ๋ฐ์ดํ„ฐ ํ™œ์šฉ, overlay/inline ๋น ๋ฅธ ์„ค์ •, ํ•˜๋‹จ composer ๋ผ๋ฒจ์„ ๋‹ค์‹œ ์ฝ์–ด์˜ค๋„๋ก `RefreshFromSavedSettings()` fan-out ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. - DraftQueue kind ํŒ์ •์€ ์ผ๋ฐ˜ ์ž…๋ ฅ(message), ์Šฌ๋ž˜์‹œ ๋ช…๋ น(command), ์กฐ์ • ์ž…๋ ฅ(steering), ์ง์ ‘ ์‹คํ–‰ ์š”์ฒญ(direct), ํ›„์† ์ž‘์—…(followup)์ด ์‹ค์ œ ์ž…๋ ฅ ํ˜•ํƒœ์™€ ๋” ์ผ์น˜ํ•˜๋„๋ก ๋ณด๊ฐ•ํ–ˆ๊ณ , ์ „์†ก ๋ฒ„ํŠผ์€ ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 76์ฐจ: ์„ค์ • ์ด๋ฒคํŠธ fan-out ํ†ตํ•ฉ๊ณผ ํ ์ƒํƒœ ์„น์…˜ ์žฌ๊ตฌ์„ฑ) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:23 (KST) - AX Agent ์ฐฝ์ด `SettingsService.SettingsChanged`๋ฅผ ์ง์ ‘ ๊ตฌ๋…ํ•˜๋„๋ก ์—ฐ๊ฒฐํ•ด ๋ฉ”์ธ ์„ค์ •, AX Agent ์„ค์ •, ์ €์žฅ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ๋„ ํ…Œ๋งˆ/๊ถŒํ•œ/๋ฐ์ดํ„ฐ ํ™œ์šฉ/๋ชจ๋ธ ๋ผ๋ฒจ/ํ•˜๋‹จ composer/๋Œ€๊ธฐ์—ด UI๊ฐ€ ์ฆ‰์‹œ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก fan-out ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ฉํ–ˆ๋‹ค. - `RefreshFromSavedSettings()`๋Š” ๊ธฐ์กด ์‹œ๊ฐ ์š”์†Œ ๊ฐฑ์‹  ์™ธ์—๋„ ๋Œ€๊ธฐ์—ด ํŒจ๋„๊ณผ ๋Œ€ํ™” ๋ชฉ๋ก๊นŒ์ง€ ๋‹ค์‹œ ์ฝ์–ด์˜ค๋„๋ก ํ™•์žฅํ•ด ์ €์žฅ ํ›„ AX Agent ํ™”๋ฉด๊ณผ ์‹ค์ œ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋งž์ถฐ์ง€๋„๋ก ๋ณด๊ฐ•ํ–ˆ๋‹ค. - AX Agent ์„ค์ • ์ €์žฅ ๊ฒฝ๋กœ์™€ ๊ตฌํ˜• Agent ์„ค์ •์ฐฝ์—์„œ ํ‘œํ˜„ ์ˆ˜์ค€์„ ๋ฌด์กฐ๊ฑด `rich`๋กœ ๋ฎ์–ด์“ฐ๋˜ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ `ํ’๋ถ€ํ•˜๊ฒŒ / ์ ์ ˆํ•˜๊ฒŒ / ๊ฐ„๋‹จํ•˜๊ฒŒ` ๊ฐ’์ด ๋‹ค๋ฅธ ์„ค์ • ํ๋ฆ„์—์„œ๋„ ์œ ์ง€๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค. - DraftQueue ํŒจ๋„์€ ๊ธฐ์กด `์‹คํ–‰ ๋Œ€๊ธฐ / ์ตœ๊ทผ ๊ฒฐ๊ณผ` ๋ฌถ์Œ์—์„œ `์‹คํ–‰ ์ค‘ / ๋‹ค์Œ ์ž‘์—… / ๋ณด๋ฅ˜ / ์™„๋ฃŒ / ์‹คํŒจ` ๊ฐœ๋ณ„ ์„น์…˜ ๊ตฌ์กฐ๋กœ ์žฌํŽธํ•ด queue state๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋„ ํ˜„์žฌ ์ง„ํ–‰, ๋‹ค์Œ ์‹คํ–‰, ์žฌ์‹œ๋„ ๋Œ€๊ธฐ, ์™„๋ฃŒ/์‹คํŒจ ์ด๋ ฅ์„ ๋” ๋น ๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0) ### 2026-04-04 ์ถ”๊ฐ€ ์ง„ํ–‰ ๊ธฐ๋ก (์—ฐ์† ์‹คํ–‰ 77์ฐจ: compact ๊ฒฐ๊ณผ ์žฌ๋…ธ์ถœ๊ณผ ์••์ถ• ๋น„๊ต ์ค€๋น„) - ์—…๋ฐ์ดํŠธ: 2026-04-04 23:28 (KST) - AX Agent ํ•˜๋‹จ ์ปจํ…์ŠคํŠธ ์นด๋“œ์˜ ํˆดํŒ์— ์ตœ๊ทผ compact ์ด๋ ฅ์„ ์ถ”๊ฐ€ํ•ด ๋งˆ์ง€๋ง‰ ์ž๋™/์ˆ˜๋™ ์••์ถ• ์‹œ๊ฐ, ์••์ถ• ์ „ํ›„ ํ† ํฐ ์ˆ˜, ์ ˆ๊ฐ๋Ÿ‰์„ ์ดํ›„์—๋„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณด๊ฐ•ํ–ˆ๋‹ค. - ์ˆ˜๋™ `/compact`์™€ ์ „์†ก ์ „ ์ž๋™ ์ปจํ…์ŠคํŠธ ์••์ถ•์ด ๋ชจ๋‘ ๊ฐ™์€ `RecordCompactionStats(...)` ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งž์ถฐ, ์••์ถ• ๊ฒฐ๊ณผ๊ฐ€ ์ผํšŒ์„ฑ ์ƒํƒœ ๋ฉ”์‹œ์ง€์—๋งŒ ๋จธ๋ฌผ์ง€ ์•Š๊ณ  UI์—์„œ ์žฌ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ •๋ฆฌํ–ˆ๋‹ค. - ์ด๋ฒˆ ๋ผ์šด๋“œ๋ถ€ํ„ฐ `claude-code`์˜ compact ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ `session memory compaction โ†’ microcompact โ†’ context collapse/snip โ†’ autocompact โ†’ post-compaction ๊ณ„์ธก` ํ๋ฆ„์„ AX ๊ธฐ์ค€๊ณผ ๋น„๊ต ๋ถ„์„ํ•  ์ค€๋น„๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. - ๊ฒ€์ฆ: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\ (๊ฒฝ๊ณ  0 / ์˜ค๋ฅ˜ 0)