dsh-ci-diet 0.3.1 → 0.4.0

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 (139) hide show
  1. package/README.es.md +191 -0
  2. package/README.fr.md +191 -0
  3. package/README.hi.md +191 -0
  4. package/README.ko.md +113 -144
  5. package/README.md +110 -153
  6. package/README.zh-Hans.md +191 -0
  7. package/client/index.js +1291 -2
  8. package/cordis.patch.yml +3 -2
  9. package/dist/adapters/github/client.d.ts +1 -0
  10. package/dist/adapters/github/client.js +30 -19
  11. package/dist/adapters/github/client.js.map +1 -1
  12. package/dist/adapters/github/endpoints.js +1 -0
  13. package/dist/adapters/github/endpoints.js.map +1 -1
  14. package/dist/adapters/github/run-observation.d.ts +7 -0
  15. package/dist/adapters/github/run-observation.js +66 -0
  16. package/dist/adapters/github/run-observation.js.map +1 -0
  17. package/dist/adapters/github/transport.d.ts +2 -0
  18. package/dist/adapters/github/transport.js +30 -6
  19. package/dist/adapters/github/transport.js.map +1 -1
  20. package/dist/cli/compare.d.ts +4 -0
  21. package/dist/cli/compare.js +84 -0
  22. package/dist/cli/compare.js.map +1 -0
  23. package/dist/cli/index.js +17 -9
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/core/analysis/report-id.d.ts +3 -0
  26. package/dist/core/analysis/report-id.js +7 -0
  27. package/dist/core/analysis/report-id.js.map +1 -0
  28. package/dist/core/analysis/report.js +5 -6
  29. package/dist/core/analysis/report.js.map +1 -1
  30. package/dist/core/analysis/run-comparison.d.ts +50 -0
  31. package/dist/core/analysis/run-comparison.js +64 -0
  32. package/dist/core/analysis/run-comparison.js.map +1 -0
  33. package/dist/core/config/plugin-settings.d.ts +2 -0
  34. package/dist/core/config/plugin-settings.js +5 -1
  35. package/dist/core/config/plugin-settings.js.map +1 -1
  36. package/dist/core/contracts/schema-json.generated.d.ts +1 -1
  37. package/dist/core/contracts/schema-json.generated.js +1 -1
  38. package/dist/core/contracts/schema-json.generated.js.map +1 -1
  39. package/dist/core/contracts/schema.d.ts +7 -7
  40. package/dist/core/data/contracts.generated.d.ts +2 -2
  41. package/dist/core/data/contracts.generated.js +2 -2
  42. package/dist/core/data/contracts.generated.js.map +1 -1
  43. package/dist/core/history/model.d.ts +1 -1
  44. package/dist/core/history/model.js +20 -21
  45. package/dist/core/history/model.js.map +1 -1
  46. package/dist/core/history/storage.d.ts +17 -0
  47. package/dist/core/history/storage.js +81 -0
  48. package/dist/core/history/storage.js.map +1 -0
  49. package/dist/core/history/sync.js +67 -3
  50. package/dist/core/history/sync.js.map +1 -1
  51. package/dist/core/model/domain.d.ts +1 -1
  52. package/dist/core/model/domain.js +1 -1
  53. package/dist/core/model/domain.js.map +1 -1
  54. package/dist/core/patch/apply.js +77 -30
  55. package/dist/core/patch/apply.js.map +1 -1
  56. package/dist/core/patch/dependencies.js +218 -19
  57. package/dist/core/patch/dependencies.js.map +1 -1
  58. package/dist/core/patch/diff.js +9 -4
  59. package/dist/core/patch/diff.js.map +1 -1
  60. package/dist/core/patch/edits.d.ts +2 -0
  61. package/dist/core/patch/edits.js +44 -0
  62. package/dist/core/patch/edits.js.map +1 -1
  63. package/dist/core/patch/eligibility.d.ts +1 -1
  64. package/dist/core/patch/eligibility.js +2 -1
  65. package/dist/core/patch/eligibility.js.map +1 -1
  66. package/dist/core/patch/locks.d.ts +6 -0
  67. package/dist/core/patch/locks.js +25 -4
  68. package/dist/core/patch/locks.js.map +1 -1
  69. package/dist/core/patch/request-plan.js +29 -18
  70. package/dist/core/patch/request-plan.js.map +1 -1
  71. package/dist/core/patch/semantic.d.ts +1 -1
  72. package/dist/core/patch/semantic.js +53 -16
  73. package/dist/core/patch/semantic.js.map +1 -1
  74. package/dist/core/patch/store.d.ts +4 -4
  75. package/dist/core/patch/store.js +90 -56
  76. package/dist/core/patch/store.js.map +1 -1
  77. package/dist/core/patch/target.js +8 -0
  78. package/dist/core/patch/target.js.map +1 -1
  79. package/dist/core/patch/verify.js +12 -2
  80. package/dist/core/patch/verify.js.map +1 -1
  81. package/dist/core/report/run-comparison.d.ts +4 -0
  82. package/dist/core/report/run-comparison.js +28 -0
  83. package/dist/core/report/run-comparison.js.map +1 -0
  84. package/dist/core/rules/cd001.js +13 -0
  85. package/dist/core/rules/cd001.js.map +1 -1
  86. package/dist/core/rules/cd005.js +20 -3
  87. package/dist/core/rules/cd005.js.map +1 -1
  88. package/dist/core/rules/cd006.d.ts +3 -0
  89. package/dist/core/rules/cd006.js +31 -0
  90. package/dist/core/rules/cd006.js.map +1 -0
  91. package/dist/core/rules/index.js +3 -2
  92. package/dist/core/rules/index.js.map +1 -1
  93. package/dist/core/rules/npm-cache.d.ts +12 -0
  94. package/dist/core/rules/npm-cache.js +65 -0
  95. package/dist/core/rules/npm-cache.js.map +1 -0
  96. package/dist/core/rules/types.d.ts +1 -0
  97. package/dist/core/rules/types.js.map +1 -1
  98. package/dist/core/scan/discover.js +4 -2
  99. package/dist/core/scan/discover.js.map +1 -1
  100. package/dist/core/scan/scan.js +4 -7
  101. package/dist/core/scan/scan.js.map +1 -1
  102. package/dist/core/version.d.ts +1 -1
  103. package/dist/core/version.js +1 -1
  104. package/dist/core/workflow/byte-ranges.d.ts +5 -0
  105. package/dist/core/workflow/byte-ranges.js +34 -0
  106. package/dist/core/workflow/byte-ranges.js.map +1 -0
  107. package/dist/core/workflow/jobkey.js +14 -20
  108. package/dist/core/workflow/jobkey.js.map +1 -1
  109. package/dist/core/workflow/matrix.d.ts +1 -1
  110. package/dist/core/workflow/matrix.js +45 -16
  111. package/dist/core/workflow/matrix.js.map +1 -1
  112. package/dist/core/workflow/parse.js +34 -31
  113. package/dist/core/workflow/parse.js.map +1 -1
  114. package/dist/dsh/host/defaults-migration.d.ts +6 -0
  115. package/dist/dsh/host/defaults-migration.js +42 -0
  116. package/dist/dsh/host/defaults-migration.js.map +1 -0
  117. package/dist/dsh/host/plugin.d.ts +16 -6
  118. package/dist/dsh/host/plugin.js +46 -11
  119. package/dist/dsh/host/plugin.js.map +1 -1
  120. package/dist/dsh/host/preflight.d.ts +24 -0
  121. package/dist/dsh/host/preflight.js +192 -0
  122. package/dist/dsh/host/preflight.js.map +1 -0
  123. package/dist/dsh/host/review.d.ts +105 -0
  124. package/dist/dsh/host/review.js +197 -0
  125. package/dist/dsh/host/review.js.map +1 -0
  126. package/dist/shared/i18n/en.d.ts +10 -6
  127. package/dist/shared/i18n/en.js +10 -6
  128. package/dist/shared/i18n/en.js.map +1 -1
  129. package/dist/shared/i18n/es.js +10 -6
  130. package/dist/shared/i18n/es.js.map +1 -1
  131. package/dist/shared/i18n/fr.js +10 -6
  132. package/dist/shared/i18n/fr.js.map +1 -1
  133. package/dist/shared/i18n/hi.js +10 -6
  134. package/dist/shared/i18n/hi.js.map +1 -1
  135. package/dist/shared/i18n/ko.js +10 -6
  136. package/dist/shared/i18n/ko.js.map +1 -1
  137. package/dist/shared/i18n/zh-Hans.js +10 -6
  138. package/dist/shared/i18n/zh-Hans.js.map +1 -1
  139. package/package.json +3 -3
package/README.es.md ADDED
@@ -0,0 +1,191 @@
1
+ # CI Diet
2
+
3
+ [English](README.md) · [한국어](README.ko.md) · [简体中文](README.zh-Hans.md) · [हिन्दी](README.hi.md) · [Español](README.es.md) · [Français](README.fr.md)
4
+
5
+ **Estado:** alfa; `dsh-ci-diet@0.4.0` está en npm. El código fuente actual añade la pantalla de revisión **Ajustes → CI Diet Reports** a los contratos, los motores de análisis y parches, la CLI, las herramientas DSH, la página de ajustes y el informe HTML autocontenido. La pantalla de revisión ya había superado una prueba E2E en un navegador real en un commit anterior. La migración única de valores predeterminados se verificó por separado en el runtime de DSH `0.2.1-rc.2` con configEditor, SettingsForms y Loader; no fue una nueva comprobación del renderizado del navegador. El plugin de DSH ahora arranca con preflight, acceso de red para el historial y aplicación local activados.
6
+
7
+ **Valores predeterminados y migración en DSH.** Los perfiles nuevos de DSH empiezan con `preflightEnabled`, `networkEnabled` y `localApplyEnabled` en `true`, y con CD001, CD002, CD004, CD006 y CD008 activadas. Al iniciar por primera vez un perfil existente, CI Diet usa la edición bloqueada del `configEditor` de DSH para guardar esos interruptores, añadir esas reglas a la selección existente y registrar `defaultsRevision: 1` en ese perfil. Se conservan las rutas de estado, la retención, las cuotas, los datos de facturación y una activación explícita previa de CD003 o CD005. Después de ese guardado, un interruptor desactivado o una regla excluida se mantiene tras reinicios y actualizaciones; CD003 y CD005 siguen desactivadas salvo que se activen, las estimaciones de facturación siguen desactivadas por defecto y requieren activación explícita, mientras que una configuración ya activada se conserva.
8
+
9
+ CI Diet detecta trabajo de GitHub Actions que probablemente se desperdicia, conserva la evidencia de cada hallazgo y muestra una vista previa de pequeños cambios en los workflows para que una persona los revise.
10
+
11
+ **La instalación por sí sola no ahorra minutos de runner.** Los comandos de despliegue DSH admitidos comprueban automáticamente si hay candidatos de ahorro antes de ejecutarse; los cambios de workflow solo se aplican tras revisión y aprobación. El plugin de DSH no tiene herramientas de aprobación, aplicación ni reversión, y preflight nunca modifica archivos. Sus páginas de ajustes guardan la configuración y muestran los informes y planes de sesión del host; no optimizan un workflow. Las escrituras locales aprobadas están activadas por defecto, pero aplicar aún requiere una aprobación de digest separada. No hay garantía de que un hallazgo reduzca el coste.
12
+
13
+ `preflightEnabled` está activado por defecto. Antes de un literal `git push`, `npm|pnpm|bun publish`, `wrangler deploy` o `npm|pnpm|bun run deploy` en una herramienta bash DSH sin estado admitida (con argumento `workdir`), CI Diet hace una comprobación sin conexión. Señala para revisión los candidatos npm CD006, la falta de concurrency en un workflow solo de PR y una instalación Bun frozen sin caché de descargas explícita. Si hay candidatos, el primer comando no se ejecuta; tras revisar los elementos, el modelo puede reintentar el mismo comando. El propio preflight no hace peticiones de red ni cambios automáticos de archivos, y aplicar un plan sigue necesitando aprobación humana. Las shells persistentes y los wrappers de shell complejos no se identifican de forma fiable, así que preflight los omite. El ahorro sigue sin medirse, así que no se afirma ningún ahorro.
14
+
15
+ ## Qué hace
16
+
17
+ El scan estático lee el YAML de los workflows en un checkout de destino. La sincronización opcional del historial usa llamadas `gh api` de solo lectura para recopilar ejecuciones recientes. Los hallazgos incluyen un nivel de evidencia (`observed`, `inferred` o `static`) y una cobertura de recopilación por eje.
18
+
19
+ | Regla | Qué detecta | Plan posible |
20
+ | --- | --- | --- |
21
+ | CD001 | Ejecuciones de PR que quedan obsoletas por un commit más reciente | modificación de `concurrency` |
22
+ | CD002 | Disparadores solapados | solo explicación |
23
+ | CD003 | Comprobaciones pesadas para cambios que solo afectan a la documentación | solo explicación; desactivada por defecto |
24
+ | CD004 | Matrices de gran tamaño | solo explicación |
25
+ | CD005 | Jobs sin `timeout-minutes` | modificación del timeout; desactivada por defecto |
26
+ | CD006 | Jobs `actions/setup-node@v3` o `@v4` que ejecutan `npm ci` sin caché de npm | dos entradas de setup-node; activada por defecto |
27
+ | CD008 | Retención prolongada de artefactos | modificación de la retención |
28
+
29
+ CD001 ayuda a tratar las ejecuciones de PR solapadas que han quedado obsoletas. CD005 limita las ejecuciones anómalas; no reduce el tiempo de ejecución normal de un job. CD008 cambia la retención del almacenamiento de artefactos, no los minutos de runner. CD003 y CD005 permanecen desactivadas hasta que superen sus controles de calidad. CD006 es una regla estática activada por defecto para una forma estrecha de npm: añade la caché de descargas de setup-node mientras `npm ci` y todas las pruebas se siguen ejecutando. La caché puede reducir descargas cuando está caliente; no se afirma ningún ahorro de tiempo ni de dinero hasta comparar ejecuciones en frío y en caliente.
30
+
31
+ ## Instalación y actualización
32
+
33
+ La CLI requiere Node `^22.19.0 || >=24.0.0`. El plugin admite DSH `>=0.2.1-rc.2 <0.3.0-0` y `>=0.2.2-rc.1 <0.3.0-0`. La versión `0.3.1` se probó con DSH `0.2.1-rc.2`; DSH `0.3.0` no es compatible.
34
+
35
+ ```
36
+ npm install --global dsh-ci-diet@0.4.0
37
+ ci-diet --version
38
+ ```
39
+
40
+ Si no instalas el paquete de forma global, sustituye el nombre de comando `ci-diet` por `npx dsh-ci-diet@0.4.0`, por ejemplo `npx dsh-ci-diet@0.4.0 report --cwd .`.
41
+
42
+ ```
43
+ dsh plugin --profile web add dsh-ci-diet@0.4.0
44
+ dsh --profile web
45
+ ```
46
+
47
+ La instalación registra las herramientas del plugin, la página de ajustes y la pantalla de revisión **Ajustes → CI Diet Reports**. Preflight, acceso a la red y aplicación local están activados por defecto en el plugin. La instalación y el arranque no llaman a `gh`, no recopilan historial, no ejecutan un scan y no modifican un workflow.
48
+
49
+ ```
50
+ npm install --global dsh-ci-diet@latest
51
+ dsh plugin --profile web add dsh-ci-diet@latest
52
+ ```
53
+
54
+ Reinicia DSH después de actualizar el plugin. Usa `dsh plugin --profile web list`, `ci-diet --version` o `npx dsh-ci-diet@latest --version` para comprobar las versiones instaladas.
55
+
56
+ ## Primer scan e informe del historial
57
+
58
+ Ejecuta estos comandos desde el repositorio que quieres inspeccionar. `--cwd .` significa ese repositorio; `--cwd` acepta otra ruta, y las rutas relativas se resuelven desde el directorio de trabajo efectivo. El primer comando funciona sin conexión. La recopilación del historial es una activación de red aparte y explícita.
59
+
60
+ ```
61
+ ci-diet scan --cwd .
62
+ gh auth status
63
+ ci-diet sync --cwd . --network
64
+ ci-diet report --cwd .
65
+ ci-diet report --cwd . --format html --out report.html
66
+ ```
67
+
68
+ `scan` imprime un informe estático sin acceso a la red; `--json` o `--out FILE` escribe esa salida, pero el scan de la CLI no guarda un informe en el almacén de estado. `report` necesita un informe guardado por `sync` de la CLI, por `ci_diet_scan` del plugin o por `ci_diet_sync` del plugin. En esta secuencia que usa solo la CLI, sync guarda el informe; después, la opción HTML escribe un único archivo autocontenido. La sincronización del historial necesita `gh` instalado, autenticado y capaz de leer las ejecuciones y jobs de Actions del repositorio. `sync --network` es la activación explícita de la CLI. Nunca necesita permiso de escritura en GitHub. Un historial parcial aún genera y guarda un informe, y marca la cobertura como incompleta. El `ci_diet_scan` sin conexión del plugin sí guarda su informe, así que `ci_diet_report` puede ejecutarse justo después.
69
+
70
+ En el plugin de DSH, el acceso a la red está activado por defecto, así que `ci_diet_sync` puede ejecutarse en cuanto `gh` esté instalado y autenticado. El interruptor solo permite que esa herramienta llame a `gh`; la instalación, el arranque y el guardado de ajustes no recopilan historial por sí solos. Para impedir el uso de red del plugin, desactiva **Permitir acceso a la red** en **Ajustes → CI Diet** y elige **Guardar cambios**. El ajuste de la página se aplica a las herramientas del plugin; no activa el flag `--network` de la CLI. El scan estático y el informe funcionan sin red. La página de ajustes no ejecuta una optimización por sí sola.
71
+
72
+ Una solicitud útil en el chat deja explícitos la secuencia y el límite de revisión. Sustituye la ruta absoluta del ejemplo por la de tu repositorio:
73
+
74
+ > Ejecuta `ci_diet_scan` con cwd `C:\work\my-repo`; después, `ci_diet_sync` para ese mismo cwd y `ci_diet_report`. Si `gh` no está autenticado o desactivo el acceso a la red, detente tras el scan. Si vas a previsualizar un parche con `ci_diet_plan`, muestra solo las modificaciones. No apruebes, apliques ni reviertas nada, y no hagas commits, push ni despliegues.
75
+
76
+ La vista previa del plugin no guarda un plan. Su `nextCommand` vuelve a crear el plan mediante la CLI para que el plan sea duradero y pueda entrar en el flujo de aprobación humana.
77
+
78
+ ## Plan sin conexión de caché npm (CD006)
79
+
80
+ CD006 no necesita historial de ejecuciones. Detecta un job en la raíz del repositorio donde `actions/checkout` no tiene opciones `with` del usuario, le sigue exactamente un paso `actions/setup-node@v3` o `@v4` sin caché y el `run` del paso siguiente es exactamente `npm ci`. `package.json` y `package-lock.json` de la raíz deben estar versionados como archivos JSON normales. El plan solo añade `cache: npm` y `cache-dependency-path: package-lock.json` a setup-node; no cambia Node, las versiones de las acciones, `npm ci`, las pruebas ni el almacenamiento local.
81
+
82
+ ```
83
+ ci-diet plan --cwd . --rule CD006 --workflow .github/workflows/ci.yml --job test --step 1
84
+ ci-diet plans --cwd . --plan PLAN_ID
85
+ ```
86
+
87
+ `--step` es el índice basado en cero del paso setup-node; el ejemplo supone que checkout es 0 y setup-node es 1. La CLI `plan` ejecuta este escaneo estático en memoria y guarda el plan sin un `sync` previo; deja intacto el informe guardado más reciente. La herramienta de plugin `ci_diet_plan` sigue necesitando un informe guardado, así que ejecuta `ci_diet_scan` primero. La aprobación y la aplicación usan los comandos existentes de abajo. El plan y su attestation se guardan durante la planificación; ningún archivo de workflow cambia hasta que una persona aprueba el plan y ejecuta apply.
88
+
89
+ ## Referencia de comandos de la CLI
90
+
91
+ ```
92
+ ci-diet scan --cwd .
93
+ ci-diet sync --cwd . --network
94
+ ci-diet sync --cwd . --network --repo OWNER/REPO --days 7
95
+ ci-diet report --cwd .
96
+ ci-diet report --cwd . --format json
97
+ ci-diet report --cwd . --format html --out report.html
98
+ ci-diet diagnose --cwd .
99
+ ci-diet prune
100
+ ci-diet changes --cwd .
101
+ ci-diet plans --cwd . --plan PLAN_ID
102
+ ci-diet report --cwd . --lang ko
103
+ ```
104
+
105
+ `scan` comprueba los archivos de workflow. `sync` lee el historial solo después de `--network`; `--repo` selecciona `OWNER/REPO` de forma explícita y `--days` ajusta el periodo de retrospectiva dentro de sus límites configurados. `report` genera texto, JSON o HTML y escribe `--out` en una ruta relativa a `--cwd`. `diagnose` explica la correspondencia de nombres de job y la cobertura a partir del historial guardado; añade `--require-complete` para salir con el código `3` si los datos están incompletos. `prune` elimina informes, planes y entradas de caché caducados según la configuración del almacén de estado. `changes` enumera los cambios aplicados; `plans` vuelve a abrir un plan guardado. `--config FILE` combina una configuración JSON parcial en cualquier comando.
106
+
107
+ ## Revisar, aprobar, aplicar y revertir
108
+
109
+ Un `plan` correcto de la CLI imprime el diff propuesto, un ID de plan real como `p_...` y una confirmación formada por los últimos 12 caracteres del digest del plan. La creación del plan rechaza evidencia obsoleta y otras escrituras inseguras; un workflow inexistente puede ser un error de uso con salida `1`. Si se consulta un plan guardado después de que desaparezcan su workspace o su workflow, `plans --plan` oculta el diff, conserva el JSON del plan, pide volver a planificar y sale con `3`. Lo mismo ocurre cuando los bytes del workflow ya no coinciden con el hash de origen guardado. Revisa el diff y el plan otra vez antes de aprobar.
110
+
111
+ ```
112
+ ci-diet plan --cwd . --rule CD001 --workflow .github/workflows/ci.yml --claims ci-only,replace-safe
113
+ ci-diet plans --cwd . --plan PLAN_ID
114
+ ci-diet approve --cwd . --plan PLAN_ID --confirm CONFIRMATION
115
+ ci-diet apply --cwd . --plan PLAN_ID
116
+ ci-diet revert --cwd . --change CHANGE_ID
117
+ ```
118
+
119
+ Sustituye `PLAN_ID` por el ID que imprime el plan, `CONFIRMATION` por sus últimos 12 caracteres del digest y `CHANGE_ID` por el ID que imprime apply. Cada valor es un argumento literal; no escribas los corchetes angulares. `approve` crea una aprobación de un solo uso, `apply` reescribe únicamente el rango de bytes planificado en un archivo de workflow y `revert` restaura la copia de seguridad de ese cambio. Revisa el diff resultante y ejecuta las comprobaciones del repositorio según sea necesario. CI Diet no hace commits, push ni despliegues, no ejecuta workflows, no cambia la protección de ramas ni elimina artefactos.
120
+
121
+ Para una CI apta que solo se ejecuta en PRs, el ejemplo de CD001 usa `ci-only` y `replace-safe` como declaraciones humanas. Indican que la persona operadora ha revisado la semántica de cancelación; no son interruptores de omisión. CD005 necesita un `--job` y un `--minutes` medidos, y CD008 necesita `--job`, un índice numérico basado en cero del array `--step` para el paso objetivo y declaraciones sobre artefactos. CD006 necesita `--job` y el índice basado en cero `--step` del paso setup-node; no usa declaraciones. En ambas reglas de paso, el número es un índice del array y no un token con el nombre del paso.
122
+
123
+ ## Estado y limitaciones
124
+
125
+ La CLI y el plugin comparten el directorio de estado predeterminado: `%LOCALAPPDATA%\CI-Diet\profiles\default` en Windows y, en otros sistemas, `~/.local/state/ci-diet/profiles/default`. Una anulación de `stateDir` en el plugin es un almacén aparte; pasa la misma ruta absoluta a la CLI con `--state-dir` en `plan`, `approve`, `apply` y `revert`. Las rutas relativas de `--state-dir` de la CLI se resuelven contra el `--cwd` efectivo. El estado existente nunca se migra automáticamente entre directorios.
126
+
127
+ El cliente web tiene Ajustes y la pantalla de revisión **CI Diet Reports**. Los controles de informe, aprobación, aplicación y reversión ya habían superado una prueba E2E en un navegador real en un commit anterior. La migración de valores predeterminados se verificó por separado en el runtime de DSH `0.2.1-rc.2` con configEditor, SettingsForms, Loader y un perfil temporal: los valores `false` heredados se guardaron como `true`, y un `false` guardado después siguió desactivado tras reiniciar. Esta prueba de runtime no verificó un nuevo renderizado del navegador. La aprobación y la aplicación llegan al host desde esa pantalla, y `localApplyEnabled` está activado por defecto. Ninguna herramienta del plugin realiza aprobaciones ni aplicaciones. Un plan edita un único workflow existente mediante rangos de bytes y rechaza estructuras no admitidas. Los hallazgos pueden ser incorrectos o incompletos cuando el historial o la atribución de workflows es parcial, y otro sistema puede tener datos de facturación más precisos. Usa el informe como evidencia para la revisión y luego verifica el efecto en GitHub.
128
+
129
+ ## Coste y evidencia
130
+
131
+ | Campo | Significado |
132
+ | --- | --- |
133
+ | `observedRunnerSeconds` | Tiempo de runner registrado por las ejecuciones recopiladas |
134
+ | `modeledRoundedMinutes` | Minutos por job redondeados hacia arriba para la modelización |
135
+ | `listPriceUsd` | Coste según la instantánea de precios de catálogo incorporada |
136
+ | `actualBilledUsd` | Siempre `null` hasta que se pueda demostrar la factura real |
137
+
138
+ Los informes incorporan la instantánea de precios y un hash del contenido para que las cifras se puedan reproducir. No afirman ahorros automáticos. El informe HTML usa CSS en línea, no contiene scripts y no realiza solicitudes externas.
139
+
140
+ ## Idiomas
141
+
142
+ La interfaz de ajustes de DSH, los mensajes de la CLI, los informes HTML y estos seis READMEs admiten inglés, coreano, chino simplificado, hindi, español y francés. Las especificaciones detalladas siguen en inglés. El orden de selección es `--lang`, la configuración regional de DSH, `LC_ALL`/`LC_MESSAGES`/`LANG` y, por último, inglés. Los códigos de idioma de la CLI son `en`, `ko`, `zh-Hans`, `hi`, `es` y `fr`; sustituye `ko` en el comando de ejemplo por el código que quieras. Las etiquetas regionales se resuelven por idioma. Los informes se guardan en inglés y se localizan al mostrarse. Los IDs de regla, códigos de error, valores de enum, rutas, hashes y números permanecen literales. El atributo `lang` del HTML sigue la configuración regional seleccionada. Las descripciones de las herramientas DSH se capturan al cargar el plugin, así que recarga después de cambiar la preferencia de idioma de DSH.
143
+
144
+ ## Desarrollo
145
+
146
+ ```
147
+ bun install
148
+ node scripts/test-core.mjs
149
+ node scripts/gen-types.mjs --check
150
+ node scripts/sync-contracts.mjs --check
151
+ bun run typecheck
152
+ bun run lint
153
+ bun run test:docs
154
+ ```
155
+
156
+ Ejecuta las pruebas con Node para que los puntos de entrada publicados sigan siendo compatibles con Node. Bun se usa para gestionar dependencias.
157
+
158
+ ## Publicación
159
+
160
+ Hacer push de una etiqueta que coincida con `package.json` inicia `.github/workflows/publish.yml`. En los siguientes comandos, sustituye el literal `VERSION` de ambos argumentos por una versión nueva; la versión `0.3.1` ya está publicada, así que no vuelvas a crear esa etiqueta.
161
+
162
+ ```
163
+ git tag vVERSION
164
+ git push origin vVERSION
165
+ ```
166
+
167
+ El workflow compara la etiqueta con `package.json`, ejecuta las comprobaciones de publicación, rechaza una versión ya existente en npm y publica con la publicación de confianza de npm mediante GitHub OIDC. El publicador de confianza debe indicar `publish.yml`.
168
+
169
+ ## Estructura
170
+
171
+ ```
172
+ src/core workflow parsing, rules, savings, patch engine
173
+ src/adapters GitHub, git, storage
174
+ src/client Web Settings and review UI
175
+ src/dsh host plugin and bundle code
176
+ src/cli command-line entry
177
+ src/shared i18n and shared helpers
178
+ contracts JSON Schemas from the frozen design pack
179
+ examples sample records and evaluation vectors
180
+ docs/spec normative specification
181
+ scripts contract and documentation checks
182
+ tests/unit fast checks that need no network
183
+ ```
184
+
185
+ ## Documentación
186
+
187
+ Los documentos detallados de especificación, reglas, costes, parches, almacenamiento y decisiones están en inglés. El índice de la especificación es [docs/spec/README.md](docs/spec/README.md). También están disponibles: [rules](docs/spec/rules.md), [cost model](docs/spec/cost-model.md), [patch model](docs/spec/patch-model.md), [storage and errors](docs/spec/storage.md), [decisions](docs/spec/decisions.md), [measurement](docs/spikes/a0a-rules.md), la [plugin and CLI guide](docs/guide/plugin.md) y [contract provenance](contracts/UPSTREAM.md).
188
+
189
+ ## Licencia
190
+
191
+ MIT
package/README.fr.md ADDED
@@ -0,0 +1,191 @@
1
+ # CI Diet
2
+
3
+ [English](README.md) · [한국어](README.ko.md) · [简体中文](README.zh-Hans.md) · [हिन्दी](README.hi.md) · [Español](README.es.md) · [Français](README.fr.md)
4
+
5
+ **État :** alpha ; `dsh-ci-diet@0.4.0` est publié sur npm. L’arbre source actuel ajoute l’écran de revue **Réglages → CI Diet Reports** aux contrats, aux moteurs d’analyse et de correctifs, à la CLI, aux outils DSH, à la page Réglages et au rapport HTML autonome. L’écran de revue avait déjà passé un test E2E dans un vrai navigateur lors d’un commit précédent. La migration unique des valeurs par défaut a été vérifiée séparément dans le runtime DSH `0.2.1-rc.2` avec configEditor, SettingsForms et Loader ; ce n’est pas une nouvelle vérification du rendu navigateur. Le plugin DSH démarre désormais avec preflight, l’accès réseau pour l’historique et l’application locale activés.
6
+
7
+ **Valeurs par défaut et migration DSH.** Les nouveaux profils DSH démarrent avec `preflightEnabled`, `networkEnabled` et `localApplyEnabled` à `true`, et avec CD001, CD002, CD004, CD006 et CD008 activées. Au premier démarrage d’un profil existant, CI Diet utilise l’édition verrouillée du `configEditor` de DSH pour enregistrer ces interrupteurs, ajouter ces règles à la sélection existante et inscrire `defaultsRevision: 1` dans ce profil. Les chemins d’état, la rétention, les quotas, les données de facturation et une activation explicite antérieure de CD003 ou CD005 sont conservés. Après cet enregistrement, un interrupteur désactivé ou une règle exclue reste appliqué après les redémarrages et les mises à jour ; CD003 et CD005 restent désactivées sauf activation, les estimations de facturation restent désactivées par défaut et doivent être activées explicitement, tandis qu’une activation existante est conservée.
8
+
9
+ CI Diet repère le travail GitHub Actions probablement inutile, conserve les preuves associées à chaque constat et prévisualise de petites modifications de workflow pour qu’une personne les examine.
10
+
11
+ **L’installation seule ne permet pas d’économiser des minutes de runner.** Les commandes de déploiement DSH prises en charge recherchent automatiquement des candidats d’économie avant de s’exécuter ; les modifications de workflow ne sont appliquées qu’après examen et approbation. Le plugin DSH n’a pas d’outils d’approbation, d’application ou d’annulation, et preflight ne modifie jamais de fichier. Ses pages Réglages stockent la configuration et affichent les rapports et plans de session fournis par l’hôte ; elles n’optimisent pas un workflow. Les écritures locales approuvées sont activées par défaut, mais l’application exige toujours une approbation de digest distincte. Rien ne garantit qu’un constat réduise le coût.
12
+
13
+ `preflightEnabled` est activé par défaut. Avant un `git push`, `npm|pnpm|bun publish`, `wrangler deploy` ou `npm|pnpm|bun run deploy` littéral dans un outil bash DSH sans état pris en charge (avec argument `workdir`), CI Diet effectue une vérification hors ligne. Il signale pour examen les candidats npm CD006, l’absence de concurrency dans un workflow réservé aux PR et une installation Bun frozen sans cache de téléchargement explicite. Si un candidat existe, la première commande ne s’exécute pas ; après examen, le modèle peut relancer la même commande. Preflight lui-même n’effectue aucune requête réseau ni modification automatique de fichier, et l’application d’un plan demande toujours une approbation humaine. Les shells persistants et les wrappers shell complexes ne sont pas identifiés de façon fiable, donc preflight les ignore. L’économie reste non mesurée, donc aucun gain n’est affirmé.
14
+
15
+ ## Ce qu’il fait
16
+
17
+ Le scan statique lit le YAML des workflows dans un checkout cible. La synchronisation facultative de l’historique utilise des appels `gh api` en lecture seule pour collecter les exécutions récentes. Les constats comportent un niveau de preuve (`observed`, `inferred` ou `static`) et une couverture de collecte par axe.
18
+
19
+ | Règle | Ce qu’elle détecte | Modification possible |
20
+ | --- | --- | --- |
21
+ | CD001 | Exécutions de PR rendues obsolètes par un commit plus récent | modification de `concurrency` |
22
+ | CD002 | Déclencheurs qui se chevauchent | explication uniquement |
23
+ | CD003 | Vérifications lourdes pour des changements documentaires | explication uniquement ; désactivée par défaut |
24
+ | CD004 | Matrices surdimensionnées | explication uniquement |
25
+ | CD005 | Tâches sans `timeout-minutes` | modification du délai d’expiration ; désactivée par défaut |
26
+ | CD006 | Tâches `actions/setup-node@v3` ou `@v4` qui lancent `npm ci` sans cache npm | deux entrées setup-node ; activée par défaut |
27
+ | CD008 | Rétention prolongée des artefacts | modification de la rétention |
28
+
29
+ CD001 aide à traiter les exécutions de PR qui se chevauchent et sont devenues obsolètes. CD005 limite les exécutions anormales ; elle ne réduit pas la durée d’exécution normale d’une tâche. CD008 modifie la rétention du stockage des artefacts, et non les minutes de runner. CD003 et CD005 restent désactivées jusqu’à ce qu’elles réussissent leurs contrôles de qualité. CD006 est une règle statique active par défaut pour une forme npm étroite : elle ajoute le cache de téléchargement de setup-node tandis que `npm ci` et tous les tests s’exécutent toujours. Le cache peut réduire les téléchargements une fois alimenté ; aucun gain de temps ni d’argent n’est affirmé avant de comparer des exécutions à froid et à chaud.
30
+
31
+ ## Installation et mise à jour
32
+
33
+ La CLI exige Node `^22.19.0 || >=24.0.0`. Le plugin prend en charge DSH `>=0.2.1-rc.2 <0.3.0-0` et `>=0.2.2-rc.1 <0.3.0-0`. La version `0.3.1` a été testée avec DSH `0.2.1-rc.2` ; DSH `0.3.0` n’est pas pris en charge.
34
+
35
+ ```
36
+ npm install --global dsh-ci-diet@0.4.0
37
+ ci-diet --version
38
+ ```
39
+
40
+ Si vous ne faites pas d’installation globale, remplacez le nom de commande `ci-diet` par `npx dsh-ci-diet@0.4.0`, par exemple `npx dsh-ci-diet@0.4.0 report --cwd .`.
41
+
42
+ ```
43
+ dsh plugin --profile web add dsh-ci-diet@0.4.0
44
+ dsh --profile web
45
+ ```
46
+
47
+ L’installation enregistre les outils du plugin, la page Réglages et l’écran de revue **Réglages → CI Diet Reports**. Le preflight, l’accès réseau et l’application locale du plugin sont activés par défaut. L’installation et le démarrage n’appellent pas `gh`, ne collectent aucun historique, ne lancent aucun scan et ne modifient aucun workflow.
48
+
49
+ ```
50
+ npm install --global dsh-ci-diet@latest
51
+ dsh plugin --profile web add dsh-ci-diet@latest
52
+ ```
53
+
54
+ Redémarrez DSH après la mise à jour du plugin. Utilisez `dsh plugin --profile web list`, `ci-diet --version` ou `npx dsh-ci-diet@latest --version` pour vérifier les versions installées.
55
+
56
+ ## Premier scan et rapport d’historique
57
+
58
+ Exécutez ces commandes depuis le dépôt que vous voulez inspecter. `--cwd .` désigne ce dépôt ; `--cwd` accepte un autre chemin, et les chemins relatifs sont résolus depuis le répertoire de travail effectif. La première commande fonctionne sans réseau. La collecte de l’historique est une activation réseau distincte et explicite.
59
+
60
+ ```
61
+ ci-diet scan --cwd .
62
+ gh auth status
63
+ ci-diet sync --cwd . --network
64
+ ci-diet report --cwd .
65
+ ci-diet report --cwd . --format html --out report.html
66
+ ```
67
+
68
+ `scan` affiche un rapport statique sans accès réseau ; `--json` ou `--out FILE` écrit cette sortie, mais le scan de la CLI n’enregistre pas de rapport dans le stockage d’état. `report` exige un rapport enregistré par `sync` de la CLI, par `ci_diet_scan` du plugin ou par `ci_diet_sync` du plugin. Dans cette séquence utilisant uniquement la CLI, sync enregistre le rapport ; l’option HTML écrit ensuite un seul fichier autonome. La synchronisation de l’historique exige que `gh` soit installé, authentifié et capable de lire les exécutions et tâches Actions du dépôt. `sync --network` est l’activation explicite de la CLI. Elle n’a jamais besoin d’un droit d’écriture sur GitHub. Un historique partiel produit et enregistre tout de même un rapport, en signalant une couverture incomplète. Le `ci_diet_scan` hors ligne du plugin enregistre bien son rapport, donc `ci_diet_report` peut le suivre directement.
69
+
70
+ Pour le plugin DSH, l’accès réseau est activé par défaut : `ci_diet_sync` peut donc s’exécuter dès que `gh` est installé et authentifié. Cet interrupteur autorise seulement cet outil à appeler `gh` ; l’installation, le démarrage et l’enregistrement des réglages ne collectent pas d’historique à eux seuls. Pour empêcher le plugin d’utiliser le réseau, désactivez **Autoriser l’accès réseau** dans **Réglages → CI Diet**, puis choisissez **Enregistrer**. Le réglage de la page s’applique aux outils du plugin ; il n’active pas l’option `--network` de la CLI. Le scan statique et le rapport fonctionnent sans réseau. La page Réglages ne lance aucune optimisation à elle seule.
71
+
72
+ Une demande utile dans le chat rend explicites la séquence et la limite de la revue. Remplacez le chemin absolu de l’exemple par celui de votre dépôt :
73
+
74
+ > Exécute `ci_diet_scan` avec le cwd `C:\work\my-repo`, puis `ci_diet_sync` pour ce même cwd et `ci_diet_report`. Si `gh` n’est pas authentifié ou si je désactive l’accès réseau, arrête-toi après le scan. Si tu prévisualises un correctif avec `ci_diet_plan`, affiche uniquement les modifications. N’approuve, n’applique et n’annule rien ; ne fais aucun commit, aucun push et aucun déploiement.
75
+
76
+ La prévisualisation du plugin n’enregistre pas de plan. Son `nextCommand` recrée le plan via la CLI afin que le plan soit durable et puisse entrer dans le flux d’approbation humaine.
77
+
78
+ ## Plan hors ligne pour le cache npm (CD006)
79
+
80
+ CD006 n’a pas besoin de l’historique des exécutions. Elle reconnaît une tâche à la racine du dépôt où `actions/checkout` n’a aucune option `with` fournie par l’utilisateur, suivie d’exactement une étape `actions/setup-node@v3` ou `@v4` sans cache, puis d’une étape dont le `run` vaut exactement `npm ci`. Les fichiers `package.json` et `package-lock.json` de la racine doivent être versionnés comme des fichiers JSON ordinaires. Le plan ajoute uniquement `cache: npm` et `cache-dependency-path: package-lock.json` à setup-node ; il ne change ni Node, ni les versions d’action, ni `npm ci`, ni les tests, ni la mise en cache locale.
81
+
82
+ ```
83
+ ci-diet plan --cwd . --rule CD006 --workflow .github/workflows/ci.yml --job test --step 1
84
+ ci-diet plans --cwd . --plan PLAN_ID
85
+ ```
86
+
87
+ `--step` est l’index commençant à zéro de l’étape setup-node ; l’exemple suppose checkout en 0 et setup-node en 1. La CLI `plan` exécute cette analyse statique en mémoire et enregistre le plan sans `sync` préalable ; elle laisse le dernier rapport enregistré intact. L’outil de plugin `ci_diet_plan` a toujours besoin d’un rapport enregistré ; lancez donc `ci_diet_scan` d’abord. L’approbation et l’application utilisent les commandes existantes ci-dessous. Le plan et son attestation sont enregistrés pendant la planification ; aucun fichier de workflow ne change avant qu’une personne approuve le plan et lance apply.
88
+
89
+ ## Référence des commandes CLI
90
+
91
+ ```
92
+ ci-diet scan --cwd .
93
+ ci-diet sync --cwd . --network
94
+ ci-diet sync --cwd . --network --repo OWNER/REPO --days 7
95
+ ci-diet report --cwd .
96
+ ci-diet report --cwd . --format json
97
+ ci-diet report --cwd . --format html --out report.html
98
+ ci-diet diagnose --cwd .
99
+ ci-diet prune
100
+ ci-diet changes --cwd .
101
+ ci-diet plans --cwd . --plan PLAN_ID
102
+ ci-diet report --cwd . --lang ko
103
+ ```
104
+
105
+ `scan` vérifie les fichiers de workflow. `sync` lit l’historique uniquement après `--network` ; `--repo` sélectionne explicitement `OWNER/REPO` et `--days` ajuste la période rétrospective dans les limites configurées. `report` produit du texte, du JSON ou du HTML et écrit `--out` relativement à `--cwd`. `diagnose` explique la correspondance des noms de tâches et la couverture à partir de l’historique enregistré ; ajoutez `--require-complete` pour sortir avec le code `3` lorsque les données sont incomplètes. `prune` supprime les rapports, plans et entrées de cache expirés selon la configuration du stockage d’état. `changes` liste les modifications appliquées ; `plans` rouvre un plan enregistré. `--config FILE` fusionne une configuration JSON partielle pour n’importe quelle commande.
106
+
107
+ ## Examiner, approuver, appliquer et annuler
108
+
109
+ Un `plan` réussi de la CLI affiche le diff proposé, un véritable identifiant de plan tel que `p_...` et une confirmation formée à partir des 12 derniers caractères du digest du plan. La création du plan refuse les preuves obsolètes et les autres écritures risquées ; un workflow manquant peut être une erreur d’utilisation avec le code de sortie `1`. Si un plan enregistré est consulté après la disparition de son workspace ou de son workflow, `plans --plan` masque le diff, conserve le JSON du plan, demande de replanifier et sort avec `3`. Il en va de même lorsque les octets du workflow ne correspondent plus au hash source enregistré. Examinez de nouveau le diff et le plan avant d’approuver.
110
+
111
+ ```
112
+ ci-diet plan --cwd . --rule CD001 --workflow .github/workflows/ci.yml --claims ci-only,replace-safe
113
+ ci-diet plans --cwd . --plan PLAN_ID
114
+ ci-diet approve --cwd . --plan PLAN_ID --confirm CONFIRMATION
115
+ ci-diet apply --cwd . --plan PLAN_ID
116
+ ci-diet revert --cwd . --change CHANGE_ID
117
+ ```
118
+
119
+ Remplacez `PLAN_ID` par l’identifiant affiché par le plan, `CONFIRMATION` par les 12 derniers caractères de son digest et `CHANGE_ID` par l’identifiant affiché par apply. Chaque valeur est un argument littéral ; ne saisissez pas de chevrons. `approve` crée une approbation à usage unique, `apply` ne réécrit que la plage d’octets prévue dans un fichier de workflow et `revert` restaure la sauvegarde de cette modification. Examinez le diff obtenu et lancez les vérifications du dépôt selon vos besoins. CI Diet ne fait aucun commit, push ni déploiement, n’exécute aucun workflow, ne modifie pas la protection des branches et ne supprime aucun artefact.
120
+
121
+ Pour une CI éligible qui ne s’exécute que sur les PR, l’exemple CD001 utilise `ci-only` et `replace-safe` comme attestations humaines. Elles indiquent que l’opérateur a examiné la sémantique d’annulation ; ce ne sont pas des interrupteurs de contournement. CD005 nécessite un `--job` et un `--minutes` mesurés, et CD008 nécessite `--job`, un index numérique de tableau `--step` commençant à zéro pour l’étape cible, ainsi que des déclarations concernant les artefacts. CD006 nécessite `--job` et l’index `--step` commençant à zéro de l’étape setup-node ; elle ne demande aucune déclaration. Pour les deux règles d’étape, le nombre est un index de tableau, pas un jeton fondé sur le nom de l’étape.
122
+
123
+ ## État et limites
124
+
125
+ La CLI et le plugin partagent le répertoire d’état par défaut : `%LOCALAPPDATA%\CI-Diet\profiles\default` sous Windows, sinon `~/.local/state/ci-diet/profiles/default`. Une valeur `stateDir` définie dans le plugin désigne un stockage distinct ; transmettez le même chemin absolu à la CLI avec `--state-dir` pour `plan`, `approve`, `apply` et `revert`. Les chemins relatifs de `--state-dir` de la CLI sont résolus par rapport au `--cwd` effectif. L’état existant n’est jamais migré automatiquement d’un répertoire à l’autre.
126
+
127
+ Le client Web propose Réglages et l’écran de revue **CI Diet Reports**. Les contrôles de rapport, d’approbation, d’application et d’annulation avaient déjà passé un test E2E dans un vrai navigateur lors d’un commit précédent. La migration des valeurs par défaut a été vérifiée séparément dans le runtime DSH `0.2.1-rc.2` avec configEditor, SettingsForms, Loader et un profil temporaire : les valeurs `false` héritées ont été enregistrées comme `true`, puis un `false` enregistré ensuite est resté désactivé après redémarrage. Cette vérification du runtime n’a pas testé un nouveau rendu navigateur. L’approbation et l’application passent par l’hôte depuis cet écran, et `localApplyEnabled` est activé par défaut. Aucun outil du plugin n’effectue d’approbation ni d’application. Un plan modifie un seul workflow existant par plages d’octets et refuse les structures non prises en charge. Les constats peuvent être erronés ou incomplets lorsque l’historique ou l’attribution des workflows est partiel, et un autre système peut disposer de données de facturation plus précises. Utilisez le rapport comme preuve pour la revue, puis vérifiez l’effet dans GitHub.
128
+
129
+ ## Coût et preuves
130
+
131
+ | Champ | Signification |
132
+ | --- | --- |
133
+ | `observedRunnerSeconds` | Temps de runner enregistré par les exécutions collectées |
134
+ | `modeledRoundedMinutes` | Minutes par tâche arrondies à l’entier supérieur pour la modélisation |
135
+ | `listPriceUsd` | Coût selon l’instantané des tarifs catalogue intégré |
136
+ | `actualBilledUsd` | Toujours `null` tant que la facture réelle ne peut pas être prouvée |
137
+
138
+ Les rapports intègrent l’instantané des tarifs et un hash du contenu afin de permettre de reproduire les chiffres. Ils ne promettent pas d’économies automatiques. Le rapport HTML utilise du CSS en ligne, ne contient aucun script et ne fait aucune requête externe.
139
+
140
+ ## Langues
141
+
142
+ L’interface Réglages de DSH, les messages de la CLI, les rapports HTML et ces six READMEs prennent en charge l’anglais, le coréen, le chinois simplifié, l’hindi, l’espagnol et le français. Les spécifications détaillées restent en anglais. L’ordre de sélection est `--lang`, la locale DSH, `LC_ALL`/`LC_MESSAGES`/`LANG`, puis l’anglais. Les codes de langue de la CLI sont `en`, `ko`, `zh-Hans`, `hi`, `es` et `fr` ; remplacez `ko` dans la commande d’exemple par le code souhaité. Les étiquettes régionales sont résolues par langue. Les rapports sont stockés en anglais et localisés au moment de l’affichage. Les identifiants de règle, codes d’erreur, valeurs d’énumération, chemins, hashes et nombres restent littéraux. L’attribut `lang` du HTML suit la locale sélectionnée. Les descriptions des outils DSH sont capturées au chargement du plugin ; rechargez donc après avoir changé la préférence de langue de DSH.
143
+
144
+ ## Développement
145
+
146
+ ```
147
+ bun install
148
+ node scripts/test-core.mjs
149
+ node scripts/gen-types.mjs --check
150
+ node scripts/sync-contracts.mjs --check
151
+ bun run typecheck
152
+ bun run lint
153
+ bun run test:docs
154
+ ```
155
+
156
+ Exécutez les tests avec Node afin que les points d’entrée publiés restent compatibles avec Node. Bun sert uniquement à gérer les dépendances.
157
+
158
+ ## Publication
159
+
160
+ Pousser une étiquette qui correspond à `package.json` démarre `.github/workflows/publish.yml`. Dans les commandes suivantes, remplacez le littéral `VERSION` dans les deux arguments par une nouvelle version ; la version `0.3.1` est déjà publiée, donc ne recréez pas cette étiquette.
161
+
162
+ ```
163
+ git tag vVERSION
164
+ git push origin vVERSION
165
+ ```
166
+
167
+ Le workflow compare l’étiquette à `package.json`, exécute les vérifications de publication, refuse une version npm déjà existante et publie avec la publication de confiance npm via GitHub OIDC. Le publieur de confiance doit nommer `publish.yml`.
168
+
169
+ ## Structure
170
+
171
+ ```
172
+ src/core workflow parsing, rules, savings, patch engine
173
+ src/adapters GitHub, git, storage
174
+ src/client Web Settings and review UI
175
+ src/dsh host plugin and bundle code
176
+ src/cli command-line entry
177
+ src/shared i18n and shared helpers
178
+ contracts JSON Schemas from the frozen design pack
179
+ examples sample records and evaluation vectors
180
+ docs/spec normative specification
181
+ scripts contract and documentation checks
182
+ tests/unit fast checks that need no network
183
+ ```
184
+
185
+ ## Documentation
186
+
187
+ Les documents détaillés de spécification, de règles, de coûts, de correctifs, de stockage et de décision sont en anglais. L’index de la spécification est [docs/spec/README.md](docs/spec/README.md). Sont également disponibles, en anglais : [rules](docs/spec/rules.md), [cost model](docs/spec/cost-model.md), [patch model](docs/spec/patch-model.md), [storage and errors](docs/spec/storage.md), [decisions](docs/spec/decisions.md), [measurement](docs/spikes/a0a-rules.md), le [plugin and CLI guide](docs/guide/plugin.md) et [contract provenance](contracts/UPSTREAM.md).
188
+
189
+ ## Licence
190
+
191
+ MIT
package/README.hi.md ADDED
@@ -0,0 +1,191 @@
1
+ # CI Diet
2
+
3
+ [English](README.md) · [한국어](README.ko.md) · [简体中文](README.zh-Hans.md) · [हिन्दी](README.hi.md) · [Español](README.es.md) · [Français](README.fr.md)
4
+
5
+ **स्थिति:** alpha; `dsh-ci-diet@0.4.0` npm पर उपलब्ध है। Current source tree में मौजूद contracts, analysis और patch engines, CLI, DSH tools, Settings page और self-contained HTML report के साथ **सेटिंग्स → CI Diet Reports** review screen जोड़ा गया है। Review screen ने पिछले commit में असली browser E2E पास किया था। एक बार होने वाली defaults migration को अलग से DSH `0.2.1-rc.2` के configEditor, SettingsForms और Loader runtime में verify किया गया; यह नए browser render का verification नहीं है। DSH plugin अब preflight, history के लिए network access और local apply के साथ चालू होता है।
6
+
7
+ **DSH defaults और migration.** नए DSH profile में `preflightEnabled`, `networkEnabled` और `localApplyEnabled` `true` होते हैं, और CD001, CD002, CD004, CD006 तथा CD008 चालू रहते हैं। मौजूदा profile को पहली बार शुरू करने पर CI Diet DSH `configEditor` के locked edit से तीनों switches save करता है, इन rules को मौजूदा चयन में जोड़ता है और उसी profile में `defaultsRevision: 1` दर्ज करता है। State paths, retention, quotas, billing inputs और पहले से स्पष्ट रूप से चालू किए गए CD003 या CD005 सुरक्षित रहते हैं। इस save के बाद बंद किया गया switch या हटाया गया rule restart और update के बाद भी लागू रहता है; CD003 और CD005 केवल चालू करने पर चलते हैं, billing estimates default में बंद रहते हैं और स्पष्ट रूप से चालू करने पड़ते हैं, जबकि पहले से चालू billing setting सुरक्षित रहता है।
8
+
9
+ CI Diet संभवतः बर्बाद हो रहे GitHub Actions काम को खोजता है, हर finding के पीछे का evidence सुरक्षित रखता है, और मनुष्य द्वारा समीक्षा के लिए छोटे workflow बदलावों का preview देता है।
10
+
11
+ **केवल installation से runner minutes कम नहीं होते।** समर्थित DSH deployment commands चलने से पहले बचत के उम्मीदवार अपने आप जाँचते हैं; workflow बदलाव समीक्षा और approval के बाद ही लागू होते हैं। DSH plugin में approval, apply या revert tools नहीं हैं, और preflight खुद files नहीं बदलता। Settings pages tool configuration रखते हैं और host के session-scoped reports और plans दिखाते हैं; वे workflow को optimize नहीं करते। Approved local writes default में चालू हैं, पर apply के लिए अलग digest approval अब भी ज़रूरी है। किसी finding से लागत कम होने की गारंटी नहीं है।
12
+
13
+ `preflightEnabled` default में चालू है। `workdir` argument वाले समर्थित stateless DSH bash tool में literal `git push`, `npm|pnpm|bun publish`, `wrangler deploy` या `npm|pnpm|bun run deploy` से ठीक पहले offline जाँच होती है। यह npm CD006, केवल-PR workflow में concurrency की कमी, और स्पष्ट download cache के बिना Bun frozen install को समीक्षा के लिए दिखाता है। उम्मीदवार मिलने पर पहली command नहीं चलती; model items देखकर वही command फिर चलाए तो अनुमति मिलती है। preflight खुद कोई network request या automatic file change नहीं करता, और plan apply के लिए मानव approval अभी भी ज़रूरी है। persistent shells और जटिल shell wrappers पहचाने नहीं जाते, इसलिए preflight उन्हें skip करता है। बचत अभी मापी नहीं गई है, इसलिए बचत का दावा नहीं है।
14
+
15
+ ## यह क्या करता है
16
+
17
+ Static scan लक्षित checkout के workflow YAML को पढ़ता है। वैकल्पिक history sync read-only `gh api` calls से हाल के runs इकट्ठा करता है। हर finding पर evidence level (`observed`, `inferred` या `static`) और हर axis का collection coverage होता है।
18
+
19
+ | Rule | क्या मिलता है | संभावित plan |
20
+ | --- | --- | --- |
21
+ | CD001 | नए commit से अप्रचलित PR runs | `concurrency` बदलाव |
22
+ | CD002 | Overlapping triggers | केवल explanation |
23
+ | CD003 | केवल docs बदलने पर भारी checks | केवल explanation; default में बंद |
24
+ | CD004 | बहुत बड़ी matrices | केवल explanation |
25
+ | CD005 | `timeout-minutes` रहित jobs | timeout बदलाव; default में बंद |
26
+ | CD006 | npm cache के बिना `npm ci` चलाने वाले `actions/setup-node@v3` या `@v4` jobs | दो setup-node inputs; default में चालू |
27
+ | CD008 | लंबी artifact retention | retention बदलाव |
28
+
29
+ CD001 नए commit से superseded होकर overlap करते PR runs में मदद करता है। CD005 असामान्य runs पर सीमा लगाता है; सामान्य job runtime कम नहीं करता। CD008 artifact storage retention बदलता है, runner minutes नहीं। CD003 और CD005 अपने quality gates पास होने तक बंद रहते हैं। CD006 एक संकीर्ण npm आकार के लिए default static नियम है: यह setup-node download cache चालू करता है और `npm ci` तथा हर test पहले की तरह चलता रहता है। cache गर्म होने पर downloads घट सकते हैं, पर cold और warm runs की तुलना होने तक समय या पैसे की बचत का दावा नहीं किया जाता।
30
+
31
+ ## Install और upgrade
32
+
33
+ CLI के लिए Node `^22.19.0 || >=24.0.0` चाहिए। Plugin DSH `>=0.2.1-rc.2 <0.3.0-0` और `>=0.2.2-rc.1 <0.3.0-0` का समर्थन करता है। Version `0.3.1` को DSH `0.2.1-rc.2` पर जाँचा गया; DSH `0.3.0` समर्थित नहीं है।
34
+
35
+ ```
36
+ npm install --global dsh-ci-diet@0.4.0
37
+ ci-diet --version
38
+ ```
39
+
40
+ Global install न चाहें तो command नाम `ci-diet` की जगह `npx dsh-ci-diet@0.4.0` रखें, उदाहरण `npx dsh-ci-diet@0.4.0 report --cwd .`।
41
+
42
+ ```
43
+ dsh plugin --profile web add dsh-ci-diet@0.4.0
44
+ dsh --profile web
45
+ ```
46
+
47
+ Install करने से plugin tools, Settings page और **सेटिंग्स → CI Diet Reports** review screen register होते हैं। Plugin का preflight, network access और local apply default में चालू हैं। Install और startup `gh` call, history collection, scan या workflow change नहीं करते।
48
+
49
+ ```
50
+ npm install --global dsh-ci-diet@latest
51
+ dsh plugin --profile web add dsh-ci-diet@latest
52
+ ```
53
+
54
+ Plugin update के बाद DSH restart करें। `dsh plugin --profile web list`, `ci-diet --version` या `npx dsh-ci-diet@latest --version` से installed versions जाँचें।
55
+
56
+ ## पहला scan और history report
57
+
58
+ ये commands उस repository में चलाएँ जिसकी जाँच करनी है। `--cwd .` उसी repository को दर्शाता है; `--cwd` कोई दूसरा path भी ले सकता है और relative paths effective working directory से resolve होते हैं। पहला command offline चलता है। History collection के लिए network अलग और स्पष्ट रूप से enable करना होता है।
59
+
60
+ ```
61
+ ci-diet scan --cwd .
62
+ gh auth status
63
+ ci-diet sync --cwd . --network
64
+ ci-diet report --cwd .
65
+ ci-diet report --cwd . --format html --out report.html
66
+ ```
67
+
68
+ `scan` network के बिना static report output करता है; `--json` या `--out FILE` वह output लिख सकते हैं, लेकिन CLI scan report को state store में save नहीं करता। `report` को CLI `sync`, plugin `ci_diet_scan` या plugin `ci_diet_sync` द्वारा saved report चाहिए। नीचे के केवल-CLI क्रम में sync report save करता है; फिर HTML विकल्प एक self-contained file लिखता है। History sync के लिए `gh` install और authenticated होना चाहिए तथा repository के Actions runs और jobs पढ़ने की अनुमति चाहिए। `sync --network` CLI की स्पष्ट opt-in है। GitHub write permission नहीं चाहिए। अधूरी history पर भी report बनती और save होती है, साथ में incomplete coverage दिखती है। Plugin का offline `ci_diet_scan` report save करता है, इसलिए उसके ठीक बाद `ci_diet_report` चल सकता है।
69
+
70
+ DSH plugin में network access default में चालू है, इसलिए `gh` install और authenticate होने पर `ci_diet_sync` सीधे चल सकता है। यह switch केवल उस tool को `gh` call करने देता है; install, startup या settings save खुद history collect नहीं करते। Plugin का network उपयोग रोकने के लिए **सेटिंग्स → CI Diet** में **नेटवर्क पहुँच की अनुमति दें** बंद करें और **बदलाव सहेजें** चुनें। यह page setting केवल plugin tools पर लागू होती है; CLI का `--network` flag enable नहीं करती। Static scan और report network के बिना चलते हैं। Settings page अपने आप optimization नहीं चलाता।
71
+
72
+ अच्छे chat request में क्रम और review सीमा साफ़ लिखें। उदाहरण absolute path की जगह अपनी repository का path रखें:
73
+
74
+ > cwd `C:\work\my-repo` के साथ `ci_diet_scan`, फिर उसी cwd के लिए `ci_diet_sync` और `ci_diet_report` चलाओ। अगर `gh` authenticate नहीं है या मैंने network access बंद किया है तो scan के बाद रुक जाओ। अगर `ci_diet_plan` से patch preview हो तो केवल edits दिखाओ। कुछ भी approve, apply, revert, commit, push या deploy मत करो।
75
+
76
+ Plugin preview plan को save नहीं करता। उसका `nextCommand` CLI के ज़रिए plan फिर बनाता है ताकि plan durable store में जाए और human approval चरण में आ सके।
77
+
78
+ ## Offline npm cache plan (CD006)
79
+
80
+ CD006 को run history की ज़रूरत नहीं है। यह repository root के job से मिलता है जहाँ `actions/checkout` में उपयोगकर्ता के `with` विकल्प नहीं हैं, ठीक उसके बाद cache रहित एक `actions/setup-node@v3` या `@v4` step है, और अगले step का `run` ठीक `npm ci` है। root के `package.json` और `package-lock.json` committed सामान्य JSON files होने चाहिए। plan setup-node में केवल `cache: npm` और `cache-dependency-path: package-lock.json` जोड़ता है; Node, action versions, `npm ci`, tests या local caching नहीं बदलता।
81
+
82
+ ```
83
+ ci-diet plan --cwd . --rule CD006 --workflow .github/workflows/ci.yml --job test --step 1
84
+ ci-diet plans --cwd . --plan PLAN_ID
85
+ ```
86
+
87
+ `--step` setup-node step का शून्य से शुरू होने वाला index है; उदाहरण में checkout 0 और setup-node 1 है। CLI `plan` यह static scan memory में चलाकर `sync` के बिना plan सहेजता है और नवीनतम saved report को वैसा ही रखता है। plugin `ci_diet_plan` को saved report चाहिए, इसलिए पहले `ci_diet_scan` चलाएँ। approval और apply के लिए नीचे के मौजूदा commands इस्तेमाल करें। plan और attestation planning के दौरान सहेजे जाते हैं; किसी व्यक्ति के plan approve करने और apply चलाने से पहले कोई workflow file नहीं बदलती।
88
+
89
+ ## CLI command reference
90
+
91
+ ```
92
+ ci-diet scan --cwd .
93
+ ci-diet sync --cwd . --network
94
+ ci-diet sync --cwd . --network --repo OWNER/REPO --days 7
95
+ ci-diet report --cwd .
96
+ ci-diet report --cwd . --format json
97
+ ci-diet report --cwd . --format html --out report.html
98
+ ci-diet diagnose --cwd .
99
+ ci-diet prune
100
+ ci-diet changes --cwd .
101
+ ci-diet plans --cwd . --plan PLAN_ID
102
+ ci-diet report --cwd . --lang ko
103
+ ```
104
+
105
+ `scan` workflow files जाँचता है। `sync` केवल `--network` के साथ history पढ़ता है; `--repo` से `OWNER/REPO` स्पष्ट चुनें और `--days` से configured सीमा में lookback बदलें। `report` text, JSON या HTML देता है और `--out` को `--cwd` के सापेक्ष लिखता है। `diagnose` stored history से job-name matching और coverage समझाता है; `--require-complete` जोड़ने पर अधूरे data के लिए exit code `3` मिलता है। `prune` state-store settings के अनुसार expired reports, plans और cache entries हटाता है। `changes` applied changes दिखाता है और `plans` saved plan फिर खोलता है। `--config FILE` किसी भी command में partial JSON configuration merge करता है।
106
+
107
+ ## Review, approve, apply और revert
108
+
109
+ सफल CLI `plan` प्रस्तावित diff, `p_...` जैसा वास्तविक plan id और plan digest के अंतिम 12 characters से बना confirmation दिखाता है। Plan बनाते समय stale evidence और अन्य unsafe writes अस्वीकार होते हैं; workflow न मिलने पर usage error और exit `1` हो सकता है। Saved plan को बाद में देखते समय workspace या workflow गायब हो तो `plans --plan` diff छिपाता है, plan JSON रखता है, replan माँगता है और exit `3` देता है। Workflow bytes saved source hash से मेल न खाएँ तो भी ऐसा ही होता है। Approve करने से पहले diff और plan फिर जाँचें।
110
+
111
+ ```
112
+ ci-diet plan --cwd . --rule CD001 --workflow .github/workflows/ci.yml --claims ci-only,replace-safe
113
+ ci-diet plans --cwd . --plan PLAN_ID
114
+ ci-diet approve --cwd . --plan PLAN_ID --confirm CONFIRMATION
115
+ ci-diet apply --cwd . --plan PLAN_ID
116
+ ci-diet revert --cwd . --change CHANGE_ID
117
+ ```
118
+
119
+ `PLAN_ID` की जगह plan का दिखाया id, `CONFIRMATION` की जगह digest के अंतिम 12 characters और `CHANGE_ID` की जगह apply का दिखाया id लगाएँ। सभी values literal arguments हैं; angle brackets न लिखें। `approve` single-use approval बनाता है, `apply` केवल एक workflow file की planned byte range बदलता है और `revert` उस change का backup बहाल करता है। परिणामी diff देखें और ज़रूरत के अनुसार repository checks चलाएँ। CI Diet commit, push, deploy, workflow run, branch protection बदलाव या artifact deletion नहीं करता।
120
+
121
+ केवल PR CI के योग्य CD001 उदाहरण में `ci-only` और `replace-safe` human attestations हैं। ये बताते हैं कि operator ने cancellation semantics की समीक्षा की; ये bypass switches नहीं हैं। CD005 को measured `--job` और `--minutes` चाहिए, और CD008 को `--job`, target step का शून्य से शुरू होने वाला numeric `--step` array index और artifact claims चाहिए। CD006 को `--job` और setup-node step का शून्य से शुरू होने वाला `--step` index चाहिए; इसमें claims नहीं हैं। दोनों step नियमों में numeric step array index है, step name token नहीं।
122
+
123
+ ## State और सीमाएँ
124
+
125
+ CLI और plugin डिफ़ॉल्ट state directory साझा करते हैं: Windows पर `%LOCALAPPDATA%\CI-Diet\profiles\default`, अन्यथा `~/.local/state/ci-diet/profiles/default`। Plugin का `stateDir` override अलग store बनाता है; CLI के `plan`, `approve`, `apply` और `revert` में `--state-dir` से वही absolute path दें। CLI का relative `--state-dir` effective `--cwd` के सापेक्ष resolve होता है। मौजूदा state दूसरे directory में अपने आप migrate नहीं होता।
126
+
127
+ Web client में Settings और **CI Diet Reports** review screen हैं। Report, approve, apply और revert controls ने पिछले commit में असली browser E2E पास किया था। Defaults migration को DSH `0.2.1-rc.2` runtime में configEditor, SettingsForms, Loader और temporary profile के साथ अलग से verify किया गया: legacy `false` मान `true` के रूप में save हुए, और बाद में स्पष्ट रूप से save किया गया `false` restart के बाद भी बंद रहा। यह नया browser render verification नहीं है। Approval और apply इसी screen से host तक जाते हैं, और `localApplyEnabled` default में चालू है। कोई plugin tool approval या application नहीं करता। Plan एक मौजूदा workflow file को byte ranges पर बदलता है और unsupported structures अस्वीकार करता है। History या workflow attribution अधूरा हो तो findings गलत या छूटे हो सकते हैं, और किसी दूसरे system के billing data ज़्यादा सही हो सकते हैं। Report को review evidence मानें और effect GitHub में अलग से जाँचें।
128
+
129
+ ## Cost और evidence
130
+
131
+ | Field | अर्थ |
132
+ | --- | --- |
133
+ | `observedRunnerSeconds` | Collected runs में recorded runner time |
134
+ | `modeledRoundedMinutes` | Modeling के लिए प्रति job ऊपर की ओर rounded minutes |
135
+ | `listPriceUsd` | Report में embedded list-price snapshot पर cost |
136
+ | `actualBilledUsd` | Actual bill सिद्ध होने तक हमेशा `null` |
137
+
138
+ Reports pricing snapshot और content hash रखती हैं ताकि numbers फिर reproduce हो सकें। ये automatic savings का दावा नहीं करतीं। HTML report में inline CSS है, कोई script या external request नहीं है।
139
+
140
+ ## Languages
141
+
142
+ DSH Settings UI, CLI messages, HTML reports और ये छह READMEs English, Korean, Simplified Chinese, Hindi, Spanish और French का समर्थन करते हैं। Detailed specifications केवल English में हैं। Selection order `--lang`, DSH locale, `LC_ALL`/`LC_MESSAGES`/`LANG`, फिर English है। CLI language codes `en`, `ko`, `zh-Hans`, `hi`, `es`, `fr` हैं; example command का `ko` अपनी पसंद का code रखें। Regional tags language से resolve होते हैं। Reports English में save और display पर localize होती हैं। Rule ids, error codes, enum values, paths, hashes और numbers literal रहते हैं। HTML का `lang` attribute selected locale का अनुसरण करता है। DSH tool descriptions plugin load पर capture होते हैं, इसलिए DSH language preference बदलने के बाद reload करें।
143
+
144
+ ## Development
145
+
146
+ ```
147
+ bun install
148
+ node scripts/test-core.mjs
149
+ node scripts/gen-types.mjs --check
150
+ node scripts/sync-contracts.mjs --check
151
+ bun run typecheck
152
+ bun run lint
153
+ bun run test:docs
154
+ ```
155
+
156
+ Published entry points को Node-compatible रखने के लिए tests Node से चलाएँ। Bun केवल dependency management के लिए है।
157
+
158
+ ## Release
159
+
160
+ `package.json` से मेल खाता tag push करने पर `.github/workflows/publish.yml` शुरू होता है। नीचे दोनों arguments में literal `VERSION` की जगह नया version रखें; `0.3.1` पहले ही publish है, इसलिए वह tag फिर न बनाएँ।
161
+
162
+ ```
163
+ git tag vVERSION
164
+ git push origin vVERSION
165
+ ```
166
+
167
+ Workflow tag और `package.json` की तुलना करता है, release checks चलाता है, मौजूद npm version अस्वीकार करता है, और GitHub OIDC के ज़रिए npm trusted publishing से publish करता है। Trusted publisher में `publish.yml` नाम होना चाहिए।
168
+
169
+ ## Layout
170
+
171
+ ```
172
+ src/core workflow parsing, rules, savings, patch engine
173
+ src/adapters GitHub, git, storage
174
+ src/client Web Settings and review UI
175
+ src/dsh host plugin and bundle code
176
+ src/cli command-line entry
177
+ src/shared i18n and shared helpers
178
+ contracts JSON Schemas from the frozen design pack
179
+ examples sample records and evaluation vectors
180
+ docs/spec normative specification
181
+ scripts contract and documentation checks
182
+ tests/unit fast checks that need no network
183
+ ```
184
+
185
+ ## Documentation
186
+
187
+ Detailed specification, rule, cost, patch, storage और decision documents **English** में हैं। Specification index [docs/spec/README.md](docs/spec/README.md) है। यह भी देखें: [rules](docs/spec/rules.md), [cost model](docs/spec/cost-model.md), [patch model](docs/spec/patch-model.md), [storage and errors](docs/spec/storage.md), [decisions](docs/spec/decisions.md), [measurement](docs/spikes/a0a-rules.md), [plugin and CLI guide](docs/guide/plugin.md), और [contract provenance](contracts/UPSTREAM.md)।
188
+
189
+ ## License
190
+
191
+ MIT