No description
  • Go 78.9%
  • TypeScript 11.8%
  • HTML 5.1%
  • SCSS 4.1%
  • Dockerfile 0.1%
Find a file
Ymnuk 3850d55355
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
Добавление таймаутов в ner и embedding
2026-06-13 14:50:15 +03:00
.vscode Добавление исключений директорий из сканирования 2026-05-29 10:33:26 +03:00
cmd/cabmem Тесты 2026-05-29 08:59:25 +03:00
docs Добавление таймаутов в ner и embedding 2026-06-13 14:50:15 +03:00
frontend Отправка сразу нескольких сообщений и исправление кнопки "удалить" сообщение 2026-06-09 11:58:55 +03:00
internal Добавление таймаутов в ner и embedding 2026-06-13 14:50:15 +03:00
testdata/articles Интеграционные тесты на основе переменных окружений 2026-05-21 10:01:59 +03:00
.dockerignore Исправление ошибки сборки 2026-05-28 12:33:44 +03:00
.gitignore Исправление олтображения графа документов 2026-06-07 09:22:54 +03:00
.woodpecker.yml Исправление сборки и определение текущего репозитория 2026-06-10 12:06:10 +03:00
Dockerfile Изменение флага указания пути 2026-06-10 10:35:32 +03:00
generate.go Формирование документации OpenAPI 2026-05-25 11:30:10 +03:00
go.mod Индексация тела заметок 2026-06-10 09:22:11 +03:00
go.sum Индексация тела заметок 2026-06-10 09:22:11 +03:00
LICENSE first commit 2026-05-15 12:10:45 +03:00
nfpm.yaml Добавление сборки пакетов 2026-06-10 10:55:56 +03:00
README.md Обновление README.md 2026-06-08 12:26:12 +03:00

cabmem

cabmem (cabinet memory) — система систематизации и обработки личного архива знаний. Альтернативное название: Palace of the Mind / Чертоги разума.

Хранение — иерархия Markdown-файлов с YAML frontmatter. Два интерфейса: CLI и Angular SPA (встраивается в единый бинарник).

Возможности

  • Управление заметками — создание, редактирование, удаление, перемещение, дублирование
  • Frontmatter — автоматическое заполнение (ID, даты), LLM-генерация (summary, tags, keywords, language), NER-извлечение графа знаний
  • Иерархическая структура — дерево директорий, навигация, flat-просмотр
  • Семантический поиск — embedding-поиск (косинусная близость) + фильтрация по метаданным
  • Граф знаний — извлечение сущностей и связей через NER, локальные графы документов, глобальная агрегация, визуализация (D3.js)
  • Теги — ручное и авто-тегирование, облако тегов, фильтрация
  • Связи — ручные (frontmatter links, wikilinks), автоматические (семантические, через общие сущности)
  • Dataset — табличные данные в frontmatter, внешних файлах или внешних БД (SQLite/PostgreSQL/MySQL) с импортом/экспортом
  • Импорт/экспорт — Markdown, HTML→Markdown, буфер обмена, пакетный импорт директорий, дедупликация по SHA256
  • CLI — полный набор команд (new, edit, delete, move, list, search, show, import, export, index, ner, llm, dataset, sync, backup, doctor, serve)
  • Web UI — Angular SPA: просмотр/редактирование заметок, дерево архива, поиск, граф знаний, датасеты, чат с LLM (с MCP-инструментами), Swagger UI
  • MCP-серверы — подключение сторонних инструментов через stdio (локальные процессы) и StreamableHTTP (удалённые серверы)
  • Интернационализация — русский/английский, переключение языка без перезагрузки страницы
  • Watcher — авто-синхронизация БД с файловой системой через fsnotify
  • Git-friendly — человекочитаемые diff'ы, файлы открываются в любом редакторе

Архитектура

cabmem/
├── cmd/cabmem/          # Точка входа (единый бинарник)
├── internal/
│   ├── cli/             # CLI-команды (go-simple-args)
│   ├── api/             # REST API (Echo, JSON)
│   ├── core/            # Бизнес-логика
│   │   ├── note/        # CRUD заметок
│   │   ├── frontmatter/ # Парсинг/генерация YAML
│   │   ├── linker/      # Связи между заметками
│   │   ├── tag/         # Теги
│   │   ├── embedding/   # Векторизация + косинусный поиск
│   │   ├── knowledgegraph/ # Глобальный граф знаний
│   │   └── logging/     # JSONL-логирование
│   ├── storage/         # FS (md-файлы) + DB (GORM → SQLite)
│   ├── llm/             # LLM-клиент (llm-simple-api)
│   ├── ner/             # HTTP-клиент NER-сервиса
│   └── ui/              # REST-хендлеры + встроенная SPA
├── frontend/            # Angular SPA
│   ├── public/assets/i18n/ # Словари перевода (ru.json, en.json)
│   └── src/app/
│       ├── services/translation.service.ts  # Локализация (Runtime i18n)
│       └── pipes/translate.pipe.ts          # PIPE-шаблон для перевода
└── docs/                # Документация

Внешние сервисы

Сервис Репозиторий Назначение
NER https://git.ymnuktech.ru/ymnuk/service-ner.git Извлечение сущностей и связей из текста (эндпоинт POST /kg)
Embedding https://git.ymnuktech.ru/ymnuk/service-embedding.git Генерация векторных представлений текста
LLM Любой OpenAI-совместимый провайдер Генерация summary, tags, keywords, language

LLM может использовать любого OpenAI-совместимого провайдера. Испытания проводились на LM Studio с моделями:

  • qwen3.5-2b (дефолт, быстрая)
  • google/gemma-4-e2b (рекомендуется для русского языка)

MCP-серверы

Поддержка сторонних MCP-серверов для расширения возможностей чат-агента:

Транспорт Описание Пример
stdio Запуск локального процесса (stdin/stdout) {"command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"]}
StreamableHTTP HTTP POST + SSE (удалённый сервер) {"url": "http://mcp-searxng:3000/mcp", "timeout_sec": 300}

Настройка — через переменную окружения CABMEM_MCP (JSON) или settings.json:

export CABMEM_MCP='{"servers":[{"name":"searxng","transport":"http","url":"http://mcp-searxng:3000/mcp","timeout_sec":300}]}'

Инструменты MCP-серверов динамически регистрируются в чат-агенте и отображаются в UI (диалог настройки инструментов). Поддерживается автоматическое переподключение при потере соединения.

Быстрый старт

# 1. Инициализация архива
cabmem init --path ~/.cabmem

# 2. Настройка .env
#    CABMEM_SERVICES_NER_URL=http://ner:8000
#    CABMEM_EMBEDDING_URL=http://embedding:8000
#    CABMEM_LLM_BASE_URL=http://localhost:1234/v1  # LM Studio

# 3. Создание заметки
cabmem new "Моя первая заметка" --type article

# 4. Запуск веб-сервера
cabmem serve

# 5. Семантический поиск
cabmem search "поисковый запрос"

Конфигурация

Настройки — два файла в корне архива:

  • settings.json — публичные настройки (пути, адреса сервисов, модели). Безопасен для коммита.
  • .env — секреты (API ключи, пароли). Добавляется в .gitignore.

Приоритет: CLI флаги > .env > settings.json > значения по умолчанию.

{
  "archive": { "path": "~/.cabmem" },
  "server": { "host": "localhost", "port": 3000 },
  "services": {
    "ner": { "url": "http://ner:8000" }
  },
  "embedding": {
    "url": "http://embedding:8000",
    "model": "nomic-embed-text"
  },
  "llm": {
    "provider": "ollama",
    "base_url": "http://localhost:11434/v1",
    "model": "qwen3.5-2b"
  },
  "logging": { "level": "info", "file": "cabmem.log.jsonl" }
}

Сборка

# Без фронтенда
CGO_ENABLED=0 go build -o cabmem ./cmd/cabmem/

# С фронтендом
cd frontend && npm ci && npm run build -- --output-path=dist
rm -rf ../internal/ui/embed/* && cp -r dist/* ../internal/ui/embed/
cd .. && CGO_ENABLED=0 go build -o cabmem ./cmd/cabmem/

Технологии

Компонент Технология
Язык Go 1.26+
CLI go-simple-args
БД GORM + SQLite (modernc.org/sqlite, без CGo)
Веб-сервер labstack/echo
Фронтенд Angular + Angular Material
LLM llm-simple-api (OpenAI-совместимые провайдеры)
NER service-ner (HTTP/JSON, эндпоинт POST /kg)
Embedding service-embedding (OpenAI-совместимый API)
MCP github.com/modelcontextprotocol/go-sdk (stdio / StreamableHTTP)
Перевод Собственный TranslationService + JSON-словари (ru/en)
CI/CD WoodpeckerCI
Лицензия MIT

Документация

Полная документация — в docs/: