{"_id":"2shark","_rev":"4-812e352cc09181a71466e6e6227c1c4d","name":"2shark","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.0":{"name":"2shark","version":"1.0.0","keywords":["markdown","docs","postgresql","cli","database"],"author":{"name":"https://github.com/dHIM24"},"license":"MIT","_id":"2shark@1.0.0","maintainers":[{"name":"dhim24","email":"vadim.kalushko@yandex.ru"}],"homepage":"https://github.com/dHIM24/2shark#readme","bugs":{"url":"https://github.com/dHIM24/2shark/issues"},"bin":{"2shark":"dist/cli.js"},"dist":{"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},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"06221aeaa343460ef9fd901b5441e4e192402d9e","scripts":{"lint":"tsc --noEmit","test":"jest","build":"node esbuild.config.js","prepare":"husky","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"tsc --noEmit --pretty","parse-db":"ts-node src/parseDatabase/parseDatabase.ts","changeset":"changeset","test:watch":"jest --watch","build:types":"tsc --emitDeclarationOnly --declaration --outDir dist","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"dhim24","email":"vadim.kalushko@yandex.ru"},"repository":{"url":"git+https://github.com/dHIM24/2shark.git","type":"git"},"_npmVersion":"10.9.2","description":"Скрипт для сканирования документации и формирования PostgreSQL базы данных","directories":{},"_nodeVersion":"23.9.0","dependencies":{"pg":"^8.11.3","marked":"^9.1.6","js-yaml":"^4.1.0","commander":"^11.1.0","gray-matter":"^4.0.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","esbuild":"^0.25.8","ts-jest":"^29.4.0","ts-node":"^10.9.0","@types/pg":"^8.10.9","typescript":"^5.3.0","@types/jest":"^30.0.0","@types/node":"^20.10.0","ts-node-dev":"^2.0.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.25.0","@changesets/get-github-info":"^0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/2shark_1.0.0_1754161926174_0.29643654801291675","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"2shark","version":"2.0.0","keywords":["markdown","docs","postgresql","cli","database"],"author":{"name":"https://github.com/my-interview-tech"},"license":"MIT","_id":"2shark@2.0.0","maintainers":[{"name":"dhim24","email":"vadim.kalushko@yandex.ru"}],"homepage":"https://github.com/my-interview-tech/2shark#readme","bugs":{"url":"https://github.com/my-interview-tech/2shark/issues"},"bin":{"2shark":"dist/cli.js"},"dist":{"shasum":"05284d1a3b9837a64a7717c3024f7c218df6eec4","tarball":"https://registry.npmjs.org/2shark/-/2shark-2.0.0.tgz","fileCount":78,"integrity":"sha512-VMK9zgtgHMG2FUWZuCIvrOAFywHHK6dHcELotyl7XRjnS65VqY1NIP332pJ+OFqSJF2DDaPP0ibLs/IsBF1OEQ==","signatures":[{"sig":"MEQCIDMM/bE6CQjC2jzLoXLxfNDIiEETT7Zm234V5Ch719FbAiBdQZhvKQVDSNOjeDCOyG56cUiw9idNf+ZoxQPi8HMSdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140145},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"57e470c3b662f58c1328eef77fef91c743afb69d","scripts":{"lint":"tsc --noEmit","test":"jest","build":"node esbuild.config.js","prepare":"husky","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"tsc --noEmit --pretty","parse-db":"ts-node src/parseDatabase/parseDatabase.ts","changeset":"changeset","test:watch":"jest --watch","build:types":"tsc --emitDeclarationOnly --declaration --outDir dist","publish:npm":"npm publish --registry https://registry.npmjs.org/","test:coverage":"jest --coverage","prepublishOnly":"npm run build","publish:github":"npm publish --registry https://npm.pkg.github.com/"},"_npmUser":{"name":"dhim24","email":"vadim.kalushko@yandex.ru"},"repository":{"url":"git+https://github.com/my-interview-tech/2shark.git","type":"git"},"_npmVersion":"10.8.2","description":"Скрипт для сканирования документации и формирования PostgreSQL базы данных","directories":{},"_nodeVersion":"18.20.8","dependencies":{"pg":"^8.11.3","marked":"^9.1.6","js-yaml":"^4.1.0","commander":"^11.1.0","gray-matter":"^4.0.3"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","esbuild":"^0.25.8","ts-jest":"^29.4.0","ts-node":"^10.9.0","@types/pg":"^8.10.9","typescript":"^5.3.0","@types/jest":"^30.0.0","@types/node":"^20.10.0","ts-node-dev":"^2.0.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.25.0","@changesets/get-github-info":"^0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/2shark_2.0.0_1754170232630_0.05906412785964443","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"2shark","version":"2.0.1","keywords":["markdown","docs","postgresql","cli","database"],"author":{"name":"https://github.com/my-interview-tech"},"license":"MIT","_id":"2shark@2.0.1","maintainers":[{"name":"dhim24","email":"vadim.kalushko@yandex.ru"}],"homepage":"https://github.com/my-interview-tech/2shark#readme","bugs":{"url":"https://github.com/my-interview-tech/2shark/issues"},"bin":{"2shark":"dist/cli.js"},"dist":{"shasum":"b7f3439faf7955813031cf72cbb604c7a9044c78","tarball":"https://registry.npmjs.org/2shark/-/2shark-2.0.1.tgz","fileCount":78,"integrity":"sha512-GfU+3bbE2sQwGVK3jC8OVXtuoG9Bo1B3oKuh1BqvADfsp+mu0AQ9B5P0OOLFCYOkwn38n9O3P35h0R7BSIEb3w==","signatures":[{"sig":"MEQCIAjvIq0wYqZPg5ckMC0ZFLdsN+rwtGVVTFqct7fPPueuAiAt6rIS3kbD26xm3mpZiBEGgZo2AFKKhYFLhtxm/RsaiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143053},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1a9a517838f5545a6a81575f4fbd18f636dd4f19","scripts":{"lint":"tsc --noEmit","test":"jest","build":"node esbuild.config.js","prepare":"husky","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"tsc --noEmit --pretty","parse-db":"ts-node src/parseDatabase/parseDatabase.ts","changeset":"changeset","test:watch":"jest --watch","build:types":"tsc --emitDeclarationOnly --declaration --outDir dist","publish:npm":"npm publish --registry https://registry.npmjs.org/","test:coverage":"jest --coverage","prepublishOnly":"npm run build","publish:github":"npm publish --registry https://npm.pkg.github.com/"},"_npmUser":{"name":"dhim24","email":"vadim.kalushko@yandex.ru"},"repository":{"url":"git+https://github.com/my-interview-tech/2shark.git","type":"git"},"_npmVersion":"10.8.2","description":"Скрипт для сканирования документации и формирования PostgreSQL базы данных","directories":{},"_nodeVersion":"18.20.8","dependencies":{"pg":"^8.11.3","marked":"^9.1.6","js-yaml":"^4.1.0","commander":"^11.1.0","gray-matter":"^4.0.3"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","esbuild":"^0.25.8","ts-jest":"^29.4.0","ts-node":"^10.9.0","@types/pg":"^8.10.9","typescript":"^5.3.0","@types/jest":"^30.0.0","@types/node":"^20.10.0","ts-node-dev":"^2.0.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.25.0","@changesets/get-github-info":"^0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/2shark_2.0.1_1754172306215_0.7719213417626036","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"2shark","version":"3.0.1","description":"Скрипт для сканирования документации и формирования PostgreSQL базы данных","main":"dist/index.js","types":"dist/index.d.ts","bin":{"2shark":"dist/cli.js"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"scripts":{"build":"npm run build:package","build:package":"node esbuild.config.js","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --declaration --outDir dist","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"tsc --noEmit","lint:fix":"tsc --noEmit --pretty","prepare":"husky install","changeset":"changeset","version":"changeset version","prepublishOnly":"npm run build:package","release":"npm run build && changeset publish","publish:npm":"npm publish --access public --registry https://registry.npmjs.org/","publish:github":"npm publish --registry https://npm.pkg.github.com/"},"dependencies":{"commander":"^11.1.0","gray-matter":"^4.0.3","js-yaml":"^4.1.0","marked":"^9.1.6","pg":"^8.11.3"},"devDependencies":{"@changesets/cli":"^2.25.0","@changesets/get-github-info":"^0.5.1","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/node":"^20.10.0","@types/pg":"^8.10.9","esbuild":"^0.25.8","husky":"^8.0.3","jest":"^29.7.0","ts-jest":"^29.4.0","ts-node":"^10.9.0","ts-node-dev":"^2.0.0","typescript":"^5.3.0"},"author":{"name":"https://github.com/my-interview-tech"},"license":"MIT","homepage":"https://github.com/my-interview-tech/2shark#readme","keywords":["markdown","docs","postgresql","cli","database"],"repository":{"type":"git","url":"git+https://github.com/my-interview-tech/2shark.git"},"bugs":{"url":"https://github.com/my-interview-tech/2shark/issues"},"_id":"2shark@3.0.1","gitHead":"329ebb89c1cd55f34815b76708aa7ea4fd869882","_nodeVersion":"18.20.8","_npmVersion":"10.8.2","dist":{"integrity":"sha512-SJVIXLPneNA/+EHzue8eFpU+zronTpioXO6PoHYF4g7tPaQ3Oa1U5Pe4EXUW0jB6HxLyZ8oDurRa7A6kjZ6gzQ==","shasum":"9f1714b473d8323a02e0874b17cc1dfd4ef7052e","tarball":"https://registry.npmjs.org/2shark/-/2shark-3.0.1.tgz","fileCount":178,"unpackedSize":578998,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHx0Y81ZJzAcR631ff7Xgl1wZr8HkHD3ogkt/kPU0FEVAiEA1EQiBC4kAXkd/Z13rSoQGQvqGuRXdGpdXWTEkQJf4lM="}]},"_npmUser":{"name":"dhim24","email":"vadim.kalushko@yandex.ru"},"directories":{},"maintainers":[{"name":"dhim24","email":"vadim.kalushko@yandex.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/2shark_3.0.1_1780172938439_0.561813478736467"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-02T19:12:06.173Z","modified":"2026-05-30T20:28:58.697Z","1.0.0":"2025-08-02T19:12:06.349Z","2.0.0":"2025-08-02T21:30:32.788Z","2.0.1":"2025-08-02T22:05:06.412Z","3.0.1":"2026-05-30T20:28:58.598Z"},"bugs":{"url":"https://github.com/my-interview-tech/2shark/issues"},"author":{"name":"https://github.com/my-interview-tech"},"license":"MIT","homepage":"https://github.com/my-interview-tech/2shark#readme","keywords":["markdown","docs","postgresql","cli","database"],"repository":{"type":"git","url":"git+https://github.com/my-interview-tech/2shark.git"},"description":"Скрипт для сканирования документации и формирования PostgreSQL базы данных","maintainers":[{"name":"dhim24","email":"vadim.kalushko@yandex.ru"}],"readme":"# 2shark\n\n2shark - это TypeScript библиотека и CLI инструмент для автоматического сканирования Markdown документации и формирования PostgreSQL базы данных.\n\n## Установка\n\n```bash\nnpm install 2shark\n```\n\nили для использования CLI\n\n```bash\nnpm install -g 2shark\n```\n\n## Использование как пакет\n\n### Импорт и использование в коде\n\n```typescript\nimport { runImport, initDatabase, clearDatabase } from '2shark';\n\n// Импорт документации из git-ревизии\nconst result = await runImport({\n  docsPath: './docs',\n  configDir: './config',\n  repoPath: '../my-interview.tech',\n  branch: 'main',\n  commitSha: '<sha>',\n  isProductionSync: true,\n});\n\nconsole.log(`Сохранено ${result.saved} документов`);\n\n// Инициализация базы данных\nawait initDatabase();\n\n// Очистка базы данных\nawait clearDatabase();\n```\n\n### Использование как CLI\n\n```bash\n# Production import entrypoint\n2shark import --branch main --commit-sha <sha> --production-sync\n\n# Сканировать с кастомными путями\n2shark import -p ./docs -c ./config --repo-path ../my-interview.tech --branch main --commit-sha <sha> --production-sync\n\n# Проверить изменения без записи\n2shark import --check-only --branch main --commit-sha <sha> --production-sync\n\n# Импортировать все файлы без diff\n2shark import --force --branch main --commit-sha <sha> --production-sync\n\n# Инициализировать базу данных\n2shark init-db\n\n# Очистить базу данных\n2shark clear-db\n\n```\n\nДля production sync automation ожидается `branch=main`; флаг `--clear` для такого сценария запрещён.\n\n### Import observability\n\nКаждый запуск `2shark import` теперь фиксируется в таблице `import_jobs` со статусами lifecycle:\n\n- `pending`\n- `running`\n- `success`\n- `failed`\n\nВ `import_jobs` сохраняются `branch`, `commit_sha`, `started_at`, `finished_at`, а также `result` или `error`.\nЭто позволяет быстро определить:\n\n- последний успешный импорт;\n- последнюю ошибку импорта и ревизию, на которой она произошла;\n- summary по обработанным документам (`total/created/updated/skipped/archived`).\n\n### Soft delete / archive reconcile\n\nНачиная с `db-0006`, production sync использует reconcile по `uid`:\n\n- статьи, отсутствующие в новой published revision, помечаются как архивные (`is_deleted=true`);\n- physical delete для production read model не используется;\n- если статья возвращается в следующей revision с тем же `uid`, она автоматически восстанавливается в active состояние;\n- archive-операция фиксируется в `import_jobs.result.archived`.\n\nБазовый SQL-фильтр для runtime read model:\n\n```sql\nSELECT *\nFROM articles\nWHERE is_deleted = false;\n```\n\n### Production sync from my-interview.tech\n\nКанонический сценарий `db-0005`: workflow запускается в репозитории `my-interview.tech` на `push` в `main`.\n\n```yaml\nname: production-sync\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  sync:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n\n      - name: Install 2shark\n        run: npm install -g 2shark\n\n      - name: Run production sync\n        env:\n          DATABASE_URL: ${{ secrets.DATABASE_URL }}\n        run: |\n          2shark import \\\n            --path ./docs \\\n            --config ./scripts/frontmatter/config \\\n            --repo-path . \\\n            --branch main \\\n            --commit-sha ${{ github.sha }} \\\n            --production-sync\n```\n\nТребования к интеграции:\n\n- передавать фактический `${{ github.sha }}` опубликованной ревизии;\n- хранить `DATABASE_URL` (или `DB_*`) только в secrets;\n- не печатать secrets в logs;\n- при failed import workflow должен завершаться с ошибкой (exit code != 0).\n\nSmoke-checklist после интеграции:\n\n- merge/push в `main` запускает workflow;\n- запуск из feature branch не пишет в production DB;\n- успешный запуск создаёт `import_job` со статусом `success`;\n- ошибочный запуск создаёт `import_job` со статусом `failed`;\n- rerun того же `commitSha` не создаёт дубли в read model.\n\n## Разработка\n\n### Сборка\n\nПроект использует **esbuild** для быстрой сборки:\n\n```bash\nnpm run build\n```\n\n### Структура документации\n\n```text\ndocs/\n├── Frontend/\n│   ├── React/\n│   │   ├── hooks.md\n│   │   └── components.md\n│   └── TypeScript/\n│       └── types.md\n└── Backend/\n    ├── Node.js/\n    │   └── api.md\n    └── Database/\n        └── postgresql.md\n```\n\n## Конфигурация специальностей\n\nФайл `config/category-mapping.yaml` используется для настройки маппинга технологий к специальностям и определения приоритетов при сканировании документации.\n\n### Назначение\n\n- **Категоризация технологий** - связывает технологии с областями (Frontend, Backend, DevOps и т.д.)\n- **Приоритизация контента** - определяет важность технологий для отображения\n- **Автоматическая классификация** - помогает системе правильно категоризировать найденные документы\n\n### Структура конфигурации\n\nСоздайте файл `config/category-mapping.yaml`:\n\n```yaml\nReact:\n  specialty: Frontend\n  priority: 5\n  description: Основы React\n\nTypeScript:\n  specialty: Frontend\n  priority: 6\n  description: Типизированный JavaScript\n\nNode.js:\n  specialty: Backend\n  priority: 1\n  description: JavaScript runtime для сервера\n\nPostgreSQL:\n  specialty: Database\n  priority: 3\n  description: Реляционная база данных\n\nDocker:\n  specialty: DevOps\n  priority: 4\n  description: Контейнеризация приложений\n```\n\n### Параметры конфигурации\n\n| Параметр      | Тип    | Описание                          | Пример                          |\n| ------------- | ------ | --------------------------------- | ------------------------------- |\n| `specialty`   | string | Область специализации             | `Frontend`, `Backend`, `DevOps` |\n| `priority`    | number | Приоритет (1-10, где 10 - высший) | `5`                             |\n| `description` | string | Краткое описание технологии       | `\"Основы React\"`                |\n\n### Управление конфигурацией\n\n#### Добавление новой технологии\n\n```yaml\nVue.js:\n  specialty: Frontend\n  priority: 4\n  description: Прогрессивный JavaScript фреймворк\n```\n\n#### Изменение приоритета\n\n```yaml\nReact:\n  specialty: Frontend\n  priority: 8 # Увеличен приоритет\n  description: Основы React\n```\n\n#### Создание новой специальности\n\n```yaml\nMachine Learning:\n  specialty: AI\n  priority: 7\n  description: Машинное обучение и ИИ\n```\n\n### Автоматическое применение\n\nКонфигурация автоматически применяется при:\n\n- Импорте документации (`2shark import`)\n- Инициализации базы данных (`2shark init-db`)\n- Обновлении существующих записей\n\n### Примеры использования\n\n```bash\n# Импорт с кастомной конфигурацией\n2shark import -c ./my-config.yaml --branch main --commit-sha <sha>\n\n# Проверка конфигурации\ncat config/category-mapping.yaml | yq eval '.'\n\n# Валидация структуры\nnode -e \"const yaml = require('js-yaml'); const fs = require('fs'); console.log(yaml.load(fs.readFileSync('config/category-mapping.yaml', 'utf8')));\"\n```\n\n## Типы\n\n```typescript\ninterface DocItem {\n  id: string;\n  title: string;\n  content: string;\n  specialty: string;\n  technology: string;\n  priority: number;\n  description: string;\n  tags: string[];\n  created_at: Date;\n  updated_at: Date;\n}\n\ninterface ScanOptions {\n  docsPath?: string;\n  configPath?: string;\n  databaseUrl?: string;\n  clearBeforeScan?: boolean;\n}\n```\n\n## Структура проекта\n\n```text\nsrc/\n├── cli/                    # CLI интерфейс\n│   ├── index.ts           # Точка входа CLI\n│   └── cli.ts             # Основная логика CLI\n├── config/                 # Конфигурация\n│   └── index.ts           # Настройки БД\n├── database/              # Работа с базой данных\n│   ├── class/             # Классы для работы с БД\n│   └── lib/               # Утилиты для БД\n├── docScanner/            # Парсинг markdown и frontmatter\n├── types/                 # TypeScript типы\n│   └── index.ts           # Основные типы\n└── index.ts               # Главный экспорт\n```\n","readmeFilename":"README.md"}