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:
Дмитрий
2026-05-06 04:44:20 +07:00
parent b5cda8886d
commit 6ff05fd7ea
15 changed files with 7132 additions and 0 deletions
+57
View File
@@ -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
View File
@@ -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
View File
@@ -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}'''
]
+64
View File
@@ -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
+32
View File
@@ -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
}
+4
View File
@@ -0,0 +1,4 @@
node_modules/
.git/
bin/
CLAUDE.md
+23
View File
@@ -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)"
}
}
}
+51
View File
@@ -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"
}
]
}
+3
View File
@@ -0,0 +1,3 @@
# Папка для локальных бинарников tooling (gitleaks, lychee).
# Сами бинарники — в .gitignore (см. правило 'bin/' в корне).
# Этот файл нужен, чтобы git сохранил пустую директорию.
+663
View File
@@ -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
View File
@@ -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
}
+71
View File
@@ -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
+32
View File
@@ -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"
}
]
}
+5853
View File
File diff suppressed because it is too large Load Diff
+31
View File
@@ -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"
}
}