kiln-cli 0.3.1__tar.gz → 0.3.2__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 (404) hide show
  1. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CHANGELOG.md +8 -0
  2. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CLAUDE.md +8 -7
  3. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/PKG-INFO +7 -4
  4. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/README.fr.md +35 -7
  5. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/README.md +6 -3
  6. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/backlog.md +42 -49
  7. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/garde-branche.py +20 -1
  8. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/kiln-a-jour.py +114 -96
  9. kiln_cli-0.3.2/plugins/base/hooks/relances.py +166 -0
  10. kiln_cli-0.3.2/plugins/base/skills/adoption/SKILL.md +28 -0
  11. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/contribution/SKILL.md +13 -2
  12. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/fusion/SKILL.md +3 -0
  13. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/maj-kiln/SKILL.md +4 -3
  14. kiln_cli-0.3.2/plugins/base/skills/relecture/SKILL.md +95 -0
  15. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/version/SKILL.md +3 -0
  16. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/pyproject.toml +1 -1
  17. kiln_cli-0.3.2/src/kiln/adopt.py +110 -0
  18. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/charte.py +58 -6
  19. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/moteur.py +4 -1
  20. kiln_cli-0.3.2/src/kiln/charte/waivers.py +167 -0
  21. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/cli.py +71 -3
  22. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/fleet.py +65 -4
  23. kiln_cli-0.3.2/src/kiln/frozen.py +69 -0
  24. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/update.py +21 -1
  25. kiln_cli-0.3.2/src/kiln/waive.py +172 -0
  26. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/CLAUDE.md.jinja +10 -0
  27. kiln_cli-0.3.2/tests/conftest.py +13 -0
  28. kiln_cli-0.3.2/tests/test_adopt.py +63 -0
  29. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_flotte.py +49 -0
  30. kiln_cli-0.3.2/tests/test_garde_branche.py +49 -0
  31. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_hook_kiln_a_jour.py +47 -16
  32. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_modele.py +1 -1
  33. kiln_cli-0.3.2/tests/test_relances.py +102 -0
  34. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_unites.py +41 -3
  35. kiln_cli-0.3.2/tests/test_waive.py +98 -0
  36. kiln_cli-0.3.2/tests/test_waivers.py +204 -0
  37. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/uv.lock +1 -1
  38. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.claude-plugin/marketplace.json +0 -0
  39. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  40. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/idea.yml +0 -0
  42. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/pull_request_template.md +0 -0
  43. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/charte.yml +0 -0
  44. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/contrat-api.yml +0 -0
  45. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/django.yml +0 -0
  46. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/infra.yml +0 -0
  47. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/kiln.yml +0 -0
  48. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/maven.yml +0 -0
  49. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/mutation.yml +0 -0
  50. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/pnpm.yml +0 -0
  51. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/pypi.yml +0 -0
  52. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/python.yml +0 -0
  53. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/sbom.yml +0 -0
  54. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/securite.yml +0 -0
  55. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/vercel.yml +0 -0
  56. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.gitignore +0 -0
  57. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.python-version +0 -0
  58. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CONTRIBUTING.md +0 -0
  59. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/LICENSE +0 -0
  60. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/SECURITY.md +0 -0
  61. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/actions/charte/action.yml +0 -0
  62. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/actions/services/action.yml +0 -0
  63. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/copier.yml +0 -0
  64. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/assets/kiln-accueil.svg +0 -0
  65. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/assets/social-preview.png +0 -0
  66. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/README.md +0 -0
  67. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/rejected.md +0 -0
  68. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/urgent.md +0 -0
  69. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/inventaire-annski.md +0 -0
  70. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/macros.jinja +0 -0
  71. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/.claude-plugin/plugin.json +0 -0
  72. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/.mcp.json +0 -0
  73. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/README.md +0 -0
  74. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/controle-fichier.py +0 -0
  75. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/hooks.json +0 -0
  76. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/protege-fichiers.py +0 -0
  77. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/rtk.py +0 -0
  78. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/scripts/preparer-worktree.sh +0 -0
  79. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/scripts/statusline.py +0 -0
  80. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/backlog/SKILL.md +0 -0
  81. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/nettoyage/SKILL.md +0 -0
  82. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/report-to-kiln/SKILL.md +0 -0
  83. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/token/SKILL.md +0 -0
  84. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/worktree/SKILL.md +0 -0
  85. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/.claude-plugin/plugin.json +0 -0
  86. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/.mcp.json +0 -0
  87. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/migration/SKILL.md +0 -0
  88. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/postgres-lecture/SKILL.md +0 -0
  89. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/postgres-lecture/role.sh +0 -0
  90. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/regen-api/SKILL.md +0 -0
  91. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/.claude-plugin/plugin.json +0 -0
  92. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/.mcp.json +0 -0
  93. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/scripts/apercu.mjs +0 -0
  94. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/scripts/playwright-mcp.sh +0 -0
  95. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/apercu/SKILL.md +0 -0
  96. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/SKILL.md +0 -0
  97. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-hooks.md +0 -0
  98. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-layers.md +0 -0
  99. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-module-authoring.md +0 -0
  100. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/best-practices-data-fetching.md +0 -0
  101. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/best-practices-ssr.md +0 -0
  102. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-cli.md +0 -0
  103. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-config.md +0 -0
  104. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-data-fetching.md +0 -0
  105. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-deployment.md +0 -0
  106. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-directory-structure.md +0 -0
  107. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-modules.md +0 -0
  108. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-routing.md +0 -0
  109. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-components-autoimport.md +0 -0
  110. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-components.md +0 -0
  111. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-composables.md +0 -0
  112. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-server.md +0 -0
  113. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-state.md +0 -0
  114. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/rendering-modes.md +0 -0
  115. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/polish/SKILL.md +0 -0
  116. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/SKILL.md +0 -0
  117. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-environments.md +0 -0
  118. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-projects.md +0 -0
  119. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-type-testing.md +0 -0
  120. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-vi.md +0 -0
  121. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-cli.md +0 -0
  122. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-config.md +0 -0
  123. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-describe.md +0 -0
  124. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-expect.md +0 -0
  125. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-hooks.md +0 -0
  126. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-test-api.md +0 -0
  127. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-benchmarking.md +0 -0
  128. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-concurrency.md +0 -0
  129. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-context.md +0 -0
  130. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-coverage.md +0 -0
  131. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-filtering.md +0 -0
  132. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-mocking.md +0 -0
  133. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-reporters.md +0 -0
  134. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-snapshots.md +0 -0
  135. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-test-tags.md +0 -0
  136. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/SKILL.md +0 -0
  137. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/animation-class-based-technique.md +0 -0
  138. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/animation-state-driven-technique.md +0 -0
  139. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-async.md +0 -0
  140. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-data-flow.md +0 -0
  141. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-fallthrough-attrs.md +0 -0
  142. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-keep-alive.md +0 -0
  143. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-slots.md +0 -0
  144. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-suspense.md +0 -0
  145. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-teleport.md +0 -0
  146. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition-group.md +0 -0
  147. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition.md +0 -0
  148. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/composables.md +0 -0
  149. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/directives.md +0 -0
  150. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +0 -0
  151. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +0 -0
  152. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-virtualize-large-lists.md +0 -0
  153. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/plugins.md +0 -0
  154. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/reactivity.md +0 -0
  155. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/render-functions.md +0 -0
  156. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/sfc.md +0 -0
  157. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/state-management.md +0 -0
  158. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/updated-hook-performance.md +0 -0
  159. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/SKILL.md +0 -0
  160. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/async-component-testing.md +0 -0
  161. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +0 -0
  162. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +0 -0
  163. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +0 -0
  164. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +0 -0
  165. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +0 -0
  166. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +0 -0
  167. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +0 -0
  168. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +0 -0
  169. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +0 -0
  170. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/.claude-plugin/plugin.json +0 -0
  171. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/.mcp.json +0 -0
  172. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/scripts/lecture.yml +0 -0
  173. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/scripts/serena.sh +0 -0
  174. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/.claude-plugin/plugin.json +0 -0
  175. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/.mcp.json +0 -0
  176. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/scripts/stripe-test.sh +0 -0
  177. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/.claude-plugin/plugin.json +0 -0
  178. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/deployer/SKILL.md +0 -0
  179. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/prod-dump/SKILL.md +0 -0
  180. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/prod-logs/SKILL.md +0 -0
  181. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/__init__.py +0 -0
  182. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/backlog.py +0 -0
  183. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/banner.py +0 -0
  184. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/__init__.py +0 -0
  185. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/cliquets.py +0 -0
  186. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/interdictions.py +0 -0
  187. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/outils_python.py +0 -0
  188. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/check.py +0 -0
  189. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/__init__.py +0 -0
  190. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/execution.py +0 -0
  191. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/jobs.py +0 -0
  192. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/runner.py +0 -0
  193. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/services.py +0 -0
  194. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/verdict.py +0 -0
  195. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/workflow.py +0 -0
  196. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/config.py +0 -0
  197. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/contract.py +0 -0
  198. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/deps.py +0 -0
  199. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/dev.py +0 -0
  200. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/doctor.py +0 -0
  201. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/github.py +0 -0
  202. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/install.py +0 -0
  203. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/new.py +0 -0
  204. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/poste.py +0 -0
  205. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/py.typed +0 -0
  206. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/release.py +0 -0
  207. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/rules.py +0 -0
  208. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/settings.py +0 -0
  209. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/shell.py +0 -0
  210. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/stack.py +0 -0
  211. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/statusline.py +0 -0
  212. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/template.py +0 -0
  213. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ui.py +0 -0
  214. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/versions.py +0 -0
  215. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.claude/settings.json.jinja +0 -0
  216. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.editorconfig +0 -0
  217. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.gitattributes.jinja +0 -0
  218. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/CODEOWNERS.jinja +0 -0
  219. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/pull_request_template.md +0 -0
  220. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/workflows/ci.yml.jinja +0 -0
  221. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.gitignore.jinja +0 -0
  222. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.pre-commit-config.yaml.jinja +0 -0
  223. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.vscode/extensions.json.jinja +0 -0
  224. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.vscode/settings.json.jinja +0 -0
  225. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/README.md.jinja +0 -0
  226. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/charte.toml.jinja +0 -0
  227. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/README.md.jinja +0 -0
  228. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/backlog.md.jinja +0 -0
  229. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/rejected.md.jinja +0 -0
  230. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/urgent.md +0 -0
  231. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/{% if deploiement == /"vps/" %}exploitation{% endif %}/production.md.jinja" +0 -0
  232. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/.python-version" +0 -0
  233. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  234. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  235. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/__init__.py" +0 -0
  236. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/test_cli.py.jinja" +0 -0
  237. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__init__.py.jinja" +0 -0
  238. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__main__.py.jinja" +0 -0
  239. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/cli.py.jinja" +0 -0
  240. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/greeting.py" +0 -0
  241. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/py.typed" +0 -0
  242. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/.python-version" +0 -0
  243. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  244. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/data/README.md" +0 -0
  245. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/data/sample/measurements.csv" +0 -0
  246. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/notebooks/exploration.py" +0 -0
  247. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/__init__.py" +0 -0
  248. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/figures.py" +0 -0
  249. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/py.typed" +0 -0
  250. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/sources.py" +0 -0
  251. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/transforms.py" +0 -0
  252. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  253. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/__init__.py" +0 -0
  254. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_figures.py" +0 -0
  255. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_sources.py" +0 -0
  256. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_transforms.py" +0 -0
  257. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  258. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/.env.example.jinja" +0 -0
  259. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/.python-version" +0 -0
  260. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  261. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/__init__.py" +0 -0
  262. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/api.py.jinja" +0 -0
  263. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/asgi.py" +0 -0
  264. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/health.py" +0 -0
  265. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/__init__.py" +0 -0
  266. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/__init__.py" +0 -0
  267. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/export_openapi.py" +0 -0
  268. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/middleware.py" +0 -0
  269. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/settings.py.jinja" +0 -0
  270. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/urls.py" +0 -0
  271. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/wsgi.py" +0 -0
  272. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/manage.py" +0 -0
  273. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  274. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/__init__.py" +0 -0
  275. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_health.py" +0 -0
  276. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_openapi.py" +0 -0
  277. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_security_headers.py" +0 -0
  278. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  279. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.env.example.jinja" +0 -0
  280. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.python-version" +0 -0
  281. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  282. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/__init__.py" +0 -0
  283. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/health.py" +0 -0
  284. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/main.py.jinja" +0 -0
  285. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/settings.py" +0 -0
  286. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  287. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/__init__.py" +0 -0
  288. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/test_health.py" +0 -0
  289. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  290. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/maven.config" +0 -0
  291. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/wrapper/maven-wrapper.properties" +0 -0
  292. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  293. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw" +0 -0
  294. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw.cmd" +0 -0
  295. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/pom.xml.jinja" +0 -0
  296. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/Main.java.jinja" +0 -0
  297. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingService.java.jinja" +0 -0
  298. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/MainTest.java.jinja" +0 -0
  299. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingServiceTest.java.jinja" +0 -0
  300. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/Caddyfile.jinja" +0 -0
  301. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/backup.sh.jinja" +0 -0
  302. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/compose.yaml.jinja" +0 -0
  303. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/deploy-remote.sh.jinja" +0 -0
  304. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/heal.sh.jinja" +0 -0
  305. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/project.json.jinja" +0 -0
  306. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/restore-test.sh.jinja" +0 -0
  307. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/setup-deploy-user.sh.jinja" +0 -0
  308. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.service.jinja" +0 -0
  309. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.timer.jinja" +0 -0
  310. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.service.jinja" +0 -0
  311. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.timer.jinja" +0 -0
  312. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.service.jinja" +0 -0
  313. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.timer.jinja" +0 -0
  314. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/ci-verte.sh" +0 -0
  315. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}cible-vps.sh{% endif %}" +0 -0
  316. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}fumee.sh{% endif %}" +0 -0
  317. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}deploy-backend.sh{% endif %}.jinja" +0 -0
  318. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}smoke-test.sh{% endif %}.jinja" +0 -0
  319. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if front_deploiement == /"vercel/" %}deploy-frontend.sh{% endif %}" +0 -0
  320. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.gitignore" +0 -0
  321. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.nvmrc" +0 -0
  322. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/AGENTS.md" +0 -0
  323. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  324. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/astro.config.mjs.jinja" +0 -0
  325. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/package.json.jinja" +0 -0
  326. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  327. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.ico" +0 -0
  328. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.svg" +0 -0
  329. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/constants.ts.jinja" +0 -0
  330. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/layouts/BaseLayout.astro" +0 -0
  331. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/pages/index.astro.jinja" +0 -0
  332. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/styles/global.css" +0 -0
  333. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/tsconfig.json" +0 -0
  334. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  335. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/.python-version" +0 -0
  336. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  337. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/app.py" +0 -0
  338. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
  339. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
  340. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/layout.py.jinja" +0 -0
  341. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend == 'data' %}callbacks.py{% endif %}" +0 -0
  342. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +0 -0
  343. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
  344. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/__init__.py" +0 -0
  345. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/test_layout.py.jinja" +0 -0
  346. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend == 'data' %}test_callbacks.py{% endif %}" +0 -0
  347. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +0 -0
  348. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  349. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/.gitignore" +0 -0
  350. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/.nvmrc" +0 -0
  351. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/AGENTS.md" +0 -0
  352. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  353. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/favicon.ico" +0 -0
  354. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/globals.css" +0 -0
  355. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/layout.tsx" +0 -0
  356. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/page.tsx.jinja" +0 -0
  357. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.tsx{% endif %}" +0 -0
  358. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
  359. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/constants.ts.jinja" +0 -0
  360. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/{% if backend in ['django', 'fastapi'] %}api.ts{% endif %}" +0 -0
  361. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/next.config.ts.jinja" +0 -0
  362. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/package.json.jinja" +0 -0
  363. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  364. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/tsconfig.json" +0 -0
  365. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  366. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.gitignore" +0 -0
  367. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.nvmrc" +0 -0
  368. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  369. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/app.vue.jinja" +0 -0
  370. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/main.css" +0 -0
  371. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/tokens.css" +0 -0
  372. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.vue{% endif %}" +0 -0
  373. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend == 'django' %}useApi.ts{% endif %}" +0 -0
  374. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend in ['django', 'fastapi'] %}useHealth.ts{% endif %}.jinja" +0 -0
  375. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
  376. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/nuxt.config.ts.jinja" +0 -0
  377. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/package.json.jinja" +0 -0
  378. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  379. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/favicon.ico" +0 -0
  380. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/robots.txt" +0 -0
  381. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/tsconfig.json" +0 -0
  382. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  383. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.python-version" +0 -0
  384. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.streamlit/config.toml" +0 -0
  385. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  386. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/app.py" +0 -0
  387. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
  388. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
  389. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/home.py.jinja" +0 -0
  390. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +0 -0
  391. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
  392. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/__init__.py" +0 -0
  393. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/test_app.py.jinja" +0 -0
  394. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +0 -0
  395. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  396. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if podman %}.containerignore{% endif %} +0 -0
  397. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if podman %}compose.yaml{% endif %}.jinja +0 -0
  398. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{{_copier_conf.answers_file}}.jinja +0 -0
  399. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_backlog.py +0 -0
  400. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_ci.py +0 -0
  401. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_cli.py +0 -0
  402. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_deploiement.py +0 -0
  403. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_plugins.py +0 -0
  404. {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_statusline.py +0 -0
@@ -5,6 +5,14 @@ changement visible (`- …`), cassants en tête. `kiln update` montre les entré
5
5
  qu'un projet passe ; la skill `base:version` rédige celle de la version qu'elle sort, sur la
6
6
  branche `release/vX.Y.Z`, avant sa première candidate.
7
7
 
8
+ ## v0.3.2 — 2026-10-16
9
+ - `kiln adopt` fait suivre kiln à un repo existant, sans le régénérer ; le skill `adoption` trie avec l'utilisateur ce que la charte y trouve à redire, et l'ouverture de session le propose dans un repo à soi qui ne suit pas encore kiln.
10
+ - Dérogations à la charte dans `kiln-waivers.toml`, avec un motif et une échéance croissante à chaque renouvellement : `kiln waive` les ajoute, renouvelle ou liste, `kiln update` épargne les fichiers figés et dit ce qu'il y aurait changé, `kiln status` compte celles de chaque repo.
11
+ - Skill `relecture` : commits et diff d'une branche relus et rangés avant la fusion (`fusion` le lance), dépôt entier avant une version (`version` le lance) ; le hook `garde-branche` refuse un message de commit signé Claude.
12
+ - Les questions de kiln en début de session suivent une politique commune : chaque « non » espace la suivante, chaque « oui » la rapproche.
13
+ - `kiln --version` (#39, merci @SakarPaisen, première contribution extérieure).
14
+ - Correctifs : `kiln update --all` dit « GitHub injoignable » en une ligne au lieu d'une trace Python, et un passage raté ne bloque plus le suivant avec un worktree laissé vide.
15
+
8
16
  ## v0.3.1 — 2026-10-16
9
17
  - **Cassant** : le suivi du travail passe en anglais, `docs/a-faire/` devient `docs/backlog/` (tickets `T-NN`, skill `base:backlog` à la place de `base:a-faire`) ; `kiln update` déplace l'ancien dossier.
10
18
  - Numérotation comme Claude Code : en 0.x, chaque version monte le correctif, cassante comprise ; la mineure ne monte que pour une étape (`kiln version --minor`). Une version est promue dès que la suivante est prête en candidate, sans délai d'attente.
@@ -13,21 +13,21 @@ Où chercher, pour ne pas explorer ; à tenir à jour dans le commit qui ajoute,
13
13
  un dossier ou un module.
14
14
 
15
15
  - `src/kiln/` : la commande. `cli.py` (arguments) ; une commande par module : `new.py`,
16
- `install.py`, `dev.py`, `check.py`, `settings.py` (`kiln set`, clés réglables), `update.py`,
16
+ `adopt.py` (`kiln adopt`, repo existant), `install.py`, `dev.py`, `check.py`, `settings.py` (`kiln set`, clés réglables), `waive.py` (`kiln waive`), `update.py`,
17
17
  `contract.py`, `release.py` (`kiln version`), `doctor.py` (diagnostic du poste et du repo), `fleet.py` (`status`, `update --all`) ; socle : `stack.py` (stack lue dans
18
18
  `.copier-answers.yml`), `template.py`, `deps.py`, `github.py`, `rules.py` (règles non
19
- vérifiées), `statusline.py`, `versions.py` (tags, journal des versions), `banner.py` (bannière, écran d'accueil), `ui.py` (palette pierre et feu, étapes,
19
+ vérifiées), `statusline.py`, `versions.py` (tags, journal des versions), `frozen.py` (fichiers figés par `kiln-waivers.toml`, épargnés par `update`), `banner.py` (bannière, écran d'accueil), `ui.py` (palette pierre et feu, étapes,
20
20
  roue animée, bilan, succès, erreurs), `shell.py`, `config.py` (`~/.config/kiln/config.toml`).
21
21
  - `src/kiln/ci/` : `kiln ci` (CI rejouée sur le poste, verdict en note git) ;
22
22
  `src/kiln/charte/` : moteur de `charte` (`interdictions.py`, `cliquets.py`,
23
- `outils_python.py`).
23
+ `outils_python.py`, `waivers.py` : dérogations de `kiln-waivers.toml`).
24
24
  - `copier.yml` : questions du modèle ; `template/` : le modèle (`CLAUDE.md.jinja`, chartes de
25
25
  `backend/` et `frontend/` par stack, `.claude/settings.json.jinja`, CI…) ; `macros.jinja`.
26
26
  - `plugins/` : plugins Claude Code, catalogue `.claude-plugin/marketplace.json` ; `base/`
27
- (skills `worktree`, `fusion`, `version`, `nettoyage`, `backlog`, `maj-kiln`,
27
+ (skills `worktree`, `fusion`, `version`, `nettoyage`, `relecture` (commits et diff d'une branche avant la fusion, dépôt entier avant une version), `backlog`, `maj-kiln`, `adoption`,
28
28
  `report-to-kiln` (défaut de kiln remonté en issue ou PR), `token` (jeton d'un service dans
29
29
  `.<service>/`), `contribution` (PR d'un contributeur extérieur : sécurité, tri, revue,
30
- fusion créditée) ; `hooks/` ; `scripts/statusline.py`),
30
+ fusion créditée) ; `hooks/` (dont `relances.py`, politique commune des questions de kiln) ; `scripts/statusline.py`),
31
31
  `pile-django/`, `pile-nuxt/`, `vps-podman/`, `stripe/`, `serena/`.
32
32
  - `.github/workflows/` : workflows réutilisables appelés par les repos générés, plus ceux de
33
33
  kiln (`kiln.yml` contrôles, `pypi.yml` publication du paquet `kiln-cli` au tag promu) ;
@@ -39,8 +39,9 @@ un dossier ou un module.
39
39
  promotion de version ; `docs/assets/` : images de la vitrine.
40
40
  - `tests/` : `test_modele.py` (rendu du modèle pour chaque stack), `test_cli.py` (la commande :
41
41
  accueil, erreurs, bilan, sorties hors terminal), `test_unites.py`,
42
- `test_ci.py`, `test_flotte.py`, `test_deploiement.py`, `test_statusline.py` (choix du
43
- poste et rendu du script), `test_plugins.py` (skills cités présents, nommés comme leur dossier).
42
+ `test_ci.py`, `test_flotte.py`, `test_waivers.py` (dérogations), `test_waive.py`, `test_deploiement.py`, `test_statusline.py` (choix du
43
+ poste et rendu du script), `test_plugins.py` (skills cités présents, nommés comme leur dossier), `test_garde_branche.py` (hook garde-branche), `test_adopt.py`,
44
+ `test_relances.py`, `test_hook_kiln_a_jour.py` ; `conftest.py` : config git du poste écartée, identité de test.
44
45
 
45
46
  ## Versions
46
47
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kiln-cli
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Make Claude Code build production-grade repos, and keep them that way
5
5
  Project-URL: Homepage, https://github.com/antoine-tena/kiln
6
6
  Project-URL: Changelog, https://github.com/antoine-tena/kiln/blob/develop/CHANGELOG.md
@@ -61,7 +61,8 @@ keeps every repo you own current:
61
61
  per repo, small commits, merge only when the checks pass.
62
62
  - 📏 **`charte`** — a rule engine for things linters don't catch (no `pip`/`docker`, file-size
63
63
  ratchets, Django locks, personal-data patterns, coverage floors…), declared per repo in
64
- `charte.toml`.
64
+ `charte.toml`. Disagree with a rule? `kiln waive` it in `kiln-waivers.toml`, with a reason and an
65
+ expiry that grows with each renewal (a week, a month, three months, six months).
65
66
  - 🤖 **Claude Code native** — every generated repo ships agent instructions and enables kiln's
66
67
  Claude Code plugins (branch guards, worktree/merge/release skills, status line).
67
68
 
@@ -154,13 +155,15 @@ make the opinions yours.
154
155
  | Command | What it does |
155
156
  |---|---|
156
157
  | `kiln new [dir]` | Questionnaire, generation, lockfiles, install, first commit on `main`, then `develop` where all work happens. |
158
+ | `kiln adopt` | Bring an existing repo that kiln did not generate under kiln, on a work branch: `charte.toml` (size via `--size`, rules that apply anywhere, checked after each edit), `docs/backlog/` if missing, then the existing debt the charter finds. Never touches an existing file. |
157
159
  | `kiln install` | Set up a machine after a clone: tools, dependencies, `.env`, migrations, pre-commit. Re-runnable. |
158
160
  | `kiln dev` | Start the stack's dev servers, their output interleaved and prefixed by service in colour (`django │ …`); `--containers` runs everything in podman. |
159
161
  | `kiln check` | Ruff, mypy, pytest for each Python project, ESLint and type checks for the front, then `charte`. |
160
162
  | `kiln set [key=value…]` | Show or change the repo's settings (team, frameworks, podman…); the repo is re-rendered. |
163
+ | `kiln waive [RULE\|file]` | Waive a kiln rule (`--paths`, `--reason`), or freeze a generated file so `kiln update` leaves it alone; `--renew` moves to the next tier (a week, a month, three months, six months). No argument: list the waivers. |
161
164
  | `kiln update` | Move to the latest kiln release (with a box listing what's new in each release crossed), compatible dependency upgrades, then checks. `--major`, `--no-template`, `--no-deps`. |
162
165
  | `kiln update --all` | Update every kiln repo in your code folder, one worktree each, merged only if checks pass. |
163
- | `kiln status` | Branch, clean tree, template release (`v0.3.2 → v0.3.5` when behind), stack — for every kiln repo. |
166
+ | `kiln status` | Branch, clean tree, template release (`v0.3.2 → v0.3.5` when behind), waivers, stack — for every kiln repo, then the most waived rules across them. |
164
167
  | `kiln version` | In kiln's own repo: latest public release, candidates (age, adopting repos, ready to promote) and the number the next release should take. |
165
168
  | `kiln doctor` | Check the machine (git, uv, gh login, pnpm, podman, Java, pre-commit, kiln release, Claude plugin) and the current repo; each problem comes with the command that fixes it. Changes nothing. |
166
169
  | `kiln ci [commit]` | Replay the repo's GitHub CI locally against throwaway PostgreSQL/Redis, and push the verdict as a git note. |
@@ -195,7 +198,7 @@ claude plugin install base@kiln
195
198
 
196
199
  | Plugin | What's inside |
197
200
  |---|---|
198
- | `base` | Skills for the git workflow (`worktree`, `fusion` = merge, `version` = release, `nettoyage` = cleanup, `backlog`, `maj-kiln` = self-update), `report-to-kiln` (a kiln defect met in your repo becomes an issue or a PR, posted once you approve) `contribution` (an outside contributor's PR handled like a well-run open-source project: untrusted code read before anything runs, triage, review, a merge that credits them, nothing posted without your yes) and `token` (a service token pasted once into a git-ignored `.<service>/` folder, never shown); hooks that guard protected branches and files, check each edited file, and offer kiln updates at session start; a shared status line in four styles (`kiln set statusline=…`, or `aucune` / `perso` to keep your own); condensed command output with [rtk](https://github.com/rtk-ai/rtk). |
201
+ | `base` | Skills for the git workflow (`worktree`, `fusion` = merge, `version` = release, `nettoyage` = cleanup, `relecture` = review of a branch's commits before they go public, and of the whole repo before a release, `backlog`, `maj-kiln` = self-update, `adoption` = bring an existing repo under kiln), `report-to-kiln` (a kiln defect met in your repo becomes an issue or a PR, posted once you approve) `contribution` (an outside contributor's PR handled like a well-run open-source project: untrusted code read before anything runs, triage, review, a merge that credits them, nothing posted without your yes) and `token` (a service token pasted once into a git-ignored `.<service>/` folder, never shown); hooks that guard protected branches and files, refuse a commit message signed by Claude, check each edited file, and ask at session start: kiln updates in kiln repos, adoption in your other repos ("Yes", "Later", "Never for this repo"), all paced by one goodwill score that each yes raises and each no lowers; a shared status line in four styles (`kiln set statusline=…`, or `aucune` / `perso` to keep your own); condensed command output with [rtk](https://github.com/rtk-ai/rtk). |
199
202
  | `pile-django` | Migrations, API regeneration, read-only PostgreSQL. |
200
203
  | `pile-nuxt` | Nuxt / Vue / Vitest skills, UI polish, screenshots on three phones and a desktop (Playwright). |
201
204
  | `vps-podman` | Deploy, production logs, production dumps. |
@@ -30,12 +30,17 @@ Les plugins Claude Code vivent dans [`plugins/`](plugins/), catalogue `kiln`
30
30
  ([`.claude-plugin/marketplace.json`](.claude-plugin/marketplace.json)) :
31
31
 
32
32
  - `base`, pour tous les projets, installé au niveau utilisateur : skills `worktree`, `fusion`,
33
- `version` (release/vN, contrôle complet, annonce, main tagué, déploiement), `nettoyage`, `backlog`,
34
- `maj-kiln` (l'outil kiln et ses plugins, puis le repo ouvert), `report-to-kiln` (un défaut de kiln remonté en issue ou en PR, avec l'accord de l'utilisateur), `contribution` (la PR d'un contributeur extérieur : code relu avant d'en rien lancer, tri, revue, fusion qui le crédite, rien publié sans accord) ; hooks garde de branche, fichiers protégés, contrôle du fichier
35
- modifié, mise à jour proposée à l'ouverture de session (oui/non : l'outil kiln s'il est en
36
- retard sur GitHub, puis le repo par `kiln update` ; un « non » repousse la question de 5, 10,
37
- 30 puis 50 sessions, après quoi désinstaller kiln ou délier le repo est proposé ;
38
- `git config kiln-a-jour.desactive true` pour s'en passer), sorties de commandes condensées par [rtk](https://github.com/rtk-ai/rtk) quand il
33
+ `version` (release/vN, contrôle complet, annonce, main tagué, déploiement), `nettoyage`,
34
+ `relecture` (commits et diff d'une branche relus et rangés avant la fusion, dépôt entier avant une version), `backlog`,
35
+ `maj-kiln` (l'outil kiln et ses plugins, puis le repo ouvert), `adoption` (`kiln adopt` dans un repo existant, passif de la charte trié avec l'utilisateur), `report-to-kiln` (un défaut de kiln remonté en issue ou en PR, avec l'accord de l'utilisateur), `contribution` (la PR d'un contributeur extérieur : code relu avant d'en rien lancer, tri, revue, fusion qui le crédite, rien publié sans accord) ; hooks garde de branche (et refus d'un message de commit signé Claude), fichiers protégés, contrôle du fichier
36
+ modifié, questions à l'ouverture de session : dans un repo kiln, sa mise à jour (l'outil kiln s'il
37
+ est en retard sur GitHub, puis le repo par `kiln update` ; un « non » repousse la question de
38
+ 5, 10, 30 puis 50 sessions, après quoi désinstaller kiln ou délier le repo est proposé) ; dans
39
+ un repo à soi qui ne suit pas kiln, son adoption (« Oui », « Plus tard », « Jamais pour ce
40
+ repo »), dès la 3e session, au plus une fois toutes les 10 sessions du poste. Toutes passent
41
+ par `relances.py` : une note de bienveillance du poste monte à chaque « oui » et baisse à
42
+ chaque « non », et étire ou raccourcit tous les délais (doublés au plus méfiant, de moitié au
43
+ plus enthousiaste) ; `git config kiln-a-jour.desactive true` pour s'en passer, sorties de commandes condensées par [rtk](https://github.com/rtk-ai/rtk) quand il
39
44
  est installé (`mise use -g github:rtk-ai/rtk`, sans `rtk init` : le hook est fourni ici) ; MCP context7 ; status line commune (`plugins/base/scripts/statusline.py`,
40
45
  en anglais, aux couleurs de kiln), posée par `kiln install` dans `~/.claude/settings.json` ; son
41
46
  style se choisit par poste : `kiln set statusline=sobre|bandeau|classique|classique-fond`,
@@ -84,16 +89,18 @@ système du poste (Linux, WSL ou macOS) et le garde dans `~/.config/kiln/config.
84
89
  | Commande | Rôle |
85
90
  |---|---|
86
91
  | `kiln new [dossier]` | Questionnaire (envergure, type de projet, stack conseillée, podman…), génération, verrous, installation, premier commit sur `main`, puis `develop` où tout le travail se fait. |
92
+ | `kiln adopt` | Fait suivre kiln à un repo existant qu'il n'a pas généré, sur une branche de travail : `charte.toml` (envergure par `--size`, règles valables partout, vérifiées après chaque édition), `docs/backlog/` s'il n'existe pas, puis le passif que la charte relève. Ne touche à aucun fichier existant ; le repo apparaît dans `kiln status` comme adopté, `kiln update` le laisse. |
87
93
  | `kiln install` | Prépare un poste après un clone : outils (pre-commit avec pre-commit-uv, podman-compose), dépendances, `backend/.env`, migrations, pre-commit. Relançable. |
88
94
  | `kiln dev` | Lance les serveurs de la stack, leurs sorties entrelacées et préfixées par service en couleur (`django │ …`) ; `--containers` : toute la pile dans podman. |
89
95
  | `kiln check` | Ruff, mypy et pytest pour chaque projet Python, ESLint et les types côté front, puis la charte. |
90
96
  | `kiln ci [commit]` | Rejoue sur le poste la CI du `ci.yml` pour ce commit (défaut `HEAD`) et pose le verdict en note git sur origin, que le script de déploiement accepte comme une CI verte. `--statut` : le verdict seul. Voir « CI rejouée sur le poste ». |
91
97
  | `kiln contrat` | Django + Nuxt : exporte `openapi.json` depuis le code, puis régénère les types du front (`app/types/api.d.ts`). `kiln update` le fait aussi. |
98
+ | `kiln waive [RÈGLE\|fichier]` | Déroge à une règle de kiln (`--paths`, `--reason`, `--upstream`), ou fige un fichier généré que `kiln update` ne touchera plus ; `--renew` passe au palier suivant (une semaine, un mois, trois mois, six mois), `--permanent` sans échéance. Sans argument : liste les dérogations. Voir [Moteur de charte](#moteur-de-charte). |
92
99
  | `kiln set` | Dans un repo : sans argument, affiche ses paramètres ; `kiln set clé=valeur…` les change (équipe, frameworks, podman, boussole…) : le repo est régénéré, un framework retiré emporte ses fichiers. Hors d'un repo, ou avec `--poste` : les réglages du poste (`systeme`, `proprietaire`, `equipe`, `dossier_code`, dans `~/.config/kiln/config.toml`). |
93
100
  | `kiln update` | Évolutions du modèle, mises à jour compatibles des dépendances, puis contrôles. `--major` : versions majeures comprises. `--no-template`, `--no-deps` pour n'en faire qu'une partie. |
94
101
  | `kiln update --all` | Tous les repos kiln du dossier de code (`~/code`, réglable par `dossier_code`) : pour chacun, un worktree depuis la branche d'intégration, la mise à jour, des commits de dix fichiers au plus, puis la fusion directe dans l'intégration (commit de fusion poussé) ; contrôles en échec, la branche est poussée sans être fusionnée. L'arbre principal ne change jamais de branche. |
95
102
  | `kiln doctor` | Diagnostic du poste (git, uv, gh connecté, pnpm, podman, Java, pre-commit, version de kiln, plugin Claude, configuration) et du repo courant (version du modèle, crochet pre-commit, dépendances, `backend/.env`) : ✓, ! à regarder ou ✗ bloquant, chaque fois avec la commande qui corrige. Ne modifie rien. |
96
- | `kiln status` | État des repos kiln du dossier de code : branche, arbre propre ou non, version du modèle (`v0.3.2 → v0.3.5` en retard), stack. |
103
+ | `kiln status` | État des repos kiln du dossier de code : branche, arbre propre ou non, version du modèle (`v0.3.2 → v0.3.5` en retard), dérogations (`!` si l'une est échue), stack ; puis les règles dérogées, par nombre de repos. |
97
104
  | `kiln version` | Dans le dépôt de kiln : dernière version publique, candidates (âge, repos qui les ont adoptées, prêtes à promouvoir) et numéro de la prochaine. |
98
105
  | `charte` | Vérifie le repo contre son `charte.toml` (`charte --detail`, `charte types`, `charte couverture`). |
99
106
 
@@ -256,6 +263,27 @@ docstring de chaque règle. Règle propre à un repo : un module listé dans `re
256
263
  avec `verifier(depot, params) -> list[str]`. La liste des règles non vérifiées
257
264
  (`scripts/ci/charte-non-verifiee.txt`) est recalculée par kiln à chaque `set` et `update`.
258
265
 
266
+ Dérogations : `kiln-waivers.toml` à la racine du repo (jamais réécrit par kiln) écarte une
267
+ règle de tout le repo ou de certains chemins (`[[waiver]]` : `rule`, `paths`, `reason`, `by`,
268
+ `since`, `until`, `renewals`). Une semaine au plus la première fois, puis un mois, trois mois,
269
+ six mois à chaque renouvellement ; `until = "never"` pour un écart permanent, toujours affiché.
270
+ `charte` liste les dérogations actives, prévient dans la seconde moitié de la période, et
271
+ échoue sur une dérogation échue, mal formée, qui ne vise plus rien, ou qui porte sur une règle
272
+ non dérogeable (`DONNEES-PERSO`, `SECRETS`, `PAS-SUR-MAIN`, `DEPENDANCES-FIGEES`).
273
+ Une dérogation `file = "…"` (au lieu de `rule`) fige un fichier généré : `kiln update` et
274
+ `kiln set` n'y touchent plus, et `kiln update` montre ce que kiln y a changé entre les deux
275
+ versions, à reporter à la main ou à reprendre en levant la dérogation.
276
+
277
+ ```toml
278
+ [[waiver]]
279
+ rule = "TAILLE-FICHIER"
280
+ paths = ["backend/app/import_x/*.py"]
281
+ reason = "module repris tel quel du projet X, découpage prévu au T-31"
282
+ by = "antoine"
283
+ since = 2026-10-16
284
+ until = 2026-10-23
285
+ ```
286
+
259
287
  ## Workflows réutilisables
260
288
 
261
289
  kiln est public : ses workflows servent à n'importe quel dépôt, quel que soit son compte
@@ -37,7 +37,8 @@ keeps every repo you own current:
37
37
  per repo, small commits, merge only when the checks pass.
38
38
  - 📏 **`charte`** — a rule engine for things linters don't catch (no `pip`/`docker`, file-size
39
39
  ratchets, Django locks, personal-data patterns, coverage floors…), declared per repo in
40
- `charte.toml`.
40
+ `charte.toml`. Disagree with a rule? `kiln waive` it in `kiln-waivers.toml`, with a reason and an
41
+ expiry that grows with each renewal (a week, a month, three months, six months).
41
42
  - 🤖 **Claude Code native** — every generated repo ships agent instructions and enables kiln's
42
43
  Claude Code plugins (branch guards, worktree/merge/release skills, status line).
43
44
 
@@ -130,13 +131,15 @@ make the opinions yours.
130
131
  | Command | What it does |
131
132
  |---|---|
132
133
  | `kiln new [dir]` | Questionnaire, generation, lockfiles, install, first commit on `main`, then `develop` where all work happens. |
134
+ | `kiln adopt` | Bring an existing repo that kiln did not generate under kiln, on a work branch: `charte.toml` (size via `--size`, rules that apply anywhere, checked after each edit), `docs/backlog/` if missing, then the existing debt the charter finds. Never touches an existing file. |
133
135
  | `kiln install` | Set up a machine after a clone: tools, dependencies, `.env`, migrations, pre-commit. Re-runnable. |
134
136
  | `kiln dev` | Start the stack's dev servers, their output interleaved and prefixed by service in colour (`django │ …`); `--containers` runs everything in podman. |
135
137
  | `kiln check` | Ruff, mypy, pytest for each Python project, ESLint and type checks for the front, then `charte`. |
136
138
  | `kiln set [key=value…]` | Show or change the repo's settings (team, frameworks, podman…); the repo is re-rendered. |
139
+ | `kiln waive [RULE\|file]` | Waive a kiln rule (`--paths`, `--reason`), or freeze a generated file so `kiln update` leaves it alone; `--renew` moves to the next tier (a week, a month, three months, six months). No argument: list the waivers. |
137
140
  | `kiln update` | Move to the latest kiln release (with a box listing what's new in each release crossed), compatible dependency upgrades, then checks. `--major`, `--no-template`, `--no-deps`. |
138
141
  | `kiln update --all` | Update every kiln repo in your code folder, one worktree each, merged only if checks pass. |
139
- | `kiln status` | Branch, clean tree, template release (`v0.3.2 → v0.3.5` when behind), stack — for every kiln repo. |
142
+ | `kiln status` | Branch, clean tree, template release (`v0.3.2 → v0.3.5` when behind), waivers, stack — for every kiln repo, then the most waived rules across them. |
140
143
  | `kiln version` | In kiln's own repo: latest public release, candidates (age, adopting repos, ready to promote) and the number the next release should take. |
141
144
  | `kiln doctor` | Check the machine (git, uv, gh login, pnpm, podman, Java, pre-commit, kiln release, Claude plugin) and the current repo; each problem comes with the command that fixes it. Changes nothing. |
142
145
  | `kiln ci [commit]` | Replay the repo's GitHub CI locally against throwaway PostgreSQL/Redis, and push the verdict as a git note. |
@@ -171,7 +174,7 @@ claude plugin install base@kiln
171
174
 
172
175
  | Plugin | What's inside |
173
176
  |---|---|
174
- | `base` | Skills for the git workflow (`worktree`, `fusion` = merge, `version` = release, `nettoyage` = cleanup, `backlog`, `maj-kiln` = self-update), `report-to-kiln` (a kiln defect met in your repo becomes an issue or a PR, posted once you approve) `contribution` (an outside contributor's PR handled like a well-run open-source project: untrusted code read before anything runs, triage, review, a merge that credits them, nothing posted without your yes) and `token` (a service token pasted once into a git-ignored `.<service>/` folder, never shown); hooks that guard protected branches and files, check each edited file, and offer kiln updates at session start; a shared status line in four styles (`kiln set statusline=…`, or `aucune` / `perso` to keep your own); condensed command output with [rtk](https://github.com/rtk-ai/rtk). |
177
+ | `base` | Skills for the git workflow (`worktree`, `fusion` = merge, `version` = release, `nettoyage` = cleanup, `relecture` = review of a branch's commits before they go public, and of the whole repo before a release, `backlog`, `maj-kiln` = self-update, `adoption` = bring an existing repo under kiln), `report-to-kiln` (a kiln defect met in your repo becomes an issue or a PR, posted once you approve) `contribution` (an outside contributor's PR handled like a well-run open-source project: untrusted code read before anything runs, triage, review, a merge that credits them, nothing posted without your yes) and `token` (a service token pasted once into a git-ignored `.<service>/` folder, never shown); hooks that guard protected branches and files, refuse a commit message signed by Claude, check each edited file, and ask at session start: kiln updates in kiln repos, adoption in your other repos ("Yes", "Later", "Never for this repo"), all paced by one goodwill score that each yes raises and each no lowers; a shared status line in four styles (`kiln set statusline=…`, or `aucune` / `perso` to keep your own); condensed command output with [rtk](https://github.com/rtk-ai/rtk). |
175
178
  | `pile-django` | Migrations, API regeneration, read-only PostgreSQL. |
176
179
  | `pile-nuxt` | Nuxt / Vue / Vitest skills, UI polish, screenshots on three phones and a desktop (Playwright). |
177
180
  | `vps-podman` | Deploy, production logs, production dumps. |
@@ -22,7 +22,7 @@ North star: **kiln v0.3.0 public, adopted by every generated repo**.
22
22
  Why, what to do (as a `- [ ]` checklist when there are several steps), where to look.
23
23
 
24
24
  - **ID** `T-NN`: stable, never reused, quoted as is in commits and branches (tickets opened
25
- before 16 October 2026 were `AF-NN`, same number). **Next free: T-14.**
25
+ before 16 October 2026 were `AF-NN`, same number). **Next free: T-18.**
26
26
  - **Type**, one of: `bug` (something is broken); `improvement` (it works, it could work
27
27
  better); `idea` (nothing exists yet, to be explored); `task` (work that is neither: a release,
28
28
  a decision, a check).
@@ -41,39 +41,28 @@ North star: **kiln v0.3.0 public, adopted by every generated repo**.
41
41
 
42
42
  ## 🔴 Critical
43
43
 
44
- ### T-01 · Promote v0.3.0, the first public release
44
+ ### T-14 · Promote v0.3.1, the first release on PyPI
45
45
  - **Type**: task
46
- - **Status**: blocked — waiting for a next candidate (no waiting period, antoine 2026-10-16)
47
- - **Opened**: 2026-10-15
46
+ - **Status**: blocked — waiting for `v0.3.2-rc.1`
47
+ - **Opened**: 2026-10-16
48
48
  - **Effort**: S · **Owner**: Claude · **Due**: —
49
- - **Origin**: move to semver and release candidates, 15 October 2026
50
-
51
- `v0.3.0-rc.1` (branch `release/v0.3.0`) is adopted by annway, sweep and vision. The rule
52
- (CLAUDE.md, "Versions") requires a next candidate ready, nothing more.
53
- `kiln version` says when it is ready.
54
- - [ ] Cut `v0.3.1-rc.1` from `develop` (gitleaks in CI, the `status` column, the `doctor` fix
55
- are already there), then `kiln update --all`: annway must no longer conflict on `ci.yml`
56
- (its gitleaks job is now in the template, identical).
57
- - [ ] As soon as `v0.3.1-rc.1` is out: tag `v0.3.0` on the commit of `v0.3.0-rc.1`, merge
58
- `release/v0.3.0` into `main`, merge back into `develop`, then `kiln update --all`.
59
- - [ ] Check the public install: `uv tool install git+https://github.com/antoine-tena/kiln@main`
60
- (the default branch stays `develop`, so install docs quote `@main`).
49
+ - **Origin**: promotion of v0.3.0, 16 October 2026
50
+
51
+ `v0.3.0` has no PyPI workflow: `kiln-cli` is first published when `v0.3.1` is promoted. The
52
+ `PYPI_TOKEN` secret (environment `pypi`, account-wide token in `.pypi/token`) is set.
53
+ - [ ] Cut `v0.3.2-rc.1` from `develop`; its `CHANGELOG.md` entry credits the first outside
54
+ contribution: `kiln --version` (#39, thanks @SakarPaisen). Then `kiln update --all`.
55
+ - [ ] Promote `v0.3.1` (tag on the commit of `v0.3.1-rc.1`, merge into `main`, back into
56
+ `develop`), check the `pypi` run, then `uv tool install kiln-cli` on a clean machine.
57
+ - [ ] Replace the account-wide token with one scoped to `kiln-cli`
58
+ (https://pypi.org/manage/project/kiln-cli/settings/), update the secret, delete the old one.
59
+ - [ ] README (English and French): `uv tool install kiln-cli` as the main install.
61
60
 
62
61
  ## 🟠 Important
63
62
 
64
- ### T-02 · Review PR #39 (`kiln --version`) from an outside contributor
65
- - **Type**: task
66
- - **Status**: todo
67
- - **Opened**: 2026-10-15
68
- - **Effort**: XS · **Owner**: Claude · **Due**: —
69
- - **Origin**: https://github.com/antoine-tena/kiln/pull/39 (issue #35)
70
-
71
- The displayed version now comes from `versions.installed_version()`: the PR must use it.
72
- Only antoine-tena merges a PR (CONTRIBUTING.md); answer quickly and say thanks.
73
-
74
63
  ### T-03 · Launch kiln publicly, then list it in the Claude Code directories
75
64
  - **Type**: task
76
- - **Status**: blocked — waiting for T-01, T-11 and T-06
65
+ - **Status**: blocked — waiting for T-14 and T-06
77
66
  - **Opened**: 2026-10-15
78
67
  - **Effort**: S · **Owner**: antoine · **Due**: —
79
68
  - **Origin**: GitHub showcase, 15 October 2026; "Claude Code's workshop" positioning,
@@ -93,27 +82,6 @@ comes first. Posts are made by antoine, never without them; Claude drafts the te
93
82
  Code): https://clau.de/plugin-directory-submission — after T-06, French plugins are
94
83
  unlikely to get in.
95
84
 
96
- ### T-11 · Publish kiln on PyPI as `kiln-cli`
97
- - **Type**: improvement
98
- - **Status**: todo
99
- - **Opened**: 2026-10-16
100
- - **Effort**: S · **Owner**: Claude (antoine for the PyPI account) · **Due**: —
101
- - **Origin**: distribution, 16 October 2026
102
-
103
- The name `kiln` is taken on PyPI; the package is `kiln-cli`, the command stays `kiln`. Only
104
- the command goes through PyPI: the template, plugins and workflows are still read from the git
105
- repo at the tag (Copier, Claude Code and GitHub Actions cannot read PyPI). Targets: macOS,
106
- Linux and Windows through WSL; native Windows is out of scope (antoine's call, 16 October
107
- 2026).
108
- - [ ] Rename the distribution to `kiln-cli` in `pyproject.toml`, and add a `kiln-cli` command
109
- (same entry point) so that `uvx kiln-cli new` works.
110
- - [ ] `installed_version()`, `kiln doctor` and `maj-kiln`: read the version and offer the
111
- update through PyPI (`uv tool upgrade kiln-cli`), keeping the install from git.
112
- - [ ] Publishing workflow on the promotion tag, with trusted publishing (no token); antoine
113
- creates the pending project on https://pypi.org/manage/account/publishing/
114
- - [ ] README (English and French): `uv tool install kiln-cli`, `uvx kiln-cli new`, and the line
115
- "macOS, Linux, Windows via WSL".
116
-
117
85
  ### T-12 · Homebrew formula in an `antoine-tena/homebrew-kiln` tap
118
86
  - **Type**: improvement
119
87
  - **Status**: blocked — waiting for demand (an issue asking for it) or homebrew-core notability
@@ -222,7 +190,15 @@ has even when the repo edited it; its content is still in the last commit.
222
190
 
223
191
  plumbum or Copier fails if pytest runs in the main tree in the middle of a merge while a
224
192
  worktree exists: run the tests in a clean worktree, or make the template test independent of
225
- the tree's state.
193
+ the tree's state. Seen again on 16 October 2026 (merge of `feat/relecture`, briefly filed as
194
+ T-17): 97 tests fail with `fatal: No url found for submodule path
195
+ '.claude/worktrees/chore-versions' in .gitmodules`; the same commit passes in a clean
196
+ worktree. Lead to check: with a dirty template, Copier copies it and runs `git add -A`, which
197
+ takes the nested worktrees as gitlinks; `.claude/worktrees/` is only ignored in
198
+ `.git/info/exclude`, which the copy does not carry.
199
+ - [ ] Reproduce, confirm the cause.
200
+ - [ ] Fix: `.claude/worktrees/` in kiln's `.gitignore`, or tests that render from a clean
201
+ source (`vcs_ref="HEAD"` as in `test_deploiement.py`).
226
202
 
227
203
  ### T-10 · Interface polish
228
204
  - **Type**: improvement
@@ -237,6 +213,23 @@ the tree's state.
237
213
 
238
214
  ## ✅ Done
239
215
 
216
+ - **2026-10-16** · T-16 · A failed `kiln update --all` leaves a worktree that blocks the next
217
+ run — a worktree with no change and no commit of its own is removed after the failure and
218
+ before the next run; one with work in it is kept and named (`fix/update-reseau`) · opened 2026-10-16
219
+ - **2026-10-16** · T-15 · `kiln update --all` crashes with a Python traceback when GitHub is
220
+ unreachable — Copier's git failure becomes one line in the summary, "GitHub injoignable"
221
+ when the network is down (`fix/update-reseau`) · opened 2026-10-16
222
+ - **2026-10-16** · T-11 · Publish kiln on PyPI as `kiln-cli` — distribution and `kiln-cli`
223
+ command, install source and update through PyPI, `pypi.yml` on the promotion tag, README;
224
+ the first upload is checked by T-14 · opened 2026-10-16
225
+
226
+ - **2026-10-16** · T-01 · Promote v0.3.0, the first public release — `v0.3.1-rc.1` cut, then
227
+ `v0.3.0` tagged on the commit of `v0.3.0-rc.1`, merged into `main`, back into `develop`;
228
+ annway, sweep and vision moved to `v0.3.1-rc.1` (`kiln update --all`) · opened 2026-10-15
229
+ - **2026-10-16** · T-02 · Review PR #39 (`kiln --version`) from an outside contributor —
230
+ reviewed with the new skill `base:contribution`, version computed only on demand (commit
231
+ pushed on top of the contributor's), merged (`b71f91a`), issue #35 closed; credit to add to
232
+ the next changelog entry (T-01) · opened 2026-10-15
240
233
  - **2026-10-16** · Backlog in English: `docs/a-faire/` becomes `docs/backlog/` (`backlog.md`,
241
234
  `rejected.md`, `urgent.md`), `T-NN` tickets with a type and an opening date, skill
242
235
  `base:backlog`, status line reading both formats, old trackers converted by `kiln update`
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env python3
2
- """PreToolUse (Bash) : refuse un `git commit` sur une branche principale (main, master, develop).
2
+ """PreToolUse (Bash) : refuse un `git commit` sur une branche principale (main, master, develop),
3
+ et un message de commit qui signe Claude (`Co-Authored-By: Claude`, `Claude-Session:`) :
4
+ une fois poussé dans l'intégration, il ne s'efface plus.
3
5
 
4
6
  Seule exception : le commit qui conclut une fusion en cours (MERGE_HEAD présent), par exemple
5
7
  après la résolution d'un conflit de `git merge --no-ff`.
@@ -8,11 +10,13 @@ Un repo où l'on commite directement sur la branche principale s'en exempte par
8
10
  `git config garde-branche.desactive true`.
9
11
  """
10
12
 
13
+ import contextlib
11
14
  import json
12
15
  import os
13
16
  import re
14
17
  import subprocess
15
18
  import sys
19
+ from pathlib import Path
16
20
 
17
21
  PROTECTED_BRANCHES = {"main", "master", "develop"}
18
22
 
@@ -35,6 +39,21 @@ for part in re.split(r"&&|\|\||[;|\n]", cmd):
35
39
  c = re.findall(r"-C\s+(\S+)", m.group(1))
36
40
  targets.append(os.path.join(cwd, *(p.strip("'\"") for p in c)) if c else cwd)
37
41
 
42
+ # Le message est dans la commande (-m, heredoc) ou dans un fichier (-F, --file).
43
+ SIGNATURE = re.compile(r"co-authored-by:\s*claude|claude-session:", re.I)
44
+ if targets:
45
+ message = cmd
46
+ for path in re.findall(r"(?:-F\s*|--file[=\s])(\S+)", cmd):
47
+ with contextlib.suppress(OSError):
48
+ message += Path(cwd, path.strip("'\"")).read_text()
49
+ if SIGNATURE.search(message):
50
+ print(
51
+ "Commit refusé : pas de Co-Authored-By: Claude ni de Claude-Session: "
52
+ "dans un message de commit. Les retirer.",
53
+ file=sys.stderr,
54
+ )
55
+ sys.exit(2)
56
+
38
57
  for target in targets:
39
58
  try:
40
59
  branch = subprocess.run(