kiln-cli 0.3.1__tar.gz

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 (391) hide show
  1. kiln_cli-0.3.1/.claude-plugin/marketplace.json +39 -0
  2. kiln_cli-0.3.1/.github/ISSUE_TEMPLATE/bug.yml +37 -0
  3. kiln_cli-0.3.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. kiln_cli-0.3.1/.github/ISSUE_TEMPLATE/idea.yml +21 -0
  5. kiln_cli-0.3.1/.github/pull_request_template.md +17 -0
  6. kiln_cli-0.3.1/.github/workflows/charte.yml +29 -0
  7. kiln_cli-0.3.1/.github/workflows/contrat-api.yml +72 -0
  8. kiln_cli-0.3.1/.github/workflows/django.yml +107 -0
  9. kiln_cli-0.3.1/.github/workflows/infra.yml +98 -0
  10. kiln_cli-0.3.1/.github/workflows/kiln.yml +27 -0
  11. kiln_cli-0.3.1/.github/workflows/maven.yml +40 -0
  12. kiln_cli-0.3.1/.github/workflows/mutation.yml +99 -0
  13. kiln_cli-0.3.1/.github/workflows/pnpm.yml +83 -0
  14. kiln_cli-0.3.1/.github/workflows/pypi.yml +35 -0
  15. kiln_cli-0.3.1/.github/workflows/python.yml +93 -0
  16. kiln_cli-0.3.1/.github/workflows/sbom.yml +51 -0
  17. kiln_cli-0.3.1/.github/workflows/securite.yml +60 -0
  18. kiln_cli-0.3.1/.github/workflows/vercel.yml +44 -0
  19. kiln_cli-0.3.1/.gitignore +7 -0
  20. kiln_cli-0.3.1/.python-version +1 -0
  21. kiln_cli-0.3.1/CHANGELOG.md +25 -0
  22. kiln_cli-0.3.1/CLAUDE.md +101 -0
  23. kiln_cli-0.3.1/CONTRIBUTING.md +99 -0
  24. kiln_cli-0.3.1/LICENSE +21 -0
  25. kiln_cli-0.3.1/PKG-INFO +233 -0
  26. kiln_cli-0.3.1/README.fr.md +302 -0
  27. kiln_cli-0.3.1/README.md +209 -0
  28. kiln_cli-0.3.1/SECURITY.md +9 -0
  29. kiln_cli-0.3.1/actions/charte/action.yml +19 -0
  30. kiln_cli-0.3.1/actions/services/action.yml +47 -0
  31. kiln_cli-0.3.1/copier.yml +184 -0
  32. kiln_cli-0.3.1/docs/assets/kiln-accueil.svg +105 -0
  33. kiln_cli-0.3.1/docs/assets/social-preview.png +0 -0
  34. kiln_cli-0.3.1/docs/backlog/README.md +15 -0
  35. kiln_cli-0.3.1/docs/backlog/backlog.md +253 -0
  36. kiln_cli-0.3.1/docs/backlog/rejected.md +11 -0
  37. kiln_cli-0.3.1/docs/backlog/urgent.md +7 -0
  38. kiln_cli-0.3.1/docs/inventaire-annski.md +83 -0
  39. kiln_cli-0.3.1/macros.jinja +10 -0
  40. kiln_cli-0.3.1/plugins/base/.claude-plugin/plugin.json +8 -0
  41. kiln_cli-0.3.1/plugins/base/.mcp.json +5 -0
  42. kiln_cli-0.3.1/plugins/base/README.md +14 -0
  43. kiln_cli-0.3.1/plugins/base/hooks/controle-fichier.py +114 -0
  44. kiln_cli-0.3.1/plugins/base/hooks/garde-branche.py +71 -0
  45. kiln_cli-0.3.1/plugins/base/hooks/hooks.json +51 -0
  46. kiln_cli-0.3.1/plugins/base/hooks/kiln-a-jour.py +407 -0
  47. kiln_cli-0.3.1/plugins/base/hooks/protege-fichiers.py +35 -0
  48. kiln_cli-0.3.1/plugins/base/hooks/rtk.py +45 -0
  49. kiln_cli-0.3.1/plugins/base/scripts/preparer-worktree.sh +27 -0
  50. kiln_cli-0.3.1/plugins/base/scripts/statusline.py +934 -0
  51. kiln_cli-0.3.1/plugins/base/skills/backlog/SKILL.md +49 -0
  52. kiln_cli-0.3.1/plugins/base/skills/contribution/SKILL.md +165 -0
  53. kiln_cli-0.3.1/plugins/base/skills/fusion/SKILL.md +34 -0
  54. kiln_cli-0.3.1/plugins/base/skills/maj-kiln/SKILL.md +36 -0
  55. kiln_cli-0.3.1/plugins/base/skills/nettoyage/SKILL.md +21 -0
  56. kiln_cli-0.3.1/plugins/base/skills/report-to-kiln/SKILL.md +132 -0
  57. kiln_cli-0.3.1/plugins/base/skills/token/SKILL.md +27 -0
  58. kiln_cli-0.3.1/plugins/base/skills/version/SKILL.md +85 -0
  59. kiln_cli-0.3.1/plugins/base/skills/worktree/SKILL.md +24 -0
  60. kiln_cli-0.3.1/plugins/pile-django/.claude-plugin/plugin.json +6 -0
  61. kiln_cli-0.3.1/plugins/pile-django/.mcp.json +15 -0
  62. kiln_cli-0.3.1/plugins/pile-django/skills/migration/SKILL.md +26 -0
  63. kiln_cli-0.3.1/plugins/pile-django/skills/postgres-lecture/SKILL.md +12 -0
  64. kiln_cli-0.3.1/plugins/pile-django/skills/postgres-lecture/role.sh +21 -0
  65. kiln_cli-0.3.1/plugins/pile-django/skills/regen-api/SKILL.md +12 -0
  66. kiln_cli-0.3.1/plugins/pile-nuxt/.claude-plugin/plugin.json +6 -0
  67. kiln_cli-0.3.1/plugins/pile-nuxt/.mcp.json +5 -0
  68. kiln_cli-0.3.1/plugins/pile-nuxt/scripts/apercu.mjs +168 -0
  69. kiln_cli-0.3.1/plugins/pile-nuxt/scripts/playwright-mcp.sh +9 -0
  70. kiln_cli-0.3.1/plugins/pile-nuxt/skills/apercu/SKILL.md +36 -0
  71. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/SKILL.md +59 -0
  72. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/advanced-hooks.md +297 -0
  73. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/advanced-layers.md +299 -0
  74. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/advanced-module-authoring.md +609 -0
  75. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/best-practices-data-fetching.md +402 -0
  76. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/best-practices-ssr.md +355 -0
  77. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-cli.md +263 -0
  78. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-config.md +265 -0
  79. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-data-fetching.md +353 -0
  80. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-deployment.md +224 -0
  81. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-directory-structure.md +311 -0
  82. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-modules.md +294 -0
  83. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/core-routing.md +279 -0
  84. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/features-components-autoimport.md +349 -0
  85. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/features-components.md +291 -0
  86. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/features-composables.md +324 -0
  87. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/features-server.md +343 -0
  88. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/features-state.md +196 -0
  89. kiln_cli-0.3.1/plugins/pile-nuxt/skills/nuxt/references/rendering-modes.md +247 -0
  90. kiln_cli-0.3.1/plugins/pile-nuxt/skills/polish/SKILL.md +28 -0
  91. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/SKILL.md +55 -0
  92. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/advanced-environments.md +272 -0
  93. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/advanced-projects.md +341 -0
  94. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/advanced-type-testing.md +239 -0
  95. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/advanced-vi.md +290 -0
  96. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-cli.md +189 -0
  97. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-config.md +216 -0
  98. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-describe.md +195 -0
  99. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-expect.md +311 -0
  100. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-hooks.md +244 -0
  101. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/core-test-api.md +267 -0
  102. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-benchmarking.md +100 -0
  103. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-concurrency.md +223 -0
  104. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-context.md +163 -0
  105. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-coverage.md +226 -0
  106. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-filtering.md +212 -0
  107. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-mocking.md +334 -0
  108. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-reporters.md +110 -0
  109. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-snapshots.md +253 -0
  110. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vitest/references/features-test-tags.md +123 -0
  111. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/SKILL.md +157 -0
  112. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
  113. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
  114. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-async.md +97 -0
  115. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-data-flow.md +307 -0
  116. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
  117. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-keep-alive.md +137 -0
  118. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-slots.md +216 -0
  119. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-suspense.md +228 -0
  120. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-teleport.md +108 -0
  121. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition-group.md +128 -0
  122. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition.md +125 -0
  123. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/composables.md +290 -0
  124. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/directives.md +162 -0
  125. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
  126. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
  127. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
  128. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/plugins.md +166 -0
  129. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/reactivity.md +344 -0
  130. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/render-functions.md +201 -0
  131. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/sfc.md +310 -0
  132. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/state-management.md +135 -0
  133. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
  134. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/SKILL.md +28 -0
  135. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/async-component-testing.md +163 -0
  136. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +158 -0
  137. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +175 -0
  138. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +208 -0
  139. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +144 -0
  140. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +238 -0
  141. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +242 -0
  142. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +197 -0
  143. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +229 -0
  144. kiln_cli-0.3.1/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +204 -0
  145. kiln_cli-0.3.1/plugins/serena/.claude-plugin/plugin.json +6 -0
  146. kiln_cli-0.3.1/plugins/serena/.mcp.json +8 -0
  147. kiln_cli-0.3.1/plugins/serena/scripts/lecture.yml +18 -0
  148. kiln_cli-0.3.1/plugins/serena/scripts/serena.sh +11 -0
  149. kiln_cli-0.3.1/plugins/stripe/.claude-plugin/plugin.json +6 -0
  150. kiln_cli-0.3.1/plugins/stripe/.mcp.json +8 -0
  151. kiln_cli-0.3.1/plugins/stripe/scripts/stripe-test.sh +19 -0
  152. kiln_cli-0.3.1/plugins/vps-podman/.claude-plugin/plugin.json +6 -0
  153. kiln_cli-0.3.1/plugins/vps-podman/skills/deployer/SKILL.md +24 -0
  154. kiln_cli-0.3.1/plugins/vps-podman/skills/prod-dump/SKILL.md +24 -0
  155. kiln_cli-0.3.1/plugins/vps-podman/skills/prod-logs/SKILL.md +23 -0
  156. kiln_cli-0.3.1/pyproject.toml +82 -0
  157. kiln_cli-0.3.1/src/kiln/__init__.py +1 -0
  158. kiln_cli-0.3.1/src/kiln/backlog.py +168 -0
  159. kiln_cli-0.3.1/src/kiln/banner.py +125 -0
  160. kiln_cli-0.3.1/src/kiln/charte/__init__.py +1 -0
  161. kiln_cli-0.3.1/src/kiln/charte/charte.py +160 -0
  162. kiln_cli-0.3.1/src/kiln/charte/cliquets.py +108 -0
  163. kiln_cli-0.3.1/src/kiln/charte/interdictions.py +328 -0
  164. kiln_cli-0.3.1/src/kiln/charte/moteur.py +66 -0
  165. kiln_cli-0.3.1/src/kiln/charte/outils_python.py +97 -0
  166. kiln_cli-0.3.1/src/kiln/check.py +30 -0
  167. kiln_cli-0.3.1/src/kiln/ci/__init__.py +5 -0
  168. kiln_cli-0.3.1/src/kiln/ci/execution.py +161 -0
  169. kiln_cli-0.3.1/src/kiln/ci/jobs.py +166 -0
  170. kiln_cli-0.3.1/src/kiln/ci/runner.py +137 -0
  171. kiln_cli-0.3.1/src/kiln/ci/services.py +115 -0
  172. kiln_cli-0.3.1/src/kiln/ci/verdict.py +102 -0
  173. kiln_cli-0.3.1/src/kiln/ci/workflow.py +95 -0
  174. kiln_cli-0.3.1/src/kiln/cli.py +331 -0
  175. kiln_cli-0.3.1/src/kiln/config.py +104 -0
  176. kiln_cli-0.3.1/src/kiln/contract.py +34 -0
  177. kiln_cli-0.3.1/src/kiln/deps.py +137 -0
  178. kiln_cli-0.3.1/src/kiln/dev.py +98 -0
  179. kiln_cli-0.3.1/src/kiln/doctor.py +291 -0
  180. kiln_cli-0.3.1/src/kiln/fleet.py +303 -0
  181. kiln_cli-0.3.1/src/kiln/github.py +100 -0
  182. kiln_cli-0.3.1/src/kiln/install.py +130 -0
  183. kiln_cli-0.3.1/src/kiln/new.py +96 -0
  184. kiln_cli-0.3.1/src/kiln/poste.py +87 -0
  185. kiln_cli-0.3.1/src/kiln/py.typed +0 -0
  186. kiln_cli-0.3.1/src/kiln/release.py +153 -0
  187. kiln_cli-0.3.1/src/kiln/rules.py +63 -0
  188. kiln_cli-0.3.1/src/kiln/settings.py +108 -0
  189. kiln_cli-0.3.1/src/kiln/shell.py +93 -0
  190. kiln_cli-0.3.1/src/kiln/stack.py +211 -0
  191. kiln_cli-0.3.1/src/kiln/statusline.py +97 -0
  192. kiln_cli-0.3.1/src/kiln/template.py +21 -0
  193. kiln_cli-0.3.1/src/kiln/ui.py +273 -0
  194. kiln_cli-0.3.1/src/kiln/update.py +122 -0
  195. kiln_cli-0.3.1/src/kiln/versions.py +184 -0
  196. kiln_cli-0.3.1/template/.claude/settings.json.jinja +44 -0
  197. kiln_cli-0.3.1/template/.editorconfig +15 -0
  198. kiln_cli-0.3.1/template/.gitattributes.jinja +31 -0
  199. kiln_cli-0.3.1/template/.github/CODEOWNERS.jinja +2 -0
  200. kiln_cli-0.3.1/template/.github/pull_request_template.md +18 -0
  201. kiln_cli-0.3.1/template/.github/workflows/ci.yml.jinja +105 -0
  202. kiln_cli-0.3.1/template/.gitignore.jinja +72 -0
  203. kiln_cli-0.3.1/template/.pre-commit-config.yaml.jinja +89 -0
  204. kiln_cli-0.3.1/template/.vscode/extensions.json.jinja +33 -0
  205. kiln_cli-0.3.1/template/.vscode/settings.json.jinja +24 -0
  206. kiln_cli-0.3.1/template/CLAUDE.md.jinja +428 -0
  207. kiln_cli-0.3.1/template/README.md.jinja +173 -0
  208. kiln_cli-0.3.1/template/charte.toml.jinja +163 -0
  209. kiln_cli-0.3.1/template/docs/backlog/README.md.jinja +15 -0
  210. kiln_cli-0.3.1/template/docs/backlog/backlog.md.jinja +68 -0
  211. kiln_cli-0.3.1/template/docs/backlog/rejected.md.jinja +11 -0
  212. kiln_cli-0.3.1/template/docs/backlog/urgent.md +5 -0
  213. kiln_cli-0.3.1/template/docs/{% if deploiement == /"vps/" %}exploitation{% endif %}/production.md.jinja" +96 -0
  214. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/.python-version" +1 -0
  215. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/CLAUDE.md.jinja" +50 -0
  216. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/pyproject.toml.jinja" +42 -0
  217. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/tests/__init__.py +0 -0
  218. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/tests/test_cli.py.jinja" +25 -0
  219. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__init__.py.jinja" +1 -0
  220. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__main__.py.jinja" +7 -0
  221. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/cli.py.jinja" +28 -0
  222. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/greeting.py" +5 -0
  223. kiln_cli-0.3.1/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/py.typed +0 -0
  224. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/.python-version" +1 -0
  225. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/CLAUDE.md.jinja" +62 -0
  226. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/data/README.md" +10 -0
  227. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/data/sample/measurements.csv" +37 -0
  228. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/notebooks/exploration.py" +43 -0
  229. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/__init__.py" +1 -0
  230. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/figures.py" +29 -0
  231. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/py.typed +0 -0
  232. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/sources.py" +28 -0
  233. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/transforms.py" +13 -0
  234. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/pyproject.toml.jinja" +48 -0
  235. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/tests/__init__.py +0 -0
  236. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_figures.py" +13 -0
  237. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_sources.py" +33 -0
  238. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_transforms.py" +20 -0
  239. kiln_cli-0.3.1/template/{% if backend == /"data/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +13 -0
  240. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/.env.example.jinja" +5 -0
  241. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/.python-version" +1 -0
  242. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/CLAUDE.md.jinja" +173 -0
  243. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/__init__.py +0 -0
  244. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/api.py.jinja" +44 -0
  245. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/asgi.py" +16 -0
  246. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/health.py" +15 -0
  247. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/management/__init__.py +0 -0
  248. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/__init__.py +0 -0
  249. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/export_openapi.py" +51 -0
  250. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/middleware.py" +18 -0
  251. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/settings.py.jinja" +142 -0
  252. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/urls.py" +11 -0
  253. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/config/wsgi.py" +16 -0
  254. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/manage.py" +23 -0
  255. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/pyproject.toml.jinja" +55 -0
  256. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/tests/__init__.py +0 -0
  257. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_health.py" +45 -0
  258. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_openapi.py" +35 -0
  259. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_security_headers.py" +33 -0
  260. kiln_cli-0.3.1/template/{% if backend == /"django/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +21 -0
  261. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/.env.example.jinja" +3 -0
  262. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/.python-version" +1 -0
  263. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/CLAUDE.md.jinja" +108 -0
  264. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/__init__.py +0 -0
  265. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/health.py" +18 -0
  266. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/main.py.jinja" +45 -0
  267. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/settings.py" +17 -0
  268. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/pyproject.toml.jinja" +36 -0
  269. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/__init__.py +0 -0
  270. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/test_health.py" +12 -0
  271. kiln_cli-0.3.1/template/{% if backend == /"fastapi/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +13 -0
  272. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/maven.config" +2 -0
  273. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/wrapper/maven-wrapper.properties" +6 -0
  274. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/CLAUDE.md.jinja" +68 -0
  275. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/mvnw" +295 -0
  276. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/mvnw.cmd" +189 -0
  277. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/pom.xml.jinja" +187 -0
  278. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/Main.java.jinja" +30 -0
  279. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingService.java.jinja" +15 -0
  280. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/MainTest.java.jinja" +30 -0
  281. kiln_cli-0.3.1/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingServiceTest.java.jinja" +26 -0
  282. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/Caddyfile.jinja" +27 -0
  283. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/backup.sh.jinja" +43 -0
  284. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/compose.yaml.jinja" +54 -0
  285. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/deploy-remote.sh.jinja" +265 -0
  286. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/heal.sh.jinja" +12 -0
  287. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/project.json.jinja" +7 -0
  288. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/restore-test.sh.jinja" +30 -0
  289. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/setup-deploy-user.sh.jinja" +20 -0
  290. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.service.jinja" +7 -0
  291. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.timer.jinja" +10 -0
  292. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.service.jinja" +7 -0
  293. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.timer.jinja" +9 -0
  294. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.service.jinja" +7 -0
  295. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.timer.jinja" +10 -0
  296. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/ci-verte.sh" +72 -0
  297. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}cible-vps.sh{% endif %}" +25 -0
  298. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}fumee.sh{% endif %}" +50 -0
  299. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}deploy-backend.sh{% endif %}.jinja" +96 -0
  300. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}smoke-test.sh{% endif %}.jinja" +26 -0
  301. kiln_cli-0.3.1/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if front_deploiement == /"vercel/" %}deploy-frontend.sh{% endif %}" +35 -0
  302. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/.gitignore" +24 -0
  303. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/.nvmrc" +1 -0
  304. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/AGENTS.md" +22 -0
  305. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/CLAUDE.md.jinja" +39 -0
  306. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/astro.config.mjs.jinja" +21 -0
  307. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/package.json.jinja" +24 -0
  308. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/pnpm-workspace.yaml" +8 -0
  309. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.ico +0 -0
  310. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.svg" +9 -0
  311. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/constants.ts.jinja" +4 -0
  312. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/layouts/BaseLayout.astro" +24 -0
  313. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/pages/index.astro.jinja" +39 -0
  314. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/styles/global.css" +7 -0
  315. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/tsconfig.json" +5 -0
  316. kiln_cli-0.3.1/template/{% if frontend == /"astro/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}" +13 -0
  317. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/.python-version" +1 -0
  318. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/CLAUDE.md.jinja" +35 -0
  319. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/app.py" +10 -0
  320. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/__init__.py" +1 -0
  321. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/constants.py.jinja" +17 -0
  322. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/layout.py.jinja" +78 -0
  323. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend == 'data' %}callbacks.py{% endif %}" +27 -0
  324. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +21 -0
  325. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/pyproject.toml.jinja" +47 -0
  326. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/__init__.py +0 -0
  327. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/test_layout.py.jinja" +29 -0
  328. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend == 'data' %}test_callbacks.py{% endif %}" +22 -0
  329. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +31 -0
  330. kiln_cli-0.3.1/template/{% if frontend == /"dash/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +16 -0
  331. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/.gitignore" +41 -0
  332. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/.nvmrc" +1 -0
  333. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/AGENTS.md" +9 -0
  334. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/CLAUDE.md.jinja" +42 -0
  335. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/app/favicon.ico +0 -0
  336. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/app/globals.css" +7 -0
  337. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/app/layout.tsx" +18 -0
  338. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/app/page.tsx.jinja" +23 -0
  339. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.tsx{% endif %}" +17 -0
  340. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/eslint.config.mjs" +18 -0
  341. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/constants.ts.jinja" +4 -0
  342. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/{% if backend in ['django', 'fastapi'] %}api.ts{% endif %}" +32 -0
  343. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/next.config.ts.jinja" +26 -0
  344. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/package.json.jinja" +28 -0
  345. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/pnpm-workspace.yaml" +7 -0
  346. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/tsconfig.json" +34 -0
  347. kiln_cli-0.3.1/template/{% if frontend == /"next/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +18 -0
  348. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.gitignore" +24 -0
  349. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.nvmrc" +1 -0
  350. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/CLAUDE.md.jinja" +65 -0
  351. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/app.vue.jinja" +20 -0
  352. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/main.css" +15 -0
  353. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/tokens.css" +9 -0
  354. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.vue{% endif %}" +17 -0
  355. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend == 'django' %}useApi.ts{% endif %}" +18 -0
  356. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend in ['django', 'fastapi'] %}useHealth.ts{% endif %}.jinja" +18 -0
  357. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/eslint.config.mjs" +23 -0
  358. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/nuxt.config.ts.jinja" +32 -0
  359. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/package.json.jinja" +32 -0
  360. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/pnpm-workspace.yaml" +16 -0
  361. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/favicon.ico +0 -0
  362. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/robots.txt" +2 -0
  363. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/tsconfig.json" +17 -0
  364. kiln_cli-0.3.1/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +19 -0
  365. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.python-version" +1 -0
  366. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.streamlit/config.toml" +5 -0
  367. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/CLAUDE.md.jinja" +35 -0
  368. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/app.py" +5 -0
  369. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/__init__.py" +1 -0
  370. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/constants.py.jinja" +10 -0
  371. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/home.py.jinja" +50 -0
  372. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +21 -0
  373. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/pyproject.toml.jinja" +47 -0
  374. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/__init__.py +0 -0
  375. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/test_app.py.jinja" +27 -0
  376. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +31 -0
  377. kiln_cli-0.3.1/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +16 -0
  378. kiln_cli-0.3.1/template/{% if podman %}.containerignore{% endif %} +24 -0
  379. kiln_cli-0.3.1/template/{% if podman %}compose.yaml{% endif %}.jinja +73 -0
  380. kiln_cli-0.3.1/template/{{_copier_conf.answers_file}}.jinja +2 -0
  381. kiln_cli-0.3.1/tests/test_backlog.py +125 -0
  382. kiln_cli-0.3.1/tests/test_ci.py +197 -0
  383. kiln_cli-0.3.1/tests/test_cli.py +84 -0
  384. kiln_cli-0.3.1/tests/test_deploiement.py +102 -0
  385. kiln_cli-0.3.1/tests/test_flotte.py +132 -0
  386. kiln_cli-0.3.1/tests/test_hook_kiln_a_jour.py +210 -0
  387. kiln_cli-0.3.1/tests/test_modele.py +246 -0
  388. kiln_cli-0.3.1/tests/test_plugins.py +41 -0
  389. kiln_cli-0.3.1/tests/test_statusline.py +204 -0
  390. kiln_cli-0.3.1/tests/test_unites.py +254 -0
  391. kiln_cli-0.3.1/uv.lock +709 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "kiln",
3
+ "description": "Plugins Claude Code des repos kiln",
4
+ "owner": {
5
+ "name": "antoine-tena"
6
+ },
7
+ "plugins": [
8
+ {
9
+ "name": "base",
10
+ "source": "./plugins/base",
11
+ "description": "Pour tous les projets : worktrees, fusion, nettoyage, backlog, garde de branche, fichiers protégés, contrôle du fichier modifié, context7"
12
+ },
13
+ {
14
+ "name": "pile-nuxt",
15
+ "source": "./plugins/pile-nuxt",
16
+ "description": "Nuxt, Vue, Vitest, audit visuel (polish) et le serveur MCP playwright"
17
+ },
18
+ {
19
+ "name": "pile-django",
20
+ "source": "./plugins/pile-django",
21
+ "description": "Django : migrations, contrat OpenAPI, MCP postgres en lecture seule"
22
+ },
23
+ {
24
+ "name": "vps-podman",
25
+ "source": "./plugins/vps-podman",
26
+ "description": "VPS en podman-compose : déploiement, diagnostic, copie de la base de prod"
27
+ },
28
+ {
29
+ "name": "stripe",
30
+ "source": "./plugins/stripe",
31
+ "description": "MCP Stripe en mode test seulement"
32
+ },
33
+ {
34
+ "name": "serena",
35
+ "source": "./plugins/serena",
36
+ "description": "MCP Serena en lecture seule : navigation par symboles pour les gros repos"
37
+ }
38
+ ]
39
+ }
@@ -0,0 +1,37 @@
1
+ name: Bug report
2
+ description: Something in kiln, a generated repo or a workflow does not work as expected.
3
+ labels: [bug]
4
+ body:
5
+ - type: textarea
6
+ id: what
7
+ attributes:
8
+ label: What happened?
9
+ description: What you ran, what you expected, what you got instead.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: output
14
+ attributes:
15
+ label: Output
16
+ description: The relevant output. `KILN_VERBOSE=1 kiln …` shows the full output of each step.
17
+ render: shell
18
+ - type: input
19
+ id: version
20
+ attributes:
21
+ label: kiln version
22
+ description: The `kiln` line of `kiln doctor` and, in a generated repo, its `modèle` line (template version).
23
+ - type: input
24
+ id: stack
25
+ attributes:
26
+ label: Stack
27
+ description: "Backend / frontend / podman, e.g. `django + nuxt, podman`, or `n/a`."
28
+ - type: dropdown
29
+ id: os
30
+ attributes:
31
+ label: OS
32
+ options: [Linux, WSL, macOS, Other]
33
+ - type: input
34
+ id: claude-code
35
+ attributes:
36
+ label: Claude Code version
37
+ description: For a skill, hook or status line problem, `claude --version`.
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Questions and discussions
4
+ url: https://github.com/antoine-tena/kiln/discussions
5
+ about: Ask how to do something, share what you built with kiln.
6
+ - name: Security vulnerability
7
+ url: https://github.com/antoine-tena/kiln/security/advisories/new
8
+ about: Please report vulnerabilities privately.
@@ -0,0 +1,21 @@
1
+ name: Idea or feature request
2
+ description: A new stack, command, rule or improvement.
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: What problem would this solve?
9
+ validations:
10
+ required: true
11
+ - type: textarea
12
+ id: proposal
13
+ attributes:
14
+ label: What do you have in mind?
15
+ description: Rough is fine. Alternatives you considered are welcome too.
16
+ - type: checkboxes
17
+ id: help
18
+ attributes:
19
+ label: Contribution
20
+ options:
21
+ - label: I would like to implement this myself.
@@ -0,0 +1,17 @@
1
+ ## What
2
+
3
+ <!-- What this PR changes, in one or two sentences. -->
4
+
5
+ ## Why
6
+
7
+ <!-- The need or the bug. Link the issue if there is one: Closes #… -->
8
+
9
+ ## How to test
10
+
11
+ 1.
12
+
13
+ ## Checklist
14
+
15
+ - [ ] `uv run pytest -q`, `uv run ruff check .`, `uv run mypy src tests` pass
16
+ - [ ] A fixed bug comes with the test that would have caught it
17
+ - [ ] No secrets or real personal data in the diff
@@ -0,0 +1,29 @@
1
+ name: Charte
2
+
3
+ # Les règles impératives de la charte du repo (CLAUDE.md), décrites dans son charte.toml, vérifiées
4
+ # par la commande `charte` de kiln.
5
+ on:
6
+ workflow_call:
7
+
8
+ jobs:
9
+ charte:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v7
13
+ with:
14
+ # La règle des migrations compare à la branche d'intégration.
15
+ fetch-depth: 0
16
+ # kiln à la version exacte de ce workflow : ses actions et la commande charte en viennent
17
+ # (retiré aussitôt, pour que les contrôles du projet ne le voient pas).
18
+ - uses: actions/checkout@v7
19
+ with:
20
+ repository: antoine-tena/kiln
21
+ ref: ${{ job.workflow_sha || 'develop' }}
22
+ path: .kiln
23
+ - uses: ./.kiln/actions/charte
24
+ with:
25
+ ref: ${{ job.workflow_sha || 'develop' }}
26
+ - name: Retrait de kiln du dossier du projet
27
+ run: rm -rf .kiln
28
+ - name: Charte
29
+ run: charte
@@ -0,0 +1,72 @@
1
+ name: Contrat d'API
2
+
3
+ # Le front appelle l'API par un client typé depuis openapi.json : ce job régénère le schéma depuis
4
+ # le code Django (django-ninja) puis les types depuis le schéma, et échoue si l'un des fichiers
5
+ # commités a dérivé. Les fichiers engendrés sont ceux de .gitattributes (linguist-generated).
6
+ on:
7
+ workflow_call:
8
+ inputs:
9
+ back:
10
+ type: string
11
+ default: backend
12
+ front:
13
+ type: string
14
+ default: frontend
15
+ export:
16
+ type: string
17
+ default: uv run python manage.py export_openapi --check --output ../openapi.json
18
+ generation:
19
+ type: string
20
+ default: pnpm generate:api
21
+ env:
22
+ description: Variables du projet, une par ligne (CLE=valeur)
23
+ type: string
24
+ default: ""
25
+
26
+ jobs:
27
+ contrat:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v7
31
+
32
+ - name: Variables du projet
33
+ if: inputs.env != ''
34
+ env:
35
+ VARIABLES: ${{ inputs.env }}
36
+ run: printf '%s\n' "$VARIABLES" | grep -v '^\s*$' >> "$GITHUB_ENV"
37
+
38
+ - uses: astral-sh/setup-uv@v7
39
+ with:
40
+ enable-cache: true
41
+ package-directory: ./${{ inputs.back }}
42
+
43
+ - name: Dépendances du back
44
+ run: uv sync --locked
45
+ working-directory: ./${{ inputs.back }}
46
+
47
+ - name: openapi.json correspond au code
48
+ run: ${{ inputs.export }}
49
+ working-directory: ./${{ inputs.back }}
50
+
51
+ - uses: pnpm/action-setup@v6
52
+ with:
53
+ package_json_file: ${{ inputs.front }}/package.json
54
+
55
+ - uses: actions/setup-node@v7
56
+ with:
57
+ node-version-file: ${{ inputs.front }}/.nvmrc
58
+ cache: pnpm
59
+ cache-dependency-path: ${{ inputs.front }}/pnpm-lock.yaml
60
+
61
+ - name: Dépendances du front
62
+ run: pnpm install --frozen-lockfile
63
+ working-directory: ./${{ inputs.front }}
64
+
65
+ - name: Types et règles de saisie conformes au schéma
66
+ env:
67
+ GENERATION: ${{ inputs.generation }}
68
+ run: |
69
+ $GENERATION
70
+ git diff --exit-code -- ':(top,attr:linguist-generated=true)' \
71
+ || (echo "::error::Les fichiers engendrés ont dérivé du schéma. Lancer '$GENERATION'." && exit 1)
72
+ working-directory: ./${{ inputs.front }}
@@ -0,0 +1,107 @@
1
+ name: Django
2
+
3
+ # Qualité d'un backend Django géré par uv, contre PostgreSQL et Redis réels (lancés par podman) :
4
+ # sans eux la suite tourne sur SQLite (select_for_update omis, contraintes partielles non
5
+ # exercées) et sur un cache local au process.
6
+ # ruff, typage mypy en cliquet (`charte types`), migrations manquantes, pytest avec couverture,
7
+ # planchers de couverture (`charte couverture`).
8
+ on:
9
+ workflow_call:
10
+ inputs:
11
+ dossier:
12
+ type: string
13
+ default: backend
14
+ base:
15
+ description: Nom de la base, de son utilisateur et de son mot de passe (préfixe)
16
+ type: string
17
+ default: app
18
+ postgres:
19
+ type: string
20
+ default: docker.io/library/postgres:16-alpine
21
+ redis:
22
+ description: Image Redis des tests (vide = pas de Redis)
23
+ type: string
24
+ default: docker.io/library/redis:7-alpine
25
+ env:
26
+ description: Variables du projet pour toutes les étapes, une par ligne (CLE=valeur)
27
+ type: string
28
+ default: ""
29
+ mypy:
30
+ description: Lancer `charte types` (section [types] de charte.toml)
31
+ type: boolean
32
+ default: true
33
+ couverture:
34
+ description: Lancer `charte couverture` (section [couverture] de charte.toml)
35
+ type: boolean
36
+ default: true
37
+
38
+ jobs:
39
+ django:
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v7
43
+ # kiln à la version exacte de ce workflow : ses actions et la commande charte en viennent
44
+ # (retiré aussitôt, pour que les contrôles du projet ne le voient pas).
45
+ - uses: actions/checkout@v7
46
+ with:
47
+ repository: antoine-tena/kiln
48
+ ref: ${{ job.workflow_sha || 'develop' }}
49
+ path: .kiln
50
+ - uses: ./.kiln/actions/charte
51
+ with:
52
+ ref: ${{ job.workflow_sha || 'develop' }}
53
+
54
+ - uses: ./.kiln/actions/services
55
+ with:
56
+ base: ${{ inputs.base }}
57
+ postgres: ${{ inputs.postgres }}
58
+ redis: ${{ inputs.redis }}
59
+ - name: Retrait de kiln du dossier du projet
60
+ run: rm -rf .kiln
61
+
62
+ - name: Variables du projet
63
+ if: inputs.env != ''
64
+ env:
65
+ VARIABLES: ${{ inputs.env }}
66
+ run: printf '%s\n' "$VARIABLES" | grep -v '^\s*$' >> "$GITHUB_ENV"
67
+
68
+ - uses: astral-sh/setup-uv@v7
69
+ with:
70
+ enable-cache: true
71
+ package-directory: ./${{ inputs.dossier }}
72
+
73
+ - name: Dépendances
74
+ run: uv sync --locked
75
+ working-directory: ./${{ inputs.dossier }}
76
+
77
+ - name: ruff
78
+ run: |
79
+ uv run ruff check .
80
+ uv run ruff format --check .
81
+ working-directory: ./${{ inputs.dossier }}
82
+
83
+ - name: Typage (mypy, en cliquet)
84
+ if: inputs.mypy
85
+ run: charte types
86
+
87
+ # Un modèle modifié sans `makemigrations` ne casse aucun test (Django recrée le schéma
88
+ # depuis les migrations existantes) : il n'apparaissait qu'au `migrate` du déploiement.
89
+ - name: Aucune migration manquante
90
+ run: uv run python manage.py makemigrations --check --dry-run
91
+ working-directory: ./${{ inputs.dossier }}
92
+
93
+ - name: pytest
94
+ run: uv run pytest --cov --cov-branch --cov-report=xml --cov-report=term:skip-covered
95
+ working-directory: ./${{ inputs.dossier }}
96
+
97
+ - name: Publier la couverture
98
+ if: always()
99
+ uses: actions/upload-artifact@v7
100
+ with:
101
+ name: ${{ inputs.dossier }}-coverage
102
+ path: ${{ inputs.dossier }}/coverage.xml
103
+ if-no-files-found: ignore
104
+
105
+ - name: Planchers de couverture
106
+ if: inputs.couverture
107
+ run: charte couverture
@@ -0,0 +1,98 @@
1
+ name: Infra
2
+
3
+ # Ce qui n'était vérifié que sur le serveur, au pire moment : images de conteneur (podman),
4
+ # workflows GitHub (actionlint), scripts shell (shellcheck), Caddyfile et pile compose.
5
+ # Jamais docker : podman construit et lance, podman-compose (installé par uv) lit le compose.
6
+ on:
7
+ workflow_call:
8
+ inputs:
9
+ image:
10
+ description: Dossiers des images à construire (contexte et Containerfile), séparés par des espaces
11
+ type: string
12
+ default: ""
13
+ containerfiles:
14
+ description: Containerfile construits depuis la racine du dépôt, séparés par des espaces
15
+ type: string
16
+ default: ""
17
+ shellcheck:
18
+ description: Motifs des scripts à relire, séparés par des espaces (vide = rien)
19
+ type: string
20
+ default: ""
21
+ caddyfile:
22
+ description: Caddyfile à valider (vide = rien)
23
+ type: string
24
+ default: ""
25
+ compose:
26
+ description: Fichier compose à valider (vide = rien)
27
+ type: string
28
+ default: ""
29
+ preparation:
30
+ description: Commandes lancées avant la validation du compose (fichiers qu'il attend…)
31
+ type: string
32
+ default: ""
33
+ env:
34
+ description: Variables pour la validation du compose, une par ligne (CLE=valeur)
35
+ type: string
36
+ default: ""
37
+
38
+ jobs:
39
+ infra:
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v7
43
+
44
+ - uses: astral-sh/setup-uv@v7
45
+
46
+ - name: Images (podman)
47
+ if: inputs.image != ''
48
+ env:
49
+ DOSSIERS: ${{ inputs.image }}
50
+ run: |
51
+ for dossier in $DOSSIERS; do
52
+ echo "::group::podman build $dossier"
53
+ podman build --pull -t "ci-${GITHUB_RUN_ID}-$(basename "$dossier")" "$dossier"
54
+ echo "::endgroup::"
55
+ done
56
+
57
+ - name: Images depuis la racine (podman)
58
+ if: inputs.containerfiles != ''
59
+ env:
60
+ CONTAINERFILES: ${{ inputs.containerfiles }}
61
+ run: |
62
+ for containerfile in $CONTAINERFILES; do
63
+ echo "::group::podman build -f $containerfile ."
64
+ podman build --pull -f "$containerfile" -t "ci-${GITHUB_RUN_ID}-$(dirname "$containerfile")" .
65
+ echo "::endgroup::"
66
+ done
67
+
68
+ # Un « : » nu dans un `run:` a déjà rendu un workflow illisible sans que rien ne le signale.
69
+ # Le shell des `run:` n'est pas relu ici ; les scripts le sont par l'étape suivante.
70
+ - name: actionlint (workflows GitHub)
71
+ run: uvx --from actionlint-py actionlint -color -shellcheck= -pyflakes=
72
+
73
+ - name: shellcheck
74
+ if: inputs.shellcheck != ''
75
+ env:
76
+ MOTIFS: ${{ inputs.shellcheck }}
77
+ run: |
78
+ # shellcheck disable=SC2086 # motifs développés par le shell
79
+ uvx --from shellcheck-py shellcheck $MOTIFS
80
+
81
+ - name: Caddyfile
82
+ if: inputs.caddyfile != ''
83
+ run: |
84
+ podman run --rm -v "$PWD/${{ inputs.caddyfile }}:/etc/caddy/Caddyfile:ro,Z" \
85
+ docker.io/library/caddy:2 \
86
+ sh -c 'mkdir -p /var/log/caddy && caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile'
87
+
88
+ - name: Pile compose
89
+ if: inputs.compose != ''
90
+ env:
91
+ PREPARATION: ${{ inputs.preparation }}
92
+ VARIABLES: ${{ inputs.env }}
93
+ run: |
94
+ [ -z "$PREPARATION" ] || bash -c "$PREPARATION"
95
+ set -a
96
+ eval "$(printf '%s\n' "$VARIABLES" | grep -v '^\s*$')"
97
+ set +a
98
+ uvx podman-compose -f "${{ inputs.compose }}" config > /dev/null
@@ -0,0 +1,27 @@
1
+ name: kiln
2
+
3
+ # Contrôles de kiln lui-même : ruff, mypy, tests du modèle (génération de chaque combinaison).
4
+ on:
5
+ push:
6
+ branches: [ main, develop ]
7
+ pull_request:
8
+ branches: [ main, develop ]
9
+
10
+ jobs:
11
+ kiln:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v7
15
+ - uses: astral-sh/setup-uv@v7
16
+ with:
17
+ enable-cache: true
18
+ - name: Dépendances
19
+ run: uv sync --locked
20
+ - name: ruff
21
+ run: |
22
+ uv run ruff check .
23
+ uv run ruff format --check .
24
+ - name: mypy
25
+ run: uv run mypy src tests
26
+ - name: Tests
27
+ run: uv run pytest -q
@@ -0,0 +1,40 @@
1
+ name: Maven
2
+
3
+ # Qualité d'un projet Java construit par Maven, sans framework : `./mvnw verify` compile avec les
4
+ # avertissements bloquants, lance les tests JUnit et vérifie le plancher de couverture JaCoCo du
5
+ # pom.xml. Maven vient du wrapper du projet (version et somme SHA-256 figées), jamais du runner.
6
+ on:
7
+ workflow_call:
8
+ inputs:
9
+ dossier:
10
+ type: string
11
+ default: backend
12
+ java:
13
+ description: Version du JDK
14
+ type: string
15
+ default: "25"
16
+
17
+ jobs:
18
+ maven:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v7
22
+
23
+ - uses: actions/setup-java@v6
24
+ with:
25
+ distribution: temurin
26
+ java-version: ${{ inputs.java }}
27
+ cache: maven
28
+ cache-dependency-path: ${{ inputs.dossier }}/pom.xml
29
+
30
+ - name: mvnw verify
31
+ run: ./mvnw -B verify
32
+ working-directory: ./${{ inputs.dossier }}
33
+
34
+ - name: Publier la couverture
35
+ if: always()
36
+ uses: actions/upload-artifact@v7
37
+ with:
38
+ name: ${{ inputs.dossier }}-coverage
39
+ path: ${{ inputs.dossier }}/target/site/jacoco/jacoco.xml
40
+ if-no-files-found: ignore
@@ -0,0 +1,99 @@
1
+ name: Tests par mutation
2
+
3
+ # mutmut sur un backend Django géré par uv, PostgreSQL et Redis lancés par podman (configuration [tool.mutmut] du pyproject.toml) : un
4
+ # mutant qui survit est un test manquant. Jamais bloquant : le job réussit quel que soit le score
5
+ # et publie le rapport (statistiques, survivants et leur diff) en artefact.
6
+ on:
7
+ workflow_call:
8
+ inputs:
9
+ dossier:
10
+ type: string
11
+ default: backend
12
+ base:
13
+ type: string
14
+ default: app
15
+ postgres:
16
+ type: string
17
+ default: docker.io/library/postgres:16-alpine
18
+ groupe:
19
+ description: Groupe de dépendances uv qui apporte mutmut
20
+ type: string
21
+ default: mutation
22
+ env:
23
+ description: Variables du projet, une par ligne (CLE=valeur)
24
+ type: string
25
+ default: ""
26
+
27
+ jobs:
28
+ mutmut:
29
+ runs-on: ubuntu-latest
30
+ timeout-minutes: 330
31
+ continue-on-error: true
32
+ defaults:
33
+ run:
34
+ working-directory: ./${{ inputs.dossier }}
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+
38
+ # kiln à la version exacte de ce workflow : ses actions et la commande charte en viennent
39
+ # (retiré aussitôt, pour que les contrôles du projet ne le voient pas).
40
+ - uses: actions/checkout@v7
41
+ with:
42
+ repository: antoine-tena/kiln
43
+ ref: ${{ job.workflow_sha || 'develop' }}
44
+ path: .kiln
45
+ - uses: ./.kiln/actions/services
46
+ with:
47
+ base: ${{ inputs.base }}
48
+ postgres: ${{ inputs.postgres }}
49
+ redis: docker.io/library/redis:7-alpine
50
+ - name: Retrait de kiln du dossier du projet
51
+ run: rm -rf .kiln
52
+
53
+ - name: Variables du projet
54
+ if: inputs.env != ''
55
+ env:
56
+ VARIABLES: ${{ inputs.env }}
57
+ run: printf '%s\n' "$VARIABLES" | grep -v '^\s*$' >> "$GITHUB_ENV"
58
+
59
+ - uses: astral-sh/setup-uv@v7
60
+ with:
61
+ enable-cache: true
62
+ package-directory: ./${{ inputs.dossier }}
63
+
64
+ - name: Dépendances
65
+ run: uv sync --locked --group ${{ inputs.groupe }}
66
+
67
+ # --max-children 1 : chaque mutant relance pytest sur la même base de test (--reuse-db).
68
+ - name: mutmut
69
+ run: uv run mutmut run --max-children 1 || echo "::warning::mutmut s'est arrêté avant la fin"
70
+
71
+ - name: Rapport
72
+ if: always()
73
+ run: |
74
+ mkdir -p ../mutation-report
75
+ uv run mutmut export-cicd-stats || true
76
+ cp mutants/mutmut-cicd-stats.json ../mutation-report/ 2>/dev/null || true
77
+ uv run mutmut results --all true > ../mutation-report/mutants.txt 2>&1 || true
78
+ grep -E ': (survived|no tests|timeout|suspicious)$' ../mutation-report/mutants.txt \
79
+ > ../mutation-report/survivants.txt || true
80
+ while read -r name _; do
81
+ uv run mutmut show "${name%:}" >> ../mutation-report/survivants.diff 2>&1 || true
82
+ done < ../mutation-report/survivants.txt
83
+ {
84
+ echo "## Tests par mutation"
85
+ echo
86
+ echo '```json'
87
+ cat ../mutation-report/mutmut-cicd-stats.json 2>/dev/null || echo "{}"
88
+ echo '```'
89
+ echo
90
+ echo "Survivants : $(wc -l < ../mutation-report/survivants.txt)"
91
+ } >> "$GITHUB_STEP_SUMMARY"
92
+
93
+ - name: Publier le rapport
94
+ if: always()
95
+ uses: actions/upload-artifact@v7
96
+ with:
97
+ name: mutation-report
98
+ path: mutation-report/
99
+ retention-days: 90
@@ -0,0 +1,83 @@
1
+ name: pnpm
2
+
3
+ # Qualité d'un front pnpm (Nuxt, Next.js, Astro…) : les scripts de package.json listés dans
4
+ # `scripts`, l'un après l'autre (lint, typecheck, tests, build…), puis les rapports publiés en
5
+ # artefact. La version de pnpm est celle du champ packageManager de package.json.
6
+ on:
7
+ workflow_call:
8
+ inputs:
9
+ dossier:
10
+ type: string
11
+ default: frontend
12
+ pnpm:
13
+ description: Version de pnpm (vide = champ packageManager de package.json)
14
+ type: string
15
+ default: ""
16
+ scripts:
17
+ description: Scripts pnpm à lancer dans l'ordre, un par ligne (avec leurs arguments)
18
+ type: string
19
+ default: |
20
+ lint
21
+ typecheck
22
+ test
23
+ build
24
+ rapports:
25
+ description: Chemins publiés en artefact, relatifs au dossier, un par ligne
26
+ type: string
27
+ default: ""
28
+
29
+ jobs:
30
+ pnpm:
31
+ runs-on: ubuntu-latest
32
+ defaults:
33
+ run:
34
+ working-directory: ./${{ inputs.dossier }}
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+
38
+ - uses: pnpm/action-setup@v6
39
+ with:
40
+ version: ${{ inputs.pnpm }}
41
+ package_json_file: ${{ inputs.dossier }}/package.json
42
+
43
+ - uses: actions/setup-node@v7
44
+ with:
45
+ node-version-file: ${{ inputs.dossier }}/.nvmrc
46
+ cache: pnpm
47
+ cache-dependency-path: ${{ inputs.dossier }}/pnpm-lock.yaml
48
+
49
+ - name: Dépendances
50
+ run: pnpm install --frozen-lockfile
51
+
52
+ - name: Scripts
53
+ env:
54
+ SCRIPTS: ${{ inputs.scripts }}
55
+ run: |
56
+ while read -r script; do
57
+ [ -n "$script" ] || continue
58
+ echo "::group::pnpm $script"
59
+ # shellcheck disable=SC2086 # le script porte ses arguments
60
+ pnpm $script
61
+ echo "::endgroup::"
62
+ done <<< "$SCRIPTS"
63
+
64
+ - name: Chemins des rapports
65
+ id: rapports
66
+ if: always() && inputs.rapports != ''
67
+ env:
68
+ RAPPORTS: ${{ inputs.rapports }}
69
+ DOSSIER: ${{ inputs.dossier }}
70
+ run: |
71
+ {
72
+ echo "chemins<<FIN"
73
+ while read -r chemin; do [ -n "$chemin" ] && echo "$DOSSIER/$chemin"; done <<< "$RAPPORTS"
74
+ echo "FIN"
75
+ } >> "$GITHUB_OUTPUT"
76
+
77
+ - name: Publier les rapports
78
+ if: always() && inputs.rapports != ''
79
+ uses: actions/upload-artifact@v7
80
+ with:
81
+ name: ${{ inputs.dossier }}-rapports
82
+ path: ${{ steps.rapports.outputs.chemins }}
83
+ if-no-files-found: ignore