micro-models-agent 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +436 -436
- package/dist/agent/loop.d.ts +5 -5
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +421 -246
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +3 -3
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +383 -278
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/cli/config.d.ts +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +53 -28
- package/dist/cli/config.js.map +1 -1
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +75 -54
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +3 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/plugins/builtin/lint-on-write/index.ts +96 -96
- package/dist/plugins/builtin/notify/index.js +6 -6
- package/dist/plugins/builtin/notify/index.ts +104 -104
- package/dist/setup-wizard.d.ts +1 -1
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +137 -105
- package/dist/setup-wizard.js.map +1 -1
- package/dist/skills/builtin/agent-test/SKILL.md +68 -68
- package/dist/skills/builtin/grill-me/SKILL.md +46 -46
- package/dist/skills/builtin/web-scraping/SKILL.md +422 -422
- package/dist/tools/native/project-map.d.ts +2 -2
- package/dist/tools/native/project-map.d.ts.map +1 -1
- package/dist/tools/native/project-map.js +85 -57
- package/dist/tools/native/project-map.js.map +1 -1
- package/dist/tools/native/scaffold.js +113 -113
- package/dist/tools/web-browse.js +7 -7
- package/dist/ui/ink/components/App.d.ts +0 -1
- package/dist/ui/ink/components/App.d.ts.map +1 -1
- package/dist/ui/ink/components/App.js +2 -8
- package/dist/ui/ink/components/App.js.map +1 -1
- package/dist/ui/ink/components/Conversation.d.ts +1 -2
- package/dist/ui/ink/components/Conversation.d.ts.map +1 -1
- package/dist/ui/ink/components/Conversation.js +8 -2
- package/dist/ui/ink/components/Conversation.js.map +1 -1
- package/dist/ui/ink/components/MessageBlock.d.ts +13 -1
- package/dist/ui/ink/components/MessageBlock.d.ts.map +1 -1
- package/dist/ui/ink/components/MessageBlock.js +15 -27
- package/dist/ui/ink/components/MessageBlock.js.map +1 -1
- package/dist/ui/ink/components/PromptInput.d.ts +11 -0
- package/dist/ui/ink/components/PromptInput.d.ts.map +1 -1
- package/dist/ui/ink/components/PromptInput.js +18 -141
- package/dist/ui/ink/components/PromptInput.js.map +1 -1
- package/dist/ui/ink/components/SelectInput.d.ts.map +1 -1
- package/dist/ui/ink/components/SelectInput.js +3 -2
- package/dist/ui/ink/components/SelectInput.js.map +1 -1
- package/dist/ui/ink/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/ink/components/StatusBar.js +14 -6
- package/dist/ui/ink/components/StatusBar.js.map +1 -1
- package/dist/ui/ink/components/StreamBlock.d.ts.map +1 -1
- package/dist/ui/ink/components/StreamBlock.js +3 -3
- package/dist/ui/ink/components/StreamBlock.js.map +1 -1
- package/dist/ui/ink/components/Tags.d.ts +8 -11
- package/dist/ui/ink/components/Tags.d.ts.map +1 -1
- package/dist/ui/ink/components/Tags.js +4 -16
- package/dist/ui/ink/components/Tags.js.map +1 -1
- package/dist/ui/ink/components/ToolCallBlock.d.ts +12 -0
- package/dist/ui/ink/components/ToolCallBlock.d.ts.map +1 -1
- package/dist/ui/ink/components/ToolCallBlock.js +8 -24
- package/dist/ui/ink/components/ToolCallBlock.js.map +1 -1
- package/dist/ui/ink/renderer.d.ts +0 -1
- package/dist/ui/ink/renderer.d.ts.map +1 -1
- package/dist/ui/ink/renderer.js +1 -4
- package/dist/ui/ink/renderer.js.map +1 -1
- package/package.json +47 -47
- package/dist/async-map.d.ts +0 -6
- package/dist/async-map.d.ts.map +0 -1
- package/dist/async-map.js +0 -16
- package/dist/async-map.js.map +0 -1
- package/dist/blog-api/types/index.d.ts +0 -2
- package/dist/blog-api/types/index.d.ts.map +0 -1
- package/dist/blog-api/types/index.js +0 -2
- package/dist/blog-api/types/index.js.map +0 -1
- package/dist/examples.d.ts +0 -22
- package/dist/examples.d.ts.map +0 -1
- package/dist/examples.js +0 -45
- package/dist/examples.js.map +0 -1
- package/dist/fibonacci.d.ts +0 -19
- package/dist/fibonacci.d.ts.map +0 -1
- package/dist/fibonacci.js +0 -61
- package/dist/fibonacci.js.map +0 -1
- package/dist/parfymerie-landing/src/App.d.ts +0 -4
- package/dist/parfymerie-landing/src/App.d.ts.map +0 -1
- package/dist/parfymerie-landing/src/App.js +0 -12
- package/dist/parfymerie-landing/src/App.js.map +0 -1
- package/dist/parfymerie-landing/src/main.d.ts +0 -2
- package/dist/parfymerie-landing/src/main.d.ts.map +0 -1
- package/dist/parfymerie-landing/src/main.js +0 -7
- package/dist/parfymerie-landing/src/main.js.map +0 -1
- package/dist/parfymerie-landing/vite.config.d.ts +0 -3
- package/dist/parfymerie-landing/vite.config.d.ts.map +0 -1
- package/dist/parfymerie-landing/vite.config.js +0 -7
- package/dist/parfymerie-landing/vite.config.js.map +0 -1
- package/dist/repl.d.ts +0 -5
- package/dist/repl.d.ts.map +0 -1
- package/dist/repl.js +0 -472
- package/dist/repl.js.map +0 -1
- package/dist/sort.d.ts +0 -8
- package/dist/sort.d.ts.map +0 -1
- package/dist/sort.js +0 -36
- package/dist/sort.js.map +0 -1
- package/dist/stack.d.ts +0 -9
- package/dist/stack.d.ts.map +0 -1
- package/dist/stack.js +0 -22
- package/dist/stack.js.map +0 -1
- package/dist/test-run.d.ts +0 -2
- package/dist/test-run.d.ts.map +0 -1
- package/dist/test-run.js +0 -13
- package/dist/test-run.js.map +0 -1
- package/dist/ui/components/diff-view.d.ts +0 -8
- package/dist/ui/components/diff-view.d.ts.map +0 -1
- package/dist/ui/components/diff-view.js +0 -25
- package/dist/ui/components/diff-view.js.map +0 -1
- package/dist/ui/double-press.d.ts +0 -9
- package/dist/ui/double-press.d.ts.map +0 -1
- package/dist/ui/double-press.js +0 -18
- package/dist/ui/double-press.js.map +0 -1
- package/dist/ui/ink/components/ActivityLog.d.ts +0 -12
- package/dist/ui/ink/components/ActivityLog.d.ts.map +0 -1
- package/dist/ui/ink/components/ActivityLog.js +0 -11
- package/dist/ui/ink/components/ActivityLog.js.map +0 -1
- package/dist/ui/ink/components/AgentStatus.d.ts +0 -13
- package/dist/ui/ink/components/AgentStatus.d.ts.map +0 -1
- package/dist/ui/ink/components/AgentStatus.js +0 -20
- package/dist/ui/ink/components/AgentStatus.js.map +0 -1
- package/dist/ui/ink/components/BottomBar.d.ts +0 -12
- package/dist/ui/ink/components/BottomBar.d.ts.map +0 -1
- package/dist/ui/ink/components/BottomBar.js +0 -22
- package/dist/ui/ink/components/BottomBar.js.map +0 -1
- package/dist/ui/ink/components/CheckboxInput.d.ts +0 -21
- package/dist/ui/ink/components/CheckboxInput.d.ts.map +0 -1
- package/dist/ui/ink/components/CheckboxInput.js +0 -36
- package/dist/ui/ink/components/CheckboxInput.js.map +0 -1
- package/dist/ui/ink/components/InputBox.d.ts +0 -25
- package/dist/ui/ink/components/InputBox.d.ts.map +0 -1
- package/dist/ui/ink/components/InputBox.js +0 -91
- package/dist/ui/ink/components/InputBox.js.map +0 -1
- package/dist/ui/ink/components/ModeSelector.d.ts +0 -8
- package/dist/ui/ink/components/ModeSelector.d.ts.map +0 -1
- package/dist/ui/ink/components/ModeSelector.js +0 -13
- package/dist/ui/ink/components/ModeSelector.js.map +0 -1
- package/dist/ui/ink/components/QuestionBox.d.ts +0 -14
- package/dist/ui/ink/components/QuestionBox.d.ts.map +0 -1
- package/dist/ui/ink/components/QuestionBox.js +0 -35
- package/dist/ui/ink/components/QuestionBox.js.map +0 -1
- package/dist/ui/ink/components/RadioInput.d.ts +0 -17
- package/dist/ui/ink/components/RadioInput.d.ts.map +0 -1
- package/dist/ui/ink/components/RadioInput.js +0 -30
- package/dist/ui/ink/components/RadioInput.js.map +0 -1
- package/dist/ui/ink/components/SliderInput.d.ts +0 -20
- package/dist/ui/ink/components/SliderInput.d.ts.map +0 -1
- package/dist/ui/ink/components/SliderInput.js +0 -40
- package/dist/ui/ink/components/SliderInput.js.map +0 -1
- package/dist/ui/ink/components/StartupScreen.d.ts +0 -19
- package/dist/ui/ink/components/StartupScreen.d.ts.map +0 -1
- package/dist/ui/ink/components/StartupScreen.js +0 -9
- package/dist/ui/ink/components/StartupScreen.js.map +0 -1
- package/dist/ui/ink/components/WelcomeScreen.d.ts +0 -10
- package/dist/ui/ink/components/WelcomeScreen.d.ts.map +0 -1
- package/dist/ui/ink/components/WelcomeScreen.js +0 -8
- package/dist/ui/ink/components/WelcomeScreen.js.map +0 -1
- package/dist/ui/ink/components/Window.d.ts +0 -30
- package/dist/ui/ink/components/Window.d.ts.map +0 -1
- package/dist/ui/ink/components/Window.js +0 -9
- package/dist/ui/ink/components/Window.js.map +0 -1
- package/dist/ui/ink/components/ui/_core.d.ts +0 -113
- package/dist/ui/ink/components/ui/_core.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/_core.js +0 -83
- package/dist/ui/ink/components/ui/_core.js.map +0 -1
- package/dist/ui/ink/components/ui/autocomplete/Autocomplete.d.ts +0 -23
- package/dist/ui/ink/components/ui/autocomplete/Autocomplete.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/autocomplete/Autocomplete.js +0 -56
- package/dist/ui/ink/components/ui/autocomplete/Autocomplete.js.map +0 -1
- package/dist/ui/ink/components/ui/autocomplete/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/autocomplete/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/autocomplete/index.js +0 -2
- package/dist/ui/ink/components/ui/autocomplete/index.js.map +0 -1
- package/dist/ui/ink/components/ui/badge/Badge.d.ts +0 -13
- package/dist/ui/ink/components/ui/badge/Badge.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/badge/Badge.js +0 -17
- package/dist/ui/ink/components/ui/badge/Badge.js.map +0 -1
- package/dist/ui/ink/components/ui/badge/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/badge/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/badge/index.js +0 -2
- package/dist/ui/ink/components/ui/badge/index.js.map +0 -1
- package/dist/ui/ink/components/ui/divider/Divider.d.ts +0 -12
- package/dist/ui/ink/components/ui/divider/Divider.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/divider/Divider.js +0 -27
- package/dist/ui/ink/components/ui/divider/Divider.js.map +0 -1
- package/dist/ui/ink/components/ui/divider/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/divider/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/divider/index.js +0 -2
- package/dist/ui/ink/components/ui/divider/index.js.map +0 -1
- package/dist/ui/ink/components/ui/header/Header.d.ts +0 -13
- package/dist/ui/ink/components/ui/header/Header.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/header/Header.js +0 -33
- package/dist/ui/ink/components/ui/header/Header.js.map +0 -1
- package/dist/ui/ink/components/ui/header/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/header/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/header/index.js +0 -2
- package/dist/ui/ink/components/ui/header/index.js.map +0 -1
- package/dist/ui/ink/components/ui/json-viewer/JSONViewer.d.ts +0 -14
- package/dist/ui/ink/components/ui/json-viewer/JSONViewer.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/json-viewer/JSONViewer.js +0 -144
- package/dist/ui/ink/components/ui/json-viewer/JSONViewer.js.map +0 -1
- package/dist/ui/ink/components/ui/json-viewer/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/json-viewer/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/json-viewer/index.js +0 -2
- package/dist/ui/ink/components/ui/json-viewer/index.js.map +0 -1
- package/dist/ui/ink/components/ui/key-hint/KeyHint.d.ts +0 -14
- package/dist/ui/ink/components/ui/key-hint/KeyHint.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/key-hint/KeyHint.js +0 -5
- package/dist/ui/ink/components/ui/key-hint/KeyHint.js.map +0 -1
- package/dist/ui/ink/components/ui/key-hint/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/key-hint/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/key-hint/index.js +0 -2
- package/dist/ui/ink/components/ui/key-hint/index.js.map +0 -1
- package/dist/ui/ink/components/ui/markdown/Markdown.d.ts +0 -11
- package/dist/ui/ink/components/ui/markdown/Markdown.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/markdown/Markdown.js +0 -129
- package/dist/ui/ink/components/ui/markdown/Markdown.js.map +0 -1
- package/dist/ui/ink/components/ui/markdown/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/markdown/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/markdown/index.js +0 -2
- package/dist/ui/ink/components/ui/markdown/index.js.map +0 -1
- package/dist/ui/ink/components/ui/scroll-area/ScrollArea.d.ts +0 -21
- package/dist/ui/ink/components/ui/scroll-area/ScrollArea.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/scroll-area/ScrollArea.js +0 -42
- package/dist/ui/ink/components/ui/scroll-area/ScrollArea.js.map +0 -1
- package/dist/ui/ink/components/ui/scroll-area/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/scroll-area/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/scroll-area/index.js +0 -2
- package/dist/ui/ink/components/ui/scroll-area/index.js.map +0 -1
- package/dist/ui/ink/components/ui/select/Select.d.ts +0 -19
- package/dist/ui/ink/components/ui/select/Select.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/select/Select.js +0 -73
- package/dist/ui/ink/components/ui/select/Select.js.map +0 -1
- package/dist/ui/ink/components/ui/select/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/select/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/select/index.js +0 -2
- package/dist/ui/ink/components/ui/select/index.js.map +0 -1
- package/dist/ui/ink/components/ui/spinner/Spinner.d.ts +0 -14
- package/dist/ui/ink/components/ui/spinner/Spinner.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/spinner/Spinner.js +0 -16
- package/dist/ui/ink/components/ui/spinner/Spinner.js.map +0 -1
- package/dist/ui/ink/components/ui/spinner/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/spinner/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/spinner/index.js +0 -2
- package/dist/ui/ink/components/ui/spinner/index.js.map +0 -1
- package/dist/ui/ink/components/ui/status-indicator/StatusIndicator.d.ts +0 -12
- package/dist/ui/ink/components/ui/status-indicator/StatusIndicator.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/status-indicator/StatusIndicator.js +0 -39
- package/dist/ui/ink/components/ui/status-indicator/StatusIndicator.js.map +0 -1
- package/dist/ui/ink/components/ui/status-indicator/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/status-indicator/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/status-indicator/index.js +0 -2
- package/dist/ui/ink/components/ui/status-indicator/index.js.map +0 -1
- package/dist/ui/ink/components/ui/streaming-text/StreamingText.d.ts +0 -13
- package/dist/ui/ink/components/ui/streaming-text/StreamingText.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/streaming-text/StreamingText.js +0 -22
- package/dist/ui/ink/components/ui/streaming-text/StreamingText.js.map +0 -1
- package/dist/ui/ink/components/ui/streaming-text/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/streaming-text/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/streaming-text/index.js +0 -2
- package/dist/ui/ink/components/ui/streaming-text/index.js.map +0 -1
- package/dist/ui/ink/components/ui/tabs/Tabs.d.ts +0 -20
- package/dist/ui/ink/components/ui/tabs/Tabs.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/tabs/Tabs.js +0 -53
- package/dist/ui/ink/components/ui/tabs/Tabs.js.map +0 -1
- package/dist/ui/ink/components/ui/tabs/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/tabs/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/tabs/index.js +0 -2
- package/dist/ui/ink/components/ui/tabs/index.js.map +0 -1
- package/dist/ui/ink/components/ui/text-input/TextInput.d.ts +0 -22
- package/dist/ui/ink/components/ui/text-input/TextInput.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/text-input/TextInput.js +0 -57
- package/dist/ui/ink/components/ui/text-input/TextInput.js.map +0 -1
- package/dist/ui/ink/components/ui/text-input/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/text-input/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/text-input/index.js +0 -2
- package/dist/ui/ink/components/ui/text-input/index.js.map +0 -1
- package/dist/ui/ink/components/ui/token-counter/TokenCounter.d.ts +0 -17
- package/dist/ui/ink/components/ui/token-counter/TokenCounter.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/token-counter/TokenCounter.js +0 -38
- package/dist/ui/ink/components/ui/token-counter/TokenCounter.js.map +0 -1
- package/dist/ui/ink/components/ui/token-counter/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/token-counter/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/token-counter/index.js +0 -2
- package/dist/ui/ink/components/ui/token-counter/index.js.map +0 -1
- package/dist/ui/ink/components/ui/typewriter/Typewriter.d.ts +0 -14
- package/dist/ui/ink/components/ui/typewriter/Typewriter.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/typewriter/Typewriter.js +0 -57
- package/dist/ui/ink/components/ui/typewriter/Typewriter.js.map +0 -1
- package/dist/ui/ink/components/ui/typewriter/index.d.ts +0 -3
- package/dist/ui/ink/components/ui/typewriter/index.d.ts.map +0 -1
- package/dist/ui/ink/components/ui/typewriter/index.js +0 -2
- package/dist/ui/ink/components/ui/typewriter/index.js.map +0 -1
- package/dist/ui/opentui-renderer.d.ts +0 -53
- package/dist/ui/opentui-renderer.d.ts.map +0 -1
- package/dist/ui/opentui-renderer.js +0 -463
- package/dist/ui/opentui-renderer.js.map +0 -1
- package/dist/utils/memoize.d.ts +0 -14
- package/dist/utils/memoize.d.ts.map +0 -1
- package/dist/utils/memoize.js +0 -51
- package/dist/utils/memoize.js.map +0 -1
- package/dist/utils/types.d.ts +0 -6
- package/dist/utils/types.d.ts.map +0 -1
- package/dist/utils/types.js +0 -2
- package/dist/utils/types.js.map +0 -1
- package/dist/utils.d.ts +0 -22
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -81
- package/dist/utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,436 +1,436 @@
|
|
|
1
|
-
# MMA — Micro Models Agent
|
|
2
|
-
|
|
3
|
-
LLM-агент, который работает на маленьких моделях (Qwen3.5-9B, 32K-64K контекст). Пишет код, редактирует файлы, ищет баги, выполняет bash-команды, читает документацию — и всё это на моделях, которые запускаются на обычном ноутбуке без GPU.
|
|
4
|
-
|
|
5
|
-
**Чем MMA отличается от больших агентов (OpenCode, Claude Code, Cursor):**
|
|
6
|
-
|
|
7
|
-
- **Лёгкий**: не требует GPT-4 или Claude Sonnet. Работает на Qwen3.5-9B, DeepSeek-Coder и других opensource-моделях. Всё локально.
|
|
8
|
-
- **ReAct-цикл**: модель сама планирует и вызывает инструменты через `<tool_call>` — читает/пишет/редактирует файлы, ищет по проекту, выполняет bash.
|
|
9
|
-
- **Навыки (Skills)**: подгружаемые markdown-инструкции для специализированных задач (Docker, CSS, auth, и т.д.).
|
|
10
|
-
- **Индексация кода**: AST-индекс символов + карта проекта (project map) для навигации по любой кодовой базе.
|
|
11
|
-
- **Память**: долговременная память агента — запоминает факты между сессиями.
|
|
12
|
-
- **Веб-поиск**: может искать информацию в интернете.
|
|
13
|
-
- **Браузер**: интерактивный headless-браузер (Playwright) — навигация, клики, ввод текста, скриншоты, извлечение данных со страниц.
|
|
14
|
-
- **Плагины**: мощная система плагинов на lifecycle events. [PLUGINS.md](./PLUGINS.md)
|
|
15
|
-
- **Планирование**: создаёт и утверждает планы через PLAN.md перед выполнением.
|
|
16
|
-
- **Сессии**: сохранение, восстановление, список сессий.
|
|
17
|
-
- **MCP интеграция**: поддержка Model Context Protocol для внешних инструментов.
|
|
18
|
-
- **Вопросы пользователю**: может уточнять детали задачи, запрашивать одобрение.
|
|
19
|
-
- **Синтаксис @file**: загрузка файлов/директорий прямо в промпт.
|
|
20
|
-
- **Стилизация**: сменные темы оформления.
|
|
21
|
-
- **Мастер первого запуска**: интерактивная настройка провайдера и модели.
|
|
22
|
-
- **12 файловых инструментов**: read, write, edit, list, create, delete, copy, move, info, glob, grep, tree.
|
|
23
|
-
- **Браузерный инструмент**: `web_browse` — navigate, click, type, extract, screenshot, scroll, wait, get_links, evaluate, close.
|
|
24
|
-
- **Простая установка**: `npm install -g micro-models-agent` и готово.
|
|
25
|
-
|
|
26
|
-
Поддерживает OpenAI-совместимые API: LM Studio, Ollama, vLLM, Together AI и другие.
|
|
27
|
-
|
|
28
|
-
## Установка
|
|
29
|
-
|
|
30
|
-
### Глобально через npm (рекомендуется)
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npm install -g micro-models-agent
|
|
34
|
-
|
|
35
|
-
# Проверка:
|
|
36
|
-
mma --version
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Из исходников
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
git clone <repo>
|
|
43
|
-
cd mma
|
|
44
|
-
npm install
|
|
45
|
-
npm run build
|
|
46
|
-
npm link
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Удаление
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
npm uninstall -g micro-models-agent # удалить пакет
|
|
53
|
-
rm -rf ~/.mma # удалить конфиг, кэш, логи, сессии
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
> `~/.mma/` можно не удалять — данные останутся на случай повторной установки.
|
|
57
|
-
|
|
58
|
-
## Быстрый старт
|
|
59
|
-
|
|
60
|
-
### Интерактивный режим (REPL) — самый простой способ
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
# Установите
|
|
64
|
-
npm install -g micro-models-agent
|
|
65
|
-
|
|
66
|
-
# И просто запустите
|
|
67
|
-
mma
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
> **Совет:** перед первым запуском запустите LM Studio → вкладка Local Server → Start Server → загрузите модель (например, [Qwen 3.5-9B](https://huggingface.co/Qwen/Qwen3.5-9B-Instruct-GGUF)). Мастер сам найдёт её и настроит.
|
|
71
|
-
|
|
72
|
-
**При первом запуске** появится мастер настройки:
|
|
73
|
-
1. Выберите провайдера (LM Studio, Ollama или Remote API)
|
|
74
|
-
2. Мастер найдёт доступные модели и протестирует соединение
|
|
75
|
-
3. Готово — вы в REPL, можно писать запросы
|
|
76
|
-
|
|
77
|
-
**При повторных запусках** REPL открывается сразу.
|
|
78
|
-
|
|
79
|
-
В REPL работаете как в чате: пишете задачу, агент думает и выполняет. Доступны служебные команды:
|
|
80
|
-
|
|
81
|
-
| Команда | Описание |
|
|
82
|
-
|---------|----------|
|
|
83
|
-
| `/help` | Справка |
|
|
84
|
-
| `/read <file>` | Показать файл |
|
|
85
|
-
| `/write <file>` | Записать файл |
|
|
86
|
-
| `/bash <cmd>` | Выполнить команду |
|
|
87
|
-
| `/clear` | Очистить контекст |
|
|
88
|
-
| `/exit` | Выход |
|
|
89
|
-
|
|
90
|
-
### One-shot (быстрый запрос)
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
mma "Создай React-компонент для формы входа"
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Можно передать провайдера и модель флагами:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
mma --provider ollama --model qwen3.5-9b "Напиши Dockerfile"
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### С пайпом (stdin)
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
cat package.json | mma "Опиши зависимости"
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Настройка провайдеров и моделей
|
|
109
|
-
|
|
110
|
-
По умолчанию конфиг настроен на LM Studio (`localhost:1234`). Если нужно добавить другой сервер:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
# Добавить провайдера
|
|
114
|
-
mma provider add ollama http://localhost:11434/v1
|
|
115
|
-
|
|
116
|
-
# Переключиться на него
|
|
117
|
-
mma provider use ollama
|
|
118
|
-
|
|
119
|
-
# Добавить модель к активному провайдеру
|
|
120
|
-
mma model add qwen3.5-9b qwen3.5-9b-instruct 32768
|
|
121
|
-
|
|
122
|
-
# Выбрать модель (model add не активирует автоматически)
|
|
123
|
-
mma model use qwen3.5-9b
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Все команды управления
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# Провайдеры
|
|
130
|
-
mma provider list # Список провайдеров
|
|
131
|
-
mma provider use ollama # Переключиться на провайдера
|
|
132
|
-
mma provider add <имя> <url> # Добавить провайдера
|
|
133
|
-
mma provider remove <имя> # Удалить провайдера
|
|
134
|
-
|
|
135
|
-
# Модели
|
|
136
|
-
mma model list # Список моделей активного провайдера
|
|
137
|
-
mma model use <имя> # Переключиться на модель
|
|
138
|
-
mma model current # Показать активную модель
|
|
139
|
-
mma model add <имя> <id> <ctx> # Добавить модель
|
|
140
|
-
mma model remove <имя> # Удалить модель
|
|
141
|
-
mma model params [имя] # Параметры модели
|
|
142
|
-
mma model set <имя> k=v # Изменить параметр (temperature=0.5)
|
|
143
|
-
|
|
144
|
-
# Конфиг
|
|
145
|
-
mma config show # Показать весь конфиг
|
|
146
|
-
mma config reset # Сбросить настройки
|
|
147
|
-
mma config thinking [on/off] # Включить/выключить скрытие размышлений модели
|
|
148
|
-
|
|
149
|
-
# Обновления
|
|
150
|
-
mma update # Проверить наличие обновлений
|
|
151
|
-
mma update check # Проверить версию
|
|
152
|
-
mma update install # Скачать и установить обновление
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Параметры моделей
|
|
156
|
-
|
|
157
|
-
По умолчанию:
|
|
158
|
-
- `temperature`: 0.7
|
|
159
|
-
- `max_tokens`: 4096
|
|
160
|
-
- `top_p`: 0.9
|
|
161
|
-
|
|
162
|
-
Изменить:
|
|
163
|
-
|
|
164
|
-
```bash
|
|
165
|
-
mma model set qwen3.5-9b temperature=0.3 max_tokens=8192
|
|
166
|
-
mma model set qwen3.5-9b seed=42 # для воспроизводимости
|
|
167
|
-
mma model set qwen3.5-9b seed=null # сбросить seed
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## Конфигурация
|
|
171
|
-
|
|
172
|
-
Конфиг хранится в `~/.mma/config.json`.
|
|
173
|
-
|
|
174
|
-
```json
|
|
175
|
-
{
|
|
176
|
-
"providers": {
|
|
177
|
-
"lmstudio": {
|
|
178
|
-
"type": "openai-compat",
|
|
179
|
-
"url": "http://localhost:1234/v1",
|
|
180
|
-
"apiKey": null,
|
|
181
|
-
"models": {
|
|
182
|
-
"qwen3.5-9b": {
|
|
183
|
-
"model": "qwen3.5-9b-instruct",
|
|
184
|
-
"contextWindow": 32768,
|
|
185
|
-
"params": {
|
|
186
|
-
"temperature": 0.7,
|
|
187
|
-
"max_tokens": 4096
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
"active": {
|
|
194
|
-
"provider": "lmstudio",
|
|
195
|
-
"model": "qwen3.5-9b"
|
|
196
|
-
},
|
|
197
|
-
"agent": {
|
|
198
|
-
"maxSteps": 50,
|
|
199
|
-
"autoCompact": true,
|
|
200
|
-
"compactThreshold": 0.85,
|
|
201
|
-
"toolTimeout": 120,
|
|
202
|
-
"maxOutputLength": 2000
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
Можно также создать `.mmrc` в корне проекта — он смержится поверх глобального конфига.
|
|
208
|
-
|
|
209
|
-
### Переменные окружения
|
|
210
|
-
|
|
211
|
-
| Переменная | Описание |
|
|
212
|
-
|-----------|----------|
|
|
213
|
-
| `MMA_PROVIDER` | Провайдер по умолчанию |
|
|
214
|
-
| `MMA_MODEL` | Модель по умолчанию |
|
|
215
|
-
| `MMA_STDIN=1` | Принудительное чтение stdin |
|
|
216
|
-
|
|
217
|
-
## Режимы запуска
|
|
218
|
-
|
|
219
|
-
### One-shot
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
mma "Объясни этот код: function fib(n) { return n < 2 ? n : fib(n-1) + fib(n-2); }"
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Stdin (пайп)
|
|
226
|
-
|
|
227
|
-
```bash
|
|
228
|
-
cat main.ts | mma "Найди потенциальные баги"
|
|
229
|
-
curl -s https://api.example.com/data | mma "Проанализируй JSON"
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### REPL
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
mma
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
В REPL доступны команды:
|
|
239
|
-
|
|
240
|
-
| Команда | Описание |
|
|
241
|
-
|---------|----------|
|
|
242
|
-
| `/read <file>` | Показать файл с нумерацией строк |
|
|
243
|
-
| `/write <file>` | Записать файл (до EOF) |
|
|
244
|
-
| `/edit <file> <n>` | Заменить строку N в файле |
|
|
245
|
-
| `/find <pattern>` | Поиск файлов по glob |
|
|
246
|
-
| `/search <pattern>` | Поиск содержимого |
|
|
247
|
-
| `/bash <cmd>` | Выполнить shell-команду |
|
|
248
|
-
| `/git <args>` | Git-операции |
|
|
249
|
-
| `/memory` | Показать память |
|
|
250
|
-
| `/memory add <type> <text>` | Добавить в память |
|
|
251
|
-
| `/memory search <query>` | Поиск в памяти |
|
|
252
|
-
| `/skill` | Список навыков |
|
|
253
|
-
| `/sessions` | Список сессий |
|
|
254
|
-
| `/resume <id>` | Восстановить сессию |
|
|
255
|
-
| `/save [name]` | Сохранить сессию |
|
|
256
|
-
| `/clear` | Очистить контекст |
|
|
257
|
-
| `/help` | Справка |
|
|
258
|
-
| `/exit` | Выход |
|
|
259
|
-
|
|
260
|
-
## Синтаксис `@file`
|
|
261
|
-
|
|
262
|
-
Загружает файлы в контекст агента:
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
mma "@src/index.ts -- объясни эту функцию"
|
|
266
|
-
|
|
267
|
-
# Несколько файлов
|
|
268
|
-
mma "@src/auth/login.ts @src/auth/jwt.ts -- сравни"
|
|
269
|
-
|
|
270
|
-
# Диапазон строк
|
|
271
|
-
mma "@src/index.ts:10-30 -- что здесь происходит?"
|
|
272
|
-
|
|
273
|
-
# Вся директория
|
|
274
|
-
mma "@src/auth/ -- покажи структуру модуля"
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## Навыки (Skills)
|
|
278
|
-
|
|
279
|
-
Навыки — это Markdown-файлы с инструкциями для модели. Загружаются из:
|
|
280
|
-
- `~/.mma/skills/<name>/SKILL.md`
|
|
281
|
-
- `.agents/skills/<name>/SKILL.md`
|
|
282
|
-
- `.claude/skills/<name>/SKILL.md`
|
|
283
|
-
|
|
284
|
-
```bash
|
|
285
|
-
# Использовать навык
|
|
286
|
-
mma "@docker -- помоги контейнеризовать приложение"
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
## Агент: как это работает
|
|
290
|
-
|
|
291
|
-
1. Вы даёте задачу (prompt)
|
|
292
|
-
2. Модель генерирует план и вызывает инструменты через `<tool_call>`
|
|
293
|
-
3. Агент выполняет инструменты и возвращает результат модели
|
|
294
|
-
4. Модель анализирует результат и решает, что делать дальше
|
|
295
|
-
5. Цикл продолжается до завершения задачи (макс. 50 шагов)
|
|
296
|
-
|
|
297
|
-
### Инструменты агента
|
|
298
|
-
|
|
299
|
-
| Инструмент | Описание |
|
|
300
|
-
|-----------|----------|
|
|
301
|
-
| `read_file` | Чтение файла с нумерацией строк |
|
|
302
|
-
| `write_file` | Атомарная запись/создание файла |
|
|
303
|
-
| `edit_file` | Find & replace (точное совпадение) |
|
|
304
|
-
| `list_dir` | Список директории |
|
|
305
|
-
| `create_dir` | Рекурсивное создание директории |
|
|
306
|
-
| `delete_file` | Удаление файла/директории |
|
|
307
|
-
| `copy_file` | Копирование |
|
|
308
|
-
| `move_file` | Перемещение/переименование |
|
|
309
|
-
| `file_info` | Метаданные файла |
|
|
310
|
-
| `glob_search` | Поиск по паттерну |
|
|
311
|
-
| `grep_search` | Поиск по содержимому (regex) |
|
|
312
|
-
| `tree` | Дерево директорий |
|
|
313
|
-
| `bash` | Выполнение команд (npm, git, docker) |
|
|
314
|
-
|
|
315
|
-
## Архитектура
|
|
316
|
-
|
|
317
|
-
### Плагины
|
|
318
|
-
|
|
319
|
-
Система плагинов на жизненных циклах (lifecycle events). Плагины реализуют интерфейс `AgentPlugin` и подписываются на события (`tool:before`, `tool:after`, `agent:done` и др.). Управляются через `PluginManager` с event bus.
|
|
320
|
-
|
|
321
|
-
Плагины — это директории с `manifest.json` + точкой входа (.ts/.js). Они могут лежать в трёх местах (сканируются в порядке приоритета):
|
|
322
|
-
|
|
323
|
-
| Источник | Путь | Описание |
|
|
324
|
-
|----------|------|----------|
|
|
325
|
-
| builtin | `dist/plugins/builtin/` | Встроенные плагины, поставляются с MMA |
|
|
326
|
-
| project | `.mma/plugins/<name>/` | Проектные плагины (в репозитории) |
|
|
327
|
-
| user | `~/.mma/plugins/<name>/` | Личные плагины пользователя |
|
|
328
|
-
|
|
329
|
-
**Встроенные плагины:**
|
|
330
|
-
|
|
331
|
-
| Плагин | Описание |
|
|
332
|
-
|--------|----------|
|
|
333
|
-
| `notify` | OS desktop-уведомления (Windows/macOS/Linux) |
|
|
334
|
-
| `lint-on-write` | Авто-запуск линтера после write_file/edit_file |
|
|
335
|
-
|
|
336
|
-
**CLI-команды:**
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
mma plugin list # Список всех обнаруженных плагинов
|
|
340
|
-
mma plugin create <name> # Создать новый плагин в .mma/plugins/
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
**REPL-команда:** `/plugins` — показать плагины, их источник и статус.
|
|
344
|
-
|
|
345
|
-
**Конфигурация:**
|
|
346
|
-
|
|
347
|
-
Плагины активируются автоматически: все builtin, плюс указанные в `config.agent.plugins`:
|
|
348
|
-
|
|
349
|
-
```json
|
|
350
|
-
{
|
|
351
|
-
"agent": {
|
|
352
|
-
"plugins": ["my-plugin"]
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
Также плагины можно привязать к режиму через `ModeConfig.plugins` (режим `pro` включает `hooks-adapter`).
|
|
358
|
-
|
|
359
|
-
Подробнее: [PLUGINS.md](./PLUGINS.md) — документация по созданию и устройству плагинов.
|
|
360
|
-
|
|
361
|
-
### Субагенты
|
|
362
|
-
|
|
363
|
-
Повторно используемый ReAct-цикл (`src/agent/react-loop.ts`) для запуска дочерних агентов внутри сессии. Используется субагентом (`src/agent/subagent.ts`) для параллельного выполнения подзадач. Основной цикл (`loop.ts`) имеет собственный встроенный ReAct-цикл.
|
|
364
|
-
|
|
365
|
-
### Режимы (Modes)
|
|
366
|
-
|
|
367
|
-
Три встроенных режима через `ModeRegistry` (`src/agent/modes/`):
|
|
368
|
-
|
|
369
|
-
| Режим | Описание |
|
|
370
|
-
|-------|----------|
|
|
371
|
-
| `fast` | Без навыков, урезанный системный промпт |
|
|
372
|
-
| `base` | Полный набор инструментов и навыков |
|
|
373
|
-
| `pro` | Расширенный цикл с верификацией |
|
|
374
|
-
|
|
375
|
-
Пользовательские режимы задаются через `AppConfig.modes`.
|
|
376
|
-
|
|
377
|
-
### ToolHandler и ToolExecutor
|
|
378
|
-
|
|
379
|
-
Все 20 инструментов (12 FS + bash + 2 web + 6 native) реализуют интерфейс `ToolHandler` из `src/tools/types.ts`. `ToolExecutor` в `src/agent/tool-executor.ts` — чистый диспетчер с конвейером: pre-hooks → execute → post-hooks → truncate.
|
|
380
|
-
|
|
381
|
-
### Карта исходников
|
|
382
|
-
|
|
383
|
-
| Компонент | Путь | Назначение |
|
|
384
|
-
|-----------|------|------------|
|
|
385
|
-
| Точка входа | `src/index.ts` → `src/cli.ts` | Commander CLI |
|
|
386
|
-
| Цикл агента | `src/agent/loop.ts` | ReAct-цикл, ядро |
|
|
387
|
-
| Исполнитель инструментов | `src/agent/tool-executor.ts` | Диспетчер с конвейером |
|
|
388
|
-
| Субагент | `src/agent/subagent.ts` | Дочерний агент |
|
|
389
|
-
| ReAct-loop | `src/agent/react-loop.ts` | Переиспользуемый ReAct-цикл |
|
|
390
|
-
| Плагины | `src/plugins/` | Менеджер плагинов с шиной событий |
|
|
391
|
-
| LLM провайдер | `src/llm/openai-compat.ts` | REST-клиент |
|
|
392
|
-
| Системный промпт | `src/agent/system-prompt.ts` | Сборка системного промпта |
|
|
393
|
-
|
|
394
|
-
## Индексация проекта
|
|
395
|
-
|
|
396
|
-
Агент автоматически строит карту проекта и индекс кода:
|
|
397
|
-
|
|
398
|
-
```bash
|
|
399
|
-
# Вручную перестроить
|
|
400
|
-
/build index rebuild
|
|
401
|
-
/build project-map
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
## Работа с сессиями
|
|
405
|
-
|
|
406
|
-
```bash
|
|
407
|
-
# Автосохранение при выходе
|
|
408
|
-
/save my-session-name
|
|
409
|
-
|
|
410
|
-
# Список сессий
|
|
411
|
-
/sessions
|
|
412
|
-
|
|
413
|
-
# Восстановить
|
|
414
|
-
/resume my-session-name
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
## Разработка
|
|
418
|
-
|
|
419
|
-
```bash
|
|
420
|
-
npm run build # Компиляция TypeScript
|
|
421
|
-
npm run dev # Watch-режим
|
|
422
|
-
npm test # Тесты
|
|
423
|
-
npm run test:all # Все тесты
|
|
424
|
-
npm run test:watch # vitest watch
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
### Публикация новой версии
|
|
428
|
-
|
|
429
|
-
```bash
|
|
430
|
-
npm version patch # или minor, major
|
|
431
|
-
npm publish
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
## Лицензия
|
|
435
|
-
|
|
436
|
-
MIT
|
|
1
|
+
# MMA — Micro Models Agent
|
|
2
|
+
|
|
3
|
+
LLM-агент, который работает на маленьких моделях (Qwen3.5-9B, 32K-64K контекст). Пишет код, редактирует файлы, ищет баги, выполняет bash-команды, читает документацию — и всё это на моделях, которые запускаются на обычном ноутбуке без GPU.
|
|
4
|
+
|
|
5
|
+
**Чем MMA отличается от больших агентов (OpenCode, Claude Code, Cursor):**
|
|
6
|
+
|
|
7
|
+
- **Лёгкий**: не требует GPT-4 или Claude Sonnet. Работает на Qwen3.5-9B, DeepSeek-Coder и других opensource-моделях. Всё локально.
|
|
8
|
+
- **ReAct-цикл**: модель сама планирует и вызывает инструменты через `<tool_call>` — читает/пишет/редактирует файлы, ищет по проекту, выполняет bash.
|
|
9
|
+
- **Навыки (Skills)**: подгружаемые markdown-инструкции для специализированных задач (Docker, CSS, auth, и т.д.).
|
|
10
|
+
- **Индексация кода**: AST-индекс символов + карта проекта (project map) для навигации по любой кодовой базе.
|
|
11
|
+
- **Память**: долговременная память агента — запоминает факты между сессиями.
|
|
12
|
+
- **Веб-поиск**: может искать информацию в интернете.
|
|
13
|
+
- **Браузер**: интерактивный headless-браузер (Playwright) — навигация, клики, ввод текста, скриншоты, извлечение данных со страниц.
|
|
14
|
+
- **Плагины**: мощная система плагинов на lifecycle events. [PLUGINS.md](./PLUGINS.md)
|
|
15
|
+
- **Планирование**: создаёт и утверждает планы через PLAN.md перед выполнением.
|
|
16
|
+
- **Сессии**: сохранение, восстановление, список сессий.
|
|
17
|
+
- **MCP интеграция**: поддержка Model Context Protocol для внешних инструментов.
|
|
18
|
+
- **Вопросы пользователю**: может уточнять детали задачи, запрашивать одобрение.
|
|
19
|
+
- **Синтаксис @file**: загрузка файлов/директорий прямо в промпт.
|
|
20
|
+
- **Стилизация**: сменные темы оформления.
|
|
21
|
+
- **Мастер первого запуска**: интерактивная настройка провайдера и модели.
|
|
22
|
+
- **12 файловых инструментов**: read, write, edit, list, create, delete, copy, move, info, glob, grep, tree.
|
|
23
|
+
- **Браузерный инструмент**: `web_browse` — navigate, click, type, extract, screenshot, scroll, wait, get_links, evaluate, close.
|
|
24
|
+
- **Простая установка**: `npm install -g micro-models-agent` и готово.
|
|
25
|
+
|
|
26
|
+
Поддерживает OpenAI-совместимые API: LM Studio, Ollama, vLLM, Together AI и другие.
|
|
27
|
+
|
|
28
|
+
## Установка
|
|
29
|
+
|
|
30
|
+
### Глобально через npm (рекомендуется)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g micro-models-agent
|
|
34
|
+
|
|
35
|
+
# Проверка:
|
|
36
|
+
mma --version
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Из исходников
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git clone <repo>
|
|
43
|
+
cd mma
|
|
44
|
+
npm install
|
|
45
|
+
npm run build
|
|
46
|
+
npm link
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Удаление
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm uninstall -g micro-models-agent # удалить пакет
|
|
53
|
+
rm -rf ~/.mma # удалить конфиг, кэш, логи, сессии
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> `~/.mma/` можно не удалять — данные останутся на случай повторной установки.
|
|
57
|
+
|
|
58
|
+
## Быстрый старт
|
|
59
|
+
|
|
60
|
+
### Интерактивный режим (REPL) — самый простой способ
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Установите
|
|
64
|
+
npm install -g micro-models-agent
|
|
65
|
+
|
|
66
|
+
# И просто запустите
|
|
67
|
+
mma
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
> **Совет:** перед первым запуском запустите LM Studio → вкладка Local Server → Start Server → загрузите модель (например, [Qwen 3.5-9B](https://huggingface.co/Qwen/Qwen3.5-9B-Instruct-GGUF)). Мастер сам найдёт её и настроит.
|
|
71
|
+
|
|
72
|
+
**При первом запуске** появится мастер настройки:
|
|
73
|
+
1. Выберите провайдера (LM Studio, Ollama или Remote API)
|
|
74
|
+
2. Мастер найдёт доступные модели и протестирует соединение
|
|
75
|
+
3. Готово — вы в REPL, можно писать запросы
|
|
76
|
+
|
|
77
|
+
**При повторных запусках** REPL открывается сразу.
|
|
78
|
+
|
|
79
|
+
В REPL работаете как в чате: пишете задачу, агент думает и выполняет. Доступны служебные команды:
|
|
80
|
+
|
|
81
|
+
| Команда | Описание |
|
|
82
|
+
|---------|----------|
|
|
83
|
+
| `/help` | Справка |
|
|
84
|
+
| `/read <file>` | Показать файл |
|
|
85
|
+
| `/write <file>` | Записать файл |
|
|
86
|
+
| `/bash <cmd>` | Выполнить команду |
|
|
87
|
+
| `/clear` | Очистить контекст |
|
|
88
|
+
| `/exit` | Выход |
|
|
89
|
+
|
|
90
|
+
### One-shot (быстрый запрос)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
mma "Создай React-компонент для формы входа"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Можно передать провайдера и модель флагами:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
mma --provider ollama --model qwen3.5-9b "Напиши Dockerfile"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### С пайпом (stdin)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
cat package.json | mma "Опиши зависимости"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Настройка провайдеров и моделей
|
|
109
|
+
|
|
110
|
+
По умолчанию конфиг настроен на LM Studio (`localhost:1234`). Если нужно добавить другой сервер:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Добавить провайдера
|
|
114
|
+
mma provider add ollama http://localhost:11434/v1
|
|
115
|
+
|
|
116
|
+
# Переключиться на него
|
|
117
|
+
mma provider use ollama
|
|
118
|
+
|
|
119
|
+
# Добавить модель к активному провайдеру
|
|
120
|
+
mma model add qwen3.5-9b qwen3.5-9b-instruct 32768
|
|
121
|
+
|
|
122
|
+
# Выбрать модель (model add не активирует автоматически)
|
|
123
|
+
mma model use qwen3.5-9b
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Все команды управления
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Провайдеры
|
|
130
|
+
mma provider list # Список провайдеров
|
|
131
|
+
mma provider use ollama # Переключиться на провайдера
|
|
132
|
+
mma provider add <имя> <url> # Добавить провайдера
|
|
133
|
+
mma provider remove <имя> # Удалить провайдера
|
|
134
|
+
|
|
135
|
+
# Модели
|
|
136
|
+
mma model list # Список моделей активного провайдера
|
|
137
|
+
mma model use <имя> # Переключиться на модель
|
|
138
|
+
mma model current # Показать активную модель
|
|
139
|
+
mma model add <имя> <id> <ctx> # Добавить модель
|
|
140
|
+
mma model remove <имя> # Удалить модель
|
|
141
|
+
mma model params [имя] # Параметры модели
|
|
142
|
+
mma model set <имя> k=v # Изменить параметр (temperature=0.5)
|
|
143
|
+
|
|
144
|
+
# Конфиг
|
|
145
|
+
mma config show # Показать весь конфиг
|
|
146
|
+
mma config reset # Сбросить настройки
|
|
147
|
+
mma config thinking [on/off] # Включить/выключить скрытие размышлений модели
|
|
148
|
+
|
|
149
|
+
# Обновления
|
|
150
|
+
mma update # Проверить наличие обновлений
|
|
151
|
+
mma update check # Проверить версию
|
|
152
|
+
mma update install # Скачать и установить обновление
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Параметры моделей
|
|
156
|
+
|
|
157
|
+
По умолчанию:
|
|
158
|
+
- `temperature`: 0.7
|
|
159
|
+
- `max_tokens`: 4096
|
|
160
|
+
- `top_p`: 0.9
|
|
161
|
+
|
|
162
|
+
Изменить:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
mma model set qwen3.5-9b temperature=0.3 max_tokens=8192
|
|
166
|
+
mma model set qwen3.5-9b seed=42 # для воспроизводимости
|
|
167
|
+
mma model set qwen3.5-9b seed=null # сбросить seed
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Конфигурация
|
|
171
|
+
|
|
172
|
+
Конфиг хранится в `~/.mma/config.json`.
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{
|
|
176
|
+
"providers": {
|
|
177
|
+
"lmstudio": {
|
|
178
|
+
"type": "openai-compat",
|
|
179
|
+
"url": "http://localhost:1234/v1",
|
|
180
|
+
"apiKey": null,
|
|
181
|
+
"models": {
|
|
182
|
+
"qwen3.5-9b": {
|
|
183
|
+
"model": "qwen3.5-9b-instruct",
|
|
184
|
+
"contextWindow": 32768,
|
|
185
|
+
"params": {
|
|
186
|
+
"temperature": 0.7,
|
|
187
|
+
"max_tokens": 4096
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"active": {
|
|
194
|
+
"provider": "lmstudio",
|
|
195
|
+
"model": "qwen3.5-9b"
|
|
196
|
+
},
|
|
197
|
+
"agent": {
|
|
198
|
+
"maxSteps": 50,
|
|
199
|
+
"autoCompact": true,
|
|
200
|
+
"compactThreshold": 0.85,
|
|
201
|
+
"toolTimeout": 120,
|
|
202
|
+
"maxOutputLength": 2000
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Можно также создать `.mmrc` в корне проекта — он смержится поверх глобального конфига.
|
|
208
|
+
|
|
209
|
+
### Переменные окружения
|
|
210
|
+
|
|
211
|
+
| Переменная | Описание |
|
|
212
|
+
|-----------|----------|
|
|
213
|
+
| `MMA_PROVIDER` | Провайдер по умолчанию |
|
|
214
|
+
| `MMA_MODEL` | Модель по умолчанию |
|
|
215
|
+
| `MMA_STDIN=1` | Принудительное чтение stdin |
|
|
216
|
+
|
|
217
|
+
## Режимы запуска
|
|
218
|
+
|
|
219
|
+
### One-shot
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
mma "Объясни этот код: function fib(n) { return n < 2 ? n : fib(n-1) + fib(n-2); }"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Stdin (пайп)
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
cat main.ts | mma "Найди потенциальные баги"
|
|
229
|
+
curl -s https://api.example.com/data | mma "Проанализируй JSON"
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### REPL
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
mma
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
В REPL доступны команды:
|
|
239
|
+
|
|
240
|
+
| Команда | Описание |
|
|
241
|
+
|---------|----------|
|
|
242
|
+
| `/read <file>` | Показать файл с нумерацией строк |
|
|
243
|
+
| `/write <file>` | Записать файл (до EOF) |
|
|
244
|
+
| `/edit <file> <n>` | Заменить строку N в файле |
|
|
245
|
+
| `/find <pattern>` | Поиск файлов по glob |
|
|
246
|
+
| `/search <pattern>` | Поиск содержимого |
|
|
247
|
+
| `/bash <cmd>` | Выполнить shell-команду |
|
|
248
|
+
| `/git <args>` | Git-операции |
|
|
249
|
+
| `/memory` | Показать память |
|
|
250
|
+
| `/memory add <type> <text>` | Добавить в память |
|
|
251
|
+
| `/memory search <query>` | Поиск в памяти |
|
|
252
|
+
| `/skill` | Список навыков |
|
|
253
|
+
| `/sessions` | Список сессий |
|
|
254
|
+
| `/resume <id>` | Восстановить сессию |
|
|
255
|
+
| `/save [name]` | Сохранить сессию |
|
|
256
|
+
| `/clear` | Очистить контекст |
|
|
257
|
+
| `/help` | Справка |
|
|
258
|
+
| `/exit` | Выход |
|
|
259
|
+
|
|
260
|
+
## Синтаксис `@file`
|
|
261
|
+
|
|
262
|
+
Загружает файлы в контекст агента:
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
mma "@src/index.ts -- объясни эту функцию"
|
|
266
|
+
|
|
267
|
+
# Несколько файлов
|
|
268
|
+
mma "@src/auth/login.ts @src/auth/jwt.ts -- сравни"
|
|
269
|
+
|
|
270
|
+
# Диапазон строк
|
|
271
|
+
mma "@src/index.ts:10-30 -- что здесь происходит?"
|
|
272
|
+
|
|
273
|
+
# Вся директория
|
|
274
|
+
mma "@src/auth/ -- покажи структуру модуля"
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Навыки (Skills)
|
|
278
|
+
|
|
279
|
+
Навыки — это Markdown-файлы с инструкциями для модели. Загружаются из:
|
|
280
|
+
- `~/.mma/skills/<name>/SKILL.md`
|
|
281
|
+
- `.agents/skills/<name>/SKILL.md`
|
|
282
|
+
- `.claude/skills/<name>/SKILL.md`
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
# Использовать навык
|
|
286
|
+
mma "@docker -- помоги контейнеризовать приложение"
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Агент: как это работает
|
|
290
|
+
|
|
291
|
+
1. Вы даёте задачу (prompt)
|
|
292
|
+
2. Модель генерирует план и вызывает инструменты через `<tool_call>`
|
|
293
|
+
3. Агент выполняет инструменты и возвращает результат модели
|
|
294
|
+
4. Модель анализирует результат и решает, что делать дальше
|
|
295
|
+
5. Цикл продолжается до завершения задачи (макс. 50 шагов)
|
|
296
|
+
|
|
297
|
+
### Инструменты агента
|
|
298
|
+
|
|
299
|
+
| Инструмент | Описание |
|
|
300
|
+
|-----------|----------|
|
|
301
|
+
| `read_file` | Чтение файла с нумерацией строк |
|
|
302
|
+
| `write_file` | Атомарная запись/создание файла |
|
|
303
|
+
| `edit_file` | Find & replace (точное совпадение) |
|
|
304
|
+
| `list_dir` | Список директории |
|
|
305
|
+
| `create_dir` | Рекурсивное создание директории |
|
|
306
|
+
| `delete_file` | Удаление файла/директории |
|
|
307
|
+
| `copy_file` | Копирование |
|
|
308
|
+
| `move_file` | Перемещение/переименование |
|
|
309
|
+
| `file_info` | Метаданные файла |
|
|
310
|
+
| `glob_search` | Поиск по паттерну |
|
|
311
|
+
| `grep_search` | Поиск по содержимому (regex) |
|
|
312
|
+
| `tree` | Дерево директорий |
|
|
313
|
+
| `bash` | Выполнение команд (npm, git, docker) |
|
|
314
|
+
|
|
315
|
+
## Архитектура
|
|
316
|
+
|
|
317
|
+
### Плагины
|
|
318
|
+
|
|
319
|
+
Система плагинов на жизненных циклах (lifecycle events). Плагины реализуют интерфейс `AgentPlugin` и подписываются на события (`tool:before`, `tool:after`, `agent:done` и др.). Управляются через `PluginManager` с event bus.
|
|
320
|
+
|
|
321
|
+
Плагины — это директории с `manifest.json` + точкой входа (.ts/.js). Они могут лежать в трёх местах (сканируются в порядке приоритета):
|
|
322
|
+
|
|
323
|
+
| Источник | Путь | Описание |
|
|
324
|
+
|----------|------|----------|
|
|
325
|
+
| builtin | `dist/plugins/builtin/` | Встроенные плагины, поставляются с MMA |
|
|
326
|
+
| project | `.mma/plugins/<name>/` | Проектные плагины (в репозитории) |
|
|
327
|
+
| user | `~/.mma/plugins/<name>/` | Личные плагины пользователя |
|
|
328
|
+
|
|
329
|
+
**Встроенные плагины:**
|
|
330
|
+
|
|
331
|
+
| Плагин | Описание |
|
|
332
|
+
|--------|----------|
|
|
333
|
+
| `notify` | OS desktop-уведомления (Windows/macOS/Linux) |
|
|
334
|
+
| `lint-on-write` | Авто-запуск линтера после write_file/edit_file |
|
|
335
|
+
|
|
336
|
+
**CLI-команды:**
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
mma plugin list # Список всех обнаруженных плагинов
|
|
340
|
+
mma plugin create <name> # Создать новый плагин в .mma/plugins/
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**REPL-команда:** `/plugins` — показать плагины, их источник и статус.
|
|
344
|
+
|
|
345
|
+
**Конфигурация:**
|
|
346
|
+
|
|
347
|
+
Плагины активируются автоматически: все builtin, плюс указанные в `config.agent.plugins`:
|
|
348
|
+
|
|
349
|
+
```json
|
|
350
|
+
{
|
|
351
|
+
"agent": {
|
|
352
|
+
"plugins": ["my-plugin"]
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Также плагины можно привязать к режиму через `ModeConfig.plugins` (режим `pro` включает `hooks-adapter`).
|
|
358
|
+
|
|
359
|
+
Подробнее: [PLUGINS.md](./PLUGINS.md) — документация по созданию и устройству плагинов.
|
|
360
|
+
|
|
361
|
+
### Субагенты
|
|
362
|
+
|
|
363
|
+
Повторно используемый ReAct-цикл (`src/agent/react-loop.ts`) для запуска дочерних агентов внутри сессии. Используется субагентом (`src/agent/subagent.ts`) для параллельного выполнения подзадач. Основной цикл (`loop.ts`) имеет собственный встроенный ReAct-цикл.
|
|
364
|
+
|
|
365
|
+
### Режимы (Modes)
|
|
366
|
+
|
|
367
|
+
Три встроенных режима через `ModeRegistry` (`src/agent/modes/`):
|
|
368
|
+
|
|
369
|
+
| Режим | Описание |
|
|
370
|
+
|-------|----------|
|
|
371
|
+
| `fast` | Без навыков, урезанный системный промпт |
|
|
372
|
+
| `base` | Полный набор инструментов и навыков |
|
|
373
|
+
| `pro` | Расширенный цикл с верификацией |
|
|
374
|
+
|
|
375
|
+
Пользовательские режимы задаются через `AppConfig.modes`.
|
|
376
|
+
|
|
377
|
+
### ToolHandler и ToolExecutor
|
|
378
|
+
|
|
379
|
+
Все 20 инструментов (12 FS + bash + 2 web + 6 native) реализуют интерфейс `ToolHandler` из `src/tools/types.ts`. `ToolExecutor` в `src/agent/tool-executor.ts` — чистый диспетчер с конвейером: pre-hooks → execute → post-hooks → truncate.
|
|
380
|
+
|
|
381
|
+
### Карта исходников
|
|
382
|
+
|
|
383
|
+
| Компонент | Путь | Назначение |
|
|
384
|
+
|-----------|------|------------|
|
|
385
|
+
| Точка входа | `src/index.ts` → `src/cli.ts` | Commander CLI |
|
|
386
|
+
| Цикл агента | `src/agent/loop.ts` | ReAct-цикл, ядро |
|
|
387
|
+
| Исполнитель инструментов | `src/agent/tool-executor.ts` | Диспетчер с конвейером |
|
|
388
|
+
| Субагент | `src/agent/subagent.ts` | Дочерний агент |
|
|
389
|
+
| ReAct-loop | `src/agent/react-loop.ts` | Переиспользуемый ReAct-цикл |
|
|
390
|
+
| Плагины | `src/plugins/` | Менеджер плагинов с шиной событий |
|
|
391
|
+
| LLM провайдер | `src/llm/openai-compat.ts` | REST-клиент |
|
|
392
|
+
| Системный промпт | `src/agent/system-prompt.ts` | Сборка системного промпта |
|
|
393
|
+
|
|
394
|
+
## Индексация проекта
|
|
395
|
+
|
|
396
|
+
Агент автоматически строит карту проекта и индекс кода:
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
# Вручную перестроить
|
|
400
|
+
/build index rebuild
|
|
401
|
+
/build project-map
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Работа с сессиями
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
# Автосохранение при выходе
|
|
408
|
+
/save my-session-name
|
|
409
|
+
|
|
410
|
+
# Список сессий
|
|
411
|
+
/sessions
|
|
412
|
+
|
|
413
|
+
# Восстановить
|
|
414
|
+
/resume my-session-name
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
## Разработка
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
npm run build # Компиляция TypeScript
|
|
421
|
+
npm run dev # Watch-режим
|
|
422
|
+
npm test # Тесты
|
|
423
|
+
npm run test:all # Все тесты
|
|
424
|
+
npm run test:watch # vitest watch
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Публикация новой версии
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
npm version patch # или minor, major
|
|
431
|
+
npm publish
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
## Лицензия
|
|
435
|
+
|
|
436
|
+
MIT
|