{"_id":"@deksden-com/mb-lint","_rev":"7-5ebb4a86626de92273ae1c9a07dbafad","name":"@deksden-com/mb-lint","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@deksden-com/mb-lint","version":"0.1.0","license":"MIT","_id":"@deksden-com/mb-lint@0.1.0","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"06be920eff6e68903ac7312f2e8788cfb38cece7","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.1.0.tgz","fileCount":75,"integrity":"sha512-ASVwIT1aLqSh/aQpckHo+4AzpMX99xgJ0IPjqWkHKdY3o8xr+BhUPTQ/nyocZuJ/pEJ3WhS5GfkZqNmik8GMVw==","signatures":[{"sig":"MEUCIAp0NYYHY8nVF4fb7rgRVr4V9S0KmNQBgew5YmJ1PC3WAiEAl/yqCfad9pilvTZ8+0EWoZbUCR7yMsvoFiqHz2wZbTg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83807},"type":"module","engines":{"node":">=20"},"gitHead":"26be93c36ab9e00059bdbc5b8139d9df9710e287","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.12.1","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.1.0_1778848209443_0.670578493431716","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@deksden-com/mb-lint","version":"0.1.1","license":"MIT","_id":"@deksden-com/mb-lint@0.1.1","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"2d3d4c1c2e1a54e530fba93dcb8ab66051173332","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.1.1.tgz","fileCount":75,"integrity":"sha512-Hsw6GeknUm+HaDR/bUHkFngtNYTRC6L0j9+gEwdDCCtk3d/eWptOfXCjvntKaomWDCQyLCFY7wAbJN+is6h0XA==","signatures":[{"sig":"MEUCIQCjbnFEwBqMyML2d27nrswXNyzvEUhtmiO8SYFCIRg50gIgPsiYaAoO7g+IcHM/ryns/0XupiN/9hoep1yK6kd3si8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83912},"type":"module","engines":{"node":">=20"},"gitHead":"26be93c36ab9e00059bdbc5b8139d9df9710e287","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.12.1","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.1.1_1779613777272_0.48452405872611926","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@deksden-com/mb-lint","version":"0.2.0","license":"MIT","_id":"@deksden-com/mb-lint@0.2.0","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"0d27822800a3d0810aa4d11e7f9ed739d0618834","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.2.0.tgz","fileCount":93,"integrity":"sha512-PuaHZ8GvUDzaEnZXd1X/mxoC5ImMxrgMbfR6YUFpl090/Qa6dxScycLCZDR/3J2WNVEsu4LIG1nFyn9sUDRBVw==","signatures":[{"sig":"MEUCIDmOWFndX0oO70BOWrwpZdZzq7tklKb1ynbfIDfn3y7sAiEAxoZRMW568ydtM5bWxqxM+Z+hM4jcIGqi178PoG2FC4w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116229},"type":"module","engines":{"node":">=20"},"gitHead":"223ebb72abc8bae8b4e7859ba595652b949fb628","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.17.0","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.2.0_1782916953514_0.4195079475096364","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@deksden-com/mb-lint","version":"0.3.0","license":"MIT","_id":"@deksden-com/mb-lint@0.3.0","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"9f71bf2e63381e9b79fd9db470875fa07f8525ee","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.3.0.tgz","fileCount":99,"integrity":"sha512-UnqU0toWaQdVEBR2MeKdLSKWSoDsPXEeLgwGKZY0J2SUhwRqLUXJ6pmIfZLkYzeSYv0s+CoF6eKozSJpg0kKDQ==","signatures":[{"sig":"MEUCIQCTRJgTRVNhM6le3K3KjRIsl37Yz9Gxdfe/ulzGkuVuCQIgPHeoFPeTJa6wdFBrF47O7xp+q0I4mSS1QoUHNGAQ4us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132222},"type":"module","engines":{"node":">=20"},"gitHead":"5b5c8c0010e05de2de6939dea6e304f735370187","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.17.0","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.3.0_1783175198962_0.602201473560269","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@deksden-com/mb-lint","version":"0.3.1","license":"MIT","_id":"@deksden-com/mb-lint@0.3.1","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"a95bfb6626246bfc2e50c30d5e0a229d17598bf0","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.3.1.tgz","fileCount":99,"integrity":"sha512-ZolU9G1EW/Wl3wnYUceh9yuiAuyABOvzsuseIloNZ5J/7k+NQ1MI6LXwxRxoCJNqTv4Iu7GrrGPlYYrgg2l8tg==","signatures":[{"sig":"MEUCIQDAQfqiwuUj/lzxrit8vxIStqzHP36kkRA8DFrioRySDwIgXZZE1WGxIZqU9Jw7i5PNMo/pOpuVUQH0I+mSaPdmne8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140675},"type":"module","engines":{"node":">=20"},"gitHead":"65e5ed3cebb4825ab71e996079451089afd50c3e","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.17.0","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.3.1_1783331002342_0.5234268492840946","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@deksden-com/mb-lint","version":"0.3.2","license":"MIT","_id":"@deksden-com/mb-lint@0.3.2","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"bin":{"mb-lint":"dist/cli.js"},"dist":{"shasum":"dc3c1f9e39c875ceb8bfa4ef64ec56bc279a6b3f","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.3.2.tgz","fileCount":99,"integrity":"sha512-oo8+knxutzcRLgC/N9i1Ebh3Sxu74gHTvZ/dX9DK9d9OKm3dyw+YutdCbxRJ7WKD6tVoyhT/GQ5C4fhULsWrmQ==","signatures":[{"sig":"MEQCIE+StJa+LW58ngf4i3NUvE+tAyesqFLYTSIT4DZyEhP9AiAzImsSc0E0tqsflL09J581CiGa7iwZvuYiAoAJ6qjmcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143558},"type":"module","engines":{"node":">=20"},"gitHead":"f6caef9260579ddd001b5a82de718acc01a8bbf8","scripts":{"lint":"npm run typecheck","test":"vitest run","build":"tsc -p tsconfig.json","release":"npm run build && changeset publish","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"_npmVersion":"11.17.0","description":"Deterministic linter for Memory Bank projects.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.3","typescript":"^5.8.3","@types/node":"^22.15.18","@changesets/cli":"^2.31.0"},"_npmOperationalInternal":{"tmp":"tmp/mb-lint_0.3.2_1784756093640_0.44873359253092904","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@deksden-com/mb-lint","version":"0.4.0","description":"Deterministic linter for Memory Bank projects.","type":"module","bin":{"mb-lint":"dist/cli.js"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","lint":"npm run typecheck","changeset":"changeset","version-packages":"changeset version","release":"npm run build && changeset publish"},"dependencies":{"gray-matter":"^4.0.3"},"devDependencies":{"@changesets/cli":"^2.31.0","@types/node":"^22.15.18","typescript":"^5.8.3","vitest":"^3.1.3"},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"license":"MIT","gitHead":"5cc35eb4f28fc97f5bb52211373281b258381e08","_id":"@deksden-com/mb-lint@0.4.0","_nodeVersion":"26.5.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-v3A5+xqvujdTZhjkl9vQG4R2mb9y9VKNk3qIVhe+lzLqwCwjS0LhKlmJG6tfxhaqydSY6SXRUEXd3+x2C2Namg==","shasum":"c600eb5bc83dc97e3efa036ea9b2efb9aabd4b62","tarball":"https://registry.npmjs.org/@deksden-com/mb-lint/-/mb-lint-0.4.0.tgz","fileCount":102,"unpackedSize":171345,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGgrIfI72BL5j0BboE1slUjd5QEUevKYjv1WGAqgRJdgAiEA+DVaip5Uvlc/uNiI4Jd1WwGDagc49Cdj1XaWq/Kro5U="}]},"_npmUser":{"name":"deksden","email":"deksden@deksden.com"},"directories":{},"maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mb-lint_0.4.0_1786445300687_0.36953837162258685"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T12:30:09.218Z","modified":"2026-08-11T10:48:21.063Z","0.1.0":"2026-05-15T12:30:09.649Z","0.1.1":"2026-05-24T09:09:37.462Z","0.2.0":"2026-07-01T14:42:33.664Z","0.3.0":"2026-07-04T14:26:39.120Z","0.3.1":"2026-07-06T09:43:22.472Z","0.3.2":"2026-07-22T21:34:53.784Z","0.4.0":"2026-08-11T10:48:20.816Z"},"license":"MIT","description":"Deterministic linter for Memory Bank projects.","maintainers":[{"name":"deksden","email":"deksden@deksden.com"}],"readme":"# mb-lint\n\n`mb-lint` - детерминированный линтер Банка памяти (Memory Bank).\n\nОн должен проверять то, что можно проверить формально: структуру, ссылки, frontmatter, идентификаторы, достижимость документов, качество `DEF-*` и связи из кода в документацию. Он не должен заменять смысловой аудит, архитектурное ревью или решение пользователя.\n\n## Зачем нужен проект\n\nБанк памяти помогает людям и ИИ-агентам работать с проектом через устойчивые документы: спецификации, ADR, планы, сценарии, пользовательские инструкции, операционные правила и доказательства. Но со временем такая система может расползаться:\n\n- появляются битые ссылки;\n- документы теряют достижимость из индексов;\n- один и тот же смысл дублируется в разных местах;\n- `DEF-*` остаются без владельца или следующего шага;\n- кодовые комментарии ссылаются на несуществующие фичи, сценарии или ADR;\n- корневая структура перестаёт соответствовать канону.\n\n`mb-lint` должен закрывать механическую часть этой проблемы. Всё, что требует понимания смысла, остаётся задачей `mb-audit` и обычного ревью.\n\n## Запуск\n\nОпубликованный пакет запускается так:\n\n```bash\nnpx @deksden-com/mb-lint@latest\n```\n\nЛокально из репозитория:\n\n```bash\nnpm install\nnpm run build\nnode ./dist/cli.js --root . --format text\nnode ./dist/cli.js --root . --format json\n```\n\nProgress is always emitted as throttled informational events to `stderr` in\nboth text and JSON modes. `stdout` stays reserved for the final report, so JSON\ncan be parsed without filtering progress lines. The scanner uses one bounded\nasync filesystem pipeline with an internal default concurrency of 32 and\nbatched asynchronous Git checks; this limit is intentionally not a public CLI\nflag. The old opt-in `--progress` flag is no longer accepted.\n\nЧтобы временно сделать локальную сборку глобальной командой без установки из npm:\n\n```bash\nnpm run build\nnpm link\nmb-lint --help\n```\n\n`npm link` создаёт глобальную ссылку на текущую рабочую копию. После проверки её можно снять командой `npm unlink -g @deksden-com/mb-lint`.\n\nПоддерживаемые режимы CLI:\n\n```bash\nnpx @deksden-com/mb-lint@latest --root .\nnpx @deksden-com/mb-lint@latest --memory-bank .memory-bank\nnpx @deksden-com/mb-lint@latest --format json\nnpx @deksden-com/mb-lint@latest --root . --files .memory-bank/changed.md --format json\nnpx @deksden-com/mb-lint@latest rules\n```\n\nВ текущем CLI есть `--root`, `--memory-bank`, `--files <path>...`, `--format text|json`, `--help`, `--version` and `rules`. Режим `--files` принимает один или несколько Memory Bank markdown-путей, проверяет только выбранные документы и отвергает missing, outside, traversal и symlink-escaping пути. Без `--files` сохраняется full-project lint. Warning-as-error флаг будет спроектирован позже.\n\n## Конфигурация\n\nЕсли проект содержит намеренно битые примеры, fixtures или ссылки, которые не должны проверяться, добавь `.mb-lint.json` в корень проекта:\n\n```json\n{\n  \"ignorePaths\": [\"test/fixtures/**\"],\n  \"ignoreFindings\": [\n    {\n      \"ruleId\": \"links/markdown-target-exists\",\n      \"file\": \".memory-bank/example.md\",\n      \"target\": \"missing-example.md\",\n      \"reason\": \"Intentional example link.\"\n    }\n  ]\n}\n```\n\n`ignorePaths` исключает файлы целиком. `ignoreFindings` исключает конкретные findings по `ruleId`, `file` и `target`. Игнор должен быть намеренным: если ссылка должна работать как активная навигация, её нужно чинить, а не скрывать.\n\nGit-aware поведение включено по умолчанию, если проект является Git-репозиторием:\n\n```json\n{\n  \"git\": {\n    \"respectIgnore\": true\n  }\n}\n```\n\nКогда `git.respectIgnore` не равен `false`, `mb-lint` исключает из входного набора файлы, которые одновременно ignored by Git и untracked. Обычные untracked файлы не исключаются: новые документы до `git add` всё ещё должны линтиться.\n\nIgnored рабочие каталоги вроде `.tasks/` не сканируются целиком. Если активный документ ссылается на ignored+untracked файл, `mb-lint` проверяет только конкретный resolved target этой ссылки и выдаёт отдельную ошибку `links/target-ignored-untracked`, потому что такая ссылка ведёт к материалу, который не попадёт в репозиторий.\n\n## Что проверяет mb-lint сейчас\n\nТекущая реализация проверяет только детерминированные свойства:\n\n- есть ли `.memory-bank/` или другой явно указанный путь;\n- есть ли корневые `index.md` и `structure.md`;\n- корректны ли Markdown-ссылки;\n- существуют ли файлы, указанные в поддерживаемых frontmatter relation fields;\n- заполнены ли обязательные поля frontmatter;\n- совпадает ли frontmatter `file` с project-root-relative или MemoryBank-root-relative путём документа;\n- `status` использует `ACTIVE`, `DRAFT` или `DEPRECATED`;\n- `date` имеет формат `YYYY-MM-DD`;\n- `version` имеет формат `major.minor.patch`;\n- path-like frontmatter поля не используют абсолютные локальные пути;\n- type-aware enum/id checks для явно распознанных protocols, protocol sets, ADRs, scenarios and evidence docs;\n- JS/TS doc tags ссылаются на существующие документы Memory Bank;\n- активные Markdown/frontmatter/code ссылки не указывают на git-ignored untracked файлы.\n\nПоддерживаемые frontmatter target fields:\n\n```text\nparent, children, related_files,\nrelated_epics, related_features, related_specs, related_adrs, related_scenarios, related_protocols,\nevidence_files, implementation_files, test_files,\nprotocol_set, source_user_input,\nadr, spec, feature, scenario\n```\n\nКоманда ниже выводит список фактически реализованных правил и ссылки на документы канона:\n\n```bash\nmb-lint rules\n```\n\nПроверки `DEF-*`:\n\n- у `DEF-*` есть причина;\n- указан владелец;\n- указан следующий gate;\n- есть контекст продолжения;\n- понятно, зависит ли блокер от пользователя;\n- указано, что блокируется и что не блокируется;\n- статус согласован с содержанием;\n- закрытый `DEF-*` содержит след закрытия.\n\nПроверки связей кода с Банком памяти:\n\n- теги `@doc`, `@docs`, `@feature`, `@scenario`, `@adr`, `@spec`, `@evidence`, `@epic`, `@protocol` ссылаются на существующие документы;\n- ссылки в JSDoc/TSDoc/docstrings ведут в существующие файлы, когда они оформлены через поддерживаемые doc tags.\n\n## Что пока остаётся кандидатом\n\nЭти проверки описывают желаемое развитие, но не должны считаться реализованными без отдельного rule id:\n\n- соответствует ли карта папок канонической структуре проекта;\n- достижимы ли активные документы из индексов;\n- нет ли активных документов, которые лежат только как сироты;\n- нет ли одинаковых `id`;\n- согласован ли статус документа с его местом: `ACTIVE`, `DRAFT`, `DEPRECATED`, `ARCHIVED`;\n- не лежит ли архивный документ в активном разделе без пометки;\n- не используют ли сценарии, протоколы и матрицы проверки `.tasks/...` как evidence после закрытия работы;\n- нет ли trailing spaces и базовой Markdown-грязи;\n- публичные границы, которые требуют документации по проектным правилам, имеют ссылку на документ;\n- кодовые контракты интерфейса ссылаются на существующие экранные или сценарные спецификации.\n\n## Что mb-lint не должен делать\n\n`mb-lint` не должен решать смысловые вопросы:\n\n- хороша ли архитектура;\n- правильно ли выбран стек;\n- достаточно ли хорошо описана фича;\n- актуальна ли спецификация по смыслу;\n- нужно ли включать найденную практику в канон;\n- какой вариант ответа выбрать за пользователя.\n\nЕсли проверка требует рассуждения, это не lint-правило, а тема для `mb-audit`, `mb-distill`, ADR или обсуждения.\n\n## Источники для будущего mb-init\n\nЭтот README должен быть одним из источников при запуске `mb-init` на проекте `mb-lint`.\n\n`mb-init` должен читать:\n\n- README;\n- будущий `package.json`;\n- исходный код CLI;\n- тесты;\n- конфигурации сборки, линтера и форматтера;\n- комментарии в коде, включая JSDoc/TSDoc;\n- examples и fixtures;\n- CI/CD;\n- `.tasks/`, если они появятся.\n\nЕсли кодовые комментарии объясняют правило, контракт или ограничение, `mb-init` должен учитывать их как источник. Если комментарий противоречит коду, это не становится истиной автоматически: агент должен вынести противоречие в отчёт и при необходимости задать вопрос пользователю.\n\n## Предполагаемая архитектура\n\nПервая версия реализована как CLI на TypeScript.\n\nОсновные части:\n\n- CLI-вход: разбирает аргументы, находит корень проекта и путь Банка памяти;\n- загрузчик правил: собирает кодовые модули правил;\n- сканер Markdown: строит карту документов, ссылок и frontmatter;\n- сканер кода: извлекает JSDoc/TSDoc/docstrings и проверяет ссылки на Банк памяти;\n- движок правил: применяет детерминированные проверки;\n- репортёр: выводит текстовый отчёт и JSON;\n- режим exit codes: возвращает ненулевой код при ошибках нужной серьёзности.\n\nСтек v0.1:\n\n- TypeScript;\n- `gray-matter` для frontmatter;\n- Vitest для тестов;\n- регулярные выражения для детерминированного извлечения Markdown-ссылок и JS/TS doc tags.\n\nTree-sitter можно рассмотреть позже, когда появится многоязычный анализ Python, Go, PHP или других стеков.\n\n## Проверки разработки\n\n```bash\nnpm run typecheck\nnpm run build\nnpm test\nnpm run lint\nnode ./dist/cli.js --root test/fixtures/valid-memory-bank --format json\nnode ./dist/cli.js --root test/fixtures/invalid-memory-bank --format json\nnode ./dist/cli.js --root test/fixtures/code-doc-tags --format json\nnode ./dist/cli.js rules\n```\n\nДля валидного fixture ожидается exit code `0`; для fixtures с ошибками ожидается exit code `1`.\n\nПравила канона описываются кодом. Каждое правило должно быть отдельным модулем с метаданными, стабильным `ruleId`, детерминированной проверкой и структурированными findings. Архитектурный ориентир - модульный подход Biome/ESLint. В первой версии это внутренняя модульность, а не публичный plugin API.\n\nFrontmatter rules are intentionally conservative. They validate explicit machine-readable contracts from `.memory-bank/mbb/frontmatter-standards.md` and related MBB docs; they do not infer whether optional links such as feature/spec/ADR/scenario should exist for a given document.\n\n## Уровни серьёзности\n\nОжидаемые уровни:\n\n- `error` - ошибка ломает навигацию, трассировку или обязательный контракт;\n- `warning` - проблема не ломает работу, но ухудшает качество Банка памяти;\n- `info` - полезное замечание;\n- `suggestion` - кандидат на улучшение.\n\nДля CLI важно различать:\n\n- ошибки, которые должны ломать CI по умолчанию;\n- предупреждения, которые видны в отчёте, но не блокируют работу;\n- рекомендации, которые можно отложить.\n\nПо умолчанию CI ломают только `error`. Warning-as-error режим можно добавить отдельным флагом позже.\n\n## Машиночитаемый отчёт\n\nJSON-отчёт должен быть пригоден для агентов и CI:\n\n```json\n{\n  \"tool\": \"mb-lint\",\n  \"version\": \"0.0.0\",\n  \"root\": \".\",\n  \"memoryBank\": \".memory-bank\",\n  \"summary\": {\n    \"errors\": 0,\n    \"warnings\": 0,\n    \"info\": 0\n  },\n  \"findings\": [\n    {\n      \"ruleId\": \"links/no-broken-markdown-link\",\n      \"severity\": \"error\",\n      \"file\": \".memory-bank/index.md\",\n      \"message\": \"Link target does not exist\",\n      \"target\": \".memory-bank/spec/system/missing.md\"\n    }\n  ]\n}\n```\n\n## Решения для первой версии\n\n- Пакет: `@deksden-com/mb-lint`.\n- Первая версия только сообщает ошибки и не выполняет автоисправления.\n- CI по умолчанию ломают только `error`.\n- Локальный конфиг в первой версии не нужен.\n- Канонические теги кода: `@doc`, `@docs`, `@feature`, `@scenario`, `@adr`, `@spec`, `@evidence`, `@epic`, `@protocol`.\n- Первая версия проверяет Markdown и JS/TS.\n- Стартовый стек: TypeScript CLI.\n- Правила канона описываются кодовыми модулями правил.\n- Первая версия делает full scan, без режима проверки только изменённых файлов в pull request.\n\n## Оставшиеся открытые вопросы\n\n1. Как описывать проектные исключения после появления локального конфига: в конфиге, в frontmatter или отдельном ignore-файле?\n2. Как хранить и версионировать rule modules, если канон `dd-memorybank` меняется?\n3. Как оформлять rule profile для проверки локальных рабочих папок, если проект сознательно коммитит часть `.tasks/`?\n4. Как назвать будущий warning-as-error режим: `--strict`, `--error-on-warnings`, `--max-warnings` или иначе?\n\n## Связь с dd-memorybank\n\n`dd-memorybank` описывает канон Банка памяти и промпты работы с ним.\n\n`mb-lint` должен быть отдельным инструментом, чтобы:\n\n- его можно было запускать в любом проекте;\n- он не смешивал код линтера с каноном;\n- его можно было подключить в CI;\n- агенты могли использовать его как источник механических фактов перед `mb-audit` или `mb-fix`.\n\nИдеальный поток:\n\n```text\nmb-init создаёт Банк памяти\n-> mb-lint проверяет механическую целостность\n-> mb-audit проверяет смысловые аспекты\n-> mb-fix исправляет выбранные проблемы\n```\n","readmeFilename":"README.md"}