@7n/rules 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/package.json +2 -5
- package/rules/doc-files/docgen-crc/docs/main.md +1 -1
- package/rules/doc-files/docgen-crc/main.mjs +5 -12
- package/rules/doc-files/docgen-gen/docs/main.md +1 -1
- package/rules/doc-files/docgen-gen/main.mjs +12 -4
- package/rules/doc-files/docgen-scan/docs/main.md +2 -2
- package/rules/doc-files/docgen-scan/main.mjs +6 -13
- package/schemas/concern.json +4 -0
- package/scripts/auto-rules.mjs +2 -3
- package/scripts/docs/auto-rules.md +1 -1
- package/scripts/lib/concern-meta.mjs +14 -1
- package/scripts/lib/docs/concern-meta.md +3 -6
- package/scripts/lib/docs/glob-to-regex.md +31 -0
- package/scripts/lib/docs/index.md +2 -0
- package/scripts/lib/docs/js-source-signals.md +32 -0
- package/scripts/lib/glob-to-regex.mjs +79 -0
- package/scripts/lib/js-source-signals.mjs +50 -0
- package/scripts/lib/lint-surface/docs/ladder.md +3 -5
- package/scripts/lib/lint-surface/docs/run-fix.md +3 -2
- package/scripts/lib/lint-surface/ladder.mjs +18 -9
- package/scripts/lib/lint-surface/run-fix.mjs +15 -2
- package/scripts/utils/ast-scan-utils.mjs +2 -2
- package/scripts/utils/docs/ast-scan-utils.md +1 -1
- package/scripts/utils/docs/test-helpers.md +2 -1
- package/skills/doc-files/SKILL.md +1 -1
- package/skills/taze/js/docs/orchestrate.md +1 -1
- package/rules/bun/bunfig/bunfig.mdc +0 -17
- package/rules/bun/bunfig/bunfig.rego +0 -29
- package/rules/bun/bunfig/concern.json +0 -9
- package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +0 -2
- package/rules/bun/docs/index.md +0 -11
- package/rules/bun/layout/concern.json +0 -16
- package/rules/bun/layout/docs/fix-layout.md +0 -29
- package/rules/bun/layout/docs/main.md +0 -34
- package/rules/bun/layout/fix-layout.mjs +0 -63
- package/rules/bun/layout/layout.mdc +0 -60
- package/rules/bun/layout/main.mjs +0 -53
- package/rules/bun/licensee/concern.json +0 -7
- package/rules/bun/licensee/docs/fix-licensee.md +0 -27
- package/rules/bun/licensee/docs/index.md +0 -12
- package/rules/bun/licensee/docs/main.md +0 -30
- package/rules/bun/licensee/fix-licensee.mjs +0 -31
- package/rules/bun/licensee/main.mjs +0 -68
- package/rules/bun/lint-surface/concern.json +0 -3
- package/rules/bun/lint-surface/lint-surface.mdc +0 -13
- package/rules/bun/main.json +0 -1
- package/rules/bun/main.mdc +0 -11
- package/rules/bun/package_json/concern.json +0 -9
- package/rules/bun/package_json/docs/fix-package_json.md +0 -28
- package/rules/bun/package_json/docs/index.md +0 -9
- package/rules/bun/package_json/fix-package_json.mjs +0 -311
- package/rules/bun/package_json/package_json.mdc +0 -14
- package/rules/bun/package_json/package_json.rego +0 -64
- package/rules/bun/package_json/template/package.json.deny.json +0 -4
- package/rules/doc-files/docgen-extract/concern.json +0 -3
- package/rules/doc-files/docgen-extract/docs/main.md +0 -38
- package/rules/doc-files/docgen-extract/main.mjs +0 -275
- package/rules/doc-files/units/concern.json +0 -3
- package/rules/doc-files/units/docs/main.md +0 -31
- package/rules/doc-files/units/main.mjs +0 -19
- package/rules/doc-files/units-js/concern.json +0 -3
- package/rules/doc-files/units-js/docs/main.md +0 -32
- package/rules/doc-files/units-js/main.mjs +0 -141
- package/rules/js/check/check.mdc +0 -26
- package/rules/js/check/concern.json +0 -19
- package/rules/js/check/docs/eslint-config.md +0 -56
- package/rules/js/check/docs/fix-check.md +0 -48
- package/rules/js/check/docs/index.md +0 -13
- package/rules/js/check/docs/main.md +0 -48
- package/rules/js/check/eslint-config.mjs +0 -262
- package/rules/js/check/fix-check.mjs +0 -82
- package/rules/js/check/main.mjs +0 -310
- package/rules/js/dep-policy/concern.json +0 -4
- package/rules/js/dep-policy/dep-policy.mdc +0 -36
- package/rules/js/dep-policy/docs/main.md +0 -35
- package/rules/js/dep-policy/main.mjs +0 -99
- package/rules/js/docs/index.md +0 -11
- package/rules/js/eslint/concern.json +0 -7
- package/rules/js/eslint/docs/fix-eslint.md +0 -50
- package/rules/js/eslint/docs/fix-worker.md +0 -31
- package/rules/js/eslint/docs/index.md +0 -11
- package/rules/js/eslint/docs/main.md +0 -35
- package/rules/js/eslint/fix-eslint.mjs +0 -160
- package/rules/js/eslint/fix-worker.mjs +0 -139
- package/rules/js/eslint/main.mjs +0 -115
- package/rules/js/file-extensions/concern.json +0 -3
- package/rules/js/file-extensions/file-extensions.mdc +0 -12
- package/rules/js/jscpd_config/concern.json +0 -11
- package/rules/js/jscpd_config/docs/fix-jscpd_config.md +0 -26
- package/rules/js/jscpd_config/docs/index.md +0 -9
- package/rules/js/jscpd_config/fix-jscpd_config.mjs +0 -3
- package/rules/js/jscpd_config/jscpd_config.mdc +0 -42
- package/rules/js/jscpd_config/jscpd_config.rego +0 -44
- package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +0 -7
- package/rules/js/jscpd_duplicates/concern.json +0 -7
- package/rules/js/jscpd_duplicates/docs/main.md +0 -29
- package/rules/js/jscpd_duplicates/main.mjs +0 -69
- package/rules/js/knip/concern.json +0 -7
- package/rules/js/knip/docs/main.md +0 -32
- package/rules/js/knip/knip.mdc +0 -15
- package/rules/js/knip/main.mjs +0 -68
- package/rules/js/lint-findings/concern.json +0 -3
- package/rules/js/lint-findings/docs/main.md +0 -41
- package/rules/js/lint-findings/main.mjs +0 -125
- package/rules/js/main.json +0 -1
- package/rules/js/main.mdc +0 -18
- package/rules/js/package_json/concern.json +0 -9
- package/rules/js/package_json/docs/fix-package_json.md +0 -26
- package/rules/js/package_json/docs/index.md +0 -9
- package/rules/js/package_json/fix-package_json.mjs +0 -3
- package/rules/js/package_json/package_json.mdc +0 -15
- package/rules/js/package_json/package_json.rego +0 -142
- package/rules/js/package_json/template/package.json.snippet.json +0 -6
- package/rules/js/tooling/concern.json +0 -3
- package/rules/js/tooling/data/tooling/knip-canonical.json +0 -30
- package/rules/js/tooling/data/tooling/oxlint-canonical.json +0 -400
- package/rules/js/tooling/docs/main.md +0 -53
- package/rules/js/tooling/main.mjs +0 -183
- package/rules/js/utils_imports/concern.json +0 -4
- package/rules/js/utils_imports/docs/main.md +0 -50
- package/rules/js/utils_imports/main.mjs +0 -185
- package/rules/js/utils_imports/utils_imports.mdc +0 -15
- package/rules/js/vscode_extensions/concern.json +0 -11
- package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +0 -25
- package/rules/js/vscode_extensions/docs/index.md +0 -11
- package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +0 -1
- package/rules/js/vscode_extensions/template/extensions.json.snippet.json +0 -6
- package/rules/js/vscode_extensions/vscode_extensions.mdc +0 -11
- package/rules/js/vscode_extensions/vscode_extensions.rego +0 -12
- package/rules/js-bun-db/connection/concern.json +0 -3
- package/rules/js-bun-db/connection/connection.mdc +0 -42
- package/rules/js-bun-db/docs/index.md +0 -11
- package/rules/js-bun-db/lib/bun-sql-scan.mjs +0 -1055
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +0 -63
- package/rules/js-bun-db/lib/docs/index.md +0 -11
- package/rules/js-bun-db/main.json +0 -1
- package/rules/js-bun-db/main.mdc +0 -8
- package/rules/js-bun-db/package_json/concern.json +0 -9
- package/rules/js-bun-db/package_json/package_json.mdc +0 -31
- package/rules/js-bun-db/package_json/package_json.rego +0 -15
- package/rules/js-bun-db/package_json/template/package.json.deny.json +0 -6
- package/rules/js-bun-db/pg_format_identifiers/concern.json +0 -3
- package/rules/js-bun-db/pg_format_identifiers/pg_format_identifiers.mdc +0 -104
- package/rules/js-bun-db/safety/concern.json +0 -4
- package/rules/js-bun-db/safety/docs/main.md +0 -34
- package/rules/js-bun-db/safety/main.mjs +0 -430
- package/rules/js-bun-db/safety/safety.mdc +0 -458
- package/rules/js-bun-redis/docs/index.md +0 -11
- package/rules/js-bun-redis/imports/concern.json +0 -4
- package/rules/js-bun-redis/imports/docs/main.md +0 -36
- package/rules/js-bun-redis/imports/imports.mdc +0 -47
- package/rules/js-bun-redis/imports/main.mjs +0 -88
- package/rules/js-bun-redis/lib/docs/index.md +0 -11
- package/rules/js-bun-redis/lib/docs/redis-imports.md +0 -227
- package/rules/js-bun-redis/lib/redis-imports.mjs +0 -130
- package/rules/js-bun-redis/main.json +0 -1
- package/rules/js-bun-redis/main.mdc +0 -8
- package/rules/js-bun-redis/package_json/concern.json +0 -9
- package/rules/js-bun-redis/package_json/package_json.mdc +0 -11
- package/rules/js-bun-redis/package_json/package_json.rego +0 -15
- package/rules/js-bun-redis/package_json/template/package.json.deny.json +0 -12
- package/rules/js-mssql/deps/concern.json +0 -4
- package/rules/js-mssql/deps/docs/main.md +0 -33
- package/rules/js-mssql/deps/main.mjs +0 -297
- package/rules/js-mssql/docs/index.md +0 -11
- package/rules/js-mssql/lib/docs/index.md +0 -11
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +0 -380
- package/rules/js-mssql/lib/mssql-pool-scan.mjs +0 -610
- package/rules/js-mssql/main.json +0 -1
- package/rules/js-mssql/main.mdc +0 -144
- package/rules/js-mssql/mssql-tvp/concern.json +0 -3
- package/rules/js-mssql/mssql-tvp/mssql-tvp.mdc +0 -77
- package/rules/js-mssql/package_json/concern.json +0 -9
- package/rules/js-mssql/package_json/package_json.mdc +0 -9
- package/rules/js-mssql/package_json/package_json.rego +0 -57
- package/rules/js-run/configmap/concern.json +0 -9
- package/rules/js-run/configmap/configmap.mdc +0 -37
- package/rules/js-run/configmap/configmap.rego +0 -21
- package/rules/js-run/configmap/template/configmap.yaml.contains.yml +0 -4
- package/rules/js-run/docs/index.md +0 -11
- package/rules/js-run/jsconfig/concern.json +0 -9
- package/rules/js-run/jsconfig/docs/fix-jsconfig.md +0 -29
- package/rules/js-run/jsconfig/docs/index.md +0 -9
- package/rules/js-run/jsconfig/fix-jsconfig.mjs +0 -119
- package/rules/js-run/jsconfig/jsconfig.mdc +0 -48
- package/rules/js-run/jsconfig/jsconfig.rego +0 -59
- package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +0 -10
- package/rules/js-run/lib/bunyan-imports.mjs +0 -98
- package/rules/js-run/lib/check-env-scan.mjs +0 -338
- package/rules/js-run/lib/conn-file-rules.mjs +0 -214
- package/rules/js-run/lib/conn-imports-scan.mjs +0 -154
- package/rules/js-run/lib/docs/bunyan-imports.md +0 -121
- package/rules/js-run/lib/docs/check-env-scan.md +0 -438
- package/rules/js-run/lib/docs/conn-file-rules.md +0 -304
- package/rules/js-run/lib/docs/conn-imports-scan.md +0 -208
- package/rules/js-run/lib/docs/index.md +0 -16
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +0 -334
- package/rules/js-run/lib/docs/temporal-scan.md +0 -29
- package/rules/js-run/lib/promise-settimeout-scan.mjs +0 -128
- package/rules/js-run/lib/temporal-scan.mjs +0 -52
- package/rules/js-run/main.json +0 -1
- package/rules/js-run/main.mdc +0 -16
- package/rules/js-run/package_json/concern.json +0 -9
- package/rules/js-run/package_json/package_json.mdc +0 -44
- package/rules/js-run/package_json/package_json.rego +0 -37
- package/rules/js-run/package_json/template/package.json.deny.json +0 -22
- package/rules/js-run/project-structure/concern.json +0 -3
- package/rules/js-run/project-structure/project-structure.mdc +0 -11
- package/rules/js-run/runtime/concern.json +0 -12
- package/rules/js-run/runtime/docs/fix-runtime.md +0 -27
- package/rules/js-run/runtime/docs/main.md +0 -35
- package/rules/js-run/runtime/fix-runtime.mjs +0 -46
- package/rules/js-run/runtime/main.mjs +0 -494
- package/rules/js-run/runtime/runtime.mdc +0 -184
- package/rules/js-run/scope/concern.json +0 -3
- package/rules/js-run/scope/scope.mdc +0 -11
- package/rules/npm-module/docs/index.md +0 -11
- package/rules/npm-module/emit_types_config/concern.json +0 -9
- package/rules/npm-module/emit_types_config/docs/fix-emit_types_config.md +0 -25
- package/rules/npm-module/emit_types_config/docs/index.md +0 -9
- package/rules/npm-module/emit_types_config/emit_types_config.mdc +0 -43
- package/rules/npm-module/emit_types_config/emit_types_config.rego +0 -28
- package/rules/npm-module/emit_types_config/fix-emit_types_config.mjs +0 -5
- package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +0 -9
- package/rules/npm-module/header_doc_pointer/concern.json +0 -5
- package/rules/npm-module/header_doc_pointer/docs/main.md +0 -40
- package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +0 -18
- package/rules/npm-module/header_doc_pointer/main.mjs +0 -131
- package/rules/npm-module/main.json +0 -1
- package/rules/npm-module/main.mdc +0 -36
- package/rules/npm-module/npm_package_json/concern.json +0 -9
- package/rules/npm-module/npm_package_json/docs/fix-npm_package_json.md +0 -27
- package/rules/npm-module/npm_package_json/docs/index.md +0 -9
- package/rules/npm-module/npm_package_json/fix-npm_package_json.mjs +0 -5
- package/rules/npm-module/npm_package_json/npm_package_json.mdc +0 -57
- package/rules/npm-module/npm_package_json/npm_package_json.rego +0 -73
- package/rules/npm-module/npm_package_json/template/package.json.snippet.json +0 -1
- package/rules/npm-module/package_structure/concern.json +0 -5
- package/rules/npm-module/package_structure/docs/main.md +0 -37
- package/rules/npm-module/package_structure/main.mjs +0 -515
- package/rules/npm-module/package_structure/package_structure.mdc +0 -63
- package/rules/npm-module/root_package_json/concern.json +0 -9
- package/rules/npm-module/root_package_json/docs/fix-root_package_json.md +0 -26
- package/rules/npm-module/root_package_json/docs/index.md +0 -9
- package/rules/npm-module/root_package_json/fix-root_package_json.mjs +0 -5
- package/rules/npm-module/root_package_json/root_package_json.mdc +0 -41
- package/rules/npm-module/root_package_json/root_package_json.rego +0 -28
- package/rules/npm-module/root_package_json/template/package.json.snippet.json +0 -1
- package/rules/npm-module/rule_meta/concern.json +0 -8
- package/rules/npm-module/rule_meta/docs/main.md +0 -35
- package/rules/npm-module/rule_meta/main.mjs +0 -119
- package/rules/npm-module/rule_meta/rule_meta.mdc +0 -11
- package/rules/npm-module/skill_meta/concern.json +0 -5
- package/rules/npm-module/skill_meta/docs/main.md +0 -149
- package/rules/npm-module/skill_meta/main.mjs +0 -91
- package/rules/npm-module/skill_meta/skill_meta.mdc +0 -11
- package/rules/tool-surface/docs/index.md +0 -11
- package/rules/tool-surface/main.json +0 -6
- package/rules/tool-surface/main.mdc +0 -72
- package/rules/vue/composition-api/composition-api.mdc +0 -82
- package/rules/vue/composition-api/concern.json +0 -3
- package/rules/vue/docs/index.md +0 -11
- package/rules/vue/lib/docs/index.md +0 -11
- package/rules/vue/lib/docs/vue-forbidden-imports.md +0 -265
- package/rules/vue/lib/vue-forbidden-imports.mjs +0 -264
- package/rules/vue/main.json +0 -1
- package/rules/vue/main.mdc +0 -18
- package/rules/vue/nheader-layout/concern.json +0 -3
- package/rules/vue/nheader-layout/nheader-layout.mdc +0 -171
- package/rules/vue/package_json/concern.json +0 -9
- package/rules/vue/package_json/package_json.mdc +0 -30
- package/rules/vue/package_json/package_json.rego +0 -140
- package/rules/vue/packages/concern.json +0 -6
- package/rules/vue/packages/docs/index.md +0 -11
- package/rules/vue/packages/docs/main.md +0 -35
- package/rules/vue/packages/main.mjs +0 -575
- package/rules/vue/packages/packages.mdc +0 -56
- package/rules/vue/quasar-ui/concern.json +0 -3
- package/rules/vue/quasar-ui/quasar-ui.mdc +0 -32
- package/rules/vue/structure/concern.json +0 -3
- package/rules/vue/structure/structure.mdc +0 -101
- package/rules/vue/testing/concern.json +0 -3
- package/rules/vue/testing/testing.mdc +0 -40
- package/rules/vue/tfm-translations/concern.json +0 -7
- package/rules/vue/tfm-translations/docs/main.md +0 -29
- package/rules/vue/tfm-translations/main.mjs +0 -55
- package/rules/vue/tfm-translations/tfm-translations.mdc +0 -32
- package/rules/vue/vite-config/concern.json +0 -3
- package/rules/vue/vite-config/vite-config.mdc +0 -153
- package/rules/vue/vite-env/concern.json +0 -3
- package/rules/vue/vite-env/vite-env.mdc +0 -61
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.28.0] - 2026-07-19
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- lint: JS-сімʼя правил (js, bun, vue, js-run, js-bun-db, js-bun-redis, js-mssql, npm-module, tool-surface) переїхала з ядра у @7n/rules-lang-js (фаза 5c spec lang-plugins-extraction); ядро лишає рушій (auto-rules предикати, glob-to-regex і js-source-signals у scripts/lib — плагін імпортує їх назад через @7n/rules/scripts); залежності eslint/knip/jscpd/oxlint переїхали з ядра у плагін
|
|
8
|
+
|
|
9
|
+
## [1.27.0] - 2026-07-19
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- LLM-ladder: окремий (більший) таймаут cloud-avg (N_CLOUD_AVG_FIX_TIMEOUT_MS, дефолт 180s) та concern-рівневий skipLocalTier (concern.json) — пропуск local-min/local-min-retry для concern-ів, де local-tier емпірично не встигає дати результат (js/eslint увімкнено за реальними даними прогону)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- doc-files: ядро без вбудованих кодових розширень (фаза 5b spec lang-plugins-extraction) — перелік розширень, OKF-типи та мовні екстрактори (факти/юніти) приходять лише з декларацій активних lang-плагінів (contributes.docFiles.extensions + handler doc-files); JS-специфіка (extractFacts, units-js, мапа типів js/mjs/ts/vue) переїхала у @7n/rules-lang-js; без активного lang-плагіна скан не бачить джерел (graceful тиша)
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Червоний lint на main: дубльовані тести мосту auto-worktree (auto-worktree.test.mjs ↔ orchestrate.test.mjs) зібрано у спільний набір `describeAutoWorktreeBridge` (scripts/utils/tests/auto-worktree-suite.mjs); `tests/**` виключено з npm-tarball; `jscpd` (спавниться як `bunx jscpd`) додано в knip ignoreDependencies
|
|
22
|
+
|
|
3
23
|
## [1.26.0] - 2026-07-19
|
|
4
24
|
|
|
5
25
|
### Changed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@7n/rules",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.28.0",
|
|
4
4
|
"description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"!**/*.test.mjs",
|
|
44
44
|
"!**/*_test.rego",
|
|
45
45
|
"!**/test-helpers.mjs",
|
|
46
|
+
"!**/tests/**",
|
|
46
47
|
"!**/fixtures/**",
|
|
47
48
|
"!**/__fixtures__/**"
|
|
48
49
|
],
|
|
@@ -69,15 +70,11 @@
|
|
|
69
70
|
"@zed-industries/agent-client-protocol": "^0.4.5",
|
|
70
71
|
"ajv": "^8.20.0",
|
|
71
72
|
"cli-progress": "^3.12.0",
|
|
72
|
-
"eslint": "^10.4.1",
|
|
73
73
|
"github-actionlint": "^1.7.12",
|
|
74
74
|
"globby": "^16.0.0",
|
|
75
75
|
"ignore": "^7.0.5",
|
|
76
|
-
"jscpd": "^5.0.11",
|
|
77
|
-
"knip": "^6.22.0",
|
|
78
76
|
"markdownlint-cli2": "^0.22.1",
|
|
79
77
|
"oxc-parser": "^0.137.0",
|
|
80
|
-
"oxlint": "^1.68.0",
|
|
81
78
|
"picomatch": "^4.0.4",
|
|
82
79
|
"smol-toml": "^1.7.0",
|
|
83
80
|
"v8r": "^6.1.0",
|
|
@@ -67,24 +67,17 @@ export function parseDocFrontmatter(md) {
|
|
|
67
67
|
/** Максимум кодів issues у frontmatter — це маркер, а не повний лог. */
|
|
68
68
|
const MAX_ISSUE_CODES = 8
|
|
69
69
|
|
|
70
|
-
/** OKF type для вбудованих розширень; мовні (`.rs`, `.py`) декларують lang-плагіни. */
|
|
71
|
-
const EXT_TYPES = {
|
|
72
|
-
'.js': 'JS Module',
|
|
73
|
-
'.mjs': 'JS Module',
|
|
74
|
-
'.cjs': 'JS Module',
|
|
75
|
-
'.ts': 'TS Module',
|
|
76
|
-
'.vue': 'Vue Component'
|
|
77
|
-
}
|
|
78
|
-
|
|
79
70
|
/**
|
|
80
|
-
* OKF `type` для файлу-джерела за розширенням
|
|
81
|
-
*
|
|
71
|
+
* OKF `type` для файлу-джерела за розширенням — лише з декларацій активних
|
|
72
|
+
* lang-плагінів (`contributes.docFiles.extensions`: js/mjs/ts/vue — lang-js,
|
|
73
|
+
* `.rs`/`.py` — lang-rust/lang-python); вбудованих типів у ядрі немає
|
|
74
|
+
* (фаза 5b spec lang-plugins-extraction). Невідоме розширення → 'Source File'.
|
|
82
75
|
* @param {string} sourcePath відносний шлях джерела
|
|
83
76
|
* @returns {string} тип концепту
|
|
84
77
|
*/
|
|
85
78
|
function typeForSource(sourcePath) {
|
|
86
79
|
const ext = extname(sourcePath).toLowerCase()
|
|
87
|
-
return
|
|
80
|
+
return pluginDocFilesExtensions(process.cwd())[ext] ?? 'Source File'
|
|
88
81
|
}
|
|
89
82
|
|
|
90
83
|
/**
|
|
@@ -8,7 +8,6 @@ import { startChain } from '@7n/llm-lib/chain'
|
|
|
8
8
|
import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
|
|
9
9
|
import { docPathForSource } from '../docgen-scan/main.mjs'
|
|
10
10
|
import { loadDocFilesExtractors } from '../docgen-scan/lang-extensions.mjs'
|
|
11
|
-
import { extractFacts } from '../docgen-extract/main.mjs'
|
|
12
11
|
import { extractAnchors, anchorTokens } from '../docgen-extract-anchors/main.mjs'
|
|
13
12
|
import { QUALITY_THRESHOLD } from '../docgen-crc/main.mjs'
|
|
14
13
|
import { JUDGE_ENABLED, JUDGE_MODEL, detectRefusalFiller, judgeDoc, judgeFailsDoc } from '../docgen-judge/main.mjs'
|
|
@@ -507,11 +506,20 @@ export async function generateDoc(
|
|
|
507
506
|
`docgen pre-send guard: джерело ~${estTokens} токенів > бюджет ${budget} (0.5× контексту) — Prompt too long, skip`
|
|
508
507
|
)
|
|
509
508
|
}
|
|
510
|
-
//
|
|
511
|
-
//
|
|
509
|
+
// Факт-лист — лише від мовного екстрактора lang-плагіна (js/mjs/ts —
|
|
510
|
+
// lang-js, `.rs` — lang-rust); без екстрактора для розширення — whole-file
|
|
511
|
+
// шлях через `unsupported` (у ядрі вбудованих екстракторів немає, фаза 5b).
|
|
512
512
|
const langExtractors = await loadDocFilesExtractors(process.cwd())
|
|
513
513
|
const ext = `.${file.split('.').pop()}`.toLowerCase()
|
|
514
|
-
const facts = langExtractors.get(ext)?.extractFacts?.(src, file) ??
|
|
514
|
+
const facts = langExtractors.get(ext)?.extractFacts?.(src, file) ?? {
|
|
515
|
+
relPath: file,
|
|
516
|
+
lang: ext.slice(1),
|
|
517
|
+
unsupported: true,
|
|
518
|
+
header: '',
|
|
519
|
+
exports: [],
|
|
520
|
+
imports: {},
|
|
521
|
+
markers: {}
|
|
522
|
+
}
|
|
515
523
|
const t0 = Date.now()
|
|
516
524
|
llmMeter = { calls: 0, ms: 0 }
|
|
517
525
|
const chain = chainFactory({ kind: 'doc-generate', unit: facts.relPath, cwd: process.cwd() })
|
|
@@ -3,7 +3,7 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/doc-files/docgen-scan/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 8729f94f
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
issues: judge:inaccurate:0.99
|
|
@@ -15,7 +15,7 @@ docgen:
|
|
|
15
15
|
|
|
16
16
|
## Поведінка
|
|
17
17
|
|
|
18
|
-
isSourceFile визначає, чи є ім'я файлу кодовим джерелом для генерації документації, виключаючи файли тестів і файли декларацій
|
|
18
|
+
isSourceFile визначає, чи є ім'я файлу кодовим джерелом для генерації документації, виключаючи файли тестів і файли декларацій типів; перелік кодових розширень береться ВИКЛЮЧНО з декларацій активних lang-плагінів (`contributes.docFiles.extensions`: js/mjs/ts/vue — lang-js, `.rs`/`.py` — lang-rust/lang-python), у ядрі вбудованих розширень немає (фаза 5b) — без активного lang-плагіна скан не бачить жодного джерела.
|
|
19
19
|
docPathForSource обчислює очікуваний шлях до markdown-документа для заданого кодового джерельного шляху, розміщуючи його у теці `docs` поруч із джерелом.
|
|
20
20
|
isDocCandidate визначає, чи повинен файл підлягати документуванню, перевіряючи його тип, статус тесту, статус ігнорування та чи не є він частиною системних документації.
|
|
21
21
|
describeFile описує кодовий файл, надаючи шлях джерела та шлях до відповідного документа, а також статус його застарілості за CRC. Якщо док-файл існує, але без `docgen:`-CRC у frontmatter (рукописна дока), файл позначається `foreign: true` і НЕ вважається застарілим — людський зміст рахується чинною документацією і мовчки не перезаписується (перезапис лише explicit `--overwrite` у batch-CLI).
|
|
@@ -7,13 +7,6 @@ import { isDocgenIgnored } from '../docgen-ignore/main.mjs'
|
|
|
7
7
|
import { parseDocFrontmatter, readDocCrc, staleness } from '../docgen-crc/main.mjs'
|
|
8
8
|
import { pluginDocFilesExtensions } from './lang-extensions.mjs'
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Вбудовані кодові розширення, для яких генеруємо документацію. Мовні
|
|
12
|
-
* розширення поза JS-екосистемою (`.rs`, `.py`) декларують lang-плагіни
|
|
13
|
-
* (`n-rules.contributes.docFiles.extensions`) — див. lang-extensions.mjs.
|
|
14
|
-
*/
|
|
15
|
-
const SOURCE_EXTENSIONS = new Set(['.js', '.mjs', '.ts', '.vue'])
|
|
16
|
-
|
|
17
10
|
/** `*.test.*`, `*.spec.*`, `*.stories.*` — тести й Storybook CSF-файли, документувати не треба. */
|
|
18
11
|
const TEST_FILE_RE = /\.(?:test|spec|stories)\.[^.]+$/u
|
|
19
12
|
|
|
@@ -29,18 +22,18 @@ function isSystemWideDocsRoot(root) {
|
|
|
29
22
|
}
|
|
30
23
|
|
|
31
24
|
/**
|
|
32
|
-
* Чи є файл кодовим джерелом для документування.
|
|
33
|
-
*
|
|
25
|
+
* Чи є файл кодовим джерелом для документування. Розширення декларують ЛИШЕ
|
|
26
|
+
* активні lang-плагіни (`n-rules.contributes.docFiles.extensions` — js/mjs/ts/vue
|
|
27
|
+
* дає `@7n/rules-lang-js`, .rs/.py — lang-rust/lang-python); у ядрі вбудованих
|
|
28
|
+
* розширень немає (фаза 5b spec lang-plugins-extraction).
|
|
34
29
|
* @param {string} fileName базове ім'я файлу
|
|
35
|
-
* @param {string}
|
|
30
|
+
* @param {string} root корінь репозиторію (джерело плагінних розширень)
|
|
36
31
|
* @returns {boolean} true — документуємо; false — пропускаємо
|
|
37
32
|
*/
|
|
38
33
|
export function isSourceFile(fileName, root) {
|
|
39
34
|
if (fileName.endsWith('.d.ts')) return false
|
|
40
35
|
if (TEST_FILE_RE.test(fileName)) return false
|
|
41
|
-
|
|
42
|
-
if (SOURCE_EXTENSIONS.has(ext)) return true
|
|
43
|
-
return root !== undefined && ext in pluginDocFilesExtensions(root)
|
|
36
|
+
return extname(fileName) in pluginDocFilesExtensions(root)
|
|
44
37
|
}
|
|
45
38
|
|
|
46
39
|
/**
|
package/schemas/concern.json
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
],
|
|
20
20
|
"description": "Маршрутизація fix-движка. Усі мітки виконують детерміновану фазу T0; різниця — що після неї. `code` (дефолт, поле можна опускати) — джерельні порушення, які LLM може осмислено переписати → повна pi-agent-ladder (local→cloud) до чистого re-detect. `config` — canon/settings/tooling конфіг з єдиною правильною формою (jscpd/oxfmtrc/tooling/package_json/*_yml): фікс детермінований (T0/regen з канону), LLM лише вгадав би невалідне → після T0 fail-fast без ladder. `structural` — дублікати/розташування/структура (jscpd_duplicates/test-location/package-structure): авто-правка ризикована й потребує людського розсуду → після T0 fail-fast без ladder. config vs structural різняться мотивом пропуску (детермінований канон vs надто ризиковано) — для телеметрії й майбутнього routing."
|
|
21
21
|
},
|
|
22
|
+
"skipLocalTier": {
|
|
23
|
+
"type": "boolean",
|
|
24
|
+
"description": "Дефолт `false` (поле можна опускати). `true` пропускає local-min/local-min-retry rung-и LLM-ladder-а для цього concern-а — перша спроба одразу йде на cloud-min. Для concern-ів, де local-tier (слабка локальна модель, короткий бюджет) емпірично майже завжди лише витрачає час rung-а без результату, перш ніж ladder однаково ескалює далі."
|
|
25
|
+
},
|
|
22
26
|
"check": {
|
|
23
27
|
"type": "boolean",
|
|
24
28
|
"const": true,
|
package/scripts/auto-rules.mjs
CHANGED
|
@@ -23,14 +23,13 @@ import { fileURLToPath } from 'node:url'
|
|
|
23
23
|
import { globby } from 'globby'
|
|
24
24
|
|
|
25
25
|
import { ALWAYS_IGNORE } from './utils/walkDir.mjs'
|
|
26
|
-
import { globToRegex } from '
|
|
27
|
-
import { textHasBunSqlImport } from '
|
|
26
|
+
import { globToRegex } from './lib/glob-to-regex.mjs'
|
|
27
|
+
import { textHasBunSqlImport, contentForVueImportScan } from './lib/js-source-signals.mjs'
|
|
28
28
|
import {
|
|
29
29
|
isGqlScanSourceFile,
|
|
30
30
|
shouldSkipFileForGqlScan,
|
|
31
31
|
sourceFileHasGqlTaggedTemplate
|
|
32
32
|
} from '../rules/graphql/lib/graphql-gql-scan.mjs'
|
|
33
|
-
import { contentForVueImportScan } from '../rules/vue/lib/vue-forbidden-imports.mjs'
|
|
34
33
|
import { parseRuleAutoSpec, readRuleMetaRaw } from './lib/rule-meta.mjs'
|
|
35
34
|
import { migrateRuleIds, normalizeIdList } from './lib/rule-meta-helpers.mjs'
|
|
36
35
|
import { RULE_PREDICATES } from './lib/rule-predicates.mjs'
|
|
@@ -34,6 +34,10 @@ import { join } from 'node:path'
|
|
|
34
34
|
* @property {PolicySurface|undefined} policy policy-поверхня concern-а (rego/template) або undefined.
|
|
35
35
|
* @property {LintSurface|undefined} lint lint-поверхня concern-а або undefined.
|
|
36
36
|
* @property {Fixability} fixability маршрутизація fix-движка (дефолт `code`): `config`/`structural` пропускають LLM-ladder.
|
|
37
|
+
* @property {boolean} skipLocalTier дефолт `false`: `true` пропускає local-min/local-min-retry rung-и
|
|
38
|
+
* ladder-а — ladder одразу стартує з cloud-min. Для concern-ів, де local-tier емпірично не встигає
|
|
39
|
+
* дати результат у межах свого бюджету (напр. js/eslint — 0/12 успіхів у реальному прогоні, лише
|
|
40
|
+
* витрачений час).
|
|
37
41
|
*/
|
|
38
42
|
|
|
39
43
|
/**
|
|
@@ -119,7 +123,16 @@ export async function readConcernMeta(concernDir, name) {
|
|
|
119
123
|
? raw.requires.capability
|
|
120
124
|
: undefined
|
|
121
125
|
|
|
122
|
-
return {
|
|
126
|
+
return {
|
|
127
|
+
name,
|
|
128
|
+
dir: concernDir,
|
|
129
|
+
check,
|
|
130
|
+
policy,
|
|
131
|
+
lint,
|
|
132
|
+
requiresCapability,
|
|
133
|
+
fixability: parseFixability(raw.fixability),
|
|
134
|
+
skipLocalTier: raw.skipLocalTier === true
|
|
135
|
+
}
|
|
123
136
|
}
|
|
124
137
|
|
|
125
138
|
/**
|
|
@@ -3,12 +3,8 @@ type: JS Module
|
|
|
3
3
|
title: concern-meta.mjs
|
|
4
4
|
resource: npm/scripts/lib/concern-meta.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
8
|
-
tier: local-min
|
|
9
|
-
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.97
|
|
11
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
6
|
+
crc: ccc325b1
|
|
7
|
+
model: manual
|
|
12
8
|
---
|
|
13
9
|
|
|
14
10
|
## Огляд
|
|
@@ -21,6 +17,7 @@ docgen:
|
|
|
21
17
|
readConcernMeta зчитує і перевіряє файл concern.json у вказаній директорії concern-а, повертаючи метадані або null, якщо файл відсутній чи не валідний.
|
|
22
18
|
listConcerns сканує директорію правил і повертає список усіх знайдених concern-ів у алфавітному порядку, ігноруючи каталоги без concern.json.
|
|
23
19
|
Нормалізований meta несе `fixability` (`code`|`config`|`structural`); невідоме/відсутнє значення зводиться до `code` — дефолт, за яким concern лишається eligible для LLM-fix-ladder.
|
|
20
|
+
Нормалізований meta несе також `skipLocalTier` (boolean, дефолт `false`): `true` — concern пропускає local-min/local-min-retry rung-и LLM-ladder-а, перша спроба одразу йде на cloud-min. Для concern-ів, де local-tier емпірично майже завжди лише витрачає бюджет rung-а без результату (напр. `js/eslint`).
|
|
24
21
|
|
|
25
22
|
## Публічний API
|
|
26
23
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: glob-to-regex.mjs
|
|
4
|
+
resource: npm/scripts/lib/glob-to-regex.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 6c55d687
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
|
+
score: 100
|
|
10
|
+
issues: judge:inaccurate:0.98
|
|
11
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Огляд
|
|
15
|
+
|
|
16
|
+
`globToRegex` перетворює glob-патерни на `RegExp`, щоб `auto-rules.mjs` міг зіставляти `main.json:auto.glob` зі зміненими файлами, а правило npm-module з `@7n/rules-lang-js` — перевіряти `files` у `package.json` тим самим способом. Це спільна основа для однакового тлумачення шляхових шаблонів у `main.json` і `package.json` без запису стану; конфіги, на які спирається код: `main.json`, `package.json`.
|
|
17
|
+
|
|
18
|
+
## Поведінка
|
|
19
|
+
|
|
20
|
+
1. `globToRegex` перетворює glob-патерн на `RegExp` з повними межами збігу, щоб один і той самий шаблон можна було застосовувати і до автодетекту змінених файлів, і до перевірок `files` у `package.json`.
|
|
21
|
+
2. Вона трактує `**` як охоплення будь-якої кількості шляхових сегментів, `*` — як будь-яку послідовність символів у межах одного сегмента, `?` — як один символ у межах одного сегмента, а brace-альтернативи — як вибір одного з кількох варіантів.
|
|
22
|
+
3. Вона зберігає літеральний зміст символів, які у регулярних виразах мають спеціальне значення, щоб шаблон поводився як glob, а не як довільний текстовий вираз.
|
|
23
|
+
4. Вона повертає готовий шаблон для перевірки шляхів у бізнес-правилах, що читають `main.json` і `package.json`, не торкаючись файлової системи чи інших даних поза входом.
|
|
24
|
+
|
|
25
|
+
## Публічний API
|
|
26
|
+
|
|
27
|
+
- globToRegex — Перетворює glob-патерни з `files` та `main.json:auto.glob` у `RegExp` з прив’язкою до початку й кінця рядка; підтримує `**`, `*`, `?` і `{a,b,c}` для варіантів, без `[…]`.
|
|
28
|
+
|
|
29
|
+
## Гарантії поведінки
|
|
30
|
+
|
|
31
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -20,7 +20,9 @@ resource: npm/scripts/lib/
|
|
|
20
20
|
| [ensure-tool.mjs](ensure-tool.md) | JS Module |
|
|
21
21
|
| [generated-markdown.mjs](generated-markdown.md) | JS Module |
|
|
22
22
|
| [gha-workflow.mjs](gha-workflow.md) | JS Module |
|
|
23
|
+
| [glob-to-regex.mjs](glob-to-regex.md) | JS Module |
|
|
23
24
|
| [inline-template-links.mjs](inline-template-links.md) | JS Module |
|
|
25
|
+
| [js-source-signals.mjs](js-source-signals.md) | JS Module |
|
|
24
26
|
| [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
|
|
25
27
|
| [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
|
|
26
28
|
| [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: js-source-signals.mjs
|
|
4
|
+
resource: npm/scripts/lib/js-source-signals.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 4a8d80d5
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
|
+
score: 100
|
|
10
|
+
issues: judge:inaccurate:0.97
|
|
11
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Огляд
|
|
15
|
+
|
|
16
|
+
`auto-rules.mjs` викликає ці regex-only текстові сигнали на кожному зміненому файлі, без AST, щоб швидко збирати факти для авто-детекту правил у JS/TS/Vue-джерелах. Спільні функції `textHasBunSqlImport`, `extractVueScriptBlocks` і `contentForVueImportScan` живуть у `@7n/rules/scripts/lib/…` і використовуються також правилами `@7n/rules-lang-js` для `js-bun-db` та `vue`, щоб не дублювати одні й ті самі сигнали в різних місцях. Компонент read-only і не пише у ФС чи БД.
|
|
17
|
+
|
|
18
|
+
## Поведінка
|
|
19
|
+
|
|
20
|
+
- `textHasBunSqlImport` — визначає, чи в тексті є імпорт `sql` або `SQL` з `bun`.
|
|
21
|
+
- `extractVueScriptBlocks` — витягує з Vue SFC увесь код із `<script>`-блоків і склеює його в один текст.
|
|
22
|
+
- `contentForVueImportScan` — готує вміст до сканування: для `.vue` лишає тільки `<script>`-блоки, для інших файлів бере весь текст.
|
|
23
|
+
|
|
24
|
+
## Публічний API
|
|
25
|
+
|
|
26
|
+
- textHasBunSqlImport — знаходить у сирому тексті імпорт `sql` або `SQL` з `"bun"` для швидкого визначення, чи є в файлі доступ до Bun SQL API.
|
|
27
|
+
- extractVueScriptBlocks — дістає з Vue SFC лише вміст `<script>`, щоб аналіз не зачіпав template.
|
|
28
|
+
- contentForVueImportScan — для `.vue` бере тільки script-блоки, а для інших файлів — увесь текст, щоб сканувати саме релевантний код.
|
|
29
|
+
|
|
30
|
+
## Гарантії поведінки
|
|
31
|
+
|
|
32
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Перетворення glob-патернів у RegExp — утиліт рушія авто-детекту правил
|
|
3
|
+
* (`auto-rules.mjs` матчить `main.json:auto.glob` по зміненим файлам) і
|
|
4
|
+
* перевірок `files` у package.json (правило npm-module з `@7n/rules-lang-js`).
|
|
5
|
+
* Живе в ядрі (фаза 5c spec lang-plugins-extraction): рушій не залежить від
|
|
6
|
+
* плагінів, а плагінні правила імпортують через `@7n/rules/scripts/lib/…`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** Символи зі спеціальним значенням у RegExp, які в glob — літерали (екрануємо). */
|
|
10
|
+
const REGEX_SPECIAL_IN_GLOB = new Set(['.', '+', '^', '$', '{', '}', '(', ')', '|', '[', ']', '\\'])
|
|
11
|
+
|
|
12
|
+
const GLOBSTAR_LEADING_RE = /^__GLOBSTAR__\//u
|
|
13
|
+
const GLOBSTAR_TRAILING_RE = /\/__GLOBSTAR__$/u
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Перетворює glob-патерн (як у npm `files` чи `main.json:auto.glob`) у `RegExp`
|
|
17
|
+
* з якорями `^` / `$`. Підтримує globstar (нуль або більше сегментів), `*`
|
|
18
|
+
* (символи без `/`), `?` (один символ без `/`) і brace-альтернативи `{a,b,c}`
|
|
19
|
+
* (наприклад `*.{png,jpg,svg}` → `(?:png|jpg|svg)`). Клас `[…]` не
|
|
20
|
+
* підтримується — у негативних патернах `files` цього достатньо.
|
|
21
|
+
* @param {string} glob posix-шлях у glob-нотації
|
|
22
|
+
* @returns {RegExp} `RegExp` з якорями `^` / `$`
|
|
23
|
+
*/
|
|
24
|
+
export function globToRegex(glob) {
|
|
25
|
+
const parts = glob.split('/')
|
|
26
|
+
const tokens = parts.map(p => {
|
|
27
|
+
if (p === '**') return '__GLOBSTAR__'
|
|
28
|
+
let out = ''
|
|
29
|
+
let braceDepth = 0
|
|
30
|
+
for (const c of p) {
|
|
31
|
+
switch (c) {
|
|
32
|
+
case '*': {
|
|
33
|
+
out += '[^/]*'
|
|
34
|
+
continue
|
|
35
|
+
}
|
|
36
|
+
case '?': {
|
|
37
|
+
out += '[^/]'
|
|
38
|
+
continue
|
|
39
|
+
}
|
|
40
|
+
case '{': {
|
|
41
|
+
out += '(?:'
|
|
42
|
+
braceDepth++
|
|
43
|
+
continue
|
|
44
|
+
}
|
|
45
|
+
case '}': {
|
|
46
|
+
if (braceDepth > 0) {
|
|
47
|
+
out += ')'
|
|
48
|
+
braceDepth--
|
|
49
|
+
continue
|
|
50
|
+
}
|
|
51
|
+
break
|
|
52
|
+
}
|
|
53
|
+
case ',': {
|
|
54
|
+
if (braceDepth > 0) {
|
|
55
|
+
out += '|'
|
|
56
|
+
continue
|
|
57
|
+
}
|
|
58
|
+
break
|
|
59
|
+
}
|
|
60
|
+
default: {
|
|
61
|
+
break
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
out += REGEX_SPECIAL_IN_GLOB.has(c) ? `\\${c}` : c
|
|
65
|
+
}
|
|
66
|
+
return out
|
|
67
|
+
})
|
|
68
|
+
let re = tokens.join('/')
|
|
69
|
+
re = re.replaceAll('/__GLOBSTAR__/', '(?:/.*/|/)')
|
|
70
|
+
re = re.replace(GLOBSTAR_LEADING_RE, '(?:.*/)?')
|
|
71
|
+
re = re.replace(GLOBSTAR_TRAILING_RE, '(?:/.*)?')
|
|
72
|
+
re = re.replaceAll('__GLOBSTAR__', '.*')
|
|
73
|
+
// Дозволено: уся функція існує саме для конструкції RegExp з glob-pattern
|
|
74
|
+
// (значення з package.json `files` або main.json `auto.glob`, не від
|
|
75
|
+
// кінцевого користувача), і спецсимволи вже екрановано через
|
|
76
|
+
// `REGEX_SPECIAL_IN_GLOB` вище.
|
|
77
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
78
|
+
return new RegExp(`^${re}$`, 'u')
|
|
79
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Дешеві текстові сигнали JS/TS/Vue-джерел для збору фактів авто-детекту правил
|
|
3
|
+
* (`auto-rules.mjs` кличе їх на кожному зміненому файлі — без AST, лише regex).
|
|
4
|
+
* Живуть у ядрі (фаза 5c spec lang-plugins-extraction): рушій авто-детекту не
|
|
5
|
+
* імпортує код плагінів, а правила `@7n/rules-lang-js` (js-bun-db, vue)
|
|
6
|
+
* використовують ці ж функції через `@7n/rules/scripts/lib/…` — одне джерело
|
|
7
|
+
* правди без дублювання regex-ів.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const BUN_SQL_IMPORT_RE = /\bimport\s*\{[\s\S]*?\b(sql|SQL)\b[\s\S]*?\}\s*from\s*["']bun["']/u
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Чи містить текст джерела імпорт імені `sql` або `SQL` з `"bun"`.
|
|
14
|
+
* Скан по сирому тексту — без AST, щоб бути дешевим: викликається на кожному
|
|
15
|
+
* JS/TS-файлі при зборі ознак для авто-детекту правил.
|
|
16
|
+
* @param {string} content вміст файлу
|
|
17
|
+
* @returns {boolean} true, якщо є імпорт sql або SQL з модуля bun
|
|
18
|
+
*/
|
|
19
|
+
export function textHasBunSqlImport(content) {
|
|
20
|
+
return BUN_SQL_IMPORT_RE.test(content)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Витягує з SFC лише код усередині `<script>`, щоб не чіпати шаблон.
|
|
25
|
+
* @param {string} sfc вміст .vue файлу
|
|
26
|
+
* @returns {string} текст усередині тегів `<script>` (усі блоки поспіль)
|
|
27
|
+
*/
|
|
28
|
+
export function extractVueScriptBlocks(sfc) {
|
|
29
|
+
const chunks = []
|
|
30
|
+
const re = /<script\b[^>]*>([\s\S]*?)<\/script>/gi
|
|
31
|
+
let m = re.exec(sfc)
|
|
32
|
+
while (m) {
|
|
33
|
+
chunks.push(m[1])
|
|
34
|
+
m = re.exec(sfc)
|
|
35
|
+
}
|
|
36
|
+
return chunks.join('\n\n')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Підбирає текст для сканування: для .vue — лише script-блоки, інакше — увесь вміст.
|
|
41
|
+
* @param {string} content сирий вміст файлу
|
|
42
|
+
* @param {string} filePath відносний шлях (для вибору режиму)
|
|
43
|
+
* @returns {string} текст для парсера/regex-сканів
|
|
44
|
+
*/
|
|
45
|
+
export function contentForVueImportScan(content, filePath) {
|
|
46
|
+
if (filePath.endsWith('.vue')) {
|
|
47
|
+
return extractVueScriptBlocks(content)
|
|
48
|
+
}
|
|
49
|
+
return content
|
|
50
|
+
}
|
|
@@ -3,10 +3,8 @@ type: JS Module
|
|
|
3
3
|
title: ladder.mjs
|
|
4
4
|
resource: npm/scripts/lib/lint-surface/ladder.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
8
|
-
score: 100
|
|
9
|
-
issues: judge:inaccurate:0.97
|
|
6
|
+
crc: f02de1a2
|
|
7
|
+
model: manual
|
|
10
8
|
---
|
|
11
9
|
|
|
12
10
|
## Огляд
|
|
@@ -17,7 +15,7 @@ docgen:
|
|
|
17
15
|
|
|
18
16
|
- `DEFAULT_MAX_AVG` задає типовий ліміт звернень до середнього cloud-рівня за один прогін, щоб ескалація не витрачала надмірно дорогий ресурс.
|
|
19
17
|
- `buildLadder` формує послідовність рівнів виправлення від локального мінімального до cloud-avg і відкидає недоступні рівні без моделі.
|
|
20
|
-
- Кожен rung несе `timeoutMs` — per-tier таймаут виклику (ADR 260620-0556): локальні рівні 45s,
|
|
18
|
+
- Кожен rung несе `timeoutMs` — per-tier таймаут виклику (ADR 260620-0556): локальні рівні 45s, cloud-min 120s, cloud-avg 180s (окремий, більший дефолт — реальний прогін 2026-07-18 показав, що cloud-avg регулярно доводить concern майже до чистого re-detect, але спільний з cloud-min бюджет не лишав часу на verify, а наступного rung-а для повторної спроби нема); override без зміни коду — env `N_LOCAL_FIX_TIMEOUT_MS` / `N_CLOUD_FIX_TIMEOUT_MS` / `N_CLOUD_AVG_FIX_TIMEOUT_MS` (мс на ОДИН rung відповідного класу; невалідне значення → дефолт). Runner прокидає його worker-у через `FixContext`, щоб зависла LLM-сесія переривалась (runner додатково тримає backstop ×1.25), а ladder рухався далі. Це робочий важіль для повільної локальної моделі чи великої черги batch-концерну (doc-files ріже беклог під цей ліміт м'яким дедлайном).
|
|
21
19
|
- `classifyFixError` визначає характер помилки виправлення: системна причина, транспортний збій або якісна невдача агента.
|
|
22
20
|
- `decideAfterFailure` вирішує, чи продовжувати ескалацію після невдалого рівня, чи пропустити локальну модель, чи зупинити процес.
|
|
23
21
|
|
|
@@ -3,8 +3,8 @@ type: JS Module
|
|
|
3
3
|
title: run-fix.mjs
|
|
4
4
|
resource: npm/scripts/lib/lint-surface/run-fix.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
6
|
+
crc: 45965f7d
|
|
7
|
+
model: manual
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
## Огляд
|
|
@@ -23,6 +23,7 @@ Durable-write-и (issue nitra/cursor#16): worker отримує у `FixContext`
|
|
|
23
23
|
MT-tail (Фаза B, спека 2026-07-11): коли лишився невиправлений хвіст (worst=1), `renderRemaining` повертає зібрані порушення, і вони матеріалізуються у вузли MT-графа через `materializeTail` (mt-tail.mjs). Єдиний гейт — onboarded-репо (наявність `.mt.json`); fail-open: MT недоступний або будь-яка помилка → лог, lint не падає.
|
|
24
24
|
Distillation-телеметрія (Фаза C, §13 pi-migration): успішний agentic-рунг (canonical clean, без veto, з реальними правками у worker telemetry) пише запис `oldText→newText` у глобальний стор (`recordFixTelemetry`, `~/.n-rules/telemetry/<rule>/open/`) — корпус для маховика дистиляції T0. Best-effort; T0/ручні фікси не пишуться.
|
|
25
25
|
Rollback на провалі re-detect-а: якщо canonical re-detect усередині rung-а сам кидає виняток (worker/LLM лишив файл синтаксично невалідним — детектор/conftest не може його розпарсити), `runRung` спершу відкочує `snapshot` до S1, і лише потім перекидає виняток далі — без цього зіпсований проміжний стан worker-а лишався б на диску назавжди (виняток абортує весь прогін до звичайного rollback-коду).
|
|
26
|
+
skipLocalTier (concern-meta.mjs): `selectLadder` перед циклом ladder-а фільтрує з нього local-min/local-min-retry rung-и, якщо `item.entry.concern.skipLocalTier === true` — перша спроба одразу йде на cloud-min. Для concern-ів, де local-tier емпірично майже завжди лише витрачає бюджет rung-а без результату (виявлено на реальному прогоні 2026-07-18: 0/12 успіхів local-tier для `js/eslint`).
|
|
26
27
|
|
|
27
28
|
## Публічний API
|
|
28
29
|
|
|
@@ -9,16 +9,25 @@ import { env } from 'node:process'
|
|
|
9
9
|
// об'єктивно не закінчить важкий промпт за хвилини (curl 28), хмарний SSE без
|
|
10
10
|
// таймауту здатен висіти годинами на ESTABLISHED TCP — драбина має рухатись далі.
|
|
11
11
|
//
|
|
12
|
-
// Override без зміни коду — env `N_LOCAL_FIX_TIMEOUT_MS` / `N_CLOUD_FIX_TIMEOUT_MS
|
|
13
|
-
// мілісекунди на ОДИН rung відповідного класу
|
|
14
|
-
//
|
|
15
|
-
// abort LLM-виклику; batch-worker-и, як doc-files, ріжуть
|
|
16
|
-
// дедлайном), а runner додатково тримає backstop ×1.25 навколо
|
|
17
|
-
// Робочий важіль для повільної локальної моделі чи великої черги
|
|
18
|
-
// підняти локальний таймаут понад вартість одного файлу. Невалідне
|
|
19
|
-
// (NaN/0/порожньо) → дефолт.
|
|
12
|
+
// Override без зміни коду — env `N_LOCAL_FIX_TIMEOUT_MS` / `N_CLOUD_FIX_TIMEOUT_MS` /
|
|
13
|
+
// `N_CLOUD_AVG_FIX_TIMEOUT_MS`: мілісекунди на ОДИН rung відповідного класу
|
|
14
|
+
// (local-min/local-min-retry, cloud-min, cloud-avg). Значення потрапляє worker-у як
|
|
15
|
+
// `ctx.timeoutMs` (внутрішній abort LLM-виклику; batch-worker-и, як doc-files, ріжуть
|
|
16
|
+
// під нього беклог м'яким дедлайном), а runner додатково тримає backstop ×1.25 навколо
|
|
17
|
+
// всього worker-виклику. Робочий важіль для повільної локальної моделі чи великої черги
|
|
18
|
+
// batch-концерну: підняти локальний таймаут понад вартість одного файлу. Невалідне
|
|
19
|
+
// значення (NaN/0/порожньо) → дефолт.
|
|
20
|
+
//
|
|
21
|
+
// cloud-avg має ОКРЕМИЙ (більший за cloud-min) дефолт: реальний прогін
|
|
22
|
+
// (2026-07-18, /ai run/yoga2, chainId 6f6b4fdca71aa0c5) показав, що cloud-avg
|
|
23
|
+
// регулярно доводить concern до 1 залишкового порушення в межах спільного з
|
|
24
|
+
// cloud-min бюджету, але verify (canonical re-detect) не встигає підтвердитись —
|
|
25
|
+
// і весь прогрес відкочується, бо після cloud-avg немає наступного rung-а для
|
|
26
|
+
// повторної спроби. cloud-avg — останній шанс ladder-а (і під DEFAULT_MAX_AVG-кепом),
|
|
27
|
+
// тож дорожчий за нього бюджет виправдано менш економний, ніж cloud-min.
|
|
20
28
|
const LOCAL_TIMEOUT_MS = Number(env.N_LOCAL_FIX_TIMEOUT_MS) || 45_000
|
|
21
29
|
const CLOUD_TIMEOUT_MS = Number(env.N_CLOUD_FIX_TIMEOUT_MS) || 120_000
|
|
30
|
+
const CLOUD_AVG_TIMEOUT_MS = Number(env.N_CLOUD_AVG_FIX_TIMEOUT_MS) || 180_000
|
|
22
31
|
|
|
23
32
|
/** Дефолтний кеп на виклики cloud-avg за прогін (щоб ladder на N concern-ів не спалив avg). */
|
|
24
33
|
export const DEFAULT_MAX_AVG = 3
|
|
@@ -59,7 +68,7 @@ export function buildLadder({ localMin, cloudMin, cloudAvg }) {
|
|
|
59
68
|
timeoutMs: LOCAL_TIMEOUT_MS
|
|
60
69
|
},
|
|
61
70
|
{ tier: 'cloud-min', model: cloudMin, feedback: true, local: false, isAvg: false, timeoutMs: CLOUD_TIMEOUT_MS },
|
|
62
|
-
{ tier: 'cloud-avg', model: cloudAvg, feedback: true, local: false, isAvg: true, timeoutMs:
|
|
71
|
+
{ tier: 'cloud-avg', model: cloudAvg, feedback: true, local: false, isAvg: true, timeoutMs: CLOUD_AVG_TIMEOUT_MS }
|
|
63
72
|
].filter(r => r.model)
|
|
64
73
|
}
|
|
65
74
|
|