Catalog npm
Back to packageRELEASE DETAILS

1.0.0

npm

2shark

Скрипт для сканирования документации и формирования PostgreSQL базы данных

clidatabasedocsmarkdownpostgresql
Published2 Aug 2025
Direct dependencies18
Transitive dependenciesNot calculated

README

Current package documentation

2shark

2shark - это TypeScript библиотека и CLI инструмент для автоматического сканирования Markdown документации и формирования PostgreSQL базы данных.

Установка

npm install 2shark

или для использования CLI

npm install -g 2shark

Использование как пакет

Импорт и использование в коде

import { runImport, initDatabase, clearDatabase } from '2shark';

// Импорт документации из git-ревизии
const result = await runImport({
  docsPath: './docs',
  configDir: './config',
  repoPath: '../my-interview.tech',
  branch: 'main',
  commitSha: '<sha>',
  isProductionSync: true,
});

console.log(`Сохранено ${result.saved} документов`);

// Инициализация базы данных
await initDatabase();

// Очистка базы данных
await clearDatabase();

Использование как CLI

# Production import entrypoint
2shark import --branch main --commit-sha <sha> --production-sync

# Сканировать с кастомными путями
2shark import -p ./docs -c ./config --repo-path ../my-interview.tech --branch main --commit-sha <sha> --production-sync

# Проверить изменения без записи
2shark import --check-only --branch main --commit-sha <sha> --production-sync

# Импортировать все файлы без diff
2shark import --force --branch main --commit-sha <sha> --production-sync

# Инициализировать базу данных
2shark init-db

# Очистить базу данных
2shark clear-db

Для production sync automation ожидается branch=main; флаг --clear для такого сценария запрещён.

Import observability

Каждый запуск 2shark import теперь фиксируется в таблице import_jobs со статусами lifecycle:

  • pending
  • running
  • success
  • failed

В import_jobs сохраняются branch, commit_sha, started_at, finished_at, а также result или error. Это позволяет быстро определить:

  • последний успешный импорт;
  • последнюю ошибку импорта и ревизию, на которой она произошла;
  • summary по обработанным документам (total/created/updated/skipped/archived).

Soft delete / archive reconcile

Начиная с db-0006, production sync использует reconcile по uid:

  • статьи, отсутствующие в новой published revision, помечаются как архивные (is_deleted=true);
  • physical delete для production read model не используется;
  • если статья возвращается в следующей revision с тем же uid, она автоматически восстанавливается в active состояние;
  • archive-операция фиксируется в import_jobs.result.archived.

Базовый SQL-фильтр для runtime read model:

SELECT *
FROM articles
WHERE is_deleted = false;

Production sync from my-interview.tech

Канонический сценарий db-0005: workflow запускается в репозитории my-interview.tech на push в main.

name: production-sync

on:
  push:
    branches:
      - main

jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install 2shark
        run: npm install -g 2shark

      - name: Run production sync
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
        run: |
          2shark import \
            --path ./docs \
            --config ./scripts/frontmatter/config \
            --repo-path . \
            --branch main \
            --commit-sha ${{ github.sha }} \
            --production-sync

Требования к интеграции:

  • передавать фактический ${{ github.sha }} опубликованной ревизии;
  • хранить DATABASE_URL (или DB_*) только в secrets;
  • не печатать secrets в logs;
  • при failed import workflow должен завершаться с ошибкой (exit code != 0).

Smoke-checklist после интеграции:

  • merge/push в main запускает workflow;
  • запуск из feature branch не пишет в production DB;
  • успешный запуск создаёт import_job со статусом success;
  • ошибочный запуск создаёт import_job со статусом failed;
  • rerun того же commitSha не создаёт дубли в read model.

Разработка

Сборка

Проект использует esbuild для быстрой сборки:

npm run build

Структура документации

docs/
├── Frontend/
│   ├── React/
│   │   ├── hooks.md
│   │   └── components.md
│   └── TypeScript/
│       └── types.md
└── Backend/
    ├── Node.js/
    │   └── api.md
    └── Database/
        └── postgresql.md

Конфигурация специальностей

Файл config/category-mapping.yaml используется для настройки маппинга технологий к специальностям и определения приоритетов при сканировании документации.

Назначение

  • Категоризация технологий - связывает технологии с областями (Frontend, Backend, DevOps и т.д.)
  • Приоритизация контента - определяет важность технологий для отображения
  • Автоматическая классификация - помогает системе правильно категоризировать найденные документы

Структура конфигурации

Создайте файл config/category-mapping.yaml:

React:
  specialty: Frontend
  priority: 5
  description: Основы React

TypeScript:
  specialty: Frontend
  priority: 6
  description: Типизированный JavaScript

Node.js:
  specialty: Backend
  priority: 1
  description: JavaScript runtime для сервера

PostgreSQL:
  specialty: Database
  priority: 3
  description: Реляционная база данных

Docker:
  specialty: DevOps
  priority: 4
  description: Контейнеризация приложений

Параметры конфигурации

ПараметрТипОписаниеПример
specialtystringОбласть специализацииFrontend, Backend, DevOps
prioritynumberПриоритет (1-10, где 10 - высший)5
descriptionstringКраткое описание технологии"Основы React"

Управление конфигурацией

Добавление новой технологии

Vue.js:
  specialty: Frontend
  priority: 4
  description: Прогрессивный JavaScript фреймворк

Изменение приоритета

React:
  specialty: Frontend
  priority: 8 # Увеличен приоритет
  description: Основы React

Создание новой специальности

Machine Learning:
  specialty: AI
  priority: 7
  description: Машинное обучение и ИИ

Автоматическое применение

Конфигурация автоматически применяется при:

  • Импорте документации (2shark import)
  • Инициализации базы данных (2shark init-db)
  • Обновлении существующих записей

Примеры использования

# Импорт с кастомной конфигурацией
2shark import -c ./my-config.yaml --branch main --commit-sha <sha>

# Проверка конфигурации
cat config/category-mapping.yaml | yq eval '.'

# Валидация структуры
node -e "const yaml = require('js-yaml'); const fs = require('fs'); console.log(yaml.load(fs.readFileSync('config/category-mapping.yaml', 'utf8')));"

Типы

interface DocItem {
  id: string;
  title: string;
  content: string;
  specialty: string;
  technology: string;
  priority: number;
  description: string;
  tags: string[];
  created_at: Date;
  updated_at: Date;
}

interface ScanOptions {
  docsPath?: string;
  configPath?: string;
  databaseUrl?: string;
  clearBeforeScan?: boolean;
}

Структура проекта

src/
├── cli/                    # CLI интерфейс
│   ├── index.ts           # Точка входа CLI
│   └── cli.ts             # Основная логика CLI
├── config/                 # Конфигурация
│   └── index.ts           # Настройки БД
├── database/              # Работа с базой данных
│   ├── class/             # Классы для работы с БД
│   └── lib/               # Утилиты для БД
├── docScanner/            # Парсинг markdown и frontmatter
├── types/                 # TypeScript типы
│   └── index.ts           # Основные типы
└── index.ts               # Главный экспорт

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 18

Native requirements
18 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
pg
Environment
{
  "local_name": "pg",
  "alias": false,
  "peer_metadata": null
}
^8.11.3runtime
marked
Environment
{
  "local_name": "marked",
  "alias": false,
  "peer_metadata": null
}
^9.1.6runtime
js-yaml
Environment
{
  "local_name": "js-yaml",
  "alias": false,
  "peer_metadata": null
}
^4.1.0runtime
commander
Environment
{
  "local_name": "commander",
  "alias": false,
  "peer_metadata": null
}
^11.1.0runtime
gray-matter
Environment
{
  "local_name": "gray-matter",
  "alias": false,
  "peer_metadata": null
}
^4.0.3runtime
jest
Environment
{
  "local_name": "jest",
  "alias": false,
  "peer_metadata": null
}
^29.7.0development
husky
Environment
{
  "local_name": "husky",
  "alias": false,
  "peer_metadata": null
}
^8.0.3development
esbuild
Environment
{
  "local_name": "esbuild",
  "alias": false,
  "peer_metadata": null
}
^0.25.8development
ts-jest
Environment
{
  "local_name": "ts-jest",
  "alias": false,
  "peer_metadata": null
}
^29.4.0development
ts-node
Environment
{
  "local_name": "ts-node",
  "alias": false,
  "peer_metadata": null
}
^10.9.0development
@types/pg
Environment
{
  "local_name": "@types/pg",
  "alias": false,
  "peer_metadata": null
}
^8.10.9development
typescript
Environment
{
  "local_name": "typescript",
  "alias": false,
  "peer_metadata": null
}
^5.3.0development
@types/jest
Environment
{
  "local_name": "@types/jest",
  "alias": false,
  "peer_metadata": null
}
^30.0.0development
@types/node
Environment
{
  "local_name": "@types/node",
  "alias": false,
  "peer_metadata": null
}
^20.10.0development
ts-node-dev
Environment
{
  "local_name": "ts-node-dev",
  "alias": false,
  "peer_metadata": null
}
^2.0.0development
@types/js-yaml
Environment
{
  "local_name": "@types/js-yaml",
  "alias": false,
  "peer_metadata": null
}
^4.0.9development
@changesets/cli
Environment
{
  "local_name": "@changesets/cli",
  "alias": false,
  "peer_metadata": null
}
^2.25.0development
@changesets/get-github-info
Environment
{
  "local_name": "@changesets/get-github-info",
  "alias": false,
  "peer_metadata": null
}
^0.5.1development

Distribution files

1 collected
Distribution 1

Source distribution

Source file
Checksums from source
{
  "shasum": "d0b0ee6624bd86af837e6cc15a210e8d5f2a7211",
  "tarball": "https://registry.npmjs.org/2shark/-/2shark-1.0.0.tgz",
  "fileCount": 78,
  "integrity": "sha512-9brWDAwXQaAa+5sJcakkfz/+6uUa+YKwvjAHuCwmMxnf6+4tG/MMlWszrPRQhyj4MM0IHX1+8i8F4UFFU2sNtQ==",
  "signatures": [
    {
      "sig": "MEYCIQC81UOSQA43etagIBmBokIsjmeGfGUceKI0AvztduKL0AIhAIA8bFwkz3thJBW6Pm7NtzsmdVzg1SY0KCih/Ob2we50",
      "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
    }
  ],
  "unpackedSize": 139880
}

Repository

PENDING
dhim24/2shark

Shared repository data · GitHub

License detected in repository
Not collected

Repository

PENDING
my-interview-tech/2shark

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:18 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:1f0bc84be3b8dccf141ed551869f8cedff2e8571ddbbf32e9c2a77b9bdd0aca1

Other collected versions

3.0.130 May2.0.12 Aug2.0.02 AugView all collected versions →