@nitra/cursor 12.11.1 → 12.11.3
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 +12 -0
- package/bin/n-cursor.js +0 -15
- package/package.json +1 -1
- package/rules/adr/js/docs/hooks.md +0 -2
- package/rules/bun/docs/index.md +2 -2
- package/rules/bun/docs/main.md +9 -9
- package/rules/bun/js/docs/fix-layout.md +25 -0
- package/rules/bun/js/docs/index.md +3 -2
- package/rules/bun/js/fix-layout.mjs +55 -0
- package/rules/bun/main.json +1 -1
- package/rules/bun/main.mjs +53 -3
- package/rules/changelog/js/docs/fix-consistency.md +27 -0
- package/rules/changelog/js/docs/index.md +1 -0
- package/rules/changelog/js/fix-consistency.mjs +50 -0
- package/rules/ci4/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/ci4/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/ci4/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/ga/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/ga/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/ga/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/graphql/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/graphql/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/graphql/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js/js/dep-policy.mdc +19 -0
- package/rules/js/js/dep-policy.mjs +14 -6
- package/rules/js/js/docs/dep-policy.md +12 -10
- package/rules/js/js/docs/index.md +5 -5
- package/rules/js/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/js/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/js/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js-run/js/docs/fix-runtime.md +25 -0
- package/rules/js-run/js/docs/index.md +3 -2
- package/rules/js-run/js/fix-runtime.mjs +41 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/python/docs/index.md +2 -2
- package/rules/python/docs/main.md +12 -10
- package/rules/python/main.mjs +1 -0
- package/rules/rego/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/rego/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/rego/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/rust/docs/index.md +2 -2
- package/rules/rust/docs/main.md +8 -6
- package/rules/rust/main.mjs +11 -0
- package/rules/rust/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/rust/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/rust/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/style/js/docs/fix-tooling.md +29 -0
- package/rules/style/js/docs/index.md +3 -2
- package/rules/style/js/fix-tooling.mjs +46 -0
- package/rules/style/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/style/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/style/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/tauri/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/tauri/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/tauri/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/text/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/text/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/text/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/vue/js/docs/packages.md +0 -2
- package/scripts/docs/index.md +0 -2
- package/scripts/lib/discover-checkable-rules.mjs +1 -0
- package/scripts/lib/docs/discover-checkable-rules.md +13 -155
- package/scripts/lib/docs/index.md +35 -35
- package/scripts/lib/fix/discover-t0-patterns.mjs +83 -0
- package/scripts/lib/fix/docs/discover-t0-patterns.md +37 -0
- package/scripts/lib/fix/docs/index.md +12 -10
- package/scripts/lib/fix/docs/llm-fix-apply.md +12 -10
- package/scripts/lib/fix/docs/llm-worker.md +6 -14
- package/scripts/lib/fix/docs/orchestrator.md +0 -2
- package/scripts/lib/fix/docs/t0.md +11 -10
- package/scripts/lib/fix/docs/vscode-ext-add.md +29 -0
- package/scripts/lib/fix/t0.mjs +8 -234
- package/scripts/lib/fix/vscode-ext-add.mjs +45 -0
- package/skills/doc-aggregate/SKILL.md +8 -18
- package/skills/doc-aggregate/js/docs/index.md +0 -1
- package/rules/test/coverage/coverage.mjs +0 -317
- package/scripts/coverage-classify/apply.mjs +0 -67
- package/scripts/coverage-classify/cache.mjs +0 -77
- package/scripts/coverage-classify/docs/apply.md +0 -206
- package/scripts/coverage-classify/docs/cache.md +0 -207
- package/scripts/coverage-classify/docs/index.md +0 -14
- package/scripts/coverage-classify/docs/prompt.md +0 -136
- package/scripts/coverage-classify/docs/verdict-schema.md +0 -28
- package/scripts/coverage-classify/index.mjs +0 -114
- package/scripts/coverage-classify/prompt.mjs +0 -126
- package/scripts/coverage-classify/verdict-schema.mjs +0 -35
- package/scripts/coverage-fix-extract.mjs +0 -122
- package/scripts/coverage-fix.mjs +0 -119
- package/scripts/docs/coverage-fix-extract.md +0 -36
- package/scripts/docs/coverage-fix.md +0 -181
- package/skills/coverage-fix/SKILL.md +0 -131
- package/skills/coverage-fix/main.json +0 -1
- package/skills/doc-aggregate/js/docgen-scan.mjs +0 -195
- package/skills/doc-aggregate/js/docs/docgen-scan.md +0 -76
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/** @see ./docs/docgen-scan.md */
|
|
2
|
-
import { join, relative, dirname, extname, sep, isAbsolute, resolve } from 'node:path'
|
|
3
|
-
import { existsSync, readdirSync, statSync } from 'node:fs'
|
|
4
|
-
|
|
5
|
-
import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
|
|
6
|
-
import { isDocgenIgnored } from './docgen-ignore.mjs'
|
|
7
|
-
|
|
8
|
-
/** Кодові розширення, для яких генеруємо документацію. */
|
|
9
|
-
const SOURCE_EXTENSIONS = new Set(['.js', '.mjs', '.ts', '.vue', '.py'])
|
|
10
|
-
|
|
11
|
-
/** `*.test.*`, `*.spec.*` — тести, документувати не треба. */
|
|
12
|
-
const TEST_FILE_RE = /\.(?:test|spec)\.[^.]+$/u
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Чи корінь має system-wide docs layout (зарезервований під repo docs/adr тощо).
|
|
16
|
-
* @param {string} root абсолютний корінь обходу
|
|
17
|
-
* @returns {boolean} true — корінь system-wide docs
|
|
18
|
-
*/
|
|
19
|
-
function isSystemWideDocsRoot(root) {
|
|
20
|
-
return existsSync(join(root, 'docs', 'adr')) || existsSync(join(root, 'docs', 'explanation'))
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Чи є файл кодовим джерелом для документування.
|
|
25
|
-
* @param {string} fileName базове ім'я файлу
|
|
26
|
-
* @returns {boolean} true — документуємо
|
|
27
|
-
*/
|
|
28
|
-
export function isSourceFile(fileName) {
|
|
29
|
-
if (fileName.endsWith('.d.ts')) return false
|
|
30
|
-
if (TEST_FILE_RE.test(fileName)) return false
|
|
31
|
-
return SOURCE_EXTENSIONS.has(extname(fileName))
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Рекурсивно збирає кодові файли проєкту (posix-шляхи від кореня).
|
|
36
|
-
* @param {string} root абсолютний корінь обходу
|
|
37
|
-
* @returns {string[]} sourcePath-и
|
|
38
|
-
*/
|
|
39
|
-
export function scanSourceFiles(root) {
|
|
40
|
-
const results = []
|
|
41
|
-
|
|
42
|
-
/** @param {string} dir поточний каталог обходу */
|
|
43
|
-
function walk(dir) {
|
|
44
|
-
let entries
|
|
45
|
-
try {
|
|
46
|
-
entries = readdirSync(dir, { withFileTypes: true })
|
|
47
|
-
} catch {
|
|
48
|
-
return
|
|
49
|
-
}
|
|
50
|
-
for (const entry of entries) {
|
|
51
|
-
const fullPath = join(dir, entry.name)
|
|
52
|
-
const relPath = relative(root, fullPath)
|
|
53
|
-
if (entry.isDirectory()) {
|
|
54
|
-
if (isDocgenIgnored(relPath, 'dir')) continue
|
|
55
|
-
walk(fullPath)
|
|
56
|
-
} else if (entry.isFile() && isSourceFile(entry.name)) {
|
|
57
|
-
if (isSystemWideDocsRoot(root) && dirname(relPath) === '.') continue
|
|
58
|
-
const sourcePath = relPath.split(sep).join('/')
|
|
59
|
-
if (isDocgenIgnored(sourcePath)) continue
|
|
60
|
-
results.push(sourcePath)
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
walk(root)
|
|
66
|
-
return results
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Стабільний slug модуля з його відносного шляху (для лейблів/логів).
|
|
71
|
-
* @param {string} root абсолютний корінь обходу
|
|
72
|
-
* @param {string} moduleRoot абсолютний корінь модуля
|
|
73
|
-
* @returns {string} slug: `npm/rules/adr` → `npm-rules-adr`, корінь → `root`
|
|
74
|
-
*/
|
|
75
|
-
export function slugForModule(root, moduleRoot) {
|
|
76
|
-
const rel = relative(root, moduleRoot)
|
|
77
|
-
if (rel === '') return 'root'
|
|
78
|
-
return rel
|
|
79
|
-
.split(sep)
|
|
80
|
-
.join('-')
|
|
81
|
-
.replaceAll(/[^\w-]+/gu, '-')
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Знаходить корені модулів — теки з `package.json` (корінь завжди модуль).
|
|
86
|
-
* @param {string} root абсолютний корінь обходу
|
|
87
|
-
* @returns {string[]} абсолютні шляхи коренів модулів
|
|
88
|
-
*/
|
|
89
|
-
export function findModuleRoots(root) {
|
|
90
|
-
const roots = [root]
|
|
91
|
-
|
|
92
|
-
/** @param {string} dir поточний каталог обходу */
|
|
93
|
-
function walk(dir) {
|
|
94
|
-
let entries
|
|
95
|
-
try {
|
|
96
|
-
entries = readdirSync(dir, { withFileTypes: true })
|
|
97
|
-
} catch {
|
|
98
|
-
return
|
|
99
|
-
}
|
|
100
|
-
for (const entry of entries) {
|
|
101
|
-
const fullPath = join(dir, entry.name)
|
|
102
|
-
const relPath = relative(root, fullPath)
|
|
103
|
-
if (entry.isDirectory()) {
|
|
104
|
-
if (isDocgenIgnored(relPath, 'dir')) continue
|
|
105
|
-
walk(fullPath)
|
|
106
|
-
} else if (entry.isFile() && entry.name === 'package.json' && dir !== root) {
|
|
107
|
-
roots.push(dir)
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
walk(root)
|
|
113
|
-
return roots
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Найближчий модуль-предок для файлу (найдовший збіг шляху).
|
|
118
|
-
* @param {string} filePath абсолютний шлях до файлу
|
|
119
|
-
* @param {string[]} moduleRoots абсолютні корені модулів
|
|
120
|
-
* @returns {string|null} абсолютний корінь модуля або null
|
|
121
|
-
*/
|
|
122
|
-
export function nearestModuleRoot(filePath, moduleRoots) {
|
|
123
|
-
let best = null
|
|
124
|
-
for (const moduleRoot of moduleRoots) {
|
|
125
|
-
const rel = relative(moduleRoot, filePath)
|
|
126
|
-
if (rel.startsWith('..') || isAbsolute(rel)) continue
|
|
127
|
-
if (best === null || moduleRoot.length > best.length) best = moduleRoot
|
|
128
|
-
}
|
|
129
|
-
return best
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Лістить логічні модулі проєкту з членами-файлами і docPath module-summary.
|
|
134
|
-
* Модулі без кодових файлів пропускаються.
|
|
135
|
-
* @param {string} root абсолютний корінь обходу
|
|
136
|
-
* @returns {Array<{moduleRoot:string, relRoot:string, slug:string, docPath:string, members:string[], exists:boolean}>} модулі (members — sourcePath-и від root)
|
|
137
|
-
*/
|
|
138
|
-
export function scanForModules(root) {
|
|
139
|
-
const files = scanSourceFiles(root)
|
|
140
|
-
const moduleRoots = findModuleRoots(root)
|
|
141
|
-
const byRoot = new Map()
|
|
142
|
-
for (const sourcePath of files) {
|
|
143
|
-
const moduleRoot = nearestModuleRoot(join(root, sourcePath), moduleRoots)
|
|
144
|
-
if (moduleRoot === null) continue
|
|
145
|
-
if (!byRoot.has(moduleRoot)) byRoot.set(moduleRoot, [])
|
|
146
|
-
byRoot.get(moduleRoot).push(sourcePath)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const results = []
|
|
150
|
-
for (const moduleRoot of moduleRoots) {
|
|
151
|
-
const members = byRoot.get(moduleRoot)
|
|
152
|
-
if (!members || members.length === 0) continue
|
|
153
|
-
const docPath = join(moduleRoot, 'docs', 'ARCHITECTURE.md')
|
|
154
|
-
results.push({
|
|
155
|
-
moduleRoot,
|
|
156
|
-
relRoot: relative(root, moduleRoot) || '.',
|
|
157
|
-
slug: slugForModule(root, moduleRoot),
|
|
158
|
-
docPath,
|
|
159
|
-
members: members.toSorted(),
|
|
160
|
-
exists: existsSync(docPath)
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
return results
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Парсить `--root <dir>`; default — cwd.
|
|
168
|
-
* @param {string[]} argv аргументи після підкоманди
|
|
169
|
-
* @returns {string} абсолютний корінь
|
|
170
|
-
*/
|
|
171
|
-
export function resolveRoot(argv) {
|
|
172
|
-
const i = argv.indexOf('--root')
|
|
173
|
-
return i !== -1 && argv[i + 1] ? resolve(argv[i + 1]) : process.cwd()
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* `doc-aggregate modules` — сканує модулі і друкує JSON-масив у stdout.
|
|
178
|
-
* @param {string[]} argv аргументи після назви субкоманди
|
|
179
|
-
* @returns {number} exit-код: 0 — успіх, 1 — корінь не існує
|
|
180
|
-
*/
|
|
181
|
-
export function runDocAggregateModulesCli(argv) {
|
|
182
|
-
const root = resolveRoot(argv)
|
|
183
|
-
if (!existsSync(root) || !statSync(root).isDirectory()) {
|
|
184
|
-
console.error(`doc-aggregate modules: корінь не існує або не є директорією: ${root}`)
|
|
185
|
-
return 1
|
|
186
|
-
}
|
|
187
|
-
console.log(JSON.stringify(scanForModules(root), null, 2))
|
|
188
|
-
return 0
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (isRunAsCli(import.meta.url)) {
|
|
192
|
-
// Прямий запуск: `node skills/doc-aggregate/js/docgen-scan.mjs modules --root <dir>`
|
|
193
|
-
const [sub, ...rest] = process.argv.slice(2)
|
|
194
|
-
process.exitCode = runDocAggregateModulesCli(sub === 'modules' ? rest : process.argv.slice(2))
|
|
195
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: docgen-scan.mjs
|
|
4
|
-
resource: npm/skills/doc-aggregate/js/docgen-scan.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 193dd362
|
|
7
|
-
score: 100
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
isSourceFile
|
|
11
|
-
Перевіряє, чи є файл коду, який слугує джерелом для документування.
|
|
12
|
-
|
|
13
|
-
scanSourceFiles
|
|
14
|
-
Рекурсивно збирає кодові файли проєкту за позикс-шляхами від кореня.
|
|
15
|
-
|
|
16
|
-
slugForModule
|
|
17
|
-
Генерує стабільний slug модуля на основі його відносного шляху.
|
|
18
|
-
|
|
19
|
-
findModuleRoots
|
|
20
|
-
Знаходить абсолютні шляхи коренів модулів, використовуючи дані з package.json.
|
|
21
|
-
|
|
22
|
-
nearestModuleRoot
|
|
23
|
-
Визначає найближчий модуль-предок для заданого файлу серед усіх доступних коренів модулів.
|
|
24
|
-
|
|
25
|
-
scanForModules
|
|
26
|
-
Лістить логічні модулі, збираючи члени-файли та інформацію про наявність документації.
|
|
27
|
-
|
|
28
|
-
resolveRoot
|
|
29
|
-
Парсить аргументи для визначення абсолютної кореневої директорії.
|
|
30
|
-
|
|
31
|
-
runDocAggregateModulesCli
|
|
32
|
-
Сканує модулі та виводить масив JSON у stdout.
|
|
33
|
-
|
|
34
|
-
## Поведінка
|
|
35
|
-
|
|
36
|
-
isSourceFile
|
|
37
|
-
Перевіряє, чи є файл кодовим джерелом для документування
|
|
38
|
-
|
|
39
|
-
scanSourceFiles
|
|
40
|
-
Рекурсивно збирає кодові файли проєкту по позикс-шляхах від кореня
|
|
41
|
-
|
|
42
|
-
slugForModule
|
|
43
|
-
Генерує стабільний slug модуля з його відносним шляхом
|
|
44
|
-
|
|
45
|
-
findModuleRoots
|
|
46
|
-
Знаходить абсолютні шляхи коренів модулів з файлами package.json
|
|
47
|
-
|
|
48
|
-
nearestModuleRoot
|
|
49
|
-
Знаходить найближчий модуль-предок для файлу серед наявних коренів модулів
|
|
50
|
-
|
|
51
|
-
scanForModules
|
|
52
|
-
Лістить логічні модулі, збираючи члени-файли та інформацію про наявність документації
|
|
53
|
-
|
|
54
|
-
resolveRoot
|
|
55
|
-
Парсить аргументи для визначення абсолютного кореня
|
|
56
|
-
|
|
57
|
-
runDocAggregateModulesCli
|
|
58
|
-
Сканує модулі та виводить JSON-масив у stdout
|
|
59
|
-
|
|
60
|
-
## Публічний API
|
|
61
|
-
|
|
62
|
-
- isSourceFile — визначає, чи є файл коду для документування.
|
|
63
|
-
- scanSourceFiles — рекурсивно збирає файли коду проєкту (від кореня за POSIX-шляхом).
|
|
64
|
-
- slugForModule — генерує стабільний slug модуля з його відносним шляхом (для лейблів/логів).
|
|
65
|
-
- findModuleRoots — знаходить кореневі директорії модулів у `package.json` (корінь — це модуль).
|
|
66
|
-
- nearestModuleRoot — визначає найближчий модуль-предок для файлу (найдовший збіг шляху).
|
|
67
|
-
- scanForModules — лістить логічні модулі проєкту з членами-файлами та `docPath module-summary`. Пропускає модулі без кодових файлів.
|
|
68
|
-
- resolveRoot — парсить аргумент `--root <dir>`; за замовчуванням використовує поточну директорію.
|
|
69
|
-
- runDocAggregateModulesCli — виконує команду `doc-aggregate modules`, скануючи модулі та виводячи JSON-масив у stdout.
|
|
70
|
-
|
|
71
|
-
## Гарантії поведінки
|
|
72
|
-
|
|
73
|
-
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
74
|
-
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
75
|
-
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
76
|
-
- Не звертається до мережі.
|