@nitra/cursor 1.8.138 → 1.8.139

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/mdc/abie.mdc CHANGED
@@ -222,7 +222,7 @@ patches:
222
222
  path: /spec/template/spec/containers/-
223
223
  value:
224
224
  name: СЕРВІС-p
225
- image: nginx:alpine
225
+ image: nginx:alpine-slim
226
226
  ports:
227
227
  - containerPort: 8081
228
228
  protocol: TCP
package/mdc/docker.mdc CHANGED
@@ -21,6 +21,10 @@ alwaysApply: false
21
21
 
22
22
  Це стримує зайвий build tooling (Bun, **node_modules** зі збірки) у фінальному образі; для **alpine** / **nginx** / **openresty** у **runtime** лишаються лише відповідні вимоги, для **php** / **python** (виняток) — цільовий інтерпретований **stack**; **scratch** і **debian** з тегом **`*slim*`** — коли glibc і мінімальне оточення Debian важливіші за musl в **alpine**.
23
23
 
24
+ ## Мінімальні образи
25
+
26
+ Якщо використовується nginx, то намагайся щоб тег був `alpine-slim`
27
+
24
28
  ## компіляція
25
29
 
26
30
  Якщо проект має bun install крок, та не є фронтенд проектом (тобто не має bun build крок), то потрібно щоб була компіляція коду, і далі у фінальному образі був тільки бінарник і Цей образ не містив компілятора, npm, Bun — тільки runtime libs. Наприклад:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.138",
3
+ "version": "1.8.139",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -18,6 +18,9 @@
18
18
  * Мета — щоб у фінальному образі не було build tooling (Bun/Node та залежностей), а лише
19
19
  * дозволений runtime (alpine, scratch, debian slim, за потреби php/python, nginx або openresty).
20
20
  *
21
+ * Для `mirror.gcr.io/library/nginx` у будь-якому `FROM` очікується тег `alpine-slim` (docker.mdc:
22
+ * мінімальні образи), не `latest` / `alpine` / інші.
23
+ *
21
24
  * Знаходить Dockerfile, Dockerfile.*, Containerfile, Containerfile.*; пропускає node_modules, .git
22
25
  * тощо. Спочатку hadolint з PATH, інакше docker run з образом hadolint/hadolint.
23
26
  * Кореневий .hadolint.yaml підхоплюється hadolint автоматично.
@@ -36,6 +39,8 @@ const BUN_BUILD_COMPILE_RE = /\bbun\s+build\b[^\n]*\s--compile\b/iu
36
39
  const BUN_WORD_RE = /\bbun\b/iu
37
40
  const USER_LINE_RE = /^\s*USER\s+([^\s#]+)/iu
38
41
 
42
+ const NGINX_MIRROR_PREFIX = 'mirror.gcr.io/library/nginx'
43
+
39
44
  /**
40
45
  * @typedef {{
41
46
  * line: number
@@ -203,6 +208,30 @@ export function getBunCompileHint(fileContent) {
203
208
  return null
204
209
  }
205
210
 
211
+ /**
212
+ * Перевіряє, що для `mirror.gcr.io/library/nginx` у `FROM` вказано тег `alpine-slim` (docker.mdc).
213
+ *
214
+ * @param {string} fileContent вміст Dockerfile/Containerfile
215
+ * @returns {string | null} повідомлення помилки або null
216
+ */
217
+ export function getNginxAlpineSlimTagHint(fileContent) {
218
+ for (const { line, image } of parseFromStages(fileContent)) {
219
+ const noDigest = (image.split('@')[0] || '').trim()
220
+ const d = noDigest.toLowerCase()
221
+ if (!d.startsWith(`${NGINX_MIRROR_PREFIX}:`) && d !== NGINX_MIRROR_PREFIX) {
222
+ continue
223
+ }
224
+ if (d === NGINX_MIRROR_PREFIX) {
225
+ return `рядок ${line}: \`FROM mirror.gcr.io/library/nginx\` має явний тег \`alpine-slim\` (docker.mdc: мінімальні образи), зараз без тега (типово latest)`
226
+ }
227
+ const tag = noDigest.slice(NGINX_MIRROR_PREFIX.length + 1)
228
+ if (tag.toLowerCase() !== 'alpine-slim') {
229
+ return `рядок ${line}: для nginx потрібен тег \`alpine-slim\` (docker.mdc: мінімальні образи), зараз: \`${tag}\``
230
+ }
231
+ }
232
+ return null
233
+ }
234
+
206
235
  /**
207
236
  * Перевіряє вимогу "non-root" у фінальному runtime stage (docker.mdc).
208
237
  *
@@ -282,6 +311,11 @@ export async function check() {
282
311
  fail(`${rel} (non-root): ${nonRootHint}`)
283
312
  }
284
313
 
314
+ const nginxSlimHint = getNginxAlpineSlimTagHint(content)
315
+ if (nginxSlimHint) {
316
+ fail(`${rel} (nginx tag): ${nginxSlimHint}`)
317
+ }
318
+
285
319
  const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)
286
320
  const tail = (stdout + stderr).trim()
287
321
  if (ok) {