@nitra/cursor 12.8.3 → 12.8.5
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 +3 -2
- package/package.json +1 -1
- package/rules/abie/js/env_dns.mdc +33 -0
- package/rules/abie/js/firebase_hosting.mdc +3 -0
- package/rules/abie/js/hc_pairing.mdc +23 -0
- package/rules/abie/js/ua_http_route.mdc +47 -0
- package/rules/abie/js/ua_node_selector.mdc +27 -0
- package/rules/abie/main.mdc +53 -0
- package/rules/doc-files/js/docs/index.md +15 -15
- package/rules/js/docs/index.md +3 -3
- package/rules/js/docs/main.md +7 -7
- package/rules/js/js/docs/check.md +12 -16
- package/rules/js/js/docs/index.md +4 -4
- package/rules/js/js/docs/tooling.md +8 -8
- package/rules/js/js/docs/utils_imports.md +22 -200
- package/rules/npm-module/js/docs/index.md +5 -5
- package/rules/npm-module/js/docs/rule_meta.md +13 -13
- package/rules/npm-module/js/docs/skill_meta.md +19 -9
- package/rules/npm-module/js/rule_meta.mjs +9 -9
- package/rules/npm-module/js/skill_meta.mjs +6 -6
- package/rules/test/js/docs/index.md +7 -7
- package/rules/test/js/docs/stryker_config.md +18 -35
- package/rules/test/js/docs/vitest-config-pool-forks.md +20 -12
- package/schemas/v8r-catalog.json +4 -4
- package/scripts/docs/index.md +16 -16
- package/scripts/docs/sync-setup-bun-deps-action.md +14 -14
- package/scripts/lib/check-mdc-template-refs.mjs +2 -2
- package/scripts/lib/docs/check-mdc-template-refs.md +12 -214
- package/scripts/lib/docs/index.md +36 -36
- package/scripts/lib/docs/inline-template-links.md +13 -293
- package/scripts/lib/docs/mirror-parity.md +18 -157
- package/scripts/lib/docs/rule-meta.md +19 -22
- package/scripts/lib/docs/run-rule.md +11 -11
- package/scripts/lib/docs/skill-meta.md +17 -19
- package/scripts/lib/docs/timing-summary.md +7 -7
- package/scripts/lib/inline-template-links.mjs +31 -0
- package/scripts/lib/mirror-parity.mjs +6 -4
- package/scripts/lib/rule-meta.mjs +1 -1
- package/scripts/lib/run-rule.mjs +4 -4
- package/scripts/lib/skill-meta.mjs +1 -1
- package/scripts/utils/docs/index.md +14 -14
- package/scripts/utils/docs/resolve-js-root.md +12 -13
- package/types/bin/n-cursor.d.ts +1 -1
- package/rules/abie/abie.mdc +0 -181
- /package/rules/abie/{meta.json → main.json} +0 -0
- /package/rules/adr/{meta.json → main.json} +0 -0
- /package/rules/adr/{adr.mdc → main.mdc} +0 -0
- /package/rules/bun/{meta.json → main.json} +0 -0
- /package/rules/bun/{bun.mdc → main.mdc} +0 -0
- /package/rules/capacitor/{meta.json → main.json} +0 -0
- /package/rules/capacitor/{capacitor.mdc → main.mdc} +0 -0
- /package/rules/changelog/{meta.json → main.json} +0 -0
- /package/rules/changelog/{changelog.mdc → main.mdc} +0 -0
- /package/rules/ci4/{meta.json → main.json} +0 -0
- /package/rules/ci4/{ci4.mdc → main.mdc} +0 -0
- /package/rules/doc-files/{meta.json → main.json} +0 -0
- /package/rules/doc-files/{doc-files.mdc → main.mdc} +0 -0
- /package/rules/docker/{meta.json → main.json} +0 -0
- /package/rules/docker/{docker.mdc → main.mdc} +0 -0
- /package/rules/efes/{meta.json → main.json} +0 -0
- /package/rules/efes/{efes.mdc → main.mdc} +0 -0
- /package/rules/feedback/{meta.json → main.json} +0 -0
- /package/rules/feedback/{feedback.mdc → main.mdc} +0 -0
- /package/rules/ga/{meta.json → main.json} +0 -0
- /package/rules/ga/{ga.mdc → main.mdc} +0 -0
- /package/rules/graphql/{meta.json → main.json} +0 -0
- /package/rules/graphql/{graphql.mdc → main.mdc} +0 -0
- /package/rules/hasura/{meta.json → main.json} +0 -0
- /package/rules/hasura/{hasura.mdc → main.mdc} +0 -0
- /package/rules/image-avif/{meta.json → main.json} +0 -0
- /package/rules/image-avif/{image-avif.mdc → main.mdc} +0 -0
- /package/rules/image-compress/{meta.json → main.json} +0 -0
- /package/rules/image-compress/{image-compress.mdc → main.mdc} +0 -0
- /package/rules/js/{meta.json → main.json} +0 -0
- /package/rules/js/{js.mdc → main.mdc} +0 -0
- /package/rules/js-bun-db/{meta.json → main.json} +0 -0
- /package/rules/js-bun-db/{js-bun-db.mdc → main.mdc} +0 -0
- /package/rules/js-bun-redis/{meta.json → main.json} +0 -0
- /package/rules/js-bun-redis/{js-bun-redis.mdc → main.mdc} +0 -0
- /package/rules/js-mssql/{meta.json → main.json} +0 -0
- /package/rules/js-mssql/{js-mssql.mdc → main.mdc} +0 -0
- /package/rules/js-run/{meta.json → main.json} +0 -0
- /package/rules/js-run/{js-run.mdc → main.mdc} +0 -0
- /package/rules/k8s/{meta.json → main.json} +0 -0
- /package/rules/k8s/{k8s.mdc → main.mdc} +0 -0
- /package/rules/nginx-default-tpl/{meta.json → main.json} +0 -0
- /package/rules/nginx-default-tpl/{nginx-default-tpl.mdc → main.mdc} +0 -0
- /package/rules/npm-module/{meta.json → main.json} +0 -0
- /package/rules/npm-module/{npm-module.mdc → main.mdc} +0 -0
- /package/rules/php/{meta.json → main.json} +0 -0
- /package/rules/php/{php.mdc → main.mdc} +0 -0
- /package/rules/python/{meta.json → main.json} +0 -0
- /package/rules/python/{python.mdc → main.mdc} +0 -0
- /package/rules/rego/{meta.json → main.json} +0 -0
- /package/rules/rego/{rego.mdc → main.mdc} +0 -0
- /package/rules/release/{meta.json → main.json} +0 -0
- /package/rules/release/{release.mdc → main.mdc} +0 -0
- /package/rules/rust/{meta.json → main.json} +0 -0
- /package/rules/rust/{rust.mdc → main.mdc} +0 -0
- /package/rules/security/{meta.json → main.json} +0 -0
- /package/rules/security/{security.mdc → main.mdc} +0 -0
- /package/rules/style/{meta.json → main.json} +0 -0
- /package/rules/style/{style.mdc → main.mdc} +0 -0
- /package/rules/tauri/{meta.json → main.json} +0 -0
- /package/rules/tauri/{tauri.mdc → main.mdc} +0 -0
- /package/rules/test/{meta.json → main.json} +0 -0
- /package/rules/test/{test.mdc → main.mdc} +0 -0
- /package/rules/text/{meta.json → main.json} +0 -0
- /package/rules/text/{text.mdc → main.mdc} +0 -0
- /package/rules/tool-surface/{meta.json → main.json} +0 -0
- /package/rules/tool-surface/{tool-surface.mdc → main.mdc} +0 -0
- /package/rules/vue/{meta.json → main.json} +0 -0
- /package/rules/vue/{vue.mdc → main.mdc} +0 -0
- /package/rules/worktree/{meta.json → main.json} +0 -0
- /package/rules/worktree/{worktree.mdc → main.mdc} +0 -0
- /package/skills/adr-normalize/{meta.json → main.json} +0 -0
- /package/skills/coverage-fix/{meta.json → main.json} +0 -0
- /package/skills/doc-aggregate/{meta.json → main.json} +0 -0
- /package/skills/doc-files/{meta.json → main.json} +0 -0
- /package/skills/lint/{meta.json → main.json} +0 -0
- /package/skills/llm-patch/{meta.json → main.json} +0 -0
- /package/skills/publish-telegram/{meta.json → main.json} +0 -0
- /package/skills/start-check/{meta.json → main.json} +0 -0
- /package/skills/taze/{meta.json → main.json} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.8.5] - 2026-06-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- ♻️ refactor(npm): Перехід з `style-lint` на `style` у правил та конфігах
|
|
8
|
+
|
|
9
|
+
## [12.8.4] - 2026-06-22
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- ♻️ refactor(npm): Перехід з `style-lint` на `style` у правил та конфігах
|
|
14
|
+
|
|
3
15
|
## [12.8.3] - 2026-06-22
|
|
4
16
|
|
|
5
17
|
### Changed
|
package/bin/n-cursor.js
CHANGED
|
@@ -74,7 +74,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
74
74
|
|
|
75
75
|
import { buildAgentsCommandBulletItems } from '../scripts/build-agents-commands.mjs'
|
|
76
76
|
import { formatGeneratedMarkdownLines, renderAgentsTemplate } from '../scripts/lib/generated-markdown.mjs'
|
|
77
|
-
import { inlineTemplateLinks } from '../scripts/lib/inline-template-links.mjs'
|
|
77
|
+
import { inlineMarkdownIncludes, inlineTemplateLinks } from '../scripts/lib/inline-template-links.mjs'
|
|
78
78
|
import {
|
|
79
79
|
detectAutoRules,
|
|
80
80
|
detectLegacyRuleIds,
|
|
@@ -422,7 +422,8 @@ async function readBundledRuleContent(rule, bundledRulesDir = BUNDLED_RULES_DIR)
|
|
|
422
422
|
)
|
|
423
423
|
}
|
|
424
424
|
const text = await readFile(bundledPath, 'utf8')
|
|
425
|
-
|
|
425
|
+
const withTemplates = await inlineTemplateLinks(text, dirname(bundledPath))
|
|
426
|
+
return inlineMarkdownIncludes(withTemplates, dirname(bundledPath))
|
|
426
427
|
}
|
|
427
428
|
|
|
428
429
|
/**
|
package/package.json
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Внутрішньокластерні URL у env-файлах (dev / ua)
|
|
2
|
+
|
|
3
|
+
Правило стосується **будь-якого** внутрішньокластерного URL у env-файлах abie-проєкту, а не лише `HASURA_GRAPHQL_ENDPOINT`. Це може бути URL до Hasura, KVCMS, `auth-run-hl`, `file-link-hl` чи будь-якого іншого Service у кластері — у всіх випадках DNS-суфікс і namespace-префікс мають відповідати **середовищу** з імені env-файлу.
|
|
4
|
+
|
|
5
|
+
abie-проєкти живуть у **двох GKE-кластерах** (dev / ua), тож DNS-суфікс і namespace у URL відрізняються між `*.env`-файлами:
|
|
6
|
+
|
|
7
|
+
| env-файл (basename) | namespace-префікс у URL | DNS-суфікс кластера | примітка |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| `dev.env`, `.dev.env` | `dev-…` | `abie-dev.internal` | GKE-кластер dev |
|
|
10
|
+
| `ua.env`, `.ua.env` | `ua-…` | `abie-ua.internal` | GKE-кластер ua |
|
|
11
|
+
|
|
12
|
+
Канонічна форма URL — `http://<service>.<namespace>.svc.<cluster-dns-suffix>:<port>`. Суфікс — `<cluster>.internal`.
|
|
13
|
+
|
|
14
|
+
Приклади для одного env-файлу з двома сервісами (Hasura + KVCMS):
|
|
15
|
+
|
|
16
|
+
```env title="hasura/.dev.env"
|
|
17
|
+
HASURA_GRAPHQL_ENDPOINT=http://apruv-h-hl.dev-apruv.svc.abie-dev.internal:8080
|
|
18
|
+
KVCMS_URL=http://kvcms-hl.dev-apruv.svc.abie-dev.internal:8080
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```env title="hasura/.ua.env"
|
|
22
|
+
HASURA_GRAPHQL_ENDPOINT=http://apruv-h-hl.ua-apruv.svc.abie-ua.internal:8080
|
|
23
|
+
KVCMS_URL=http://kvcms-hl.ua-apruv.svc.abie-ua.internal:8080
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`<namespace>` (наприклад `dev-apruv` / `ua-apruv`) — `metadata.name` цільового namespace після kustomize-overlay для відповідного середовища; `<service>` — `metadata.name` headless Service (`-hl`) того сервісу, до якого йде URL.
|
|
27
|
+
|
|
28
|
+
**Перевірка `js/env_dns.mjs`** сканує всі `*.env` файли, basename яких збігається з `dev.env` / `ua.env` (з провідною крапкою чи без), знаходить **усі** internal URL (`http://<svc>.<ns>.svc.<dns>` — як для Hasura-ендпоінта, так і для KVCMS чи будь-якого іншого) і вимагає, щоб для кожного:
|
|
29
|
+
|
|
30
|
+
- DNS-суфікс відповідав env: `abie-dev.internal` / `abie-ua.internal`;
|
|
31
|
+
- namespace починався з `dev-` / `ua-` відповідно.
|
|
32
|
+
|
|
33
|
+
Загальне правило про **внутрішній** URL (не публічний домен) для `HASURA_GRAPHQL_ENDPOINT` лишається у **`hasura.mdc`** (для nitra і abie) — `rules/hasura/fix.mjs` приймає кластерний DNS-формат `<cluster>.internal`.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
## Firebase Hosting
|
|
2
|
+
|
|
3
|
+
У **кожному** підкаталозі, що лежить **безпосередньо** в корені репозиторію, не тримати конфіг і кеш **Firebase Hosting**: у таких каталогах не повинно бути **`.firebaserc`**, **`firebase.json`** та каталогу **`.firebase/`** (у **самому** корені репозиторію ці імена перевіркою abie **не** розглядаються; `node_modules` / `.git` зі скану вилучаються).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
## k8s: `hc.yaml` поруч із Deployment
|
|
2
|
+
|
|
3
|
+
Якщо під **`k8s`** є **Deployment**, у **тій самій директорії** має бути **`hc.yaml`** з **HealthCheckPolicy** (**`networking.gke.io/v1`**): коректний modeline **`$schema`**, **`httpHealthCheck.requestPath`** — непорожній шлях від кореня (рядок, що починається з **`/`**: канонічно **`/healthz`**, але також допустимі **`/IsAlive`**, **`/api/live`** тощо — узгоджується з реальним endpoint сервісу), порт **8080**, **`targetRef.name`** — **headless** **Service** з суфіксом **`-hl`** (узгоджено з парою **`svc.yaml`** / **`svc-hl.yaml`** у **k8s.mdc**): або **`${metadata.name}-hl`**, або те саме ім'я, якщо **`metadata.name`** уже з **`-hl`**.
|
|
4
|
+
|
|
5
|
+
```yaml title="hc.yaml"
|
|
6
|
+
# yaml-language-server: $schema=https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json
|
|
7
|
+
apiVersion: networking.gke.io/v1
|
|
8
|
+
kind: HealthCheckPolicy
|
|
9
|
+
metadata:
|
|
10
|
+
name: СЕРВІС
|
|
11
|
+
namespace: dev # kustomize overlay
|
|
12
|
+
spec:
|
|
13
|
+
default:
|
|
14
|
+
config:
|
|
15
|
+
type: HTTP
|
|
16
|
+
httpHealthCheck:
|
|
17
|
+
requestPath: /healthz
|
|
18
|
+
port: 8080
|
|
19
|
+
targetRef:
|
|
20
|
+
group: ''
|
|
21
|
+
kind: Service
|
|
22
|
+
name: СЕРВІС-hl
|
|
23
|
+
```
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
## k8s: overlay **HTTPRoute** (**ua**)
|
|
2
|
+
|
|
3
|
+
За наявності **Deployment** під **k8s** і наявності **Vite** (**`vite.config.js`**, **`vite.config.mjs`** або **`vite.config.ts`** у каталозі пакета) у **`ua/kustomization.yaml`** цього пакета потрібні **inline JSON6902** у **`patches`**: **target** **`kind: HTTPRoute`**, **непорожній `name`** (як у маніфесті маршруту). Мають бути зміни **`/spec/hostnames`** (домени abie — у скрипті) та **`/spec/parentRefs/0/namespace`** (**`ua`**, також дозволені префікси **`ua-*`**, наприклад **`ua-b2b`**). Як обирати **`op`** (**add** / **replace** тощо) у patch — **k8s.mdc** (розділ про JSON patch у kustomization).
|
|
4
|
+
|
|
5
|
+
### HTTPRoute: спільні сервіси **`auth-run-hl`**, **`file-link-hl`**
|
|
6
|
+
|
|
7
|
+
У **HTTPRoute** у шляху з **`…/k8s/base/…`** у **`spec.hostnames`** дозволені лише **`aiml.live`**, **`*.aiml.live`** та інші піддомени **aiml.live** (перевірка — Rego-пакет **`abie.http_route_base`**, див. розділ нижче).
|
|
8
|
+
|
|
9
|
+
Ці **Service** (headless **`-hl`**) живуть у **базовому** неймспейсі **`dev`**. У маніфесті **HTTPRoute** під **`k8s`** (шар без **`ua/`** — наприклад **`…/k8s/base/hr.yaml`**) для кожного **`backendRefs`** до такого сервісу явно вкажи **`namespace: dev`** і порт **8080**:
|
|
10
|
+
|
|
11
|
+
```yaml title="…/k8s/base/hr.yaml (фрагмент)"
|
|
12
|
+
spec:
|
|
13
|
+
rules:
|
|
14
|
+
- matches:
|
|
15
|
+
- path:
|
|
16
|
+
type: PathPrefix
|
|
17
|
+
value: /
|
|
18
|
+
backendRefs:
|
|
19
|
+
- name: auth-run-hl
|
|
20
|
+
namespace: dev
|
|
21
|
+
port: 8080
|
|
22
|
+
- name: file-link-hl
|
|
23
|
+
namespace: dev
|
|
24
|
+
port: 8080
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
У **`ua/kustomization.yaml`** додай до того самого **inline** patch на **`HTTPRoute`** (той самий **`target.name`**) операції **JSON6902** з **`path`**: **`/spec/rules/<i>/backendRefs/<j>/namespace`**, де **`<i>`** / **`<j>`** — індекси відповідно до порядку **`spec.rules`** та **`backendRefs`** у base-файлі; **`value`**: **`ua`** (також дозволені **`ua-*`**). Якщо кілька таких **`backendRefs`**, потрібна окрема операція для кожного.
|
|
28
|
+
|
|
29
|
+
```yaml title="…/ua/kustomization.yaml (фрагмент)"
|
|
30
|
+
- target:
|
|
31
|
+
kind: HTTPRoute
|
|
32
|
+
name: my-httproute
|
|
33
|
+
patch: |-
|
|
34
|
+
- op: replace
|
|
35
|
+
path: /spec/hostnames
|
|
36
|
+
value:
|
|
37
|
+
- "abie.app" # зокрема vybeerai.com.ua, *.vybeerai.com.ua, *.abie.app
|
|
38
|
+
- op: replace
|
|
39
|
+
path: /spec/parentRefs/0/namespace
|
|
40
|
+
value: ua
|
|
41
|
+
- op: replace
|
|
42
|
+
path: /spec/rules/0/backendRefs/0/namespace
|
|
43
|
+
value: ua
|
|
44
|
+
- op: replace
|
|
45
|
+
path: /spec/rules/0/backendRefs/1/namespace
|
|
46
|
+
value: ua
|
|
47
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## k8s: overlay **ua** і nodeSelector
|
|
2
|
+
|
|
3
|
+
У **`…/ua/kustomization.yaml`** того пакета, у дереві **`k8s`** якого є **Deployment**, потрібен patch на **`kind: Deployment`**: **`spec.template.spec.nodeSelector`** з **`preem: false`**. Форму **JSON6902** (шлях **`/spec/template/spec/nodeSelector`**, **`op`**) див. **k8s.mdc**.
|
|
4
|
+
|
|
5
|
+
```yaml title="…/ua/kustomization.yaml (фрагмент)"
|
|
6
|
+
patches:
|
|
7
|
+
- target:
|
|
8
|
+
kind: Deployment
|
|
9
|
+
name: my-app
|
|
10
|
+
patch: |-
|
|
11
|
+
- op: add
|
|
12
|
+
path: /spec/template/spec/nodeSelector
|
|
13
|
+
value:
|
|
14
|
+
preem: 'false'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Базовий Deployment (`…/base/`)
|
|
18
|
+
|
|
19
|
+
Якщо **Deployment** у YAML під **`k8s`** лежить у шляху з сегментом **`base`**, у **`spec.template.spec.nodeSelector`** має бути **`preem`** зі значенням **істинно** (**`true`** або рядок **`'true'`**); overlay **ua** підміняє селектор.
|
|
20
|
+
|
|
21
|
+
```yaml title="…/base/deploy.yaml (фрагмент)"
|
|
22
|
+
spec:
|
|
23
|
+
template:
|
|
24
|
+
spec:
|
|
25
|
+
nodeSelector:
|
|
26
|
+
preem: 'true' # буде замінено через kustomize
|
|
27
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Правила для проєктів AbInBev Efes
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
version: '1.22'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua**)), гілки **dev**, **ua** у **clean-merged-branch**, а також заборона тримати артефакти **Firebase Hosting** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; у самому корені ці імена не вимагаються до видалення).
|
|
8
|
+
|
|
9
|
+
[k8s-hc-yaml](./js/hc_pairing.mdc)
|
|
10
|
+
|
|
11
|
+
[k8s-http-route-ua](./js/ua_http_route.mdc)
|
|
12
|
+
|
|
13
|
+
[k8s-nodeselector](./js/ua_node_selector.mdc)
|
|
14
|
+
|
|
15
|
+
[env-dns](./js/env_dns.mdc)
|
|
16
|
+
|
|
17
|
+
## `@nitra/abie-shared` у `devDependencies`
|
|
18
|
+
|
|
19
|
+
У кореневому **`package.json`** abie-проєкту в **`devDependencies`** має бути **`@nitra/abie-shared`** — пакет зі спільними abie-ресурсами: канонічні GraphQL-схеми, скіли, типи (наприклад, шляхи `node_modules/@nitra/abie-shared/schema/...` для імпорту схем). Версію правило не фіксує — лише presence. Додати:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
bun add -d @nitra/abie-shared
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
[firebase](./js/firebase_hosting.mdc)
|
|
26
|
+
|
|
27
|
+
## Git branches
|
|
28
|
+
|
|
29
|
+
У **`.github/workflows/clean-merged-branch.yml`** у кроці **`phpdocker-io/github-actions-delete-abandoned-branches`** значення **`with.ignore_branches`** має містити **dev** та **ua** (разом з іншими гілками, якщо потрібно):
|
|
30
|
+
|
|
31
|
+
- abie-specific канон (action marker + required ignore_branches tokens): [clean-merged-branch.yml.snippet.yml](./policy/clean_merged_ignore_branches/template/clean-merged-branch.yml.snippet.yml)
|
|
32
|
+
|
|
33
|
+
## Швидкий gate через conftest (Rego)
|
|
34
|
+
|
|
35
|
+
Підмножину пер-документних правил продубльовано як rego-полісі у **`npm/rules/abie/policy/`** (запускається через **`bun run lint-rego`** для `*_test.rego` юніт-тестів і через **`npx @nitra/cursor fix abie`** для прогону по реальних YAML — деталі в **conftest.mdc** / **n-rego.mdc**). JS у **`js/<concern>.mjs`** authoritative — rego тільки швидкий gate для одиничного маніфеста (зокрема через IDE-розширення `tsandall.opa`).
|
|
36
|
+
|
|
37
|
+
Пакети (директорія в **`npm/policy/abie/`** → namespace → що перевіряє):
|
|
38
|
+
|
|
39
|
+
- **`http_route_base/`** → `abie.http_route_base` — у HTTPRoute під `…/k8s/.../base/...` усі `spec.hostnames` мають бути в домені `aiml.live` (включно з `*.aiml.live` та піддоменами). **Цільові файли:** `…/k8s/.../base/.../hr.yaml`.
|
|
40
|
+
- **`health_check_policy/`** → `abie.health_check_policy` — структура HealthCheckPolicy: `apiVersion: networking.gke.io/v1`, `metadata.name`, `spec.default.config.type: HTTP`, `httpHealthCheck.requestPath` починається з `/`, `port: 8080`, `targetRef.kind: Service`, `targetRef.name` має суфікс `-hl`. **Цільові файли:** `…/k8s/.../hc.yaml`.
|
|
41
|
+
- **`base_deployment_preem/`** → `abie.base_deployment_preem` — Deployment у base/ має `spec.template.spec.nodeSelector.preem` зі значенням `true` (boolean або рядок). **Цільові файли:** ресурсні YAML під `…/k8s/.../base/...`.
|
|
42
|
+
- **`clean_merged_ignore_branches/`** → `abie.clean_merged_ignore_branches` — у workflow `.github/workflows/clean-merged-branch.yml` крок з `uses: phpdocker-io/github-actions-delete-abandoned-branches` має `with.ignore_branches`, що містить токени `dev,ua` (case-insensitive). **Цільові файли:** `.github/workflows/clean-merged-branch.yml`.
|
|
43
|
+
- **`package_json_shared/`** → `abie.package_json_shared` — у кореневому `package.json` `devDependencies` має містити `@nitra/abie-shared` (presence-only, версію не фіксуємо). **Цільові файли:** `package.json`.
|
|
44
|
+
|
|
45
|
+
Cross-file / FS-логіка лишається у JS-частинах (`js/<concern>.mjs`) — Rego не читає файлову систему й не робить cross-document резолюцію:
|
|
46
|
+
|
|
47
|
+
- парність HCP↔Deployment у каталозі та modeline `hc.yaml` — `js/hc_pairing.mjs`;
|
|
48
|
+
- валідація ua-overlay JSON6902 patches на HTTPRoute + аналіз cross-namespace `backendRefs` у пакетах — `js/ua_http_route.mjs`;
|
|
49
|
+
- ua-overlay JSON6902 patch на `Deployment.nodeSelector` (`preem: false`) — `js/ua_node_selector.mjs`;
|
|
50
|
+
- env→cluster DNS (`*.dev.env` / `*.ua.env`) — `js/env_dns.mjs`;
|
|
51
|
+
- скан артефактів Firebase Hosting у підкаталогах першого рівня — `js/firebase_hosting.mjs`.
|
|
52
|
+
|
|
53
|
+
Точна звірка `targetRef.name` HealthCheckPolicy з суфіксом `-hl` обчислюється з `hcp.metadata.name` і живе у Rego (`abie.health_check_policy`); за конвенцією `hcp.metadata.name` дорівнює `<deployment.name>`, тому окремий cross-file lookup до маніфесту Deployment не потрібен.
|
|
@@ -6,19 +6,19 @@ resource: npm/rules/doc-files/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/doc-files/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
11
|
-
| [docgen-crc.mjs](docgen-crc.md)
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ------------------------------------------------------- | --------- |
|
|
11
|
+
| [docgen-crc.mjs](docgen-crc.md) | JS Module |
|
|
12
12
|
| [docgen-extract-anchors.mjs](docgen-extract-anchors.md) | JS Module |
|
|
13
|
-
| [docgen-extract.mjs](docgen-extract.md)
|
|
14
|
-
| [docgen-files-batch.mjs](docgen-files-batch.md)
|
|
15
|
-
| [docgen-gen.mjs](docgen-gen.md)
|
|
16
|
-
| [docgen-ignore.mjs](docgen-ignore.md)
|
|
17
|
-
| [docgen-judge-measure.mjs](docgen-judge-measure.md)
|
|
18
|
-
| [docgen-judge.mjs](docgen-judge.md)
|
|
19
|
-
| [docgen-prompts.mjs](docgen-prompts.md)
|
|
20
|
-
| [docgen-scan.mjs](docgen-scan.md)
|
|
21
|
-
| [run-lint.mjs](run-lint.md)
|
|
22
|
-
| [units-js.mjs](units-js.md)
|
|
23
|
-
| [units-rs.mjs](units-rs.md)
|
|
24
|
-
| [units.mjs](units.md)
|
|
13
|
+
| [docgen-extract.mjs](docgen-extract.md) | JS Module |
|
|
14
|
+
| [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
|
|
15
|
+
| [docgen-gen.mjs](docgen-gen.md) | JS Module |
|
|
16
|
+
| [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
|
|
17
|
+
| [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
|
|
18
|
+
| [docgen-judge.mjs](docgen-judge.md) | JS Module |
|
|
19
|
+
| [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
|
|
20
|
+
| [docgen-scan.mjs](docgen-scan.md) | JS Module |
|
|
21
|
+
| [run-lint.mjs](run-lint.md) | JS Module |
|
|
22
|
+
| [units-js.mjs](units-js.md) | JS Module |
|
|
23
|
+
| [units-rs.mjs](units-rs.md) | JS Module |
|
|
24
|
+
| [units.mjs](units.md) | JS Module |
|
package/rules/js/docs/index.md
CHANGED
package/rules/js/docs/main.md
CHANGED
|
@@ -3,26 +3,26 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/js/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 00294e8e
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль
|
|
13
|
+
Модуль забезпечує виконання функцій `run`, `filterJsFiles` та `lint` для аналізу кодової бази. Він виконує стандартну перевірку проєкту, відбираючи файли з розширеннями JavaScript за допомогою `filterJsFiles` та запускаючи перевірку JS-коду за допомогою `lint`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
run виконує стандартну перевірку проєкту.
|
|
18
|
-
filterJsFiles відбирає з наданого списку лише
|
|
19
|
-
lint запускає
|
|
18
|
+
filterJsFiles відбирає з наданого списку лише файли з розширеннями, характерними для JavaScript.
|
|
19
|
+
lint запускає перевірку JS-коду, виконуючи або повний аналіз проєкту, або класифіковану перевірку змінених файлів.
|
|
20
20
|
|
|
21
21
|
## Публічний API
|
|
22
22
|
|
|
23
|
-
run —
|
|
24
|
-
filterJsFiles — відбирає лише файли,
|
|
25
|
-
lint —
|
|
23
|
+
run — основна точка входу для виконання правил, що включає перевірку логіки застосування, логіки політик та посилань на метадані.
|
|
24
|
+
filterJsFiles — відбирає лише файли, схожі на JavaScript, з наданого списку.
|
|
25
|
+
lint — запускає інструменти oxlint та eslint (для окремих файлів або всього проекту) та jscpd+knip (тільки для всього проекту), з можливістю автоматичного виправлення або лише виявлення проблем.
|
|
26
26
|
|
|
27
27
|
## Гарантії поведінки
|
|
28
28
|
|
|
@@ -3,34 +3,30 @@ type: JS Module
|
|
|
3
3
|
title: check.mjs
|
|
4
4
|
resource: npm/rules/js/js/check.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 7ad4aa59
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль виконує
|
|
13
|
+
Модуль виконує валідацію конфігураційних файлів, включаючи `package.json`, `.oxlintrc.json`, `knip.json`, `knip-canonical.json` та `.eslintrc.json`. Він перевіряє відповідність структури та конфігурацій встановленим стандартам. (js.mdc) (text.mdc)
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
1.
|
|
18
|
-
2.
|
|
19
|
-
3.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
б. Перевіряє, чи не дублює `lint.yml` кроки лінтінгу JS.
|
|
27
|
-
6. Перевіряє наявність файлу `knip.json` у корені проєкту. Якщо він відсутній, копіює канонічний шаблон.
|
|
28
|
-
7. Перевіряє наявність застарілих конфігурацій ESLint (`.eslintrc`, `.eslintrc.js`, `.eslintrc.json`, `.eslintrc.yml`) та повідомляє про їхнє існування.
|
|
29
|
-
8. Повертає код виходу, що відображає загальний статус перевірки.
|
|
17
|
+
1. Викликається функція check.
|
|
18
|
+
2. Ініціалізується механізм збору результатів перевірок.
|
|
19
|
+
3. Перевіряється конфігураційний файл ESLint.
|
|
20
|
+
4. Перевіряється структура пакетів у workspace'ах, включаючи наявність `"type": "module"` та вимоги до версій Node та Bun у `package.json` кожного пакета.
|
|
21
|
+
5. Перевіряється конфігураційний файл `.oxlintrc.json` на відповідність канонічному шаблону.
|
|
22
|
+
6. Перевіряється структура файлів у робочих процесах GitHub, зокрема наявність `lint-js.yml` та відсутність дублювання кроків лінтингу в `lint.yml`.
|
|
23
|
+
7. Перевіряється наявність `knip.json` у корені проєкту. Якщо відсутній, він створюється з канонічного шаблону.
|
|
24
|
+
8. Після виконання всіх перевірок, сканується проєкт на наявність застарілих конфігураційних файлів ESLint.
|
|
25
|
+
9. Повертається код виходу, що відображає загальний статус виконання перевірок.
|
|
30
26
|
|
|
31
27
|
## Публічний API
|
|
32
28
|
|
|
33
|
-
check —
|
|
29
|
+
check — перевіряє відповідність проєкту стандартам js.mdc
|
|
34
30
|
|
|
35
31
|
## Гарантії поведінки
|
|
36
32
|
|
|
@@ -6,9 +6,9 @@ resource: npm/rules/js/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/js/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
11
|
-
| [check.mjs](check.md)
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
|---|---|
|
|
11
|
+
| [check.mjs](check.md) | JS Module |
|
|
12
12
|
| [lint-findings.mjs](lint-findings.md) | JS Module |
|
|
13
|
-
| [tooling.mjs](tooling.md)
|
|
13
|
+
| [tooling.mjs](tooling.md) | JS Module |
|
|
14
14
|
| [utils_imports.mjs](utils_imports.md) | JS Module |
|
|
@@ -3,26 +3,26 @@ type: JS Module
|
|
|
3
3
|
title: tooling.mjs
|
|
4
4
|
resource: npm/rules/js/js/tooling.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 101a5230
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 95
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Визначає шляхи до канонічних
|
|
13
|
+
Визначає шляхи до канонічних JSON-файлів для інструментів oxlint та knip через OXLINT_CANONICAL_JSON_PATH та KNIP_CANONICAL_JSON_PATH. Також перевіряє відповідність конфігураційного файлу .oxlintrc.json значенням, встановленим у oxlint-canonical.json, за допомогою verifyOxlintRcAgainstCanonical.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
OXLINT_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу oxlint у цьому пакеті.
|
|
18
|
-
KNIP_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу knip у цьому пакеті.
|
|
19
|
-
verifyOxlintRcAgainstCanonical — Перевіряє конфігураційний файл `.oxlintrc.json` на відповідність
|
|
17
|
+
OXLINT_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу для oxlint у цьому пакеті.
|
|
18
|
+
KNIP_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу для knip у цьому пакеті.
|
|
19
|
+
verifyOxlintRcAgainstCanonical — Перевіряє конфігураційний файл `.oxlintrc.json` на відповідність канонічним значенням, визначеним у `oxlint-canonical.json`.
|
|
20
20
|
|
|
21
21
|
## Публічний API
|
|
22
22
|
|
|
23
|
-
OXLINT_CANONICAL_JSON_PATH — Вказує
|
|
24
|
-
KNIP_CANONICAL_JSON_PATH —
|
|
25
|
-
verifyOxlintRcAgainstCanonical — Порівнює конфігураційний файл `.oxlintrc.json` з
|
|
23
|
+
OXLINT_CANONICAL_JSON_PATH — Вказує на файл з еталонними налаштуваннями oxlint для валідації.
|
|
24
|
+
KNIP_CANONICAL_JSON_PATH — Шлях до еталонних налаштувань knip, які копіюються у корінь проєкту, якщо їх немає.
|
|
25
|
+
verifyOxlintRcAgainstCanonical — Порівнює конфігураційний файл `.oxlintrc.json` з еталоном, перевіряючи, чи всі правила з еталону присутні, а інші поля збігаються з каноном.
|
|
26
26
|
|
|
27
27
|
## Гарантії поведінки
|
|
28
28
|
|