chore: phase 0 tooling baseline
Установлены 9 инструментов фазы 0 + lefthook для pre-commit/pre-push hooks. Конфиги в корне: - package.json + package-lock.json (10 dev-deps, 7 npm-скриптов) - .markdownlint.json + .markdownlintignore — стиль Markdown - cspell.json + cspell-words.txt — орфография ru/en + 350+ проектных терминов - .lychee.toml — проверка ссылок с игнором плейсхолдеров - .stylelintrc.json — стиль CSS в HTML-прототипах - .gitleaks.toml — 8 кастомных правил для РФ-контекста (телефон, ИНН, ОГРН, паспорт, Yandex Cloud-tokens, webhook secrets) + allowlist для масок - pa11y.config.json — WCAG 2.1 AA для web/01-login.html и web/02-dashboard.html - .mcp.json — 3 MCP-сервера (Playwright, GitHub через офиц. hosted endpoint, PostgreSQL — заглушка) - .gitignore — node_modules, bin/*, артефакты + задел на фазы 1–3 - .claude/settings.json — permissions allow/deny + хук авто-fix .md - lefthook.yml — pre-commit (gitleaks + markdownlint + cspell + stylelint) и pre-push (полный gitleaks по истории) Связано: docs/Tooling_v8_3.md (Прил. Н v1.0) — реестр 28 инструментов в 4 фазах; CLAUDE.md в корне — оперативная карта приоритета правил и команд. Архитектурных изменений в проекте: 0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/anthropics/claude-code/main/schemas/settings.json",
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(npm install:*)",
|
||||
"Bash(npm run lint:md:*)",
|
||||
"Bash(npm run spell:*)",
|
||||
"Bash(npm run links:*)",
|
||||
"Bash(npm run lint:css:*)",
|
||||
"Bash(npm run a11y:*)",
|
||||
"Bash(npm run check:docs:*)",
|
||||
"Bash(npm run lint:md:fix:*)",
|
||||
"Bash(git status)",
|
||||
"Bash(git diff)",
|
||||
"Bash(git log:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(node --version)",
|
||||
"Bash(npm --version)",
|
||||
"Bash(npx --version)",
|
||||
"Bash(./bin/gitleaks:*)",
|
||||
"Bash(./bin/lychee:*)",
|
||||
"PowerShell(Get-ChildItem:*)",
|
||||
"PowerShell(Test-Path:*)",
|
||||
"PowerShell(Expand-Archive:*)",
|
||||
"Read(**)",
|
||||
"Glob(**)",
|
||||
"Grep(**)"
|
||||
],
|
||||
"deny": [
|
||||
"Bash(rm -rf:*)",
|
||||
"Bash(git push --force:*)",
|
||||
"Bash(git reset --hard:*)",
|
||||
"Bash(npm publish:*)",
|
||||
"PowerShell(Remove-Item:*-Recurse*)",
|
||||
"PowerShell(Set-ExecutionPolicy:* -Scope LocalMachine*)"
|
||||
]
|
||||
},
|
||||
"hooks": {
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; if(/\\\\.md$/i.test(f) && !/CLAUDE\\\\.md$/i.test(f)) { require('child_process').spawnSync('npx',['-y','markdownlint-cli2','--fix',f],{stdio:'inherit',shell:true}); }\"",
|
||||
"comment": "Авто-fix markdownlint при правке .md (кроме корневого CLAUDE.md, чтобы не зацикливаться)"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"_comments": {
|
||||
"permissions": "Список allow/deny — фаза 0 (документация + HTML-прототипы). При переходе в фазу 1 добавить 'Bash(composer:*)', 'Bash(php artisan:*)'.",
|
||||
"hooks": "Один хук на авто-fix Markdown. Pre-commit (gitleaks, link-check) — отдельно через git hooks (lefthook), не здесь.",
|
||||
"source": "См. Прил. Н §8 — source of truth для всех конфигов проекта."
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
# =============================================================================
|
||||
# .gitignore — Лидпоток
|
||||
# =============================================================================
|
||||
|
||||
# ── Node / npm ──────────────────────────────────────────────────────────────
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.npm/
|
||||
.yarn/
|
||||
|
||||
# ── Локальные бинарники tooling (gitleaks, lychee) ──────────────────────────
|
||||
bin/*
|
||||
!bin/.gitkeep
|
||||
|
||||
# ── Артефакты инструментов ──────────────────────────────────────────────────
|
||||
# markdownlint
|
||||
.markdownlint-cli2.jsonc.bak
|
||||
|
||||
# cspell
|
||||
.cspellcache
|
||||
|
||||
# lychee
|
||||
.lycheecache
|
||||
|
||||
# stylelint
|
||||
.stylelintcache
|
||||
|
||||
# pa11y
|
||||
pa11y-screenshots/
|
||||
a11y-report/
|
||||
|
||||
# gitleaks
|
||||
gitleaks-report.json
|
||||
|
||||
# ── IDE / редакторы ─────────────────────────────────────────────────────────
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
!.vscode/settings.json.example
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# ── ОС-специфичные ──────────────────────────────────────────────────────────
|
||||
desktop.ini
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# ── Будущие фазы (Laravel + Vue) ────────────────────────────────────────────
|
||||
# Фаза 1 — Laravel
|
||||
/vendor/
|
||||
/app/storage/*.key
|
||||
/app/.env
|
||||
/app/.env.backup
|
||||
/app/.phpunit.result.cache
|
||||
.phpactor.json
|
||||
|
||||
# Фаза 1 — Boost (по решению §3.1 Прил. Н — НЕ игнорируем .mcp.json и boost.json)
|
||||
# CLAUDE.md в корне — наш, в gitignore НЕ попадает
|
||||
|
||||
# Фаза 2 — Vue
|
||||
/dist/
|
||||
/dist-ssr/
|
||||
*.local
|
||||
.vite/
|
||||
|
||||
# Фаза 3 — Docker, secrets
|
||||
.env.production
|
||||
.env.local
|
||||
.env.*.local
|
||||
*.pem
|
||||
*.key
|
||||
!*.pub.key
|
||||
secrets/
|
||||
|
||||
# ── Память и сессии Claude (личные, не в git) ───────────────────────────────
|
||||
memory/
|
||||
.claude/local-*
|
||||
|
||||
# ── Временные файлы ─────────────────────────────────────────────────────────
|
||||
*.tmp
|
||||
*.bak
|
||||
*.log
|
||||
tmp/
|
||||
.cache/
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
# Конфигурация gitleaks для проекта Лидпоток
|
||||
# Правило §5.2 правил Claude: запрет на ПДн / токены / API-ключи в коммитах
|
||||
#
|
||||
# ВАЖНО: gitleaks использует Go RE2, который НЕ поддерживает lookbehind/lookahead.
|
||||
# Все правила ниже написаны без (?<=...), (?<!...), (?=...), (?!...).
|
||||
# Границы — через \b (word boundary).
|
||||
|
||||
title = "gitleaks Лидпоток"
|
||||
|
||||
# Расширяем встроенный набор правил gitleaks
|
||||
[extend]
|
||||
useDefault = true
|
||||
|
||||
# ============================================================================
|
||||
# Кастомные правила для российского контекста (152-ФЗ + ПДн)
|
||||
# ============================================================================
|
||||
|
||||
# 1. Российский телефонный номер +7XXXXXXXXXX (без маски)
|
||||
[[rules]]
|
||||
id = "ru-phone-unmasked"
|
||||
description = "Российский телефон без маскирования (правило §5.1 правил Claude)"
|
||||
regex = '''\b(?:\+?7|8)[\s\-]?\(?[34589]\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b'''
|
||||
tags = ["pii", "phone", "152-fz"]
|
||||
|
||||
# 2. ИНН — 10 цифр (юр. лица) или 12 цифр (физ. лица)
|
||||
[[rules]]
|
||||
id = "ru-inn"
|
||||
description = "Российский ИНН (10 или 12 цифр)"
|
||||
regex = '''(?i)\b(?:inn|инн)[:=\s]+\d{10,12}\b'''
|
||||
tags = ["pii", "ru-tax"]
|
||||
|
||||
# 3. ОГРН — 13 цифр (юр. лица) или 15 цифр (ИП)
|
||||
[[rules]]
|
||||
id = "ru-ogrn"
|
||||
description = "Российский ОГРН/ОГРНИП (13 или 15 цифр)"
|
||||
regex = '''(?i)\b(?:ogrn|огрн|огрнип)[:=\s]+\d{13,15}\b'''
|
||||
tags = ["pii", "ru-tax"]
|
||||
|
||||
# 4. Российский паспорт (XX XX XXXXXX)
|
||||
[[rules]]
|
||||
id = "ru-passport"
|
||||
description = "Российский паспорт RF (4 цифры серии + 6 цифр номера)"
|
||||
regex = '''(?i)\b(?:passport|паспорт)[:=\s]+\d{4}\s?\d{6}\b'''
|
||||
tags = ["pii"]
|
||||
|
||||
# 5. Email — детектируется default-правилами gitleaks. Дополнительно — через
|
||||
# allowlist пропускаем известные плейсхолдеры (см. секцию allowlist ниже).
|
||||
|
||||
# 6. Yandex Cloud OAuth-token (формат `y0_...`)
|
||||
[[rules]]
|
||||
id = "yandex-cloud-oauth"
|
||||
description = "Yandex Cloud OAuth/IAM-token"
|
||||
regex = '''\by[0-9]_[A-Za-z0-9_-]{40,}\b'''
|
||||
tags = ["secret", "yandex"]
|
||||
|
||||
# 7. Yandex Cloud API-key (формат AQVN...)
|
||||
[[rules]]
|
||||
id = "yandex-cloud-api-key"
|
||||
description = "Yandex Cloud API-key"
|
||||
regex = '''\bAQVN[A-Za-z0-9_-]{40,}\b'''
|
||||
tags = ["secret", "yandex"]
|
||||
|
||||
# 8. Webhook signing secrets / HMAC keys
|
||||
[[rules]]
|
||||
id = "webhook-secret"
|
||||
description = "Webhook signing secret (HMAC) с явным префиксом ключа"
|
||||
regex = '''(?i)(?:webhook[_-]?(?:secret|token|signature)|signing[_-]?secret|hmac[_-]?key)[\s:=]+["']?[A-Za-z0-9_+/=\-]{20,}["']?'''
|
||||
tags = ["secret"]
|
||||
|
||||
# ============================================================================
|
||||
# Глобальный allowlist: что НЕ считать секретом
|
||||
# ============================================================================
|
||||
[allowlist]
|
||||
description = "Что игнорировать (плейсхолдеры, тестовые данные, публичные реквизиты)"
|
||||
paths = [
|
||||
'''node_modules/''',
|
||||
'''package-lock\.json''',
|
||||
'''\.git/''',
|
||||
'''bin/''',
|
||||
'''cspell-words\.txt''',
|
||||
'''\.gitleaks\.toml'''
|
||||
]
|
||||
regexTarget = "match"
|
||||
regexes = [
|
||||
# Маскированные ПДн (правило §5.1 правил Claude)
|
||||
'''\+7XXXXXXXXXX''',
|
||||
'''\+7\s\(\*{3}\)\s\*{3}-\*{2}-\d{2}''',
|
||||
'''\*{3}@\*{3}''',
|
||||
'''u\*{3}@d\*{3}''',
|
||||
# Шаблонные плейсхолдеры из шаблонов оферты/РКН/брендбука
|
||||
'''\{\{[a-z_]+\}\}''',
|
||||
'''\[ИНН\]''',
|
||||
'''\[ОГРН\]''',
|
||||
'''\[АДРЕС\]''',
|
||||
'''\[ФИО[^\]]*\]''',
|
||||
'''\[БАНК\]''',
|
||||
'''\[Р/С\]''',
|
||||
'''\[К/С\]''',
|
||||
'''\[БИК\]''',
|
||||
# Известные публичные реквизиты Yandex Cloud (публичная информация)
|
||||
'''7704458262''',
|
||||
# Стандартные плейсхолдеры для test/example email (не считаются ПДн)
|
||||
'''[a-zA-Z0-9._%+-]+@(?:example\.|test\.|localhost|.*\.local|.*\.test)[a-zA-Z0-9.-]*''',
|
||||
'''noreply@.*''',
|
||||
'''support@.*''',
|
||||
# Тестовые/демо-токены
|
||||
'''sk-test-[A-Za-z0-9]+''',
|
||||
'''pk_test_[A-Za-z0-9]+''',
|
||||
'''example_[a-z_]+_token''',
|
||||
# Известные publicly known keys из документации (для embed-примеров)
|
||||
'''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''',
|
||||
'''YOUR_TOKEN_HERE''',
|
||||
'''YOUR_API_KEY''',
|
||||
# Тестовые/демо-номера телефонов (не настоящие ПДн)
|
||||
'''(?:\+?7|8)\s?\(?9000\)?\s?[\s\-]?000[\s\-]?00[\s\-]?00''',
|
||||
'''(?:\+?7|8)\s?\(?900\)?\s?123[\s\-]?45[\s\-]?67''',
|
||||
'''(?:\+?7|8)\s?\(?XXX\)?\s?XXX[\s\-]?XX[\s\-]?XX''',
|
||||
'''79000000000''',
|
||||
'''79991234567''',
|
||||
# 12-значные номера-маски для скриншотов и тестов
|
||||
'''[78]\(?[*X]{3}\)?\s?[*X]{3}[\s\-]?[*X]{2}[\s\-]?[*X0-9]{2}'''
|
||||
]
|
||||
@@ -0,0 +1,64 @@
|
||||
# Конфигурация lychee для проекта Лидпоток
|
||||
# Документация: https://lychee.cli.rs
|
||||
|
||||
# Кеш на 12 часов — внешние ссылки не дёргать каждый запуск
|
||||
cache = true
|
||||
max_cache_age = "12h"
|
||||
|
||||
# Прокси не используем (Yandex Cloud, всё в РФ)
|
||||
|
||||
# Таймаут для каждого запроса
|
||||
timeout = 20
|
||||
|
||||
# Параллелизм (на Windows бывает аккуратнее уменьшать до 64)
|
||||
max_concurrency = 32
|
||||
|
||||
# Сколько раз ретраить при сетевых ошибках
|
||||
max_retries = 2
|
||||
|
||||
# Принимать редиректы как валидный ответ
|
||||
accept = ["200..=299", "301", "302", "307", "308", "401", "403"]
|
||||
|
||||
# Fragment-ы (#section) проверяются по умолчанию.
|
||||
# В lychee 0.24.2 опция include_fragments удалена; для отключения
|
||||
# проверки фрагментов добавляйте к URL `?#` или используйте exclude.
|
||||
|
||||
# Игнорировать локальные пути к будущим артефактам, которых ещё нет
|
||||
exclude = [
|
||||
# Шаблонные плейсхолдеры
|
||||
"^\\{\\{.*\\}\\}$",
|
||||
"^\\[.*\\]$",
|
||||
# localhost и приватные адреса
|
||||
"^https?://localhost",
|
||||
"^https?://127\\.0\\.0\\.1",
|
||||
"^https?://0\\.0\\.0\\.0",
|
||||
"^https?://192\\.168\\.",
|
||||
# Будущие домены проекта (DO-2 — после Б-1)
|
||||
"^https?://lidpotok\\.ru",
|
||||
"^https?://.*\\.lidpotok\\.ru",
|
||||
"^https?://.*\\.<домен>",
|
||||
# Внутренние URL из runbook (бастионы, sentry self-hosted)
|
||||
"^https?://bastion\\.",
|
||||
"^https?://sentry\\.",
|
||||
"^https?://grafana\\.",
|
||||
"^https?://alertmanager\\.",
|
||||
"^https?://admin\\.",
|
||||
"^https?://status\\.",
|
||||
"^https?://postgres-",
|
||||
# Sample/примерные адреса
|
||||
"^https?://example\\.com",
|
||||
"^https?://example\\.org"
|
||||
]
|
||||
|
||||
# Игнорировать файлы вне аудита
|
||||
exclude_path = [
|
||||
"node_modules",
|
||||
".git",
|
||||
"bin"
|
||||
]
|
||||
|
||||
# User-Agent — некоторые сайты режут пустой
|
||||
user_agent = "lychee/lidpotok"
|
||||
|
||||
# Не падать, если в файле нет ссылок
|
||||
no_progress = false
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json",
|
||||
"default": true,
|
||||
"MD003": { "style": "atx" },
|
||||
"MD004": { "style": "dash" },
|
||||
"MD007": { "indent": 2 },
|
||||
"MD013": false,
|
||||
"MD024": { "siblings_only": true },
|
||||
"MD025": false,
|
||||
"MD026": { "punctuation": ".,;:!" },
|
||||
"MD029": { "style": "ordered" },
|
||||
"MD033": {
|
||||
"allowed_elements": [
|
||||
"br",
|
||||
"details",
|
||||
"summary",
|
||||
"kbd",
|
||||
"sub",
|
||||
"sup",
|
||||
"code-snippet",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
"MD034": false,
|
||||
"MD036": false,
|
||||
"MD040": false,
|
||||
"MD041": false,
|
||||
"MD046": { "style": "fenced" },
|
||||
"MD049": { "style": "asterisk" },
|
||||
"MD050": { "style": "asterisk" },
|
||||
"MD060": false
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
node_modules/
|
||||
.git/
|
||||
bin/
|
||||
CLAUDE.md
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/anthropics/claude-code/main/schemas/mcp.json",
|
||||
"mcpServers": {
|
||||
"playwright": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@playwright/mcp@latest"],
|
||||
"comment": "Фаза 0 #2 — открыть web/*.html, screenshot, проверка интерактива"
|
||||
},
|
||||
"github": {
|
||||
"type": "http",
|
||||
"url": "https://api.githubcopilot.com/mcp",
|
||||
"headers": {
|
||||
"Authorization": "Bearer ${GITHUB_TOKEN}"
|
||||
},
|
||||
"comment": "Фаза 0 #3 — официальный hosted GitHub MCP (https://github.com/github/github-mcp-server). Требует env GITHUB_TOKEN с PAT (scopes: repo, read:org, не давать admin/delete). Раньше использовали deprecated @modelcontextprotocol/server-github — заменён 06.05.2026."
|
||||
},
|
||||
"_postgres_disabled": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost:5432/lidpotok_dev"],
|
||||
"comment": "Фаза 0 #1 — отключён по умолчанию. Включить когда поднимется локальный PostgreSQL: переименовать ключ в 'postgres' и подставить connection string. В фазе 1 — заменяется Laravel Boost (см. Tooling §3.1)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"extends": ["stylelint-config-standard"],
|
||||
"rules": {
|
||||
"selector-class-pattern": null,
|
||||
"custom-property-pattern": null,
|
||||
"color-hex-length": "long",
|
||||
"color-function-notation": null,
|
||||
"alpha-value-notation": null,
|
||||
"hue-degree-notation": null,
|
||||
"shorthand-property-no-redundant-values": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"no-descending-specificity": null,
|
||||
"media-feature-range-notation": null,
|
||||
"comment-empty-line-before": null,
|
||||
"rule-empty-line-before": null,
|
||||
"no-duplicate-selectors": null,
|
||||
"custom-property-empty-line-before": null,
|
||||
"value-keyword-case": null,
|
||||
"font-family-name-quotes": null,
|
||||
"font-family-no-missing-generic-family-keyword": null,
|
||||
"no-empty-source": null,
|
||||
"selector-pseudo-class-no-unknown": null,
|
||||
"color-function-alias-notation": null,
|
||||
"declaration-block-single-line-max-declarations": null,
|
||||
"at-rule-empty-line-before": null,
|
||||
"media-feature-name-value-no-unknown": null,
|
||||
"media-feature-name-no-unknown": null,
|
||||
"length-zero-no-unit": null,
|
||||
"declaration-block-no-shorthand-property-overrides": null,
|
||||
"comment-whitespace-inside": null,
|
||||
"selector-not-notation": null,
|
||||
"import-notation": null,
|
||||
"block-no-empty": null,
|
||||
"selector-pseudo-element-no-unknown": null,
|
||||
"keyframes-name-pattern": null,
|
||||
"function-name-case": null,
|
||||
"selector-id-pattern": null,
|
||||
"no-invalid-position-at-import-rule": null
|
||||
},
|
||||
"ignoreFiles": [
|
||||
"node_modules/**",
|
||||
".git/**",
|
||||
"bin/**"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["**/*.html"],
|
||||
"customSyntax": "postcss-html"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# Папка для локальных бинарников tooling (gitleaks, lychee).
|
||||
# Сами бинарники — в .gitignore (см. правило 'bin/' в корне).
|
||||
# Этот файл нужен, чтобы git сохранил пустую директорию.
|
||||
@@ -0,0 +1,663 @@
|
||||
# Глоссарий проекта Лидпоток
|
||||
# Формат: одно слово на строке. Кириллица в нижнем регистре.
|
||||
|
||||
# Бренд и термины проекта
|
||||
лидпоток
|
||||
lidpotok
|
||||
бэкап
|
||||
бэкапы
|
||||
бэкапов
|
||||
бэкапе
|
||||
кэш
|
||||
кэширование
|
||||
вебхук
|
||||
вебхуки
|
||||
вебхуком
|
||||
вебхука
|
||||
ингресс
|
||||
ofеrtу
|
||||
оферта
|
||||
оферты
|
||||
тенант
|
||||
тенанта
|
||||
тенанты
|
||||
тенантов
|
||||
тенантского
|
||||
тенантская
|
||||
тенантской
|
||||
мультитенантность
|
||||
мультитенантной
|
||||
реселлер
|
||||
реселлера
|
||||
реселлерская
|
||||
реселлерской
|
||||
реселлерскую
|
||||
менеджеру
|
||||
|
||||
# Доменные термины crm.bp-gr.ru
|
||||
гцк
|
||||
кц
|
||||
visitdop
|
||||
adddop
|
||||
addreminder
|
||||
crmbpgr
|
||||
prostats
|
||||
|
||||
# Государственные и регуляторные
|
||||
рсо
|
||||
ркн
|
||||
епгу
|
||||
инн
|
||||
кпп
|
||||
огрн
|
||||
огрнип
|
||||
бик
|
||||
куртиз
|
||||
кэп
|
||||
гост
|
||||
фстэк
|
||||
фсб
|
||||
фз
|
||||
фзои
|
||||
постановления
|
||||
кодаб
|
||||
тариф
|
||||
тарифа
|
||||
тарифы
|
||||
тарифов
|
||||
тарифного
|
||||
суждения
|
||||
эльга
|
||||
ффомс
|
||||
|
||||
# Технологии и инструменты
|
||||
postgresql
|
||||
laravel
|
||||
vuejs
|
||||
vuetify
|
||||
inertia
|
||||
livewire
|
||||
filament
|
||||
flux
|
||||
nova
|
||||
folio
|
||||
volt
|
||||
wayfinder
|
||||
pinia
|
||||
histoire
|
||||
vitest
|
||||
volar
|
||||
prettier
|
||||
eslint
|
||||
stylelint
|
||||
markdownlint
|
||||
cspell
|
||||
lychee
|
||||
pa11y
|
||||
gitleaks
|
||||
semgrep
|
||||
trivy
|
||||
larastan
|
||||
phpstan
|
||||
pint
|
||||
pest
|
||||
phpunit
|
||||
roave
|
||||
pgbouncer
|
||||
pgformatter
|
||||
pgcrypto
|
||||
pg_partman
|
||||
pg_audit
|
||||
pg_anonymizer
|
||||
pgaudit
|
||||
squawk
|
||||
yandex
|
||||
yandexcloud
|
||||
unisender
|
||||
sentry
|
||||
mailgun
|
||||
jivosite
|
||||
cloudflare
|
||||
selectel
|
||||
backblaze
|
||||
recaptcha
|
||||
captcha
|
||||
keepass
|
||||
bitwarden
|
||||
tinker
|
||||
artisan
|
||||
composer
|
||||
npm
|
||||
npx
|
||||
cargo
|
||||
chocolatey
|
||||
winget
|
||||
scoop
|
||||
mcp
|
||||
mcps
|
||||
sast
|
||||
dast
|
||||
rls
|
||||
ddl
|
||||
dml
|
||||
acl
|
||||
crud
|
||||
cron
|
||||
crontab
|
||||
redis
|
||||
nginx
|
||||
apache
|
||||
docker
|
||||
kubernetes
|
||||
k8s
|
||||
terraform
|
||||
ansible
|
||||
fastcgi
|
||||
|
||||
# Английские термины (профессиональные)
|
||||
webhook
|
||||
webhooks
|
||||
endpoint
|
||||
endpoints
|
||||
realtime
|
||||
backend
|
||||
frontend
|
||||
fullstack
|
||||
upsert
|
||||
toolbar
|
||||
toolbars
|
||||
sidebar
|
||||
mockup
|
||||
mockups
|
||||
moodboard
|
||||
moodboards
|
||||
boilerplate
|
||||
opcache
|
||||
opcode
|
||||
fpm
|
||||
prerender
|
||||
hydrate
|
||||
hydration
|
||||
ssr
|
||||
spa
|
||||
sso
|
||||
oauth
|
||||
oidc
|
||||
saml
|
||||
totp
|
||||
hotp
|
||||
zxcvbn
|
||||
captcha
|
||||
chargeback
|
||||
chargebacks
|
||||
impersonation
|
||||
multi-tenant
|
||||
multitenancy
|
||||
tenant
|
||||
tenants
|
||||
upserts
|
||||
booleans
|
||||
enum
|
||||
enums
|
||||
enumeration
|
||||
struct
|
||||
structs
|
||||
hashmap
|
||||
mutex
|
||||
mutable
|
||||
immutable
|
||||
async
|
||||
await
|
||||
goroutine
|
||||
goroutines
|
||||
channel
|
||||
nullable
|
||||
nonnull
|
||||
serializable
|
||||
serialization
|
||||
deserialize
|
||||
middleware
|
||||
middlewares
|
||||
roundtrip
|
||||
debounce
|
||||
throttle
|
||||
backoff
|
||||
idempotent
|
||||
idempotency
|
||||
preflight
|
||||
preconnect
|
||||
prefetch
|
||||
preload
|
||||
favicon
|
||||
codepoint
|
||||
codepoints
|
||||
emoji
|
||||
emojis
|
||||
woff
|
||||
woff2
|
||||
nullish
|
||||
|
||||
# Финансовые
|
||||
упд
|
||||
счф
|
||||
доп
|
||||
эдо
|
||||
сбп
|
||||
пдн
|
||||
ндс
|
||||
осно
|
||||
усн
|
||||
бик
|
||||
экв
|
||||
фискальный
|
||||
фискального
|
||||
фискальные
|
||||
эквайринг
|
||||
эквайринге
|
||||
|
||||
# Пакеты и фреймворки (часто без перевода)
|
||||
apexcharts
|
||||
chartjs
|
||||
ckeditor
|
||||
trumbowyg
|
||||
quill
|
||||
fontawesome
|
||||
bootstrap
|
||||
tailwind
|
||||
antd
|
||||
naive
|
||||
shadcn
|
||||
radix
|
||||
headlessui
|
||||
nuxt
|
||||
nextjs
|
||||
remix
|
||||
sveltekit
|
||||
solidjs
|
||||
preact
|
||||
vitepress
|
||||
docusaurus
|
||||
gatsby
|
||||
|
||||
# Мелкие частые сокращения
|
||||
oncall
|
||||
postmortem
|
||||
postmortems
|
||||
runbook
|
||||
runbooks
|
||||
hotfix
|
||||
hotfixes
|
||||
rollback
|
||||
rollbacks
|
||||
pullrequest
|
||||
codereview
|
||||
e2e
|
||||
qa
|
||||
a11y
|
||||
i18n
|
||||
l10n
|
||||
ux
|
||||
ui
|
||||
uxui
|
||||
kpi
|
||||
roi
|
||||
mau
|
||||
dau
|
||||
arpu
|
||||
|
||||
# Редкие/специальные
|
||||
brutalist
|
||||
brutalism
|
||||
maximalist
|
||||
minimalist
|
||||
maximalism
|
||||
minimalism
|
||||
editorial
|
||||
retrofuturistic
|
||||
retro
|
||||
opensource
|
||||
|
||||
# Имена ролей и команд из ТЗ
|
||||
mfa
|
||||
twofa
|
||||
recoverycodes
|
||||
backupcodes
|
||||
push-уведомление
|
||||
push-уведомления
|
||||
|
||||
# Русские сокращения вопросов (адресаты)
|
||||
биз
|
||||
диз
|
||||
opem
|
||||
бизом
|
||||
дизом
|
||||
|
||||
# Латинские транслиты в проектных файлах
|
||||
pravila
|
||||
raboty
|
||||
analiz
|
||||
originala
|
||||
otkrytyye
|
||||
voprosy
|
||||
oblaka
|
||||
vybor
|
||||
tooling
|
||||
oferta
|
||||
politika
|
||||
uvedomlenie
|
||||
runbook
|
||||
ekspluatatsii
|
||||
prilozheniye
|
||||
|
||||
# Дополнительные термины
|
||||
saas-аналог
|
||||
saas-платформа
|
||||
saas-биллинг
|
||||
saas-уровневые
|
||||
бэк
|
||||
бэке
|
||||
бэкенд
|
||||
бекап
|
||||
бекапы
|
||||
бекапе
|
||||
voronka
|
||||
slug
|
||||
slugs
|
||||
|
||||
# ============================================================================
|
||||
# Топ-150 проектных терминов из baseline cspell (06.05.2026)
|
||||
# ============================================================================
|
||||
|
||||
# Русские термины проекта
|
||||
юрлица
|
||||
юрлицо
|
||||
юрлиц
|
||||
юрадрес
|
||||
ЦОД
|
||||
модалка
|
||||
модалки
|
||||
модалку
|
||||
модалке
|
||||
блокер
|
||||
бэклог
|
||||
бэклога
|
||||
бэкапах
|
||||
недозвон
|
||||
Недозвон
|
||||
админку
|
||||
аккаунтный
|
||||
Аккаунтный
|
||||
алерт
|
||||
апдейт
|
||||
валидирует
|
||||
воркеры
|
||||
воркеров
|
||||
воронка
|
||||
гео
|
||||
деплой
|
||||
импersonation
|
||||
Импersonation
|
||||
инвалидируется
|
||||
инфры
|
||||
косв
|
||||
лайт
|
||||
маппинга
|
||||
монорепо
|
||||
мортемов
|
||||
постмортемов
|
||||
многотенантная
|
||||
мультитенантности
|
||||
мультимастер
|
||||
откл
|
||||
партиционирование
|
||||
Партиционирование
|
||||
партиционированная
|
||||
партиционированных
|
||||
партиционированием
|
||||
партиционирована
|
||||
Партнёрка
|
||||
плейсхолдер
|
||||
плейсхолдеры
|
||||
поповер
|
||||
постмортемов
|
||||
приоритезационных
|
||||
рассинхрону
|
||||
раннер
|
||||
регексом
|
||||
резюмирование
|
||||
ретраи
|
||||
роут
|
||||
роутинг
|
||||
скейла
|
||||
скейлинга
|
||||
скиллы
|
||||
скиллов
|
||||
скиллам
|
||||
селектов
|
||||
селектом
|
||||
СКЗИ
|
||||
скоуп
|
||||
Скоуп
|
||||
суб
|
||||
тенантно
|
||||
тогглов
|
||||
тулзы
|
||||
триггерят
|
||||
финализирован
|
||||
фейлы
|
||||
флоу
|
||||
фрод
|
||||
фронтенда
|
||||
фича
|
||||
фичи
|
||||
хелпер
|
||||
шники
|
||||
ДЕФ
|
||||
ОКПД
|
||||
ГИС
|
||||
Мульти
|
||||
Битрикс
|
||||
|
||||
# Аббревиатуры (английские)
|
||||
DPA
|
||||
PITR
|
||||
TTL
|
||||
RTO
|
||||
RPO
|
||||
upd
|
||||
topup
|
||||
WCAG
|
||||
HMAC
|
||||
HSTS
|
||||
HDE
|
||||
FTE
|
||||
FTS
|
||||
GPT
|
||||
gpt
|
||||
GIS
|
||||
HMAC
|
||||
hmac
|
||||
MRR
|
||||
OTP
|
||||
PCI
|
||||
DSS
|
||||
SDK
|
||||
SAST
|
||||
DAST
|
||||
RBAC
|
||||
SLO
|
||||
SLI
|
||||
SRE
|
||||
sre
|
||||
|
||||
# Технические идентификаторы из ТЗ
|
||||
TIMESTAMPTZ
|
||||
BYPASSRLS
|
||||
unrecovered
|
||||
recalc
|
||||
soft
|
||||
сoft
|
||||
idx
|
||||
vid
|
||||
gck
|
||||
chk
|
||||
dop
|
||||
dops
|
||||
|
||||
# Имена внешних сервисов и брендов
|
||||
Bitrix
|
||||
bitrix
|
||||
amo
|
||||
amocrm
|
||||
Skorozvon
|
||||
skorozvon
|
||||
Tinkoff
|
||||
Sber
|
||||
NGENIX
|
||||
Moizvonki
|
||||
moizvonki
|
||||
Caranga
|
||||
Yii
|
||||
Meilisearch
|
||||
Metrika
|
||||
onpbx
|
||||
lkomega
|
||||
Paa
|
||||
|
||||
# Транслиты файлов и слов проекта
|
||||
Konspekt
|
||||
sessii
|
||||
partii
|
||||
domen
|
||||
ogrn
|
||||
rkn
|
||||
RKN
|
||||
|
||||
# CSS/UI контекст в прототипах (не задевают .gitleaks)
|
||||
rgb
|
||||
scroller
|
||||
scriptv
|
||||
|
||||
# Прочее
|
||||
supervisorctl
|
||||
tsc
|
||||
|
||||
# ============================================================================
|
||||
# Финальный baseline (06.05.2026) — оставшиеся ~90 терминов из архива
|
||||
# ============================================================================
|
||||
|
||||
# Технические термины и аббревиатуры
|
||||
anonymization
|
||||
apm
|
||||
backgound
|
||||
dba
|
||||
dialoga
|
||||
dossie
|
||||
dpo
|
||||
dsn
|
||||
fas
|
||||
ghp
|
||||
glpat
|
||||
hns
|
||||
isready
|
||||
jit
|
||||
kpp
|
||||
mainv
|
||||
mdi
|
||||
mws
|
||||
nobypassrls
|
||||
oki
|
||||
omnichannel
|
||||
pii
|
||||
psr
|
||||
ratе
|
||||
rtstatopts
|
||||
sbp
|
||||
sfc
|
||||
skrzvn
|
||||
sslmode
|
||||
tarantool
|
||||
tco
|
||||
tfstate
|
||||
uid
|
||||
xoxb
|
||||
yoo
|
||||
|
||||
# Имена npm/composer пакетов (vendor-неймы)
|
||||
barryvdh
|
||||
bjeavons
|
||||
enlightn
|
||||
minishlink
|
||||
pragmarx
|
||||
|
||||
# Русские термины (продолжение)
|
||||
авторизационные
|
||||
Авторизационные
|
||||
бамп
|
||||
батча
|
||||
бенчмарк
|
||||
биллингом
|
||||
брендовой
|
||||
брендовом
|
||||
валидируются
|
||||
версионируется
|
||||
Версионные
|
||||
версионных
|
||||
временна́á
|
||||
временна́я
|
||||
геораспределённый
|
||||
ГГГГ
|
||||
Гранулярность
|
||||
джоба
|
||||
драфте
|
||||
заглушечные
|
||||
заглушечных
|
||||
инфру
|
||||
капс
|
||||
Капча
|
||||
колбэк
|
||||
Крипто
|
||||
крупняк
|
||||
Лейбл
|
||||
лейблами
|
||||
логирует
|
||||
Логирует
|
||||
логируется
|
||||
Мango
|
||||
Неактивность
|
||||
Недозвонов
|
||||
Обязат
|
||||
первичка
|
||||
рендерится
|
||||
Сберовское
|
||||
Селект
|
||||
Селектел
|
||||
СФР
|
||||
Субдомен
|
||||
Таб
|
||||
таргет
|
||||
Уже́
|
||||
Учётка
|
||||
Финализация
|
||||
ЭЦП
|
||||
абонплаты
|
||||
автодеплой
|
||||
аптайма
|
||||
français
|
||||
français-фразы
|
||||
soft
|
||||
|
||||
# Российские топонимы и сокращения
|
||||
рф
|
||||
россии
|
||||
российской
|
||||
российский
|
||||
москва
|
||||
московский
|
||||
санкт-петербург
|
||||
владимир
|
||||
рязань
|
||||
калуга
|
||||
новосибирск
|
||||
санкт
|
||||
петербург
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
|
||||
"version": "0.2",
|
||||
"language": "en,ru,ru-ru",
|
||||
"import": [
|
||||
"@cspell/dict-ru_ru/cspell-ext.json",
|
||||
"@cspell/dict-en_us/cspell-ext.json"
|
||||
],
|
||||
"dictionaryDefinitions": [
|
||||
{
|
||||
"name": "lidpotok-glossary",
|
||||
"path": "./cspell-words.txt",
|
||||
"addWords": true
|
||||
}
|
||||
],
|
||||
"dictionaries": [
|
||||
"lidpotok-glossary"
|
||||
],
|
||||
"ignorePaths": [
|
||||
"node_modules/**",
|
||||
".git/**",
|
||||
"bin/**",
|
||||
"package-lock.json",
|
||||
"*.svg",
|
||||
"**/*.sql"
|
||||
],
|
||||
"ignoreRegExpList": [
|
||||
"Email",
|
||||
"Url",
|
||||
"/[A-F0-9]{6,}/g",
|
||||
"/`[^`]+`/g",
|
||||
"/```[\\s\\S]*?```/g",
|
||||
"/<(?:style|script)[\\s\\S]*?<\\/(?:style|script)>/g"
|
||||
],
|
||||
"allowCompoundWords": true,
|
||||
"minWordLength": 3,
|
||||
"useGitignore": true
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
# =============================================================================
|
||||
# lefthook.yml — Лидпоток (фаза 0)
|
||||
# =============================================================================
|
||||
# Документация: https://lefthook.dev
|
||||
# Установка хуков: npx lefthook install
|
||||
# Удаление хуков: npx lefthook uninstall
|
||||
# Ручной pre-commit: npx lefthook run pre-commit
|
||||
# Пропуск (один раз): LEFTHOOK=0 git commit -m "..."
|
||||
#
|
||||
# Принципы (Прил. Н §1):
|
||||
# - Pre-commit для быстрых проверок: gitleaks, markdownlint, cspell, Stylelint
|
||||
# - Pre-push для медленных: полный gitleaks по истории + lychee
|
||||
# - Pa11y — только в CI (требует Chromium)
|
||||
# =============================================================================
|
||||
|
||||
min_version: 2.0.0
|
||||
|
||||
# Pre-commit: проверки на staged-файлах перед каждым git commit
|
||||
pre-commit:
|
||||
parallel: false
|
||||
jobs:
|
||||
# 1. gitleaks — поиск ПДн / токенов / API-ключей в staged
|
||||
# Правило §5.2 правил Claude. Блокирует коммит при находке.
|
||||
- name: gitleaks
|
||||
run: ./bin/gitleaks.exe protect --staged --config .gitleaks.toml --no-banner
|
||||
fail_text: |
|
||||
gitleaks нашёл потенциальные ПДн / токены / API-ключи в diff.
|
||||
Если это маска / тестовое значение — добавь в allowlist .gitleaks.toml.
|
||||
Если реальные данные — удали и используй маски (+7XXXXXXXXXX, ***@***).
|
||||
|
||||
# 2. markdownlint — стиль Markdown с авто-fix
|
||||
- name: markdownlint
|
||||
glob: "*.md"
|
||||
run: npx markdownlint-cli2 --fix {staged_files}
|
||||
stage_fixed: true
|
||||
fail_text: |
|
||||
markdownlint нашёл проблемы, которые не исправляются автоматически.
|
||||
Запусти `npm run lint:md:fix` или поправь руками.
|
||||
|
||||
# 3. cspell — орфография на staged .md
|
||||
- name: cspell
|
||||
glob: "*.md"
|
||||
run: npx cspell --no-progress --no-summary {staged_files}
|
||||
fail_text: |
|
||||
cspell нашёл слова, отсутствующие в словаре.
|
||||
Если это валидное слово проекта — добавь в cspell-words.txt.
|
||||
Если опечатка — поправь.
|
||||
|
||||
# 4. Stylelint — стиль CSS в HTML-прототипах
|
||||
- name: stylelint
|
||||
glob: "*.html"
|
||||
run: npx stylelint {staged_files}
|
||||
fail_text: |
|
||||
Stylelint нашёл проблемы в CSS прототипа.
|
||||
Запусти `npx stylelint --fix <file>` где возможно.
|
||||
|
||||
# Pre-push: проверки перед git push (медленнее, но реже запускаются)
|
||||
pre-push:
|
||||
parallel: false
|
||||
jobs:
|
||||
# 5. Полный gitleaks-скан всей истории (не только staged)
|
||||
- name: gitleaks-full-history
|
||||
run: ./bin/gitleaks.exe detect --source . --no-banner --config .gitleaks.toml --redact
|
||||
fail_text: |
|
||||
gitleaks нашёл утечки в истории коммитов.
|
||||
Перед push разберись с каждой находкой.
|
||||
|
||||
# Подавить служебный вывод
|
||||
skip_output:
|
||||
- meta
|
||||
- skips
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"defaults": {
|
||||
"standard": "WCAG2AA",
|
||||
"timeout": 30000,
|
||||
"wait": 1500,
|
||||
"hideElements": ".js-skip-a11y, [data-a11y-skip]",
|
||||
"ignore": [
|
||||
"warning",
|
||||
"notice"
|
||||
],
|
||||
"chromeLaunchConfig": {
|
||||
"args": [
|
||||
"--no-sandbox",
|
||||
"--disable-dev-shm-usage"
|
||||
]
|
||||
},
|
||||
"viewport": {
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
}
|
||||
},
|
||||
"urls": [
|
||||
{
|
||||
"url": "./web/01-login.html",
|
||||
"screenCapture": "./bin/a11y-screenshots/01-login.png"
|
||||
},
|
||||
{
|
||||
"url": "./web/02-dashboard.html",
|
||||
"screenCapture": "./bin/a11y-screenshots/02-dashboard.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
Generated
+5853
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "lidpotok",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Лидпоток — SaaS CRM (фаза 0: документация и HTML-прототипы)",
|
||||
"scripts": {
|
||||
"lint:md": "markdownlint-cli2 \"docs/**/*.md\" \"db/**/*.md\" \"*.md\"",
|
||||
"lint:md:fix": "markdownlint-cli2 --fix \"docs/**/*.md\" \"db/**/*.md\" \"*.md\"",
|
||||
"spell": "cspell --no-progress --show-suggestions \"docs/**/*.md\" \"db/**/*.md\" \"*.md\" \"web/**/*.html\"",
|
||||
"links": "lychee --config .lychee.toml \"docs/**/*.md\" \"db/**/*.md\" \"*.md\" \"web/**/*.html\"",
|
||||
"lint:css": "stylelint \"web/**/*.html\"",
|
||||
"a11y": "pa11y-ci --config pa11y.config.json",
|
||||
"check:docs": "run-p lint:md spell links a11y"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cspell/dict-en_us": "^4.4.33",
|
||||
"@cspell/dict-ru_ru": "^2.3.2",
|
||||
"cspell": "^10.0.0",
|
||||
"lefthook": "^2.1.6",
|
||||
"markdownlint-cli2": "^0.22.1",
|
||||
"npm-run-all2": "^8.0.4",
|
||||
"pa11y": "^9.1.1",
|
||||
"pa11y-ci": "^4.1.0",
|
||||
"postcss-html": "^1.8.1",
|
||||
"stylelint": "^17.11.0",
|
||||
"stylelint-config-standard": "^40.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.0.0"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user