Observed since 20 Oct, 19:18 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
2shark
Скрипт для сканирования документации и формирования PostgreSQL базы данных
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();
# 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 для такого сценария запрещён.
Каждый запуск 2shark import теперь фиксируется в таблице import_jobs со статусами lifecycle:
pendingrunningsuccessfailedВ import_jobs сохраняются branch, commit_sha, started_at, finished_at, а также result или error.
Это позволяет быстро определить:
total/created/updated/skipped/archived).Начиная с db-0006, production sync использует reconcile по uid:
is_deleted=true);uid, она автоматически восстанавливается в active состояние;import_jobs.result.archived.Базовый SQL-фильтр для runtime read model:
SELECT *
FROM articles
WHERE is_deleted = false;
Канонический сценарий 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;Smoke-checklist после интеграции:
main запускает workflow;import_job со статусом success;import_job со статусом failed;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 используется для настройки маппинга технологий к специальностям и определения приоритетов при сканировании документации.
Создайте файл 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: Контейнеризация приложений
| Параметр | Тип | Описание | Пример |
|---|---|---|---|
specialty | string | Область специализации | Frontend, Backend, DevOps |
priority | number | Приоритет (1-10, где 10 - высший) | 5 |
description | string | Краткое описание технологии | "Основы 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 # Главный экспорт
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
pgEnvironment{
"local_name": "pg",
"alias": false,
"peer_metadata": null
} | ^8.11.3 | runtime |
markedEnvironment{
"local_name": "marked",
"alias": false,
"peer_metadata": null
} | ^9.1.6 | runtime |
js-yamlEnvironment{
"local_name": "js-yaml",
"alias": false,
"peer_metadata": null
} | ^4.1.0 | runtime |
commanderEnvironment{
"local_name": "commander",
"alias": false,
"peer_metadata": null
} | ^11.1.0 | runtime |
gray-matterEnvironment{
"local_name": "gray-matter",
"alias": false,
"peer_metadata": null
} | ^4.0.3 | runtime |
jestEnvironment{
"local_name": "jest",
"alias": false,
"peer_metadata": null
} | ^29.7.0 | development |
huskyEnvironment{
"local_name": "husky",
"alias": false,
"peer_metadata": null
} | ^8.0.3 | development |
esbuildEnvironment{
"local_name": "esbuild",
"alias": false,
"peer_metadata": null
} | ^0.25.8 | development |
ts-jestEnvironment{
"local_name": "ts-jest",
"alias": false,
"peer_metadata": null
} | ^29.4.0 | development |
ts-nodeEnvironment{
"local_name": "ts-node",
"alias": false,
"peer_metadata": null
} | ^10.9.0 | development |
@types/pgEnvironment{
"local_name": "@types/pg",
"alias": false,
"peer_metadata": null
} | ^8.10.9 | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^5.3.0 | development |
@types/jestEnvironment{
"local_name": "@types/jest",
"alias": false,
"peer_metadata": null
} | ^30.0.0 | development |
@types/nodeEnvironment{
"local_name": "@types/node",
"alias": false,
"peer_metadata": null
} | ^20.10.0 | development |
ts-node-devEnvironment{
"local_name": "ts-node-dev",
"alias": false,
"peer_metadata": null
} | ^2.0.0 | development |
@types/js-yamlEnvironment{
"local_name": "@types/js-yaml",
"alias": false,
"peer_metadata": null
} | ^4.0.9 | development |
@changesets/cliEnvironment{
"local_name": "@changesets/cli",
"alias": false,
"peer_metadata": null
} | ^2.25.0 | development |
@changesets/get-github-infoEnvironment{
"local_name": "@changesets/get-github-info",
"alias": false,
"peer_metadata": null
} | ^0.5.1 | development |
Source distribution
{
"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
}Observed since 20 Oct, 19:18 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:1f0bc84be3b8dccf141ed551869f8cedff2e8571ddbbf32e9c2a77b9bdd0aca1