@nitra/cursor 12.8.6 → 12.8.8

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.
Files changed (263) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +1 -1
  3. package/rules/abie/main.mdc +9 -5
  4. package/rules/abie/policy/base_deployment_preem/base_deployment_preem.mdc +22 -0
  5. package/rules/abie/policy/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
  6. package/rules/abie/policy/health_check_policy/health_check_policy.mdc +17 -0
  7. package/rules/abie/policy/http_route_base/http_route_base.mdc +9 -0
  8. package/rules/abie/policy/package_json_shared/package_json_shared.mdc +17 -0
  9. package/rules/adr/js/hooks.mdc +32 -0
  10. package/rules/adr/js/madr_format.mdc +96 -0
  11. package/rules/adr/js/settings_policy.mdc +34 -0
  12. package/rules/adr/main.mdc +17 -95
  13. package/rules/adr/policy/settings_json/settings_json.mdc +7 -0
  14. package/rules/adr/policy/settings_local_json/settings_local_json.mdc +7 -0
  15. package/rules/bun/js/bunfig.mdc +12 -0
  16. package/rules/bun/js/layout.mdc +60 -0
  17. package/rules/bun/js/lint.mdc +9 -0
  18. package/rules/bun/js/package_json.mdc +19 -0
  19. package/rules/bun/main.mdc +7 -60
  20. package/rules/bun/policy/bunfig/bunfig.mdc +12 -0
  21. package/rules/bun/policy/package_json/package_json.mdc +14 -0
  22. package/rules/capacitor/js/ios_spm.mdc +69 -0
  23. package/rules/capacitor/js/version.mdc +29 -0
  24. package/rules/capacitor/main.mdc +6 -22
  25. package/rules/capacitor/policy/package_json/package_json.mdc +9 -0
  26. package/rules/changelog/js/agent-workflow.mdc +15 -0
  27. package/rules/changelog/js/changelog-format.mdc +33 -0
  28. package/rules/changelog/js/comparison-models.mdc +40 -0
  29. package/rules/changelog/main.mdc +4 -98
  30. package/rules/ci4/js/marksman_config.mdc +31 -0
  31. package/rules/ci4/js/vscode_extensions.mdc +33 -0
  32. package/rules/ci4/main.mdc +16 -14
  33. package/rules/ci4/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  34. package/rules/docker/js/compile.mdc +44 -0
  35. package/rules/docker/js/hadolint.mdc +50 -0
  36. package/rules/docker/js/mirror.mdc +13 -0
  37. package/rules/docker/js/multistage.mdc +13 -0
  38. package/rules/docker/js/native-addon.mdc +43 -0
  39. package/rules/docker/js/nginx-tag.mdc +7 -0
  40. package/rules/docker/js/nginx-user.mdc +37 -0
  41. package/rules/docker/js/non-root.mdc +39 -0
  42. package/rules/docker/main.mdc +13 -196
  43. package/rules/docker/policy/lint_docker_yml/lint_docker_yml.mdc +14 -0
  44. package/rules/efes/main.mdc +1 -1
  45. package/rules/efes/policy/package_json_shared/package_json_shared.mdc +30 -0
  46. package/rules/ga/js/lint_toolchain.mdc +15 -0
  47. package/rules/ga/js/required_workflows.mdc +35 -0
  48. package/rules/ga/js/vscode.mdc +17 -0
  49. package/rules/ga/js/workflow_common.mdc +108 -0
  50. package/rules/ga/js/workflows.mdc +32 -0
  51. package/rules/ga/js/zizmor.mdc +7 -0
  52. package/rules/ga/main.mdc +16 -119
  53. package/rules/ga/policy/clean_ga_workflows/clean_ga_workflows.mdc +18 -0
  54. package/rules/ga/policy/clean_merged_branch/clean_merged_branch.mdc +22 -0
  55. package/rules/ga/policy/git_ai/git_ai.mdc +19 -0
  56. package/rules/ga/policy/lint_ga/lint_ga.mdc +21 -0
  57. package/rules/ga/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  58. package/rules/ga/policy/vscode_settings/vscode_settings.mdc +9 -0
  59. package/rules/ga/policy/workflow_common/workflow_common.mdc +18 -0
  60. package/rules/ga/policy/zizmor_yml/zizmor_yml.mdc +9 -0
  61. package/rules/graphql/js/tooling.mdc +13 -0
  62. package/rules/graphql/js/vscode_extensions.mdc +13 -0
  63. package/rules/graphql/main.mdc +4 -21
  64. package/rules/graphql/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  65. package/rules/hasura/js/internal_urls.mdc +27 -0
  66. package/rules/hasura/js/migrations.mdc +13 -0
  67. package/rules/hasura/js/svc_hl.mdc +17 -0
  68. package/rules/hasura/main.mdc +6 -30
  69. package/rules/hasura/policy/svc_hl/svc_hl.mdc +15 -0
  70. package/rules/image-avif/js/avif_generation.mdc +26 -0
  71. package/rules/image-avif/js/package_json_optout.mdc +21 -0
  72. package/rules/image-avif/main.mdc +5 -34
  73. package/rules/image-avif/policy/package_json/package_json.mdc +18 -0
  74. package/rules/image-compress/js/package_json.mdc +7 -0
  75. package/rules/image-compress/js/package_setup.mdc +13 -0
  76. package/rules/image-compress/main.mdc +4 -12
  77. package/rules/image-compress/policy/package_json/package_json.mdc +13 -0
  78. package/rules/js/docs/index.md +3 -3
  79. package/rules/js/js/dep-policy.mdc +17 -0
  80. package/rules/js/js/eslint-config.mdc +28 -0
  81. package/rules/js/js/extensions.mdc +8 -0
  82. package/rules/js/js/file-extensions.mdc +12 -0
  83. package/rules/js/js/for-in.mdc +26 -0
  84. package/rules/js/js/jscpd.mdc +42 -0
  85. package/rules/js/js/knip.mdc +15 -0
  86. package/rules/js/js/lint-js-workflow.mdc +58 -0
  87. package/rules/js/js/oxlintrc.mdc +20 -0
  88. package/rules/js/js/package-json.mdc +31 -0
  89. package/rules/js/js/tests.mdc +9 -0
  90. package/rules/js/js/utils-lib-structure.mdc +15 -0
  91. package/rules/js/main.mdc +19 -211
  92. package/rules/js/policy/jscpd/jscpd.mdc +14 -0
  93. package/rules/js/policy/lint_js_yml/lint_js_yml.mdc +14 -0
  94. package/rules/js/policy/package_json/package_json.mdc +15 -0
  95. package/rules/js/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  96. package/rules/js-bun-db/js/bun-sql-migration.mdc +15 -0
  97. package/rules/js-bun-db/js/connection.mdc +42 -0
  98. package/rules/js-bun-db/js/pg-format-identifiers.mdc +102 -0
  99. package/rules/js-bun-db/js/pg-format-shim.mdc +99 -0
  100. package/rules/js-bun-db/js/pg-leftover.mdc +27 -0
  101. package/rules/js-bun-db/js/pg-listen-notify.mdc +51 -0
  102. package/rules/js-bun-db/js/query-safety.mdc +117 -0
  103. package/rules/js-bun-db/js/sql-array.mdc +88 -0
  104. package/rules/js-bun-db/js/unsafe.mdc +65 -0
  105. package/rules/js-bun-db/main.mdc +12 -607
  106. package/rules/js-bun-db/policy/package_json/package_json.mdc +17 -0
  107. package/rules/js-bun-redis/js/imports.mdc +47 -0
  108. package/rules/js-bun-redis/js/package_json.mdc +44 -0
  109. package/rules/js-bun-redis/main.mdc +4 -10
  110. package/rules/js-bun-redis/policy/package_json/package_json.mdc +11 -0
  111. package/rules/js-mssql/js/mssql-in-list.mdc +38 -0
  112. package/rules/js-mssql/js/mssql-pool.mdc +56 -0
  113. package/rules/js-mssql/js/mssql-query-template.mdc +33 -0
  114. package/rules/js-mssql/js/mssql-tvp.mdc +75 -0
  115. package/rules/js-mssql/js/mssql-version.mdc +7 -0
  116. package/rules/js-mssql/main.mdc +10 -198
  117. package/rules/js-mssql/policy/package_json/package_json.mdc +9 -0
  118. package/rules/js-run/js/check-env.mdc +35 -0
  119. package/rules/js-run/js/conn-aliases.mdc +109 -0
  120. package/rules/js-run/js/jsconfig.mdc +20 -0
  121. package/rules/js-run/js/otel-configmap.mdc +6 -0
  122. package/rules/js-run/js/pino.mdc +6 -0
  123. package/rules/js-run/js/project-structure.mdc +11 -0
  124. package/rules/js-run/js/runtime.mdc +14 -0
  125. package/rules/js-run/js/scope.mdc +11 -0
  126. package/rules/js-run/js/settimeout.mdc +11 -0
  127. package/rules/js-run/js/temporal.mdc +5 -0
  128. package/rules/js-run/main.mdc +16 -216
  129. package/rules/js-run/policy/configmap/configmap.mdc +31 -0
  130. package/rules/js-run/policy/jsconfig/jsconfig.mdc +25 -0
  131. package/rules/js-run/policy/package_json/package_json.mdc +38 -0
  132. package/rules/k8s/js/configmap.mdc +41 -0
  133. package/rules/k8s/js/deployment_resources.mdc +49 -0
  134. package/rules/k8s/js/hasura_httproute.mdc +91 -0
  135. package/rules/k8s/js/hpa_apiversion.mdc +27 -0
  136. package/rules/k8s/js/ingress_gateway.mdc +16 -0
  137. package/rules/k8s/js/kustomize_structure.mdc +144 -0
  138. package/rules/k8s/js/lint_k8s.mdc +72 -0
  139. package/rules/k8s/js/multidoc_yaml.mdc +5 -0
  140. package/rules/k8s/js/network_policy.mdc +136 -0
  141. package/rules/k8s/js/schema_modeline.mdc +57 -0
  142. package/rules/k8s/js/service.mdc +44 -0
  143. package/rules/k8s/js/topology_hpa_pdb.mdc +181 -0
  144. package/rules/k8s/main.mdc +29 -834
  145. package/rules/k8s/policy/base_kustomization/base_kustomization.mdc +12 -0
  146. package/rules/k8s/policy/base_manifest/base_manifest.mdc +14 -0
  147. package/rules/k8s/policy/gateway/gateway.mdc +17 -0
  148. package/rules/k8s/policy/hasura_configmap/hasura_configmap.mdc +20 -0
  149. package/rules/k8s/policy/hasura_httproute/hasura_httproute.mdc +16 -0
  150. package/rules/k8s/policy/hpa_pdb/hpa_pdb.mdc +23 -0
  151. package/rules/k8s/policy/kustomization/kustomization.mdc +20 -0
  152. package/rules/k8s/policy/manifest/manifest.mdc +17 -0
  153. package/rules/k8s/policy/network_policy/network_policy.mdc +22 -0
  154. package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
  155. package/rules/k8s/policy/svc_yaml/svc_yaml.mdc +12 -0
  156. package/rules/nginx-default-tpl/js/dockerfile.mdc +36 -0
  157. package/rules/nginx-default-tpl/js/http-route.mdc +41 -0
  158. package/rules/nginx-default-tpl/js/ini-keys.mdc +21 -0
  159. package/rules/nginx-default-tpl/js/template-structure.mdc +86 -0
  160. package/rules/nginx-default-tpl/js/vscode.mdc +37 -0
  161. package/rules/nginx-default-tpl/main.mdc +8 -110
  162. package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  163. package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.mdc +15 -0
  164. package/rules/npm-module/js/docs/index.md +5 -5
  165. package/rules/npm-module/js/docs/rule_meta.md +6 -6
  166. package/rules/npm-module/js/docs/skill_meta.md +8 -8
  167. package/rules/npm-module/js/header_doc_pointer.mdc +18 -0
  168. package/rules/npm-module/js/package_structure.mdc +62 -0
  169. package/rules/npm-module/js/rule_meta.mdc +11 -0
  170. package/rules/npm-module/js/skill_meta.mdc +11 -0
  171. package/rules/npm-module/main.mdc +10 -52
  172. package/rules/npm-module/policy/emit_types_config/emit_types_config.mdc +40 -0
  173. package/rules/npm-module/policy/npm_package_json/npm_package_json.mdc +50 -0
  174. package/rules/npm-module/policy/root_package_json/root_package_json.mdc +37 -0
  175. package/rules/php/js/lint_php_yml.mdc +12 -0
  176. package/rules/php/js/tooling.mdc +66 -0
  177. package/rules/php/main.mdc +5 -66
  178. package/rules/php/policy/lint_php_yml/lint_php_yml.mdc +21 -0
  179. package/rules/python/js/lint_python_yml.mdc +23 -0
  180. package/rules/python/js/pyproject_toml.mdc +32 -0
  181. package/rules/python/js/tooling.mdc +23 -0
  182. package/rules/python/main.mdc +7 -32
  183. package/rules/python/policy/lint_python_yml/lint_python_yml.mdc +12 -0
  184. package/rules/python/policy/pyproject_toml/pyproject_toml.mdc +13 -0
  185. package/rules/rego/js/rego-lint.mdc +31 -0
  186. package/rules/rego/js/vscode_extensions.mdc +11 -0
  187. package/rules/rego/js/vscode_settings.mdc +13 -0
  188. package/rules/rego/main.mdc +10 -22
  189. package/rules/rego/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  190. package/rules/rego/policy/vscode_settings/vscode_settings.mdc +19 -0
  191. package/rules/rust/js/coverage.mdc +28 -0
  192. package/rules/rust/js/lint.mdc +22 -0
  193. package/rules/rust/js/tauri_composition.mdc +8 -0
  194. package/rules/rust/js/vscode_extensions.mdc +12 -0
  195. package/rules/rust/main.mdc +8 -38
  196. package/rules/rust/policy/lint_rust_yml/lint_rust_yml.mdc +12 -0
  197. package/rules/rust/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  198. package/rules/security/js/rego_policies.mdc +15 -0
  199. package/rules/security/js/sample_secret.mdc +19 -0
  200. package/rules/security/js/trufflehog.mdc +21 -0
  201. package/rules/security/main.mdc +7 -34
  202. package/rules/security/policy/lint_security_yml/lint_security_yml.mdc +7 -0
  203. package/rules/security/policy/package_json/package_json.mdc +7 -0
  204. package/rules/style/js/admin-table.mdc +88 -0
  205. package/rules/style/js/colors.mdc +21 -0
  206. package/rules/style/js/gap.mdc +22 -0
  207. package/rules/style/js/quasar-fixes.mdc +32 -0
  208. package/rules/style/js/quasar.mdc +7 -0
  209. package/rules/style/js/tooling.mdc +85 -0
  210. package/rules/style/main.mdc +12 -251
  211. package/rules/style/policy/lint_style_yml/lint_style_yml.mdc +13 -0
  212. package/rules/style/policy/package_json/package_json.mdc +18 -0
  213. package/rules/style/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  214. package/rules/style/policy/vscode_settings/vscode_settings.mdc +19 -0
  215. package/rules/tauri/js/cargo_mutants_config.mdc +39 -0
  216. package/rules/tauri/js/tool_surface.mdc +21 -0
  217. package/rules/tauri/js/tooling.mdc +25 -0
  218. package/rules/tauri/main.mdc +6 -78
  219. package/rules/tauri/policy/vscode_extensions/vscode_extensions.mdc +21 -0
  220. package/rules/test/js/cargo_mutants_config.mdc +18 -0
  221. package/rules/test/js/docs/index.md +7 -7
  222. package/rules/test/js/location.mdc +52 -0
  223. package/rules/test/js/no-console-store-restore.mdc +11 -0
  224. package/rules/test/js/no-process-chdir.mdc +15 -0
  225. package/rules/test/js/no-relative-fs-path.mdc +22 -0
  226. package/rules/test/js/sandbox-aware-test.mdc +28 -0
  227. package/rules/test/js/stryker_config.mdc +26 -0
  228. package/rules/test/js/vitest-config-pool-forks.mdc +33 -0
  229. package/rules/test/main.mdc +16 -184
  230. package/rules/test/policy/package_json/package_json.mdc +16 -0
  231. package/rules/text/js/ci-lint-text.mdc +15 -0
  232. package/rules/text/js/cspell.mdc +81 -0
  233. package/rules/text/js/dotenv-linter.mdc +16 -0
  234. package/rules/text/js/forbidden-prettier.mdc +13 -0
  235. package/rules/text/js/markdownlint.mdc +25 -0
  236. package/rules/text/js/oxfmt.mdc +35 -0
  237. package/rules/text/js/package-json.mdc +26 -0
  238. package/rules/text/js/shellcheck.mdc +18 -0
  239. package/rules/text/js/v8r.mdc +23 -0
  240. package/rules/text/js/vscode.mdc +86 -0
  241. package/rules/text/main.mdc +20 -231
  242. package/rules/text/policy/cspell/cspell.mdc +34 -0
  243. package/rules/text/policy/lint_text/lint_text.mdc +19 -0
  244. package/rules/text/policy/markdownlint/markdownlint.mdc +38 -0
  245. package/rules/text/policy/oxfmtrc/oxfmtrc.mdc +11 -0
  246. package/rules/text/policy/package_json/package_json.mdc +33 -0
  247. package/rules/text/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  248. package/rules/text/policy/vscode_settings/vscode_settings.mdc +13 -0
  249. package/rules/vue/js/composition-api.mdc +82 -0
  250. package/rules/vue/js/nheader-layout.mdc +171 -0
  251. package/rules/vue/js/node-imports.mdc +25 -0
  252. package/rules/vue/js/quasar-ui.mdc +32 -0
  253. package/rules/vue/js/structure.mdc +101 -0
  254. package/rules/vue/js/testing.mdc +32 -0
  255. package/rules/vue/js/tfm-translations.mdc +26 -0
  256. package/rules/vue/js/vite-config.mdc +126 -0
  257. package/rules/vue/js/vite-env.mdc +55 -0
  258. package/rules/vue/js/vue-imports.mdc +25 -0
  259. package/rules/vue/main.mdc +15 -641
  260. package/rules/vue/policy/package_json/package_json.mdc +30 -0
  261. package/scripts/docs/index.md +16 -16
  262. package/scripts/lib/docs/index.md +36 -36
  263. package/scripts/utils/docs/index.md +14 -14
@@ -5,41 +5,16 @@ alwaysApply: false
5
5
  version: '1.0'
6
6
  ---
7
7
 
8
- Python-проєкти ведуться **виключно** на [uv](https://docs.astral.sh/uv/) — єдиний пакет-менеджер і резолвер. **Poetry заборонено.**
8
+ Python-проєкти ведуться **виключно** на [uv](https://docs.astral.sh/uv/) — єдиний пакет-менеджер і резолвер. **Poetry заборонено.** Середовище: `uv sync --frozen` (строго з `uv.lock`).
9
9
 
10
- - Метадані проєкту — у секції **`[project]`** (PEP 621), а **не** в `[tool.poetry]`.
11
- - Lock-файл — **`uv.lock`** (коммітиться). `poetry.lock` / `poetry.toml` мають бути відсутні.
12
- - Залежності: `uv add <pkg>`; dev-залежності: `uv add --dev <pkg>`.
13
- - Середовище: `uv sync --frozen` (строго з `uv.lock`).
10
+ [python-pyproject_toml](./js/pyproject_toml.mdc)
14
11
 
15
- `uv` / `ruff` / `mypy` **не** додаються в кореневі `devDependencies` споживача — це окремий toolchain і ставиться через `astral-sh/setup-uv` у CI або локально (як `composer` / `regal`).
12
+ [python-lint_python_yml](./js/lint_python_yml.mdc)
16
13
 
17
- ## Міграція з Poetry на uv
14
+ [python-tooling](./js/tooling.mdc)
18
15
 
19
- 1. Прибери `[tool.poetry]` і `poetry.lock` / `poetry.toml`.
20
- 2. Перенеси метадані в `[project]` (name, version, requires-python, dependencies) за PEP 621.
21
- 3. Згенеруй lock: `uv lock` → `uv.lock`.
22
- 4. Dev-залежності: `uv add --dev ruff mypy …`.
16
+ ## Швидкий gate через conftest (Rego)
23
17
 
24
- Канонічний цільовий вигляд `pyproject.toml`: [pyproject.toml.snippet.toml](./policy/pyproject_toml/template/pyproject.toml.snippet.toml)
18
+ [python-pyproject_toml-policy](./policy/pyproject_toml/pyproject_toml.mdc)
25
19
 
26
- Заборонені під-таблиці `[tool.*]` (Poetry): [pyproject.toml.deny.toml](./policy/pyproject_toml/template/pyproject.toml.deny.toml)
27
-
28
- ## lint-python
29
-
30
- Інструменти uv-екосистеми не мають єдиного CLI, що сам обходить репозиторій, тому python-лінт делегується у JS-скрипт-обгортку. Запуск — через **`n-cursor lint python`** (CI — `--read-only`); окремого `package.json`-скрипта немає.
31
-
32
- Скрипт `rules/python/lint/lint.mjs`:
33
-
34
- - якщо `pyproject.toml` у корені відсутній — вихід 0 (перевірка пропущена);
35
- - якщо `pyproject.toml` є, але `uv` не знайдено в PATH — це помилка;
36
- - `uv lock --check` і `uv sync --frozen` — обовʼязкові;
37
- - `uv run ruff check --fix .` + `uv run ruff format .` — auto-fix (мутують робоче дерево, як `markdownlint-cli2 --fix` у lint-text);
38
- - `uv run mypy .` — статична перевірка типів;
39
- - усі `ruff`/`mypy`-кроки запускаються лише якщо інструмент доступний у середовищі (інакше крок пропускається з повідомленням).
40
-
41
- ## CI: `.github/workflows/lint-python.yml`
42
-
43
- - Канон: [lint-python.yml.snippet.yml](./policy/lint_python_yml/template/lint-python.yml.snippet.yml)
44
-
45
- Без кроків `poetry install` / `snok/install-poetry` — лише `astral-sh/setup-uv@v8.0.0` + `uv sync --frozen`.
20
+ [python-lint_python_yml-policy](./policy/lint_python_yml/lint_python_yml.mdc)
@@ -0,0 +1,12 @@
1
+ ## Rego-gate: перевірка `.github/workflows/lint-python.yml`
2
+
3
+ Rego-пакет: `python.lint_python_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-python.yml`
6
+
7
+ Перевіряє (drift-safe через `--data template`):
8
+
9
+ - кожен `uses` з канону (підмножина) присутній у workflow: `actions/checkout@v6`, `./.github/actions/setup-bun-deps`, `astral-sh/setup-uv@v8.0.0`;
10
+ - кожен `run` з канону є substring серед run-кроків: `uv sync --frozen`, `n-cursor lint python --read-only`.
11
+
12
+ Канонічний workflow: [lint-python.yml.snippet.yml](./template/lint-python.yml.snippet.yml)
@@ -0,0 +1,13 @@
1
+ ## Rego-gate: перевірка `pyproject.toml`
2
+
3
+ Rego-пакет: `python.pyproject_toml`
4
+
5
+ Цільовий файл: `pyproject.toml`
6
+
7
+ Дві групи правил:
8
+
9
+ **1. Заборона Poetry** — перевіряє заборонені під-таблиці `[tool.*]` за deny-template (drift-safe через `--data template`): [pyproject.toml.deny.toml](./template/pyproject.toml.deny.toml)
10
+
11
+ **2. PEP 621** — `[project].name` і `[project].version` мають бути непорожніми рядками.
12
+
13
+ Канонічний цільовий вигляд: [pyproject.toml.snippet.toml](./template/pyproject.toml.snippet.toml)
@@ -0,0 +1,31 @@
1
+ ## Лінт Rego-файлів (opa / regal / conftest)
2
+
3
+ ```bash
4
+ n-cursor lint rego
5
+ ```
6
+
7
+ Цілі — `npm/rules/` (рекурсивно знаходить `.rego` у `<rule>/policy/<concern>/`).
8
+ Інші `*.rego` поза деревом — додай у `LINT_TARGETS` у `npm/rules/rego/lint/lint.mjs`.
9
+
10
+ `opa` і `regal` — лише у `PATH`, **не** додавай у `dependencies` / `devDependencies`.
11
+
12
+ ### Кроки лінту
13
+
14
+ 1. **`opa check --strict`** — компіляція з типами і строгим режимом: ловить мертвий код,
15
+ неоднозначні правила, незадекларовані змінні. Зупиняє пайплайн при помилці.
16
+ 2. **`regal lint`** — статичний лінтер: v0-синтаксис, неявні set-rules, відхилення від `rego.v1`,
17
+ bugs/idiomatic/performance-правила.
18
+ 3. **`conftest verify`** (опційно) — виконує `test_*` правила у `*_test.rego`.
19
+ Якщо `conftest` відсутній у `PATH` — пропускається без помилки (у CI потрібно встановити).
20
+
21
+ ### Конфіг regal
22
+
23
+ У корені проєкту — `.regal/config.yaml`. Дозволено вимикати окремі правила під специфіку репо
24
+ (наприклад, conftest-полісі — `deny`-правила як де-факто entrypoint-и):
25
+
26
+ ```yaml title=".regal/config.yaml"
27
+ rules:
28
+ idiomatic:
29
+ no-defined-entrypoint:
30
+ level: ignore
31
+ ```
@@ -0,0 +1,11 @@
1
+ ## Розширення VS Code для Rego
2
+
3
+ `.vscode/extensions.json` має містити `tsandall.opa` у масиві `recommendations` —
4
+ це забезпечує LSP-підтримку та форматування через `opa fmt` при збереженні.
5
+
6
+ Канонічний сніпет: [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
7
+
8
+ Перевірка — subset-of: кожне розширення зі сніпету має бути присутнє у `recommendations`.
9
+ Додаткові розширення (від інших правил) — дозволені.
10
+
11
+ Ціль (`target.json`): `.vscode/extensions.json` — обовʼязковий файл.
@@ -0,0 +1,13 @@
1
+ ## Налаштування VS Code для Rego
2
+
3
+ `.vscode/settings.json` має містити `[rego]`-блок з двома ключами:
4
+
5
+ - `editor.defaultFormatter` = `"tsandall.opa"`
6
+ - `editor.formatOnSave` = `true`
7
+
8
+ Канонічний сніпет: [settings.json.snippet.json](./policy/vscode_settings/template/settings.json.snippet.json)
9
+
10
+ Перевірка — leaf-by-leaf: кожен ключ/значення зі сніпету звіряється з файлом.
11
+ Якщо `[rego]`-блок присутній, але не є обʼєктом — окрема помилка типу.
12
+
13
+ Ціль (`target.json`): `.vscode/settings.json` — обовʼязковий файл.
@@ -9,31 +9,19 @@ alwaysApply: false
9
9
 
10
10
  Синтаксичні правила (`rego.v1`, `import rego.v1`, заборона legacy v0) — у `conftest.mdc` (alwaysApply). Цей файл — про **інструментарій**: VS Code, лінтери, форматування.
11
11
 
12
- ## Перевірка
12
+ [rego-rego-lint](./js/rego-lint.mdc)
13
13
 
14
- ```bash
15
- n-cursor lint rego
16
- ```
14
+ ## Швидкий gate через conftest
17
15
 
18
- Цілі `npm/rules/` (рекурсивно знаходить `.rego` у `<rule>/policy/<concern>/`). Інші *.rego поза деревом додай у `LINT_TARGETS` у `npm/rules/rego/lint/lint.mjs`.
16
+ | Пакет | Ціль | Що перевіряє |
17
+ |---|---|---|
18
+ | `rego.vscode_extensions` | `.vscode/extensions.json` | `recommendations` містить `tsandall.opa` |
19
+ | `rego.vscode_settings` | `.vscode/settings.json` | `[rego]`-блок з `defaultFormatter` + `formatOnSave` |
19
20
 
20
- `opa` і `regal` — лише у `PATH`, **не** додавай у `dependencies` / `devDependencies`.
21
+ [rego-vscode_extensions](./js/vscode_extensions.mdc)
21
22
 
22
- ### `.vscode/extensions.json`
23
+ [rego-vscode_settings](./js/vscode_settings.mdc)
23
24
 
24
- - Канон `recommendations` має містити `tsandall.opa` (LSP, format-on-save через `opa fmt`): [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
25
+ [rego-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
25
26
 
26
- ### `.vscode/settings.json`
27
-
28
- - Канон `[rego]`-block (`editor.defaultFormatter` + `editor.formatOnSave`): [settings.json.snippet.json](./policy/vscode_settings/template/settings.json.snippet.json)
29
-
30
- ## Конфіг regal
31
-
32
- У корені — `.regal/config.yaml`. Дозволено вимикати окремі правила під специфіку репо (наприклад, conftest-полісі — `deny`-правила як де-факто entrypoint-и):
33
-
34
- ```yaml title=".regal/config.yaml"
35
- rules:
36
- idiomatic:
37
- no-defined-entrypoint:
38
- level: ignore
39
- ```
27
+ [rego-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -0,0 +1,11 @@
1
+ ## Rego-перевірка наявності tsandall.opa у recommendations
2
+
3
+ Rego-пакет: `rego.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Перевіряє: поле `recommendations` містить рядок `"tsandall.opa"`. Порожній масив або відсутнє поле — deny. Додаткові записи дозволені.
8
+
9
+ Канонічний сніпет: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
10
+
11
+ Логіка: subset-of — кожна рекомендація зі сніпету має бути присутня у `recommendations` вхідного файлу. Канон надходить через `--data` як `data.template.snippet`.
@@ -0,0 +1,19 @@
1
+ ## Rego-gate: налаштування форматера rego у `.vscode/settings.json`
2
+
3
+ Rego-пакет: `rego.vscode_settings`
4
+
5
+ Цільовий файл: `.vscode/settings.json`
6
+
7
+ Перевіряє `[rego]`-блок — два листові ключі:
8
+
9
+ - `editor.defaultFormatter` має дорівнювати `"tsandall.opa"`
10
+ - `editor.formatOnSave` має бути `true`
11
+
12
+ Канонічний сніпет: [settings.json.snippet.json](./template/settings.json.snippet.json)
13
+
14
+ Два незалежні deny-правила:
15
+
16
+ 1. Leaf-by-leaf: якщо `[rego]`-блок є обʼєктом — кожне ключ/значення зі сніпету звіряється з фактичним значенням (відсутнє або відмінне — deny).
17
+ 2. Тип: якщо `[rego]`-блок присутній, але не є обʼєктом (наприклад, рядок) — окрема помилка типу.
18
+
19
+ Канон надходить через `--data` як `data.template.snippet`.
@@ -0,0 +1,28 @@
1
+ ## Покриття + мутаційне тестування Rust
2
+
3
+ Покриття + мутаційне тестування Rust постачаються через `n-cursor coverage` (правило `test.mdc`). Реалізація провайдера — у `npm/rules/rust/coverage/coverage.mjs`: `cargo llvm-cov --json --summary-only` + `cargo mutants --jobs N`.
4
+
5
+ Бінарники: `cargo install cargo-llvm-cov && cargo install cargo-mutants`.
6
+
7
+ ### Паралелізм cargo-mutants
8
+
9
+ Паралельні воркери: дефолт `min(4, cpus/2)`; override через env **`CARGO_MUTANTS_JOBS`**. Прапорець `--in-place` відсутній — cargo-mutants створює власну sandbox-копію в `target/mutants.<i>/`, що сумісне з `--jobs > 1`.
10
+
11
+ ### Incremental mutation через `--in-diff`
12
+
13
+ cargo-mutants **не** має persistent-кешу вердиктів між прогонами (на відміну від Stryker `incremental.json`). Штатний аналог «не передивляйся незмінений код» — scoping за git-diff. Вмикається env-змінною **`CARGO_MUTANTS_BASE_REF`**:
14
+
15
+ - **не задано** (дефолт, типово для `main`) — повний прогін усіх мутантів;
16
+ - задано (напр. `origin/main`, типово для feature-гілки в CI) — мутуються лише рядки, змінені у `<baseRef>...HEAD`. Провайдер бере `git diff --relative <baseRef>...HEAD` з каталогу crate, пише diff у sandbox і передає cargo-mutants `--in-diff`.
17
+
18
+ Краєві випадки: порожній diff (немає змін під crate) → mutation `0/0` без запуску cargo-mutants; невідомий ref / не git-репо → попередження у stderr і fallback до повного прогону.
19
+
20
+ ### Пропуск baseline через `CARGO_MUTANTS_BASELINE=skip`
21
+
22
+ cargo-mutants спершу ганяє немутований baseline (повний build+test), щоб переконатися, що suite зелений. **`CARGO_MUTANTS_BASELINE=skip`** прибирає цей крок (`--baseline skip`), економлячи один повний `cargo test`.
23
+
24
+ Безпечно **лише** коли тести вже зелені у попередньому CI-степі (типовий порядок: `cargo test` → потім `n-cursor coverage` зі `skip`). Без цієї гарантії всі вердикти стають сміттєвими — дефолт: baseline-прогін. Найкорисніше в парі з `--in-diff`.
25
+
26
+ ### CI-кеш `target/` — множник
27
+
28
+ `--in-diff` ріже **кількість** мутантів, кеш `target/` — **вартість кожної** компіляції; вони множаться. Без кешу холодний CI щоразу перебудовує всі залежності, і baseline-build (для Tauri — хвилини) затьмарює економію від меншої кількості мутантів. У workflow, що викликає `n-cursor coverage` для Rust, став `Swatinem/rust-cache@v2` після `dtolnay/rust-toolchain@stable`.
@@ -0,0 +1,22 @@
1
+ ## Лінт Rust: rustfmt + clippy
2
+
3
+ **rustfmt** ([rust-lang/rustfmt](https://github.com/rust-lang/rustfmt)) — форматер; **clippy** ([rust-lang/rust-clippy](https://github.com/rust-lang/rust-clippy)) — лінтер. Запуск — через **`n-cursor lint rust`** (адаптер `main.mjs`):
4
+
5
+ - **локально (fix):** `cargo fmt --all` → `cargo clippy --fix --allow-staged --allow-dirty --all-targets --all-features` → фінальний `cargo clippy --all-targets --all-features -- -D warnings`
6
+ - **`--read-only` (детект, CI):** `cargo fmt --all -- --check` + `cargo clippy --all-targets --all-features -- -D warnings`
7
+
8
+ Без `Cargo.toml` у cwd — no-op (exit 0). Окремого `package.json`-скрипта немає.
9
+
10
+ `cargo`, `rustfmt`, `clippy` **не додавай** у `devDependencies` — це Rust toolchain, ставиться через `rustup` локально або через `dtolnay/rust-toolchain@stable` у CI.
11
+
12
+ ### Канон CI workflow `.github/workflows/lint-rust.yml`
13
+
14
+ [lint-rust.yml.snippet.yml](./policy/lint_rust_yml/template/lint-rust.yml.snippet.yml)
15
+
16
+ Після `actions/checkout@v6` — `dtolnay/rust-toolchain@stable` (з `components: rustfmt, clippy`) + `Swatinem/rust-cache@v2` для кешу `~/.cargo` і `target/`. Bun composite дії тут не потрібен — toolchain ставиться напряму.
17
+
18
+ **Перед** `actions/checkout@v6` у інших workflows йде стандартна послідовність (див. **ga.mdc**). У `lint-rust.yml` bun-composite не потрібен.
19
+
20
+ Rego-перевірка `rust.lint_rust_yml` верифікує:
21
+ - наявність кожного `uses` з канону (`actions/checkout@v6`, `dtolnay/rust-toolchain@stable`, `Swatinem/rust-cache@v2`);
22
+ - наявність кожного `run`-кроку з канону як підрядка серед run-кроків input-файлу.
@@ -0,0 +1,8 @@
1
+ ## Композиція з Tauri
2
+
3
+ Tauri-проєкт завжди має `src-tauri/Cargo.toml`, тому правило `rust` активується автоматично разом з `tauri`. Поділ обов'язків:
4
+
5
+ - `rust` — лінт через `n-cursor lint rust`, `rust-analyzer`, `even-better-toml`, CI workflow.
6
+ - `tauri` — `tauri-apps.tauri-vscode` (див. **tauri.mdc**).
7
+
8
+ Обидва правила перевіряють `.vscode/extensions.json` за `contains`-семантикою; конкурентного запису немає.
@@ -0,0 +1,12 @@
1
+ ## Розширення VS Code для Rust
2
+
3
+ У `.vscode/extensions.json` поле `recommendations` **має містити**:
4
+
5
+ - `rust-lang.rust-analyzer`
6
+ - `tamasfe.even-better-toml`
7
+
8
+ Перевірка `contains`-семантики: інші розширення дозволені, усі з канону мають бути присутні.
9
+
10
+ Канон: [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
11
+
12
+ Rego-перевірка `rust.vscode_extensions` для кожного запису з канону перевіряє його наявність у `recommendations` вхідного файлу.
@@ -5,44 +5,14 @@ alwaysApply: false
5
5
  version: '1.4'
6
6
  ---
7
7
 
8
- **rustfmt** ([rust-lang/rustfmt](https://github.com/rust-lang/rustfmt)) форматер; **clippy** ([rust-lang/rust-clippy](https://github.com/rust-lang/rust-clippy)) лінтер. Запуск — через **`n-cursor lint rust`** (адаптер `js/lint.mjs`): локально (fix) `cargo fmt --all` → `cargo clippy --fix --allow-staged --allow-dirty --all-targets --all-features` → фінальний `cargo clippy --all-targets --all-features -- -D warnings`; у `--read-only` (детект) — `cargo fmt --all -- --check` + `cargo clippy ... -- -D warnings`. Окремого `package.json`-скрипта немає. У CI cargo викликається напряму (див. `lint-rust.yml`).
8
+ Правило забезпечує форматування (rustfmt), лінт (clippy), CI workflow та покриття для Rust-проєктів.
9
9
 
10
- `cargo`, `rustfmt`, `clippy` не додавай у `devDependencies` — це Rust toolchain, ставиться через `rustup` локально або через `dtolnay/rust-toolchain@stable` у CI.
10
+ [rust-lint](./js/lint.mdc)
11
+ [rust-vscode_extensions](./js/vscode_extensions.mdc)
12
+ [rust-tauri_composition](./js/tauri_composition.mdc)
13
+ [rust-coverage](./js/coverage.mdc)
11
14
 
12
- У `.vscode/extensions.json` `recommendations` мають містити `rust-lang.rust-analyzer` і `tamasfe.even-better-toml`: [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
15
+ ## Швидкий gate через conftest
13
16
 
14
- Канон workflow `.github/workflows/lint-rust.yml`: [lint-rust.yml.snippet.yml](./policy/lint_rust_yml/template/lint-rust.yml.snippet.yml)
15
-
16
- Перед **`./.github/actions/setup-bun-deps`** в інших workflows йде **`actions/checkout@v6`** (див. **ga.mdc**). У **lint-rust.yml** після checkout — `dtolnay/rust-toolchain@stable` (з `components: rustfmt, clippy`) + `Swatinem/rust-cache@v2` для кешу `~/.cargo` і `target/`. Bun composite дії тут не потрібен — toolchain ставиться напряму.
17
-
18
- ## Композиція з Tauri
19
-
20
- Tauri-проєкт завжди має `src-tauri/Cargo.toml`, тому правило `rust` активується автоматично разом з `tauri`. Поділ обов'язків:
21
-
22
- - `rust` — лінт через `n-cursor lint rust`, `rust-analyzer`, `even-better-toml`, CI workflow.
23
- - `tauri` — `tauri-apps.tauri-vscode` (див. **tauri.mdc**).
24
-
25
- Обидва правила перевіряють `.vscode/extensions.json` за `contains`-семантикою; конкурентного запису немає.
26
-
27
- ## Покриття + мутаційне тестування Rust
28
-
29
- Покриття + мутаційне тестування Rust постачаються через `n-cursor coverage` (правило `test.mdc`). Реалізація провайдера — у `npm/rules/rust/coverage/coverage.mjs`: `cargo llvm-cov --json --summary-only` + `cargo mutants --jobs N` (паралельні воркери, дефолт `min(4, cpus/2)`; override через env `CARGO_MUTANTS_JOBS`). Прапорець `--in-place` прибраний — cargo-mutants створює власну sandbox-копію в `target/mutants.<i>/`, що сумісне з `--jobs > 1`. Бінарники: `cargo install cargo-llvm-cov && cargo install cargo-mutants`.
30
-
31
- ### Incremental mutation через `--in-diff`
32
-
33
- cargo-mutants **не** має persistent-кешу вердиктів між прогонами (на відміну від Stryker `incremental.json`). Штатний аналог «не передивляйся незмінений код» — scoping за git-diff. Вмикається env-змінною **`CARGO_MUTANTS_BASE_REF`**:
34
-
35
- - **не задано** (дефолт, типово для `main`) — повний прогін усіх мутантів;
36
- - задано (напр. `origin/main`, типово для feature-гілки в CI) — мутуються лише рядки, змінені у `<baseRef>...HEAD`. Провайдер бере `git diff --relative <baseRef>...HEAD` з каталогу crate (шляхи в diff збігаються з тим, що мутує cargo-mutants навіть у monorepo з `src-tauri/`), пише його у sandbox і передає cargo-mutants `--in-diff`.
37
-
38
- Краєві випадки: порожній diff (немає змін під crate) → mutation `0/0` без запуску cargo-mutants; невідомий ref / не git-репо → попередження у stderr і fallback до повного прогону.
39
-
40
- ### Пропуск baseline через `CARGO_MUTANTS_BASELINE=skip`
41
-
42
- cargo-mutants спершу ганяє немутований baseline (повний build+test), щоб переконатися, що suite зелений. Це **фіксована** вартість, незалежна від кількості мутантів — а отже більша частка дрібного `--in-diff`-прогону. **`CARGO_MUTANTS_BASELINE=skip`** прибирає цей крок (cargo-mutants `--baseline skip`), економлячи один повний `cargo test`.
43
-
44
- Безпечно **лише** коли тести вже зелені у попередньому CI-степі (типовий порядок: `cargo test` → потім `n-cursor coverage` зі `skip`). Без цієї гарантії всі вердикти стають сміттєвими, тому дефолт — baseline-прогін. Найкорисніше в парі з `--in-diff`.
45
-
46
- ### CI-кеш `target/` — множник, без якого scoping невидимий
47
-
48
- `--in-diff` ріже **кількість** мутантів, кеш `target/` — **вартість кожної** компіляції; вони множаться. Без кешу холодний CI щоразу перебудовує всі залежності, і baseline-build (для Tauri — хвилини) затьмарює економію від меншої кількості мутантів. У workflow, що викликає `n-cursor coverage` для Rust, став `Swatinem/rust-cache@v2` (кеш `~/.cargo` + `target/`) після `dtolnay/rust-toolchain@stable` — так само, як у `lint-rust.yml`. Sandbox-копії `target/mutants.<i>/` самі не кешуються, але деривуються з кешованих залежностей.
17
+ [rust-lint_rust_yml](./policy/lint_rust_yml/lint_rust_yml.mdc)
18
+ [rust-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
@@ -0,0 +1,12 @@
1
+ ## Перевірка `.github/workflows/lint-rust.yml`
2
+
3
+ Rego-пакет: `rust.lint_rust_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-rust.yml`
6
+
7
+ Перевіряє:
8
+ - кожен `uses`-крок з канону присутній у workflow (підмножина): `actions/checkout@v6`, `dtolnay/rust-toolchain@stable`, `Swatinem/rust-cache@v2`
9
+ - кожен `run`-крок з канону присутній як підрядок серед усіх `run`-кроків: `cargo fmt --all -- --check`, `cargo clippy --all-targets --all-features -- -D warnings`
10
+ - канон завантажується через `--data` з template-сніпету — drift-safe: зміна шаблону автоматично рухає перевірку
11
+
12
+ Канонічний template: [lint-rust.yml.snippet.yml](./template/lint-rust.yml.snippet.yml)
@@ -0,0 +1,9 @@
1
+ ## Перевірка `.vscode/extensions.json` (Rego-gate)
2
+
3
+ Rego-пакет: `rust.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Семантика `contains`: кожен запис з канону має бути присутнім у `recommendations` — додаткові розширення дозволені. Канон завантажується через `--data` з template-сніпету.
8
+
9
+ Канонічний template: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
@@ -0,0 +1,15 @@
1
+ ## Rego-полісі: `package.json` і CI workflow
2
+
3
+ ### `security.package_json` — заборона `trufflehog` у залежностях
4
+
5
+ Перевіряє, що `trufflehog` не потрапив у `dependencies` або `devDependencies` — він є глобальним CLI і не повинен бути npm-залежністю.
6
+
7
+ - Канон deny-списку: [package.json.deny.json](../policy/package_json/template/package.json.deny.json)
8
+
9
+ ### `security.lint_security_yml` — CI workflow з TruffleHog
10
+
11
+ Workflow `.github/workflows/lint-security.yml` обовʼязковий — забезпечує незалежний скан секретів на push/PR (агрегований `lint` локально + окремий fail-fast job на CI).
12
+
13
+ Перевіряється, що серед `uses:` є крок з `trufflesecurity/trufflehog@main`. Універсальні workflow-перевірки (checkout, permissions, persist-credentials) — у `ga.workflow_common`. Для повного скану історії потрібен `fetch-depth: 0`.
14
+
15
+ - Канон workflow: [lint-security.yml.snippet.yml](../policy/lint_security_yml/template/lint-security.yml.snippet.yml)
@@ -0,0 +1,19 @@
1
+ ## Placeholder для секретів — `sample-secret`
2
+
3
+ Фейкові credential-значення у **прикладних файлах** (`.env.example`, `.env.dist`, `*.example`, `*.sample`, `*.template`, вміст каталогів `fixtures/`) пиши як `sample-secret`, а не як bare `secret`.
4
+
5
+ `sample-secret` містить підрядок `sample` із вшитого списку `DefaultFalsePositives` TruffleHog — таке значення сканер відсіює **гарантовано** й незалежно від версії. Bare `secret` наразі не фіксується сканером лише тому, що випадково присутнє у словнику `fp_words.txt`; це крихка поведінка, що залежить від версії інструмента.
6
+
7
+ ### Приклади
8
+
9
+ - Правильно: `DB_PASSWORD=sample-secret`, `password: "sample-secret"`
10
+ - Неправильно: `DB_PASSWORD=secret`, `password: "secret"`
11
+
12
+ ### Що перевіряється
13
+
14
+ Перевіряється лише `secret` у позиції значення (після `=`, `:`, `=>`); імена ключів на кшталт `client_secret` не чіпаються.
15
+
16
+ Concern `security.sample_secret` (`js/sample_secret.mjs`) сканує всі прикладні файли:
17
+ - суфікс basename'а: `.example`, `.sample`, `.template`, `.dist`
18
+ - інфікс у basename'і: `.example.`, `.sample.`, `.template.`
19
+ - сегмент шляху: `fixtures/`, `fixture/`, `__fixtures__/`
@@ -0,0 +1,21 @@
1
+ ## TruffleHog — налаштування та `.trufflehog-exclude`
2
+
3
+ [TruffleHog](https://github.com/trufflesecurity/trufflehog) — глобальний CLI (як `shellcheck`, `conftest`); **не** додавай до `dependencies`/`devDependencies`.
4
+
5
+ Скан запускається через `n-cursor lint security` (CI — `n-cursor lint security --read-only`); окремого `lint-*` скрипта в `package.json` немає.
6
+
7
+ ### Ключові прапори запуску
8
+
9
+ - `trufflehog filesystem .` — сканує робоче дерево як директорію (включно з untracked/gitignored файлами); підкоманда `git file://.` лишається на CI для аудиту історії.
10
+ - `--no-update` — вимикає self-update check (CI-friendly).
11
+ - `--exclude-paths .trufflehog-exclude` — файл з regex-patterns, які треба пропускати (аналог `[allowlist].paths` із gitleaks).
12
+ - `--results=verified,unknown` — показує лише верифіковані секрети + ті, що TruffleHog не зміг перевірити (`unverified` дублікат відсіюється).
13
+ - `--fail` — exit-code `183` за наявності знахідок (щоб лінт падав).
14
+
15
+ ### `.trufflehog-exclude` (рекомендована основа)
16
+
17
+ Канон (допускає розширення): [.trufflehog-exclude.snippet.txt](./templates/trufflehog/.trufflehog-exclude.snippet.txt)
18
+
19
+ **Важливо:** один regex-pattern на рядок, без TOML-обгортки; коментарі починаються з `#`.
20
+
21
+ Перевірка (JS): `js/trufflehog.mjs` — впевнюється, що файл `.trufflehog-exclude` існує в корені й містить канонічні шаблони.
@@ -5,46 +5,19 @@ alwaysApply: false
5
5
  version: '2.1'
6
6
  ---
7
7
 
8
- [TruffleHog](https://github.com/trufflesecurity/trufflehog) глобальний CLI (як `shellcheck`, `conftest`); **не** додавай до `dependencies`/`devDependencies`.
8
+ Правило **security** забезпечує сканування секретів через [TruffleHog](https://github.com/trufflesecurity/trufflehog) локально та на CI, а також правильне використання placeholder-значень у прикладних файлах.
9
9
 
10
- ## Канон `package.json`
10
+ [security-trufflehog](./js/trufflehog.mdc)
11
11
 
12
- Скан запускається через `n-cursor lint security` (CI — `n-cursor lint security --read-only`); окремого `lint-*` скрипта в `package.json` немає.
12
+ [security-sample-secret](./js/sample_secret.mdc)
13
13
 
14
- - Заборонено `trufflehog` у `dependencies`/`devDependencies`: [package.json.deny.json](./policy/package_json/template/package.json.deny.json)
14
+ [security-rego-policies](./js/rego_policies.mdc)
15
15
 
16
- **Зауваження:**
16
+ ## Швидкий gate через conftest
17
17
 
18
- - `trufflehog filesystem .` — сканує робоче дерево як директорію (включно з untracked/gitignored файлами); підкоманда `git file://.` лишається на CI для аудиту історії.
19
- - `--no-update` — вимикає self-update check (CI-friendly).
20
- - `--exclude-paths .trufflehog-exclude` — файл з regex-patterns, які треба пропускати (аналог `[allowlist].paths` із gitleaks).
21
- - `--results=verified,unknown` — показує лише верифіковані секрети + ті, що TruffleHog не зміг перевірити (`unverified` дублікат відсіюється).
22
- - `--fail` — exit-code `183` за наявності знахідок (щоб лінт падав).
18
+ [security-package-json](./policy/package_json/package_json.mdc)
23
19
 
24
- ## `.trufflehog-exclude` (рекомендована основа)
25
-
26
- Канон (допускає розширення): [.trufflehog-exclude.snippet.txt](./js/templates/trufflehog/.trufflehog-exclude.snippet.txt)
27
-
28
- **Важливо:** один regex-pattern на рядок, без TOML-обгортки; коментарі починаються з `#`.
29
-
30
- ## CI: `.github/workflows/lint-security.yml`
31
-
32
- Workflow обовʼязковий — забезпечує незалежний скан секретів на push/PR (агрегований `lint` локально + окремий fail-fast job на CI).
33
-
34
- - Канон: [lint-security.yml.snippet.yml](./policy/lint_security_yml/template/lint-security.yml.snippet.yml)
35
-
36
- Перевіряється policy `security.lint_security_yml`: серед `uses:` має бути крок з `trufflesecurity/trufflehog@main`. Універсальні workflow-перевірки (checkout, permissions, persist-credentials) — у `ga.workflow_common`. Для повного скану історії потрібен `fetch-depth: 0`.
37
-
38
- ## Placeholder для секретів — `sample-secret`
39
-
40
- Фейкові credential-значення у **прикладних файлах** (`.env.example`, `.env.dist`, `*.example`, `*.sample`, `*.template`, вміст каталогів `fixtures/`) пиши як `sample-secret`, а не як bare `secret`.
41
-
42
- `sample-secret` містить підрядок `sample` із вшитого списку `DefaultFalsePositives` TruffleHog — таке значення сканер відсіює **гарантовано** й незалежно від версії. Bare `secret` наразі не фіксується сканером лише тому, що випадково присутнє у словнику `fp_words.txt`; це крихка поведінка, що залежить від версії інструмента.
43
-
44
- - Правильно: `DB_PASSWORD=sample-secret`, `password: "sample-secret"`
45
- - Неправильно: `DB_PASSWORD=secret`, `password: "secret"`
46
-
47
- Перевіряється лише `secret` у позиції значення (після `=`, `:`, `=>`); імена ключів на кшталт `client_secret` не чіпаються. Concern `security.sample_secret` — деталі скану в `js/sample_secret.mjs`.
20
+ [security-lint-security-yml](./policy/lint_security_yml/lint_security_yml.mdc)
48
21
 
49
22
  ## Перевірка
50
23
 
@@ -0,0 +1,7 @@
1
+ ## Наявність кроку TruffleHog у CI workflow
2
+
3
+ Rego-пакет: `security.lint_security_yml`
4
+
5
+ Цільові файли: `.github/workflows/lint-security.yml`
6
+
7
+ Перевіряє, що серед `uses:` у workflow присутній крок `trufflesecurity/trufflehog@main`. Очікуваний перелік action-refs (не-`actions/*`) береться з `--data` через [lint-security.yml.snippet.yml](./template/lint-security.yml.snippet.yml). Універсальні кроки (`actions/*`) перевіряє `ga.workflow_common`.
@@ -0,0 +1,7 @@
1
+ ## Заборона `trufflehog` у залежностях `package.json`
2
+
3
+ Rego-пакет: `security.package_json`
4
+
5
+ Цільові файли: `package.json`
6
+
7
+ Перевіряє, що пакет `trufflehog` відсутній у `dependencies` та `devDependencies` — він є глобальним CLI і не має бути npm-залежністю. Список заборонених пакетів надходить через `--data` з [package.json.deny.json](./template/package.json.deny.json).
@@ -0,0 +1,88 @@
1
+ ## Адмінські таблиці — n-admin-table
2
+
3
+ Для таблиць, що мають займати всю висоту сторінки (або блоку), додавай клас `n-admin-table` і атрибути `hide-no-data`, `dense`, `flat`. Таблиця автоматично розтягнеться на весь доступний простір. У блоках меншої висоти — задай їм явний `height`.
4
+
5
+ ```vue
6
+ <!-- ТАБЛИЦЯ -->
7
+ <q-table class="n-admin-table" hide-no-data flat dense />
8
+ ```
9
+
10
+ Якщо клас `.n-admin-table` не визначено в `app.scss` — додай:
11
+
12
+ ```scss
13
+ // ADMIN TABLE
14
+ .n-admin-table {
15
+ height: calc(100vh - 106px);
16
+
17
+ thead {
18
+ position: sticky;
19
+ z-index: 3;
20
+ top: 0;
21
+
22
+ tr th {
23
+ background-color: $grey-3;
24
+ height: 36px !important;
25
+ }
26
+ }
27
+
28
+ // tbody td {
29
+ // font-size: 14px;
30
+ // }
31
+
32
+ tbody tr:last-child td {
33
+ border-bottom: 1px solid rgb(0 0 0 / 12%) !important;
34
+ }
35
+
36
+ th:first-child,
37
+ td:first-child,
38
+ th:last-child,
39
+ td:last-child {
40
+ width: 1px;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .q-table__bottom {
45
+ background-color: $grey-3;
46
+ }
47
+
48
+ .q-table__progress th {
49
+ height: 1px !important;
50
+ }
51
+
52
+ .text-wrap {
53
+ max-width: 250px;
54
+ white-space: normal;
55
+ }
56
+
57
+ // sticky columns
58
+ td.sticky-left {
59
+ position: sticky;
60
+ left: 0;
61
+ z-index: 2;
62
+ background-color: white;
63
+ box-shadow: 2px 0 5px #0002;
64
+ }
65
+
66
+ td.sticky-right {
67
+ position: sticky;
68
+ right: 0;
69
+ z-index: 2;
70
+ background-color: white;
71
+ box-shadow: -2px 0 5px #0002;
72
+ }
73
+
74
+ th.sticky-left {
75
+ position: sticky;
76
+ left: 0;
77
+ z-index: 3;
78
+ box-shadow: 2px 0 5px #0002;
79
+ }
80
+
81
+ th.sticky-right {
82
+ position: sticky;
83
+ right: 0;
84
+ z-index: 3;
85
+ box-shadow: -2px 0 5px #0002;
86
+ }
87
+ }
88
+ ```
@@ -0,0 +1,21 @@
1
+ ## Кольори: quasar-variables.scss і app.scss
2
+
3
+ Основні кольори визначай виключно через стандартні Quasar-змінні: `$primary`, `$secondary`, `$accent`, `$positive`, `$negative`, `$warning`.
4
+
5
+ Якщо потрібен додатковий колір — визнач його в `quasar-variables.scss`, і **обов'язково** додай до `app.scss` відповідні `.text-*` / `.bg-*` класи:
6
+
7
+ ```scss
8
+ /* quasar-variables.scss */
9
+ $white-a1: color.adjust(white, $alpha: -0.85);
10
+ ```
11
+
12
+ ```scss
13
+ /* app.scss */
14
+ .text-white-a1 {
15
+ color: $white-a1 !important;
16
+ }
17
+
18
+ .bg-white-a1 {
19
+ background-color: $white-a1 !important;
20
+ }
21
+ ```