@nitra/cursor
Advanced tools
| /** | ||
| * A/B: docgen Tier 1 через pi cli (з omlx-провайдером у ~/.pi/agent/models.json) | ||
| * vs прямий callOmlxMessages (`N_CURSOR_DOCGEN_BACKEND=omlx`). | ||
| * | ||
| * Однаковий 8-сет файлів, однаковий оркестратор (E1+E2+E3+E4), різний backend. | ||
| * Пише в /tmp/docgen-compare/{pi,direct}/<idx>-<stem>.md і збирає метрики. | ||
| * | ||
| * Запуск: node npm/skills/docgen/js/docgen-compare-pi-vs-direct.mjs [--from N] [--limit N] | ||
| */ | ||
| import { readFileSync, mkdirSync, writeFileSync, existsSync } from 'node:fs' | ||
| import { join, resolve, basename } from 'node:path' | ||
| import { fileURLToPath } from 'node:url' | ||
| import { execSync } from 'node:child_process' | ||
| import { env } from 'node:process' | ||
| import { generateDoc } from './docgen-gen.mjs' | ||
| import { extractFacts } from './docgen-extract.mjs' | ||
| const ROOT = resolve(fileURLToPath(import.meta.url), '../../../../..') | ||
| const TMP = '/tmp/docgen-compare' | ||
| const args = process.argv.slice(2) | ||
| const limitIdx = args.indexOf('--limit') | ||
| const limit = limitIdx !== -1 ? Number(args[limitIdx + 1]) : 8 | ||
| const fromIdx = args.indexOf('--from') | ||
| const from = fromIdx !== -1 ? Number(args[fromIdx + 1]) : 1 | ||
| const scanOut = execSync('node npm/bin/n-cursor.js docgen scan', { cwd: ROOT, encoding: 'utf8' }) | ||
| const all = JSON.parse(scanOut) | ||
| const local = [] | ||
| for (const f of all) { | ||
| try { | ||
| const src = readFileSync(join(ROOT, f.sourcePath), 'utf8') | ||
| const facts = extractFacts(src, join(ROOT, f.sourcePath)) | ||
| const sym = (facts.internalSymbols ?? []).length | ||
| if (sym < 4) local.push({ ...f, sym }) | ||
| } catch {} | ||
| } | ||
| const slice = local.slice(from, from + limit) | ||
| mkdirSync(join(TMP, 'pi'), { recursive: true }) | ||
| mkdirSync(join(TMP, 'direct'), { recursive: true }) | ||
| async function runBackendAsync(kind) { | ||
| if (kind === 'direct') env.N_CURSOR_DOCGEN_BACKEND = 'omlx' | ||
| else delete env.N_CURSOR_DOCGEN_BACKEND | ||
| const out = { ok: 0, err: 0, totalMs: 0, scores: [], lengths: [], errors: [], times: [] } | ||
| console.log(`\n══════ Backend: ${kind} ══════`) | ||
| for (let i = 0; i < slice.length; i++) { | ||
| const f = slice[i] | ||
| const t0 = Date.now() | ||
| const stem = basename(f.sourcePath).replace(/\.[^.]+$/, '') | ||
| const destFile = join(TMP, kind, `${String(i + 1).padStart(2, '0')}-${stem}.md`) | ||
| process.stdout.write(` [${i + 1}/${slice.length}] sym=${f.sym} ${f.sourcePath} ... `) | ||
| try { | ||
| const r = await generateDoc(join(ROOT, f.sourcePath), { symThreshold: 999, cloudModel: null }) | ||
| writeFileSync(destFile, r.md) | ||
| const ms = Date.now() - t0 | ||
| out.ok++ | ||
| out.totalMs += ms | ||
| out.times.push(ms) | ||
| out.scores.push(r.score ?? 0) | ||
| out.lengths.push(r.md.length) | ||
| process.stdout.write(`✓ ${Math.round(ms / 1000)}s score=${r.score ?? '?'} chars=${r.md.length}\n`) | ||
| } catch (error) { | ||
| out.err++ | ||
| out.errors.push({ path: f.sourcePath, msg: error.message }) | ||
| process.stdout.write(`✗ ${error.message}\n`) | ||
| } | ||
| } | ||
| return out | ||
| } | ||
| const direct = await runBackendAsync('direct') | ||
| const pi = await runBackendAsync('pi') | ||
| function avg(a) { return a.length ? Math.round(a.reduce((x, y) => x + y, 0) / a.length) : 0 } | ||
| function median(a) { | ||
| if (!a.length) return 0 | ||
| const s = [...a].sort((x, y) => x - y) | ||
| return s[Math.floor(s.length / 2)] | ||
| } | ||
| const report = { | ||
| files: slice.map(f => f.sourcePath), | ||
| direct: { ok: direct.ok, err: direct.err, avgMs: avg(direct.times), medianMs: median(direct.times), avgScore: avg(direct.scores), avgChars: avg(direct.lengths), totalSec: Math.round(direct.totalMs / 1000) }, | ||
| pi: { ok: pi.ok, err: pi.err, avgMs: avg(pi.times), medianMs: median(pi.times), avgScore: avg(pi.scores), avgChars: avg(pi.lengths), totalSec: Math.round(pi.totalMs / 1000) } | ||
| } | ||
| writeFileSync(join(TMP, 'report.json'), JSON.stringify(report, null, 2)) | ||
| console.log(`\n${'─'.repeat(60)}\nA/B SUMMARY (${slice.length} файлів, той самий оркестратор)\n${'─'.repeat(60)}`) | ||
| console.log(`Backend | ok | err | avg s | median s | avg score | avg chars | total s`) | ||
| console.log(`direct (curl) | ${direct.ok} | ${direct.err} | ${Math.round(report.direct.avgMs / 1000)} | ${Math.round(report.direct.medianMs / 1000)} | ${report.direct.avgScore} | ${report.direct.avgChars} | ${report.direct.totalSec}`) | ||
| console.log(`pi cli | ${pi.ok} | ${pi.err} | ${Math.round(report.pi.avgMs / 1000)} | ${Math.round(report.pi.medianMs / 1000)} | ${report.pi.avgScore} | ${report.pi.avgChars} | ${report.pi.totalSec}`) | ||
| console.log(`\nФайли: ${TMP}/{direct,pi}/<idx>-<stem>.md\nReport: ${TMP}/report.json`) |
+1
-1
| { | ||
| "name": "@nitra/cursor", | ||
| "version": "5.0.2", | ||
| "version": "5.0.3", | ||
| "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -5,13 +5,13 @@ # hc-yaml.mjs | ||
| Файл виконує структурну валідацію конфігураційного файлу `hc.yaml` для перевірки відповідності даних визначенню політики перевірки стану. Валідація здійснюється порівнянням даних з контрактом `HealthCheckPolicy`, який визначений у рего-файлі. Ця функція забезпечує перевірку відповідно до схеми, визначеної за посиланням https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json. Використовується константа ABIE_HC_SCHEMA_URL, яка позначає цей URL. Результат валідації повертається у форматі булевого значення або null. | ||
| Файл виконує структурну валідацію конфігурації `modeline` у файлах `hc.yaml`. Функція `validateAbieHcModeline` перевіряє відповідність конфігурації визначеному контракту. Валідація проводиться порівнянням конфігурації з визначеною схемою, доступною за посиланням https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json. Цей процес забезпечує коректність конфігурації для ідентифікації (abie.mdc). Експортована константа ABIE_HC_SCHEMA_URL використовується для посилання на цю схему. | ||
| ## Поведінка | ||
| validateAbieHcModeline перевіряє modeline у вхідному контенті. | ||
| validateAbieHcModeline перевіряє modeline у файлі `hc.yaml`. | ||
| Перевіряє, чи перший рядок не порожній. Якщо рядок порожній, повертає повідомлення про необхідність формату modeline (abie.mdc). | ||
| Перевіряє, чи перший рядок не порожній. Повертає повідомлення про необхідність наявності modeline `# yaml-language-server: $schema=… (abie.mdc)`. | ||
| Перевіряє наявність modeline у першому рядку. Якщо modeline відсутній, повертає повідомлення про необхідність формату modeline (abie.mdc). | ||
| Перевіряє, чи перший рядок містить необхідний modeline. Повертає повідомлення про відсутність modeline $schema (abie.mdc). | ||
| Перевіряє, чи значення $schema відповідає очікуваному URL. Якщо значення не відповідає, повертає повідомлення про необхідність використання URL https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json (abie.mdc). | ||
| Перевіряє, чи значення $schema відповідає очікуваному URL. Повертає повідомлення про неправильне значення $schema, включаючи необхідний URL: https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json (abie.mdc). | ||
@@ -22,5 +22,5 @@ Повертає null у разі успішної валідації. | ||
| ABIE_HC_SCHEMA_URL — Вказує на необхідний URL `$schema` для файлу `hc.yaml` (abie.mdc). | ||
| ABIE_HC_SCHEMA_URL — Зберігає референтний URL `$schema` для файлу `hc.yaml` (abie.mdc). | ||
| validateAbieHcModeline — Перевіряє синтаксис modeline (`# yaml-language-server: $schema=...`) у файлі `hc.yaml`. | ||
| validateAbieHcModeline — Перевіряє формат modeline (`# yaml-language-server: $schema=...`) у файлі `hc.yaml`. | ||
@@ -27,0 +27,0 @@ ## Гарантії поведінки |
@@ -5,29 +5,21 @@ # http-route.mjs | ||
| Файл надає інструмент для порівняльного аналізу конфігурації. Він використовується для підрахунку кількості посилань на спільні бекенди в базових маніфестах пакета. Ця інформація слугує для синхронізації кількості патчів у потоковому (overlay) прошарку з кількістю базових посилань. | ||
| Файл надає інструмент для порівняльного аналізу конфігурації HTTP-маршрутів. Він виконує порівняння кількості `backendRefs` для сервісів `auth-run-hl` та `file-link-hl` у базових маніфестах пакета з кількістю патчів, визначеною в оверлеях. Цей механізм використовується для синхронізації кількості патчів у верхньому рівні з фактичною кількістю посилань у базі. (abie.mdc) | ||
| ## Поведінка | ||
| ABIE_SHARED_CROSS_NS_BACKEND_NAMES визначає список спільних сервісів, які підлягають аналітиці. | ||
| ABIE_SHARED_CROSS_NS_BACKEND_NAMES | ||
| Визначає список спільних сервісів, які підлягають аналітиці. | ||
| ABIE_SHARED_CROSS_NS_BACKEND_SET створює множину спільних сервісів для швидкої перевірки. | ||
| analyzeAbieSharedBackendRefsInPackageK8s | ||
| Збирає кількість посилань на спільні бекенди та порушення вимог до namespace у базових документах HTTPRoute пакета. | ||
| checkSharedBackendRef перевіряє, чи посилається елемент на спільний сервіс, і перевіряє, чи відповідає його імена та namespace вимогам. | ||
| ## Публічний API | ||
| httpRouteDocSharedCrossNsBackendStats збирає кількість посилань на спільні бекенди та фіксує помилки, якщо виявлено порушення вимог до namespace. | ||
| ABIE_SHARED_CROSS_NS_BACKEND_NAMES — Формує імена для крос-нішових зв'язків між бекендами. (abie.mdc) | ||
| analyzeAbieSharedBackendRefsInPackageK8s збирає статистику щодо посилань на спільні бекенди та помилки щодо namespace з базових YAML-документів пакета, виключаючи оверлей `ua`. | ||
| analyzeAbieSharedBackendRefsInPackageK8s — Збирає кількість спільних посилань `backendRefs` та базові помилки з YAML-файлів пакета, ігноруючи неймспейс `dev`. (abie.mdc) | ||
| ## Публічний API | ||
| - ABIE_SHARED_CROSS_NS_BACKEND_NAMES — Ідентифікація назв бекендів, спільних між різними просторами імен. | ||
| - analyzeAbieSharedBackendRefsInPackageK8s — Аналізує YAML-файли пакета, збираючи кількість спільних посилань на бекенди та виявляючи базові помилки. | ||
| ## Гарантії поведінки | ||
| * Функція повертає підрахунок `backendRefs` для спільних сервісів. | ||
| * Підрахунок здійснюється у base-маніфестах пакета поза overlay `ua`. | ||
| * Використовується `ua_http_route_concern` для синхронізації кількості patch-ів namespace у overlay із кількістю base-reference. | ||
| * Функція є read-only. | ||
| * Функція не виконує операцій з мережею. | ||
| * Функція не використовує кешування. | ||
| * Функція не змінює стан системи. | ||
| - Read-only: файл не виконує операцій запису у файлову систему. | ||
| - Не звертається до мережі. |
Sorry, the diff of this file is too big to display
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
5467101
0.07%772
0.13%33892
0.25%