diff --git a/.obsidian/graph.json b/.obsidian/graph.json index 8d7561b..574d416 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -17,6 +17,6 @@ "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 1.0000000000000024, + "scale": 0.3628873693012127, "close": true } \ No newline at end of file diff --git a/MCP інструменти.md b/MCP інструменти.md index 265f80a..a87da63 100644 --- a/MCP інструменти.md +++ b/MCP інструменти.md @@ -28,12 +28,14 @@ created: 2026-07-14 | `project_get_state` | `projectName` | Останній стан сесії + project items | | `project_save_state` | `projectName`, `sessionSummary`, `todoJson`, `changes`, `bugs`, `architectureNotes` | Збереження стану сесії | -## Скіли для Claude Code (подібно до наявних) +## Скіли для Claude Code ✅ (реалізовано 2026-07-14) + +Канонічні копії — у `claude-skills/`, інстальовані в `~/.claude/commands/`. Сервер зареєстровано в user-конфігурації Claude Code як `ai-memory-network` (ім'я `ai-memory` зайняте старим сервером на 8765). - `/mem-start` — вибір проекту + відновлення контексту -- `/mem-save` — збереження стану сесії +- `/mem-save` — збереження стану сесії (+ пропозиція зберегти довговічні факти окремими записами) - `/mem-note` — швидке збереження факту/нотатки в пам'ять -- `/mem-find` — пошук у пам'яті +- `/mem-find` — пошук у пам'яті (+ перегляд запису і графа зв'язків) ## Резерв на майбутнє (фаза 2+) diff --git a/Roadmap.md b/Roadmap.md index a6254d6..990849f 100644 --- a/Roadmap.md +++ b/Roadmap.md @@ -21,11 +21,13 @@ created: 2026-07-14 - [x] Portainer stack: ai-memory-server (порт 8767) + ai-memory-db (PostgreSQL 18, `pgvector/pgvector:pg18`) ✅ 2026-07-14 - [x] Ініціалізація бази `ai_memory` + `CREATE EXTENSION vector;` (авто-міграції при старті) ✅ 2026-07-14 - [x] e2e перевірка: healthz, auth 401, tools/list, повний цикл project/memory, UTF-8 roundtrip, FTS українською ✅ 2026-07-14 -- [ ] Підключення Claude Code до endpoint (`.mcp.json` / mcp add) +- [x] Підключення Claude Code до endpoint: сервер `ai-memory-network` у user-конфігурації (`claude mcp add`) ✅ 2026-07-14 ## Фаза 3 — Скіли Claude Code -- [ ] `/mem-start`, `/mem-save`, `/mem-note`, `/mem-find` ([[MCP інструменти]]) +- [x] `/mem-start`, `/mem-save`, `/mem-note`, `/mem-find` ([[MCP інструменти]]) ✅ 2026-07-14 + Канонічні копії — у `claude-skills/` цього репозиторію, інстальовані в `~/.claude/commands/`. + PowerShell-запаска в скілах передає тіло як UTF-8 байти (`UTF8.GetBytes`) — перевірено кирилицею. ## Фаза 4 — Окремий воркфлоу: Ollama (після завершення фаз 1–3) diff --git a/claude-skills/mem-find.md b/claude-skills/mem-find.md new file mode 100644 index 0000000..617b7a3 --- /dev/null +++ b/claude-skills/mem-find.md @@ -0,0 +1,29 @@ +# Пам'ять: пошук + +Працюємо з MCP-сервером **ai-memory-network** (`http://192.168.0.199:8767/mcp`). + +Знайди записи в пам'яті. Пошуковий запит — в ARGUMENTS; якщо порожньо — запитай користувача, що шукаємо. + +Виконай наступні дії: + +1. Виклич `mcp__ai-memory-network__memory_query` з `query`. За замовчуванням шукай по всій пам'яті (без `projectName`); якщо користувач явно обмежив пошук проектом — передай `projectName`. За потреби звузь через `type`. Якщо інструмент недоступний — HTTP workaround (див. нижче) з `name = "memory_query"`. + +2. Відобрази результати таблицею: id, тип, заголовок, проект, фрагмент. Якщо нічого не знайдено — спробуй переформулювати запит (синоніми, інша словоформа) і повтори; повідом користувачу обидва запити. + +3. Запитай, чи розкрити якийсь запис повністю. Для повного перегляду виклич `memory_get` (поверне також зв'язки запису); для огляду сусідів по графу — `memory_graph` з `id` та `depth`. + +## HTTP workaround (PowerShell) + +```powershell +$body = @{ + jsonrpc = "2.0"; id = 1; method = "tools/call" + params = @{ name = ""; arguments = @{ } } +} | ConvertTo-Json -Depth 6 +$bytes = [System.Text.Encoding]::UTF8.GetBytes($body) +(Invoke-WebRequest -Uri "http://192.168.0.199:8767/mcp" -Method POST ` + -Body $bytes -ContentType "application/json; charset=utf-8" ` + -Headers @{ Accept = "application/json, text/event-stream"; Authorization = "Bearer amk_477a49815af5b1790e6d35f565f5cc50ccb9a02cf89bf908" } ` + -TimeoutSec 15).Content +``` + +ВАЖЛИВО: тіло запиту завжди передавати як UTF-8 байти (`UTF8.GetBytes`), інакше кирилиця зіпсується. diff --git a/claude-skills/mem-note.md b/claude-skills/mem-note.md new file mode 100644 index 0000000..2087958 --- /dev/null +++ b/claude-skills/mem-note.md @@ -0,0 +1,36 @@ +# Пам'ять: швидка нотатка + +Працюємо з MCP-сервером **ai-memory-network** (`http://192.168.0.199:8767/mcp`). + +Збережи факт/нотатку в пам'ять. Текст нотатки — в ARGUMENTS; якщо ARGUMENTS порожні — сформуй нотатку з ключового висновку поточної розмови і покажи користувачу перед збереженням. + +Виконай наступні дії: + +1. Сформуй запис: + - `title` — короткий заголовок (до 80 символів) + - `content` — повний текст нотатки у markdown + - `type` — `fact` (факт/рішення), `note` (робоча нотатка), `entity` (людина/сервіс/пристрій) — обери за змістом + - `projectName` — якщо нотатка стосується проекту, відомого з контексту; інакше не передавай (глобальний scope) + - `metadata` — за потреби: теги, джерело + +2. Виклич `mcp__ai-memory-network__memory_save`. Якщо інструмент недоступний — HTTP workaround (див. нижче) з `name = "memory_save"`. + +3. Якщо нотатка логічно пов'язана з існуючими записами (перевір через `memory_query` за ключовими словами) — запропонуй зв'язати через `memory_link`. + +4. Підтверди збереження: id запису, scope (проект/глобальний). + +## HTTP workaround (PowerShell) + +```powershell +$body = @{ + jsonrpc = "2.0"; id = 1; method = "tools/call" + params = @{ name = ""; arguments = @{ } } +} | ConvertTo-Json -Depth 6 +$bytes = [System.Text.Encoding]::UTF8.GetBytes($body) +(Invoke-WebRequest -Uri "http://192.168.0.199:8767/mcp" -Method POST ` + -Body $bytes -ContentType "application/json; charset=utf-8" ` + -Headers @{ Accept = "application/json, text/event-stream"; Authorization = "Bearer amk_477a49815af5b1790e6d35f565f5cc50ccb9a02cf89bf908" } ` + -TimeoutSec 15).Content +``` + +ВАЖЛИВО: тіло запиту завжди передавати як UTF-8 байти (`UTF8.GetBytes`), інакше кирилиця зіпсується. diff --git a/claude-skills/mem-save.md b/claude-skills/mem-save.md new file mode 100644 index 0000000..f725ce5 --- /dev/null +++ b/claude-skills/mem-save.md @@ -0,0 +1,38 @@ +# Пам'ять: збереження сесії + +Працюємо з MCP-сервером **ai-memory-network** (`http://192.168.0.199:8767/mcp`). + +Виконай наступні дії: + +1. Визнач проект: якщо відомий з контексту розмови — використай його; інакше виклич `mcp__ai-memory-network__project_list` і запитай користувача. Якщо проекту ще немає — запропонуй створити через `project_create` (`projectName` у kebab-case, `summary`). + +2. На основі поточної сесії сформуй: + - `sessionSummary` — 2-4 речення: що зроблено, які рішення прийнято + - `todoJson` — актуальний список задач: `{ tasks: [{ task, priority: "high|medium|low", note?, done? }] }` (виконані познач `done: true` або прибери; додай нові) + - `changes` — які файли/конфіги/сервіси змінено у цій сесії + - `bugs` — нові або невирішені проблеми + - `architectureNotes` — нові архітектурні рішення чи уточнення (якщо є) + +3. Покажи підготовлені дані користувачу для підтвердження. + +4. Після підтвердження виклич `mcp__ai-memory-network__project_save_state` з цими даними. Якщо інструмент недоступний — HTTP workaround (див. нижче) з `name = "project_save_state"`. + +5. Якщо у сесії з'явилися довговічні факти, варті окремих записів пам'яті (рішення, конфіги, граблі) — запропонуй зберегти їх через `memory_save` (type: `fact`, з `projectName`), за бажанням — зв'язати між собою через `memory_link`. + +6. Підтверди збереження (session_id, кількість збережених записів). + +## HTTP workaround (PowerShell) + +```powershell +$body = @{ + jsonrpc = "2.0"; id = 1; method = "tools/call" + params = @{ name = ""; arguments = @{ } } +} | ConvertTo-Json -Depth 6 +$bytes = [System.Text.Encoding]::UTF8.GetBytes($body) +(Invoke-WebRequest -Uri "http://192.168.0.199:8767/mcp" -Method POST ` + -Body $bytes -ContentType "application/json; charset=utf-8" ` + -Headers @{ Accept = "application/json, text/event-stream"; Authorization = "Bearer amk_477a49815af5b1790e6d35f565f5cc50ccb9a02cf89bf908" } ` + -TimeoutSec 15).Content +``` + +ВАЖЛИВО: тіло запиту завжди передавати як UTF-8 байти (`UTF8.GetBytes`), інакше кирилиця зіпсується. diff --git a/claude-skills/mem-start.md b/claude-skills/mem-start.md new file mode 100644 index 0000000..bc57c07 --- /dev/null +++ b/claude-skills/mem-start.md @@ -0,0 +1,35 @@ +# Пам'ять: старт сесії + +Працюємо з MCP-сервером **ai-memory-network** (`http://192.168.0.199:8767/mcp`). + +Виконай наступні дії: + +1. Виклич інструмент `mcp__ai-memory-network__project_list`. Якщо інструмент недоступний (`No such tool available`) — використай HTTP workaround (див. нижче) з `name = "project_list"`, `arguments = @{}`. + +2. Відобрази список проектів таблицею (назва, статус, кількість записів пам'яті, дата оновлення). Запитай, з яким проектом працюємо; запропонуй найактуальніший за `updated_at`. Якщо проект вже очевидний з контексту розмови — використай його без запитання. + +3. Для обраного проекту виклич `mcp__ai-memory-network__project_get_state` з `projectName`. + +4. Відобрази відновлений контекст: + - `last_session.session_summary` — що робили минулої сесії + - `last_session.todo_json.tasks` — відкриті задачі за пріоритетом (high → medium → low), виконані (`done: true`) — окремо + - `last_session.changes`, `bugs`, `architecture_notes` + - `recent_memories` — останні записи пам'яті проекту + +5. Запитай, з чого починаємо сьогодні. + +## HTTP workaround (PowerShell) + +```powershell +$body = @{ + jsonrpc = "2.0"; id = 1; method = "tools/call" + params = @{ name = ""; arguments = @{ } } +} | ConvertTo-Json -Depth 6 +$bytes = [System.Text.Encoding]::UTF8.GetBytes($body) +(Invoke-WebRequest -Uri "http://192.168.0.199:8767/mcp" -Method POST ` + -Body $bytes -ContentType "application/json; charset=utf-8" ` + -Headers @{ Accept = "application/json, text/event-stream"; Authorization = "Bearer amk_477a49815af5b1790e6d35f565f5cc50ccb9a02cf89bf908" } ` + -TimeoutSec 15).Content +``` + +ВАЖЛИВО: тіло запиту завжди передавати як UTF-8 байти (`UTF8.GetBytes`), інакше кирилиця зіпсується.