npm package: @injurkx/obsidian-scrapper
Description: CLI tool to generate obsidian files tree.
Author: injurka
Latest version: 1.0.0

# Obsidian Scrapper CLI

CLI утилита для трансформации базы знаний Obsidian в структурированный API (JSON + Markdown) для использования в статических сайтах и веб-приложениях.

Инструмент обрабатывает заметки, разрешает внутренние ссылки (`[[WikiLinks]]`), строит граф знаний, индексы поиска и обратные ссылки.

## ✨ Возможности

- 🔗 **Разрешение ссылок:** Преобразует Obsidian ссылки `[[Link|Alias]]` в веб-совместимые пути.
- 🏷 **Парсинг тегов:** Извлекает теги из YAML frontmatter (`tags: [...]`) и из текста (`#tag`).
- 🌳 **Дерево навигации:** Генерирует иерархический `nav.json` для построения меню.
- 🔎 **Поисковый индекс:** Создает `search.json` с очищенным контентом для Fuzzy-поиска.
- 🕸 **Граф знаний:** Формирует `graph.json` (узлы и связи) для визуализации.
- 🔙 **Обратные ссылки:** Собирает список `backlinks` для каждой заметки.
- 🖼 **Обработка медиа:** Копирует и организует изображения.

## 📦 Установка

Можно использовать без установки через `npx` / `bunx` или установить глобально.

```bash
# Использование через bunx
bunx obsidian-scrapper-cli

# Глобальная установка
npm install -g obsidian-scrapper-cli
# или
bun add -g obsidian-scrapper-cli
```

## 🚀 Использование

Перейдите в корневую директорию вашего проекта (где лежит конфиг или папка `.obsidian`) и запустите команду:

```bash
obsidian-scrapper
```

### Аргументы

```bash
obsidian-scrapper [root] [options]
```

- `root` — Путь к корневой директории проекта (по умолчанию текущая).
- `-c, --config <file>` — Путь к файлу конфигурации (по умолчанию ищет `obsidian-scraper.config.ts`).
- `--output <dir>` — Переопределить папку вывода контента.
- `-h, --help` — Показать справку.
- `-v, --version` — Показать версию.

## ⚙️ Конфигурация

Создайте файл `obsidian-scraper.config.ts` в корне проекта.

```typescript
import { defineConfig } from 'obsidian-scrapper-cli'

export default defineConfig({
  paths: {
    // Где лежат исходные заметки (обычно корень)
    sourceNotesRoot: '.',

    // Файл экспорта метаданных из плагина Obsidian
    sourceDataFile: '.obsidian/export/output-md.json',

    // Глобальные ресурсы
    globalImageSource: '.obsidian/export/images',
    metaSource: '.obsidian/export/meta',

    // Куда сохранять результат
    outputContentRoot: '.output/content',
    outputImageRoot: '.output/images',
    outputMetaRoot: '.output/meta',
  },
  ignore: {
    // Папки, которые нужно пропустить
    folders: ['Private', 'Drafts']
  }
})
```

> **Примечание:** Утилита использует `c12` для загрузки конфигов, поэтому поддерживаются форматы `.ts`, `.js`, `.json`.

## 📂 Структура выходных данных

После работы утилита создаст следующую структуру в папке `.output` (или указанной вами):

```
.output/
├── content/               # Обработанные Markdown файлы и навигация
│   ├── VaultName/
│   │   ├── Folder/
│   │   │   └── Note.md
│   │   └── index.md
│   └── nav.json           # Глобальная структура навигации
├── images/                # Все изображения (плоская структура или как настроено)
└── meta/                  # Метаданные для приложения
    └── VaultName/
        ├── tree.json      # Дерево файлов конкретного хранилища
        ├── search.json    # Индекс для поиска
        ├── graph.json     # Данные для графа (nodes/links)
        └── backlinks.json # Обратные ссылки
```

### Формат данных

**`search.json`**:

```json
[
  {
    "id": "/Vault/Note",
    "title": "Заголовок заметки",
    "url": "/Vault/Note",
    "content": "Очищенный текст заметки...",
    "tags": ["tag1", "tag2"]
  }
]
```

**`nav.json` / `tree.json`**:

```json
[
  {
    "sysname": "Note",
    "title": "Человекочитаемый заголовок",
    "type": "file",
    "meta": {
      "words": 500,
      "readingTime": 3,
      "lastModified": "2024-02-04T..."
    }
  }
]
```

## 🛠 Требования к Obsidian

Для корректной работы утилита ожидает наличие файла `sourceDataFile` (по умолчанию `.obsidian/export/output-md.json`), который содержит список файлов и настройки навигации.

Это предполагает использование специфического плагина экспорта или скрипта внутри Obsidian, который подготавливает первичный JSON манифест.

## 👨‍💻 Разработка

```bash
# Установка зависимостей
bun install

# Запуск в режиме разработки
bun run dev

# Сборка
bun run build

# Линтинг
bun run lint
```